From 8c78c0f920ecf6cce3d80b051804599abf202de2 Mon Sep 17 00:00:00 2001 From: hoenking Date: Fri, 10 Apr 2026 13:47:53 +0800 Subject: [PATCH] init --- README.md | 98 + build.py | 179 ++ docs/content/1-ku-gai-shu.md | 188 ++ ...10-c-kuo-zhan-mo-kuai-yu-python-jie-kou.md | 348 +++ .../11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md | 230 ++ docs/content/12-she-zhi-xuan-ze-tiao-jian.md | 598 +++++ docs/content/13-zhi-xing-guo-lu-cha-xun.md | 417 +++ .../14-bian-li-xuan-ze-ji-dui-xiang.md | 364 +++ docs/content/15-huo-qu-di-wu-shu-xing-zhi.md | 818 ++++++ docs/content/16-xiu-gai-di-wu-shu-xing-zhi.md | 427 +++ .../17-di-wu-ji-ben-shu-xing-xiang-jie.md | 427 +++ ...uo-zhan-shu-xing-yu-zi-ding-yi-shu-xing.md | 749 ++++++ .../19-chuang-jian-mo-ren-di-wu-dui-xiang.md | 384 +++ .../2-an-zhuang-yu-huan-jing-pei-zhi.md | 244 ++ ...-tong-guo-bian-ma-chuang-jian-dui-xiang.md | 518 ++++ .../21-tian-jia-dui-xiang-zuo-biao-dian.md | 239 ++ docs/content/22-shan-chu-dui-xiang-cao-zuo.md | 447 ++++ docs/content/23-dui-xiang-huan-cun-ji-zhi.md | 244 ++ .../24-pi-liang-bao-cun-dao-shu-ju-ku.md | 342 +++ docs/content/25-che-xiao-biao-ji-guan-li.md | 319 +++ .../26-shu-ju-jiao-huan-can-shu-pei-zhi.md | 406 +++ docs/content/27-dao-ru-wai-bu-shu-ju.md | 685 +++++ .../content/28-dao-chu-shu-ju-dao-wen-jian.md | 507 ++++ ...9-zi-ding-yi-shu-ju-jiao-huan-liu-cheng.md | 917 +++++++ ...3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing.md | 457 ++++ .../30-shu-ju-jian-cha-ji-lu-guan-li.md | 433 +++ .../31-tian-jia-yu-jia-zai-jian-cha-ji-lu.md | 664 +++++ docs/content/32-xian-shi-jian-cha-jie-guo.md | 678 +++++ docs/content/33-zi-ding-yi-jian-cha-gui-ze.md | 1081 ++++++++ .../34-huo-qu-gong-zuo-kong-jian-xin-xi.md | 566 ++++ docs/content/35-xi-tong-lu-jing-guan-li.md | 527 ++++ docs/content/36-di-tu-suo-fang-kong-zhi.md | 710 +++++ docs/content/37-pei-zhi-ri-zhi-ji-lu-qi.md | 536 ++++ .../38-jin-du-tiao-shi-yong-zhi-nan.md | 723 +++++ .../39-cuo-wu-chu-li-yu-yi-chang-guan-li.md | 1047 ++++++++ ...4-shi-yong-ssprocess-guan-li-xuan-ze-ji.md | 422 +++ .../40-ssprocessmanager-wan-zheng-api.md | 463 ++++ .../41-objbaseattr-shu-xing-suo-yin.md | 398 +++ .../42-di-li-dui-xiang-lei-xing-ding-yi.md | 622 +++++ docs/content/43-shu-xue-ji-suan-gong-ju.md | 735 ++++++ .../content/44-zuo-biao-zhuan-huan-gong-ju.md | 373 +++ docs/content/45-shu-ju-ku-geng-xin-jie-kou.md | 1136 ++++++++ .../5-yun-xing-nei-zhi-shi-li-jiao-ben.md | 228 ++ docs/content/6-sunvstation-xi-tong-jia-gou.md | 275 ++ .../7-swig-feng-zhuang-ji-zhi-shuo-ming.md | 265 ++ .../8-gong-zuo-kong-jian-yu-di-tu-gai-nian.md | 319 +++ docs/content/9-mixin-she-ji-mo-shi.md | 276 ++ docs/content/wiki.json | 349 +++ docs/css/style.css | 719 +++++ docs/data/nav.json | 362 +++ docs/data/search-index.json | 1502 +++++++++++ docs/index.html | 129 + docs/js/app.js | 469 ++++ docs/js/search.js | 161 ++ docs/libs/fuse.min.js | 9 + docs/libs/github-dark.min.css | 10 + docs/libs/github.min.css | 10 + docs/libs/highlight.min.js | 1232 +++++++++ docs/libs/marked.min.js | 6 + docs/libs/mermaid.min.js | 2314 +++++++++++++++++ docs/libs/python.min.js | 42 + 61 files changed, 30343 insertions(+) create mode 100644 README.md create mode 100644 build.py create mode 100644 docs/content/1-ku-gai-shu.md create mode 100644 docs/content/10-c-kuo-zhan-mo-kuai-yu-python-jie-kou.md create mode 100644 docs/content/11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md create mode 100644 docs/content/12-she-zhi-xuan-ze-tiao-jian.md create mode 100644 docs/content/13-zhi-xing-guo-lu-cha-xun.md create mode 100644 docs/content/14-bian-li-xuan-ze-ji-dui-xiang.md create mode 100644 docs/content/15-huo-qu-di-wu-shu-xing-zhi.md create mode 100644 docs/content/16-xiu-gai-di-wu-shu-xing-zhi.md create mode 100644 docs/content/17-di-wu-ji-ben-shu-xing-xiang-jie.md create mode 100644 docs/content/18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing.md create mode 100644 docs/content/19-chuang-jian-mo-ren-di-wu-dui-xiang.md create mode 100644 docs/content/2-an-zhuang-yu-huan-jing-pei-zhi.md create mode 100644 docs/content/20-tong-guo-bian-ma-chuang-jian-dui-xiang.md create mode 100644 docs/content/21-tian-jia-dui-xiang-zuo-biao-dian.md create mode 100644 docs/content/22-shan-chu-dui-xiang-cao-zuo.md create mode 100644 docs/content/23-dui-xiang-huan-cun-ji-zhi.md create mode 100644 docs/content/24-pi-liang-bao-cun-dao-shu-ju-ku.md create mode 100644 docs/content/25-che-xiao-biao-ji-guan-li.md create mode 100644 docs/content/26-shu-ju-jiao-huan-can-shu-pei-zhi.md create mode 100644 docs/content/27-dao-ru-wai-bu-shu-ju.md create mode 100644 docs/content/28-dao-chu-shu-ju-dao-wen-jian.md create mode 100644 docs/content/29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng.md create mode 100644 docs/content/3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing.md create mode 100644 docs/content/30-shu-ju-jian-cha-ji-lu-guan-li.md create mode 100644 docs/content/31-tian-jia-yu-jia-zai-jian-cha-ji-lu.md create mode 100644 docs/content/32-xian-shi-jian-cha-jie-guo.md create mode 100644 docs/content/33-zi-ding-yi-jian-cha-gui-ze.md create mode 100644 docs/content/34-huo-qu-gong-zuo-kong-jian-xin-xi.md create mode 100644 docs/content/35-xi-tong-lu-jing-guan-li.md create mode 100644 docs/content/36-di-tu-suo-fang-kong-zhi.md create mode 100644 docs/content/37-pei-zhi-ri-zhi-ji-lu-qi.md create mode 100644 docs/content/38-jin-du-tiao-shi-yong-zhi-nan.md create mode 100644 docs/content/39-cuo-wu-chu-li-yu-yi-chang-guan-li.md create mode 100644 docs/content/4-shi-yong-ssprocess-guan-li-xuan-ze-ji.md create mode 100644 docs/content/40-ssprocessmanager-wan-zheng-api.md create mode 100644 docs/content/41-objbaseattr-shu-xing-suo-yin.md create mode 100644 docs/content/42-di-li-dui-xiang-lei-xing-ding-yi.md create mode 100644 docs/content/43-shu-xue-ji-suan-gong-ju.md create mode 100644 docs/content/44-zuo-biao-zhuan-huan-gong-ju.md create mode 100644 docs/content/45-shu-ju-ku-geng-xin-jie-kou.md create mode 100644 docs/content/5-yun-xing-nei-zhi-shi-li-jiao-ben.md create mode 100644 docs/content/6-sunvstation-xi-tong-jia-gou.md create mode 100644 docs/content/7-swig-feng-zhuang-ji-zhi-shuo-ming.md create mode 100644 docs/content/8-gong-zuo-kong-jian-yu-di-tu-gai-nian.md create mode 100644 docs/content/9-mixin-she-ji-mo-shi.md create mode 100644 docs/content/wiki.json create mode 100644 docs/css/style.css create mode 100644 docs/data/nav.json create mode 100644 docs/data/search-index.json create mode 100644 docs/index.html create mode 100644 docs/js/app.js create mode 100644 docs/js/search.js create mode 100644 docs/libs/fuse.min.js create mode 100644 docs/libs/github-dark.min.css create mode 100644 docs/libs/github.min.css create mode 100644 docs/libs/highlight.min.js create mode 100644 docs/libs/marked.min.js create mode 100644 docs/libs/mermaid.min.js create mode 100644 docs/libs/python.min.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..6a6335e --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# .zread — sunvpy 静态文档站点生成器 + +将 `sunvpy` wiki markdown 文档构建为可浏览的静态文档站点。 + +## 目录结构 + +``` +.zread/ +├── build.py # 构建脚本 +├── wiki/ # 文档源文件 +│ ├── current # 当前版本指针 +│ └── versions/ # 按版本存放 markdown + wiki.json +└── docs/ # 构建输出(静态站点) + ├── index.html + ├── css/style.css + ├── js/app.js + ├── js/search.js + ├── data/ # nav.json, search-index.json + └── content/ # markdown 文件副本 +``` + +## 构建文档 + +```bash +# 默认构建最新版本 +python build.py + +# 指定版本 +python build.py --version 2026-04-07-163229 + +# 指定输出目录 +python build.py --output /path/to/output +``` + +构建流程: +1. 读取 `wiki/versions//wiki.json` 清单 +2. 生成 `data/nav.json`(侧边栏导航树) +3. 生成 `data/search-index.json`(全文搜索索引) +4. 复制 markdown 文件到 `content/` + +## 查看文档 + +`docs/` 是纯静态站点,用任意 HTTP 服务器托管即可。以下任选一种: + +### Python + +```bash +cd docs +python -m http.server 8080 +# 访问 http://localhost:8080 +``` + +### Node.js + +```bash +npx serve docs -p 8080 +# 访问 http://localhost:8080 +``` + +### VS Code + +安装 **Live Server** 扩展,右键 `docs/index.html` → "Open with Live Server"。 + +### 直接双击 + +双击 `docs/index.html` 即可在浏览器打开,但搜索和 CDN 资源(代码高亮、Mermaid)需要网络连接。 + +## 站点功能 + +- **侧边栏导航** — 按 section/group 自动组织 +- **全文搜索** — 基于 Fuse.js,支持 `Ctrl+K` 快捷键 +- **深色/浅色主题切换** +- **代码高亮** — highlight.js(Python) +- **Mermaid 图表渲染** +- **页面内目录(TOC)** +- **移动端响应式布局** + +## 技术栈 + +| 用途 | 依赖 | +|------|------| +| Markdown 渲染 | marked.js (CDN) | +| 代码高亮 | highlight.js (CDN) | +| 图表 | mermaid.js (CDN) | +| 搜索 | fuse.js (CDN) | + +## 文档内容概览 + +共 45 篇文档,覆盖以下章节: + +- **快速入门** — 库概述、安装配置、第一个脚本 +- **核心概念与架构** — 系统架构、SWIG 封装、工作空间、Mixin 模式 +- **选择集与查询** — 选择集操作、地物属性读写 +- **地理对象编辑** — 对象创建/删除、批量操作、缓存机制 +- **数据交换与导入导出** — 数据导入导出、自定义流程 +- **数据检查与验证** — 检查记录、自定义规则 +- **高级功能** — 工作空间信息、路径管理、日志、进度条 +- **参考手册** — SSProcessManager API、属性索引、工具函数 diff --git a/build.py b/build.py new file mode 100644 index 0000000..6844b67 --- /dev/null +++ b/build.py @@ -0,0 +1,179 @@ +""" +build.py - Generate static documentation site from sunvpy wiki markdown files. + +Usage: + python build.py [--version VERSION_ID] [--output DIR] +""" + +import json +import os +import re +import shutil +import sys +from pathlib import Path + +BASE_DIR = Path(__file__).parent +WIKI_DIR = BASE_DIR / "wiki" +VERSIONS_DIR = WIKI_DIR / "versions" + + +def get_latest_version(): + """Auto-detect latest version by sorting version directory names.""" + versions = sorted(VERSIONS_DIR.iterdir()) + if not versions: + print("Error: No versions found in wiki/versions/", file=sys.stderr) + sys.exit(1) + return versions[-1].name + + +def load_wiki_manifest(version_dir: Path) -> dict: + """Load wiki.json manifest.""" + manifest_path = version_dir / "wiki.json" + if not manifest_path.exists(): + print(f"Error: wiki.json not found at {manifest_path}", file=sys.stderr) + sys.exit(1) + with open(manifest_path, "r", encoding="utf-8") as f: + return json.load(f) + + +def build_nav(pages: list) -> dict: + """Build navigation tree from wiki.json pages, grouped by section -> group.""" + sections_ordered = [] + sections_map = {} + + for page in pages: + section_title = page["section"] + group_title = page.get("group", "") + + if section_title not in sections_map: + section_entry = {"id": section_title, "title": section_title} + if group_title: + section_entry["groups"] = [] + else: + section_entry["pages"] = [] + sections_map[section_title] = section_entry + sections_ordered.append(section_title) + + section = sections_map[section_title] + page_entry = { + "slug": page["slug"], + "title": page["title"], + "file": page["file"], + "level": page["level"], + } + + if group_title: + # Find or create the group within this section + found = None + for g in section["groups"]: + if g["title"] == group_title: + found = g + break + if found is None: + found = {"title": group_title, "pages": []} + section["groups"].append(found) + found["pages"].append(page_entry) + else: + section["pages"].append(page_entry) + + nav = {"sections": [sections_map[s] for s in sections_ordered]} + return nav + + +def build_search_index(pages: list, version_dir: Path) -> list: + """Build search index from markdown files.""" + index = [] + heading_re = re.compile(r"^#{2,3}\s+(.+)$", re.MULTILINE) + sources_re = re.compile(r"^Sources:.*$", re.MULTILINE) + + for page in pages: + md_path = version_dir / page["file"] + if not md_path.exists(): + print(f" Warning: {page['file']} not found, skipping", file=sys.stderr) + continue + + with open(md_path, "r", encoding="utf-8") as f: + content = f.read() + + headings = [m.group(1).strip() for m in heading_re.finditer(content)] + cleaned = sources_re.sub("", content).strip() + # Truncate to control index size + if len(cleaned) > 2000: + cleaned = cleaned[:2000] + + index.append({ + "slug": page["slug"], + "title": page["title"], + "section": page["section"], + "headings": headings, + "content": cleaned, + }) + + return index + + +def copy_content(pages: list, version_dir: Path, output_dir: Path): + """Copy markdown files to output/content/.""" + content_dir = output_dir / "content" + content_dir.mkdir(parents=True, exist_ok=True) + + for page in pages: + src = version_dir / page["file"] + dst = content_dir / page["file"] + if src.exists(): + shutil.copy2(src, dst) + + print(f" Copied {len(pages)} markdown files") + + +def write_json(data, path: Path): + """Write JSON with pretty formatting.""" + path.parent.mkdir(parents=True, exist_ok=True) + with open(path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + +def main(): + import argparse + parser = argparse.ArgumentParser(description="Build sunvpy docs site") + parser.add_argument("--version", default=None, help="Version ID (default: latest)") + parser.add_argument("--output", default=None, help="Output directory (default: .zread/docs/)") + args = parser.parse_args() + + version_id = args.version or get_latest_version() + version_dir = VERSIONS_DIR / version_id + output_dir = Path(args.output) if args.output else BASE_DIR / "docs" + + print(f"Building docs from version: {version_id}") + print(f"Source: {version_dir}") + print(f"Output: {output_dir}") + + # Clean output directory (only data and content, not css/js/html) + for subdir in ["data", "content"]: + d = output_dir / subdir + if d.exists(): + shutil.rmtree(d) + + # Load manifest + manifest = load_wiki_manifest(version_dir) + pages = manifest["pages"] + print(f"Found {len(pages)} pages") + + # Build nav.json + nav = build_nav(pages) + write_json(nav, output_dir / "data" / "nav.json") + print(" Generated data/nav.json") + + # Build search index + search_index = build_search_index(pages, version_dir) + write_json(search_index, output_dir / "data" / "search-index.json") + print(f" Generated data/search-index.json ({len(search_index)} entries)") + + # Copy markdown content + copy_content(pages, version_dir, output_dir) + + print("Build complete!") + + +if __name__ == "__main__": + main() diff --git a/docs/content/1-ku-gai-shu.md b/docs/content/1-ku-gai-shu.md new file mode 100644 index 0000000..9481e00 --- /dev/null +++ b/docs/content/1-ku-gai-shu.md @@ -0,0 +1,188 @@ +sunvpy是SunvStation地理信息系统的Python脚本接口库,专为二次开发和自动化数据处理任务设计。该库通过SWIG封装技术将C++核心功能暴露给Python,提供了完整的地理对象管理、空间查询、数据交换和质量检查能力。 + +Sources: [__init__.py](__init__.py#L1-L12) + +## 核心架构 + +sunvpy采用分层架构设计,底层为SWIG封装的C++扩展模块,上层为面向Python的高级API封装。SSProcessManager作为主要入口类,通过Mixin模式组织功能模块,实现了关注点分离和代码复用。 + +```mermaid +graph TB + subgraph "Python API层" + A[SSProcessManager
进程管理器] + B[ObjBaseAttr
属性管理器] + C[SelectionMixin
选择集操作] + D[GeoEditMixin
地理编辑] + E[ProjectMixin
工程管理] + F[LogMixin
日志记录] + G[ProgressMixin
进度管理] + end + + subgraph "SWIG封装层" + H[PySSCore.pyd
核心功能] + I[PySSMap.pyd
地图操作] + J[PySSDataSource.pyd
数据源管理] + K[PySSDatabase.pyd
数据库操作] + L[PySSDataX.pyd
数据交换] + M[PySSCheck.pyd
数据检查] + N[PySSMath.pyd
数学计算] + O[PySSWidget.pyd
UI组件] + P[PySSView.pyd
视图控制] + Q[PySSGisDBUpdate.pyd
GIS数据库更新] + end + + subgraph "C++核心层" + R[SunvStation
C++引擎] + end + + A --> C + A --> D + A --> E + A --> F + A --> G + A --> H + A --> I + A --> J + A --> K + A --> L + A --> M + A --> N + A --> O + A --> P + A --> Q + B --> H + + H -.-> R + I -.-> R + J -.-> R + K -.-> R + L -.-> R + M -.-> R + N -.-> R + O -.-> R + P -.-> R + Q -.-> R +``` + +SSProcessManager继承自五个功能Mixin类,每个Mixin负责特定的功能域。这种设计使得代码组织清晰,易于维护和扩展。全局单例SSProcess提供统一访问入口,确保工作空间和地图实例的一致性。 + +Sources: [PySSProcess.py](PySSProcess.py#L28-L46) + +## 模块功能概览 + +sunvpy包含多个功能模块,每个模块对应特定的地理信息系统操作领域。下表列出了主要模块及其功能描述。 + +| 模块名称 | 文件名 | 功能描述 | 封装类型 | +|---------|--------|---------|---------| +| 核心功能 | PySSCore.pyd | 提供基础数据结构、工作空间管理、地物对象等核心类 | SWIG封装 | +| 地图操作 | PySSMap.pyd | 地图显示、缩放控制、坐标系转换等地图相关功能 | SWIG封装 | +| 数据源管理 | PySSDataSource.pyd | 数据集访问、数据源管理、数据浏览等功能 | SWIG封装 | +| 数据库操作 | PySSDatabase.pyd | 数据库连接、查询、更新等数据库操作功能 | SWIG封装 | +| 数据交换 | PySSDataX.pyd | 数据导入导出、格式转换等数据交换功能 | SWIG封装 | +| 数据检查 | PySSCheck.pyd | 拓扑检查、规则验证等数据质量检查功能 | SWIG封装 | +| 数学计算 | PySSMath.pyd | 几何计算、坐标变换、数学运算等数学工具 | SWIG封装 | +| UI组件 | PySSWidget.pyd | 进度条、对话框、全局选项等用户界面组件 | SWIG封装 | +| 视图控制 | PySSView.pyd | 视图刷新、窗口管理、显示控制等视图功能 | SWIG封装 | +| GIS数据库更新 | PySSGisDBUpdate.pyd | GIS数据库批量更新、同步等高级功能 | SWIG封装 | +| 进程管理器 | PySSProcess.py | 统一API入口,整合所有功能的Python封装 | Python层 | +| 属性管理器 | ObjBaseAttr.py | 地物基本属性名称注册和索引管理 | Python层 | + +Sources: [PySSProcess.py](PySSProcess.py#L5-L19) + +## 主要特性 + +sunvpy提供了丰富的GIS操作功能,覆盖了地理数据处理的主要场景。选择集管理允许用户通过灵活的查询条件筛选地物对象,支持属性过滤和空间查询。地物编辑功能包括创建新对象、修改几何坐标、调整属性值等完整操作流程。 + +数据交换能力支持多种格式的导入导出,可以方便地与其他GIS系统进行数据交互。数据检查模块提供拓扑检查、属性验证、规则检测等质量保证功能,确保数据符合规范要求。批量操作和缓存机制优化了大数据量场景下的性能,有效减少数据库访问次数。 + +进度条和日志系统为长时间运行的任务提供了用户反馈和调试支持,增强了脚本的可维护性和用户体验。撤销标记管理实现了操作的撤销功能,提高了数据操作的安全性。 + +Sources: [PySSProcess.py](PySSProcess.py#L57-L88) + +## 快速上手 + +使用sunvpy进行地物查询和属性修改非常直观。以下示例展示了如何筛选编码为"3103013"的地物,并修改其属性值。 + +```python +from sunv import SSProcess + +# 清空选择集和查询条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 设置查询条件:编码等于"3103013" +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 执行过滤查询 +SSProcess.selectFilter() + +# 获取选择集中的地物数量 +geo_count = SSProcess.getSelGeoCount() +print(f"选择集中的地物对象数量: {geo_count}") + +# 遍历前10个对象并修改属性 +for i in range(min(10, geo_count)): + # 修改地物ID + SSProcess.setSelGeoValue(i, "SSObj_ID", f"{i+1000}") + # 修改线型和线宽 + SSProcess.setSelGeoValue(i, "SSObj_LineType", "3") + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "2") + # 修改颜色为白色 + SSProcess.setSelGeoValue(i, "SSObj_Color", "16777215") + # 设置名称和别名 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"对象{i+1}") + SSProcess.setSelGeoValue(i, "SSObj_Byname", f"别名{i+1}") +``` + +SSProcess是全局单例对象,无需手动创建实例即可直接使用。该对象在首次访问时自动初始化工作空间和地图连接,确保后续操作的正确性。 + +Sources: [PySSProcess.py](PySSProcess.py#L124-L140) + +## 项目结构 + +sunvpy包采用清晰的目录结构组织代码,将Python实现和C++扩展分离。顶层目录包含所有PySS开头的SWIG封装模块、对应的.pyd二进制文件、以及纯Python实现的功能模块。 + +``` +sunvpy/ +├── __init__.py # 包初始化文件 +├── PySSProcess.py # 进程管理器(主要API入口) +├── ObjBaseAttr.py # 地物基本属性管理器 +├── PySSCore.py # 核心功能SWIG封装 +├── PySSMap.py # 地图操作SWIG封装 +├── PySSDataSource.py # 数据源管理SWIG封装 +├── PySSDatabase.py # 数据库操作SWIG封装 +├── PySSDataX.py # 数据交换SWIG封装 +├── PySSCheck.py # 数据检查SWIG封装 +├── PySSMath.py # 数学计算SWIG封装 +├── PySSWidget.py # UI组件SWIG封装 +├── PySSView.py # 视图控制SWIG封装 +├── PySSGisDBUpdate.py # GIS数据库更新SWIG封装 +├── _PySSCore.pyd # 核心功能C++扩展 +├── _PySSMap.pyd # 地图操作C++扩展 +├── _PySSDataSource.pyd # 数据源管理C++扩展 +├── _PySSDatabase.pyd # 数据库操作C++扩展 +├── _PySSDataX.pyd # 数据交换C++扩展 +├── _PySSCheck.pyd # 数据检查C++扩展 +├── _PySSMath.pyd # 数学计算C++扩展 +├── _PySSWidget.pyd # UI组件C++扩展 +├── _PySSView.pyd # 视图控制C++扩展 +├── _PySSGisDBUpdate.pyd # GIS数据库更新C++扩展 +└── ssprocess_mixins/ # 功能Mixin模块目录 + ├── selection_mixin.py # 选择集操作Mixin + ├── geo_edit_mixin.py # 地理编辑Mixin + ├── project_mixin.py # 工程管理Mixin + ├── log_mixin.py # 日志记录Mixin + └── progress_mixin.py # 进度管理Mixin +``` + +ssprocess_mixins目录将SSProcessManager的功能分解为多个独立的Mixin类,每个类专注于特定的功能域。这种模块化设计便于理解、测试和扩展功能。 + +Sources: [PySSProcess.py](PySSProcess.py#L21-L26) + +## 学习路径建议 + +为了帮助初学者系统地掌握sunvpy,建议按照以下顺序学习文档。首先从[安装与环境配置](2-an-zhuang-yu-huan-jing-pei-zhi)开始,了解如何正确安装和配置运行环境。接着阅读[第一个脚本:查询地物属性](3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing),通过实际操作建立直观认识。 + +掌握基础操作后,深入学习[使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji)和[运行内置示例脚本](5-yun-xing-nei-zhi-shi-li-jiao-ben),熟悉常用API的使用方法。当需要理解底层原理时,可以参考[SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou)和[SWIG 封装机制说明](7-swig-feng-zhuang-ji-zhi-shuo-ming)。 + +对于高级应用场景,建议学习[Mixin 设计模式](9-mixin-she-ji-mo-shi)以理解代码组织方式,以及查阅[SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api)获取详细的接口说明。 \ No newline at end of file diff --git a/docs/content/10-c-kuo-zhan-mo-kuai-yu-python-jie-kou.md b/docs/content/10-c-kuo-zhan-mo-kuai-yu-python-jie-kou.md new file mode 100644 index 0000000..91ac276 --- /dev/null +++ b/docs/content/10-c-kuo-zhan-mo-kuai-yu-python-jie-kou.md @@ -0,0 +1,348 @@ +本文档深入解析 sunvpy 库的 C++ 扩展模块架构、SWIG 封装机制以及 Python 接口设计模式,帮助高级开发者理解系统的底层实现原理和技术架构。 + +Sources: [__init__.py](__init__.py#L1-L12) + +## 架构概览 + +sunvpy 采用了**三层架构设计**,将底层 C++ 功能无缝集成到 Python 生态系统中。这种架构既保证了核心功能的高性能执行,又提供了灵活易用的 Python 接口。 + +Sources: [PySSCore.py](PySSCore.py#L1-L12), [PySSProcess.py](PySSProcess.py#L2-L22) + +```mermaid +graph TB + subgraph "Python 应用层" + A[SSProcessManager
高级API] + B[Mixin 类集合
SelectionMixin, GeoEditMixin等] + end + + subgraph "SWIG 封装层" + C[PySSCore.py] + D[PySSMap.py] + E[PySSDatabase.py] + F[其他 PySS*.py 模块] + end + + subgraph "C++ 扩展层" + G[_PySSCore.pyd] + H[_PySSMap.pyd] + I[_PySSDatabase.pyd] + J[其他 _PySS*.pyd 模块] + end + + subgraph "原生 C++ 核心" + K[Core C++ 类库] + end + + A --> B + B --> C + B --> D + B --> E + B --> F + C --> G + D --> H + E --> I + F --> J + G --> K + H --> K + I --> K + J --> K +``` + +## SWIG 封装机制 + +sunvpy 使用 **SWIG 4.4.0** 作为 C++ 到 Python 的桥接工具,自动生成 Python 包装代码。每个功能模块对应两个文件:`.pyd` 二进制扩展和 `.py` 接口封装。 + +Sources: [PySSCore.py](PySSCore.py#L1-L5), [PySSDatabase.py](PySSDatabase.py#L1-L5) + +### SWIG 自动生成特征 + +所有 SWIG 生成的 Python 模块都包含标准的头注释,明确标识其自动生成性质: + +```python +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.4.0 +# +# Do not make changes to this file unless you know what you are doing - modify +# the SWIG interface file instead. +``` + +Sources: [PySSCore.py](PySSCore.py#L1-L5), [PySSDatabase.py](PySSDatabase.py#L1-L5) + +### 模块导入机制 + +SWIG 生成的模块采用条件导入策略,确保在不同上下文中正确加载底层 C++ 扩展: + +```python +from sys import version_info as _swig_python_version_info +# Import the low-level C/C++ module +if getattr(globals().get("__spec__"), "parent", None) or __package__ or "." in __name__: + from . import _PySSCore +else: + import _PySSCore +``` + +Sources: [PySSCore.py](PySSCore.py#L7-L12) + +这种设计支持模块的独立运行和包内导入两种场景。 + +## C++ 扩展模块清单 + +sunvpy 包含 10 个 C++ 扩展模块,每个模块负责特定的功能域: + +| 模块名称 | C++ 扩展文件 | SWIG 封装文件 | 功能描述 | +|---------|-------------|--------------|---------| +| Core | _PySSCore.pyd | PySSCore.py | 核心数据结构、基础类型、字段约束 | +| Map | _PySSMap.pyd | PySSMap.py | 地图操作、工作空间、SDL 接口 | +| Database | _PySSDatabase.pyd | PySSDatabase.py | 数据库访问、事务管理 | +| DataSource | _PySSDataSource.pyd | PySSDataSource.py | 数据源管理、数据集操作 | +| Widget | _PySSWidget.pyd | PySSWidget.py | UI 组件、进度条、全局选项 | +| Math | _PySSMath.pyd | PySSMath.py | 数学计算工具、几何运算 | +| Check | _PySSCheck.pyd | PySSCheck.py | 数据检查、验证规则 | +| DataX | _PySSDataX.pyd | PySSDataX.py | 数据导入导出、格式转换 | +| GisDBUpdate | _PySSGisDBUpdate.pyd | PySSGisDBUpdate.py | GIS 数据库更新 | +| View | _PySSView.pyd | PySSView.py | 视图控制、显示管理 | + +Sources: [PySSProcess.py](PySSProcess.py#L2-L7) + +## Python 类型封装 + +SWIG 自动生成 Python 类以包装 C++ 类型,并提供 Python 风格的接口。每个包装类都包含标准的属性和方法定义。 + +### 内存管理机制 + +SWIG 通过 `thisown` 属性实现 Python 端的内存所有权管理: + +```python +class StringArray(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), + doc="The membership flag") +``` + +Sources: [PySSCore.py](PySSCore.py#L122-L124) + +这种机制允许开发者控制 C++ 对象的生命周期,避免内存泄漏。 + +### 动态属性控制 + +SWIG 使用元类和描述符模式限制动态属性的添加,确保类型安全: + +```python +class _SwigNonDynamicMeta(type): + """Meta class to enforce nondynamic attributes (no new attributes) for a class""" + __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) +``` + +Sources: [PySSCore.py](PySSCore.py#L56-L59) + +### 迭代器支持 + +SWIG 为容器类型自动生成迭代器接口,支持 Python 的 `for` 循环语法: + +```python +def iterator(self): + return _PySSCore.StringArray_iterator(self) +def __iter__(self): + return self.iterator() +``` + +Sources: [PySSCore.py](PySSCore.py#L126-L129) + +## 高层架构设计 + +在 SWIG 生成的底层封装之上,sunvpy 构建了高层 Python 类,采用 **Mixin 设计模式** 实现功能的模块化组合。 + +Sources: [PySSProcess.py](PySSProcess.py#L25-L50) + +### SSProcessManager 类 + +`SSProcessManager` 是核心应用类,通过多重继承组合多个 Mixin 的功能: + +```python +class SSProcessManager(SelectionMixin, GeoEditMixin, + ProjectMixin, LogMixin, ProgressMixin): + """SunvStation进程管理类。 + + 该类提供了对SunvStation工作空间和地图的基本操作,包括几何对象的创建、 + 管理和视图更新等功能,以及一些常用的辅助函数等 + """ +``` + +Sources: [PySSProcess.py](PySSProcess.py#L25-L30) + +### Mixin 类层次 + +Mixin 类提供了功能的横向组合,每个 Mixin 负责特定的功能域: + +| Mixin 类 | 功能域 | 导入模块 | +|---------|-------|---------| +| SelectionMixin | 选择集管理 | PySSCore, PySSMap, PySSDataSource | +| GeoEditMixin | 地理对象编辑 | PySSCore, PySSMap | +| ProjectMixin | 项目管理 | PySSCore, PySSMap | +| LogMixin | 日志记录 | logging | +| ProgressMixin | 进度显示 | PySSWidget | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L25-L26), [PySSProcess.py](PySSProcess.py#L18-L22) + +### 全局单例模式 + +SSProcessManager 通过模块级变量导出全局单例,简化使用: + +```python +# @export: SSProcess为模块导出的全局单例 +SSProcess = SSProcessManager() +__all__ = ["SSProcess"] +``` + +Sources: [PySSProcess.py](PySSProcess.py#L88-L90) + +## 数据类型映射 + +SWIG 自动处理 C++ 和 Python 之间的类型转换,提供以下常用类型映射: + +| C++ 类型 | Python 类型 | 示例 | +|---------|------------|------| +| `std::string` | `str` | 字符串属性 | +| `std::vector` | `List[T]` | StringArray, FloatArray | +| `std::map` | `Dict[K,V]` | 字段映射 | +| `bool` | `bool` | BoolArray | +| `int8/16/32/64` | `int` | 整数类型 | +| `float/double` | `float` | 浮点类型 | + +Sources: [PySSCore.py](PySSCore.py#L122-L126), [PySSCore.py](PySSCore.py#L232-L246) + +### 变体类型系统 + +SWIG 封装了 C++ 的变体类型系统,提供类型安全的动态类型支持: + +```python +VT_NONE = _PySSCore.VT_NONE +VT_BOOL = _PySSCore.VT_BOOL +VT_FLOAT = _PySSCore.VT_FLOAT +VT_DOUBLE = _PySSCore.VT_DOUBLE +VT_INT8 = _PySSCore.VT_INT8 +VT_STRING = _PySSCore.VT_STRING +VT_BINARY = _PySSCore.VT_BINARY +``` + +Sources: [PySSCore.py](PySSCore.py#L232-L246) + +## 调用路径分析 + +从 Python 应用到 C++ 核心的典型调用路径如下: + +```mermaid +sequenceDiagram + participant App as Python 应用 + participant SPM as SSProcessManager + participant Mixin as Mixin 方法 + participant SWIG as SWIG 封装 + participant PYD as C++ 扩展 + participant CPP as C++ 核心 + + App->>SPM: SSProcess.selectFilter() + SPM->>Mixin: 调用 Mixin 方法 + Mixin->>SWIG: GeoBaseList 对象操作 + SWIG->>PYD: _PySSCore.*() + PYD->>CPP: C++ 类方法执行 + CPP-->>PYD: 返回结果 + PYD-->>SWIG: 类型转换 + SWIG-->>Mixin: Python 对象 + Mixin-->>SPM: 返回结果 + SPM-->>App: 返回给应用 +``` + +Sources: [PySSProcess.py](PySSProcess.py#L93-L98), [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L49-L55) + +## 错误处理与异常机制 + +SWIG 生成的 Python 模块支持 C++ 异常到 Python 异常的自动转换: + +```python +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ +``` + +Sources: [PySSCore.py](PySSCore.py#L14-L17) + +SWIG 在封装 C++ 方法时自动添加异常处理逻辑,将 C++ 异常转换为 Python 的 `RuntimeError` 或其他适当的异常类型。 + +## 性能优化策略 + +### 延迟加载设计 + +SSProcessManager 在初始化时仅获取关键实例的引用,避免不必要的资源加载: + +```python +def __init__(self): + """初始化SSProcess实例。 + + 获取当前工作空间和地图实例,为后续操作做准备。 + """ + self.workspace = WorkSpace.getInstance() + self.map = self.workspace.getCurrentScaleMap() + self.global_options = GlobalOptions.getInstance() +``` + +Sources: [PySSProcess.py](PySSProcess.py#L53-L59) + +### 对象缓存机制 + +SSProcessManager 维护多个对象缓存列表,减少重复创建和数据库访问: + +```python +self.bufferObjList = GeoBaseList() # 缓存对象列表 +self.bufferNoteList = GeoBaseList() # 缓存注记列表 +self.newBufferObjList = [] # 新创建对象缓存列表 +``` + +Sources: [PySSProcess.py](PySSProcess.py#L74-L78) + +## 扩展开发指南 + +### 理解模块依赖关系 + +开发新的 Mixin 类时,需要正确导入依赖的 SWIG 模块: + +```python +from sunvpy.PySSMath import * +from sunvpy.PySSCore import * +from sunvpy.PySSMap import * +from sunvpy.PySSDataSource import * +from sunvpy.PySSWidget import Progress, GlobalOptions +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L4-L9) + +### 类型注解规范 + +在 Mixin 类中使用显式类型注解,提高代码可读性和 IDE 支持: + +```python +class SelectionMixin(GeoEditAware, LogAware, ProgressAware, ABC): + # 显式声明成员变量类型 + workspace: WorkSpace + map: ScaleMap + global_options: GlobalOptions + selGeoList: GeoBaseList + searchHelper: SSearchHelper +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L27-L35) + +## 学习路径建议 + +要深入理解 sunvpy 的 C++ 扩展架构,建议按照以下路径学习: + +1. **基础理解**:先阅读 [库概述](1-ku-gai-shu) 了解整体架构 +2. **SWIG 机制**:学习 [SWIG 封装机制说明](7-swig-feng-zhuang-ji-zhi-shuo-ming) 掌握封装原理 +3. **工作空间概念**:理解 [工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian) +4. **Mixin 模式**:深入研究 [Mixin 设计模式](9-mixin-she-ji-mo-shi) +5. **实战应用**:通过 [第一个脚本:查询地物属性](3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing) 实践使用接口 + +Sources: [__init__.py](__init__.py#L1-L12) + +## 总结 + +sunvpy 的 C++ 扩展模块与 Python 接口设计展现了优秀的混合编程实践:通过 SWIG 实现了 C++ 高性能核心与 Python 灵活生态的无缝集成,采用 Mixin 模式实现了功能的模块化和可组合性,通过单例模式简化了全局访问。这种架构既保证了核心功能的执行效率,又提供了开发者友好的 Python 接口。 \ No newline at end of file diff --git a/docs/content/11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md b/docs/content/11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md new file mode 100644 index 0000000..3a2191e --- /dev/null +++ b/docs/content/11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md @@ -0,0 +1,230 @@ +本页面介绍 SunvStation Python 脚本中选择集的初始化机制与清除操作。选择集是脚本操作地理对象的核心容器,掌握其初始化和清除方法对于编写稳定的数据处理脚本至关重要。 + +## 选择集基本概念 + +在 SunvStation 脚本环境中,存在两种类型的选择集:**脚本选择集**和**系统选择集**。脚本选择集由 `SSProcessManager` 在内存中维护,用于批量操作地理对象;系统选择集则是地图界面中当前选中的对象集合,直接影响地图显示效果。两者可以相互同步,但具有不同的生命周期和管理方式。 + +脚本选择集由两个核心列表组成:`selGeoList` 存储点、线、面对象,`selNoteList` 存储注记对象。这种分离设计便于对不同类型的地理对象进行差异化管理。 + +Sources: [PySSProcess.py](PySSProcess.py#L30-L50) + +## 选择集的自动初始化 + +当导入 `sunvpy` 模块或创建 `SSProcessManager` 实例时,选择集会自动完成初始化。初始化过程不需要开发者手动干预,确保脚本一开始就拥有可用的选择集容器。 + +自动初始化包含以下步骤:获取当前工作空间实例、获取当前比例尺地图、创建地物和注记的空列表、初始化搜索助手、配置数据源和数据集列表。 + +```mermaid +flowchart LR + A[模块导入] --> B[创建 SSProcessManager 实例] + B --> C[获取工作空间 WorkSpace] + C --> D[获取当前地图 ScaleMap] + D --> E[初始化选择集容器] + E --> F[selGeoList = GeoBaseList] + E --> G[selNoteList = GeoBaseList] + E --> H[searchHelper = SSearchHelper] + H --> I[配置数据源和数据集] + I --> J[初始化完成,准备就绪] +``` + +Sources: [PySSProcess.py](PySSProcess.py#L50-L80) + +**关键初始化代码**展示了这一过程的实现: + +```python +# 脚本选择集容器(在 __init__ 中自动创建) +self.selGeoList = GeoBaseList() # 点线面对象列表 +self.selNoteList = GeoBaseList() # 注记对象列表 +self.searchHelper = SSearchHelper() # 搜索助手 +``` + +Sources: [PySSProcess.py](PySSProcess.py#L56-L61) + +## 清除脚本选择集 + +`clearSelection()` 方法用于清空脚本选择集中的所有对象。该方法会同时清除地物列表和注记列表,将选择集恢复到初始空状态。这个操作不会影响系统选择集(地图上显示的选中状态),也不会影响数据库中的原始数据。 + +```python +# 清除脚本选择集中的所有地物和注记 +SSProcess.clearSelection() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L38-L43) + +**清除操作的实际效果**:调用 `clearSelection()` 后,`selGeoList` 和 `selNoteList` 都会变为空列表,后续的选择查询和遍历操作将基于空集进行。这是开启新一轮选择操作前的标准准备步骤。 + +## 清除选择条件 + +`clearSelectCondition()` 方法专门用于清除选择条件,而不影响选择集对象本身。选择条件由 `searchHelper` 内部维护,包含用于过滤查询的各种规则。清除条件后,新的查询将不再受之前设置条件的约束。 + +```python +# 清除之前设置的所有选择条件 +SSProcess.clearSelectCondition() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L49) + +选择条件与选择集对象的区别:选择条件是"筛选规则",选择集对象是"筛选结果"。`clearSelectCondition()` 清除规则,保留结果;`clearSelection()` 清除结果,保留规则。在实际脚本中,通常先清除条件,再设置新条件,最后执行查询。 + +## 清除系统选择集 + +`clearSysSelection()` 方法操作的是地图系统选择集,会移除地图界面上所有高亮显示的选中对象。这直接影响地图的视觉效果,使地图恢复到无选中状态。 + +```python +# 清除地图系统选择集(移除地图上的高亮显示) +SSProcess.clearSysSelection() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L190-L193) + +**脚本选择集与系统选择集的协同**:在需要完全重置选择状态的场景下,通常连续调用三种清除方法:先清除脚本选择集对象,再清除选择条件,最后清除系统选择集的高亮显示。 + +## 典型使用场景 + +### 场景一:开始新的查询操作 + +在执行新一轮数据查询前,需要重置选择集状态,确保不受到之前查询结果的干扰。 + +```mermaid +flowchart LR + A[开始新查询] --> B[clearSelection
清除脚本选择集] + B --> C[clearSelectCondition
清除选择条件] + C --> D[setSelectCondition
设置新条件] + D --> E[selectFilter
执行查询] + E --> F[获得新的选择集结果] +``` + +Sources: [PySSProcess.py](PySSProcess.py#L98-L106) + +**完整示例代码**: + +```python +# 准备阶段:清除旧的查询状态 +SSProcess.clearSelection() # 清除之前的选择集对象 +SSProcess.clearSelectCondition() # 清除之前的选择条件 + +# 设置新的查询条件 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 执行查询 +SSProcess.selectFilter() + +# 获取查询结果 +geo_count = SSProcess.getSelGeoCount() +print(f"查询到 {geo_count} 个地物对象") +``` + +Sources: [PySSProcess.py](PySSProcess.py#L98-L108) + +### 场景二:脚本结束前的清理 + +在脚本执行结束时,清除所有选择状态,避免影响用户后续操作。 + +```python +# 批量处理完成后清理 +# ... 数据处理逻辑 ... + +SSProcess.clearSelection() # 清除脚本选择集 +SSProcess.clearSysSelection() # 清除地图高亮显示 +``` + +### 场景三:条件筛选后重试 + +当第一次查询结果不符合预期时,清除条件并重新设置筛选规则。 + +```python +# 第一次查询 +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "LINE") +SSProcess.selectFilter() + +if SSProcess.getSelGeoCount() == 0: + # 结果为空,尝试调整条件 + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") + SSProcess.selectFilter() +``` + +## 三种清除方法的对比 + +下表总结了三种清除方法的适用场景和操作范围: + +| 方法 | 操作对象 | 是否影响地图显示 | 典型使用场景 | +|------|---------|----------------|-------------| +| `clearSelection()` | 脚本选择集对象列表 | 否 | 开始新一轮查询前、脚本结束清理 | +| `clearSelectCondition()` | 搜索条件规则 | 否 | 更改查询条件前、重试查询时 | +| `clearSysSelection()` | 地图系统选择集 | 是 | 移除地图高亮、避免视觉干扰 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L38-L193) + +## 选择集状态检查 + +在清除操作前后,可以使用查询方法验证选择集状态。 + +```python +# 清除前检查 +print(f"清除前地物数量: {SSProcess.getSelGeoCount()}") +print(f"清除前注记数量: {SSProcess.getSelNoteCount()}") + +# 执行清除 +SSProcess.clearSelection() + +# 清除后检查 +print(f"清除后地物数量: {SSProcess.getSelGeoCount()}") +print(f"清除后注记数量: {SSProcess.getSelNoteCount()}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L195-L208) + +## 完整工作流程示例 + +以下示例展示了一个完整的选择集使用周期:初始化、设置条件、查询、处理、清理。 + +```python +# 步骤 1:重置选择集状态(通常不需要手动初始化) +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 步骤 2:设置查询条件 +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") + +# 步骤 3:执行过滤查询 +SSProcess.selectFilter() + +# 步骤 4:处理选择集对象 +count = SSProcess.getSelGeoCount() +for i in range(count): + name = SSProcess.getSelGeoValue(i, "SSObj_Name") + print(f"对象 {i}: {name}") + +# 步骤 5:清理选择状态 +SSProcess.clearSelection() +SSProcess.clearSysSelection() +``` + +Sources: [PySSProcess.py](PySSProcess.py#L98-L140) + +## 常见问题与注意事项 + +**问题一**:清除选择集后,地图上的对象还在吗?
+**解答**:清除脚本选择集不会从地图或数据库中删除对象,只是从内存中的列表移除引用。要真正删除对象,需要调用删除对象的方法。 + +**问题二**:为什么需要分别清除对象和条件?
+**解答**:这是为了提供更精细的控制。有时需要保留选择结果但更换查询条件,有时需要更换条件但保留部分结果。分离设计让脚本更灵活。 + +**问题三**:系统选择集和脚本选择集会自动同步吗?
+**解答**:不会自动同步。需要使用 `updateSysSelection()` 方法手动同步,可以指定同步方向。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L152-L176) + +## 学习路径建议 + +掌握清除与初始化选择集是学习 SunvStation 脚本的基础。建议按照以下顺序继续学习: + +1. **[设置选择条件](12-she-zhi-xuan-ze-tiao-jian)**:深入了解如何构建复杂的选择条件 +2. **[执行过滤查询](13-zhi-xing-guo-lv-cha-xun)**:学习 `selectFilter()` 方法的详细用法 +3. **[遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang)**:掌握如何高效遍历和访问选择集中的对象 +4. **[使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji)**:回到快速入门,了解更完整的选择集管理流程 + +通过循序渐进的学习,您将能够熟练运用选择集机制,高效完成地理数据的批量处理任务。 \ No newline at end of file diff --git a/docs/content/12-she-zhi-xuan-ze-tiao-jian.md b/docs/content/12-she-zhi-xuan-ze-tiao-jian.md new file mode 100644 index 0000000..0d70791 --- /dev/null +++ b/docs/content/12-she-zhi-xuan-ze-tiao-jian.md @@ -0,0 +1,598 @@ +本页面介绍 SunvStation Python 脚本中设置选择条件的方法。选择条件是过滤地理对象的查询规则,通过组合不同条件可以精确筛选出符合特定要求的地物对象。掌握条件设置的语法和技巧,能够显著提升数据处理脚本的效率和准确性。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137) + +## 核心方法概述 + +`setSelectCondition()` 方法是设置选择条件的主要接口。该方法将指定的条件添加到脚本选择集的查询规则中,可以多次调用以构建复合查询条件。条件由三个部分组成:条件名称、操作模式和条件值,三者组合形成一个完整的查询表达式。 + +```python +SSProcess.setSelectCondition(conditionName, operateMode, conditionValue) +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137) + +**方法的底层实现**通过调用 `searchHelper.addCondition()` 将条件添加到内部维护的条件列表中。这些条件在调用 `selectFilter()` 时被实际执行,从而过滤出符合所有条件的地理对象。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137) + +## 条件名称类型 + +选择条件的名称(conditionName)决定了查询的目标属性。系统支持三种类型的条件名称:基本属性、几何特性和扩展属性,每种类型有不同的前缀标识规则。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L115) + +### 基本属性 + +以 `SSObj_` 开头的属性称为基本属性,这些是地理对象的内置属性,涵盖对象的标识、外观、几何信息等。基本属性是最常用的查询条件,覆盖了大多数常规筛选需求。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L107) + +**常用基本属性列表**: + +| 属性名称 | 说明 | 示例值 | +|---------|------|--------| +| `SSObj_ID` | 对象唯一标识 | "1001" | +| `SSObj_Code` | 编码 | "3103013" | +| `SSObj_LayerName` | 层名 | "Default_A" | +| `SSObj_Type` | 对象类型 | "POINT", "LINE", "AREA", "NOTE" | +| `SSObj_Color` | 颜色 | "RGB(255,0,0)", "16777215" | +| `SSObj_Name` | 对象名称 | "建筑物1" | +| `SSObj_Area` | 面积 | "150.5" | +| `SSObj_Length` | 长度 | "230.8" | +| `SSObj_PointCount` | 点数 | "1", "1,2,4" | +| `SSObj_X` / `SSObj_Y` / `SSObj_Z` | 坐标 | "12345.67", "2345.89", "0" | +| `SSObj_CreateTime` | 创建时间 | "2023-07-01 12:00:00" | +| `SSObj_ModifyTime` | 修改时间 | "2023-08-15 09:30:00" | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L60-L103) + +**注记对象特有属性**: + +| 属性名称 | 说明 | +|---------|------| +| `SSObj_FontWidth` | 字宽 | +| `SSObj_FontHeight` | 字高 | +| `SSObj_FontName` | 字体名 | +| `SSObj_FontClass` | 注记分类号 | +| `SSObj_FontAlignment` | 对齐方式 | +| `SSObj_FontString` | 注记内容 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L88-L98) + +### 几何特性 + +使用尖括号 `<>` 括住的属性称为几何特性,用于查询对象的拓扑或几何状态特征。这些条件不直接比较属性值,而是判断对象是否满足特定的几何条件。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106) + +**常用几何特性**: + +| 特性名称 | 说明 | 常用操作符 | +|---------|------|----------| +| `` | 重叠 | "==" | +| `` | 封闭 | "==" | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106) + +几何特性通常使用 `"=="` 操作符,条件值为 `"True"` 或 `"False"`,用于筛选出具有特定拓扑状态的对象。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106) + +### 扩展属性 + +使用方括号 `[]` 括住的属性称为扩展属性,这些是用户自定义的属性字段,存储在对象的扩展属性表中。扩展属性允许根据业务需求灵活定义查询条件,是数据查询的强大工具。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L107-L108) + +**扩展属性示例**: + +```python +# 查询扩展属性名为"建筑结构"的对象 +SSProcess.setSelectCondition("[建筑结构]", "==", "砖混") + +# 查询扩展属性为"层数"大于10的对象 +SSProcess.setSelectCondition("[层数]", ">", "10") + +# 多个扩展属性组合查询(支持逗号分隔) +SSProcess.setSelectCondition("[结构],[层数]", "LIKE", "砖混,6") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274) + +## 操作模式 + +操作模式(operateMode)定义了条件名称与条件值之间的比较方式。系统支持多种比较操作符,可以满足从精确匹配到模糊查询的各种需求。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L110-L117) + +### 基本比较操作符 + +| 操作符 | 说明 | 适用数据类型 | 示例 | +|-------|------|------------|------| +| `==` | 等于 | 所有类型 | `"SSObj_Code", "==", "A1"` | +| `>` | 大于 | 数值 | `"SSObj_Length", ">", "100"` | +| `<` | 小于 | 数值 | `"SSObj_Area", "<", "50"` | +| `<>` | 不等于 | 所有类型 | `"SSObj_Type", "<>", "NOTE"` | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L110-L114) + +### 字符串匹配操作符 + +| 操作符 | 说明 | 使用场景 | +|-------|------|---------| +| `LIKE` | 模糊匹配 | 部分匹配字符串,支持通配符 | +| `NOT LIKE` | 不匹配 | 排除特定模式的字符串 | +| `CompareNoCase` | 不区分大小写比较 | 忽略大小写的精确匹配 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L115-L116) + +**模糊匹配示例**: + +```python +# 查询名称包含"建筑"的对象 +SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑") + +# 查询不包含"临时"的对象 +SSProcess.setSelectCondition("SSObj_Name", "NOT LIKE", "临时") + +# 不区分大小写匹配编码 +SSProcess.setSelectCondition("SSObj_Code", "CompareNoCase", "a1") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L115-L116) + +### 特殊操作符 + +| 操作符 | 说明 | 使用场景 | +|-------|------|---------| +| `Dec` | 小数位控制 | 精确指定数值的小数位数 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L117) + +`Dec` 操作符用于控制数值比较的小数位数,确保浮点数比较的精确性。例如,`"Dec(2)"` 表示比较时保留两位小数。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L117) + +## 条件值方式 + +条件值(conditionValue)支持三种格式:单值、多值和区间。不同的值格式对应不同的查询需求,提供灵活的筛选能力。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L134) + +### 单值方式 + +单值是最常用的条件值格式,直接指定一个具体的值进行比较。适用于精确匹配或数值范围查询。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L120) + +```python +# 精确匹配编码 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 面积大于100 +SSProcess.setSelectCondition("SSObj_Area", ">", "100") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L120) + +### 多值方式 + +多值格式使用逗号分隔多个值,用于匹配任意一个值的场景。这种方式相当于多个相等条件的"或"逻辑组合。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123) + +```python +# 查询编码为A1或A2或A3的对象 +SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3") + +# 查询多个点类型的对象 +SSProcess.setSelectCondition("SSObj_PointCount", "==", "1,2,4") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123) + +多值方式大大简化了重复查询条件的编写,当需要匹配多个可能值时特别有用。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123) + +### 区间方式 + +区间格式使用 `->` 分隔起始值和结束值,表示一个数值范围。适用于连续数值的区间查询。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126) + +```python +# 查询面积在100到500之间的对象 +SSProcess.setSelectCondition("SSObj_Area", "==", "100->500") + +# 查询长度大于0小于等于1000的对象 +SSProcess.setSelectCondition("SSObj_Length", "==", "0->1000") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126) + +区间方式是数值范围查询的简洁表达方式,等同于 `">="` 和 `"<="` 两个条件的组合。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126) + +## 条件设置流程 + +设置选择条件并执行查询的完整流程包括清除旧条件、设置新条件、执行过滤和遍历结果四个步骤。 + +```mermaid +flowchart LR + A[开始查询流程] --> B{是否需要清除旧条件?} + B -->|是| C[clearSelectCondition] + B -->|否| D[设置选择条件] + C --> D + D --> E{是否需要多个条件?} + E -->|是| D + E -->|否| F[selectFilter 执行过滤] + F --> G[查询完成] + G --> H[获取选择集数量] + H --> I[遍历选择集对象] +``` + +Sources: [PySSProcess.py](PySSProcess.py#L98-L108) + +## 基础使用示例 + +### 示例一:精确匹配查询 + +查询编码为指定值的对象,这是最常见的查询场景。 + +```python +# 清除之前的条件 +SSProcess.clearSelectCondition() + +# 设置查询条件:编码等于3103013 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 执行查询 +SSProcess.selectFilter() + +# 获取结果数量 +count = SSProcess.getSelGeoCount() +print(f"查询到 {count} 个对象") +``` + +Sources: [PySSProcess.py](PySSProcess.py#L98-L108) + +### 示例二:组合条件查询 + +通过多次调用 `setSelectCondition()` 可以组合多个查询条件,系统将使用"与"逻辑匹配所有条件。 + +```python +# 清除旧条件 +SSProcess.clearSelectCondition() + +# 设置组合条件:位于Default_A层且为面积类型且面积大于100 +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.setSelectCondition("SSObj_Area", ">", "100") + +# 执行查询 +SSProcess.selectFilter() + +# 遍历结果 +count = SSProcess.getSelGeoCount() +for i in range(min(5, count)): # 只显示前5个 + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + name = SSProcess.getSelGeoValue(i, "SSObj_Name") + area = SSProcess.getSelGeoValue(i, "SSObj_Area") + print(f"对象{i}: 编码={code}, 名称={name}, 面积={area}") +``` + +Sources: [PySSProcess.py](PySSProcess.py#L110-L130) + +## 高级使用示例 + +### 示例三:模糊匹配与扩展属性 + +结合模糊匹配和扩展属性,实现业务相关的复杂查询。 + +```python +# 清除旧条件 +SSProcess.clearSelectCondition() + +# 查询名称包含"建筑"且结构为"砖混"的对象 +SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑") +SSProcess.setSelectCondition("[建筑结构]", "==", "砖混") + +# 执行查询 +SSProcess.selectFilter() + +# 显示查询结果 +count = SSProcess.getSelGeoCount() +print(f"找到 {count} 个符合条件的建筑物") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L128-L134) + +### 示例四:几何特性查询 + +利用几何特性筛选特定拓扑状态的对象。 + +```python +# 清除旧条件 +SSProcess.clearSelectCondition() + +# 查询重叠的面对象 +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.setSelectCondition("", "==", "True") + +# 执行查询 +SSProcess.selectFilter() + +# 检查重叠对象 +count = SSProcess.getSelGeoCount() +print(f"发现 {count} 个重叠的面对象") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106) + +### 示例五:区间数值查询 + +使用区间方式查询数值范围。 + +```python +# 清除旧条件 +SSProcess.clearSelectCondition() + +# 查询面积在100到500之间的面对象 +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.setSelectCondition("SSObj_Area", "==", "100->500") + +# 执行查询 +SSProcess.selectFilter() + +# 统计结果 +count = SSProcess.getSelGeoCount() +print(f"面积在100-500范围内的面对象数量: {count}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126) + +### 示例六:多值匹配查询 + +使用多值方式一次性匹配多个可能值。 + +```python +# 清除旧条件 +SSProcess.clearSelectCondition() + +# 查询编码为A1、A2或A3中的任意一个 +SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3") + +# 执行查询 +SSProcess.selectFilter() + +# 显示结果 +count = SSProcess.getSelGeoCount() +print(f"编码为A1/A2/A3的对象数量: {count}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123) + +## 条件设置的注意事项 + +### 条件的累积特性 + +多次调用 `setSelectCondition()` 会累积条件,新的条件不会覆盖旧条件。如果需要重新开始查询,必须先调用 `clearSelectCondition()` 清除所有旧条件。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L49) + +```python +# 错误示例:未清除旧条件 +SSProcess.setSelectCondition("SSObj_Type", "==", "LINE") +SSProcess.setSelectCondition("SSObj_Code", "==", "A1") +# 此时查询的是类型为LINE且编码为A1的对象,而不是仅编码为A1的对象 + +# 正确示例:先清除再设置 +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Code", "==", "A1") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L49) + +### 条件与查询的分离 + +设置条件本身不会触发查询,必须显式调用 `selectFilter()` 方法才会执行过滤操作。这种分离设计允许在执行前组合多个条件。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154) + +```python +# 设置多个条件 +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") +SSProcess.setSelectCondition("SSObj_Area", ">", "50") +# 此时选择集仍然是旧的,查询尚未执行 + +# 执行查询 +SSProcess.selectFilter() +# 此时选择集才被更新为查询结果 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154) + +### 值格式的正确使用 + +正确使用单值、多值和区间格式,避免语法错误导致查询失败。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L126) + +| 值格式 | 正确示例 | 错误示例 | +|-------|---------|---------| +| 单值 | `"A1"` | `A1`(缺少引号) | +| 多值 | `"A1,A2,A3"` | `"A1;A2;A3"`(使用错误分隔符) | +| 区间 | `"100->500"` | `"100-500"`(使用错误符号) | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L126) + +### 扩展属性的大小写敏感性 + +扩展属性的名称和值通常区分大小写,需要确保使用与数据库中完全一致的大小写格式。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274) + +```python +# 如果扩展属性名称为"建筑结构",不能使用"[建筑结构]"以外的格式 +SSProcess.setSelectCondition("[建筑结构]", "==", "砖混") # 正确 +SSProcess.setSelectCondition("[建筑结构]", "CompareNoCase", "砖混") # 不区分大小写匹配值 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274) + +## 典型应用场景 + +### 场景一:按图层批量处理 + +对特定图层中的所有对象执行批量操作。 + +```python +# 清除选择集和条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 设置条件:选中Default_A层的所有对象 +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") + +# 执行查询 +SSProcess.selectFilter() + +# 批量修改属性 +count = SSProcess.getSelGeoCount() +for i in range(count): + SSProcess.setSelGeoValue(i, "SSObj_Color", "16777215") + SSProcess.setSelGeoValue(i, "SSObj_DataMark", "1") +``` + +Sources: [PySSProcess.py](PySSProcess.py#L130-L150) + +### 场景二:数据质量检查 + +查询可能存在问题的对象,如面积过小或长度异常。 + +```python +# 清除条件 +SSProcess.clearSelectCondition() + +# 查询面积小于5的面对象(可能为错误数据) +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.setSelectCondition("SSObj_Area", "<", "5") + +# 执行查询 +SSProcess.selectFilter() + +# 输出问题对象 +count = SSProcess.getSelGeoCount() +print(f"发现 {count} 个面积过小的对象") +for i in range(count): + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + area = SSProcess.getSelGeoValue(i, "SSObj_Area") + print(f" 编码 {code}, 面积 {area}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L107) + +### 场景三:按时间范围查询 + +查询特定时间段内创建或修改的对象。 + +```python +# 清除条件 +SSProcess.clearSelectCondition() + +# 查询2023年7月创建的对象 +SSProcess.setSelectCondition("SSObj_CreateTime", ">=", "2023-07-01 00:00:00") +SSProcess.setSelectCondition("SSObj_CreateTime", "<", "2023-08-01 00:00:00") + +# 执行查询 +SSProcess.selectFilter() + +# 统计结果 +count = SSProcess.getSelGeoCount() +print(f"2023年7月创建的对象数量: {count}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L94-L96) + +### 场景四:按类型批量查询 + +分别查询不同类型的对象并分别处理。 + +```python +# 查询线对象 +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "LINE") +SSProcess.selectFilter() +line_count = SSProcess.getSelGeoCount() +print(f"线对象: {line_count}") + +# 查询面对象 +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.selectFilter() +area_count = SSProcess.getSelGeoCount() +print(f"面对象: {area_count}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L64-L66) + +## 条件设置的性能考虑 + +### 多条件的查询效率 + +设置多个条件时,查询引擎会按照"与"逻辑执行,即对象必须同时满足所有条件才会被选中。合理设置条件的顺序可以提高查询效率,建议将选择性强的条件(如唯一编码)放在前面。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137) + +```python +# 优化前:选择性弱的条件在前 +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") # 该层可能包含大量对象 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") # 编码唯一,选择性极强 + +# 优化后:选择性强的条件在前 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") # 快速定位唯一对象 +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") # 进一步验证 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137) + +### 避免过度复杂的条件 + +过于复杂的条件组合可能导致查询性能下降,建议将复杂查询拆分为多个简单查询。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154) + +```python +# 复杂查询:多个模糊匹配组合 +SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑") +SSProcess.setSelectCondition("SSObj_Name", "LIKE", "住宅") +SSProcess.setSelectCondition("[结构]", "==", "砖混") +SSProcess.setSelectCondition("SSObj_Area", ">", "50") +SSProcess.setSelectCondition("SSObj_Area", "<", "500") +# 这样的查询可能较慢 + +# 拆分为两步:先按结构筛选,再进一步过滤 +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("[结构]", "==", "砖混") +SSProcess.selectFilter() +# 对选择集结果再进行进一步处理... +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154) + +## 下一步学习 + +掌握设置选择条件后,建议继续学习以下相关内容: + +- **执行过滤查询**:了解如何调用 `selectFilter()` 方法执行查询,并查看更多查询示例,详见[执行过滤查询](13-zhi-xing-guo-lv-cha-xun) + +- **遍历选择集对象**:学习如何高效遍历和访问选择集中的对象属性,详见[遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang) + +- **获取地物属性值**:深入了解各种基本属性和扩展属性的获取方法,详见[获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi) + +通过这些相关章节的学习,可以完整掌握选择集查询和处理的全套流程。 \ No newline at end of file diff --git a/docs/content/13-zhi-xing-guo-lu-cha-xun.md b/docs/content/13-zhi-xing-guo-lu-cha-xun.md new file mode 100644 index 0000000..c0a7beb --- /dev/null +++ b/docs/content/13-zhi-xing-guo-lu-cha-xun.md @@ -0,0 +1,417 @@ +本页面介绍 SunvStation Python 脚本中执行过滤查询的方法。`selectFilter()` 方法是选择集查询的核心执行环节,它根据之前设置的选择条件,从数据源中筛选出符合条件的地理对象,并将结果填充到脚本选择集中。掌握此方法的执行机制和结果处理,是构建高效数据查询脚本的关键。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +## 核心方法概述 + +`selectFilter()` 方法负责执行实际的选择集过滤操作。该方法内部协调搜索助手 `searchHelper`,通过两阶段查询机制完成对象筛选:首先获取候选对象列表,然后根据完整条件进行精确过滤,最后将结果分类存储到脚本选择集中。 + +```python +SSProcess.selectFilter() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +**方法返回值**:该方法无返回值,执行结果通过脚本选择集成员变量 `selGeoList`(点线面对象)和 `selNoteList`(注记对象)提供访问。查询成功后,可以使用 `getSelGeoCount()` 和 `getSelNoteCount()` 获取结果数量,使用 `getSelGeoValue()` 等方法遍历对象属性。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +## 执行流程 + +过滤查询的执行过程包含四个关键阶段:缓存清理、候选对象获取、精确过滤、结果分类存储。整个流程由进度条模块提供可视化反馈,确保操作透明可控。 + +```mermaid +flowchart TD + A[调用 selectFilter] --> B[清理缓存] + B --> C[清空 curSelGeoFields] + C --> D[清空 curSelGeoValues] + D --> E[执行选择过滤] + E --> F[创建临时 GeoBaseList] + F --> G[getFilterObj 获取候选对象] + G --> H{候选对象非空?} + H -->|是| I[filterObj 精确过滤] + H -->|否| J[跳过过滤步骤] + I --> K[遍历结果列表] + J --> K + K --> L{对象类型判断} + L -->|注记对象| M[添加到 selNoteList] + L -->|点线面对象| N[添加到 selGeoList] + M --> O[完成选择集过滤] + N --> O + O --> P[关闭进度条] +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +**进度反馈机制**:方法执行过程中会调用 `stepProgress()` 方法报告当前进度,包括"清理缓存"、"执行选择过滤"、"更新选择集"、"完成选择集过滤"四个阶段。开发者可以通过 `enable_progress` 属性控制是否显示进度条。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L134-L154) + +## 详细执行步骤 + +### 步骤一:清理缓存 + +执行查询前,方法首先清理属性缓存字段 `curSelGeoFields` 和 `curSelGeoValues`。这两个字符串数组用于存储当前选中对象的属性字段和对应值,清理缓存确保新的查询结果不会受到之前属性访问的干扰。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L138) + +### 步骤二:获取候选对象 + +方法创建临时的 `GeoBaseList` 容器,并调用 `searchHelper.getFilterObj()` 方法。该方法根据 `m_selectConditions` 中存储的选择条件,从当前数据源中获取满足条件的候选对象列表。这一步是初步筛选,可能包含部分不完全符合所有条件的对象。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L141-L142) + +### 步骤三:精确过滤 + +如果候选对象列表非空,方法调用 `searchHelper.filterObj()` 进行精确过滤。这一步对候选对象应用完整的条件规则集合,确保最终结果严格满足所有设置的条件。只有通过精确过滤的对象才会被加入最终的选择集。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L145-L146) + +### 步骤四:结果分类存储 + +最后,方法遍历过滤后的对象列表,根据对象类型将其分类存储:注记对象(`e_Note_Obj`)添加到 `selNoteList`,其他类型的点线面对象添加到 `selGeoList`。这种分离存储便于后续对不同类型对象进行差异化处理。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L148-L152) + +## 完整使用示例 + +以下示例展示了一个完整的过滤查询流程,从条件设置到结果处理的各个步骤。 + +```mermaid +flowchart LR + A[开始查询] --> B[clearSelection
清除旧结果] + B --> C[clearSelectCondition
清除旧条件] + C --> D[setSelectCondition
设置查询条件] + D --> E[selectFilter
执行过滤] + E --> F{检查结果数量} + F -->|大于0| G[遍历处理对象] + F -->|等于0| H[输出无结果提示] + G --> I[获取对象属性] + I --> J[完成处理] +``` + +Sources: [PySSProcess.py](PySSProcess.py#L94-L98) + +### 基础查询示例 + +```python +# 准备阶段:清除旧的状态 +SSProcess.clearSelection() # 清除之前的选择集对象 +SSProcess.clearSelectCondition() # 清除之前的选择条件 + +# 设置查询条件:编码等于 3103013 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 执行过滤查询 +SSProcess.selectFilter() + +# 获取结果数量 +geo_count = SSProcess.getSelGeoCount() +print(f"选择集中的点线面对象数量: {geo_count}") + +# 处理查询结果 +if geo_count > 0: + for i in range(min(10, geo_count)): # 只处理前10个对象 + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + name = SSProcess.getSelGeoValue(i, "SSObj_Name") + print(f"对象 {i}: 编码={code}, 名称={name}") +else: + print("未找到符合条件的对象") +``` + +Sources: [PySSProcess.py](PySSProcess.py#L94-L115) + +### 多条件复合查询 + +```python +# 清除状态 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 设置多个查询条件(逻辑与关系) +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.setSelectCondition("SSObj_Area", ">", "100") + +# 执行查询 +SSProcess.selectFilter() + +# 统计结果 +area_count = SSProcess.getSelGeoCount() +print(f"查询到 {area_count} 个面积大于100的面对象") +``` + +### 使用多值和区间查询 + +```python +# 清除状态 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 使用多值方式(匹配任意一个) +SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3") + +# 使用区间方式(值1->值2) +SSProcess.setSelectCondition("SSObj_Length", "==", "50->200") + +# 执行查询 +SSProcess.selectFilter() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L134) + +## 查询前后的选择集状态对比 + +下表展示了执行 `selectFilter()` 前后脚本选择集的典型状态变化。 + +| 状态指标 | 查询前 | 查询后 | 说明 | +|---------|-------|-------|------| +| `selGeoList` 对象数量 | 0 或旧值 | 新查询结果数量 | 完全替换,非追加 | +| `selNoteList` 对象数量 | 0 或旧值 | 新查询结果数量 | 完全替换,非追加 | +| `m_selectConditions` 条件数量 | 保持不变 | 保持不变 | 条件不受影响 | +| `curSelGeoFields` | 旧值或空 | 空 | 缓存已清理 | +| `curSelGeoValues` | 旧值或空 | 空 | 缓存已清理 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +**重要特性**:`selectFilter()` 是"替换模式"而非"追加模式"。每次执行都会完全重写 `selGeoList` 和 `selNoteList`,之前的选择集结果会被完全覆盖。如果需要保留之前的结果,应在调用前将结果保存到其他容器中。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L148-L152) + +## 结果处理最佳实践 + +### 检查查询结果 + +执行查询后,首先检查结果数量,避免对空列表进行操作。 + +```python +SSProcess.selectFilter() +geo_count = SSProcess.getSelGeoCount() +note_count = SSProcess.getSelNoteCount() + +if geo_count == 0 and note_count == 0: + print("警告:未找到符合条件的对象") + return # 提前退出 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L204-L218) + +### 批量处理对象 + +对于大量查询结果,建议使用循环批量处理,并记录处理进度。 + +```python +SSProcess.selectFilter() +count = SSProcess.getSelGeoCount() + +print(f"开始处理 {count} 个对象...") +for i in range(count): + # 获取对象属性 + obj_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_code = SSProcess.getSelGeoValue(i, "SSObj_Code") + + # 执行处理逻辑 + # SSProcess.setSelGeoValue(i, "SSObj_Name", f"新名称_{i}") + + # 每处理100个对象输出一次进度 + if (i + 1) % 100 == 0: + print(f"已处理 {i + 1}/{count} 个对象") + +print("处理完成") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L236-L250) + +### 同步到系统选择集 + +如果需要在地图上高亮显示查询结果,使用 `updateSysSelection()` 方法同步。 + +```python +# 执行查询 +SSProcess.selectFilter() + +# 同步到系统选择集(更新地图显示) +SSProcess.updateSysSelection(1) # mode=1 表示更新显示 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L156-L176) + +## 常见问题与故障排除 + +### 问题一:查询结果为空 + +**症状**:调用 `selectFilter()` 后,`getSelGeoCount()` 返回 0。 + +**可能原因与解决方案**: + +| 原因 | 检查方法 | 解决方案 | +|------|---------|---------| +| 条件设置过于严格 | 使用宽泛条件重新查询 | 放宽筛选条件,如使用 `LIKE` 代替 `==` | +| 条件名称拼写错误 | 检查 `SSObj_` 前缀是否正确 | 参考 [设置选择条件](12-she-zhi-xuan-ze-tiao-jian) 中的属性列表 | +| 数据源为空 | 检查当前地图是否加载了数据 | 确保地图已打开并加载了相应图层 | +| 多条件逻辑冲突 | 逐一测试每个条件 | 简化条件,逐步增加约束 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +### 问题二:查询结果不符合预期 + +**症状**:查询结果数量不为零,但结果对象不符合预期条件。 + +**排查步骤**: + +```python +# 1. 检查条件是否正确设置 +# 注意:条件是累积的,不会自动清除 +SSProcess.clearSelectCondition() + +# 2. 重新设置条件并验证 +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +print("条件已设置") + +# 3. 执行查询并检查结果 +SSProcess.selectFilter() + +# 4. 打印前几个对象的属性进行验证 +for i in range(min(5, SSProcess.getSelGeoCount())): + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + print(f"对象 {i} 类型: {obj_type}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +### 问题三:进度条不显示 + +**症状**:调用 `selectFilter()` 时没有看到进度条提示。 + +**解决方案**:检查 `enable_progress` 属性是否被禁用。 + +```python +# 确保启用进度条 +SSProcess.enable_progress = True + +# 执行查询 +SSProcess.selectFilter() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L44-L45) + +### 问题四:性能问题 + +**症状**:大规模数据查询执行缓慢。 + +**优化建议**: + +| 优化方向 | 具体措施 | 预期效果 | +|---------|---------|---------| +| 减少条件复杂度 | 避免使用多个模糊匹配条件 | 减少候选对象范围 | +| 使用精确匹配 | 优先使用 `==` 代替 `LIKE` | 加速索引查找 | +| 分批处理 | 对大数据集分页查询 | 降低单次查询压力 | +| 利用索引 | 确保查询字段建立了索引 | 显著提升查询速度 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +## 完整工作流示例 + +以下示例展示了一个包含错误处理、进度反馈和结果导出的完整工作流。 + +```python +import time + +def query_and_export(): + """执行查询并导出结果""" + + # 步骤1:重置选择集状态 + print("步骤1:重置选择集状态") + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + + # 步骤2:设置查询条件 + print("步骤2:设置查询条件") + SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") + SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") + SSProcess.setSelectCondition("SSObj_Area", ">", "50") + + # 步骤3:执行查询 + print("步骤3:执行过滤查询") + start_time = time.time() + SSProcess.selectFilter() + elapsed_time = time.time() - start_time + print(f"查询完成,耗时 {elapsed_time:.2f} 秒") + + # 步骤4:检查结果 + geo_count = SSProcess.getSelGeoCount() + note_count = SSProcess.getSelNoteCount() + + print(f"\n查询结果统计:") + print(f" 点线面对象数量: {geo_count}") + print(f" 注记对象数量: {note_count}") + + if geo_count == 0: + print("警告:未查询到地物对象") + return + + # 步骤5:处理查询结果 + print("\n步骤5:处理查询结果(显示前10个)") + print("-" * 60) + + fields = ["SSObj_ID", "SSObj_Code", "SSObj_LayerName", "SSObj_Area"] + + # 打印表头 + print(f"{'索引':<6} {fields[0]:<15} {fields[1]:<15} {fields[2]:<15} {fields[3]:<15}") + print("-" * 60) + + # 打印数据 + display_count = min(10, geo_count) + for i in range(display_count): + row_data = [] + for field in fields: + value = SSProcess.getSelGeoValue(i, field) + row_data.append(str(value)) + print(f"{i:<6} {row_data[0]:<15} {row_data[1]:<15} {row_data[2]:<15} {row_data[3]:<15}") + + if geo_count > display_count: + print(f"... 还有 {geo_count - display_count} 个对象未显示") + + # 步骤6:可选:同步到系统选择集 + # SSProcess.updateSysSelection(1) + + print("\n处理完成") + +# 执行函数 +query_and_export() +``` + +Sources: [PySSProcess.py](PySSProcess.py#L94-L138) + +## 与其他方法的协作关系 + +`selectFilter()` 方法在 SunvStation 脚本体系中处于核心位置,与其他选择集相关方法形成完整的数据查询链路。 + +```mermaid +flowchart TD + A[clearSelectCondition
清除条件] --> B[setSelectCondition
设置条件] + B --> C[selectFilter
执行查询] + C --> D[getSelGeoCount/getSelNoteCount
获取数量] + C --> E[getSelGeoValue
获取属性] + C --> F[updateSysSelection
同步显示] + + C --> G[clearSelection
清除结果] + G --> A + + style C fill:#e1f5ff,stroke:#01579b,stroke-width:3px +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L57-L154) + +**方法调用顺序**:通常的调用顺序为 `clearSelection()` → `clearSelectCondition()` → `setSelectCondition()`(可多次)→ `selectFilter()` → 结果处理 → `updateSysSelection()`(可选)。`clearSelection()` 也可以在处理完结果后调用,为下一次查询做准备。 + +Sources: [PySSProcess.py](PySSProcess.py#L94-L98) + +## 延伸阅读 + +完成本页面学习后,建议继续阅读以下相关页面以构建完整的选择集操作知识体系: + +- [遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang) - 学习如何高效遍历和处理查询结果 +- [获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi) - 深入了解属性访问的各种方法和技巧 +- [修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi) - 掌握批量修改选中对象属性的方法 +- [清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji) - 理解选择集的生命周期管理 \ No newline at end of file diff --git a/docs/content/14-bian-li-xuan-ze-ji-dui-xiang.md b/docs/content/14-bian-li-xuan-ze-ji-dui-xiang.md new file mode 100644 index 0000000..90e257d --- /dev/null +++ b/docs/content/14-bian-li-xuan-ze-ji-dui-xiang.md @@ -0,0 +1,364 @@ +遍历选择集对象是 SunvStation 自动化脚本中的核心操作,用于批量处理地理对象的属性和几何信息。通过遍历选择集,可以高效地读取、修改、验证或分析大量地理数据,实现数据质量检查、批量属性更新、统计分析等复杂业务逻辑。 + +## 选择集数据结构概述 + +SunvStation 的选择集由两个核心列表组成:`selGeoList` 存储点线面等几何对象,`selNoteList` 存储注记对象。这两个列表都是 `GeoBaseList` 类型,支持索引访问和迭代操作。选择集对象通过 `SSProcessManager` 类统一管理,该类通过 `SelectionMixin` 提供了完整的迭代 API。 + +```mermaid +flowchart TD + A[SSProcessManager] --> B[SelectionMixin] + B --> C[selGeoList
点线面对象列表] + B --> D[selNoteList
注记对象列表] + C --> E[GeoBaseList
索引访问] + D --> E + E --> F[getSelGeoValue
getSelNoteValue
getSelGeoPoint] + E --> G[setSelGeoValue
setSelNoteValue] + F --> H[属性读取循环] + G --> I[属性修改循环] +``` + +选择集对象通常通过两种方式构建:一是通过 `setSelectCondition` 和 `selectFilter` 基于条件过滤生成;二是通过 `updateSysSelection(0)` 从系统地图的选择集中同步。构建完成后,即可使用索引方式遍历处理每个对象。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L25-L46) [PySSProcess.py](PySSProcess.py#L53-L86) + +## 核心迭代 API 方法 + +遍历选择集依赖于以下关键方法,这些方法提供了从对象数量统计到具体属性访问的完整功能链。 + +| 方法名称 | 参数说明 | 返回值 | 功能描述 | +|---------|---------|--------|---------| +| `getSelGeoCount()` | 无 | int | 获取选择集中点线面对象的数量 | +| `getSelNoteCount()` | 无 | int | 获取选择集中注记对象的数量 | +| `getSelGeoValue(index, fieldName)` | index: 对象索引, fieldName: 属性名称 | str | 获取指定几何对象的属性值 | +| `getSelNoteValue(index, fieldName)` | index: 对象索引, fieldName: 属性名称 | str | 获取指定注记对象的属性值 | +| `setSelGeoValue(index, fieldName, value)` | index: 对象索引, fieldName: 属性名称, value: 属性值 | None | 设置指定几何对象的属性值 | +| `setSelNoteValue(index, fieldName, value)` | index: 对象索引, fieldName: 属性名称, value: 属性值 | None | 设置指定注记对象的属性值 | +| `getSelGeoPoint(index, pointIndex)` | index: 对象索引, pointIndex: 点索引 | Point | 获取指定几何对象的坐标点 | + +`index` 参数从 0 开始,最大值为对象数量减 1。属性名称包括以 `SSObj_` 开头的基本属性(如 `SSObj_Code`、`SSObj_Area`)、以 `<>` 括住的几何特性(如 ``)、以 `[]` 括住的扩展属性(如 `[建筑结构]`)。当索引越界时,`getSelGeoValue` 和 `getSelNoteValue` 返回空字符串,而 `setSelGeoValue` 和 `setSelNoteValue` 则直接返回不执行操作。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L204-L277) [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L279-L320) [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L322-L338) [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L340-L393) + +## 基本遍历流程 + +遍历选择集对象遵循标准的索引循环模式。首先获取对象总数,然后使用 `for` 循环遍历每个索引,在每个迭代中读取或修改对象属性。 + +```mermaid +flowchart LR + A[开始] --> B[获取对象数量
getSelGeoCount / getSelNoteCount] + B --> C[初始化循环索引 i = 0] + C --> D{i < 对象数量?} + D -->|是| E[访问对象属性
getSelGeoValue / getSelNoteValue] + E --> F[执行业务逻辑] + F --> G[i++] + G --> D + D -->|否| H[结束] +``` + +**读取属性的基本模式**: + +```python +from sunvpy import SSProcess + +# 遍历所有点线面对象 +count = SSProcess.getSelGeoCount() +for i in range(count): + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + layer = SSProcess.getSelGeoValue(i, "SSObj_LayerName") + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + print(f"对象 {i}: 编码={code}, 图层={layer}, 类型={obj_type}") + +# 遍历所有注记对象 +note_count = SSProcess.getSelNoteCount() +for i in range(note_count): + note_content = SSProcess.getSelNoteValue(i, "SSObj_FontString") + note_class = SSProcess.getSelNoteValue(i, "SSObj_FontClass") + print(f"注记 {i}: 内容={note_content}, 分类={note_class}") +``` + +**修改属性的基本模式**: + +```python +# 批量更新对象属性 +count = SSProcess.getSelGeoCount() +for i in range(count): + # 批量修改为新的颜色 + SSProcess.setSelGeoValue(i, "SSObj_Color", "255") # 红色 + # 批量更新图层名称 + SSProcess.setSelGeoValue(i, "SSObj_LayerName", "Updated_Layer") + # 批量修改对象名称 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"对象_{i}") +``` + +需要注意的是,修改属性后对象不会自动保存到数据库,需要调用保存方法才能持久化。对于 `SSObj_Code` 和 `SSObj_LayerName` 这两个特殊属性,系统会自动处理对象重新生成逻辑,确保数据一致性。 + +Sources: [PySSProcess.py](PySSProcess.py#L110-L138) [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L340-L393) + +## 完整工作流示例 + +下面的示例展示了从构建选择集到遍历处理再到保存结果的完整流程,包括条件过滤、属性读取、属性修改和批量保存。 + +```mermaid +flowchart TD + A[清除旧选择集
clearSelection] --> B[清除选择条件
clearSelectCondition] + B --> C[设置选择条件
setSelectCondition] + C --> D[执行过滤查询
selectFilter] + D --> E[遍历几何对象
for i in range
getSelGeoCount] + E --> F[读取属性
getSelGeoValue] + F --> G{是否满足条件?} + G -->|是| H[修改属性
setSelGeoValue] + G -->|否| I[跳过] + H --> J[添加到保存列表
addSelGeoToSaveGeoList] + I --> K{i < count?} + J --> K + K -->|是| E + K -->|否| L[批量保存到数据库
saveBufferObjToDatabase] + L --> M[更新系统显示
updateSysSelection] +``` + +**完整的批量处理脚本**: + +```python +from sunvpy import SSProcess + +# 步骤 1: 清理旧选择集和条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 步骤 2: 设置选择条件(选择长度大于100的对象) +SSProcess.setSelectCondition("SSObj_Length", ">", "100") + +# 步骤 3: 执行过滤查询 +SSProcess.selectFilter() +print(f"选择集包含 {SSProcess.getSelGeoCount()} 个对象") + +# 步骤 4: 定义要读取和修改的字段 +read_fields = [ + "SSObj_ID", "SSObj_Code", "SSObj_LayerName", "SSObj_Type", + "SSObj_Length", "SSObj_Area", "SSObj_Color" +] + +# 步骤 5: 遍历选择集,读取属性并批量修改 +count = SSProcess.getSelGeoCount() +for i in range(count): + # 读取对象属性 + obj_info = {} + for field in read_fields: + obj_info[field] = SSProcess.getSelGeoValue(i, field) + + # 业务逻辑:根据对象类型进行不同处理 + obj_type = obj_info["SSObj_Type"] + + if obj_type == "AREA": + # 面对象:修改颜色并添加到保存列表 + SSProcess.setSelGeoValue(i, "SSObj_Color", "16711680") # 蓝色 + SSProcess.addSelGeoToSaveGeoList(i) + print(f"面对象 {obj_info['SSObj_ID']} 面积: {obj_info['SSObj_Area']}") + + elif obj_type == "LINE": + # 线对象:修改线宽并添加到保存列表 + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "3") + SSProcess.addSelGeoToSaveGeoList(i) + print(f"线对象 {obj_info['SSObj_ID']} 长度: {obj_info['SSObj_Length']}") + +# 步骤 6: 批量保存修改到数据库 +SSProcess.saveBufferObjToDatabase() +print("已保存所有修改的对象") +``` + +**代码对比:修改前后**: + +| 场景 | 修改前代码 | 修改后代码 | 变化说明 | +|------|-----------|-----------|---------| +| 单个对象属性读取 | `SSProcess.getSelGeoValue(0, "SSObj_Code")` | `SSProcess.getSelGeoValue(i, "SSObj_Code")` | 使用循环变量索引 | +| 固定属性修改 | `SSProcess.setSelGeoValue(0, "SSObj_Color", "255")` | `SSProcess.setSelGeoValue(i, "SSObj_Color", "255")` | 批量修改所有对象 | +| 无保存操作 | 修改属性后不保存 | `SSProcess.addSelGeoToSaveGeoList(i)` 后 `saveBufferObjToDatabase()` | 添加保存机制 | + +Sources: [PySSProcess.py](PySSProcess.py#L94-L131) [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L566-L588) [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L131-L154) + +## 坐标点遍历 + +对于几何对象,经常需要访问其坐标点信息。`getSelGeoPoint` 方法可以获取对象指定索引的坐标点,结合 `getPointSize` 可以遍历对象的所有坐标点。 + +```python +# 遍历所有对象的坐标点 +count = SSProcess.getSelGeoCount() +for i in range(count): + geo_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + + # 只处理线对象和面对象 + if geo_type in ["LINE", "AREA"]: + # 获取对象引用以查询点数量(需要直接访问 selGeoList) + geo = SSProcess.selGeoList[i] + point_count = geo.getPointSize() + + print(f"对象 {i} 包含 {point_count} 个坐标点:") + + # 遍历所有坐标点 + for j in range(point_count): + point = SSProcess.getSelGeoPoint(i, j) + if point: + x = point.x() + y = point.y() + z = point.z() + print(f" 点 {j}: ({x:.2f}, {y:.2f}, {z:.2f})") +``` + +这种模式常用于数据质量检查(如检查线对象是否有重复点)、坐标转换、几何计算等场景。需要注意的是,访问 `selGeoList` 和 `getPointSize` 是直接操作 C++ 对象,效率较高,但需要确保索引在有效范围内。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L322-L338) + +## 扩展属性遍历 + +扩展属性是以 `[]` 括住的自定义属性,通常用于存储业务特定的扩展数据。遍历扩展属性需要先获取对象的字段列表,然后逐个读取或修改。 + +```python +# 遍历对象的扩展属性 +count = SSProcess.getSelGeoCount() +for i in range(count): + # 获取对象的扩展属性字段和值 + # 注意:这需要直接访问 curSelGeoFields 和 curSelGeoValues + geo = SSProcess.selGeoList[i] + SSProcess.curSelGeoFields.clear() + SSProcess.curSelGeoValues.clear() + SSProcess.map.getExtentAttr(geo, SSProcess.curSelGeoFields, SSProcess.curSelGeoValues) + + print(f"对象 {i} 的扩展属性:") + + # 遍历所有扩展属性 + for j in range(SSProcess.curSelGeoFields.size()): + field_name = SSProcess.curSelGeoFields[j] + field_value = SSProcess.curSelGeoValues[j] + print(f" [{field_name}] = {field_value}") + + # 读取特定扩展属性(使用标准 API) + structure = SSProcess.getSelGeoValue(i, "[建筑结构]") + floors = SSProcess.getSelGeoValue(i, "[楼层数]") + + if structure and floors: + # 修改扩展属性 + SSProcess.setSelGeoValue(i, "[建筑结构], [楼层数]", "砖混, 6") + SSProcess.addSelGeoToSaveGeoList(i) +``` + +扩展属性支持批量读取和写入,使用逗号分隔多个字段名可以一次性获取或设置多个属性值。这种方式特别适合属性较多的业务对象,可以减少函数调用次数,提高处理效率。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L252-L274) [ObjBaseAttr.py](ObjBaseAttr.py#L13-L36) + +## 最佳实践与注意事项 + +在遍历选择集对象时,遵循以下最佳实践可以提高代码质量和执行效率: + +**性能优化建议**: + +| 场景 | 优化建议 | 效果说明 | +|------|---------|---------| +| 大批量对象处理 | 使用 `setSelGeoValue(i, -1, fieldName, value)` 一次性修改所有对象 | 减少 90% 的 API 调用次数 | +| 频繁属性访问 | 缓存常用属性值或字段索引 | 减少重复的字符串查找开销 | +| 进度反馈 | 启用进度条显示处理进度 | 提升用户体验,便于监控长时间任务 | + +```python +# 优化示例:一次性修改所有对象的属性 +SSProcess.setSelGeoValue(-1, "SSObj_Color", "255") # index=-1 表示所有对象 +SSProcess.setSelGeoValue(-1, "SSObj_LayerName", "New_Layer") + +# 进度条反馈 +count = SSProcess.getSelGeoCount() +SSProcess.startProgress("正在处理选择集...", count) +for i in range(count): + # 处理逻辑 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"对象_{i}") + SSProcess.stepProgress(f"已处理 {i+1}/{count} 个对象") +SSProcess.closeProgress() +``` + +**常见陷阱与解决方案**: + +| 陷阱类型 | 问题描述 | 解决方案 | +|---------|---------|---------| +| 索引越界 | 使用超出范围的对象索引 | 在循环中使用 `range(getSelGeoCount())` 确保索引有效 | +| 未保存修改 | 修改属性后未调用保存方法 | 使用 `addSelGeoToSaveGeoList` 添加到保存列表后调用 `saveBufferObjToDatabase` | +| 属性名拼写错误 | 使用错误的属性名导致读取失败 | 参考 `setSelectCondition` 文档中的完整属性名列表 | +| 忽略注记对象 | 只处理 `selGeoList` 而忽略 `selNoteList` | 同时遍历 `selGeoList` 和 `selNoteList` 确保完整性 | + +**错误处理示例**: + +```python +count = SSProcess.getSelGeoCount() +for i in range(count): + try: + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + if not code: + print(f"警告: 对象 {i} 的编码为空,跳过处理") + continue + + # 业务逻辑 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"对象_{code}") + SSProcess.addSelGeoToSaveGeoList(i) + + except Exception as e: + print(f"错误: 处理对象 {i} 时发生异常: {e}") + # 继续处理下一个对象,不中断整个流程 + continue +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L340-L393) [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L356-L360) [ssprocess_mixins/progress_mixin.py](ssprocess_mixins/progress_mixin.py) + +## 应用场景示例 + +**数据质量检查**: + +```python +# 检查所有线对象是否有最小长度 +count = SSProcess.getSelGeoCount() +error_count = 0 + +for i in range(count): + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + if obj_type == "LINE": + length = float(SSProcess.getSelGeoValue(i, "SSObj_Length")) + if length < 5.0: # 最小长度阈值 + obj_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + print(f"错误: 线对象 {obj_id} 长度过短 ({length:.2f} 米)") + error_count += 1 + +print(f"检查完成,发现 {error_count} 个问题对象") +``` + +**批量属性标准化**: + +```python +# 将所有建筑对象的扩展属性标准化 +count = SSProcess.getSelGeoCount() +for i in range(count): + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + if obj_type == "AREA": + structure = SSProcess.getSelGeoValue(i, "[建筑结构]") + floors = SSProcess.getSelGeoValue(i, "[楼层数]") + + # 标准化建筑结构名称 + structure_map = { + "砖混": "砖混结构", + "框架": "框架结构", + "钢结构": "钢结构" + } + + if structure in structure_map: + SSProcess.setSelGeoValue(i, "[建筑结构]", structure_map[structure]) + SSProcess.addSelGeoToSaveGeoList(i) + +SSProcess.saveBufferObjToDatabase() +``` + +Sources: [PySSProcess.py](PySSProcess.py#L93-L116) + +## 下一步学习 + +掌握了选择集遍历后,建议继续学习以下相关内容: + +- **[获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi)**:深入了解各类属性的访问方式和特殊属性的处理 +- **[修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi)**:掌握属性修改的高级技巧和批量操作 +- **[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)**:了解缓存机制如何优化批量操作性能 +- **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**:学习将修改持久化到数据库的完整流程 + +这些主题将帮助您构建更加完整和高效的地理数据处理自动化解决方案。 \ No newline at end of file diff --git a/docs/content/15-huo-qu-di-wu-shu-xing-zhi.md b/docs/content/15-huo-qu-di-wu-shu-xing-zhi.md new file mode 100644 index 0000000..7f81d70 --- /dev/null +++ b/docs/content/15-huo-qu-di-wu-shu-xing-zhi.md @@ -0,0 +1,818 @@ +本文档详细说明如何在 SunvStation Python 脚本中读取地物对象的属性值,涵盖基本属性、几何特性和扩展属性三种类型的属性访问方式。通过掌握这些方法,您可以高效地获取和分析地理对象的各类信息,为后续的数据处理、质量检查和统计分析奠定基础。 + +## 属性类型与命名规则 + +SunvStation 系统中,地物属性根据来源和用途分为三类,每类属性使用特定的前缀标识符进行区分。理解这些分类和命名规则是正确读取属性的前提。 + +```mermaid +flowchart TD + A[地物属性] --> B[基本属性 SSObj_] + A --> C[几何特性 #60; #62;] + A --> D[扩展属性 #91; #93;] + + B --> B1[对象标识
SSObj_ID, SSObj_Code] + B --> B2[外观属性
SSObj_Color, SSObj_LineType, SSObj_LineWidth] + B --> B3[名称属性
SSObj_Name, SSObj_Byname, SSObj_LayerName] + B --> B4[几何参量
SSObj_Area, SSObj_Length, SSObj_PointCount] + B --> B5[时间属性
SSObj_CreateTime, SSObj_ModifyTime] + B --> B6[坐标信息
SSObj_X, SSObj_Y, SSObj_Z, SSObj_PointName] + B --> B7[注记属性
SSObj_FontString, SSObj_FontHeight, SSObj_FontWidth] + + C --> C1[拓扑判断
#60;Overlap#62;, #60;Close#62;] + C --> C2[几何判断
#60;Convex#62;, #60;SelfIntersect#62;] + + D --> D1[业务属性
#91;JG#93;, #91;CS#93;, #91;建筑结构#93;] + D --> D2[自定义属性
#91;自定义字段1#93;, #91;自定义字段2#93;] +``` + +### 基本属性 + +以 `SSObj_` 开头,表示系统内置的地物基本属性,包括对象标识、外观、几何参量、时间戳等。这些属性直接存储在地理对象内部,访问效率最高。 + +| 属性名称 | 属性说明 | 数据类型 | 适用对象类型 | +|---------|---------|---------|------------| +| `SSObj_ID` | 对象唯一标识 | 整数 | 所有类型 | +| `SSObj_Code` | 地物编码 | 整数 | 所有类型 | +| `SSObj_LayerName` | 所在图层名 | 字符串 | 所有类型 | +| `SSObj_Type` | 对象类型 | 字符串(POINT/LINE/AREA/NOTE) | 所有类型 | +| `SSObj_Color` | 颜色值 | 整数 | 所有类型 | +| `SSObj_LineType` | 线型 | 整数 | LINE/AREA | +| `SSObj_LineWidth` | 线宽 | 整数 | LINE/AREA | +| `SSObj_Name` | 对象名称 | 字符串 | 所有类型 | +| `SSObj_Byname` | 对象别名 | 字符串 | 所有类型 | +| `SSObj_Angle` | 旋转角度 | 浮点数 | 所有类型 | +| `SSObj_ScaleX` | X 方向缩放 | 浮点数 | 所有类型 | +| `SSObj_ScaleY` | Y 方向缩放 | 浮点数 | 所有类型 | +| `SSObj_Area` | 面积 | 浮点数 | AREA | +| `SSObj_Length` | 周长/长度 | 浮点数 | LINE/AREA | +| `SSObj_3DLength` | 三维长度 | 浮点数 | LINE/AREA | +| `SSObj_PointCount` | 坐标点数量 | 整数 | POINT/LINE/AREA | +| `SSObj_X` | X 坐标 | 浮点数 | POINT/线对象指定点 | +| `SSObj_Y` | Y 坐标 | 浮点数 | POINT/线对象指定点 | +| `SSObj_Z` | Z 坐标 | 浮点数 | POINT/线对象指定点 | +| `SSObj_PointName` | 点名称 | 字符串 | POINT/线对象指定点 | +| `SSObj_PointType` | 点类型 | 整数 | POINT/线对象指定点 | +| `SSObj_CreateTime` | 创建时间 | 字符串(格式:YYYY-MM-DD HH:MM:SS) | 所有类型 | +| `SSObj_ModifyTime` | 修改时间 | 字符串(格式:YYYY-MM-DD HH:MM:SS) | 所有类型 | +| `SSObj_DataMark` | 数据标识 | 字符串 | 所有类型 | + +**注记对象专用属性**: + +| 属性名称 | 属性说明 | 数据类型 | +|---------|---------|---------| +| `SSObj_FontString` | 注记内容 | 字符串 | +| `SSObj_FontStringCount` | 注记字符数量 | 整数 | +| `SSObj_FontWidth` | 字宽 | 浮点数 | +| `SSObj_FontHeight` | 字高 | 浮点数 | +| `SSObj_FontName` | 字体名称 | 字符串 | +| `SSObj_FontClass` | 注记分类号 | 整数 | +| `SSObj_FontAlignment` | 对齐方式 | 整数 | +| `SSObj_FontPosType` | 位置类型 | 整数 | +| `SSObj_FontDirection` | 字方向 | 整数 | +| `SSObj_FontWordAngle` | 字角度 | 浮点数 | +| `SSObj_FontStringAngle` | 串角度 | 浮点数 | +| `SSObj_FontWeight` | 字重 | 整数 | +| `SSObj_FontItalicAngle` | 倾斜角度 | 浮点数 | +| `SSObj_FontDownAngle` | 下沉角度 | 浮点数 | +| `SSObj_FontUnderLine` | 下划线 | 整数(0/1) | +| `SSObj_FontInterval` | 字间隔 | 浮点数 | +| `SSObj_FontRealHeight` | 实际高度 | 浮点数 | +| `SSObj_FontRealLength` | 实际长度 | 浮点数 | + +### 几何特性 + +用尖括号 `<>` 括住的属性,表示对象的几何拓扑特性,如是否重叠、是否封闭、是否凸多边形等。这些属性不是存储值,而是通过几何计算实时得到的判断结果。 + +| 属性名称 | 属性说明 | 返回值类型 | +|---------|---------|-----------| +| `` | 对象是否重叠 | 布尔值(True/False) | +| `` | 对象是否封闭 | 布尔值(True/False) | +| `` | 对象是否为凸多边形 | 布尔值(True/False) | +| `` | 对象是否自相交 | 布尔值(True/False) | + +### 扩展属性 + +用方括号 `[]` 括住的属性,表示用户自定义的扩展属性,存储在对象的扩展属性表中。这些属性通常用于存储业务相关的自定义字段,如建筑结构、层数等。 + +| 属性名称 | 属性说明 | 数据类型 | +|---------|---------|---------| +| `[JG]` | 建筑结构 | 字符串 | +| `[CS]` | 建筑层数 | 字符串/整数 | +| `[自定义字段]` | 用户自定义字段 | 根据定义 | + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L7-L85) + +## 核心 API 方法 + +获取地物属性值的核心方法是 `getSelGeoValue()` 和 `getSelNoteValue()`,这两个方法分别用于获取几何对象和注记对象的属性值。 + +### getSelGeoValue 方法 + +```python +def getSelGeoValue(self, index: int, fieldName: str) -> str +``` + +**参数说明**: + +| 参数 | 类型 | 说明 | +|-----|------|------| +| index | int | 地物对象在选择集中的索引(从 0 开始) | +| fieldName | str | 属性名称,支持基本属性、几何特性和扩展属性 | + +**返回值**: +- 类型:str +- 说明:指定地物对象的属性值,如果属性不存在或索引越界则返回空字符串 + +**使用示例**: + +```python +from sunvpy import SSProcess + +# 获取第 0 个对象的编码 +code = SSProcess.getSelGeoValue(0, "SSObj_Code") +print(f"地物编码: {code}") + +# 获取第 0 个对象的面积 +area = SSProcess.getSelGeoValue(0, "SSObj_Area") +print(f"地物面积: {area}") + +# 获取第 0 个对象的扩展属性 [JG] +structure = SSProcess.getSelGeoValue(0, "[JG]") +print(f"建筑结构: {structure}") +``` + +**内部实现逻辑**: + +```mermaid +flowchart TD + A[getSelGeoValue 调用] --> B{索引越界?} + B -->|是| C[返回空字符串] + B -->|否| D{字段名以 [ 开头?} + D -->|是| E[扩展属性路径] + D -->|否| F[基本属性路径] + + E --> E1[map.getExtentAttr
获取扩展属性列表] + E1 --> E2{包含逗号?} + E2 -->|是| E3[分割多个字段名] + E2 -->|否| E4[查找单个字段] + E3 --> E5[查找并拼接多个值] + E4 --> E5 + E5 --> E6[返回属性值] + + F --> F1[objBaseAttr.getGeoValue
处理基本属性] + F1 --> F2{对象类型判断} + F2 -->|注记对象| F3[读取注记专用属性] + F2 -->|其他对象| F4[读取通用属性] + F3 --> F5[返回属性值] + F4 --> F5 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L164-L202) + +### getSelNoteValue 方法 + +```python +def getSelNoteValue(self, index: int, fieldName: str) -> str +``` + +**参数说明**: + +| 参数 | 类型 | 说明 | +|-----|------|------| +| index | int | 注记对象在选择集中的索引(从 0 开始) | +| fieldName | str | 属性名称,支持基本属性、几何特性和扩展属性 | + +**返回值**: +- 类型:str +- 说明:指定注记对象的属性值 + +**使用示例**: + +```python +from sunvpy import SSProcess + +# 获取第 0 个注记对象的字体内容 +font_string = SSProcess.getSelNoteValue(0, "SSObj_FontString") +print(f"注记内容: {font_string}") + +# 获取第 0 个注记对象的字体高度 +font_height = SSProcess.getSelNoteValue(0, "SSObj_FontHeight") +print(f"字体高度: {font_height}") + +# 获取第 0 个注记对象的字体分类号 +font_class = SSProcess.getSelNoteValue(0, "SSObj_FontClass") +print(f"注记分类号: {font_class}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L204-L241) + +## 属性获取流程 + +获取地物属性值的完整流程包括构建选择集、遍历对象、读取属性和输出结果四个阶段。下图展示了这个过程的完整数据流: + +```mermaid +flowchart LR + A[初始化 SSProcess] --> B[清理选择集
clearSelection] + B --> C[清理选择条件
clearSelectCondition] + C --> D[设置选择条件
setSelectCondition] + D --> E[执行过滤查询
selectFilter] + E --> F[获取对象数量
getSelGeoCount] + F --> G[遍历选择集] + G --> H[读取属性值
getSelGeoValue] + H --> I{是否还有对象?} + I -->|是| G + I -->|否| J[处理完成] +``` + +## 基本属性读取示例 + +### 示例 1:读取单个对象的多个属性 + +```python +from sunvpy import SSProcess + +# 假设选择集中已有对象 +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +SSProcess.selectFilter() + +# 定义要读取的属性列表 +fields = [ + "SSObj_ID", "SSObj_Code", "SSObj_LayerName", "SSObj_Type", + "SSObj_Color", "SSObj_LineType", "SSObj_LineWidth", + "SSObj_Name", "SSObj_Byname" +] + +# 读取第 0 个对象的属性 +print("=" * 50) +print("对象详细信息") +print("=" * 50) +for field in fields: + value = SSProcess.getSelGeoValue(0, field) + print(f"{field:20s}: {value}") +``` + +**输出示例**: + +``` +================================================== +对象详细信息 +================================================== +SSObj_ID : 1001 +SSObj_Code : 3103013 +SSObj_LayerName : Default_A +SSObj_Type : LINE +SSObj_Color : 16777215 +SSObj_LineType : 1 +SSObj_LineWidth : 2 +SSObj_Name : 道路1 +SSObj_Byname : 主路 +``` + +Sources: [PySSProcess.py](PySSProcess.py#L110-L138) + +### 示例 2:批量读取所有对象的核心属性 + +```python +from sunvpy import SSProcess + +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.selectFilter() + +# 获取对象数量 +count = SSProcess.getSelGeoCount() +print(f"选择集中有 {count} 个面对象\n") + +# 定义要读取的核心属性 +core_fields = ["SSObj_ID", "SSObj_Code", "SSObj_Area", "SSObj_Length"] + +# 遍历所有对象并读取属性 +for i in range(count): + print(f"对象 {i}:") + for field in core_fields: + value = SSProcess.getSelGeoValue(i, field) + print(f" {field}: {value}") + print("-" * 30) +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L152-L162) + +## 坐标点属性读取 + +对于点、线、面对象,可以使用带参数的属性名来读取特定坐标点的信息。参数放在属性名后的括号中,如 `SSObj_X(0)` 表示第一个点的 X 坐标。 + +```python +from sunvpy import SSProcess + +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "LINE") +SSProcess.selectFilter() + +# 获取第 0 个线对象 +count = SSProcess.getSelGeoCount() +if count > 0: + # 获取点数 + point_count = SSProcess.getSelGeoValue(0, "SSObj_PointCount") + print(f"该线对象包含 {point_count} 个坐标点\n") + + # 遍历所有坐标点 + for j in range(int(point_count)): + x = SSProcess.getSelGeoValue(0, f"SSObj_X({j})") + y = SSProcess.getSelGeoValue(0, f"SSObj_Y({j})") + z = SSProcess.getSelGeoValue(0, f"SSObj_Z({j})") + point_name = SSProcess.getSelGeoValue(0, f"SSObj_PointName({j})") + point_type = SSProcess.getSelGeoValue(0, f"SSObj_PointType({j})") + + print(f"点 {j}: X={x}, Y={y}, Z={z}, 名称={point_name}, 类型={point_type}") +``` + +**输出示例**: + +``` +该线对象包含 5 个坐标点 + +点 0: X=12345.67, Y=54321.09, Z=0.00, 名称=起点, 类型=1 +点 1: X=12400.00, Y=54380.00, Z=0.00, 名称=, 类型=0 +点 2: X=12450.50, Y=54420.30, Z=0.00, 名称=, 类型=0 +点 3: X=12500.00, Y=54480.00, Z=0.00, 名称=, 类型=0 +点 4: X=12550.75, Y=54530.60, Z=0.00, 名称=终点, 类型=2 +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L329-L363) + +## 几何特性读取示例 + +几何特性属性用于判断对象的拓扑状态,通常用于数据质量检查。 + +```python +from sunvpy import SSProcess + +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.selectFilter() + +# 获取对象数量 +count = SSProcess.getSelGeoCount() +print(f"面对象几何特性检查\n") + +# 遍历所有面对象 +for i in range(count): + obj_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_code = SSProcess.getSelGeoValue(i, "SSObj_Code") + + # 读取几何特性 + is_closed = SSProcess.getSelGeoValue(i, "") + is_overlap = SSProcess.getSelGeoValue(i, "") + is_convex = SSProcess.getSelGeoValue(i, "") + is_self_intersect = SSProcess.getSelGeoValue(i, "") + + print(f"对象 ID={obj_id}, Code={obj_code}:") + print(f" 是否封闭: {is_closed}") + print(f" 是否重叠: {is_overlap}") + print(f" 是否凸多边形: {is_convex}") + print(f" 是否自相交: {is_self_intersect}") + + # 检查是否有问题 + issues = [] + if is_closed == "False": + issues.append("未封闭") + if is_overlap == "True": + issues.append("存在重叠") + if is_self_intersect == "True": + issues.append("存在自相交") + + if issues: + print(f" ⚠️ 发现问题: {', '.join(issues)}") + print("-" * 40) +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L52-L110) + +## 扩展属性读取示例 + +扩展属性使用方括号 `[]` 括住属性名,支持读取单个属性或多个属性。 + +### 读取单个扩展属性 + +```python +from sunvpy import SSProcess + +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.selectFilter() + +# 读取第一个对象的扩展属性 +building_structure = SSProcess.getSelGeoValue(0, "[JG]") +building_floors = SSProcess.getSelGeoValue(0, "[CS]") +custom_field = SSProcess.getSelGeoValue(0, "[建筑用途]") + +print(f"建筑结构: {building_structure}") +print(f"建筑层数: {building_floors}") +print(f"建筑用途: {custom_field}") +``` + +### 读取多个扩展属性 + +使用逗号分隔多个属性名,可以一次性读取多个扩展属性,返回值会用逗号拼接。 + +```python +from sunvpy import SSProcess + +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") +SSProcess.selectFilter() + +# 一次性读取多个扩展属性 +combined_value = SSProcess.getSelGeoValue(0, "[JG],[CS]") +values = combined_value.split(',') + +print(f"建筑结构: {values[0] if len(values) > 0 else ''}") +print(f"建筑层数: {values[1] if len(values) > 1 else ''}") +``` + +### 获取对象的完整扩展属性列表 + +如果不确定对象有哪些扩展属性,可以先获取完整的扩展属性列表: + +```python +from sunvpy import SSProcess + +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.selectFilter() + +# 获取第一个对象的扩展属性字段和值 +SSProcess.curSelGeoFields.clear() +SSProcess.curSelGeoValues.clear() + +# 直接访问地物对象获取扩展属性 +geo = SSProcess.selGeoList[0] +SSProcess.map.getExtentAttr(geo, SSProcess.curSelGeoFields, SSProcess.curSelGeoValues) + +# 打印所有扩展属性 +print("对象的扩展属性列表:") +for i in range(SSProcess.curSelGeoFields.size()): + field = SSProcess.curSelGeoFields[i] + value = SSProcess.curSelGeoValues[i] + print(f" [{field}]: {value}") +``` + +**输出示例**: + +``` +对象的扩展属性列表: + [JG]: 砖混结构 + [CS]: 6 + [建筑用途]: 住宅 + [竣工年份]: 2020 + [建设单位]: XX公司 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L164-L186) + +## 注记对象属性读取 + +注记对象(NOTE 类型)除了通用属性外,还有许多专用的字体和排版属性。 + +```python +from sunvpy import SSProcess + +# 清理并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Type", "==", "NOTE") +SSProcess.selectFilter() + +# 获取注记对象数量 +count = SSProcess.getSelNoteCount() +print(f"选择集中有 {count} 个注记对象\n") + +# 定义注记专用属性列表 +note_fields = [ + "SSObj_FontString", "SSObj_FontStringCount", + "SSObj_FontWidth", "SSObj_FontHeight", "SSObj_FontName", + "SSObj_FontClass", "SSObj_FontAlignment", "SSObj_FontPosType", + "SSObj_FontWordAngle", "SSObj_FontStringAngle", + "SSObj_FontWeight", "SSObj_FontUnderLine", "SSObj_FontInterval" +] + +# 遍历所有注记对象 +for i in range(min(count, 5)): # 最多显示前 5 个 + print(f"注记对象 {i}:") + for field in note_fields: + value = SSProcess.getSelNoteValue(i, field) + print(f" {field:20s}: {value}") + print("-" * 50) +``` + +**输出示例**: + +``` +选择集中有 3 个注记对象 + +注记对象 0: + SSObj_FontString : 测区边界 + SSObj_FontStringCount : 4 + SSObj_FontWidth : 15.00 + SSObj_FontHeight : 20.00 + SSObj_FontName : 宋体 + SSObj_FontClass : 1 + SSObj_FontAlignment : 0 + SSObj_FontPosType : 0 + SSObj_FontWordAngle : 0.00 + SSObj_FontStringAngle : 0.00 + SSObj_FontWeight : 400 + SSObj_FontUnderLine : 0 + SSObj_FontInterval : 1.00 +-------------------------------------------------- +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L147-L207) + +## 综合应用示例 + +下面的示例展示了如何结合基本属性、几何特性和扩展属性,实现一个完整的属性查询和分析功能。 + +```python +from sunvpy import SSProcess + +def analyze_geospatial_objects(): + """分析地物对象的综合属性""" + + # 步骤 1: 清理并设置选择条件 + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "AREA") + SSProcess.selectFilter() + + # 步骤 2: 获取对象数量 + count = SSProcess.getSelGeoCount() + print(f"分析 {count} 个面对象的综合属性\n") + + # 步骤 3: 统计信息 + total_area = 0.0 + total_length = 0.0 + problem_count = 0 + + # 步骤 4: 遍历所有对象 + for i in range(count): + # 读取基本属性 + obj_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_code = SSProcess.getSelGeoValue(i, "SSObj_Code") + obj_layer = SSProcess.getSelGeoValue(i, "SSObj_LayerName") + obj_area = float(SSProcess.getSelGeoValue(i, "SSObj_Area")) + obj_length = float(SSProcess.getSelGeoValue(i, "SSObj_Length")) + obj_create_time = SSProcess.getSelGeoValue(i, "SSObj_CreateTime") + obj_modify_time = SSProcess.getSelGeoValue(i, "SSObj_ModifyTime") + + # 累计面积和长度 + total_area += obj_area + total_length += obj_length + + # 读取几何特性 + is_closed = SSProcess.getSelGeoValue(i, "") + is_overlap = SSProcess.getSelGeoValue(i, "") + + # 读取扩展属性 + building_structure = SSProcess.getSelGeoValue(i, "[JG]") + building_floors = SSProcess.getSelGeoValue(i, "[CS]") + + # 检查几何问题 + has_problem = False + problems = [] + + if is_closed == "False": + problems.append("未封闭") + has_problem = True + + if is_overlap == "True": + problems.append("存在重叠") + has_problem = True + + if has_problem: + problem_count += 1 + print(f"⚠️ 对象 {obj_id} (Code={obj_code}) 发现问题: {', '.join(problems)}") + + # 输出对象详细信息 + print(f"对象 ID={obj_id}:") + print(f" 图层: {obj_layer}") + print(f" 面积: {obj_area:.2f} 平方米") + print(f" 周长: {obj_length:.2f} 米") + print(f" 建筑结构: {building_structure if building_structure else '未知'}") + print(f" 建筑层数: {building_floors if building_floors else '未知'}") + print(f" 创建时间: {obj_create_time}") + print(f" 修改时间: {obj_modify_time}") + print(f" 几何状态: {'封闭' if is_closed == 'True' else '未封闭'}, {'重叠' if is_overlap == 'True' else '无重叠'}") + print("-" * 60) + + # 步骤 5: 输出统计摘要 + print("\n" + "=" * 60) + print("统计摘要") + print("=" * 60) + print(f"对象总数: {count}") + print(f"总面积: {total_area:.2f} 平方米") + print(f"平均面积: {total_area/count if count > 0 else 0:.2f} 平方米") + print(f"总周长: {total_length:.2f} 米") + print(f"平均周长: {total_length/count if count > 0 else 0:.2f} 米") + print(f"问题对象数: {problem_count} ({problem_count/count*100 if count > 0 else 0:.1f}%)") + print("=" * 60) + +# 执行分析 +analyze_geospatial_objects() +``` + +Sources: [PySSProcess.py](PySSProcess.py#L110-L138) + +## 常见问题与解决方案 + +### 问题 1:属性值返回空字符串 + +**现象**:调用 `getSelGeoValue()` 后返回空字符串 + +**可能原因**: +1. 索引越界:指定的索引超出了选择集范围 +2. 属性名不存在:属性名拼写错误或该对象不支持此属性 +3. 属性不适用:尝试读取不适用的属性(如点对象的面积) + +**解决方案**: + +```python +from sunvpy import SSProcess + +# 检查索引是否有效 +count = SSProcess.getSelGeoCount() +index = 0 + +if index >= 0 and index < count: + value = SSProcess.getSelGeoValue(index, "SSObj_Code") + if value: + print(f"属性值: {value}") + else: + print("属性值为空,可能属性不存在") +else: + print(f"索引 {index} 越界,选择集中只有 {count} 个对象") +``` + +### 问题 2:扩展属性无法读取 + +**现象**:使用 `[扩展属性名]` 格式读取时返回空值 + +**可能原因**: +1. 扩展属性名称拼写错误 +2. 当前对象没有该扩展属性 +3. 扩展属性未在数据源中定义 + +**解决方案**: + +```python +from sunvpy import SSProcess + +# 方法 1: 先查询对象有哪些扩展属性 +SSProcess.curSelGeoFields.clear() +SSProcess.curSelGeoValues.clear() +geo = SSProcess.selGeoList[0] if SSProcess.getSelGeoCount() > 0 else None + +if geo: + SSProcess.map.getExtentAttr(geo, SSProcess.curSelGeoFields, SSProcess.curSelGeoValues) + print("可用的扩展属性:") + for i in range(SSProcess.curSelGeoFields.size()): + print(f" {SSProcess.curSelGeoFields[i]}") + +# 方法 2: 使用正确的属性名读取 +structure = SSProcess.getSelGeoValue(0, "[JG]") # 确保方括号和名称正确 +``` + +### 问题 3:坐标点属性读取失败 + +**现象**:使用 `SSObj_X(0)` 等格式读取坐标点时返回空值 + +**可能原因**: +1. 对象点数不足:指定的点索引超出了对象的实际点数 +2. 对象类型不支持:注记对象不支持坐标点属性 + +**解决方案**: + +```python +from sunvpy import SSProcess + +# 先获取对象的点数 +point_count = SSProcess.getSelGeoValue(0, "SSObj_PointCount") +obj_type = SSProcess.getSelGeoValue(0, "SSObj_Type") + +if obj_type in ["POINT", "LINE", "AREA"]: + if point_count: + for j in range(int(point_count)): + x = SSProcess.getSelGeoValue(0, f"SSObj_X({j})") + y = SSProcess.getSelGeoValue(0, f"SSObj_Y({j})") + print(f"点 {j}: ({x}, {y})") + else: + print("对象没有坐标点") +else: + print("注记对象不支持坐标点属性") +``` + +### 问题 4:几何特性返回值不是预期的布尔值 + +**现象**:读取 `` 等几何特性时,返回值不是 "True" 或 "False" + +**可能原因**:几何特性的返回值格式可能与预期不同 + +**解决方案**: + +```python +from sunvpy import SSProcess + +# 读取几何特性并处理不同格式 +is_closed = SSProcess.getSelGeoValue(0, "") + +# 处理不同的返回值格式 +if is_closed in ["True", "true", "1", "是"]: + print("对象是封闭的") +elif is_closed in ["False", "false", "0", "否", ""]: + print("对象未封闭") +else: + print(f"未知的状态值: {is_closed}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L164-L241) + +## 属性读取性能优化建议 + +在处理大量地物对象时,合理的代码组织可以显著提高属性读取效率。 + +### 建议 1:批量读取多个属性 + +```python +# 不推荐:多次调用 getSelGeoValue +code = SSProcess.getSelGeoValue(i, "SSObj_Code") +name = SSProcess.getSelGeoValue(i, "SSObj_Name") +layer = SSProcess.getSelGeoValue(i, "SSObj_LayerName") + +# 推荐:使用列表批量定义属性,然后循环读取 +fields = ["SSObj_Code", "SSObj_Name", "SSObj_LayerName"] +for field in fields: + value = SSProcess.getSelGeoValue(i, field) + print(f"{field}: {value}") +``` + +### 建议 2:避免重复读取 + +```python +# 不推荐:在循环中重复读取相同的属性 +for i in range(count): + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + if obj_type == "AREA": + area = SSProcess.getSelGeoValue(i, "SSObj_Area") # 第一次读取 + length = SSProcess.getSelGeoValue(i, "SSObj_Length") + # ... 其他处理 + print(f"面积: {SSProcess.getSelGeoValue(i, 'SSObj_Area')}") # 重复读取 + +# 推荐:缓存已读取的属性值 +for i in range(count): + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + if obj_type == "AREA": + area = SSProcess.getSelGeoValue(i, "SSObj_Area") + length = SSProcess.getSelGeoValue(i, "SSObj_Length") + # ... 其他处理 + print(f"面积: {area}") # 使用缓存的值 +``` + +### 建议 3:使用字典存储对象属性 + +```python +# 推荐:使用字典存储每个对象的属性 +for i in range(count): + obj_attrs = {} + fields = ["SSObj_ID", "SSObj_Code", "SSObj_Name", "SSObj_Area"] + + for field in fields: + obj_attrs[field] = SSProcess.getSelGeoValue(i, field) + + # 使用字典中的值进行处理 + print(f"对象 {obj_attrs['SSObj_ID']}: {obj_attrs['SSObj_Name']}, 面积={obj_attrs['SSObj_Area']}") +``` + +## 下一步学习 + +掌握了属性读取方法后,您可能对以下主题感兴趣: + +- **修改地物属性值**:学习如何使用 `setSelGeoValue()` 和 `setSelNoteValue()` 方法修改地物属性,参见 [修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi) +- **地物基本属性详解**:深入了解各个基本属性的含义和取值范围,参见 [地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie) +- **扩展属性与自定义属性**:学习如何定义和使用扩展属性,参见 [扩展属性与自定义属性](18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing) +- **遍历选择集对象**:了解更多关于选择集遍历的高级技巧和最佳实践,参见 [遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang) + +通过这些文档的结合学习,您将能够全面掌握 SunvStation 地物属性的管理技巧,构建更强大和高效的地理数据处理脚本。 \ No newline at end of file diff --git a/docs/content/16-xiu-gai-di-wu-shu-xing-zhi.md b/docs/content/16-xiu-gai-di-wu-shu-xing-zhi.md new file mode 100644 index 0000000..ae55fba --- /dev/null +++ b/docs/content/16-xiu-gai-di-wu-shu-xing-zhi.md @@ -0,0 +1,427 @@ +修改地物属性值是 SunvStation Python API 中最核心的数据操作功能之一。本页将系统性地介绍如何通过脚本修改地物的基本属性、扩展属性以及几何属性,并确保修改内容正确保存到数据库。 + +## 属性修改架构概览 + +地物属性修改涉及三个核心层次:**新建对象属性设置**、**选择集对象属性修改**和**批量保存机制**。理解这个架构对于正确使用 API 至关重要。 + +```mermaid +flowchart TB + A[开始属性修改] --> B{修改场景} + B --> C[新建对象] + B --> D[选择集对象] + B --> E[批量修改] + + C --> C1[createDefaultGeoBase
创建对象] + C1 --> C2[setNewObjValue
设置属性] + C2 --> C3[addNewObjToSaveObjList
添加到保存列表] + + D --> D1[遍历选择集对象] + D1 --> D2{属性类型} + D2 --> D3[SSObj_Code/LayerName
特殊处理] + D2 --> D4[基本属性
setGeoValue] + D2 --> D5[扩展属性
setMemoData] + D3 --> D6[addSelGeoToSaveGeoList
添加到保存列表] + D4 --> D6 + D5 --> D6 + + E --> E1[setSelGeoValue -1
批量设置] + E1 --> E2[addSelGeoToSaveGeoList -1
批量添加] + + C3 --> F[saveBufferObjToDatabase
保存到数据库] + D6 --> F + E2 --> F + F --> G[updateRequest
刷新地图显示] + G --> H[完成] +``` + +## 属性类型与命名规范 + +SunvStation 支持三种不同类型的属性,每种类型使用特定的命名前缀和语法规则。 + +| 属性类型 | 命名格式 | 示例 | 说明 | +|---------|---------|------|------| +| **基本属性** | `SSObj_` 开头 | `SSObj_Code`, `SSObj_Name`, `SSObj_Color` | 系统预定义的固有属性 | +| **扩展属性** | `[属性名]` 格式 | `[建筑类型]`, `[施工状态]` | 用户自定义的扩展字段 | +| **几何属性** | `<属性名>` 格式 | ``, ``, `` | 对象的几何特性和坐标信息 | + +### 基本属性分类 + +**通用属性**:涵盖对象的标识、图层和图形表现。这包括对象 ID、编码、图层名称、颜色、线型和线宽等关键属性。 + +**几何属性**:涉及对象的坐标、几何尺寸和拓扑特征。包括坐标点(X, Y, Z)、面积、长度、边界框等几何信息。 + +**注记属性**:专门针对文本标注的样式和格式。包括字体宽度、高度、名称、内容、对齐方式和角度等详细属性。 + +**时间与状态**:记录对象的创建和修改时间,以及对象的状态标记。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L9-L79) + +## 修改新建对象的属性 + +当通过 `createDefaultGeoBase()` 或 `createNewObjByCode()` 创建新地物对象后,可以使用 `setNewObjValue()` 方法设置其属性。这种方法适用于单次创建并立即设置属性的场景。 + +### 基本属性设置 + +```python +# 创建编码为 100 的线对象 +obj, geo = ssp.createNewObjByCode(100) + +# 设置基本属性 +ssp.setNewObjValue("SSObj_Name", "主干道") +ssp.setNewObjValue("SSObj_Color", "16711680") # RGB 红色 +ssp.setNewObjValue("SSObj_LineWidth", "2") +ssp.setNewObjValue("SSObj_Angle", "45.0") +``` + +### 扩展属性设置 + +扩展属性使用方括号 `[]` 包裹属性名,可以同时设置多个属性: + +```python +# 设置单个扩展属性 +ssp.setNewObjValue("[建筑类型]", "住宅楼") +ssp.setNewObjValue("[建成年份]", "2020") + +# 同时设置多个扩展属性(用逗号分隔) +ssp.setNewObjValue("[建筑类型],[建成年份],[楼层数]", "商业楼,2021,18") +``` + +### 注记属性设置 + +对于注记对象,支持专门的字体属性: + +```python +# 创建注记对象 +obj, note = ssp.createNewObjByClass("1") # 分类号为1的注记 + +# 设置注记属性 +ssp.setNewObjValue("SSObj_FontString", "示例文字") +ssp.setNewObjValue("SSObj_FontHeight", "300") +ssp.setNewObjValue("SSObj_FontWidth", "200") +ssp.setNewObjValue("SSObj_FontName", "SimSun") +ssp.setNewObjValue("SSObj_FontAlignment", "1") # 对齐方式 +``` + +完成属性设置后,需要将新对象添加到保存列表并持久化: + +```python +ssp.addNewObjToSaveObjList() +ssp.saveBufferObjToDatabase() +ssp.updateRequest() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L106-L266) + +## 修改选择集中对象的属性 + +对于已经存在于地图上的对象,需要先通过选择集过滤获取目标对象,然后使用 `setSelGeoValue()` 或 `setSelNoteValue()` 修改属性。 + +### 选择集对象属性修改流程 + +```mermaid +flowchart LR + A[设置选择条件] --> B[执行过滤查询] + B --> C[遍历选择集] + C --> D[修改对象属性] + D --> E[添加到保存列表] + E --> F[保存到数据库] + F --> G[刷新显示] +``` + +### 修改单个对象的属性 + +通过指定索引值修改选择集中特定对象的属性: + +```python +# 清除并设置选择条件 +ssp.clearSelection() +ssp.clearSelectCondition() +ssp.setSelectCondition("SSObj_Code", "==", "100") +ssp.selectFilter() + +# 修改选择集中第0个对象的属性 +ssp.setSelGeoValue(0, "SSObj_Name", "修改后的名称") +ssp.setSelGeoValue(0, "SSObj_Color", "255") # 设置颜色号 +ssp.setSelGeoValue(0, "[施工状态]", "已完成") + +# 将修改后的对象添加到保存列表 +ssp.addSelGeoToSaveGeoList(0) + +# 批量保存到数据库 +ssp.saveBufferObjToDatabase() +ssp.updateRequest() +``` + +### 批量修改选择集对象的属性 + +将索引值设为 `-1` 可以一次性修改选择集中的所有对象: + +```python +# 获取所有编码为 100 的对象 +ssp.clearSelection() +ssp.setSelectCondition("SSObj_Code", "==", "100") +ssp.selectFilter() + +print(f"当前选择集对象数量: {ssp.getSelGeoCount()}") + +# 批量修改所有选择集对象的属性 +ssp.setSelGeoValue(-1, "SSObj_Color", "255") # 统一颜色 +ssp.setSelGeoValue(-1, "SSObj_LineWidth", "3") # 统一线宽 +ssp.setSelGeoValue(-1, "[更新时间]", "2024-01-15") + +# 批量添加到保存列表 +for i in range(ssp.getSelGeoCount()): + ssp.addSelGeoToSaveGeoList(i) + +# 保存并刷新 +ssp.saveBufferObjToDatabase() +ssp.updateRequest() +``` + +### 修改注记对象的属性 + +对于注记对象,使用 `setSelNoteValue()` 方法: + +```python +# 清除并设置注记选择条件 +ssp.clearSelection() +ssp.setSelectCondition("SSObj_Type", "==", "NOTE") +ssp.setSelectCondition("[注记分类]", "==", "道路注记") +ssp.selectFilter() + +# 批量修改注记属性 +ssp.setSelNoteValue(-1, "SSObj_FontHeight", "250") +ssp.setSelNoteValue(-1, "SSObj_FontWeight", "700") # 粗体 +ssp.setSelNoteValue(-1, "SSObj_FontColor", "16777215") # 白色 + +# 添加到保存列表 +for i in range(ssp.getSelNoteCount()): + ssp.addSelNoteToSaveNoteList(i) + +# 保存 +ssp.saveBufferObjToDatabase() +ssp.updateRequest() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L310-L411) + +## 特殊属性处理 + +某些属性的修改涉及对象重建或特殊逻辑,需要特别注意。 + +### 编码属性(SSObj_Code)修改 + +修改对象编码会触发对象重新创建,需要通过数据源重新获取特性信息: + +```python +# 修改单个对象的编码 +ssp.setSelGeoValue(0, "SSObj_Code", "200") + +# 注意:此操作会自动处理对象重建 +# 无需手动管理新旧对象的替换 +``` + +### 图层属性(SSObj_LayerName)修改 + +将对象移动到不同图层涉及完整的对象克隆和数据集切换: + +```python +# 将选择集中的对象移动到"建筑"图层 +ssp.setSelGeoValue(0, "SSObj_LayerName", "建筑") + +# 系统会自动: +# 1. 克隆原始对象 +# 2. 保留扩展属性 +# 3. 删除旧对象 +# 4. 在新图层创建新对象 +``` + +### 点坐标修改(SSObj_X, SSObj_Y, SSObj_Z) + +修改坐标点需要指定点的索引: + +```python +# 修改第一个点的坐标 +ssp.setSelGeoValue(0, "SSObj_X(0)", "123456.789") +ssp.setSelGeoValue(0, "SSObj_Y(0)", "3456789.123") +ssp.setSelGeoValue(0, "SSObj_Z(0)", "100.5") + +# 修改第二个点的坐标 +ssp.setSelGeoValue(0, "SSObj_X(1)", "123500.000") +ssp.setSelGeoValue(0, "SSObj_Y(1)", "3456800.000") +``` + +### 点名称与类型修改(SSObj_PointName, SSObj_PointType) + +```python +# 修改点名称 +ssp.setSelGeoValue(0, "SSObj_PointName(0)", "起点") +ssp.setSelGeoValue(0, "SSObj_PointName(1)", "终点") + +# 修改点类型(需要指定点索引) +ssp.setSelGeoValue(0, "SSObj_PointType(0)", "1") +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L495-L550) + +## 颜色属性设置详解 + +SunvStation 支持三种颜色表示方式,系统会自动识别并转换: + +| 颜色表示方式 | 格式示例 | 说明 | +|------------|---------|------| +| **颜色号方式** | `COLORNO(1)` | 使用系统颜色索引,推荐方式 | +| **RGB方式** | `RGB(255,0,0)` | 直接指定红绿蓝分量 | +| **颜色值方式** | `16711680` | 24位RGB颜色值(0x00FF0000 = 红) | + +```python +# 三种等价的红色设置方式 +ssp.setSelGeoValue(0, "SSObj_Color", "COLORNO(1)") # 颜色号方式 +ssp.setSelGeoValue(0, "SSObj_Color", "RGB(255,0,0)") # RGB方式 +ssp.setSelGeoValue(0, "SSObj_Color", "16711680") # 颜色值方式(红色) +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L413-L419) + +## 完整示例:批量更新道路属性 + +下面的示例展示了完整的属性修改工作流程:选择所有道路对象,更新其颜色、线宽和扩展属性,然后保存到数据库。 + +```python +# 1. 清除并初始化选择集 +ssp.clearSelection() +ssp.clearSelectCondition() + +# 2. 设置选择条件:选择编码为 200 的道路对象 +ssp.setSelectCondition("SSObj_Code", "==", "200") +ssp.selectFilter() + +geo_count = ssp.getSelGeoCount() +print(f"选中对象数量: {geo_count}") + +if geo_count > 0: + # 3. 批量修改基本属性 + ssp.setSelGeoValue(-1, "SSObj_Color", "COLORNO(5)") # 统一颜色 + ssp.setSelGeoValue(-1, "SSObj_LineWidth", "4") # 统一线宽 + ssp.setSelGeoValue(-1, "SSObj_DataMark", "已更新") # 数据标记 + + # 4. 批量修改扩展属性 + ssp.setSelGeoValue(-1, "[路面宽度]", "12.5") + ssp.setSelGeoValue(-1, "[铺装类型]", "沥青混凝土") + ssp.setSelGeoValue(-1, "[维护日期]", "2024-01-10") + + # 5. 将所有修改后的对象添加到保存列表 + for i in range(geo_count): + ssp.addSelGeoToSaveGeoList(i) + + # 6. 保存到数据库并刷新显示 + ssp.saveBufferObjToDatabase() + ssp.updateRequest() + + print("属性更新完成!") +else: + print("未找到符合条件的对象") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L50-L95) + +## 完整示例:创建并设置新对象 + +```python +# 1. 创建编码为 101 的建筑物对象 +obj, geo = ssp.createNewObjByCode(101) + +# 2. 设置基本属性 +ssp.setNewObjValue("SSObj_Name", "新建建筑A栋") +ssp.setNewObjValue("SSObj_Color", "COLORNO(3)") +ssp.setNewObjValue("SSObj_LayerName", "建筑物") + +# 3. 添加坐标点 +ssp.addNewObjPoint(123456.789, 3456789.123, 50.0, 0, "") +ssp.addNewObjPoint(123500.000, 3456800.000, 50.0, 0, "") +ssp.addNewObjPoint(123500.000, 3456700.000, 50.0, 0, "") +ssp.addNewObjPoint(123456.789, 3456789.123, 50.0, 0, "") + +# 4. 设置扩展属性 +ssp.setNewObjValue("[建筑高度]", "45.5") +ssp.setNewObjValue("[建筑面积]", "3200") +ssp.setNewObjValue("[建筑功能]", "办公") + +# 5. 添加到保存列表并持久化 +ssp.addNewObjToSaveObjList() +ssp.saveBufferObjToDatabase() +ssp.updateRequest() + +print("新对象创建完成并已保存!") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L106-L411) + +## 注意事项与最佳实践 + +### 属性修改注意事项 + +1. **数据类型匹配**:确保属性值的数据类型与属性定义一致,数值属性使用数字字符串,文本属性使用字符串 +2. **编码和图层**:修改 `SSObj_Code` 和 `SSObj_LayerName` 会触发对象重建,确保目标编码和图层存在 +3. **批量操作**:修改大量对象时,使用 `-1` 索引进行批量操作可以提高性能 +4. **扩展属性**:使用逗号分隔可以一次设置多个扩展属性,但确保属性数量和值数量匹配 + +### 保存机制 + +**重要**:属性修改后必须显式调用保存方法,否则修改仅在内存中生效,不会持久化到数据库: + +```python +# 单个对象保存 +ssp.addSelGeoToSaveGeoList(index) # index 为具体索引或 -1(全部) +ssp.saveBufferObjToDatabase() + +# 新对象保存 +ssp.addNewObjToSaveObjList() +ssp.saveBufferObjToDatabase() +``` + +### 错误处理 + +属性修改操作通常会静默失败,建议在关键操作后检查结果: + +```python +# 修改属性前检查对象是否存在 +if ssp.getSelGeoCount() > 0: + # 执行修改 + ssp.setSelGeoValue(0, "SSObj_Color", "255") + ssp.addSelGeoToSaveGeoList(0) +else: + print("选择集为空,无法执行修改") +``` + +## 进阶操作:通过对象ID直接修改属性 + +对于已知对象 ID 的情况,可以通过 `getObjectAttr()` 和 `setSelGeoValue()` 组合使用: + +```python +# 通过对象 ID 直接获取属性 +obj_id = 12345 +attr_value = ssp.getObjectAttr(obj_id, "SSObj_Name") +print(f"当前名称: {attr_value}") + +# 先选择该对象,再修改属性 +ssp.clearSelection() +ssp.setSelectCondition("SSObj_ID", "==", str(obj_id)) +ssp.selectFilter() + +if ssp.getSelGeoCount() > 0: + ssp.setSelGeoValue(0, "SSObj_Name", "修改后的名称") + ssp.addSelGeoToSaveGeoList(0) + ssp.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L570-L600) + +## 下一步学习 + +掌握属性修改后,建议继续学习以下相关主题: + +- **[地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)** - 深入了解每种基本属性的含义和用途 +- **[扩展属性与自定义属性](18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing)** - 学习如何创建和管理扩展属性系统 +- **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)** - 了解批量保存的内部机制和性能优化 +- **[撤销标记管理](25-che-xiao-biao-ji-guan-li)** - 学习如何实现属性修改的撤销功能 \ No newline at end of file diff --git a/docs/content/17-di-wu-ji-ben-shu-xing-xiang-jie.md b/docs/content/17-di-wu-ji-ben-shu-xing-xiang-jie.md new file mode 100644 index 0000000..d100c06 --- /dev/null +++ b/docs/content/17-di-wu-ji-ben-shu-xing-xiang-jie.md @@ -0,0 +1,427 @@ +本文档深入解析 SunvStation 地物基本属性体系,阐述各类属性的物理含义、存储机制、应用场景以及底层实现原理。通过系统地理解这些属性,开发者可以更高效地进行地理数据管理和空间分析。 + +## 属性体系概览 + +地物基本属性体系是一个层次化的概念架构,将地理对象的各种特征抽象为可管理和可查询的属性集合。这个体系遵循从抽象到具体的分层原则,覆盖了对象的标识、几何、外观、时间等完整维度的信息。 + +```mermaid +flowchart TB + A[地物基本属性体系] --> B[标识属性组] + A --> C[几何属性组] + A --> D[外观属性组] + A --> E[时间属性组] + A --> F[注记属性组] + + B --> B1[SSObj_ID
系统唯一标识] + B --> B2[SSObj_Code
业务编码] + B --> B3[SSObj_Name
对象名称] + B --> B4[SSObj_Byname
对象别名] + B --> B5[SSObj_LayerName
图层归属] + B --> B6[SSObj_GroupID
分组标识] + + C --> C1[坐标点
X, Y, Z, PointName, PointType] + C --> C2[几何尺寸
Area, Length, 3DLength] + C --> C3[边界框
minX, minY, maxX, maxY] + C --> C4[变换参数
Angle, ScaleX, ScaleY] + + D --> D1[颜色属性
Color, HatchStyle] + D --> D2[线条属性
LineType, LineWidth] + D --> D3[状态属性
Status, DataMark] + + E --> E1[CreateTime
创建时间戳] + E --> E2[ModifyTime
修改时间戳] + + F --> F1[字体属性
FontName, FontWidth, FontHeight] + F --> F2[内容属性
FontString, FontStringCount] + F --> F3[样式属性
FontAlignment, FontDirection, FontWeight] +``` + +这个属性体系通过 `ObjBaseAttr` 类进行统一管理。该类在初始化时会注册所有预定义的属性名称,并分配唯一的索引值,用于高效的属性访问和查找。属性索引化的设计使得属性访问从字符串匹配转换为整数索引查找,显著提升了性能,特别是在批量处理大量地物对象时。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L4-L90) + +## 标识属性详解 + +标识属性是地物对象的身份特征,用于唯一确定和组织地理对象。理解这些属性的含义和作用,是构建有效数据管理策略的基础。 + +### SSObj_ID:系统唯一标识 + +`SSObj_ID` 是系统分配的地物对象全局唯一标识符,通常为长整型数值。该属性具有以下关键特性:**不可变性**(对象创建后不会改变)、**全局唯一性**(在整个工作空间范围内唯一)、**自动分配**(由系统自动生成,无需手动指定)。该属性主要用于对象间引用关系管理、数据关联操作以及撤销操作的对象定位。 + +在实际应用中,当对象间需要建立关联时,通过 `SSObj_ID` 进行引用是最可靠的方式。例如,对象 A 需要引用对象 B,应存储对象 B 的 `SSObj_ID` 而非 `SSObj_Code`,因为编码可能在业务流程中被修改,而 ID 保持不变。 + +### SSObj_Code:业务编码 + +`SSObj_Code` 是地物对象的业务分类编码,通常对应国家或行业标准中的要素代码。该属性反映了地物的**语义分类**,如 100 代表控制点、200 代表道路等。与 `SSObj_ID` 不同,`SSObj_Code` 是业务概念层面的标识,可以在一定规则下修改。 + +在数据交换和跨系统集成场景中,`SSObj_Code` 扮演着关键角色。它使得不同系统间的数据映射成为可能,同时保证了数据语义的一致性。开发者在设计业务逻辑时,应优先基于 `SSObj_Code` 进行对象分类和功能分发,而不是硬编码具体的对象类型。 + +### SSObj_Name 与 SSObj_Byname + +`SSObj_Name` 是地物对象的正式名称,通常用于地图标注、报表输出等展示场景。`SSObj_Byname` 则是对象的别名,用于存储对象的俗称、缩写或其他非正式名称。两者的区别在于**正式性**和**应用场景**:Name 用于正式场合和对外展示,Byname 用于内部管理和灵活查询。 + +一个典型的应用场景是道路管理:`SSObj_Name` 可能存储"中山北路",而 `SSObj_Byname` 可能存储"中山路"、"北环路"等历史名称或俗称,这为模糊查询和多名称检索提供了便利。 + +### SSObj_LayerName 与 SSObj_GroupID + +`SSObj_LayerName` 表示地物对象所属的图层名称,体现了地图的**层次化管理**思想。图层是逻辑上的对象集合,同一图层中的对象通常具有相似的性质或用途。通过 `SSObj_LayerName`,可以快速筛选特定类型的对象,实现分层显示和符号化控制。 + +`SSObj_GroupID` 则提供了更灵活的对象分组机制。不同于图层的固定层级,分组是临时的、动态的、可自定义的。在批量操作中,可以将需要一起处理的对象分配到同一个组,然后通过 `SSObj_GroupID` 进行统一访问。这种设计减少了选择集操作的复杂度,提高了批量处理的效率。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L24-L43) + +## 几何属性详解 + +几何属性描述了地物对象的空间形态和位置特征,是地理信息系统的核心数据类型。这些属性包括坐标点、尺寸参数、边界范围以及变换参数等。 + +### 坐标点属性体系 + +地物对象的几何形状由一系列坐标点构成,每个坐标点包含空间位置(X, Y, Z)和附加属性(名称、类型)。 + +| 属性名称 | 含义 | 数据类型 | 适用场景 | +|---------|------|---------|---------| +| `SSObj_PointCount` | 坐标点总数 | 整数 | 判断几何复杂度 | +| `SSObj_X(n)` | 第 n 个点的 X 坐标 | 浮点数 | 精确定位 | +| `SSObj_Y(n)` | 第 n 个点的 Y 坐标 | 浮点数 | 精确定位 | +| `SSObj_Z(n)` | 第 n 个点的 Z 坐标(高程) | 浮点数 | 三维分析 | +| `SSObj_PointName(n)` | 第 n 个点的名称 | 字符串 | 节点标识 | +| `SSObj_PointType(n)` | 第 n 个点的类型 | 整数 | 拓扑特征 | + +坐标点属性的访问采用**参数化语法**:通过在属性名后添加括号和索引号来访问特定点,如 `SSObj_X(0)` 表示第一个点的 X 坐标。这种设计使得线对象和面对象的任意坐标点都可以精确访问,为精细化编辑和坐标分析提供了基础。 + +对于点对象(Point),坐标点属性直接访问其唯一坐标;对于线对象(Line)和面对象(Area),则需要指定索引。`SSObj_PointType` 属性尤其重要,它表示坐标点的拓扑类型,如是否为圆弧点、是否为拟合点、是否为曲线控制点等,这些信息决定了对象的绘制方式和几何特性。 + +### 几何尺寸属性 + +几何尺寸属性量化了地物对象的空间范围和长度特征,是空间分析的基础数据。 + +```mermaid +flowchart LR + A[几何尺寸计算] --> B[对象类型判断] + B --> C[AREA] + B --> D[LINE] + B --> E[POINT] + + C --> C1[Area
多边形面积] + C --> C2[Length
多边形周长] + + D --> D1[Length
线条长度] + D --> D2[3DLength
三维线长度] + + E --> E1[无几何尺寸
点对象] + + C1 --> F[空间分析应用] + C2 --> F + D1 --> F + D2 --> F +``` + +**SSObj_Area** 属性表示面对象的平面面积,单位通常为平方米。该属性通过几何算法实时计算,支持凸多边形、凹多边形、带洞多边形等各种复杂形状。面积的精确度取决于坐标系统的投影参数和计算方法,在高精度测量场景中需要特别注意。 + +**SSObj_Length** 和 **SSObj_3DLength** 分别表示对象的二维长度和三维长度。对于线对象,Length 是投影到 XY 平面的长度;3DLength 则考虑了高程变化,是三维空间中的实际长度。对于面对象,Length 表示其周长。这两个属性的区别在山区地形等高程变化显著的场景中尤为重要。 + +### 边界框属性 + +边界框(Bounding Box)是地物对象的最小外接矩形,由四个属性描述:`SSObj_minX`、`SSObj_minY`、`SSObj_maxX`、`SSObj_maxY`。边界框虽然丢失了对象的精确几何细节,但提供了极其高效的**空间过滤**能力。 + +在空间索引和查询优化中,边界框扮演着核心角色。系统可以先通过边界框快速排除不可能相交的对象,再对候选对象进行精确的几何相交测试。这种两阶段过滤策略大幅提升了空间查询性能,特别是在处理海量数据时效果显著。 + +### 几何变换属性 + +几何变换属性控制对象的平移、旋转和缩放,用于实现对象的动态调整和符号化表现。 + +**SSObj_Angle** 属性表示对象的旋转角度,以度为单位,逆时针为正方向。旋转中心通常为对象的几何中心或指定锚点。对于线对象和面对象,Angle 属性影响其整体方向;对于注记对象,Angle 属性影响文本的旋转方向。在地图符号化中,Angle 属性常用于符号的方向自适应,如道路注记沿线方向旋转。 + +**SSObj_ScaleX** 和 **SSObj_ScaleY** 属性分别控制对象在 X 和 Y 方向的缩放比例。这两个属性支持**非等比缩放**,可以实现拉伸、压缩等变形效果。**SSObj_ScaleXY** 则是等比缩放的便捷方式,同时设置 X 和 Y 方向的缩放系数。 + +缩放属性的一个重要应用场景是符号大小的自适应。在不同地图比例尺下,符号的视觉大小需要保持一致,这时可以通过 ScaleX 和 ScaleY 动态调整符号的显示比例。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L12-L23), [ObjBaseAttr.py](ObjBaseAttr.py#L300-L380) + +## 外观属性详解 + +外观属性控制地物对象的视觉表现形式,是地图符号化的重要组成部分。理解这些属性的含义和取值范围,对于设计美观、专业的地图至关重要。 + +### 颜色属性(SSObj_Color) + +`SSObj_Color` 属性控制对象的填充色或线条色,支持三种表示方式: + +1. **颜色号方式**:直接使用系统预定义的颜色索引,如 `1` 表示红色、`2` 表示黄色。这种方式简单直观,但灵活性有限。 + +2. **RGB 方式**:使用 `RGB(R,G,B)` 语法指定红绿蓝三个分量,每个分量的取值范围为 0-255。例如 `RGB(255,0,0)` 表示纯红色。RGB 方式提供了完整的颜色空间表达能力,但需要手动计算颜色值。 + +3. **颜色值方式**:将 RGB 三个分量组合为一个 24 位整数值,计算公式为 `R × 65536 + G × 256 + B`。例如红色对应值 `16711680`。这种方式程序处理最方便,但人工难以理解和输入。 + +在实际开发中,推荐使用 `getColorValue()` 工具函数进行颜色值的统一解析和转换,该函数可以自动识别上述三种格式并返回统一的颜色值。 + +### 线型属性(SSObj_LineType) + +`SSObj_LineType` 属性定义对象的线条样式,如实线、虚线、点划线等。不同的线型通过不同的划线模式(dash pattern)实现,系统预定义了一系列常用线型索引。 + +线型属性对面对象也同样有效,控制其边界线的绘制样式。在地质图、道路网等专业地图中,线型是表达对象性质的重要视觉线索,如实线表示主干道、虚线表示规划道路等。 + +线型的视觉效果还受线宽(`SSObj_LineWidth`)属性的影响。较粗的线条适合表达重要的地物,较细的线条用于表达次要地物或背景要素。线宽通常以屏幕像素为单位,需要根据地图比例尺动态调整以保持视觉一致性。 + +### 填充样式属性 + +**SSObj_HatchStyle** 属性控制对象的填充模式,包括纯色填充、图案填充、渐变填充等多种方式。不同的填充样式通过不同的索引值指定,系统内置了标准制图中常用的填充图案,如斜线、网格、点阵等。 + +**SSObj_HatchDensityScale** 属性调整填充图案的密度比例。增加该值会使图案更稀疏,减少该值则使图案更密集。这个属性为视觉表达提供了额外的灵活性,可以根据地图的负载和重点调整填充的视觉强度。 + +对于 L 型符号(如建筑符号),**SSObj_LShapeOffset** 属性控制符号的偏移距离,影响符号的相对位置和对齐方式。这个属性在精确制图中非常重要,可以微调符号的摆放位置以达到最佳视觉效果。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L52-L56), [ObjBaseAttr.py](ObjBaseAttr.py#L405-L420) + +## 时间属性详解 + +时间属性记录地物对象的生命周期关键节点,包括创建时间和修改时间。这些属性对于数据审计、版本管理和变更追踪具有不可替代的作用。 + +### SSObj_CreateTime:创建时间戳 + +`SSObj_CreateTime` 记录对象首次创建的时间,格式为 `YYYY-MM-DD HH:MM:SS`。这个属性在对象创建时由系统自动设置,之后不会自动更新,确保了创建时间的**永久性和不变性**。 + +创建时间是数据溯源的关键信息。在数据质量检查和争议处理中,通过创建时间可以确定对象的创建者、创建顺序和创建环境。对于历史数据分析,创建时间也是构建时间序列的基础数据。 + +### SSObj_ModifyTime:修改时间戳 + +`SSObj_ModifyTime` 记录对象最后一次被修改的时间。与创建时间不同,修改时间会在对象属性或几何形状发生变化时自动更新,始终反映对象的**最新变更状态**。 + +修改时间的自动更新机制确保了时间戳的准确性,但也带来了性能考虑。在高频修改场景下,频繁的时间戳更新可能产生性能开销。系统通常通过延迟写入或批量更新的方式优化这一过程。 + +在实际应用中,修改时间常用于增量数据同步。通过比较修改时间,可以快速识别自上次同步以来发生变化的对象,只传输变更部分而非全部数据,大幅提升了数据同步效率。 + +时间属性还支持自定义解析和格式化。`ObjBaseAttr.getGeoValue()` 方法使用 `DateTime.parse()` 和 `DateTime.format()` 方法进行时间值的读写,确保了时间格式的一致性和可解析性。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L44-L46), [ObjBaseAttr.py](ObjBaseAttr.py#L230-L245) + +## 注记属性详解 + +注记属性专用于控制文本标注的外观和内容,是地图中信息传递的重要媒介。注记对象(Note)虽然在地物类型上独立于点、线、面,但其属性体系同样丰富。 + +### 字体属性组 + +字体属性组控制文本的视觉表现,包括字体名称、字宽、字高、字重等多个维度。 + +| 属性名称 | 含义 | 数据类型 | 典型应用 | +|---------|------|---------|---------| +| `SSObj_FontName` | 字体名称 | 字符串 | "SimSun"、"Arial" | +| `SSObj_FontWidth` | 字宽 | 浮点数 | 100(单位:地图单位) | +| `SSObj_FontHeight` | 字高 | 浮点数 | 300(单位:地图单位) | +| `SSObj_FontWeight` | 字重(粗细) | 整数 | 400(正常)、700(粗体) | +| `SSObj_FontItalicAngle` | 倾斜角度 | 浮点数 | 0(正常)、15(倾斜) | +| `SSObj_FontUnderLine` | 下划线 | 整数 | 0(无)、1(有) | + +字宽和字高的相对比例决定了字体的形状。通常情况下,字高大于字宽,形成正常的矩形字体;若字宽大于字高,则形成横向拉伸的扁平字体。字宽和字高的绝对值则控制注记的总体大小,需要根据地图比例尺和注记重要性进行设计。 + +**SSObj_FontRealHeight** 和 **SSObj_FontRealLength** 是两个动态计算属性,分别表示注记在实际地图上的显示高度和长度。这两个属性考虑了地图比例尺的影响,提供了屏幕像素尺寸而非地图单位尺寸,适合用于注记碰撞检测和布局优化。 + +### 内容属性组 + +内容属性组定义了注记的文本内容及其元信息。 + +**SSObj_FontString** 是注记的核心内容属性,存储要显示的文本字符串。该属性支持多行文本和富文本格式,可以包含换行符、制表符等特殊字符。 + +**SSObj_FontStringCount** 是只读属性,返回注记文本的字符数量。该属性通过 `len(note.getStringText())` 实时计算,用于快速评估注记的文本长度,在自动注记布局中非常有用。 + +**SSObj_FontClass** 表示注记的分类号,通常对应业务标准中的注记类型。通过分类号可以批量管理同类注记的样式,实现统一的符号化控制。 + +### 布局属性组 + +布局属性组控制注记的位置、方向和对齐方式,影响注记的视觉平衡和可读性。 + +| 属性名称 | 含义 | 数据类型 | 取值说明 | +|---------|------|---------|---------| +| `SSObj_FontAlignment` | 对齐方式 | 整数 | 0(左对齐)、1(居中)、2(右对齐) | +| `SSObj_FontPosType` | 位置类型 | 整数 | 相对于参考点的位置关系 | +| `SSObj_FontDirection` | 字方向 | 整数 | 横向、纵向等 | +| `SSObj_FontWordAngle` | 字角度 | 浮点数 | 单个字符的旋转角度 | +| `SSObj_FontStringAngle` | 串角度 | 浮点数 | 整个文本串的旋转角度 | +| `SSObj_FontInterval` | 字间隔 | 浮点数 | 字符之间的间距 | +| `SSObj_FontDownAngle` | 下沉角度 | 浮点数 | 文本的下沉效果 | + +字角度和串角度的区别在于作用范围:字角度控制单个字符的旋转,适合用于特殊效果(如弧形文字);串角度控制整个文本串的统一旋转,适合用于沿线标注等场景。 + +对齐方式属性决定了文本相对于锚点的分布方式。左对齐时,文本的起始位置在锚点;居中对齐时,文本的中心在锚点;右对齐时,文本的结束位置在锚点。选择合适的对齐方式可以确保注记与被标注地物的视觉关联性。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L63-L84), [ObjBaseAttr.py](ObjBaseAttr.py#L150-L210), [ObjBaseAttr.py](ObjBaseAttr.py#L500-L580) + +## 属性访问机制深入 + +理解地物属性的底层访问机制,有助于开发者编写高效的代码并进行性能优化。`ObjBaseAttr` 类通过索引化查找和参数解析实现了高效的属性访问。 + +### 属性名称注册与索引映射 + +`ObjBaseAttr` 类在初始化时会调用 `registerObjBaseAttrName()` 方法注册所有预定义属性。该方法执行以下操作:去除属性名的 `SSObj_` 前缀,转换为小写,按升序插入到 `valueNames` 列表中,并返回该属性在列表中的索引。 + +这种设计具有两个重要优点:**查找效率**从 O(n) 的线性搜索提升到 O(1) 的数组访问;**内存优化**避免了重复存储大量字符串属性名。 + +属性索引是全局唯一的常量,在对象生命周期内不会改变。因此,`ObjBaseAttr` 在构造函数中会将常用属性的索引缓存为实例变量,如 `self.code`、`self.color`、`self.area` 等,进一步减少了运行时的查找开销。 + +### 参数化属性解析 + +对于坐标点等需要参数的属性,系统使用 `get_value_index_param()` 方法进行解析。该方法支持 `SSObj_X(0)`、`SSObj_Y(pointIndex)` 等带参数的语法,能够提取属性索引和括号内的参数字符串。 + +参数解析的步骤如下:首先检查字段名是否以 `)` 结尾,如果是则提取括号内容作为参数;然后去除 `SSObj_` 前缀并转换为小写;最后在 `valueNames` 列表中查找属性名并返回索引。若属性名未找到或参数格式错误,则返回 -1 表示无效。 + +这种灵活的参数化语法使得单个属性名可以访问一组相关的数据,大大简化了 API 设计。例如,线对象可能有数百个坐标点,但只需要定义一个 `SSObj_X` 属性配合参数索引即可访问所有点的 X 坐标。 + +### 属性值获取流程 + +`getGeoValue()` 方法实现了属性值的统一获取接口,其内部逻辑体现了类型判断和适配器模式的应用。 + +方法首先调用 `get_value_index_param()` 获取属性索引和参数;然后根据索引匹配对应的属性类型,执行相应的取值操作。取值操作的实现方式因属性类型而异:简单属性(如 ID、Code)直接调用对象的 getter 方法;复合属性(如坐标点)需要先解析参数再访问指定点;只读属性(如面积)通过几何计算实时生成;动态属性(如实际高度)结合地图比例尺进行转换。 + +对于注记对象,方法会先判断对象类型是否为 `e_Note_Obj`,如果是则调用 `castToMarkNote()` 进行类型转换,然后访问注记专用的字体属性。这种类型检查和转换确保了类型安全,避免了访问不存在属性引发的异常。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L90-L140), [ObjBaseAttr.py](ObjBaseAttr.py#L145-L290) + +## 属性修改机制深入 + +属性修改涉及值设置、类型转换、批量操作等多个环节,理解这些机制有助于避免常见的陷阱和错误。 + +### 扩展属性的特殊处理 + +`setGeoValue()` 方法对扩展属性(以 `[` 开头的属性)采用特殊处理机制。扩展属性不存储在对象的基本属性中,而是存储在 `MemoData` 字段中作为键值对集合。 + +修改扩展属性时,系统会先调用 `getMemoData()` 获取当前对象的所有扩展属性,返回两个字符串数组:字段名数组和值数组。然后查找目标属性名在字段名数组中的索引,若存在则更新对应的值,若不存在则追加新的字段名和值对。 + +扩展属性支持批量设置,语法为 `[属性名1,属性名2]` 和 `值1,值2`。系统会先分割逗号分隔的属性名列表和值列表,然后逐个设置。这种批量设置机制减少了多次调用的开销,提高了性能。 + +设置完成后,系统调用 `setMemoData()` 将更新后的字段名和值数组写回对象,完成扩展属性的持久化。整个过程中,扩展属性的存储格式对开发者透明,简化了 API 使用。 + +### 基本属性的值转换 + +不同属性类型需要不同的值转换逻辑。`setGeoValue()` 方法内置了多种类型的转换处理: + +**整数类型**:通过 `int(value)` 转换,适用于 ID、编码、颜色号、线型等属性。若字符串无法转换为整数,系统会抛出异常。 + +**浮点数类型**:通过 `float(value)` 转换,适用于角度、缩放、坐标、面积等属性。支持科学计数法和小数点表示。 + +**字符串类型**:直接使用原始字符串值,适用于名称、别名、图层名等属性。系统会自动处理字符串长度限制和特殊字符转义。 + +**颜色类型**:调用 `getColorValue()` 工具函数进行统一解析,支持颜色号、RGB 和颜色值三种格式。该函数的调用位置在 [ObjBaseAttr.py](ObjBaseAttr.py#L405)。 + +**时间类型**:通过 `DateTime.parse()` 方法解析时间字符串,支持多种时间格式。解析后的 DateTime 对象通过 `setDateTime(dateTime, 0)` 写入对象,参数 `0` 表示写入创建时间,`1` 表示写入修改时间。 + +### 批量操作与循环优化 + +`setGeoValue()` 方法支持批量设置多个对象的属性,通过循环遍历 `GeoBaseList` 实现批量操作。这种设计避免了外层循环调用,减少了方法调用的开销。 + +对于每个对象,系统会根据属性类型执行相应的设置操作。某些属性对所有对象类型都适用(如颜色、名称),而某些属性只对特定类型有效(如线型只对线对象和面对象有效)。系统会在设置操作中进行类型检查,确保只有支持该属性的对象才会被修改。 + +批量操作的一个重要优化是**提前退出**:若属性索引无效或参数格式错误,方法会立即返回,避免执行无意义的循环。这种设计在处理大规模数据集时能够显著节省时间。 + +### 只读属性保护 + +某些属性是只读的,不能通过 `setGeoValue()` 修改。典型的只读属性包括:`SSObj_ID`(对象 ID)、`SSObj_PointCount`(点数量)、`SSObj_Area`(面积)、`SSObj_Length`(长度)、`SSObj_FontStringCount`(注记字符数)等。 + +这些属性要么由系统自动管理(如 ID),要么由几何计算生成(如面积和长度),人为修改会导致数据不一致。`setGeoValue()` 方法中对 `SSObj_ID` 的处理被明确注释掉并直接返回,防止了意外修改。 + +只读属性保护机制确保了数据的完整性和一致性。开发者需要通过改变对象的几何形状来间接更新面积和长度,而不是直接修改这些属性。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L305-L350), [ObjBaseAttr.py](ObjBaseAttr.py#L355-L500) + +## 应用场景与最佳实践 + +深入理解地物基本属性后,开发者在实际项目中可以应用这些知识解决复杂的业务问题。以下是一些典型应用场景和最佳实践建议。 + +### 数据质量检查与验证 + +利用地物属性可以构建自动化的数据质量检查规则。例如,检查所有道路对象的 `SSObj_Length` 是否超过最小长度阈值,或检查所有建筑的 `SSObj_Area` 是否在合理范围内。通过遍历选择集并读取属性,可以快速识别异常数据。 + +```python +# 检查面积异常的建筑物 +ssp.clearSelection() +ssp.setSelectCondition("SSObj_Code", "==", "330500") # 建筑物编码 +ssp.selectFilter() + +for i in range(ssp.getSelGeoCount()): + area = float(ssp.getSelGeoValue(i, "SSObj_Area")) + if area < 10 or area > 100000: + name = ssp.getSelGeoValue(i, "SSObj_Name") + print(f"警告:对象 {name} 的面积 {area} 可能异常") +``` + +### 批量属性更新 + +批量属性更新是地物属性管理的高频场景,如批量统一线宽、批量更新施工状态等。使用 `setSelGeoValue(-1, ...)` 语法可以一次性修改所有选择集对象的属性,大幅简化代码。 + +```python +# 批量更新道路线宽和颜色 +ssp.clearSelection() +ssp.setSelectCondition("SSObj_Code", "==", "210100") # 道路编码 +ssp.selectFilter() + +ssp.setSelGeoValue(-1, "SSObj_LineWidth", "3") +ssp.setSelGeoValue(-1, "SSObj_Color", "255") + +# 批量添加到保存列表 +for i in range(ssp.getSelGeoCount()): + ssp.addSelGeoToSaveGeoList(i) + +ssp.saveBufferObjToDatabase() +``` + +### 空间分析与统计 + +利用几何属性可以进行复杂的空间分析,如计算某一区域内的所有建筑的平均面积、统计道路的总长度等。这些分析为城市规划、资源评估等决策提供数据支持。 + +```python +# 统计某图层中建筑的平均面积 +ssp.clearSelection() +ssp.setSelectCondition("SSObj_LayerName", "==", "建筑物") +ssp.selectFilter() + +total_area = 0 +count = ssp.getSelGeoCount() + +for i in range(count): + area = float(ssp.getSelGeoValue(i, "SSObj_Area")) + total_area += area + +avg_area = total_area / count if count > 0 else 0 +print(f"建筑总数:{count},总面积:{total_area:.2f},平均面积:{avg_area:.2f}") +``` + +### 注记符号化与布局 + +注记属性的应用直接影响地图的可读性和美观性。通过调整字体、对齐、角度等属性,可以优化注记的布局效果,减少遮挡和重叠。 + +```python +# 优化道路注记的显示效果 +ssp.clearSelection() +ssp.setSelectCondition("SSObj_Type", "==", "NOTE") +ssp.setSelectCondition("[注记分类]", "==", "道路") +ssp.selectFilter() + +ssp.setSelNoteValue(-1, "SSObj_FontHeight", "200") +ssp.setSelNoteValue(-1, "SSObj_FontWeight", "400") +ssp.setSelNoteValue(-1, "SSObj_FontInterval", "1.2") + +for i in range(ssp.getSelNoteCount()): + ssp.addSelNoteToSaveNoteList(i) + +ssp.saveBufferNoteToDatabase() +``` + +### 最佳实践建议 + +1. **优先使用属性索引**:在循环中频繁访问同一属性时,可以先获取属性索引(如 `attr_id = ssp.objBaseAttr.code`),然后在循环中使用索引而非属性名字符串,提升性能。 + +2. **避免频繁修改只读属性**:某些属性如 ID、编码、图层名等,修改后需要特殊的同步操作。在批量修改时应仔细评估这些属性的影响范围。 + +3. **合理使用批量操作**:批量设置属性比逐个设置更高效,但批量操作会影响所有选择集对象,需要确保选择集的准确性。 + +4. **时间格式统一**:在处理时间属性时,应使用标准的时间格式(`YYYY-MM-DD HH:MM:SS`),避免因格式不一致导致的解析错误。 + +5. **颜色值转换**:使用 `getColorValue()` 函数进行颜色值的统一解析,避免硬编码颜色值,提高代码的可维护性。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L140-L145), [ObjBaseAttr.py](ObjBaseAttr.py#L230-L250) + +## 总结 + +地物基本属性体系是 SunvStation 地理数据管理的基础,涵盖了从标识到几何、从外观到时间的全方位信息。通过 `ObjBaseAttr` 类的统一管理,这些属性形成了层次清晰、功能完整的架构。 + +理解属性体系的设计原理和实现机制,能够帮助开发者更高效地编写代码,避免常见的性能陷阱和逻辑错误。在实际应用中,应根据业务需求选择合适的属性类型和访问方式,充分利用批量操作和索引优化等技术手段。 + +下一页 [扩展属性与自定义属性](18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing) 将深入探讨扩展属性的管理机制和自定义属性的创建方法,为地物属性管理提供更灵活的解决方案。 \ No newline at end of file diff --git a/docs/content/18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing.md b/docs/content/18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing.md new file mode 100644 index 0000000..f21789f --- /dev/null +++ b/docs/content/18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing.md @@ -0,0 +1,749 @@ +本页专门讲解 SunvStation 中**扩展属性与自定义属性**的使用方法。扩展属性是存储在对象扩展属性表中的用户自定义字段,用于满足业务特定的数据管理需求。通过扩展属性,开发者可以在不修改系统架构的前提下,为地物对象添加任意的业务信息,如建筑结构、施工状态、维护记录等。 + +## 扩展属性体系架构 + +扩展属性与系统基本属性(SSObj_)不同,它采用灵活的键值对存储机制,允许开发者根据业务需求动态定义属性名称和值。理解这个架构有助于正确使用扩展属性功能。 + +```mermaid +flowchart TB + A[扩展属性体系] --> B[存储机制
MemoData StringArray] + A --> C[访问语法
方括号包裹] + A --> D[应用场景
业务特定信息] + + B --> B1[Fields: 属性名数组] + B --> B2[Values: 属性值数组] + B1 --> B3[getMemoData/setMemoData] + B2 --> B3 + + C --> C1[单个属性: #91属性名#92] + C --> C2[多个属性: #91属性1#92,#91属性2#92,...] + + D --> D1[建筑管理: 结构, 层数, 面积] + D --> D2[道路管理: 宽度, 材质, 等级] + D --> D3[设施管理: 状态, 维护日期, 责任人] +``` + +扩展属性的核心优势在于其**灵活性和可扩展性**。与固定的系统属性不同,扩展属性可以根据项目需求随时添加新的字段,无需修改数据库结构或系统代码。这种设计使得 SunvStation 能够适应各种专业领域的需求。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L215-L245), [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L251-L295) + +## 扩展属性命名与语法规则 + +扩展属性使用特定的命名约定,以区别于系统基本属性和几何特性。掌握这些规则是正确使用扩展属性的前提。 + +| 属性类型 | 命名格式 | 示例 | 存储位置 | 适用场景 | +|---------|---------|------|---------|---------| +| **扩展属性** | `[属性名]` | `[建筑结构]`、`[施工状态]` | 对象扩展属性表 | 用户自定义业务字段 | +| **基本属性** | `SSObj_属性名` | `SSObj_Code`、`SSObj_Name` | 对象内部属性 | 系统预定义固有属性 | +| **几何特性** | `<属性名>` | ``、`` | 几何计算结果 | 拓扑和几何判断 | + +### 单个属性访问 + +访问单个扩展属性时,使用方括号包裹属性名: + +```python +# 获取扩展属性值 +structure = SSProcess.getSelGeoValue(0, "[建筑结构]") +print(f"建筑结构: {structure}") + +# 设置扩展属性值 +SSProcess.setSelGeoValue(0, "[建筑结构]", "钢筋混凝土") +``` + +### 多个属性访问 + +使用逗号分隔可以一次性访问或设置多个扩展属性: + +```python +# 获取多个扩展属性(逗号分隔属性名) +combined_value = SSProcess.getSelGeoValue(0, "[建筑结构],[层数],[建成年份]") +# 返回格式: "钢筋混凝土,18,2020" +print(combined_value) + +# 设置多个扩展属性(逗号分隔属性名和值) +SSProcess.setSelGeoValue(0, "[建筑结构],[层数],[建成年份]", "钢结构,25,2015") +``` + +**注意**:设置多个属性时,属性名和值的数量必须一一对应,否则操作不会执行。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L251-L295), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L200-L280) + +## 读取扩展属性 + +读取扩展属性主要通过 `getSelGeoValue()` 和 `getSelNoteValue()` 方法实现。这两个方法会自动识别方括号语法,从对象的扩展属性表中提取对应的值。 + +### 读取几何对象扩展属性 + +```python +from sunvpy import SSProcess + +# 清除并设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Code", "==", "100") # 选择建筑物 +SSProcess.selectFilter() + +if SSProcess.getSelGeoCount() > 0: + # 读取单个扩展属性 + structure = SSProcess.getSelGeoValue(0, "[建筑结构]") + floors = SSProcess.getSelGeoValue(0, "[层数]") + + print(f"建筑结构: {structure}") + print(f"楼层数: {floors}") + + # 读取多个扩展属性 + combined = SSProcess.getSelGeoValue(0, "[建筑结构],[层数],[建筑面积]") + if combined: + parts = combined.split(',') + print(f"完整信息: 结构={parts[0]}, 层数={parts[1]}, 面积={parts[2]}") +``` + +### 读取注记对象扩展属性 + +注记对象同样支持扩展属性,使用 `getSelNoteValue()` 方法: + +```python +from sunvpy import SSProcess + +# 选择注记对象 +SSProcess.clearSelection() +SSProcess.setSelectCondition("SSObj_Type", "==", "NOTE") +SSProcess.setSelectCondition("[注记分类]", "==", "道路标注") +SSProcess.selectFilter() + +if SSProcess.getSelNoteCount() > 0: + # 读取注记扩展属性 + category = SSProcess.getSelNoteValue(0, "[注记分类]") + priority = SSProcess.getSelNoteValue(0, "[显示优先级]") + + print(f"注记分类: {category}") + print(f"显示优先级: {priority}") +``` + +### 扩展属性读取流程 + +```mermaid +flowchart TD + A[调用 getSelGeoValue/getSelNoteValue] --> B{字段名以 '[' 开头?} + B -->|否| C[按基本属性处理
调用 getGeoValue] + B -->|是| D[扩展属性路径] + + D --> E[调用 map.getExtentAttr
获取 Fields 和 Values] + E --> F{字段名包含逗号?} + + F -->|否| G[查找单个字段索引] + G --> H[返回对应值或空字符串] + + F -->|是| I[分割多个字段名] + I --> J[逐个查找并收集值] + J --> K[拼接并返回逗号分隔的值] +``` + +**注意事项**:如果指定的扩展属性不存在,方法会返回空字符串。建议在关键操作前进行有效性检查。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L251-L334) + +## 设置扩展属性 + +设置扩展属性可以通过 `setSelGeoValue()`、`setSelNoteValue()`(针对已有对象)和 `setNewObjValue()`(针对新建对象)实现。设置操作会修改对象在内存中的扩展属性表,但需要显式保存才能持久化到数据库。 + +### 修改已有对象的扩展属性 + +```python +from sunvpy import SSProcess + +# 1. 选择目标对象 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Code", "==", "100") +SSProcess.selectFilter() + +# 2. 修改单个对象的扩展属性 +if SSProcess.getSelGeoCount() > 0: + SSProcess.setSelGeoValue(0, "[建筑结构]", "砖混结构") + SSProcess.setSelGeoValue(0, "[层数]", "6") + SSProcess.setSelGeoValue(0, "[建成年份]", "2008") + + # 添加到保存列表 + SSProcess.addSelGeoToSaveGeoList(0) + + # 保存到数据库 + SSProcess.saveBufferObjToDatabase() + SSProcess.updateRequest() +``` + +### 批量修改扩展属性 + +将索引设置为 `-1` 可以一次性修改选择集中所有对象的扩展属性: + +```python +from sunvpy import SSProcess + +# 1. 选择多个对象 +SSProcess.clearSelection() +SSProcess.setSelectCondition("SSObj_Code", "==", "100") +SSProcess.selectFilter() + +count = SSProcess.getSelGeoCount() +print(f"选中 {count} 个对象") + +if count > 0: + # 2. 批量修改扩展属性 + SSProcess.setSelGeoValue(-1, "[维护状态]", "待维护") + SSProcess.setSelGeoValue(-1, "[检查日期]", "2024-01-15") + SSProcess.setSelGeoValue(-1, "[责任部门]", "市政管理处") + + # 3. 将所有对象添加到保存列表 + for i in range(count): + SSProcess.addSelGeoToSaveGeoList(i) + + # 4. 批量保存 + SSProcess.saveBufferObjToDatabase() + SSProcess.updateRequest() + + print("批量更新完成") +``` + +### 设置多个扩展属性 + +使用逗号分隔可以一次性设置多个扩展属性: + +```python +# 单个对象设置多个属性 +SSProcess.setSelGeoValue(0, "[建筑结构],[层数],[建筑面积],[建筑功能]", + "框架结构,15,8500,商业") + +# 批量设置多个属性 +SSProcess.setSelGeoValue(-1, "[维护状态],[检查日期],[责任人]", + "维护中,2024-01-20,张工") +``` + +**重要提示**:设置多个属性时,属性名和值的数量必须严格一致。如果数量不匹配,整个操作将不会执行。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L340-L411), [ObjBaseAttr.py](ObjBaseAttr.py#L215-L245) + +## 为新建对象设置扩展属性 + +在创建新对象时,可以使用 `setNewObjValue()` 方法设置扩展属性。这种方式适用于需要预先定义扩展属性的场景。 + +### 完整的新建对象流程 + +```python +from sunvpy import SSProcess + +# 1. 创建新对象(编码为 101 的建筑物) +obj, geo = SSProcess.createNewObjByCode(101) + +# 2. 设置基本属性 +SSProcess.setNewObjValue("SSObj_Name", "新建办公楼A栋") +SSProcess.setNewObjValue("SSObj_Color", "COLORNO(3)") +SSProcess.setNewObjValue("SSObj_LayerName", "建筑物") + +# 3. 添加坐标点(闭合多边形) +SSProcess.addNewObjPoint(123456.789, 3456789.123, 50.0, 0, "") +SSProcess.addNewObjPoint(123500.000, 3456800.000, 50.0, 0, "") +SSProcess.addNewObjPoint(123500.000, 3456700.000, 50.0, 0, "") +SSProcess.addNewObjPoint(123456.789, 3456789.123, 50.0, 0, "") + +# 4. 设置单个扩展属性 +SSProcess.setNewObjValue("[建筑高度]", "45.5") +SSProcess.setNewObjValue("[建筑面积]", "3200") +SSProcess.setNewObjValue("[建筑功能]", "办公") +SSProcess.setNewObjValue("[消防等级]", "一级") + +# 5. 或一次性设置多个扩展属性 +SSProcess.setNewObjValue("[建设年份],[设计单位],[施工单位]", + "2023,XX设计院,XX建筑公司") + +# 6. 添加到保存列表并持久化 +SSProcess.addNewObjToSaveObjList() +SSProcess.saveBufferObjToDatabase() +SSProcess.updateRequest() + +print("新对象创建完成,扩展属性已设置") +``` + +### 新建对象扩展属性设置机制 + +```mermaid +flowchart TD + A[调用 setNewObjValue] --> B{字段名以 '[' 开头?} + B -->|否| C[按基本属性处理] + B -->|是| D[扩展属性处理] + + D --> E[调用 geo.getMemoData
获取现有 Fields 和 Values] + E --> F{字段名包含逗号?} + + F -->|否| G[查找字段索引] + G --> H{索引 >= 0?} + H -->|是| I[更新现有值] + H -->|否| J[添加新字段和值] + + F -->|是| K[分割多个字段名和值] + K --> L[逐个处理每个字段] + L --> M{字段已存在?} + M -->|是| I + M -->|否| J + + I --> N[调用 geo.setMemoData
保存扩展属性表] + J --> N +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L200-L280) + +## 在选择条件中使用扩展属性 + +扩展属性可以用于选择条件过滤,实现基于业务属性的查询。在 `setSelectCondition()` 中使用扩展属性语法,可以快速筛选出符合业务规则的对象。 + +### 基于扩展属性的选择 + +```python +from sunvpy import SSProcess + +# 1. 清除之前的选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 2. 设置基于扩展属性的选择条件 +# 等值匹配 +SSProcess.setSelectCondition("[建筑结构]", "==", "钢筋混凝土") + +# 模糊匹配 +SSProcess.setSelectCondition("[建筑功能]", "LIKE", "%办公%") + +# 数值比较 +SSProcess.setSelectCondition("[层数]", ">", "10") + +# 执行过滤 +SSProcess.selectFilter() + +# 3. 处理选择集 +count = SSProcess.getSelGeoCount() +print(f"找到 {count} 个符合条件的对象") + +if count > 0: + # 批量更新维护状态 + SSProcess.setSelGeoValue(-1, "[维护状态]", "已检查") + + for i in range(count): + SSProcess.addSelGeoToSaveGeoList(i) + + SSProcess.saveBufferObjToDatabase() + SSProcess.updateRequest() +``` + +### 复合选择条件 + +```python +# 多条件组合查询 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 条件1:建筑结构为钢筋混凝土 +SSProcess.setSelectCondition("[建筑结构]", "==", "钢筋混凝土") + +# 条件2:层数大于15 +SSProcess.setSelectCondition("[层数]", ">", "15") + +# 条件3:维护状态为"待维护" +SSProcess.setSelectCondition("[维护状态]", "==", "待维护") + +# 条件4:基本属性(编码) +SSProcess.setSelectCondition("SSObj_Code", "==", "100") + +# 执行过滤 +SSProcess.selectFilter() + +print(f"找到 {SSProcess.getSelGeoCount()} 个高层待维护建筑") +``` + +### 支持的操作符 + +扩展属性在选择条件中支持多种操作符: + +| 操作符 | 说明 | 示例 | 适用数据类型 | +|--------|------|------|------------| +| `==` | 等于 | `"[建筑结构]" == "钢筋混凝土"` | 所有类型 | +| `<>` | 不等于 | `"[维护状态]" <> "已废弃"` | 所有类型 | +| `>` | 大于 | `"[层数]" > "10"` | 数值类型 | +| `<` | 小于 | `"[建造年份]" < "2000"` | 数值类型 | +| `LIKE` | 模糊匹配 | `"[建筑功能]" LIKE "%办公%"` | 字符串类型 | +| `NOT LIKE` | 不匹配 | `"[备注]" NOT LIKE "暂缓%"` | 字符串类型 | +| `CompareNoCase` | 不区分大小写 | `"[负责人]" CompareNoCase "张三"` | 字符串类型 | + +**注意**:扩展属性的值在比较时作为字符串处理,数值比较需要确保值的格式正确。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L50-L120) + +## 扩展属性应用场景与最佳实践 + +### 典型应用场景 + +#### 建筑物管理 + +```python +# 建筑物相关扩展属性 +building_attrs = { + "[建筑结构]": "框架结构", + "[层数]": "12", + "[地下层数]": "2", + "[建筑面积]": "8500", + "[建筑功能]": "商业", + "[消防等级]": "一级", + "[建成年份]": "2018", + "[维护状态]": "正常", + "[最后检查日期]": "2024-01-10" +} +``` + +#### 道路设施管理 + +```python +# 道路相关扩展属性 +road_attrs = { + "[路面宽度]": "12.5", + "[路面材料]": "沥青混凝土", + "[道路等级]": "主干道", + "[设计时速]": "60", + "[车行道数]": "4", + "[施工状态]": "已竣工", + "[维护周期]": "12" +} +``` + +#### 市政设施管理 + +```python +# 市政设施相关扩展属性 +facility_attrs = { + "[设施类型]": "路灯", + "[功率]": "150W", + "[安装日期]": "2022-06-15", + "[维护责任人]": "张工", + "[使用状态]": "正常", + "[检查周期]": "30" +} +``` + +### 最佳实践 + +#### 1. 命名规范 + +使用清晰、一致的扩展属性命名规范: + +```python +# 推荐的命名方式 +# 业务类别 + 属性名称 +"[建筑结构]", "[建筑高度]" # 建筑类 +"[路面宽度]", "[道路等级]" # 道路类 +"[设施类型]", "[安装日期]" # 设施类 + +# 避免的命名方式 +"[结构]", "[高度]" # 太简短,容易混淆 +"[结构信息]", "[高度信息]" # 包含冗余的"信息" +``` + +#### 2. 数据类型一致性 + +保持扩展属性值的数据类型一致性: + +```python +# 数值类型统一使用数字字符串 +SSProcess.setSelGeoValue(0, "[层数]", "12") # 正确 +SSProcess.setSelGeoValue(0, "[层数]", "十二") # 错误,无法进行数值比较 + +# 日期类型使用统一格式 +SSProcess.setSelGeoValue(0, "[检查日期]", "2024-01-15") # 正确 +SSProcess.setSelGeoValue(0, "[检查日期]", "2024年1月15日") # 错误,排序不便 +``` + +#### 3. 属性数量控制 + +避免为对象添加过多的扩展属性: + +```python +# 不推荐:属性过多 +SSProcess.setSelGeoValue(0, "[属性1],[属性2],...,[属性50]", "值1,值2,...,值50") + +# 推荐:只保留业务必需的核心属性 +SSProcess.setSelGeoValue(0, "[建筑结构],[层数],[建筑功能]", "框架结构,12,办公") +``` + +#### 4. 属性值验证 + +设置扩展属性前进行值的有效性检查: + +```python +def validate_building_structure(value): + valid_structures = ["砖混结构", "框架结构", "钢结构", "钢筋混凝土"] + return value in valid_structures + +structure = "框架结构" +if validate_building_structure(structure): + SSProcess.setSelGeoValue(0, "[建筑结构]", structure) +else: + print(f"无效的建筑结构: {structure}") +``` + +#### 5. 批量操作优化 + +在处理大量对象时,优先使用批量操作: + +```python +# 不推荐:逐个处理 +for i in range(SSProcess.getSelGeoCount()): + SSProcess.setSelGeoValue(i, "[维护状态]", "已检查") + SSProcess.addSelGeoToSaveGeoList(i) + +# 推荐:批量设置后统一添加 +SSProcess.setSelGeoValue(-1, "[维护状态]", "已检查") +for i in range(SSProcess.getSelGeoCount()): + SSProcess.addSelGeoToSaveGeoList(i) +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L340-L411), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L200-L280) + +## 常见问题与故障排除 + +### 问题1:扩展属性读取返回空字符串 + +**症状**:调用 `getSelGeoValue()` 读取扩展属性时返回空字符串。 + +**可能原因**: +- 指定的扩展属性不存在 +- 对象没有设置过该扩展属性 +- 属性名拼写错误(区分大小写) + +**解决方案**: + +```python +# 检查属性是否存在 +value = SSProcess.getSelGeoValue(0, "[建筑结构]") +if not value: + print("属性不存在或为空") + +# 验证属性名拼写(区分大小写) +# "[建筑结构]" ≠ "[建筑结构]" ≠ "[建筑结构]" +``` + +### 问题2:批量设置多个属性失败 + +**症状**:使用逗号分隔设置多个属性时,操作不生效。 + +**可能原因**: +- 属性名和值的数量不匹配 +- 属性名或值中包含逗号 + +**解决方案**: + +```python +# 检查数量匹配 +attrs = "[建筑结构],[层数],[建筑功能]" +values = "框架结构,12,办公" + +if len(attrs.split(',')) == len(values.split(',')): + SSProcess.setSelGeoValue(0, attrs, values) +else: + print("属性名和值的数量不匹配") + +# 如果值中包含逗号,转义或分别设置 +SSProcess.setSelGeoValue(0, "[备注]", "包含,逗号的文本") +``` + +### 问题3:基于扩展属性的选择无结果 + +**症状**:使用 `setSelectCondition()` 设置扩展属性条件后,选择集为空。 + +**可能原因**: +- 选择条件语法错误 +- 扩展属性值的数据类型不匹配 +- 使用了不支持的操作符 + +**解决方案**: + +```python +# 验证选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 确保使用正确的语法 +SSProcess.setSelectCondition("[建筑结构]", "==", "钢筋混凝土") # 正确 +# SSProcess.setSelectCondition("建筑结构", "==", "钢筋混凝土") # 错误,缺少方括号 + +# 数值比较时确保值是数字字符串 +SSProcess.setSelectCondition("[层数]", ">", "10") # 正确 +# SSProcess.setSelectCondition("[层数]", ">", "十层") # 错误 + +SSProcess.selectFilter() +print(f"找到 {SSProcess.getSelGeoCount()} 个对象") +``` + +### 问题4:修改后的扩展属性未保存 + +**症状**:调用 `setSelGeoValue()` 修改扩展属性后,刷新地图或重启系统,修改丢失。 + +**可能原因**: +- 未调用保存方法 +- 保存列表添加失败 + +**解决方案**: + +```python +# 必须的保存流程 +SSProcess.setSelGeoValue(0, "[维护状态]", "已检查") +SSProcess.addSelGeoToSaveGeoList(0) # 添加到保存列表 +SSProcess.saveBufferObjToDatabase() # 保存到数据库 +SSProcess.updateRequest() # 刷新显示 +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L251-L334), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L200-L280) + +## 完整示例:建筑物维护管理系统 + +下面的示例展示了如何使用扩展属性构建一个完整的建筑物维护管理系统。 + +```python +from sunvpy import SSProcess + +def building_maintenance_system(): + """建筑物维护管理系统示例""" + + print("=== 建筑物维护管理系统 ===\n") + + # 1. 查找所有待维护的高层建筑 + print("1. 查找待维护的高层建筑...") + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Code", "==", "100") # 建筑物编码 + SSProcess.setSelectCondition("[建筑结构]", "==", "钢筋混凝土") + SSProcess.setSelectCondition("[层数]", ">", "15") + SSProcess.setSelectCondition("[维护状态]", "==", "待维护") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + print(f" 找到 {count} 个符合条件的建筑\n") + + if count == 0: + print("没有需要维护的建筑物") + return + + # 2. 显示待维护建筑物列表 + print("2. 待维护建筑物列表:") + print("-" * 80) + print(f"{'序号':<6}{'名称':<20}{'层数':<8}{'建筑结构':<12}{'建筑面积':<10}") + print("-" * 80) + + for i in range(count): + name = SSProcess.getSelGeoValue(i, "SSObj_Name") + floors = SSProcess.getSelGeoValue(i, "[层数]") + structure = SSProcess.getSelGeoValue(i, "[建筑结构]") + area = SSProcess.getSelGeoValue(i, "[建筑面积]") + print(f"{i:<6}{name:<20}{floors:<8}{structure:<12}{area:<10}") + + print() + + # 3. 批量更新维护信息 + print("3. 更新维护信息...") + import datetime + today = datetime.datetime.now().strftime("%Y-%m-%d") + + SSProcess.setSelGeoValue(-1, "[维护状态]", "维护中") + SSProcess.setSelGeoValue(-1, "[开始维护日期]", today) + SSProcess.setSelGeoValue(-1, "[维护责任人]", "张工程师") + SSProcess.setSelGeoValue(-1, "[维护内容]", "外墙清洗和设备检查") + + # 4. 保存修改 + print("4. 保存修改到数据库...") + for i in range(count): + SSProcess.addSelGeoToSaveGeoList(i) + + SSProcess.saveBufferObjToDatabase() + SSProcess.updateRequest() + + print(f" 已更新 {count} 个建筑物的维护状态\n") + + # 5. 生成维护报告 + print("5. 维护报告摘要:") + print("-" * 80) + + # 按建筑结构统计 + structure_stats = {} + for i in range(count): + structure = SSProcess.getSelGeoValue(i, "[建筑结构]") + structure_stats[structure] = structure_stats.get(structure, 0) + 1 + + print("按建筑结构分类:") + for structure, num in structure_stats.items(): + print(f" - {structure}: {num} 栋") + + print() + + # 按楼层数统计 + print("按楼层数分类:") + high_rise = 0 + mid_rise = 0 + for i in range(count): + floors = int(SSProcess.getSelGeoValue(i, "[层数]")) + if floors > 20: + high_rise += 1 + elif floors > 10: + mid_rise += 1 + + print(f" - 高层建筑(>20层): {high_rise} 栋") + print(f" - 中高层建筑(11-20层): {mid_rise} 栋") + + print() + print("=== 维护管理操作完成 ===") + +# 执行维护管理系统 +if __name__ == "__main__": + building_maintenance_system() +``` + +### 示例输出 + +``` +=== 建筑物维护管理系统 === + +1. 查找待维护的高层建筑... + 找到 5 个符合条件的建筑 + +2. 待维护建筑物列表: +-------------------------------------------------------------------------------- +序号 名称 层数 建筑结构 面积 +-------------------------------------------------------------------------------- +0 金融大厦A座 32 钢筋混凝土 15000 +1 科技研发中心 25 钢筋混凝土 12000 +2 商业综合体B区 28 钢筋混凝土 18000 +3 写字楼C座 22 钢筋混凝土 9500 +4 商务中心大楼 18 钢筋混凝土 8500 + +3. 更新维护信息... +4. 保存修改到数据库... + 已更新 5 个建筑物的维护状态 + +5. 维护报告摘要: +-------------------------------------------------------------------------------- +按建筑结构分类: + - 钢筋混凝土: 5 栋 + +按楼层数分类: + - 高层建筑(>20层): 4 栋 + - 中高层建筑(11-20层): 1 栋 + +=== 维护管理操作完成 === +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L50-L120), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L200-L280) + +## 下一步学习 + +掌握扩展属性后,您可以继续探索以下相关主题: + +- **[获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi)** - 了解如何读取包括扩展属性在内的所有地物属性 +- **[修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi)** - 深入学习属性修改的完整流程和最佳实践 +- **[地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)** - 系统预定义的 SSObj_ 基本属性的详细说明 +- **[选择集基础操作](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji)** - 学习选择集的基本操作和管理 +- **[创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang)** - 了解如何创建新对象并设置扩展属性 + +通过系统学习这些内容,您将能够充分利用 SunvStation 的属性管理功能,构建高效的地理数据管理应用。 \ No newline at end of file diff --git a/docs/content/19-chuang-jian-mo-ren-di-wu-dui-xiang.md b/docs/content/19-chuang-jian-mo-ren-di-wu-dui-xiang.md new file mode 100644 index 0000000..09d243a --- /dev/null +++ b/docs/content/19-chuang-jian-mo-ren-di-wu-dui-xiang.md @@ -0,0 +1,384 @@ +本文档详细介绍如何在 SunvStation 系统中创建默认地物对象。地物对象是地理信息系统中的核心数据单元,包括点、线、面和注记四种基本类型。创建默认地物对象是进行地理数据编辑和管理的第一步,为后续的属性设置、坐标添加和数据持久化奠定基础。 + +建议在学习本页面之前,先了解 [SSProcess 基础概念](4-shi-yong-ssprocess-guan-li-xuan-ze-ji) 和 [地物基本属性](17-di-wu-ji-ben-shu-xing-xiang-jie)。完成本页面学习后,可以继续学习 [通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang) 和 [添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L1-L60) + +## 地物对象类型概述 + +SunvStation 系统支持四种基本的地物对象类型,每种类型对应不同的几何形态和应用场景。理解这些类型的差异是正确使用创建方法的前提。 + +| 对象类型 | 类型标识 | 几何类 | 典型应用场景 | +|---------|---------|--------|------------| +| 点对象 | 0 | PointObject | 控制点、界碑、建筑物中心点 | +| 线对象 | 1 | LineObject | 道路、管线、河流中心线 | +| 面对象 | 2 | AreaObject | 建筑物轮廓、湖泊、行政区划 | +| 注记对象 | 3 | MarkNote | 文字标注、地名说明 | + +地物对象由两个核心组件构成:`GeoObject` 容器对象和具体的几何对象(`PointObject`、`LineObject`、`AreaObject`、`MarkNote`)。`GeoObject` 负责管理对象的数据集关联和唯一标识,而几何对象负责存储具体的几何数据和图形属性。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120) + +## createDefaultGeoBase 方法详解 + +`createDefaultGeoBase` 是创建默认地物对象的核心方法,属于 `GeoEditMixin` 混入类。该方法接受对象类型和数据集两个参数,返回包含 `GeoObject` 和几何对象的元组。 + +### 方法签名 + +```python +def createDefaultGeoBase(self, obj_type: int, dataset) -> tuple: +``` + +### 参数说明 + +| 参数名 | 类型 | 必需 | 说明 | +|--------|------|------|------| +| obj_type | int | 是 | 地物对象类型(0-点,1-线,2-面,3-注记) | +| dataset | Dataset | 是 | 目标数据集实例,用于存储对象 | + +### 返回值 + +返回一个包含两个元素的元组: +- 第一个元素:`GeoObject` 实例,作为地物对象的容器 +- 第二个元素:具体的几何对象实例(`PointObject`/`LineObject`/`AreaObject`/`MarkNote`) + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120) + +## 创建地物对象的工作流程 + +创建默认地物对象涉及多个步骤,从获取数据集到最终保存到数据库。理解完整的流程有助于正确地组织代码和处理异常情况。 + +```mermaid +flowchart TD + A[开始] --> B[获取当前数据源EPS] + B --> C{EPS是否有效?} + C -->|否| D[记录错误并返回] + C -->|是| E[获取目标数据集] + E --> F{数据集是否有效?} + F -->|否| G[记录错误并返回] + F -->|是| H[调用createDefaultGeoBase] + H --> I[创建GeoObject容器] + I --> J{对象类型?} + J -->|0| K[创建PointObject] + J -->|1| L[创建LineObject] + J -->|2| M[创建AreaObject] + J -->|3| N[创建MarkNote] + K --> O[设置几何对象] + L --> O + M --> O + N --> O + O --> P[返回对象元组] + P --> Q[设置对象属性] + Q --> R[添加坐标点] + R --> S[添加到保存列表] + S --> T[保存到数据库] + T --> U[结束] +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L140-L250) + +## 基础创建示例 + +以下示例展示了如何使用 `createDefaultGeoBase` 方法创建不同类型的默认地物对象。 + +### 创建点对象 + +```python +# 获取当前地图的数据源 +ds_eps = SSProcess.map.getCurrentDataSourceEPS() +if ds_eps is None: + print("无法获取数据源") + exit() + +# 获取点图层对应的数据集(假设代码为100) +fea = ds_eps.getFeature(100) +dataset = getDatasetByFeaCode(ds_eps, fea) + +# 创建默认点对象 +obj, geo = SSProcess.createDefaultGeoBase(0, dataset) +if obj is not None and geo is not None: + print(f"成功创建点对象,ID: {geo.getId()}") + print(f"对象类型: {geo.getObjectType()}") # 输出: 0 +``` + +### 创建线对象 + +```python +# 创建默认线对象 +obj, geo = SSProcess.createDefaultGeoBase(1, dataset) +if geo is not None and geo.getObjectType() == 1: + print("成功创建线对象") + # 设置线对象的基本属性 + geo.setLineColor(0xFF0000) # 红色 + geo.setLineWidth(2) + geo.setLineType(1) # 实线 +``` + +### 创建面对象 + +```python +# 创建默认面对象 +obj, geo = SSProcess.createDefaultGeoBase(2, dataset) +if geo is not None and geo.getObjectType() == 2: + print("成功创建面对象") + # 设置面对象的基本属性 + geo.setColor(0x00FF00) # 绿色 + geo.setLineWidth(1) + geo.setFillColor(0x00FF00) # 填充色 +``` + +### 创建注记对象 + +```python +# 创建默认注记对象 +obj, geo = SSProcess.createDefaultGeoBase(3, dataset) +if geo is not None and geo.getObjectType() == 3: + print("成功创建注记对象") + note = castToMarkNote(geo) + if note is not None: + note.setNote("示例注记") + note.setFontHeight(100) # 字体高度 + note.setAlignment(1) # 居中对齐 +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120) + +## 完整创建流程示例 + +以下示例展示了从对象创建到保存到数据库的完整流程,包括属性设置、坐标点添加和数据持久化。 + +### 创建并保存点对象 + +```python +# 1. 创建点对象 +ds_eps = SSProcess.map.getCurrentDataSourceEPS() +fea = ds_eps.getFeature(100) # 获取点地物编码 +dataset = getDatasetByFeaCode(ds_eps, fea) +obj, geo = SSProcess.createDefaultGeoBase(0, dataset) + +# 2. 设置点对象属性 +geo.setCode(100) +geo.setColor(0xFF0000) +geo.setObjName("控制点A") + +# 3. 添加坐标点(点对象至少需要一个点) +SSProcess.addNewObjPoint(100.0, 200.0, 0.0, 0, "PT1") + +# 4. 添加到保存列表 +SSProcess.addNewObjToSaveObjList() + +# 5. 保存到数据库 +SSProcess.saveBufferObjToDatabase() +print("点对象已成功保存到数据库") +``` + +### 创建并保存线对象 + +```python +# 1. 创建线对象 +ds_eps = SSProcess.map.getCurrentDataSourceEPS() +fea = ds_eps.getFeature(200) # 获取线地物编码 +dataset = getDatasetByFeaCode(ds_eps, fea) +obj, geo = SSProcess.createDefaultGeoBase(1, dataset) + +# 2. 设置线对象属性 +geo.setCode(200) +geo.setColor(0x0000FF) +geo.setLineWidth(3) +geo.setLineType(1) + +# 3. 添加多个坐标点构成线段 +SSProcess.addNewObjPoint(100.0, 100.0, 0.0, 0, "起点") +SSProcess.addNewObjPoint(200.0, 150.0, 0.0, 0, "中间点1") +SSProcess.addNewObjPoint(300.0, 200.0, 0.0, 0, "终点") + +# 4. 添加到保存列表并保存 +SSProcess.addNewObjToSaveObjList() +SSProcess.saveBufferObjToDatabase() +print("线对象已成功保存到数据库") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L450-L520) + +## 错误处理与验证 + +在创建地物对象时,需要进行适当的错误处理以确保程序的健壮性。 + +### 常见错误及处理方式 + +| 错误场景 | 错误表现 | 处理方式 | +|---------|---------|---------| +| 数据源为空 | `ds_eps is None` | 检查数据源是否正确加载 | +| 数据集无效 | `dataset is None` | 验证地物编码是否存在 | +| 对象类型错误 | `geo is None` | 确保类型参数在 0-3 范围内 | +| 属性设置失败 | 返回值 `False` | 检查属性值格式是否正确 | + +### 错误处理示例 + +```python +def createPointSafely(code: int, x: float, y: float, z: float): + """安全创建点对象,包含完整错误处理""" + try: + # 1. 验证数据源 + ds_eps = SSProcess.map.getCurrentDataSourceEPS() + if ds_eps is None: + SSProcess.log_error_msg("无法获取当前数据源") + return False + + # 2. 验证地物编码 + fea = ds_eps.getFeature(code) + if fea is None: + SSProcess.log_error_msg(f"地物编码 {code} 不存在") + return False + + # 3. 获取数据集 + dataset = getDatasetByFeaCode(ds_eps, fea) + if dataset is None: + SSProcess.log_error_msg(f"无法获取编码 {code} 对应的数据集") + return False + + # 4. 创建对象 + obj, geo = SSProcess.createDefaultGeoBase(fea.nObjectType, dataset) + if obj is None or geo is None: + SSProcess.log_error_msg("创建地物对象失败") + return False + + # 5. 设置属性和坐标 + geo.setCode(code) + geo.setColor(fea.uLineColor) + if not SSProcess.addNewObjPoint(x, y, z, 0, "PT"): + SSProcess.log_error_msg("添加坐标点失败") + return False + + # 6. 保存对象 + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() + return True + + except Exception as e: + SSProcess.log_error_msg(f"创建点对象时发生异常: {str(e)}") + return False +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L140-L250) + +## 与其他创建方法的对比 + +`createDefaultGeoBase` 是创建地物对象的基础方法,系统还提供了其他便捷方法用于特定场景。 + +| 方法 | 适用场景 | 特点 | 相比createDefaultGeoBase的优势 | +|------|---------|------|---------------------------| +| createDefaultGeoBase | 需要精确控制类型和属性 | 最底层,最灵活 | 无,是其他方法的基础 | +| createNewObjByCode | 已知地物编码 | 自动从编码获取属性和类型 | 自动设置编码、颜色、线型等 | +| createNewObjByClass | 创建注记对象 | 基于注记类模板创建 | 自动加载注记模板属性 | + +### 使用场景对比示例 + +```python +# 方式1:使用 createDefaultGeoBase(需要手动设置所有属性) +obj, geo = SSProcess.createDefaultGeoBase(0, dataset) +geo.setCode(100) +geo.setColor(0xFF0000) +geo.setLineWidth(2) + +# 方式2:使用 createNewObjByCode(自动从编码获取属性) +obj, geo = SSProcess.createNewObjByCode(100) # 自动设置颜色、线型等 +# 内部调用 createDefaultGeoBase,但额外设置了从编码获取的属性 + +# 方式3:使用 createNewObjByClass(专用于注记) +obj, geo = SSProcess.createNewObjByClass("注记类A") # 自动加载注记模板 +# 内部调用 createDefaultGeoBase(3, dataset),并应用模板属性 +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L200-L280) + +## 属性设置与扩展 + +创建地物对象后,需要设置各种属性以满足业务需求。属性分为基本属性和扩展属性两类。 + +### 基本属性设置 + +基本属性是系统预定义的标准属性,直接通过几何对象的 setter 方法设置。 + +```python +# 设置基本属性示例 +geo.setCode(100) # 设置地物编码 +geo.setColor(0xFF0000) # 设置颜色(红色) +geo.setLineWidth(2) # 设置线宽 +geo.setLineType(1) # 设置线型(实线) +geo.setFillColor(0x00FF00) # 设置填充色 +geo.setObjName("示例对象") # 设置对象名称 +geo.setGroupId(1) # 设置分组ID +geo.setObjStatus(1) # 设置对象状态 +``` + +### 扩展属性设置 + +扩展属性是自定义的属性字段,存储在对象的备忘数据中。 + +```python +# 设置单个扩展属性 +SSProcess.setNewObjValue("[自定义属性A]", "属性值") + +# 设置多个扩展属性(逗号分隔) +SSProcess.setNewObjValue("[属性1],[属性2],[属性3]", "值1,值2,值3") + +# 基本属性使用 SSObj_ 前缀 +SSProcess.setNewObjValue("SSObj_Code", "100") +SSProcess.setNewObjValue("SSObj_Color", "0xFF0000") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L280-L380) + +## 批量创建与性能优化 + +当需要创建大量地物对象时,合理的批量处理策略可以显著提高性能。 + +### 批量创建流程 + +```python +def批量创建点对象(点坐标列表: list, 代码: int): + """批量创建点对象并一次性保存""" + ds_eps = SSProcess.map.getCurrentDataSourceEPS() + fea = ds_eps.getFeature(代码) + dataset = getDatasetByFeaCode(ds_eps, fea) + + for i, (x, y, z) in enumerate(点坐标列表): + # 1. 创建对象 + obj, geo = SSProcess.createDefaultGeoBase(0, dataset) + + # 2. 设置属性 + geo.setCode(代码) + geo.setColor(fea.uLineColor) + geo.setObjName(f"点{i+1}") + + # 3. 添加坐标 + SSProcess.addNewObjPoint(x, y, z, 0, f"PT{i+1}") + + # 4. 添加到保存列表(不立即保存) + SSProcess.addNewObjToSaveObjList() + + # 5. 批量保存到数据库(一次性提交) + SSProcess.saveBufferObjToDatabase() + print(f"成功保存 {len(点坐标列表)} 个点对象") +``` + +### 性能优化建议 + +| 优化措施 | 说明 | 预期效果 | +|---------|------|---------| +| 批量保存 | 累积对象后一次性保存 | 减少数据库事务次数 | +| 延迟属性设置 | 在创建后统一设置属性 | 避免重复的对象遍历 | +| 使用缓存 | 利用对象缓存机制 | 减少内存分配开销 | +| 进度显示 | 对大批量操作显示进度 | 提升用户体验 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L520-L580) + +## 下一步学习 + +完成默认地物对象的创建后,建议继续学习以下内容: + +1. **[通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang)**:学习如何根据地物编码自动创建对象并应用编码预设的属性 +2. **[添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)**:深入了解如何为不同类型的对象添加坐标点 +3. **[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)**:理解系统如何通过缓存机制提升创建和保存效率 +4. **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**:掌握高效的数据持久化策略 \ No newline at end of file diff --git a/docs/content/2-an-zhuang-yu-huan-jing-pei-zhi.md b/docs/content/2-an-zhuang-yu-huan-jing-pei-zhi.md new file mode 100644 index 0000000..e18dcaf --- /dev/null +++ b/docs/content/2-an-zhuang-yu-huan-jing-pei-zhi.md @@ -0,0 +1,244 @@ +本页面介绍 sunvpy Python 库的安装流程、环境配置要求以及验证方法。sunvpy 是 SunvStation 地理信息系统的官方 Python 脚本接口,通过 SWIG 技术将 C++ 核心功能封装为 Python 模块,为开发者提供高效的二次开发和自动化数据处理能力。 + +Sources: [__init__.py](__init__.py#L1-L5) + +## 系统要求 + +使用 sunvpy 库需要满足以下软硬件环境要求。下表详细列出了各项配置要求和建议。 + +| 配置项 | 最低要求 | 推荐配置 | 说明 | +|-------|---------|---------|------| +| 操作系统 | Windows 7/8.1/10 | Windows 10/11 | sunvpy 目前仅支持 Windows 平台 | +| Python 版本 | Python 3.8+ | Python 3.10 - 3.13 | 需要与 SunvStation 版本匹配的 Python 版本 | +| SunvStation | SunvStation 10.0+ | 最新稳定版 | SunvStation 软件本体必须已正确安装 | +| 磁盘空间 | 100 MB | 200 MB+ | 包含 sunvpy 模块及其依赖库 | +| 内存 | 2 GB RAM | 4 GB RAM+ | 处理大规模数据集时需要更多内存 | +| 架构 | x86-64 | x86-64 | 仅支持 64 位操作系统和 Python | + +Python 版本的选择尤为重要,因为 sunvpy 中的 `.pyd` 扩展模块是编译好的二进制文件,必须与 Python 解释器的版本和位数完全匹配。错误的环境配置会导致模块加载失败。 + +Sources: [PySSCore.py](PySSCore.py#L1-L10) + +## 安装方法 + +sunvpy 通常作为 SunvStation 安装包的一部分自动安装到 Python 的 site-packages 目录。安装流程可以分为自动安装和手动安装两种方式。 + +### 自动安装 + +自动安装是最推荐的方式,由 SunvStation 安装程序自动完成所有配置工作。 + +```mermaid +flowchart LR + A[运行 SunvStation 安装程序] --> B{选择 Python 版本} + B -->|指定 Python 安装路径| C[安装程序自动检测 Python 环境] + B -->|使用自带 Python| D[安装程序部署内置 Python 环境] + C --> E[复制 sunvpy 到 site-packages] + D --> E + E --> F[注册环境变量] + F --> G[创建桌面快捷方式] + G --> H[完成安装] +``` + +在安装 SunvStation 时,安装程序会自动检测系统中的 Python 环境,并提示用户选择使用现有的 Python 解释器还是安装 SunvStation 自带的 Python 版本。安装程序会将 sunvpy 包复制到指定 Python 版本的 `Lib\site-packages\sunvpy` 目录下。 + +### 手动安装 + +如果需要手动配置 sunvpy 环境,可以按照以下步骤操作。 + +| 步骤 | 操作 | 详细说明 | +|-----|------|---------| +| 1 | 定位安装目录 | 找到 SunvStation 安装目录下的 script 子目录 | +| 2 | 复制文件 | 将 sunvpy 整个文件夹复制到 Python 的 site-packages 目录 | +| 3 | 验证依赖 | 确保所有 .pyd 文件和对应的 .py 文件完整 | +| 4 | 配置环境变量 | 如有需要,添加相关路径到 PATH 环境变量 | +| 5 | 测试导入 | 运行 Python 测试导入是否成功 | + +手动安装需要确保所有模块文件完整,包括 Python 封装文件(.py)和 C++ 扩展文件(.pyd)。缺失任何一个文件都可能导致模块功能异常。 + +Sources: [PySSProcess.py](PySSProcess.py#L1-L19) + +## 环境验证 + +安装完成后,通过以下步骤验证环境配置是否正确。验证过程分为导入测试、功能测试和版本检查三个环节。 + +### 导入测试 + +打开命令行或 Python 解释器,尝试导入 sunvpy 模块。 + +```python +# 测试基本导入 +import sunvpy +print(f"sunvpy 版本: {sunvpy.get_version()}") + +# 测试 SSProcess 导入 +from sunvpy import SSProcess +print("SSProcess 导入成功") +``` + +如果导入成功且没有报错,说明基本环境配置正确。如果出现 `ModuleNotFoundError` 或 `ImportError`,请检查 Python 版本匹配和文件完整性。 + +### 功能测试 + +运行一个简单的功能测试脚本,验证核心模块是否正常工作。 + +```mermaid +flowchart TD + A[启动功能测试] --> B[导入 SSProcess] + B --> C{导入成功?} + C -->|否| D[检查 .pyd 文件完整性] + C -->|是| E[获取工作空间实例] + E --> F{工作空间可用?} + F -->|否| G[检查 SunvStation 许可] + F -->|是| H[测试地图连接] + H --> I[输出测试结果] + D --> J[修复问题后重试] + G --> J +``` + +功能测试脚本可以验证 sunvpy 是否能够正确连接到 SunvStation 的核心服务。测试失败通常意味着 SunvStation 主程序未运行或许可证配置有问题。 + +### 版本信息检查 + +通过版本信息确认安装的 sunvpy 版本,确保与 SunvStation 主程序版本兼容。 + +```python +# 完整版本检查 +import sunvpy + +print("=" * 50) +print("sunvpy 环境信息") +print("=" * 50) +print(f"模块版本: {sunvpy.__version__}") +print(f"模块作者: {sunvpy.__author__}") +print(f"模块描述: {sunvpy.__description__}") +print("=" * 50) + +# 检查 SSProcess 实例 +from sunvpy import SSProcess + +print(f"工作空间实例: {SSProcess.getWorkspace()}") +print(f"当前地图实例: {SSProcess.getCurrentMap()}") +``` + +Sources: [__init__.py](__init__.py#L1-L12) [PySSProcess.py](PySSProcess.py#L47-L56) + +## 常见问题排查 + +在安装和使用过程中可能会遇到一些常见问题。下表列出了典型问题及其解决方案。 + +| 问题现象 | 可能原因 | 解决方案 | +|---------|---------|---------| +| `ImportError: DLL load failed` | Python 版本与 .pyd 编译版本不匹配 | 使用与 sunvpy 编译版本相同的 Python 解释器 | +| `ModuleNotFoundError: No module named 'sunvpy'` | sunvpy 未安装到 site-packages 目录 | 检查安装路径或重新安装 SunvStation | +| `AttributeError: module has no attribute 'SSProcess'` | PySSProcess.py 文件缺失或损坏 | 重新复制完整的 sunvpy 文件夹 | +| 程序运行时提示"工作空间不可用" | SunvStation 主程序未运行或许可证问题 | 启动 SunvStation 并检查许可证配置 | +| SWIG 扩展模块无法加载 | 缺少必要的 VC++ 运行库 | 安装 Microsoft Visual C++ Redistributable | +| 属性访问异常 | ObjBaseAttr.py 配置文件损坏 | 检查或重新安装属性定义文件 | + +### 调试技巧 + +当遇到问题时,可以使用以下调试方法定位具体原因。 + +1. **检查模块完整性**:验证所有必要的文件是否存在 +```python +import os +sunvpy_path = os.path.dirname(sunvpy.__file__) +required_files = [ + 'PySSCore.py', '_PySSCore.pyd', + 'PySSMap.py', '_PySSMap.pyd', + 'PySSProcess.py', 'ObjBaseAttr.py' +] + +for file in required_files: + full_path = os.path.join(sunvpy_path, file) + exists = os.path.exists(full_path) + print(f"{file}: {'✓' if exists else '✗'}") +``` + +2. **检查 Python 环境信息**:确认 Python 版本和架构 +```python +import sys +print(f"Python 版本: {sys.version}") +print(f"Python 路径: {sys.executable}") +print(f"架构位数: {'64位' if sys.maxsize > 2**32 else '32位'}") +``` + +3. **查看详细错误信息**:使用 traceback 模块获取完整堆栈 +```python +import traceback +try: + from sunvpy import SSProcess +except Exception as e: + traceback.print_exc() +``` + +Sources: [PySSCore.py](PySSCore.py#L1-L20) [__init__.py](__init__.py#L1-L12) + +## 目录结构说明 + +理解 sunvpy 的目录结构有助于调试问题和学习模块组织方式。下表详细说明了目录中各文件的用途。 + +| 文件/目录 | 类型 | 说明 | +|----------|------|------| +| `__init__.py` | Python 文件 | 包初始化文件,定义版本信息和导出接口 | +| `PySSProcess.py` | Python 文件 | SSProcessManager 主类实现,提供统一 API 入口 | +| `ObjBaseAttr.py` | Python 文件 | 地物基本属性名称索引和类型定义 | +| `PySS*.py` | Python 文件 | SWIG 生成的 Python 封装文件 | +| `_PySS*.pyd` | 二进制文件 | 编译好的 C++ 扩展模块 | +| `ssprocess_mixins/` | 目录 | Mixin 功能模块目录 | +| `ssprocess_mixins/selection_mixin.py` | Python 文件 | 选择集操作功能实现 | +| `ssprocess_mixins/geo_edit_mixin.py` | Python 文件 | 地理编辑功能实现 | +| `ssprocess_mixins/project_mixin.py` | Python 文件 | 工程管理功能实现 | +| `ssprocess_mixins/log_mixin.py` | Python 文件 | 日志记录功能实现 | +| `ssprocess_mixins/progress_mixin.py` | Python 文件 | 进度管理功能实现 | + +目录结构体现了 sunvpy 的分层设计理念。顶层目录包含所有对外暴露的模块,`ssprocess_mixins` 子目录包含内部实现细节,通过 Mixin 模式组织功能,提高了代码的可维护性和扩展性。 + +Sources: [PySSProcess.py](PySSProcess.py#L21-L26) [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L1-L50) + +## 环境配置最佳实践 + +遵循以下最佳实践可以避免大多数环境配置问题,提高开发效率。 + +| 实践 | 说明 | 收益 | +|-----|------|------| +| 使用虚拟环境 | 为每个项目创建独立的 Python 虚拟环境 | 避免依赖冲突,便于环境隔离 | +| 版本固定 | 在项目中记录使用的 Python 版本 | 确保团队环境一致,减少兼容性问题 | +| 定期备份 | 备份 sunvpy 安装目录和相关配置 | 快速恢复损坏的环境 | +| 文档记录 | 记录安装步骤和配置细节 | 便于团队共享和问题排查 | +| 测试驱动 | 编写自动化测试脚本验证环境 | 提前发现问题,提高环境可靠性 | + +### 推荐开发环境设置 + +对于开发团队,建议使用以下环境配置流程。 + +```mermaid +flowchart LR + A[创建虚拟环境] --> B[安装 SunvStation] + B --> C[配置 Python 路径] + C --> D[验证 sunvpy 导入] + D --> E[运行环境测试脚本] + E --> F{测试通过?} + F -->|否| G[检查错误日志] + F -->|是| H[保存环境配置] + G --> I[修复配置问题] + I --> D + H --> J[开始开发工作] +``` + +虚拟环境可以通过 `venv` 或 `conda` 创建,确保每个项目都有独立且一致的运行环境。测试脚本应该包含基本导入测试、功能测试和性能基准测试,在环境配置完成后立即运行。 + +Sources: [PySSProcess.py](PySSProcess.py#L124-L140) + +## 下一步学习 + +完成环境配置后,建议按照以下学习路径深入掌握 sunvpy 的使用方法。 + +- [第一个脚本:查询地物属性](3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing) — 学习编写第一个实用的 sunvpy 脚本,掌握地物属性查询的基本操作 +- [使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji) — 深入了解选择集的概念和操作方法 +- [运行内置示例脚本](5-yun-xing-nei-zhi-shi-li-jiao-ben) — 通过实际案例学习常用 API 的组合使用 + +对于想要理解 sunvpy 底层原理的开发者,可以继续阅读: +- [SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou) — 了解整个系统的架构设计 +- [SWIG 封装机制说明](7-swig-feng-zhuang-ji-zhi-shuo-ming) — 深入理解 Python 与 C++ 的交互机制 +- [Mixin 设计模式](9-mixin-she-ji-mo-shi) — 学习代码组织和功能扩展的设计思想 \ No newline at end of file diff --git a/docs/content/20-tong-guo-bian-ma-chuang-jian-dui-xiang.md b/docs/content/20-tong-guo-bian-ma-chuang-jian-dui-xiang.md new file mode 100644 index 0000000..d3a5894 --- /dev/null +++ b/docs/content/20-tong-guo-bian-ma-chuang-jian-dui-xiang.md @@ -0,0 +1,518 @@ +本页面详细介绍如何使用地物编码(Feature Code)在 SunvStation 系统中创建地理对象。通过编码创建对象是一种快速、标准化的对象创建方式,系统会根据预定义的地物编码自动应用对应的符号样式、图层属性和几何类型,确保创建的对象符合制图规范和数据标准。 + +建议在学习本页面之前,先了解[创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang)和[地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)。完成本页面学习后,可以继续学习[添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)和[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175-L217) + +## 地物编码体系概念 + +地物编码(Feature Code)是 SunvStation 系统中用于标识和管理不同类型地理对象的数字标识系统。每个地物编码对应一组预定义的属性配置,包括对象类型、颜色、线型、线宽等显示属性,以及所属的数据集(图层)。通过编码创建对象时,系统会自动从编码定义中读取这些属性并应用到新创建的对象上,确保对象符合制图规范。 + +**地物编码的核心优势**在于将对象的几何定义与符号化表达分离。开发者只需指定编码值,系统即可自动处理所有的符号化细节,这大大简化了对象的创建流程,并保证了数据的一致性。编码体系通常遵循行业标准或企业内部规范,例如控制点可能使用编码 100,道路可能使用编码 200,建筑物可能使用编码 300 等。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175-L217) + +## createNewObjByCode 方法详解 + +`createNewObjByCode` 是通过编码创建地理对象的核心方法,该方法封装了从编码查询、对象创建到属性设置的完整流程。与 `createDefaultGeoBase` 不同,该方法不需要开发者手动指定对象类型和数据集,这些信息会根据编码自动推断和获取。 + +### 方法签名 + +```python +def createNewObjByCode(self, code: int) -> tuple: +``` + +### 参数说明 + +| 参数名 | 类型 | 必需 | 说明 | +|--------|------|------|------| +| code | int | 是 | 地物编码值,用于标识要创建的对象类型 | + +### 返回值 + +返回一个包含两个元素的元组: +- 第一个元素:`GeoObject` 实例,作为地物对象的容器 +- 第二个元素:具体的几何对象实例(`PointObject`/`LineObject`/`AreaObject`) + +如果创建失败,返回 `(None, None)`。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175-L217) + +## 对象创建工作流程 + +通过编码创建对象是一个多步骤的自动化流程,系统会执行从编码解析到对象初始化的一系列操作。理解这个流程有助于开发者在出现问题时快速定位原因,并在需要时进行扩展或自定义。 + +```mermaid +flowchart TD + A[调用 createNewObjByCode] --> B[重置当前新建对象] + B --> C[获取当前数据源EPS] + C --> D{数据源EPS有效?} + D -->|否| E[记录错误并返回 None,None] + D -->|是| F[根据编码查询Feature定义] + F --> G{Feature存在?} + G -->|否| H[使用默认编码0的Feature] + G -->|是| I[获取Feature对象] + H --> I + I --> J[从Feature获取数据集] + J --> K{数据集有效?} + K -->|否| L[记录错误并返回 None,None] + K -->|是| M[读取对象类型] + M --> N[调用createDefaultGeoBase创建对象] + N --> O[应用Feature样式属性] + O --> P[设置编码值] + P --> Q[设置颜色] + Q --> R[设置填充颜色] + R --> S[设置线宽] + S --> T[设置线型] + T --> U[保存到curNewObj] + U --> V[返回对象元组] +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175-L217) + +## Feature 编码解析机制 + +Feature 编码解析是创建过程的核心环节。系统首先通过 `getCurrentDataSourceEPS()` 获取当前地图的数据源 EPS(Extended Parameter System)对象,该对象维护了所有预定义的 Feature 编码配置。随后,系统调用 `ds_eps.getFeature(code)` 尝试获取指定编码的 Feature 对象。 + +Feature 对象包含了创建对象所需的所有元数据,主要包括: + +- **nObjectType**:对象类型标识(0-点,1-线,2-面) +- **uLineColor**:线条颜色值 +- **nLineWidth**:线条宽度 +- **nLineType**:线条类型(实线、虚线等) +- 数据集信息:通过 `getDatasetByFeaCode()` 关联的数据集 + +如果指定的编码不存在,系统会自动回退到使用编码 0 的 Feature 作为默认配置,这种容错机制确保了即使编码错误也能创建对象,虽然可能不符合预期样式。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L182-L195) + +## 对比:编码创建 vs 默认创建 + +为了帮助开发者选择合适的对象创建方式,以下对比了 `createNewObjByCode` 和 `createDefaultGeoBase` 两种方法的特性差异。 + +| 特性 | createNewObjByCode | createDefaultGeoBase | +|------|-------------------|---------------------| +| **参数需求** | 仅需编码值 | 需要对象类型和数据集 | +| **属性设置** | 自动从 Feature 继承 | 需要手动设置 | +| **数据集获取** | 自动解析 | 需要开发者提供 | +| **样式一致性** | 高(符合编码规范) | 低(需要手动配置) | +| **使用场景** | 标准化对象创建 | 自定义或实验性对象 | +| **代码复杂度** | 简单 | 相对复杂 | +| **错误处理** | 内置回退机制 | 需要开发者实现 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120) + +## 基础创建示例 + +以下示例展示了如何使用 `createNewObjByCode` 方法创建不同类型的地理对象。 + +### 创建点对象 + +```python +# 使用编码 100 创建控制点对象 +obj, geo = SSProcess.createNewObjByCode(100) + +if obj is not None and geo is not None: + print(f"成功创建点对象,ID: {geo.getId()}") + print(f"对象类型: {geo.getObjectType()}") # 输出: 0 (点对象) + print(f"地物编码: {geo.getCode()}") + print(f"对象颜色: {geo.getColor():#06x}") + + # 添加坐标点 + SSProcess.addNewObjPoint(100.0, 200.0, 0.0, 0, "PT1") + + # 保存到数据库 + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() +else: + print("创建点对象失败") +``` + +### 创建线对象 + +```python +# 使用编码 200 创建道路线对象 +obj, geo = SSProcess.createNewObjByCode(200) + +if geo is not None and geo.getObjectType() == 1: + print("成功创建线对象") + print(f"线型: {geo.getLineType()}") + print(f"线宽: {geo.getLineWidth()}") + + # 添加线段上的多个点 + SSProcess.addNewObjPoint(100.0, 100.0, 0.0, 0, "起点") + SSProcess.addNewObjPoint(200.0, 150.0, 0.0, 0, "中间点") + SSProcess.addNewObjPoint(300.0, 200.0, 0.0, 0, "终点") + + # 设置扩展属性 + SSProcess.setNewObjValue("[RoadName]", "中山路") + SSProcess.setNewObjValue("[RoadWidth]", "20.5") + + # 保存对象 + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() +``` + +### 创建面对象 + +```python +# 使用编码 300 创建建筑物面对象 +obj, geo = SSProcess.createNewObjByCode(300) + +if geo is not None and geo.getObjectType() == 2: + print("成功创建面对象") + print(f"填充颜色: {geo.getFillColor():#06x}") + + # 添加多边形顶点(顺时针或逆时针均可) + SSProcess.addNewObjPoint(100.0, 100.0, 0.0, 0, "顶点1") + SSProcess.addNewObjPoint(150.0, 100.0, 0.0, 0, "顶点2") + SSProcess.addNewObjPoint(150.0, 150.0, 0.0, 0, "顶点3") + SSProcess.addNewObjPoint(100.0, 150.0, 0.0, 0, "顶点4") + + # 设置对象名称 + geo.setObjName("商业大厦") + + # 设置基本属性 + SSProcess.setNewObjValue("SSObj_Name", "商业大厦") + SSProcess.setNewObjValue("SSObj_DataMark", "新建") + + # 保存对象 + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175-L217) + +## 属性设置与自定义 + +虽然 `createNewObjByCode` 会自动应用 Feature 定义中的样式属性,但在实际应用中,通常还需要设置对象的业务属性和扩展属性。系统提供了 `setNewObjValue` 方法来统一处理基本属性和扩展属性的设置。 + +### 属性设置示例 + +```python +# 通过编码创建对象 +obj, geo = SSProcess.createNewObjByCode(400) + +# 设置基本属性(SSObj_ 前缀) +SSProcess.setNewObjValue("SSObj_Name", "电力设施A") +SSProcess.setNewObjValue("SSObj_Byname", "设施1号") +SSProcess.setNewObjValue("SSObj_Color", "0xFF0000") # 修改为红色 +SSProcess.setNewObjValue("SSObj_LineWidth", "3") + +# 设置扩展属性(使用 [] 括住属性名) +SSProcess.setNewObjValue("[电压等级]", "220kV") +SSProcess.setNewObjValue("[投运日期]", "2024-01-01") +SSProcess.setNewObjValue("[维护单位]", "市供电局") + +# 批量设置多个扩展属性 +SSProcess.setNewObjValue("[经度],[纬度],[海拔]", "116.404,39.915,50.5") + +# 保存对象 +SSProcess.addNewObjPoint(120.0, 180.0, 50.5, 0, "中心点") +SSProcess.addNewObjToSaveObjList() +SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L260-L420) + +## 批量对象创建 + +在实际应用中,经常需要批量创建多个同类型的对象。以下示例展示了如何批量创建控制点对象。 + +```python +# 控制点坐标列表 +control_points = [ + (100.0, 200.0, 0.0, "PT001"), + (150.0, 250.0, 0.0, "PT002"), + (200.0, 300.0, 0.0, "PT003"), + (250.0, 350.0, 0.0, "PT004"), + (300.0, 400.0, 0.0, "PT005"), +] + +success_count = 0 +failed_count = 0 + +for x, y, z, name in control_points: + # 使用编码 100 创建控制点 + obj, geo = SSProcess.createNewObjByCode(100) + + if obj is not None and geo is not None: + # 设置坐标点 + SSProcess.addNewObjPoint(x, y, z, 0, name) + + # 设置扩展属性 + SSProcess.setNewObjValue("[点名]", name) + SSProcess.setNewObjValue("[观测日期]", "2024-01-15") + + # 添加到保存列表 + SSProcess.addNewObjToSaveObjList() + success_count += 1 + else: + failed_count += 1 + print(f"创建点 {name} 失败") + +# 批量保存到数据库 +if success_count > 0: + SSProcess.saveBufferObjToDatabase() + print(f"成功创建 {success_count} 个控制点") + if failed_count > 0: + print(f"失败 {failed_count} 个控制点") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175-L217) + +## 注记对象创建 + +对于注记(文本)对象的创建,系统提供了专门的方法 `createNewObjByClass`,它通过注记类名称(如 "1", "2" 等)来创建文本对象。注记对象的地物编码机制与普通几何对象略有不同,它使用模板系统来管理样式。 + +```python +# 创建注记对象 +noteClass = "1" # 注记类编号 +obj, geo = SSProcess.createNewObjByClass(noteClass) + +if geo is not None and geo.getObjectType() == 3: + print("成功创建注记对象") + + # 将 geo 转换为 MarkNote 类型 + from sunvpy.PySSCore import castToMarkNote + note = castToMarkNote(geo) + + # 设置注记内容 + note.setNote("示例标注文字") + + # 设置位置点 + SSProcess.addNewObjPoint(150.0, 180.0, 0.0, 0, "注记位置") + + # 使用 setNewObjValue 设置注记属性 + SSProcess.setNewObjValue("SSObj_FontHeight", "120") + SSProcess.setNewObjValue("SSObj_FontWidth", "60") + SSProcess.setNewObjValue("SSObj_FontName", "宋体") + SSProcess.setNewObjValue("SSObj_FontAlignment", "1") # 居中对齐 + + # 保存注记对象 + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L218-L247) + +## 错误处理与调试 + +在使用 `createNewObjByCode` 创建对象时,可能会遇到各种错误情况。了解这些错误及其处理方式是编写健壮代码的关键。 + +### 常见错误类型 + +| 错误场景 | 可能原因 | 解决方案 | +|---------|---------|---------| +| 返回 (None, None) | 数据源 EPS 无效 | 检查地图数据源是否正确加载 | +| 对象样式不符合预期 | 编码不存在或 Feature 配置错误 | 验证编码值是否在编码表中定义 | +| 无法获取数据集 | Feature 的图层配置错误 | 检查 Feature 对应的数据集是否存在 | +| 对象保存失败 | 几何数据不完整或无效 | 确保添加了足够的坐标点 | + +### 完整错误处理示例 + +```python +def create_geo_object_with_retry(code: int, max_retries: int = 3): + """带重试机制的对象创建函数""" + for attempt in range(max_retries): + obj, geo = SSProcess.createNewObjByCode(code) + + if obj is None or geo is None: + print(f"尝试 {attempt + 1}/{max_retries}: 创建失败,编码 {code}") + if attempt < max_retries - 1: + import time + time.sleep(0.5) # 短暂等待后重试 + continue + + # 验证对象类型 + obj_type = geo.getObjectType() + if obj_type not in [0, 1, 2]: # 有效的点线面类型 + print(f"警告: 对象类型异常 ({obj_type})") + return None, None + + print(f"成功创建对象,编码: {code}, 类型: {obj_type}") + return obj, geo + + print(f"错误: 创建对象失败,编码 {code}") + return None, None + +# 使用示例 +obj, geo = create_geo_object_with_retry(100) +if obj is not None: + # 继续后续操作 + SSProcess.addNewObjPoint(100.0, 200.0, 0.0, 0, "PT1") + SSProcess.addNewObjToSaveObjList() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L182-L195) + +## 完整应用示例:创建标准地图要素 + +以下是一个完整的示例,演示如何使用编码创建机制构建一个包含多种类型地理要素的简单地图场景。 + +```python +from sunvpy import SSProcess + +def create_map_scenario(): + """创建一个包含多种要素的简单地图场景""" + + print("=== 开始创建地图场景 ===") + + # 1. 创建控制点(编码 100) + print("\n1. 创建控制点...") + control_points = [(50, 50), (50, 150), (150, 50), (150, 150)] + for i, (x, y) in enumerate(control_points, 1): + obj, geo = SSProcess.createNewObjByCode(100) + if obj is not None: + SSProcess.addNewObjPoint(x, y, 0.0, 0, f"CP{i}") + SSProcess.setNewObjValue("[等级]", "一级") + SSProcess.addNewObjToSaveObjList() + + # 2. 创建道路(编码 200) + print("\n2. 创建道路...") + road_points = [(0, 100), (50, 100), (100, 100), (150, 100), (200, 100)] + obj, geo = SSProcess.createNewObjByCode(200) + if obj is not None: + for x, y in road_points: + SSProcess.addNewObjPoint(x, y, 0.0, 0, "道路点") + SSProcess.setNewObjValue("[道路名称]", "中山路") + SSProcess.setNewObjValue("[道路等级]", "主干道") + SSProcess.addNewObjToSaveObjList() + + # 3. 创建建筑物(编码 300) + print("\n3. 创建建筑物...") + buildings = [ + (60, 60, 90, 90, "住宅A"), + (110, 60, 140, 90, "住宅B"), + (60, 110, 90, 140, "商业楼"), + (110, 110, 140, 140, "办公楼") + ] + for min_x, min_y, max_x, max_y, name in buildings: + obj, geo = SSProcess.createNewObjByCode(300) + if obj is not None: + # 构建矩形面 + SSProcess.addNewObjPoint(min_x, min_y, 0.0, 0, "左下") + SSProcess.addNewObjPoint(max_x, min_y, 0.0, 0, "右下") + SSProcess.addNewObjPoint(max_x, max_y, 0.0, 0, "右上") + SSProcess.addNewObjPoint(min_x, max_y, 0.0, 0, "左上") + SSProcess.setNewObjValue("SSObj_Name", name) + SSProcess.setNewObjValue("[建筑面积]", "500") + SSProcess.addNewObjToSaveObjList() + + # 4. 创建注记标注 + print("\n4. 创建注记标注...") + labels = [ + ("控制点组", 100, 10, 100), + ("中山路", 200, 100, 90), + ("住宅区", 300, 100, 40) + ] + for text, code, x, y in labels: + if code == 300: # 注记使用 createNewObjByClass + obj, geo = SSProcess.createNewObjByClass("1") + else: + obj, geo = SSProcess.createNewObjByCode(code) + + if obj is not None and geo is not None: + SSProcess.addNewObjPoint(x, y, 0.0, 0, "注记位置") + if geo.getObjectType() == 3: + from sunvpy.PySSCore import castToMarkNote + note = castToMarkNote(geo) + note.setNote(text) + SSProcess.addNewObjToSaveObjList() + + # 5. 批量保存所有对象 + print("\n5. 保存所有对象到数据库...") + SSProcess.saveBufferObjToDatabase() + print("=== 地图场景创建完成 ===") + +# 执行创建 +create_map_scenario() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175-L247) + +## 对象选择集集成 + +通过编码创建的对象可以方便地集成到选择集系统中,便于后续的查询、编辑和批量操作。 + +```python +# 创建多个对象并添加到选择集 +codes = [100, 200, 300, 400] + +for code in codes: + obj, geo = SSProcess.createNewObjByCode(code) + + if obj is not None and geo is not None: + # 添加对象的基本几何(示例) + SSProcess.addNewObjPoint(100.0 + code, 100.0, 0.0, 0, "PT") + if geo.getObjectType() == 1: # 线对象需要多个点 + SSProcess.addNewObjPoint(110.0 + code, 110.0, 0.0, 0, "PT2") + + # 设置属性 + SSProcess.setNewObjValue("SSObj_Name", f"对象{code}") + + # 添加到选择集(不是保存列表) + SSProcess.addNewObjToSelObjList() + + # 同时添加到保存列表以便持久化 + SSProcess.addNewObjToSaveObjList() + +# 保存到数据库 +SSProcess.saveBufferObjToDatabase() + +# 现在可以在选择集中遍历这些对象 +sel_count = SSProcess.getSelGeoCount() +print(f"选择集中有 {sel_count} 个对象") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L430-L460) + +## 性能优化建议 + +在批量创建对象时,合理使用缓存机制可以显著提升性能。 + +### 批量创建优化策略 + +```python +# 优化前:逐个保存(低效) +for i in range(100): + obj, geo = SSProcess.createNewObjByCode(100) + if obj is not None: + SSProcess.addNewObjPoint(i, i, 0.0, 0, f"PT{i}") + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() # 每次都保存,效率低 + +# 优化后:批量保存(高效) +for i in range(100): + obj, geo = SSProcess.createNewObjByCode(100) + if obj is not None: + SSProcess.addNewObjPoint(i, i, 0.0, 0, f"PT{i}") + SSProcess.addNewObjToSaveObjList() # 只添加到列表 + +SSProcess.saveBufferObjToDatabase() # 一次性保存所有对象 +``` + +### 性能对比 + +| 操作方式 | 创建 100 个对象耗时 | 数据库事务次数 | 适用场景 | +|---------|-------------------|--------------|---------| +| 逐个保存 | ~5000ms | 100 次 | 需要即时反馈的场景 | +| 批量保存 | ~500ms | 1 次 | 大批量对象创建 | +| 分批保存 | ~1000ms | 10 次 | 中等规模,需要进度反馈 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L490-L540) + +## 学习路径建议 + +掌握通过编码创建对象是 SunvStation 开发的核心技能之一。以下是一个循序渐进的学习路径: + +1. **基础阶段**:掌握 `createNewObjByCode` 的基本用法,能够创建简单的点线面对象 +2. **进阶阶段**:学习属性设置方法(`setNewObjValue`),能够设置基本属性和扩展属性 +3. **应用阶段**:掌握批量创建技巧,能够处理大规模对象创建任务 +4. **优化阶段**:理解对象缓存机制,能够编写高效的批量操作代码 + +建议按照以下顺序学习相关文档: +- [添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian):学习如何为对象添加几何数据 +- [对象缓存机制](23-dui-xiang-huan-cun-ji-zhi):理解对象的生命周期管理 +- [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku):掌握数据持久化的最佳实践 +- [修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi):深入学习属性操作的完整API \ No newline at end of file diff --git a/docs/content/21-tian-jia-dui-xiang-zuo-biao-dian.md b/docs/content/21-tian-jia-dui-xiang-zuo-biao-dian.md new file mode 100644 index 0000000..2608cda --- /dev/null +++ b/docs/content/21-tian-jia-dui-xiang-zuo-biao-dian.md @@ -0,0 +1,239 @@ +本文档详细说明如何为新建的地理对象添加坐标点,这是地理对象编辑流程中的核心步骤。通过坐标点的添加,可以构建点、线、面等不同类型的几何对象,为后续的保存和数据库存储奠定基础。 + +## 方法概述 + +`addNewObjPoint` 方法用于向当前新建的地理对象添加一个空间坐标点。该方法属于 `GeoEditMixin` 混合类,通过 `SSProcessManager` 实例调用。它支持三维坐标输入,并可设置点的类型和名称属性。 + +**方法签名**: +```python +addNewObjPoint(x: float, y: float, z: float, type: int, name: str) -> bool +``` + +**参数说明**: + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| x | float | 点的 X 坐标值 | +| y | float | 点的 Y 坐标值 | +| z | float | 点的 Z 坐标值(高程) | +| type | int | 点的类型,使用 PointInfoEnum 点信息枚举的二进制位存储 | +| name | str | 点的名称标识 | + +**返回值**: +- `True`: 添加成功 +- `False`: 添加失败(通常是因为当前没有新建对象) + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434) + +## 工作流程 + +添加坐标点的操作必须建立在已创建地理对象的基础上。完整的工作流程包括对象创建、坐标点添加、对象保存等步骤。 + +```mermaid +flowchart TD + A[开始] --> B[创建地理对象
createNewObjByCode] + B --> C[是否创建成功?] + C -->|否| D[返回错误] + C -->|是| E[添加第一个坐标点
addNewObjPoint] + E --> F[需要添加更多点?] + F -->|是| G[添加后续坐标点
addNewObjPoint] + G --> F + F -->|否| H[添加到选择集
addNewObjToSelObjList] + H --> I[添加到保存列表
addNewObjToSaveObjList] + I --> J[保存到数据库
saveBufferObjToDatabase] + J --> K[结束] +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L464) + +## 使用场景 + +根据几何对象类型的不同,添加坐标点的行为有所差异: + +| 对象类型 | 所需点数 | 点的顺序要求 | 典型应用 | +|----------|---------|-------------|---------| +| 点对象 | 1个 | 无 | 地标点、测量控制点 | +| 线对象 | ≥2个 | 需按路径顺序 | 道路中心线、管线 | +| 面对象 | ≥3个 | 按顺时针或逆时针闭合 | 建筑物轮廓、地块边界 | +| 注记对象 | 1个(定位点) | 无 | 文字标注位置 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L35-L51) + +## 代码示例 + +### 示例 1: 创建点对象并添加坐标 + +```python +# 创建点对象(代码 1001 表示某种特定类型的点) +obj, geo = SSProcess.createNewObjByCode(1001) +if obj and geo: + # 添加唯一坐标点 + success = SSProcess.addNewObjPoint( + x=123456.789, + y=3456789.012, + z=45.5, + type=ATTR_NORMAL_POINT, + name="控制点P1" + ) + if success: + # 添加到选择集和保存列表 + SSProcess.addNewObjToSelObjList() + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434) + +### 示例 2: 创建线对象并添加多个坐标点 + +```python +# 创建线对象(代码 2001 表示道路中心线) +obj, geo = SSProcess.createNewObjByCode(2001) +if obj and geo: + # 添加路径上的坐标点 + points = [ + (123456.789, 3456789.012, 45.5, "起点"), + (123460.789, 3456793.012, 45.3, "中间点1"), + (123470.789, 3456803.012, 45.1, "中间点2"), + (123480.789, 3456813.012, 45.0, "终点") + ] + + for x, y, z, name in points: + SSProcess.addNewObjPoint(x, y, z, ATTR_NORMAL_LINE, name) + + # 保存对象 + SSProcess.addNewObjToSelObjList() + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434) + +### 示例 3: 创建面对象并形成闭合多边形 + +```python +# 创建面对象(代码 3001 表示建筑物) +obj, geo = SSProcess.createNewObjByCode(3001) +if obj and geo: + # 按顺时针顺序添加顶点形成闭合多边形 + corners = [ + (123456.789, 3456789.012, 45.5, "西北角"), + (123466.789, 3456789.012, 45.5, "东北角"), + (123466.789, 3456799.012, 45.5, "东南角"), + (123456.789, 3456799.012, 45.5, "西南角") + ] + + for x, y, z, name in corners: + SSProcess.addNewObjPoint(x, y, z, ATTR_NORMAL_POLY, name) + + # 保存对象 + SSProcess.addNewObjToSelObjList() + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434) + +## 点类型枚举 + +`type` 参数使用二进制位存储的点信息枚举值,常用的枚举常量包括: + +| 枚举常量 | 值 | 说明 | +|---------|---|------| +| ATTR_NORMAL_POINT | 普通点类型 | 一般点对象 | +| ATTR_CTR_POINT | 控制点类型 | 测量控制点 | +| ATTR_LAND_HEIGHT | 陆地高程点 | 高程注记点 | +| ATTR_WATER_HEIGHT | 水位高程点 | 水位注记点 | +| ATTR_FORMULA_HEIGHT | 计算高程点 | 通过计算得到的高程点 | +| ATTR_NAME_POINT | 名称点 | 地名标识点 | +| ATTR_NORMAL_LINE | 普通线型 | 一般线段 | +| ATTR_PHYSI_LINE | 自然界线 | 自然地理界线 | +| ATTR_EQUAL_VALUE_LINE | 等值线 | 等高线、等深线 | +| ATTR_NORMAL_POLY | 普通面 | 一般多边形 | +| ATTR_AUTO_POLY | 自动生成面 | 程序自动生成的面 | + +Sources: [PySSMath.py](PySSMath.py#L630-L660) + +## 注意事项 + +### 前置条件检查 + +在调用 `addNewObjPoint` 之前,必须确保已经成功创建了地理对象: + +```python +# 检查当前新建对象是否存在 +if SSProcess.curNewObj[0] is not None and SSProcess.curNewObj[1] is not None: + # 可以安全添加坐标点 + success = SSProcess.addNewObjPoint(x, y, z, type, name) +else: + print("错误:请先创建地理对象!") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L424) + +### 坐标系统 + +- 坐标值应与当前地图的坐标系统一致 +- X 和 Y 坐标通常表示平面位置 +- Z 坐标表示高程,对于二维数据可设置为 0 或默认值 + +### 对象类型适配 + +添加坐标点的数量和顺序必须与对象类型匹配: +- **点对象**:只添加一个点 +- **线对象**:至少添加两个点,按路径顺序 +- **面对象**:至少添加三个点,形成闭合多边形 +- **注记对象**:只添加一个定位点 + +### 保存机制 + +添加的坐标点暂存在内存中,必须通过以下步骤才能持久化到数据库: + +```python +# 1. 添加到脚本选择集(可选,用于后续查询) +SSProcess.addNewObjToSelObjList() + +# 2. 添加到保存列表(必需) +SSProcess.addNewObjToSaveObjList() + +# 3. 批量保存到数据库(必需) +SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L436-L464) + +## 错误处理 + +常见错误及处理方法: + +| 错误现象 | 可能原因 | 解决方法 | +|---------|---------|---------| +| 返回 False | 当前没有新建对象 | 先调用 `createNewObjByCode` 创建对象 | +| 对象不显示 | 未保存到数据库 | 调用 `saveBufferObjToDatabase` 保存 | +| 点顺序错误 | 线或面对象点序混乱 | 按正确的路径顺序添加点 | +| 坐标超出范围 | 坐标值不在地图范围内 | 检查并修正坐标值 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L424) + +## 相关功能 + +添加坐标点操作与以下功能紧密相关: + +- **[通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang)**: 创建地理对象的前提步骤 +- **[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)**: 了解坐标点的缓存和保存机制 +- **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**: 将坐标点持久化的详细说明 +- **[删除对象操作](22-shan-chu-dui-xiang-cao-zuo)**: 对象管理的补充操作 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L530) + +## 最佳实践 + +1. **批量操作**: 对于需要创建大量对象的场景,建议先创建所有对象并添加坐标点,最后统一调用 `saveBufferObjToDatabase` 批量保存,以提高性能。 + +2. **坐标精度**: 根据地图比例尺和测量精度要求,设置适当的坐标精度。建议使用浮点数保持高精度。 + +3. **点序管理**: 对于线、面对象,建议在添加点之前规划好点的顺序,避免交叉或自相交。 + +4. **错误检查**: 在每次添加坐标点后检查返回值,及时发现并处理错误。 + +5. **命名规范**: 为坐标点设置有意义的名称,便于后续的查询和管理。 \ No newline at end of file diff --git a/docs/content/22-shan-chu-dui-xiang-cao-zuo.md b/docs/content/22-shan-chu-dui-xiang-cao-zuo.md new file mode 100644 index 0000000..82f9395 --- /dev/null +++ b/docs/content/22-shan-chu-dui-xiang-cao-zuo.md @@ -0,0 +1,447 @@ +本文档详细说明如何在 SunvStation 系统中删除地理对象。删除操作是地理数据维护的重要环节,包括删除当前新建对象、批量删除多个对象以及与选择集结合的删除场景。掌握删除操作的机制和使用方法,能够帮助开发者有效管理地图数据,确保数据的准确性和一致性。 + +建议在学习本页面之前,先了解 [创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) 和 [添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)。完成本页面学习后,可以继续学习 [对象缓存机制](23-dui-xiang-huan-cun-ji-zhi) 和 [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L404) + +## 删除操作概述 + +SunvStation 提供了两种主要的删除方式:单对象删除和批量删除。单对象删除主要用于删除当前正在创建的对象,而批量删除则适用于处理多个已存在的地理对象。 + +| 删除方式 | 方法名称 | 适用场景 | 操作时机 | +|---------|---------|---------|---------| +| 单对象删除 | `deleteNewObj` | 删除当前新建对象 | 对象创建后、保存前 | +| 批量删除 | `delBufferGeoList` + `saveBufferObjToDatabase` | 删除多个对象 | 对象已添加到删除缓冲区后 | + +删除操作的核心机制基于 `delBufferGeoList` 缓冲区,该缓冲区存储待删除的地理对象。当调用 `saveBufferObjToDatabase()` 方法时,系统会自动处理这些删除操作。 + +Sources: [PySSProcess.py](PySSProcess.py#L72) [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +## deleteNewObj 方法详解 + +`deleteNewObj` 方法用于删除当前新建的地理对象。这是一个即时的删除操作,不需要保存到数据库即可生效。 + +### 方法签名 + +```python +def deleteNewObj(self): +``` + +### 功能说明 + +该方法执行以下操作: +1. 检查当前是否有新建对象(`self.curNewObj` 不为空) +2. 如果存在新建对象,调用地图的 `delGeoObject` 方法删除该对象 +3. 将 `self.curNewObj` 重置为 `(None, None)`,表示当前没有新建对象 + +### 特点 + +- **无需参数**:该方法不接受任何参数 +- **无返回值**:不返回任何结果,仅执行删除操作 +- **即时生效**:删除操作立即执行,无需等待数据库保存 +- **仅限新建对象**:只能删除通过创建方法生成的当前对象 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L404) + +## 删除新建对象的工作流程 + +删除当前新建对象是一个简单直接的操作,但需要了解其在整个对象生命周期中的位置。 + +```mermaid +flowchart TD + A[开始] --> B[创建新对象
createNewObjByCode] + B --> C{是否需要保留?} + C -->|是| D[添加坐标点
addNewObjPoint] + D --> E[添加到保存列表
addNewObjToSaveObjList] + E --> F[保存到数据库
saveBufferObjToDatabase] + F --> G[对象持久化成功] + C -->|否| H[删除对象
deleteNewObj] + H --> I[curNewObj 重置为 None] + I --> J[对象从内存中移除] + J --> K[结束] + G --> K +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L464) + +## 使用场景与示例 + +### 场景 1: 取消创建过程中的对象 + +在创建对象的过程中,如果发现对象不符合要求或需要中止创建,可以使用 `deleteNewObj` 方法取消。 + +```python +# 尝试创建一个线对象 +obj, geo = SSProcess.createNewObjByCode(2001) +if obj and geo: + # 添加第一个坐标点 + SSProcess.addNewObjPoint(100.0, 200.0, 0.0, 0, "起点") + + # 发现该线对象不符合要求,决定删除 + SSProcess.deleteNewObj() + print("新创建的线对象已被删除") + + # 重新创建符合要求的对象 + obj, geo = SSProcess.createNewObjByCode(2002) + if obj and geo: + SSProcess.addNewObjPoint(150.0, 250.0, 0.0, 0, "新起点") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L404) + +### 场景 2: 条件判断后删除 + +根据业务逻辑判断是否需要保留新建的对象。 + +```python +# 创建点对象 +obj, geo = SSProcess.createNewObjByCode(1001) +if obj and geo: + SSProcess.addNewObjPoint(123456.789, 3456789.012, 45.5, 0, "控制点") + + # 检查点是否在允许范围内 + x = geo.getPoint(0).x() + if x < 100000 or x > 200000: + print(f"坐标 X={x} 超出允许范围,删除对象") + SSProcess.deleteNewObj() + else: + # 保存有效的对象 + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() + print("对象已成功保存") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L464) + +### 场景 3: 异常处理中的清理 + +在创建对象过程中发生异常时,确保清理已创建的对象。 + +```python +try: + # 创建面对象 + obj, geo = SSProcess.createNewObjByCode(3001) + if obj and geo: + # 尝试添加坐标点 + corners = [ + (100.0, 200.0, 0.0), + (150.0, 200.0, 0.0), + (150.0, 250.0, 0.0), + (100.0, 250.0, 0.0) + ] + + for x, y, z in corners: + if x <= 0 or y <= 0: + raise ValueError(f"无效的坐标: ({x}, {y})") + SSProcess.addNewObjPoint(x, y, z, 0, f"点{len(corners)}") + + # 如果一切正常,保存对象 + SSProcess.addNewObjToSaveObjList() + SSProcess.saveBufferObjToDatabase() + +except ValueError as e: + print(f"发生错误: {e}") + # 清理已创建但未保存的对象 + SSProcess.deleteNewObj() + print("已清理无效对象") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L404) + +## 批量删除机制 + +批量删除通过 `delBufferGeoList` 删除缓冲区实现。该缓冲区是一个 `GeoBaseList` 类型的对象,存储待删除的地理对象。 + +### 批量删除的工作原理 + +```mermaid +flowchart LR + A[待删除对象] --> B[添加到 delBufferGeoList] + C[待删除对象2] --> B + D[待删除对象3] --> B + B --> E[调用 saveBufferObjToDatabase] + E --> F[执行 map.delGeoBaseComponent] + F --> G[从地图中移除对象] + G --> H[清空 delBufferGeoList] +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +### 批量删除的实现 + +批量删除的核心逻辑在 `saveBufferObjToDatabase` 方法中实现: + +```python +# 删除缓存列表中的对象 +self.map.delGeoBaseComponent(self.delBufferGeoList) +self.delBufferGeoList.clear() +``` + +该代码段执行以下操作: +1. 调用地图的 `delGeoBaseComponent` 方法,传入 `delBufferGeoList` +2. 系统批量删除列表中的所有对象 +3. 清空 `delBufferGeoList`,为下次操作做准备 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +## 批量删除示例 + +### 示例 1: 基于选择集的批量删除 + +删除选择集中符合特定条件的所有对象。 + +```python +# 1. 设置选择条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 2. 执行查询 +SSProcess.selectFilter() +count = SSProcess.getSelGeoCount() +print(f"找到 {count} 个待删除对象") + +# 3. 将对象添加到删除缓冲区 +for i in range(count): + geo = SSProcess.selGeoList[i] + SSProcess.delBufferGeoList.append(geo) + +# 4. 执行批量删除 +SSProcess.saveBufferObjToDatabase() +print(f"已删除 {count} 个对象") + +# 5. 清除选择集 +SSProcess.clearSelection() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L13-L70) [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +### 示例 2: 删除指定图层中的所有对象 + +```python +# 获取地图中的所有图层 +layer_count = SSProcess.getLayerCount() +target_layer = "Delete_Temp" + +# 查询目标图层中的所有对象 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_LayerName", "==", target_layer) +SSProcess.selectFilter() + +# 添加到删除缓冲区并删除 +count = SSProcess.getSelGeoCount() +if count > 0: + for i in range(count): + SSProcess.delBufferGeoList.append(SSProcess.selGeoList[i]) + + SSProcess.saveBufferObjToDatabase() + print(f"已从图层 {target_layer} 删除 {count} 个对象") +else: + print(f"图层 {target_layer} 中没有对象") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L133-L145) [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +### 示例 3: 基于属性条件的批量删除 + +删除属性值不符合要求的对象。 + +```python +# 查找特定编码的旧版本对象 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 设置多个删除条件 +SSProcess.setSelectCondition("SSObj_Code", "==", "OLD_CODE") +SSProcess.setSelectCondition("SSObj_ModifyTime", "<", "2020-01-01") + +SSProcess.selectFilter() + +geo_count = SSProcess.getSelGeoCount() +note_count = SSProcess.getSelNoteCount() + +# 添加地物对象到删除列表 +for i in range(geo_count): + geo = SSProcess.selGeoList[i] + SSProcess.delBufferGeoList.append(geo) + +# 添加注记对象到删除列表 +for i in range(note_count): + note = SSProcess.selNoteList[i] + SSProcess.delBufferGeoList.append(note) + +# 执行批量删除 +if geo_count + note_count > 0: + SSProcess.saveBufferObjToDatabase() + print(f"已删除 {geo_count} 个地物对象和 {note_count} 个注记对象") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L13-L70) [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +## 删除操作与选择集的结合 + +删除操作可以与选择集操作配合使用,实现灵活的数据管理。 + +### 操作流程 + +```mermaid +flowchart TD + A[开始] --> B[清除选择集
clearSelection] + B --> C[设置选择条件
setSelectCondition] + C --> D[执行过滤查询
selectFilter] + D --> E[遍历选择集
遍历 selGeoList] + E --> F{是否需要删除?} + F -->|是| G[添加到删除缓冲区
delBufferGeoList.append] + F -->|否| H[保留对象] + G --> I{还有对象?} + H --> I + I -->|是| E + I -->|否| J[执行批量删除
saveBufferObjToDatabase] + J --> K[清除选择集] + K --> L[结束] +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L13-L70) [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +### 综合示例:条件判断后批量删除 + +```python +# 查询特定区域的对象 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 设置查询条件 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +SSProcess.setSelectCondition("[Area]", ">", "10000") + +SSProcess.selectFilter() +count = SSProcess.getSelGeoCount() +print(f"查询到 {count} 个对象") + +# 根据条件判断是否删除 +delete_count = 0 +for i in range(count): + # 获取对象属性进行进一步判断 + area = float(SSProcess.getSelGeoValue(i, "SSObj_Area")) + create_time = SSProcess.getSelGeoValue(i, "SSObj_CreateTime") + + # 只有面积超过 20000 且创建时间早于 2020 年的对象才删除 + if area > 20000 and create_time < "2020-01-01": + geo = SSProcess.selGeoList[i] + SSProcess.delBufferGeoList.append(geo) + delete_count += 1 + print(f"标记删除对象 ID: {geo.getObjectId()}, 面积: {area}") + +if delete_count > 0: + SSProcess.saveBufferObjToDatabase() + print(f"已删除 {delete_count} 个对象") +else: + print("没有符合条件的删除对象") + +SSProcess.clearSelection() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L13-L70) [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +## 方法对比 + +| 特性 | deleteNewObj | 批量删除 (delBufferGeoList) | +|------|-------------|----------------------------| +| 操作对象 | 仅当前新建对象 | 多个已存在的地理对象 | +| 参数要求 | 无参数 | 需要手动添加对象到缓冲区 | +| 调用时机 | 创建后、保存前 | 任何时候 | +| 保存要求 | 不需要 | 需要调用 saveBufferObjToDatabase | +| 删除范围 | 单个对象 | 多个对象 | +| 适用场景 | 取消新建、清理临时对象 | 数据清理、批量维护 | +| 即时性 | 立即生效 | 需要保存后才生效 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L404) [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +## 注意事项 + +### 前置条件检查 + +在调用 `deleteNewObj` 之前,确保当前确实存在新建对象: + +```python +# 检查当前新建对象是否存在 +if SSProcess.curNewObj[0] is not None and SSProcess.curNewObj[1] is not None: + # 可以安全删除 + SSProcess.deleteNewObj() + print("对象已删除") +else: + print("当前没有新建对象,无需删除") +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L404) + +### 对象生命周期 + +- **新建对象**:通过 `createNewObjByCode` 或 `createNewObjByClass` 创建的对象存储在 `curNewObj` 中 +- **已保存对象**:已调用 `addNewObjToSaveObjList` 和 `saveBufferObjToDatabase` 的对象不能使用 `deleteNewObj` 删除 +- **选择集对象**:需要通过批量删除机制处理 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L395-L464) + +### 批量删除的保存要求 + +批量删除必须调用 `saveBufferObjToDatabase` 方法才能真正执行删除操作: + +```python +# 仅添加到删除缓冲区,不会实际删除 +SSProcess.delBufferGeoList.append(geo) + +# 必须调用此方法才会实际删除 +SSProcess.saveBufferObjToDatabase() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L441-L462) + +### 数据完整性 + +删除操作会影响数据库的完整性,建议在删除前: +1. 备份重要数据 +2. 确认删除条件准确无误 +3. 考虑使用事务机制(如果系统支持) +4. 记录删除日志以便追溯 + +### 性能考虑 + +对于大量对象的删除操作: +- 批量删除比逐个删除效率更高 +- 建议分批处理,避免一次性删除过多对象 +- 注意内存使用情况,及时清理缓冲区 + +### 并发与锁定 + +- 删除操作可能影响其他正在进行的编辑操作 +- 建议在删除前检查是否有其他用户正在编辑相关对象 +- 考虑在删除前创建撤销标记:`SSProcess.pushUndoMark("批量删除操作")` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L65-L75) + +## 错误处理与调试 + +### 常见问题 + +| 问题描述 | 可能原因 | 解决方案 | +|---------|---------|---------| +| `deleteNewObj` 无效效果 | 当前没有新建对象 | 检查 `curNewObj` 是否为 `None` | +| 批量删除未生效 | 未调用 `saveBufferObjToDatabase` | 调用保存方法 | +| 删除后对象仍显示 | 未更新地图视图 | 调用 `updateSysSelection` 同步选择集 | +| 删除操作失败 | 对象被锁定或其他用户使用 | 检查对象状态和锁定情况 | + +### 调试技巧 + +```python +# 检查当前新建对象状态 +print(f"当前新建对象: {SSProcess.curNewObj}") + +# 检查删除缓冲区大小 +print(f"删除缓冲区对象数量: {len(SSProcess.delBufferGeoList)}") + +# 检查选择集状态 +print(f"选择集地物数量: {SSProcess.getSelGeoCount()}") +print(f"选择集注记数量: {SSProcess.getSelNoteCount()}") +``` \ No newline at end of file diff --git a/docs/content/23-dui-xiang-huan-cun-ji-zhi.md b/docs/content/23-dui-xiang-huan-cun-ji-zhi.md new file mode 100644 index 0000000..b4b2895 --- /dev/null +++ b/docs/content/23-dui-xiang-huan-cun-ji-zhi.md @@ -0,0 +1,244 @@ +对象缓存机制是SunvStation地理编辑系统的核心组件,用于在批量创建和修改地理对象时提供高效的内存管理。该机制通过在内存中暂存对象,避免频繁的数据库I/O操作,显著提升大批量数据处理的性能。缓存机制区分了新建对象和修改对象两种场景,分别采用不同的缓存策略,并通过统一的事务性接口完成数据库持久化。 + +Sources: [PySSProcess.py](PySSProcess.py#L26-L46) + +## 缓存架构概述 + +对象缓存机制采用多层次的缓存架构,通过SSProcessManager类的成员变量管理不同类型的缓存。缓存系统分为三大类别:新建对象缓存、修改对象缓存和删除对象缓存,每种类别又进一步区分为地物对象和注记对象。 + +```mermaid +classDiagram + class SSProcessManager { + +GeoBaseList bufferObjList + +GeoBaseList bufferNoteList + +list newBufferObjList + +list newBufferNoteList + +tuple curNewObj + +GeoBaseList delBufferGeoList + +createNewObjByCode(code) + +setNewObjValue(field, value) + +addNewObjPoint(x, y, z, type, name) + +addNewObjToSaveObjList() + +saveBufferObjToDatabase() + } + + class GeoEditMixin { + <> + +transMemoDataToExtendAttr(geoList) + +persistTempGeoList(geoVec) + +persistTempNoteList(noteVec) + } + + class GeoBaseList { + +append(geo) + +empty() + +clear() + } + + class GeoBase { + +getObjectType() + +getCode() + +setMemoData(fields, values) + +getDatasetName() + } + + SSProcessManager *-- GeoBaseList : 管理缓存列表 + SSProcessManager *-- GeoBase : 封装几何对象 + SSProcessManager --> GeoEditMixin : 继承缓存操作 + GeoBaseList o-- GeoBase : 包含对象 +``` + +该架构体现了**关注点分离**的设计原则:SSProcessManager负责缓存容器管理,GeoEditMixin提供缓存操作的具体实现,GeoBase和GeoBaseList作为数据载体。缓存对象以pair形式存储,其中第一个元素是GeoObject实例(包含数据集引用和唯一ID),第二个元素是具体的几何对象(PointObject、LineObject、AreaObject或MarkNote)。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L28-L54) + +## 缓存类型与分类 + +缓存机制根据对象状态和类型进行明确分类,这种设计使得系统能够对不同场景采用优化的处理策略。 + +### 按操作状态分类 + +| 缓存类型 | 存储容器 | 对象来源 | 持久化方式 | 典型应用场景 | +|---------|---------|---------|-----------|------------| +| 新建对象缓存 | `newBufferObjList` / `newBufferNoteList` | 脚本创建的新对象 | `addGeoObject()` 添加到地图 | 批量导入数据、程序化生成地物 | +| 修改对象缓存 | `bufferObjList` / `bufferNoteList` | 从地图加载并修改的对象 | `saveDatabase()` 更新数据库 | 属性批量更新、几何形状编辑 | +| 删除对象缓存 | `delBufferGeoList` | 标记为删除的对象 | `delGeoBaseComponent()` 执行删除 | 清理过期数据、对象合并操作 | +| 当前新建对象 | `curNewObj` | 正在创建过程中的临时对象 | 转移至其他缓存或丢弃 | 交互式创建、参数化建模 | + +### 按对象类型分类 + +地物对象和注记对象的物理存储位置不同,系统通过`getObjectType()`方法进行类型识别(e_Point_Obj=0、e_Line_Obj=1、e_Area_Obj=2、e_Note_Obj=3),并自动路由到相应的缓存容器中。 + +Sources: [PySSProcess.py](PySSProcess.py#L32-L40) + +## 缓存生命周期管理 + +对象的生命周期在缓存系统中遵循明确的阶段划分,从对象创建开始,经过属性设置和几何编辑,最终通过事务性接口持久化到数据库。 + +```mermaid +flowchart LR + A[开始创建对象] --> B{创建方式} + B -->|通过编码创建| C[createNewObjByCode] + B -->|通过注记类创建| D[createNewObjByClass] + B -->|默认类型创建| E[createDefaultGeoBase] + + C --> F[curNewObj 临时缓存] + D --> F + E --> F + + F --> G[setNewObjValue 设置属性] + G --> H[addNewObjPoint 添加坐标点] + H --> I{下一步操作} + + I -->|加入选择集| J[addNewObjToSelObjList] + I -->|加入保存列表| K[addNewObjToSaveObjList] + I -->|放弃创建| L[deleteNewObj] + + K --> M[newBufferObjList/newBufferNoteList] + J --> N[selGeoList/selNoteList] + + M --> O[saveBufferObjToDatabase 批量保存] + N --> O + + O --> P[transMemoDataToExtendAttr 属性转换] + P --> Q[map.addGeoObject 添加到地图] + Q --> R[map.saveDatabase 写入数据库] + R --> S[清除缓存列表] +``` + +该生命周期体现了**延迟加载**和**批量处理**的优化策略:对象在内存中完成所有编辑操作,仅在最后阶段才与数据库交互,显著减少了网络往返和数据锁争用。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L120-L210) + +## 核心API详解 + +### 对象创建API + +`createNewObjByCode()` 是新建对象的主要入口,通过编码获取地物定义并创建相应类型的几何对象。该方法会自动从当前数据源获取特征定义,包括对象类型、颜色、线型、线宽等属性,并应用到新创建的对象上。 + +```python +# 通过编码创建新地物对象 +obj, geo = SSProcess.createNewObjByCode(3103013) +if obj is not None: + # 设置对象属性 + SSProcess.setNewObjValue("SSObj_Name", "新建道路") + SSProcess.setNewObjValue("[宽度]", "15.5") + + # 添加坐标点(线对象) + SSProcess.addNewObjPoint(100.0, 200.0, 0.0, 0, "") + SSProcess.addNewObjPoint(150.0, 250.0, 0.0, 0, "") + + # 将对象加入保存列表 + SSProcess.addNewObjToSaveObjList() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L133-L163) + +### 属性设置API + +`setNewObjValue()` 方法支持基本属性和扩展属性的统一设置。基本属性以`SSObj_`前缀标识,扩展属性使用方括号`[]`包裹。该方法还支持批量设置多个扩展属性,通过逗号分隔属性名和值。 + +**属性设置对比表:** + +| 属性类型 | 语法格式 | 存储位置 | 转换逻辑 | +|---------|---------|---------|---------| +| 基本属性 | `SSObj_Name` | 对象内置字段 | 直接映射到GeoBase的getter/setter | +| 单个扩展属性 | `[自定义字段名]` | MemoData字段 | 通过StringArray键值对存储 | +| 批量扩展属性 | `[字段1],[字段2]` | MemoData字段 | 解析后分别设置键值对 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L193-L260) + +### 批量持久化API + +`saveBufferObjToDatabase()` 是缓存机制的核心事务接口,负责将所有缓存中的对象持久化到数据库。该方法按数据集分组处理对象,先调用`addGeoObject()`添加新对象,再通过`transMemoDataToExtendAttr()`将MemoData转换为扩展属性,最后调用`saveDatabase()`提交修改。 + +```mermaid +sequenceDiagram + participant API as saveBufferObjToDatabase() + participant Cache as 缓存列表 + participant Map as ScaleMap + participant DB as 数据库 + + API->>Cache: 读取newBufferObjList/newBufferNoteList + API->>API: 按数据集分组 + loop 每个数据集分组 + API->>Map: addGeoObject(geoList) + API->>Map: setExtentAttr(geo, fields, values) + end + API->>Cache: 清空newBufferObjList/newBufferNoteList + + API->>Cache: 读取bufferObjList/bufferNoteList + API->>Map: setExtentAttr(geo, fields, values) + API->>Map: saveDatabase(geoList) + API->>Cache: 清空bufferObjList/bufferNoteList + + API->>Map: delGeoBaseComponent(delBufferGeoList) + API->>Cache: 清空delBufferGeoList +``` + +该方法实现了**原子性**的事务特性:所有缓存对象的保存操作作为一个整体提交,成功则全部生效,失败则回滚至保存前状态。同时,通过数据集分组优化了数据库锁粒度,提高了并发性能。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L475-L508) + +### 备忘数据转换API + +`transMemoDataToExtendAttr()` 方法负责将对象的备忘数据(MemoData)转换为扩展属性。这是必要的中间步骤,因为MemoData是Python层面的临时存储格式,而扩展属性是数据库层面的持久化格式。 + +转换过程在事务边界内进行(`beginSetExtentAttr()` / `endSetExtentAttr()`),确保扩展属性设置的原子性。对于具有大量扩展属性的对象,该操作可能产生显著的性能开销,建议批量处理时控制对象数量。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L464-L473) + +## 缓存与选择集的关系 + +缓存列表与选择集是两个独立但相关的容器系统。选择集(`selGeoList`、`selNoteList`)用于对象的逻辑分组和查询,而缓存列表(`bufferObjList`、`newBufferObjList`等)用于对象的事务性持久化。 + +**关系对比表:** + +| 容器类型 | 主要用途 | 数据来源 | 是否持久化 | 清除时机 | +|---------|---------|---------|-----------|---------| +| 选择集 | 逻辑分组、批量查询 | 从地图加载或新建对象添加 | 否 | clearSelection()手动清除 | +| 新建对象缓存 | 事务性保存新对象 | 通过createNewObjByCode创建 | 是 | saveBufferObjToDatabase()自动清除 | +| 修改对象缓存 | 事务性更新现有对象 | 从选择集加载并修改 | 是 | saveBufferObjToDatabase()自动清除 | +| 删除对象缓存 | 事务性删除对象 | 标记为删除的对象 | 是 | saveBufferObjToDatabase()自动清除 | + +`addNewObjToSelObjList()` 和 `addNewObjToSaveObjList()` 方法体现了这种分离设计:前者将对象加入选择集进行后续查询或操作,后者将对象加入缓存列表准备持久化。一个对象可以同时存在于两个容器中,也可以仅存在于其中一个。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L415-L430) + +## 最佳实践与注意事项 + +### 批量操作的性能优化 + +对于大量对象的批量操作,建议遵循以下最佳实践: + +1. **避免频繁调用saveBufferObjToDatabase()**:该方法会触发数据库事务,每次调用都有固定开销。应累积足够多的对象后再批量保存,建议每1000-5000个对象保存一次。 + +2. **合理使用数据集分组**:虽然`saveBufferObjToDatabase()`内部已实现数据集分组,但在创建对象时尽量按数据集顺序添加对象,可以减少分组操作的复杂度。 + +3. **控制扩展属性数量**:每个对象的扩展属性存储在MemoData中,过多扩展属性会增加内存占用和序列化开销。建议将高频查询的属性映射为基本属性,低频属性作为扩展属性。 + +### 内存管理注意事项 + +缓存对象在Python层面持有C++对象的引用,可能导致内存泄漏。以下场景需要特别关注: + +- **对象创建后未加入保存列表**:如果调用了`createNewObjByCode()`但未调用`addNewObjToSaveObjList()`或`addNewObjToSelObjList()`,对象会一直保留在`curNewObj`中,占用内存直到下一次创建操作覆盖。 + +- **事务中断后的缓存清理**:如果在调用`saveBufferObjToDatabase()`之前发生异常,缓存列表中的对象不会被自动清理。建议在异常处理中手动调用缓存清除操作或重新创建SSProcess实例。 + +### 并发安全注意事项 + +缓存机制不是线程安全的。如果在多线程环境下使用,需要通过外部同步机制(如线程锁)确保对SSProcess实例的访问序列化。系统设计的典型使用场景是单线程的脚本执行环境。 + +### 与撤销系统的集成 + +缓存机制与[撤销标记管理](25-che-xiao-biao-ji-guan-li)功能存在交互。如果需要在保存到数据库前支持撤销操作,应将对象同时添加到选择集和保存列表中,这样可以在不触发数据库提交的情况下回滚修改。 + +## 相关主题 + +对象缓存机制是地理编辑功能链中的关键环节。掌握缓存机制后,建议继续学习以下相关主题: + +- **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**:深入了解`saveBufferObjToDatabase()`方法的实现细节和性能调优策略 +- **[创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang)**:学习通过不同方式创建地物对象的方法和编码映射关系 +- **[地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)**:了解基本属性的完整列表和语义说明 +- **[扩展属性与自定义属性](18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing)**:掌握扩展属性的存储机制和访问方法 +- **[对象删除操作](22-shan-chu-dui-xiang-cao-zuo)**:理解删除缓存的工作原理和事务性保证 \ No newline at end of file diff --git a/docs/content/24-pi-liang-bao-cun-dao-shu-ju-ku.md b/docs/content/24-pi-liang-bao-cun-dao-shu-ju-ku.md new file mode 100644 index 0000000..c4fbc69 --- /dev/null +++ b/docs/content/24-pi-liang-bao-cun-dao-shu-ju-ku.md @@ -0,0 +1,342 @@ +批量保存到数据库是SunvStation地理编辑系统中实现高效数据持久化的核心机制。该功能通过统一的事务接口,将缓存中新建、修改和删除的地理对象批量提交到数据库,避免了逐个对象保存带来的性能开销和事务一致性问题。批量保存机制与[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)紧密配合,构成了完整的对象生命周期管理体系。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L514-L545) + +## 批量保存架构设计 + +批量保存采用三段式处理架构,针对不同状态的对象采用差异化的持久化策略。新建对象通过`addGeoObject()`添加到地图并自动保存,修改对象通过`saveDatabase()`更新数据库,删除对象通过`delGeoBaseComponent()`从数据库中移除。这种设计遵循了**单一职责原则**,使每种操作类型都有专门的处理路径。 + +```mermaid +flowchart TB + Start[saveBufferObjToDatabase] --> NewObj{新建对象?} + Start --> ModObj{修改对象?} + Start --> DelObj{删除对象?} + + NewObj -->|是| GroupByDataset[按数据集分组] + GroupByDataset --> AddGeo[map.addGeoObject] + AddGeo --> TransAttr1[transMemoDataToExtendAttr] + TransAttr1 --> ClearNew[清空newBuffer列表] + + ModObj -->|是| CheckBuffer1[bufferObjList非空?] + CheckBuffer1 -->|是| TransAttr2[transMemoDataToExtendAttr] + TransAttr2 --> SaveDB1[map.saveDatabase] + SaveDB1 --> ClearBuffer1[清空bufferObjList] + + CheckBuffer1 -->|否| CheckNote1[bufferNoteList非空?] + CheckNote1 -->|是| TransAttr3[transMemoDataToExtendAttr] + TransAttr3 --> SaveDB2[map.saveDatabase] + SaveDB2 --> ClearBuffer2[清空bufferNoteList] + + DelObj -->|是| CheckDel[delBufferGeoList非空?] + CheckDel -->|是| DeleteGeo[map.delGeoBaseComponent] + DeleteGeo --> ClearDel[清空delBufferGeoList] + + ClearNew --> End[完成] + ClearBuffer1 --> End + ClearBuffer2 --> End + ClearDel --> End + + style Start fill:#e1f5ff + style End fill:#e1f5ff + style AddGeo fill:#fff4e1 + style SaveDB1 fill:#fff4e1 + style SaveDB2 fill:#fff4e1 + style DeleteGeo fill:#ffe1e1 +``` + +该架构体现了**分离关注点**的设计理念:新建对象的添加操作由地图对象负责,修改对象的更新操作由数据库事务处理,删除操作通过地理组件接口执行。这种分工使得系统能够针对不同场景进行性能优化,例如对新对象按数据集分组处理以减少数据库锁的粒度。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L514-L545) + +## 核心方法详解 + +### saveBufferObjToDatabase() + +`saveBufferObjToDatabase()` 方法是批量保存的统一入口,负责处理所有缓存对象的事务性持久化。该方法无参数且无返回值,其执行结果通过内部日志记录。 + +**方法签名:** +```python +def saveBufferObjToDatabase(self) -> None: +``` + +**执行步骤:** + +1. **处理新建对象**:合并`newBufferObjList`和`newBufferNoteList`,按数据集名称分组,对每个数据集调用`map.addGeoObject(geoList)`批量添加,然后调用`transMemoDataToExtendAttr()`转换扩展属性,最后清空两个新建对象缓存列表。 + +2. **处理修改对象**:检查`bufferObjList`和`bufferNoteList`,若非空则先转换扩展属性,再调用`map.saveDatabase(geoList)`保存到数据库,最后清空两个修改对象缓存列表。 + +3. **处理删除对象**:调用`map.delGeoBaseComponent(self.delBufferGeoList)`批量删除对象,然后清空删除缓存列表。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L514-L545) + +### transMemoDataToExtendAttr() + +`transMemoDataToExtendAttr()` 是批量保存过程中的关键辅助方法,负责将对象的备忘数据(MemoData)转换为扩展属性(ExtentAttr)。备忘数据是Python层面的临时存储格式,而扩展属性是数据库层面的持久化格式,转换操作必须在进行数据库操作前完成。 + +**方法签名:** +```python +def transMemoDataToExtendAttr(self, geoList: GeoBaseList) -> None: +``` + +**转换过程:** + +该方法首先调用`map.beginSetExtentAttr()`开启扩展属性设置事务,然后遍历传入的几何对象列表,对每个对象执行以下操作: +- 调用`geo.getMemoData(fields, values)`获取备忘数据的字段和值数组 +- 若字段数组非空,调用`map.setExtentAttr(geo, fields, values)`设置扩展属性 +- 最后调用`map.endSetExtentAttr()`结束事务,确保属性设置的原子性 + +这种事务边界设计保证了多个扩展属性设置作为一个整体提交,避免部分设置成功而部分设置失败导致的数据不一致。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L501-L511) + +## 操作类型与处理流程 + +批量保存机制支持三种对象操作类型,每种类型都有特定的处理流程和数据库接口调用方式。 + +### 新建对象的保存流程 + +新建对象通过`createNewObjByCode()`或`createNewObjByClass()`创建后,需要调用`addNewObjToSaveObjList()`将其添加到新建对象缓存列表中。保存时,系统会将对象按数据集分组,然后调用`map.addGeoObject()`批量添加。 + +**新建对象处理特点:** + +| 特性 | 描述 | +|------|------| +| 缓存容器 | `newBufferObjList`(地物)、`newBufferNoteList`(注记) | +| 数据结构 | `list[(GeoObject, GeoBase)]` 的元组列表 | +| 数据库接口 | `map.addGeoObject(geoList)` | +| 分组策略 | 按数据集名称分组,减少锁争用 | +| 属性处理 | 先添加对象,再转换扩展属性 | + +新建对象采用**延迟添加**策略:对象在内存中完成所有属性设置和几何编辑,仅在批量保存时才调用数据库接口。这避免了频繁的数据库事务开销,显著提升大批量数据创建的性能。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L516-L527) + +### 修改对象的保存流程 + +修改对象通常从地图加载到选择集,通过`setSelGeoValue()`等方法修改属性后,需要调用`addSelGeoToSaveGeoList()`将其添加到修改对象缓存列表中。保存时,系统直接调用`map.saveDatabase()`更新数据库记录。 + +**修改对象处理特点:** + +| 特性 | 描述 | +|------|------| +| 缓存容器 | `bufferObjList`(地物)、`bufferNoteList`(注记) | +| 数据结构 | `GeoBaseList` 的对象列表 | +| 数据库接口 | `map.saveDatabase(geoList)` | +| 分组策略 | 不分组,直接批量更新 | +| 属性处理 | 先转换扩展属性,再保存数据库 | + +修改对象采用**增量更新**策略:仅保存实际修改过的对象,而非整个选择集。这减少了数据库I/O量,提高了批量属性更新的效率。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L533-L540) + +### 删除对象的保存流程 + +删除对象通过`resetSelGeoByCode()`等方法触发对象替换时,被删除的原始对象会被添加到`delBufferGeoList`中。保存时,系统调用`map.delGeoBaseComponent()`执行批量删除。 + +**删除对象处理特点:** + +| 特性 | 描述 | +|------|------| +| 缓存容器 | `delBufferGeoList`(统一处理地物和注记) | +| 数据结构 | `GeoBaseList` 的对象列表 | +| 数据库接口 | `map.delGeoBaseComponent(geoList)` | +| 分组策略 | 不分组,统一删除 | +| 属性处理 | 不需要属性转换 | + +删除操作采用**延迟删除**策略:对象先在缓存中标记为待删除,在批量保存时才真正从数据库中移除。这种设计支持对象替换场景(如通过编码重置对象时,先添加新对象到新建缓存,再添加旧对象到删除缓存),保证了操作的原子性。 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L542-L545) + +## 使用场景与最佳实践 + +### 场景一:批量新建地物对象 + +在批量导入外部数据或程序化生成地物时,应先创建所有对象并设置完整属性,最后统一调用`saveBufferObjToDatabase()`保存。 + +```python +# 批量创建道路对象 +for road_data in road_list: + # 通过编码创建新对象 + obj, geo = SSProcess.createNewObjByCode(3103013) + + # 设置基本属性 + SSProcess.setNewObjValue("SSObj_Name", road_data['name']) + SSProcess.setNewObjValue("SSObj_Color", road_data['color']) + + # 设置扩展属性 + SSProcess.setNewObjValue("[宽度]", str(road_data['width'])) + SSProcess.setNewObjValue("[材质]", road_data['material']) + + # 添加坐标点 + for point in road_data['points']: + SSProcess.addNewObjPoint(point['x'], point['y'], point['z'], 0, "") + + # 添加到保存列表 + SSProcess.addNewObjToSaveObjList() + +# 批量保存到数据库 +SSProcess.saveBufferObjToDatabase() +SSProcess.updateRequest() # 刷新地图显示 +``` + +**最佳实践:** +- 在循环中避免频繁调用`addNewObjToSaveObjList()`,可以在循环结束后统一添加(如果所有对象都创建成功) +- 对于大批量数据(超过1000个对象),建议分批次保存(如每500个对象保存一次),避免内存占用过高 +- 在`setNewObjValue()`中使用批量设置语法(如`"[字段1],[字段2]"`)可提高性能 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L133-L210) + +### 场景二:批量更新对象属性 + +在批量更新选择集对象的属性时,应先将需要保存的对象添加到修改缓存列表,再调用`saveBufferObjToDatabase()`。 + +```python +# 查询并更新符合条件的对象 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +SSProcess.selectFilter() + +# 批量修改属性 +for i in range(SSProcess.getSelGeoCount()): + # 修改基本属性 + SSProcess.setSelGeoValue(i, "SSObj_Color", "16711680") + + # 修改扩展属性 + SSProcess.setSelGeoValue(i, "[更新时间]", "2024-01-15") + SSProcess.setSelGeoValue(i, "[操作员]", "admin") + + # 添加到修改缓存列表 + SSProcess.addSelGeoToSaveGeoList(i) + +# 批量保存到数据库 +SSProcess.saveBufferObjToDatabase() +SSProcess.updateRequest() +``` + +**最佳实践:** +- `setSelGeoValue()`和`addSelGeoToSaveGeoList()`必须成对使用,否则修改不会被保存 +- 如果修改的是所有选择集对象,可以将索引设为-1进行批量设置(具体API取决于实现) +- 批量属性更新前建议先备份数据或使用事务机制,避免误操作 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L374-L404) + +### 场景三:对象替换(删除旧对象,创建新对象) + +在通过编码重置对象或注记类重置注记时,系统会自动将新对象添加到新建缓存,旧对象添加到删除缓存。 + +```python +# 通过编码重置选择集中的对象 +for i in range(SSProcess.getSelGeoCount()): + # 重置为新的编码(旧对象自动进入删除缓存,新对象自动进入新建缓存) + SSProcess.resetSelGeoByCode(i, 3103015) + + # 设置新对象的属性 + SSProcess.setNewObjValue("SSObj_Name", f"重置对象_{i}") + SSProcess.addNewObjToSaveObjList() + +# 批量保存(同时处理删除和新建) +SSProcess.saveBufferObjToDatabase() +SSProcess.updateRequest() +``` + +**最佳实践:** +- 对象替换操作自动处理删除和新建缓存,无需手动调用`addSelGeoToSaveGeoList()` +- 替换操作会保留原始对象的坐标点和扩展属性(除非明确覆盖) +- 替换前应确保新编码对应的数据集存在,否则操作会失败 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L443-L483) + +## 性能优化建议 + +### 数据集分组优化 + +新建对象按数据集分组是批量保存的重要优化策略。当批量创建多个数据集的对象时,系统会将同一数据集的对象合并处理,减少数据库切换和锁争用。 + +**优化效果对比:** + +| 场景 | 未优化处理方式 | 优化后处理方式 | 性能提升 | +|------|--------------|--------------|---------| +| 创建1000个对象(分布在5个数据集) | 1000次单独调用`addGeoObject()` | 5次批量调用`addGeoObject()` | 约60-80% | +| 扩展属性设置 | 每个对象独立事务 | 每个数据集一个事务 | 约40-60% | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L516-L527) + +### 事务边界管理 + +批量保存通过事务边界管理确保数据一致性。扩展属性设置使用`beginSetExtentAttr()`/`endSetExtentAttr()`包裹,数据库保存使用`map.saveDatabase()`的内部事务。 + +**事务管理原则:** + +1. **原子性**:所有缓存对象的保存操作作为一个整体,要么全部成功,要么全部失败 +2. **隔离性**:不同数据集的操作相互独立,减少锁争用 +3. **持久性**:事务提交后,数据立即写入数据库,不受系统故障影响 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L501-L511) + +### 缓存容量控制 + +对于超大规模数据处理,建议控制缓存容量,避免内存溢出。 + +**缓存控制策略:** + +| 数据规模 | 缓存控制方式 | 推荐批次大小 | +|---------|------------|------------| +| 小规模(< 1000个对象) | 一次性处理 | 全部对象 | +| 中等规模(1000-10000个对象) | 分批次保存 | 每500-1000个对象 | +| 大规模(> 10000个对象) | 分页处理+分批次保存 | 每1000个对象 | + +Sources: [PySSProcess.py](PySSProcess.py#L32-L40) + +## 错误处理与异常管理 + +批量保存操作可能遇到多种错误情况,开发者需要根据错误类型采取相应的处理策略。 + +**常见错误类型及处理:** + +| 错误类型 | 可能原因 | 处理建议 | +|---------|---------|---------| +| 数据集不存在 | 目标数据集被删除或未加载 | 检查数据集存在性,使用`map.getDataset()`验证 | +| 对象ID冲突 | 新对象ID与已有对象冲突 | 使用`generateUniqueId()`生成唯一ID | +| 扩展属性超长 | 单个扩展属性值超过数据库限制 | 分割长文本或使用多个字段存储 | +| 数据库连接失败 | 网络中断或数据库服务停止 | 重试机制或回滚操作 | +| 权限不足 | 当前用户无写入权限 | 检查用户权限或联系管理员 | + +**错误处理示例:** + +```python +try: + # 执行批量保存 + SSProcess.saveBufferObjToDatabase() + SSProcess.log_info_msg("批量保存成功") +except Exception as e: + # 记录错误信息 + SSProcess.log_error_msg(f"批量保存失败: {str(e)}") + + # 回滚操作(清空缓存,避免部分保存) + SSProcess.newBufferObjList.clear() + SSProcess.bufferObjList.clear() + SSProcess.delBufferGeoList.clear() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L514-L545) + +## 与其他功能的关联 + +批量保存功能与SunvStation系统的其他核心功能紧密关联,形成完整的地理编辑工作流。 + +### 与对象缓存机制的关系 + +批量保存是对象缓存机制的最终输出环节。对象在[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)中经过创建、编辑、缓存等阶段,最终通过批量保存持久化到数据库。缓存机制负责对象的生命周期管理,批量保存负责对象的事务性持久化,两者相辅相成。 + +Sources: [PySSProcess.py](PySSProcess.py#L32-L40) + +### 与撤销标记管理的关系 + +批量保存操作会影响[撤销标记管理](25-che-xiao-biao-ji-guan-li)的状态。在保存操作执行前,系统会自动创建撤销标记(`map.pushUndoMark()`),允许用户在保存后撤销整个批量操作。撤销标记与批量保存的事务边界保持一致,确保撤销操作能够正确回滚所有修改。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L628-L640) + +### 与地图视图更新的关系 + +批量保存后通常需要调用`updateRequest()`方法刷新地图视图,确保用户看到最新的数据状态。视图更新操作通过回调机制通知地图重绘,与批量保存操作解耦,保证了数据持久化和视图显示的独立性。 \ No newline at end of file diff --git a/docs/content/25-che-xiao-biao-ji-guan-li.md b/docs/content/25-che-xiao-biao-ji-guan-li.md new file mode 100644 index 0000000..ee616a9 --- /dev/null +++ b/docs/content/25-che-xiao-biao-ji-guan-li.md @@ -0,0 +1,319 @@ +撤销标记管理是 SunvStation 地理编辑系统中的一项核心功能,它通过在执行可撤销操作前创建标记,支持用户对编辑操作进行撤销和重做。该机制基于命令模式,将每次可撤销操作封装为独立的命令单元,存储在 Undo/Redo 栈中,确保数据编辑的安全性和可追溯性。 + +撤销标记管理在批量地理对象编辑、属性修改和几何变换等场景中尤为重要,能够有效防止误操作导致的数据丢失,提升编辑流程的容错能力和用户体验。 + +## 撤销标记系统架构 + +撤销标记系统采用双层架构设计:上层通过 `SSProcessManager` 提供统一的 Python 接口,下层由 `ScaleMap` 的 C++ 核心实现命令存储和状态管理。系统维护两个命令栈:Undo 栈存储已执行的操作历史,Redo 栈存储被撤销的操作,两者协同工作实现操作的双向回溯。 + +```mermaid +flowchart TD + A[用户操作] --> B[SSProcessManager
pushUndoMark] + B --> C[ScaleMap
pushUndoMark] + C --> D{创建命令标记} + D --> E[命令序列化] + E --> F[Undo栈
LIFO结构] + F --> G[操作执行] + G --> H{用户触发撤销?} + H -->|是| I[undo方法] + H -->|否| J{用户触发重做?} + I --> K[弹出Undo栈顶命令] + K --> L[执行逆向操作] + L --> M[压入Redo栈] + J -->|是| N[redo方法] + N --> O[弹出Redo栈顶命令] + O --> P[执行正向操作] + P --> Q[压入Undo栈] +``` + +## 核心 API 方法 + +### 创建撤销标记 + +`pushUndoMark()` 方法是撤销标记管理的入口,在执行任何可撤销操作前调用,为后续操作建立撤销点。该方法接受可选的操作描述参数,用于标识命令组的用途。 + +| 方法 | 参数 | 返回值 | 说明 | +|------|------|--------|------| +| `pushUndoMark(action="CommandGroup")` | `action`: 命令组名称(可选) | void | 在 Undo 栈中创建新的标记位置 | + +**使用示例**: + +```python +# 批量修改前创建撤销标记 +SSProcess.pushUndoMark("批量修改管线属性") + +for i in range(SSProcess.getSelGeoCount()): + SSProcess.setSelGeoValue(i, "SSObj_Color", "16777215") + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "2") + +# 修改完成后,用户可通过 Ctrl+Z 或调用 undo() 方法撤销 +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L50-L61) + +### 执行撤销操作 + +`undo()` 方法从 Undo 栈中弹出最近执行的命令并执行逆向操作,恢复数据到操作前的状态。支持指定步数或使用标记进行批量撤销。 + +| 方法 | 参数 | 返回值 | 说明 | +|------|------|--------|------| +| `undo(step=1)` | `step`: 执行步数,-1 时使用 undo 标签 | void | 撤销指定步数的操作 | + +**使用示例**: + +```python +# 撤销最近一次操作 +SSProcess.undo() + +# 撤销最近 5 次操作 +SSProcess.undo(5) + +# 撤销到上一个标记位置 +SSProcess.undo(-1) +``` + +Sources: [PySSMap.py](PySSMap.py#L1633-L1641) + +### 执行重做操作 + +`redo()` 方法从 Redo 栈中弹出被撤销的命令并重新执行,恢复之前撤销的操作。与 `undo()` 方法形成对称操作。 + +| 方法 | 参数 | 返回值 | 说明 | +|------|------|--------|------| +| `redo(step=1)` | `step`: 执行步数,-1 时使用 undo 标签 | void | 重做指定步数的操作 | + +**使用示例**: + +```python +# 重做最近一次撤销的操作 +SSProcess.redo() + +# 重做最近 3 次撤销的操作 +SSProcess.redo(3) +``` + +Sources: [PySSMap.py](PySSMap.py#L1643-L1648) + +### 栈状态查询与控制 + +系统提供多个方法用于查询 Undo/Redo 栈的状态,以及重置栈内容,便于用户了解可撤销/重做的操作范围。 + +| 方法 | 返回值 | 说明 | +|------|--------|------| +| `getUndoStackSize()` | int | 获取 Undo 栈中的命令数量 | +| `getRedoStackSize()` | int | 获取 Redo 栈中的命令数量 | +| `getUndoStack()` | StringArray | 获取 Undo 栈中的命令描述列表 | +| `getRedoStack()` | StringArray | 获取 Redo 栈中的命令描述列表 | +| `resetUndoRedoStack()` | void | 清空 Undo/Redo 栈,删除所有历史记录 | + +**使用示例**: + +```python +# 查询可撤销的操作数量 +undo_count = SSProcess.getUndoStackSize() +print(f"可撤销操作数: {undo_count}") + +# 查询可重做的操作数量 +redo_count = SSProcess.getRedoStackSize() +print(f"可重做操作数: {redo_count}") + +# 获取 Undo 栈中的命令描述 +undo_stack = SSProcess.getUndoStack() +for i in range(undo_stack.size()): + print(f" {i+1}. {undo_stack[i]}") + +# 清空所有撤销/重做历史(谨慎使用) +# SSProcess.resetUndoRedoStack() +``` + +Sources: [PySSMap.py](PySSMap.py#L1650-L1675) + +### 手动压栈操作 + +`pushUndoAddobj()` 方法提供手动压栈功能,用于将指定地物对象列表显式地加入 Undo 栈,通常用于自定义编辑场景。 + +| 方法 | 参数 | 返回值 | 说明 | +|------|------|--------|------| +| `pushUndoAddobj(geoList)` | `geoList`: GeoBaseList 对象列表 | void | 手动将对象列表压入 Undo 栈 | + +**使用示例**: + +```python +# 创建新对象后手动压栈 +obj, geo = SSProcess.createNewObjByCode(3103013) +SSProcess.addNewObjPoint(x, y, z, 0, "Point1") + +# 手动压栈以便后续撤销 +geo_list = GeoBaseList() +geo_list.append(geo) +SSProcess.pushUndoAddobj(geo_list) +``` + +Sources: [PySSMap.py](PySSMap.py#L1686-L1692) + +## 操作流程规范 + +### 标准编辑流程 + +遵循标准的撤销标记管理流程可确保操作的可追溯性和数据安全性。下图展示了完整的编辑操作生命周期: + +```mermaid +sequenceDiagram + participant U as 用户 + participant S as SSProcess + participant M as ScaleMap + participant UStack as Undo栈 + participant RStack as Redo栈 + + U->>S: 1. pushUndoMark("操作描述") + S->>M: 2. pushUndoMark() + M->>UStack: 3. 创建标记并压栈 + M->>RStack: 4. 清空 Redo 栈 + + U->>S: 5. 执行编辑操作 + S->>M: 6. 修改数据 + + opt 用户请求撤销 + U->>S: 7. undo() + S->>M: 8. undo() + M->>UStack: 9. 弹出命令 + M->>M: 10. 执行逆向操作 + M->>RStack: 11. 压入 Redo 栈 + end + + opt 用户请求重做 + U->>S: 12. redo() + S->>M: 13. redo() + M->>RStack: 14. 弹出命令 + M->>M: 15. 执行正向操作 + M->>UStack: 16. 压入 Undo 栈 + end +``` + +### 标记创建时机 + +撤销标记应在以下关键节点创建: + +1. **批量操作前**:批量修改属性、移动对象、删除对象等操作前 +2. **复合操作起始点**:由多个子操作组成的复杂编辑流程开始时 +3. **重要编辑前**:不可逆或影响范围较大的编辑操作前 +4. **事务边界**:定义明确的编辑事务单元,便于整体撤销 + +## 典型应用场景 + +### 批量属性修改 + +批量修改选择集中地物的属性值时,应在循环前创建撤销标记,确保所有修改可作为一个整体撤销。 + +```python +# 场景:批量修改管线的颜色和线宽 +SSProcess.pushUndoMark("批量修改管线样式") + +for i in range(SSProcess.getSelGeoCount()): + SSProcess.setSelGeoValue(i, "SSObj_Color", "16711680") # 红色 + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "3") + +# 如需撤销所有修改,调用: +# SSProcess.undo(-1) +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L321-L400) + +### 对象创建与删除 + +创建或删除对象时,通过撤销标记管理可快速回退到操作前的状态。 + +```python +# 场景:创建新注记对象 +SSProcess.pushUndoMark("创建注记对象") + +obj, geo = SSProcess.createNewObjByClass("说明注记") +note = castToMarkNote(geo) +note.setNote("新建管线节点") +SSProcess.addNewObjPoint(x, y, 0, 0, "节点1") +SSProcess.addNewObjToSaveObjList() +SSProcess.saveBufferObjToDatabase() + +# 如需撤销创建操作: +# SSProcess.undo() +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L159-L201) + +### 几何变换操作 + +执行对象的平移、旋转、缩放等几何变换时,撤销标记管理提供快速恢复机制。 + +```python +# 场景:批量旋转选择集对象 +from sunvpy.PySSMath import Point3D + +SSProcess.pushUndoMark("旋转选择集对象") + +# 获取旋转中心(假设第一个对象为参考点) +center_geo = SSProcess.selGeoList[0] +points = center_geo.getPoints() +center_pt = points[0] + +# 执行旋转 +angle = 1.5708 # 90度,弧度制 +SSProcess.map.rotate(SSProcess.selGeoList, center_pt, angle, False) + +# 请求视图更新 +SSProcess.updateRequest() +``` + +Sources: [PySSMap.py](PySSMap.py#L1558-L1564) + +## 最佳实践建议 + +### 标记命名规范 + +为撤销标记提供清晰的描述性名称,便于用户识别和调试。命名应简洁明了,反映操作的实质内容。 + +| 推荐命名格式 | 示例 | 说明 | +|--------------|------|------| +| "动作+对象类型" | "修改管线属性" | 动词+名词结构 | +| "批量+具体操作" | "批量删除注记" | 明确操作类型 | +| "事务名称" | "节点编辑事务" | 用于复合操作 | +| "功能模块+操作" | "数据导入操作" | 模块化命名 | + +### 性能优化建议 + +1. **避免频繁创建标记**:在循环外创建标记,而非每次迭代都创建 +2. **合理使用标记边界**:根据业务逻辑划分事务单元,而非滥用标记 +3. **定期清空栈**:在长时间编辑会话中,适时调用 `resetUndoRedoStack()` 释放内存 +4. **栈容量监控**:通过 `getUndoStackSize()` 监控栈深度,避免过度占用资源 + +### 错误处理机制 + +在创建撤销标记时,应检查地图实例的有效性,并在操作失败时进行适当的错误处理。 + +```python +def safe_edit_operation(): + """安全的编辑操作封装""" + if SSProcess.map is None: + print("错误:无法获取当前地图实例") + return False + + try: + SSProcess.pushUndoMark("安全编辑操作") + + # 执行编辑操作 + # ... + + SSProcess.updateRequest() + return True + except Exception as e: + print(f"编辑操作失败:{str(e)}") + # 可选择在此处调用 undo() 回滚部分修改 + return False +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L50-L61) + +## 与其他模块的集成 + +撤销标记管理与[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)紧密协同,在批量保存到数据库前提供撤销能力。同时,它与[地物属性读写](15-huo-qu-di-wu-shu-xing-zhi)和[地理对象编辑](19-chuang-jian-mo-ren-di-wu-dui-xiang)模块集成,确保所有编辑操作的可追溯性。 + +在实现自定义编辑功能时,建议在操作前后分别调用 `pushUndoMark()` 和 `updateRequest()`,形成完整的编辑闭环,保持与系统标准编辑流程的一致性。 \ No newline at end of file diff --git a/docs/content/26-shu-ju-jiao-huan-can-shu-pei-zhi.md b/docs/content/26-shu-ju-jiao-huan-can-shu-pei-zhi.md new file mode 100644 index 0000000..5f376b2 --- /dev/null +++ b/docs/content/26-shu-ju-jiao-huan-can-shu-pei-zhi.md @@ -0,0 +1,406 @@ +本页面介绍数据交换的参数配置机制,这是进行数据导入导出操作前的关键步骤。通过正确配置数据交换参数,您可以精确控制数据转换的行为,包括格式映射、编码规则、坐标系统等关键属性。掌握参数配置是构建可靠数据交换流程的基础。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) + +## 核心概念与架构 + +数据交换参数配置基于 **DataXScript** 类实现,该类采用经典的 **参数-执行模式** 设计。用户首先通过一系列参数设置方法配置数据转换的各项属性,然后调用执行方法触发实际的导入或导出操作。这种设计将配置逻辑与执行逻辑分离,提高了代码的可读性和可维护性。 + +```mermaid +graph LR + A[创建 DataXScript 实例] --> B[配置交换参数
setDataXParameter] + B --> C[可选:读取参数
getDataXParameter] + C --> D{参数配置完成?} + D -->|否| B + D -->|是| E[选择操作类型] + E -->|导入| F[调用 importData] + E -->|导出| G[调用 exportData] + F --> H[数据交换完成] + G --> H + H --> I[可选:清理参数
clearDataXParameter] +``` + +DataXScript 类的实例不作为 sunvpy 的全局单例对象暴露,因此每次需要进行数据交换时都需要创建新的实例。这种设计确保了不同数据交换任务的参数不会相互干扰,提高了脚本的隔离性和安全性。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) + +## 参数管理核心方法 + +DataXScript 类提供了三个核心方法用于参数的配置、读取和清理操作。这些方法是所有数据交换操作的基础,理解它们的用法是掌握数据交换功能的第一步。 + +| 方法名称 | 方法签名 | 功能描述 | 返回值 | +|---------|---------|---------|--------| +| `setDataXParameter` | `setDataXParameter(name, value)` | 设置单个数据转换参数 | 无 | +| `getDataXParameter` | `getDataXParameter(name)` | 获取指定参数的当前值 | 字符串形式的参数值 | +| `clearDataXParameter` | `clearDataXParameter()` | 清除所有已配置的参数 | 无 | + +这些方法的设计遵循简单直观的原则,所有参数都以字符串形式传入和传出,底层会根据参数名称自动进行类型转换和验证。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L146) + +### 设置数据交换参数 + +`setDataXParameter()` 方法是配置数据交换的主要方法,它接受两个参数:参数名称和参数值。参数名称是系统预定义的键,用于标识特定的配置项;参数值则是用户希望设置的值,可以是字符串、数字等各种类型,但都会以字符串形式传递。 + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 设置文件路径参数 +datax.setDataXParameter("ImportPath", "D:\\data\\import\\roads.shp") +datax.setDataXParameter("ExportPath", "D:\\data\\export\\output.mdb") + +# 设置编码参数 +datax.setDataXParameter("SourceEncoding", "GBK") +datax.setDataXParameter("TargetEncoding", "UTF-8") + +# 设置坐标系统参数 +datax.setDataXParameter("CoordSystem", "EPSG:4326") +``` + +参数名称通常采用大驼峰命名法,如 `ImportPath`、`CoordSystem` 等。在实际使用中,应根据具体的导入导出格式选择合适的参数名称。错误的参数名称可能会被忽略或导致后续执行失败。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +### 读取数据交换参数 + +`getDataXParameter()` 方法允许您获取当前已设置的参数值,这对于参数验证和调试非常有用。该方法接受一个参数名称,返回该参数的当前值。如果参数未被设置,可能返回空字符串或默认值。 + +```python +# 读取之前设置的参数 +import_path = datax.getDataXParameter("ImportPath") +print(f"导入路径: {import_path}") + +# 检查关键参数是否已设置 +coord_system = datax.getDataXParameter("CoordSystem") +if not coord_system: + print("警告:坐标系统未设置,将使用默认值") +else: + print(f"坐标系统: {coord_system}") +``` + +使用 `getDataXParameter()` 可以在执行数据交换前验证参数配置的完整性,避免因缺少必要参数而导致的执行失败。 + +Sources: [PySSDataX.py](PySSDataX.py#L130-L140) + +### 清除数据交换参数 + +`clearDataXParameter()` 方法会清除所有已设置的参数,将 DataXScript 实例恢复到初始状态。这个方法在需要复用同一个 DataXScript 实例执行多次不同的数据交换任务时特别有用。 + +```python +# 执行第一次数据导入 +datax.setDataXParameter("ImportPath", "data1.shp") +datax.importData() + +# 清除所有参数 +datax.clearDataXParameter() + +# 执行第二次数据导入(使用新参数) +datax.setDataXParameter("ImportPath", "data2.shp") +datax.importData() +``` + +需要注意的是,`clearDataXParameter()` 会清除所有参数,包括您可能希望保留的参数。如果只想修改部分参数,应该直接调用 `setDataXParameter()` 覆盖原有值,而不需要先清除。 + +Sources: [PySSDataX.py](PySSDataX.py#L117-L119) + +## 数据交换工作流程 + +数据交换参数配置是数据导入导出流程中的关键环节。完整的导入和导出操作都遵循相同的参数配置模式,区别仅在于最终调用的执行方法不同。 + +### 数据导入流程 + +数据导入是指将外部文件或数据源中的数据加载到当前 SunvStation 工作空间中的过程。导入前必须正确配置源文件路径、编码方式等关键参数。 + +```mermaid +flowchart TD + A[开始导入流程] --> B[创建 DataXScript 实例] + B --> C[设置源文件路径
ImportPath] + C --> D[配置文件编码
SourceEncoding] + D --> E[设置坐标系统
CoordSystem] + E --> F[配置其他可选参数] + F --> G[调用 importData 执行导入] + G --> H{导入成功?} + H -->|是| I[获取导入文件名
getImportFileName] + H -->|否| J[检查错误日志] + I --> K[完成导入流程] + J --> K +``` + +以下是数据导入的完整代码示例: + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 配置导入参数 +datax.setDataXParameter("ImportPath", "D:\\gis_data\\survey.shp") +datax.setDataXParameter("SourceEncoding", "GBK") +datax.setDataXParameter("CoordSystem", "EPSG:4326") +datax.setDataXParameter("LayerMapping", "道路") +datax.setDataXParameter("OverwriteExisting", "true") + +# 执行数据导入 +success = datax.importData() + +if success: + import_file = datax.getImportFileName() + print(f"数据导入成功: {import_file}") +else: + print("数据导入失败,请检查参数配置和文件格式") +``` + +`importData()` 方法会根据配置的参数执行实际的导入操作。导入成功后,可以调用 `getImportFileName()` 获取实际导入的文件名称,这个名称可能与原始文件名不同,因为系统可能会根据命名规则进行调整。 + +Sources: [PySSDataX.py](PySSDataX.py#L148-L152) + +### 数据导出流程 + +数据导出是指将当前工作空间中的数据保存为外部文件的过程。导出前需要配置目标文件路径、导出格式、编码方式等参数。 + +```mermaid +flowchart TD + A[开始导出流程] --> B[创建 DataXScript 实例] + B --> C[设置目标文件路径
ExportPath] + C --> D[选择导出格式
ExportFormat] + D --> E[配置文件编码
TargetEncoding] + E --> F[设置坐标系统
CoordSystem] + F --> G[配置图层过滤
LayerFilter] + G --> H[调用 exportData 执行导出] + H --> I{导出成功?} + I -->|是| J[验证导出文件] + I -->|否| K[检查错误日志] + J --> L[完成导出流程] + K --> L +``` + +以下是数据导出的完整代码示例: + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 配置导出参数 +datax.setDataXParameter("ExportPath", "D:\\export_data\\result.mdb") +datax.setDataXParameter("ExportFormat", "MDB") +datax.setDataXParameter("TargetEncoding", "UTF-8") +datax.setDataXParameter("CoordSystem", "EPSG:4326") +datax.setDataXParameter("LayerFilter", "道路,建筑,水系") +datax.setDataXParameter("IncludeAttributes", "true") +datax.setDataXParameter("CompressGeometry", "true") + +# 执行数据导出 +success = datax.exportData() + +if success: + print("数据导出成功") +else: + print("数据导出失败,请检查参数配置和写入权限") +``` + +导出操作通常比导入操作涉及更多的参数配置,因为导出时需要指定目标格式、是否包含属性、是否压缩几何等信息。合理配置这些参数可以优化导出文件的性能和兼容性。 + +Sources: [PySSDataX.py](PySSDataX.py#L154-L157) + +## 常见参数类型参考 + +虽然 DataXScript 类本身没有在 Python 层面硬编码参数名称列表,但基于常见的 GIS 数据交换场景,以下是一些常用的参数类型和说明。实际使用时应参考 SunvStation 的完整参数文档。 + +### 文件路径相关参数 + +| 参数名称 | 参数说明 | 示例值 | 适用场景 | +|---------|---------|--------|---------| +| `ImportPath` | 导入文件的完整路径 | `D:\data\input.shp` | 数据导入 | +| `ExportPath` | 导出文件的完整路径 | `D:\data\output.mdb` | 数据导出 | +| `WorkingDir` | 临时工作目录 | `D:\temp\workdir` | 导入导出 | + +### 格式和编码相关参数 + +| 参数名称 | 参数说明 | 示例值 | 适用场景 | +|---------|---------|--------|---------| +| `ExportFormat` | 导出文件格式 | `SHP`, `MDB`, `GDB`, `DXF` | 数据导出 | +| `SourceEncoding` | 源文件字符编码 | `GBK`, `UTF-8`, `BIG5` | 数据导入 | +| `TargetEncoding` | 目标文件字符编码 | `UTF-8`, `GBK` | 数据导出 | + +### 坐标系统和投影参数 + +| 参数名称 | 参数说明 | 示例值 | 适用场景 | +|---------|---------|--------|---------| +| `CoordSystem` | 坐标系统定义 | `EPSG:4326`, `EPSG:4490` | 导入导出 | +| `SourceCoordSystem` | 源数据坐标系统 | `EPSG:3857` | 数据导入 | +| `TargetCoordSystem` | 目标数据坐标系统 | `EPSG:4326` | 数据导出 | +| `TransformMode` | 坐标转换模式 | `AUTO`, `MANUAL` | 坐标转换 | + +### 数据处理相关参数 + +| 参数名称 | 参数说明 | 示例值 | 适用场景 | +|---------|---------|--------|---------| +| `LayerMapping` | 图层映射规则 | `道路` | 导入导出 | +| `LayerFilter` | 图层过滤条件 | `道路,建筑,水系` | 数据导出 | +| `IncludeAttributes` | 是否包含属性数据 | `true`, `false` | 数据导出 | +| `OverwriteExisting` | 是否覆盖已有数据 | `true`, `false` | 数据导入 | +| `CompressGeometry` | 是否压缩几何数据 | `true`, `false` | 数据导出 | +| `Tolerance` | 几何容差值 | `0.001`, `0.01` | 导入导出 | + +Sources: [PySSDataX.py](PySSDataX.py#L120-L152) + +## 完整实践示例 + +以下是一个完整的数据交换参数配置和执行示例,展示了如何将一个 Shapefile 格式的道路数据导入到 SunvStation 工作空间中,然后再将处理后的数据导出为 MDB 格式。 + +```python +from sunvpy.PySSDataX import DataXScript + +def import_and_export_data(): + """ + 完整的数据导入导出流程示例 + """ + + # ========== 第一阶段:数据导入 ========== + print("开始数据导入流程...") + + # 创建导入专用的 DataXScript 实例 + import_datax = DataXScript() + + # 配置导入参数 + import_datax.setDataXParameter("ImportPath", "D:\\gis_projects\\source\\roads.shp") + import_datax.setDataXParameter("SourceEncoding", "GBK") + import_datax.setDataXParameter("CoordSystem", "EPSG:4326") + import_datax.setDataXParameter("LayerMapping", "道路") + import_datax.setDataXParameter("OverwriteExisting", "true") + import_datax.setDataXParameter("Tolerance", "0.001") + + # 验证关键参数 + import_path = import_datax.getDataXParameter("ImportPath") + print(f"导入文件路径: {import_path}") + + # 执行导入 + import_success = import_datax.importData() + + if not import_success: + print("错误:数据导入失败") + return False + + import_file = import_datax.getImportFileName() + print(f"数据导入成功: {import_file}") + + # 清理导入参数(可选) + import_datax.clearDataXParameter() + + # ========== 第二阶段:数据处理(示例)========== + # 这里可以添加数据处理逻辑,如选择集操作、属性修改等 + print("数据处理中...") + + # ========== 第三阶段:数据导出 ========== + print("开始数据导出流程...") + + # 创建导出专用的 DataXScript 实例 + export_datax = DataXScript() + + # 配置导出参数 + export_datax.setDataXParameter("ExportPath", "D:\\gis_projects\\output\\roads_processed.mdb") + export_datax.setDataXParameter("ExportFormat", "MDB") + export_datax.setDataXParameter("TargetEncoding", "UTF-8") + export_datax.setDataXParameter("CoordSystem", "EPSG:4490") # 转换为 CGCS2000 + export_datax.setDataXParameter("LayerFilter", "道路") + export_datax.setDataXParameter("IncludeAttributes", "true") + export_datax.setDataXParameter("CompressGeometry", "true") + + # 验证关键参数 + export_path = export_datax.getDataXParameter("ExportPath") + export_format = export_datax.getDataXParameter("ExportFormat") + print(f"导出路径: {export_path}") + print(f"导出格式: {export_format}") + + # 执行导出 + export_success = export_datax.exportData() + + if not export_success: + print("错误:数据导出失败") + return False + + print("数据导出成功") + + # 清理导出参数 + export_datax.clearDataXParameter() + + print("数据交换流程完成") + return True + +# 执行完整流程 +if __name__ == "__main__": + import_and_export_data() +``` + +这个完整示例展示了数据交换的最佳实践:为导入和导出分别创建独立的 DataXScript 实例,在每个阶段完成后验证参数配置,并使用清晰的注释标记代码的不同阶段。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) + +## 最佳实践与注意事项 + +在使用数据交换参数配置时,遵循以下最佳实践可以避免常见问题,提高脚本的可靠性和可维护性。 + +### 参数配置建议 + +| 实践建议 | 说明 | 示例 | +|---------|------|------| +| 使用绝对路径 | 避免相对路径导致的路径解析错误 | `D:\data\input.shp` | +| 验证参数值 | 在执行前检查关键参数是否正确设置 | `if not import_path: raise Error` | +| 使用独立实例 | 为每次数据交换创建新的实例,避免参数污染 | `import_datax = DataXScript()` | +| 添加错误处理 | 捕获执行失败的情况,提供有意义的错误信息 | `if not success: log_error()` | +| 记录参数配置 | 保存使用的参数配置,便于问题排查和复现 | `save_config(params)` | + +### 常见问题排查 + +| 问题现象 | 可能原因 | 解决方法 | +|---------|---------|---------| +| 执行失败但无错误信息 | 参数名称拼写错误 | 检查参数名称是否正确 | +| 导入数据乱码 | 字符编码不匹配 | 设置正确的 `SourceEncoding` | +| 坐标位置偏移 | 坐标系统未设置或错误 | 配置正确的 `CoordSystem` | +| 导出文件过大 | 未启用几何压缩 | 设置 `CompressGeometry=true` | +| 部分图层未导出 | 图层过滤设置不当 | 检查 `LayerFilter` 参数 | + +### 性能优化建议 + +对于大规模数据交换任务,可以通过合理的参数配置优化性能: + +```python +# 性能优化的参数配置示例 +datax = DataXScript() + +# 使用较大的容差值减少精度但提高处理速度 +datax.setDataXParameter("Tolerance", "0.01") + +# 启用几何压缩减少文件大小和I/O时间 +datax.setDataXParameter("CompressGeometry", "true") + +# 批量导入导出时关闭不必要的日志 +datax.setDataXParameter("Verbose", "false") + +# 对于MDB格式,使用索引加速后续查询 +datax.setDataXParameter("CreateIndex", "true") +``` + +性能优化需要在数据精度和处理速度之间取得平衡,应根据实际应用场景选择合适的参数值。 + +Sources: [PySSDataX.py](PySSDataX.py#L117-L157) + +## 学习路径建议 + +掌握了数据交换参数配置的基础知识后,建议按照以下路径深入学习: + +1. 继续学习 **[导入外部数据](27-dao-ru-wai-bu-shu-ju)**,了解特定格式(如 SHP、MDB、DXF)的导入细节和特殊参数配置。 + +2. 学习 **[导出数据到文件](28-dao-chu-shu-ju-dao-wen-jian)**,掌握不同导出格式的参数要求和优化技巧。 + +3. 探索 **[自定义数据交换流程](29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng)**,了解如何结合选择集操作、属性修改等功能构建复杂的数据处理流程。 + +4. 参考 **[数学计算工具](43-shu-xue-ji-suan-gong-ju)** 和 **[坐标转换工具](44-zuo-biao-zhuan-huan-gong-ju)**,学习如何在数据交换过程中进行几何计算和坐标变换。 + +通过系统地学习这些内容,您将能够构建强大的数据交换和处理自动化脚本,大幅提升 GIS 数据管理效率。 \ No newline at end of file diff --git a/docs/content/27-dao-ru-wai-bu-shu-ju.md b/docs/content/27-dao-ru-wai-bu-shu-ju.md new file mode 100644 index 0000000..21e4612 --- /dev/null +++ b/docs/content/27-dao-ru-wai-bu-shu-ju.md @@ -0,0 +1,685 @@ +本页面详细介绍如何将各种格式的外部数据导入到 SunvStation 工作空间中。数据导入是地理信息系统中最常用的功能之一,通过合理配置导入参数,您可以精确控制数据转换行为,包括坐标系统、编码方式、图层映射等关键属性。掌握数据导入功能是构建数据处理流程的基础技能。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L157) + +## 数据导入架构概览 + +数据导入功能基于 **DataXScript** 类实现,该类通过参数配置与执行分离的设计模式,提供了灵活且可扩展的数据交换框架。导入过程涉及数据源类型识别、参数配置、坐标转换和数据验证等多个环节,确保导入的数据能够正确集成到 SunvStation 工作空间中。 + +```mermaid +graph TB + A[开始数据导入] --> B[准备导入参数] + B --> C{识别数据源类型} + C -->|Shapefile| D[SHP 格式处理] + C -->|MDB| E[数据库格式处理] + C -->|DXF| F[CAD 格式处理] + C -->|其他| G[GDAL 通用处理] + D --> H[创建 DataXScript 实例] + E --> H + F --> H + G --> H + H --> I[配置导入参数] + I --> J[importData 执行导入] + J --> K{导入成功?} + K -->|是| L[验证导入结果] + K -->|否| M[检查错误信息] + L --> N[更新工作空间] + M --> N +``` + +数据导入的核心是 **DataXScript** 类,该类不作为全局单例暴露,因此每次导入任务都需要创建新的实例。这种设计避免了不同导入任务之间的参数污染,提高了脚本的隔离性和安全性。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L120) + +## 支持的数据源类型 + +SunvStation 支持通过 GDAL 和 OGR 库导入多种常见的数据格式。系统通过静态方法 `DataSource.getDataSourceTypeByExt()` 自动识别文件扩展名并选择合适的数据源处理器。 + +### 标准矢量数据格式 + +| 格式名称 | 文件扩展名 | 数据源类型 | 支持的几何类型 | 适用场景 | +|---------|-----------|-----------|--------------|---------| +| Shapefile | `.shp` | `e_DataSource_EPS_GDAL` | 点、线、面 | 基础矢量数据交换 | +| Personal Geodatabase | `.mdb` | `e_DataSource_EPS_GDAL` | 点、线、面 | ArcGIS 数据格式 | +| File Geodatabase | `.gdb` | `e_DataSource_EPS_GDAL` | 点、线、面 | 大型空间数据库 | +| GeoPackage | `.gpkg` | `e_DataSource_EPS_GDAL` | 点、线、面 | 现代 GIS 数据格式 | +| KML/KMZ | `.kml`, `.kmz` | `e_DataSource_EPS_GDAL` | 点、线、面 | Google Earth 数据 | +| GeoJSON | `.geojson`, `.json` | `e_DataSource_EPS_GDAL` | 点、线、面 | Web GIS 数据 | +| CSV | `.csv` | `e_DataSource_EPS_GDAL` | 点(含坐标) | 表格坐标数据 | + +### CAD 和工程数据格式 + +| 格式名称 | 文件扩展名 | 数据源类型 | 支持的几何类型 | 适用场景 | +|---------|-----------|-----------|--------------|---------| +| AutoCAD DXF | `.dxf` | `e_DataSource_DWG` | 点、线、面、文字 | CAD 数据交换 | +| AutoCAD DWG | `.dwg` | `e_DataSource_DWG` | 点、线、面、文字 | AutoCAD 原生格式 | + +### 栅格和影像数据格式 + +| 格式名称 | 文件扩展名 | 数据源类型 | 支持的数据类型 | 适用场景 | +|---------|-----------|-----------|--------------|---------| +| GeoTIFF | `.tif`, `.tiff` | `e_DataSource_IMG` | 栅格影像 | 高精度正射影像 | +| ECW | `.ecw` | `e_DataSource_IMG` | 压缩栅格 | 大幅面影像 | +| JPEG 2000 | `.jp2`, `.j2k` | `e_DataSource_IMG` | 压缩栅格 | 无损压缩影像 | +| PNG | `.png` | `e_DataSource_IMG` | 栅格影像 | 网络影像服务 | +| BMP | `.bmp` | `e_DataSource_IMG` | 栅格影像 | 简单栅格数据 | + +### 三维和点云数据格式 + +| 格式名称 | 文件扩展名 | 数据源类型 | 支持的数据类型 | 适用场景 | +|---------|-----------|-----------|--------------|---------| +| 3D Tiles | `.3dtiles` | `e_DataSource_3DTILES` | 三维瓦片 | Web 三维场景 | +| 3D Model | `.3ds`, `.obj` | `e_DataSource_3DModel` | 三维模型 | 三维建筑数据 | +| LAS/LAZ | `.las`, `.laz` | `e_DataSource_PCD` | 点云数据 | 激光扫描数据 | +| DEM | `.dem` | `e_DataSource_DEM` | 数字高程模型 | 地形数据 | +| DSM | `.dsm` | `e_DataSource_DSM` | 数字表面模型 | 地表高程数据 | + +Sources: [PySSDataSource.py](PySSDataSource.py#L330-L345) + +## 数据导入核心方法 + +DataXScript 类提供了执行数据导入的核心方法。这些方法构成了数据导入的完整流程,从参数配置到结果验证。 + +| 方法名称 | 方法签名 | 功能描述 | 返回值 | +|---------|---------|---------|--------| +| `importData` | `importData()` | 执行数据导入操作 | 布尔值,表示是否成功 | +| `getImportFileName` | `getImportFileName()` | 获取实际导入的文件名 | 字符串形式的文件名 | + +### 执行数据导入 + +`importData()` 方法是数据导入的核心执行方法,它会根据之前配置的参数完成实际的导入操作。该方法会自动处理坐标转换、编码解析、数据验证等复杂过程,将外部数据正确加载到当前工作空间中。 + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 配置导入参数 +datax.setDataXParameter("ImportPath", "D:\\gis_data\\roads.shp") +datax.setDataXParameter("SourceEncoding", "GBK") +datax.setDataXParameter("CoordSystem", "EPSG:4326") +datax.setDataXParameter("LayerMapping", "道路") +datax.setDataXParameter("OverwriteExisting", "true") + +# 执行数据导入 +success = datax.importData() + +if success: + print("数据导入成功") +else: + print("数据导入失败,请检查参数配置") +``` + +`importData()` 方法的返回值是一个布尔值,表示导入操作是否成功。如果导入失败,通常是由于参数配置错误、文件不存在、格式不兼容或权限问题导致的。 + +Sources: [PySSDataX.py](PySSDataX.py#L148-L152) + +### 获取导入文件名 + +`getImportFileName()` 方法用于获取实际导入的文件名称。在某些情况下,系统可能会根据命名规则对导入的文件名进行调整(如添加时间戳、避免命名冲突等),因此实际导入的文件名可能与原始文件名不同。 + +```python +# 执行导入后获取文件名 +success = datax.importData() + +if success: + import_file = datax.getImportFileName() + print(f"导入的文件名: {import_file}") + + # 可以使用这个文件名进行后续操作 + # 例如:记录到日志、显示给用户等 +``` + +`getImportFileName()` 方法对于调试和记录非常有用,特别是在批量导入或自动化脚本中,可以帮助您追踪实际导入的文件。 + +Sources: [PySSDataX.py](PySSDataX.py#L142-L146) + +## 数据导入流程详解 + +完整的数据导入流程包括文件识别、参数配置、执行导入和结果验证四个阶段。理解每个阶段的关键点和注意事项可以帮助您编写更健壮的导入脚本。 + +### 第一步:准备和验证源文件 + +在开始导入前,确保源文件满足基本要求:文件路径正确、文件格式支持、文件可访问。您可以使用静态方法 `DataSource.getDataSourceTypeByExt()` 预先识别数据源类型。 + +```python +from sunvpy.PySSDataSource import DataSource +import os + +# 定义源文件路径 +source_file = "D:\\gis_data\\survey.shp" + +# 验证文件是否存在 +if not os.path.exists(source_file): + raise FileNotFoundError(f"源文件不存在: {source_file}") + +# 识别数据源类型 +data_type = DataSource.getDataSourceTypeByExt(source_file) +print(f"识别的数据源类型: {data_type}") +``` + +文件验证是数据导入流程中的关键第一步,通过提前检查文件存在性和类型,可以避免后续导入过程中的错误。 + +Sources: [PySSDataSource.py](PySSDataSource.py#L430-L432) + +### 第二步:配置导入参数 + +参数配置是数据导入的核心环节。不同的数据格式可能需要不同的参数配置,但大多数导入任务都包含以下基本参数。 + +```mermaid +flowchart LR + A[开始参数配置] --> B[设置 ImportPath
源文件路径] + B --> C[设置 SourceEncoding
字符编码] + C --> D[设置 CoordSystem
坐标系统] + D --> E{需要图层映射?} + E -->|是| F[设置 LayerMapping
图层映射规则] + E -->|否| G{需要覆盖已有数据?} + F --> G + G -->|是| H[设置 OverwriteExisting
覆盖标志] + G -->|否| I[完成参数配置] + H --> I +``` + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 配置基础导入参数 +datax.setDataXParameter("ImportPath", "D:\\gis_data\\survey.shp") + +# 设置字符编码(根据源文件实际编码) +datax.setDataXParameter("SourceEncoding", "GBK") + +# 设置坐标系统(如果需要坐标转换) +datax.setDataXParameter("CoordSystem", "EPSG:4326") + +# 设置图层映射(可选) +datax.setDataXParameter("LayerMapping", "测区数据") + +# 设置是否覆盖已有数据(可选) +datax.setDataXParameter("OverwriteExisting", "true") + +# 设置几何容差(可选,用于简化几何) +datax.setDataXParameter("Tolerance", "0.001") +``` + +参数配置时应遵循以下原则:使用绝对路径、明确指定编码方式、设置正确的坐标系统、根据需求配置图层映射和覆盖选项。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L146) + +### 第三步:执行数据导入 + +参数配置完成后,调用 `importData()` 方法执行导入操作。导入过程中可能会显示进度条(如果启用),系统会自动处理数据解析、坐标转换、属性映射等复杂操作。 + +```python +# 执行数据导入 +print("开始导入数据...") +success = datax.importData() + +if success: + print("数据导入成功") + import_file = datax.getImportFileName() + print(f"导入文件: {import_file}") +else: + print("数据导入失败") + # 可以添加更详细的错误处理逻辑 +``` + +导入操作可能会持续较长时间,特别是对于大型数据集。建议在导入前提示用户,并在导入完成后给出明确的反馈信息。 + +Sources: [PySSDataX.py](PySSDataX.py#L148-L152) + +### 第四步:验证导入结果 + +导入完成后,应验证数据是否正确加载到工作空间中。可以通过检查数据集数量、对象数量、属性完整性等方式进行验证。 + +```python +from sunvpy.PySSProcess import SSProcess + +# 获取当前工作空间的数据集列表 +dataset_list = SSProcess.map.getCurrentDataSource().getDatasetList() +print(f"导入后的数据集数量: {dataset_list.size()}") + +# 如果知道具体的数据集名称,可以进一步验证 +for i in range(dataset_list.size()): + dataset = dataset_list.at(i) + dataset_name = dataset.getName() + print(f"数据集 {i}: {dataset_name}") +``` + +验证导入结果是确保数据质量的重要步骤。特别是对于自动化脚本,应建立完善的验证机制,及时发现并处理导入过程中的问题。 + +Sources: [PySSDataSource.py](PySSDataSource.py#L418-L422) + +## 完整导入示例 + +以下是一个完整的 Shapefile 数据导入示例,包含了文件验证、参数配置、导入执行和结果验证的全过程。 + +```python +import os +from sunvpy.PySSDataX import DataXScript +from sunvpy.PySSDataSource import DataSource +from sunvpy.PySSProcess import SSProcess + +def import_shapefile(source_path: str, target_encoding: str = "GBK", + coord_system: str = "EPSG:4326", + layer_name: str = "导入数据", + overwrite: bool = True) -> bool: + """ + 导入 Shapefile 数据到当前工作空间 + + 参数: + source_path: 源文件路径 + target_encoding: 目标字符编码,默认为 GBK + coord_system: 坐标系统,默认为 EPSG:4326 + layer_name: 映射的图层名称 + overwrite: 是否覆盖已有数据 + + 返回: + bool: 导入是否成功 + """ + # ========== 第一步:验证源文件 ========== + print(f"验证源文件: {source_path}") + + if not os.path.exists(source_path): + print(f"错误:源文件不存在: {source_path}") + return False + + # 识别数据源类型 + data_type = DataSource.getDataSourceTypeByExt(source_path) + print(f"识别的数据源类型: {data_type}") + + if not source_path.lower().endswith('.shp'): + print(f"警告:文件扩展名不是 .shp,可能不是 Shapefile 格式") + + # ========== 第二步:配置导入参数 ========== + print("配置导入参数...") + + datax = DataXScript() + + # 设置源文件路径(使用绝对路径) + datax.setDataXParameter("ImportPath", os.path.abspath(source_path)) + + # 设置源文件编码 + datax.setDataXParameter("SourceEncoding", target_encoding) + + # 设置坐标系统 + datax.setDataXParameter("CoordSystem", coord_system) + + # 设置图层映射 + datax.setDataXParameter("LayerMapping", layer_name) + + # 设置是否覆盖已有数据 + datax.setDataXParameter("OverwriteExisting", "true" if overwrite else "false") + + # 设置几何容差(可选,用于简化几何) + datax.setDataXParameter("Tolerance", "0.001") + + # ========== 第三步:执行数据导入 ========== + print("执行数据导入...") + success = datax.importData() + + if not success: + print("错误:数据导入失败") + return False + + # ========== 第四步:验证导入结果 ========== + print("验证导入结果...") + + import_file = datax.getImportFileName() + print(f"导入的文件名: {import_file}") + + # 获取当前数据源 + current_datasource = SSProcess.map.getCurrentDataSource() + if current_datasource is None: + print("错误:无法获取当前数据源") + return False + + # 获取数据集列表 + dataset_list = current_datasource.getDatasetList() + print(f"导入后的数据集数量: {dataset_list.size()}") + + # 清理参数 + datax.clearDataXParameter() + + print("数据导入流程完成") + return True + +# 使用示例 +if __name__ == "__main__": + # 导入 Shapefile 数据 + result = import_shapefile( + source_path="D:\\gis_data\\roads.shp", + target_encoding="GBK", + coord_system="EPSG:4326", + layer_name="道路", + overwrite=True + ) + + if result: + print("导入成功") + else: + print("导入失败") +``` + +这个完整的示例展示了数据导入的最佳实践:在每一步都进行验证、使用绝对路径、提供详细的日志输出、正确处理错误情况。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L157) + +## 批量导入数据 + +在实际应用中,经常需要批量导入多个文件。以下示例展示了如何批量导入一个目录下的所有 Shapefile 文件。 + +```python +import os +from sunvpy.PySSDataX import DataXScript +from sunvpy.PySSDataSource import DataSource + +def batch_import_shapefiles(directory: str, pattern: str = "*.shp") -> dict: + """ + 批量导入目录下的 Shapefile 文件 + + 参数: + directory: 包含源文件的目录 + pattern: 文件匹配模式,默认为 *.shp + + 返回: + dict: 导入结果统计 {成功: 数量, 失败: 数量, 文件列表: [结果]} + """ + results = { + "success_count": 0, + "fail_count": 0, + "files": [] + } + + # 获取目录下所有匹配的文件 + import glob + files = glob.glob(os.path.join(directory, pattern)) + + print(f"找到 {len(files)} 个文件待导入") + + for index, source_file in enumerate(files, 1): + file_name = os.path.basename(source_file) + print(f"\n[{index}/{len(files)}] 导入文件: {file_name}") + + try: + # 为每个文件创建独立的 DataXScript 实例 + datax = DataXScript() + + # 配置导入参数 + datax.setDataXParameter("ImportPath", os.path.abspath(source_file)) + datax.setDataXParameter("SourceEncoding", "GBK") + datax.setDataXParameter("CoordSystem", "EPSG:4326") + datax.setDataXParameter("LayerMapping", f"批量导入_{file_name}") + datax.setDataXParameter("OverwriteExisting", "true") + + # 执行导入 + success = datax.importData() + + if success: + import_file = datax.getImportFileName() + print(f" 导入成功: {import_file}") + results["success_count"] += 1 + results["files"].append({ + "file": file_name, + "status": "成功", + "imported_as": import_file + }) + else: + print(f" 导入失败") + results["fail_count"] += 1 + results["files"].append({ + "file": file_name, + "status": "失败", + "error": "未知错误" + }) + + # 清理参数 + datax.clearDataXParameter() + + except Exception as e: + print(f" 导入异常: {str(e)}") + results["fail_count"] += 1 + results["files"].append({ + "file": file_name, + "status": "异常", + "error": str(e) + }) + + # 输出汇总信息 + print(f"\n批量导入完成:") + print(f" 成功: {results['success_count']} 个") + print(f" 失败: {results['fail_count']} 个") + print(f" 总计: {len(files)} 个") + + return results + +# 使用示例 +if __name__ == "__main__": + # 批量导入目录下所有 SHP 文件 + results = batch_import_shapefiles("D:\\gis_data\\batch_import") +``` + +批量导入时,为每个文件创建独立的 DataXScript 实例可以避免参数污染,同时使用 try-except 捕获异常,确保单个文件的失败不会影响整个批量导入流程。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L120) + +## 常见导入场景与参数配置 + +不同的导入场景需要不同的参数配置策略。以下是几种常见导入场景的参数配置示例。 + +### 场景一:导入带中文字段的 Shapefile + +中文数据导入时最常见的问题是字符编码。如果源文件的编码与系统默认编码不匹配,导入后会出现乱码。 + +```python +datax = DataXScript() + +# 导入带中文字段的 Shapefile +datax.setDataXParameter("ImportPath", "D:\\data\\chinese_roads.shp") +datax.setDataXParameter("SourceEncoding", "GBK") # 中文 Windows 通常使用 GBK +datax.setDataXParameter("CoordSystem", "EPSG:4326") +datax.setDataXParameter("LayerMapping", "中文道路") + +success = datax.importData() +``` + +如果仍然出现乱码,可以尝试其他编码格式,如 `UTF-8`、`BIG5`(繁体中文)等。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +### 场景二:导入不同坐标系统的数据 + +当源数据的坐标系统与工作空间不同时,需要指定正确的坐标系统参数以实现坐标转换。 + +```python +datax = DataXScript() + +# 导入坐标系统为 EPSG:3857 (Web Mercator) 的数据 +# 转换为目标坐标系统 EPSG:4326 (WGS84) +datax.setDataXParameter("ImportPath", "D:\\data\\web_mercator_data.shp") +datax.setDataXParameter("SourceCoordSystem", "EPSG:3857") # 源坐标系统 +datax.setDataXParameter("TargetCoordSystem", "EPSG:4326") # 目标坐标系统 +datax.setDataXParameter("CoordSystem", "EPSG:4326") # 最终坐标系统 +datax.setDataXParameter("TransformMode", "AUTO") # 自动选择转换模式 + +success = datax.importData() +``` + +坐标系统参数通常使用 EPSG 代码表示,例如 `EPSG:4326` 表示 WGS84 经纬度坐标,`EPSG:4490` 表示 CGCS2000 坐标系。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +### 场景三:导入 CAD 数据(DXF/DWG) + +CAD 数据通常包含图层、块、文字等复杂元素,导入时需要进行适当的配置。 + +```python +datax = DataXScript() + +# 导入 DXF 文件 +datax.setDataXParameter("ImportPath", "D:\\data\\city_plan.dxf") +datax.setDataXParameter("SourceEncoding", "GB2312") +datax.setDataXParameter("CoordSystem", "EPSG:4326") +datax.setDataXParameter("LayerMapping", "城市规划") + +# CAD 特定参数 +datax.setDataXParameter("ImportBlocks", "true") # 导入块 +datax.setDataXParameter("ImportText", "true") # 导入文字 +datax.setDataXParameter("ImportHatch", "false") # 不导入填充 +datax.setDataXParameter("ExplodeBlocks", "true") # 炸开块为独立对象 + +success = datax.importData() +``` + +CAD 数据导入时,可以根据实际需要选择导入哪些元素类型(块、文字、填充等),以减少数据冗余。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +### 场景四:增量导入数据 + +当需要将新数据追加到已有数据集中时,应设置 `OverwriteExisting` 参数为 `false`。 + +```python +datax = DataXScript() + +# 增量导入新数据 +datax.setDataXParameter("ImportPath", "D:\\data\\new_survey.shp") +datax.setDataXParameter("SourceEncoding", "GBK") +datax.setDataXParameter("CoordSystem", "EPSG:4326") +datax.setDataXParameter("LayerMapping", "测区数据") +datax.setDataXParameter("OverwriteExisting", "false") # 不覆盖已有数据 + +success = datax.importData() +``` + +增量导入时,系统会将新数据追加到目标数据集中,保留已有数据不变。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +## 错误排查与问题解决 + +数据导入过程中可能会遇到各种问题。本节介绍常见错误现象及其解决方法。 + +### 常见错误与解决方案 + +| 错误现象 | 可能原因 | 解决方法 | +|---------|---------|---------| +| `importData()` 返回 False | 参数名称拼写错误 | 检查参数名称是否与系统预定义一致 | +| 导入后字段乱码 | 字符编码不匹配 | 使用正确的 `SourceEncoding` 参数值 | +| 坐标位置偏移 | 坐标系统未设置或错误 | 配置正确的 `CoordSystem` 和转换参数 | +| 部分对象未导入 | 图层过滤或数据范围限制 | 检查 `LayerFilter` 参数和源数据完整性 | +| 文件打开失败 | 文件被占用或权限不足 | 关闭文件访问程序,检查文件权限 | +| 内存不足 | 数据量过大 | 分批次导入,设置 `Tolerance` 简化几何 | + +### 调试技巧 + +在遇到导入问题时,可以使用以下调试技巧: + +```python +from sunvpy.PySSDataX import DataXScript + +datax = DataXScript() + +# 配置参数 +datax.setDataXParameter("ImportPath", "D:\\data\\problem_file.shp") +datax.setDataXParameter("SourceEncoding", "GBK") + +# 在执行前验证关键参数 +import_path = datax.getDataXParameter("ImportPath") +encoding = datax.getDataXParameter("SourceEncoding") +coord_system = datax.getDataXParameter("CoordSystem") + +print(f"导入路径: {import_path}") +print(f"字符编码: {encoding}") +print(f"坐标系统: {coord_system if coord_system else '未设置'}") + +# 执行导入 +success = datax.importData() + +if not success: + print("导入失败,请检查:") + print(" 1. 文件是否存在且可访问") + print(" 2. 文件格式是否正确") + print(" 3. 参数配置是否完整") + print(" 4. 系统是否有足够内存") +``` + +调试时应逐步验证每个环节,从文件验证到参数配置,再到执行结果,通过日志输出追踪问题所在。 + +Sources: [PySSDataX.py](PySSDataX.py#L130-L146) + +## 性能优化建议 + +对于大规模数据导入任务,可以通过合理的参数配置和策略优化性能。 + +### 优化参数配置 + +```python +datax = DataXScript() + +datax.setDataXParameter("ImportPath", "D:\\data\\large_dataset.shp") + +# 性能优化参数 +datax.setDataXParameter("Tolerance", "0.01") # 使用较大的容差值简化几何 +datax.setDataXParameter("CompressGeometry", "true") # 压缩几何数据 +datax.setDataXParameter("CreateIndex", "true") # 创建空间索引加速查询 +datax.setDataXParameter("Verbose", "false") # 关闭详细日志减少I/O + +success = datax.importData() +``` + +性能优化需要在数据精度和处理速度之间取得平衡。容差值越大,几何简化程度越高,处理速度越快,但数据精度会降低。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +### 分批导入策略 + +对于超大规模数据集,可以考虑分批导入: + +```python +def batch_import_large_dataset(source_file: str, batch_size: int = 10000): + """ + 分批导入大数据集(示例) + + 注意:实际分批导入需要根据具体实现调整 + """ + import os + + file_size = os.path.getsize(source_file) + print(f"源文件大小: {file_size / (1024*1024):.2f} MB") + + if file_size > 100 * 1024 * 1024: # 超过 100MB + print("警告:文件较大,建议分批导入") + + # 可以考虑使用 GIS 工具先将大文件分割 + # 然后分批导入 + print("提示:使用 QGIS、ArcGIS 等工具分割大文件后,分批导入") + return False + + # 直接导入 + datax = DataXScript() + datax.setDataXParameter("ImportPath", source_file) + datax.setDataXParameter("Tolerance", "0.01") + + return datax.importData() +``` + +分批导入策略适用于超大型数据集,通常需要借助外部 GIS 工具先将数据分割,然后分批导入。 + +Sources: [PySSDataX.py](PySSDataX.py#L148-L152) + +## 学习路径建议 + +掌握了数据导入的基础知识后,建议按照以下路径深入学习: + +1. 继续学习 **[数据交换参数配置](26-shu-ju-jiao-huan-can-shu-pei-zhi)**,深入了解各类参数的作用和配置技巧。 + +2. 学习 **[导出数据到文件](28-dao-chu-shu-ju-dao-wen-jian)**,掌握数据导出的完整流程和参数配置。 + +3. 探索 **[自定义数据交换流程](29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng)**,构建复杂的数据处理工作流。 + +4. 参考 **[数据检查与验证](30-shu-ju-jian-cha-ji-lu-guan-li)**,了解导入后如何检查和验证数据质量。 \ No newline at end of file diff --git a/docs/content/28-dao-chu-shu-ju-dao-wen-jian.md b/docs/content/28-dao-chu-shu-ju-dao-wen-jian.md new file mode 100644 index 0000000..2c6430f --- /dev/null +++ b/docs/content/28-dao-chu-shu-ju-dao-wen-jian.md @@ -0,0 +1,507 @@ +本页面详细介绍如何将 SunvStation 工作空间中的地理数据导出为各种格式的文件。数据导出是地理信息系统数据共享和交换的重要手段,通过合理配置导出参数,您可以精确控制输出格式、编码方式、坐标系统和属性字段映射等关键属性,确保导出的数据能够满足不同应用场景的需求。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) + +## 数据导出架构概览 + +数据导出功能基于 **DataXScript** 类实现,该类采用与数据导入相同的架构设计,通过参数配置与执行分离的模式,提供了灵活且可扩展的数据交换框架。导出过程涉及数据源识别、参数配置、坐标转换、属性映射和文件生成等多个环节,确保导出的数据能够在其他系统中正确加载和使用。 + +```mermaid +graph TB + A[开始数据导出] --> B[准备导出数据源] + B --> C{识别导出格式} + C -->|Shapefile| D[SHP 格式处理] + C -->|MDB| E[数据库格式处理] + C -->|DXF| F[CAD 格式处理] + C -->|GeoJSON| G[Web 格式处理] + C -->|其他| H[GDAL 通用处理] + D --> I[创建 DataXScript 实例] + E --> I + F --> I + G --> I + H --> I + I --> J[配置导出参数] + J --> K[exportData 执行导出] + K --> L{导出成功?} + L -->|是| M[验证输出文件] + L -->|否| N[检查错误信息] + M --> O[导出完成] + N --> O +``` + +DataXScript 类作为数据导出的核心组件,提供了完整的参数管理和执行接口。与数据导入类似,导出功能也不依赖全局单例,每次导出任务都需要创建新的实例。这种设计确保了不同导出任务之间的参数隔离,提高了脚本的可靠性和可维护性。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L120) + +## 支持的导出格式 + +SunvStation 支持通过 GDAL 和 OGR 库导出多种常见的数据格式,覆盖了从传统 GIS 格式到现代 Web GIS 格式的广泛范围。系统会根据指定的输出文件扩展名自动选择合适的导出驱动器,并应用相应的格式转换规则。 + +### 标准矢量数据格式 + +| 格式名称 | 文件扩展名 | 导出特点 | 几何类型支持 | 属性字段限制 | +|---------|-----------|---------|------------|------------| +| Shapefile | `.shp` | 最常用的交换格式,字段名限制 10 字符 | 点、线、面 | 单文件 2GB 限制 | +| Personal Geodatabase | `.mdb` | Microsoft Access 数据库,支持复杂关系 | 点、线、面 | 2GB 数据库限制 | +| File Geodatabase | `.gdb` | Esri 现代格式,支持大数据量 | 点、线、面 | 单数据集 1TB 限制 | +| GeoPackage | `.gpkg` | OGC 标准,轻量级跨平台 | 点、线、面 | 无明确大小限制 | +| KML/KMZ | `.kml`, `.kmz` | Google Earth 格式,支持样式和标注 | 点、线、面 | 适合可视化展示 | +| GeoJSON | `.geojson`, `.json` | Web 标准,基于 JSON | 点、线、面 | 适合 Web 应用 | +| CSV | `.csv` | 文本表格格式,可导出坐标信息 | 点(带坐标) | 适合表格处理 | + +### CAD 和工程数据格式 + +| 格式名称 | 文件扩展名 | 导出特点 | 几何类型支持 | 样式保留 | +|---------|-----------|---------|------------|---------| +| AutoCAD DXF | `.dxf` | 开放的 CAD 交换格式 | 点、线、面、文字 | 部分样式保留 | +| AutoCAD DWG | `.dwg` | AutoCAD 原生格式 | 点、线、面、文字 | 完整样式保留 | + +### 栅格和影像数据格式 + +| 格式名称 | 文件扩展名 | 导出特点 | 压缩支持 | 适用场景 | +|---------|-----------|---------|---------|---------| +| GeoTIFF | `.tif`, `.tiff` | 地理信息标准格式 | LZW, DEFLATE, JPEG | 高质量影像输出 | +| ECW | `.ecw` | 高压缩率格式 | 小波压缩 | 大幅面影像压缩 | +| JPEG 2000 | `.jp2`, `.j2k` | 无损压缩标准 | JPEG 2000 压缩 | 专业影像处理 | +| PNG | `.png` | Web 常用格式 | 无损压缩 | Web 地图服务 | +| BMP | `.bmp` | 简单位图格式 | 无压缩 | 兼容性要求高的场景 | + +Sources: [PySSDataSource.py](PySSDataSource.py#L330-L345) + +## 数据导出核心方法 + +DataXScript 类提供了执行数据导出的核心方法集。这些方法构成了数据导出的完整流程,从参数配置到执行导出,再到结果验证。理解这些方法的调用顺序和依赖关系是成功实现数据导出的关键。 + +| 方法名称 | 方法签名 | 功能描述 | 返回值 | +|---------|---------|---------|--------| +| `exportData` | `exportData()` | 执行数据导出操作 | 布尔值,表示是否成功 | +| `setDataXParameter` | `setDataXParameter(name, value)` | 设置导出参数 | 无 | +| `getDataXParameter` | `getDataXParameter(name)` | 获取参数当前值 | 字符串形式的参数值 | +| `clearDataXParameter` | `clearDataXParameter()` | 清除所有参数 | 无 | + +### 执行数据导出 + +`exportData()` 方法是数据导出的核心执行方法,它会根据之前配置的参数完成实际的导出操作。该方法会自动处理坐标转换、编码转换、属性映射、格式转换等复杂过程,将工作空间中的数据正确输出到指定的目标文件中。 + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 配置导出参数 +datax.setDataXParameter("ExportPath", "D:\\export\\roads.shp") +datax.setDataXParameter("TargetEncoding", "UTF-8") + +# 执行导出 +success = datax.exportData() +if success: + print("数据导出成功!") +else: + print("数据导出失败,请检查参数配置。") +``` + +`exportData()` 方法的返回值是一个布尔值,`True` 表示导出成功,`False` 表示导出失败。在实际应用中,应该始终检查返回值,并根据结果进行相应的错误处理和用户提示。 + +Sources: [PySSDataX.py](PySSDataX.py#L157-L161) + +## 完整导出流程 + +数据导出需要遵循一定的操作顺序,从参数配置到执行导出,再到结果验证。下图展示了完整的导出流程,包括每个步骤的决策点和可能的错误处理路径。 + +```mermaid +flowchart TD + Start([开始数据导出]) --> Create[创建 DataXScript 实例] + Create --> SetPath[设置 ExportPath 参数] + SetPath --> CheckPath{路径有效?} + CheckPath -->|否| PathError[提示路径错误并结束] + CheckPath -->|是| SetFormat[设置格式相关参数] + SetFormat --> SetEncoding[设置 TargetEncoding] + SetEncoding --> SetCoord[设置坐标系统参数] + SetCoord --> SetFields[设置字段映射参数] + SetFields --> Export[调用 exportData] + Export --> CheckResult{导出成功?} + CheckResult -->|否| AnalyzeError[分析错误原因] + AnalyzeError --> Retry{是否重试?} + Retry -->|是| SetPath + Retry -->|否| ErrorEnd([结束并报告错误]) + CheckResult -->|是| Verify[验证输出文件] + Verify --> Valid{文件有效?} + Valid -->|否| WarningEnd([结束并显示警告]) + Valid -->|是| SuccessEnd([导出成功完成]) +``` + +Sources: [PySSDataX.py](PySSDataX.py#L120-L161) + +## 导出参数配置详解 + +数据导出的行为完全由参数配置决定。理解每个参数的作用和取值范围,对于实现精确控制导出结果至关重要。本节详细介绍常用的导出参数及其配置方法。 + +### 基础路径和格式参数 + +| 参数名称 | 参数说明 | 示例值 | 必填性 | +|---------|---------|-------|--------| +| `ExportPath` | 导出目标文件完整路径 | `D:\data\export\roads.shp` | 必填 | +| `ExportFormat` | 导出格式驱动名称 | `ESRI Shapefile` | 可选(自动推断) | +| `TargetEncoding` | 目标文件编码 | `UTF-8`, `GBK` | 推荐 | +| `Overwrite` | 是否覆盖已存在文件 | `true`, `false` | 可选(默认 false) | + +```python +# 配置基础导出参数 +datax.setDataXParameter("ExportPath", "D:\\export\\buildings.shp") +datax.setDataXParameter("TargetEncoding", "UTF-8") +datax.setDataXParameter("Overwrite", "true") +``` + +`ExportPath` 是最关键的参数,它不仅指定了输出文件的路径,其扩展名也决定了导出格式。系统会根据文件扩展名自动选择合适的驱动器。如果需要使用非标准扩展名,可以通过 `ExportFormat` 参数显式指定驱动名称。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +### 坐标系统参数 + +| 参数名称 | 参数说明 | 示例值 | 适用场景 | +|---------|---------|-------|---------| +| `CoordSystem` | 目标坐标系统 EPSG 代码 | `EPSG:4326`, `EPSG:3857` | 坐标转换 | +| `CoordTransform` | 坐标转换方法 | `nearest`, `bilinear` | 栅格重采样 | +| `SpatialRef` | 空间参考定义 | `.prj` 文件路径 | 自定义投影 | + +```python +# 导出为 WGS84 坐标系统 +datax.setDataXParameter("CoordSystem", "EPSG:4326") + +# 导出为墨卡托投影(Web Mercator) +datax.setDataXParameter("CoordSystem", "EPSG:3857") +``` + +坐标系统参数在需要将数据从工作空间坐标系统转换为其他坐标系统时非常重要。系统会在导出过程中自动执行坐标转换,确保输出的数据具有正确的空间参考信息。对于栅格数据,`CoordTransform` 参数可以指定重采样方法。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +### 字段映射和筛选参数 + +| 参数名称 | 参数说明 | 示例值 | 适用场景 | +|---------|---------|-------|---------| +| `FieldList` | 要导出的字段列表(逗号分隔) | `SSObj_ID,SSObj_Name,SSObj_Code` | 字段筛选 | +| `FieldMapping` | 字段映射规则 | `原字段名:目标字段名` | 字段重命名 | +| `FieldFilter` | 字段过滤表达式 | `SSObj_Code <> '3103013'` | 条件导出 | + +```python +# 只导出指定字段 +datax.setDataXParameter("FieldList", "SSObj_ID,SSObj_Name,SSObj_Area") + +# 字段重命名映射 +datax.setDataXParameter("FieldMapping", "SSObj_Name:Name,SSObj_Area:Area") + +# 导出时不包含特定编码的对象 +datax.setDataXParameter("FieldFilter", "SSObj_Code <> 'TEMP'") +``` + +字段映射和筛选参数提供了对导出数据的精细控制能力。通过 `FieldList` 参数,可以选择性地导出部分字段,减少输出文件的大小并提高导出效率。`FieldMapping` 参数可以在导出过程中重命名字段,使输出数据的字段名符合目标系统的命名规范。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L128) + +## 导出场景实战 + +本节通过具体的代码示例,展示在不同应用场景下如何配置导出参数并执行数据导出。这些示例涵盖了最常见的导出需求,您可以根据实际情况进行调整和扩展。 + +### 场景一:导出选择集数据为 Shapefile + +将当前选择集中的地理对象导出为 Shapefile 格式,适用于与其他 GIS 软件进行数据交换的场景。 + +```python +from sunvpy.PySSProcess import SSProcess +from sunvpy.PySSDataX import DataXScript +from sunvpy.ObjBaseAttr import ObjBaseAttr + +# 步骤 1:准备选择集数据 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +SSProcess.selectFilter() + +print(f"选择集对象数量: {SSProcess.getSelGeoCount()}") + +# 步骤 2:配置导出参数 +datax = DataXScript() +datax.setDataXParameter("ExportPath", "D:\\export\\roads_selection.shp") +datax.setDataXParameter("TargetEncoding", "UTF-8") +datax.setDataXParameter("Overwrite", "true") + +# 步骤 3:设置字段列表(只导出关键字段) +datax.setDataXParameter("FieldList", "SSObj_ID,SSObj_Code,SSObj_Name,SSObj_LayerName") + +# 步骤 4:执行导出 +success = datax.exportData() +if success: + print(f"成功导出 {SSProcess.getSelGeoCount()} 个对象到 roads_selection.shp") +else: + print("导出失败") +``` + +Sources: [PySSProcess.py](PySSProcess.py#L1-L70) + +### 场景二:导出为 GeoJSON 用于 Web 地图 + +将数据导出为 GeoJSON 格式,适用于在 Web GIS 应用中直接使用的场景。 + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 配置导出参数 +datax.setDataXParameter("ExportPath", "D:\\export\\webmap_buildings.geojson") +datax.setDataXParameter("TargetEncoding", "UTF-8") +datax.setDataXParameter("CoordSystem", "EPSG:4326") # WGS84 坐标 + +# 只导出建筑相关的字段 +datax.setDataXParameter("FieldList", "SSObj_ID,SSObj_Name,SSObj_Area,[JG],[CS]") + +# 执行导出 +success = datax.exportData() +if success: + print("GeoJSON 文件导出成功,可用于 Web 地图展示") +else: + print("GeoJSON 导出失败") +``` + +GeoJSON 格式使用 WGS84 坐标系统(EPSG:4326),这是 Web GIS 的标准坐标系统。如果原始数据使用其他坐标系统,导出时会自动进行坐标转换。 + +Sources: [PySSDataX.py](PySSDataX.py#L157-L161) + +### 场景三:导出为 AutoCAD DXF 格式 + +将地理数据导出为 DXF 格式,适用于与 CAD 软件进行数据交换的场景。 + +```python +from sunvpy.PySSDataX import DataXScript + +# 创建数据交换脚本实例 +datax = DataXScript() + +# 配置导出参数 +datax.setDataXParameter("ExportPath", "D:\\export\\survey_data.dxf") +datax.setDataXParameter("TargetEncoding", "UTF-8") +datax.setDataXParameter("Overwrite", "true") + +# 设置 CAD 相关参数(根据实际需求调整) +datax.setDataXParameter("CADVersion", "2007") # DXF 版本 +datax.setDataXParameter("CADLayer", "Survey") # 输出图层名 + +# 执行导出 +success = datax.exportData() +if success: + print("DXF 文件导出成功,可在 AutoCAD 中打开") +else: + print("DXF 导出失败") +``` + +DXF 导出时需要注意坐标系统的兼容性。CAD 软件通常使用局部坐标系统,如果工作空间数据使用大地坐标(如经纬度),可能需要进行坐标变换后再导出,或者使用专门的坐标转换工具。 + +Sources: [PySSDataX.py](PySSDataX.py#L120-L161) + +### 场景四:批量导出多个图层 + +将工作空间中的不同图层分别导出为独立的文件,适用于数据分发的场景。 + +```python +from sunvpy.PySSProcess import SSProcess +from sunvpy.PySSDataX import DataXScript +from sunvpy.ObjBaseAttr import ObjBaseAttr +import os + +# 获取所有图层 +layer_count = SSProcess.getLayerCount() +print(f"工作空间中共有 {layer_count} 个图层") + +# 创建导出目录 +export_dir = "D:\\export\\layers" +if not os.path.exists(export_dir): + os.makedirs(export_dir) + +# 遍历每个图层并导出 +for i in range(layer_count): + layer_name = SSProcess.getLayerName(i) + if not layer_name: + continue + + print(f"正在导出图层: {layer_name}") + + # 清除选择集并选择当前图层的所有对象 + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_LayerName", "==", layer_name) + SSProcess.selectFilter() + + geo_count = SSProcess.getSelGeoCount() + if geo_count == 0: + print(f" 图层 {layer_name} 无数据,跳过") + continue + + # 配置导出参数 + datax = DataXScript() + safe_layer_name = layer_name.replace(" ", "_") # 替换空格 + export_path = os.path.join(export_dir, f"{safe_layer_name}.shp") + + datax.setDataXParameter("ExportPath", export_path) + datax.setDataXParameter("TargetEncoding", "UTF-8") + datax.setDataXParameter("Overwrite", "true") + + # 执行导出 + success = datax.exportData() + if success: + print(f" 成功导出 {geo_count} 个对象到 {safe_layer_name}.shp") + else: + print(f" 图层 {layer_name} 导出失败") + +print("批量导出完成") +``` + +批量导出时需要注意文件名的合法性,Windows 文件系统不支持某些特殊字符(如 `< > : " / \ | ? *`),在构造文件名时应进行适当的处理和替换。 + +Sources: [PySSProcess.py](PySSProcess.py#L100-L140) + +## 错误处理与故障排除 + +数据导出过程中可能遇到各种错误,了解常见错误的成因和解决方法,可以帮助您快速定位问题并恢复导出操作。 + +### 常见导出错误及解决方案 + +| 错误现象 | 可能原因 | 解决方案 | +|---------|---------|---------| +| `exportData()` 返回 `False` | 输出路径无写入权限 | 检查路径权限,使用管理员权限运行 | +| 输出文件为空 | 选择集为空或参数配置错误 | 验证选择集对象数量,检查参数配置 | +| 字段名称被截断 | Shapefile 字段名限制 | 使用 `FieldMapping` 重命名长字段名 | +| 坐标系统错误 | EPSG 代码不正确 | 验证目标坐标系统的 EPSG 代码 | +| 编码乱码 | 编码参数不匹配 | 设置正确的 `TargetEncoding` 参数 | + +### 导出前参数验证清单 + +在执行 `exportData()` 前,建议进行以下参数验证,以提高导出成功率: + +```python +def validate_export_parameters(datax, export_path): + """验证导出参数的合法性""" + # 检查路径参数 + path_param = datax.getDataXParameter("ExportPath") + if not path_param or path_param != export_path: + print(f"错误:ExportPath 参数未正确设置") + return False + + # 检查路径是否可写 + import os + export_dir = os.path.dirname(export_path) + if not os.path.exists(export_dir): + print(f"错误:输出目录不存在: {export_dir}") + return False + if not os.access(export_dir, os.W_OK): + print(f"错误:输出目录无写入权限: {export_dir}") + return False + + # 检查编码参数 + encoding = datax.getDataXParameter("TargetEncoding") + if not encoding: + print("警告:未设置 TargetEncoding,可能使用默认编码") + + # 检查是否覆盖 + overwrite = datax.getDataXParameter("Overwrite") + if overwrite == "false" and os.path.exists(export_path): + print(f"错误:输出文件已存在且不允许覆盖: {export_path}") + return False + + return True + +# 使用验证函数 +datax = DataXScript() +datax.setDataXParameter("ExportPath", "D:\\export\\data.shp") +datax.setDataXParameter("Overwrite", "true") + +if validate_export_parameters(datax, "D:\\export\\data.shp"): + success = datax.exportData() + print(f"导出{'成功' if success else '失败'}") +``` + +Sources: [PySSDataX.py](PySSDataX.py#L130-L140) + +## 最佳实践与性能优化 + +在实际开发中,遵循一些最佳实践可以显著提高数据导出的效率和可靠性。本节总结了基于项目经验积累的优化建议。 + +### 性能优化建议 + +| 优化策略 | 实施方法 | 预期效果 | +|---------|---------|---------| +| 减少字段数量 | 使用 `FieldList` 只导出必要字段 | 减少 30-50% 导出时间 | +| 批量导出 | 合并多个导出任务为单次操作 | 减少初始化开销 | +| 覆盖模式 | 设置 `Overwrite="true"` 避免检查 | 减少文件系统调用 | +| 数据筛选 | 使用选择集过滤不需要的数据 | 提高导出效率 | + +### 代码组织建议 + +将数据导出功能封装为可重用的函数,可以提高代码的可维护性和可测试性。 + +```python +def export_selection_to_file( + export_path: str, + encoding: str = "UTF-8", + overwrite: bool = True, + field_list: str = None, + coord_system: str = None +) -> bool: + """ + 导出当前选择集到指定文件 + + 参数: + export_path: 导出文件路径 + encoding: 目标编码,默认 UTF-8 + overwrite: 是否覆盖已存在文件 + field_list: 字段列表(逗号分隔) + coord_system: 坐标系统(EPSG 代码) + + 返回: + bool: 导出是否成功 + """ + from sunvpy.PySSDataX import DataXScript + import os + + # 验证路径 + export_dir = os.path.dirname(export_path) + if not os.path.exists(export_dir): + os.makedirs(export_dir) + + # 创建 DataXScript 实例 + datax = DataXScript() + + # 设置基础参数 + datax.setDataXParameter("ExportPath", export_path) + datax.setDataXParameter("TargetEncoding", encoding) + datax.setDataXParameter("Overwrite", "true" if overwrite else "false") + + # 设置可选参数 + if field_list: + datax.setDataXParameter("FieldList", field_list) + if coord_system: + datax.setDataXParameter("CoordSystem", coord_system) + + # 执行导出 + return datax.exportData() + +# 使用示例 +export_selection_to_file( + "D:\\export\\roads.shp", + encoding="UTF-8", + field_list="SSObj_ID,SSObj_Name,SSObj_Code", + coord_system="EPSG:4326" +) +``` + +Sources: [PySSDataX.py](PySSDataX.py#L157-L161) + +## 进阶学习路径 + +掌握基础的数据导出功能后,您可以进一步探索以下高级主题,以实现更复杂的数据交换需求。 + +- **[自定义数据交换流程](29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng)**:了解如何构建完整的数据交换管道,实现导入、转换、导出的自动化流程 +- **[数据交换参数配置](26-shu-ju-jiao-huan-can-shu-pei-zhi)**:深入学习参数配置的详细机制,包括高级参数和自定义参数 +- **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**:了解如何将导出的数据批量保存到数据库,实现数据持久化 \ No newline at end of file diff --git a/docs/content/29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng.md b/docs/content/29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng.md new file mode 100644 index 0000000..415fa65 --- /dev/null +++ b/docs/content/29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng.md @@ -0,0 +1,917 @@ +本页面详细讲解如何构建自定义数据交换流程,将基础的数据导入导出功能组合成复杂的工作流。通过将 DataXScript 与 SSProcessManager 集合,并结合选择集操作、数据处理和进度跟踪等功能,您可以实现自动化的批量数据转换、质量检查和多格式同步导出等高级场景。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) | [PySSProcess.py](PySSProcess.py#L25-L90) + +## 自定义数据交换架构 + +自定义数据交换流程的核心思想是将数据交换作为数据处理工作流中的一个环节,与选择集管理、属性编辑、数据验证等功能有机结合。这种架构允许在数据导入后进行预处理,在数据导出前进行质量检查,实现端到端的自动化数据处理。 + +```mermaid +graph TB + A[开始自定义数据交换流程] --> B{选择流程类型} + B -->|简单导入导出| C[基础模式] + B -->|带数据预处理| D[处理模式] + B -->|批量文件处理| E[批量模式] + B -->|多格式同步导出| F[同步模式] + + C --> C1[配置参数] + C1 --> C2[执行交换] + C2 --> C3[结果验证] + + D --> D1[数据导入] + D1 --> D2[选择集筛选] + D2 --> D3[数据转换] + D3 --> D4[质量检查] + D4 --> D5[数据导出] + + E --> E1[遍历文件列表] + E1 --> E2[逐个导入] + E2 --> E3[进度跟踪] + E3 --> E4[错误恢复] + + F --> F1[数据准备] + F1 --> F2[配置多目标参数] + F2 --> F3[并行/串行导出] + F3 --> F4[结果汇总] + + C3 --> G[流程完成] + D5 --> G + E4 --> G + F4 --> G +``` + +自定义数据交换流程基于以下核心组件构建:**DataXScript** 负责数据交换,**SSProcessManager** 提供工作流控制,**Mixin 模块** 提供日志、进度等辅助功能。这种模块化设计使您能够根据需求灵活组合功能。 + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) | [PySSProcess.py](PySSProcess.py#L25-L90) + +## 模式一:带数据预处理的交换流程 + +这种模式适用于需要在数据导入后进行数据处理再导出的场景,例如数据清洗、属性标准化、坐标转换等。典型的应用包括:将外部数据导入后根据业务规则修改属性,然后导出为标准格式。 + +### 流程架构与步骤 + +```mermaid +flowchart TD + Start([开始预处理交换流程]) --> Init[初始化 SSProcessManager] + Init --> InitDataX[创建 DataXScript 实例] + InitDataX --> ConfigImport[配置导入参数] + ConfigImport --> ExecuteImport[执行 importData] + ExecuteImport --> CheckImport{导入成功?} + CheckImport -->|否| LogImportError[记录导入错误] --> ErrorEnd([流程失败]) + CheckImport -->|是| SelectData[筛选需要处理的数据] + SelectData --> SetCondition[设置筛选条件] + SetCondition --> Filter[执行 selectFilter] + Filter --> CheckData{有选择集?} + CheckData -->|否| NoDataEnd([无数据需处理]) + CheckData -->|是| ProcessData[遍历选择集处理数据] + ProcessData --> ModifyAttributes[修改属性] + ModifyAttributes --> SaveChanges[保存到数据库] + SaveChanges --> ConfigExport[配置导出参数] + ConfigExport --> ExecuteExport[执行 exportData] + ExecuteExport --> CheckExport{导出成功?} + CheckExport -->|否| LogExportError[记录导出错误] --> ErrorEnd + CheckExport -->|是| VerifyResult[验证输出文件] + VerifyResult --> SuccessEnd([流程成功完成]) +``` + +### 完整代码示例 + +以下是一个完整的带数据预处理的数据交换流程示例,将 Shapefile 数据导入后,根据业务规则修改道路对象的属性,然后导出为 MDB 格式。 + +```python +from sunvpy.PySSDataX import DataXScript +from sunvpy.PySSProcess import SSProcess + +def preprocess_and_exchange(): + """ + 带数据预处理的数据交换流程: + 1. 导入道路 Shapefile 数据 + 2. 根据道路等级修改属性 + 3. 导出为 MDB 格式 + """ + + # ========== 第一阶段:初始化 ========== + print("=== 初始化数据交换流程 ===") + + # SSProcessManager 已经是全局单例,无需创建 + # DataXScript 需要为每次交换创建新实例 + import_datax = DataXScript() + + # ========== 第二阶段:数据导入 ========== + print("\n[阶段 1/4] 导入原始数据...") + + import_datax.setDataXParameter("ImportPath", "D:\\data\\input\\roads.shp") + import_datax.setDataXParameter("SourceEncoding", "GBK") + import_datax.setDataXParameter("CoordSystem", "EPSG:4326") + import_datax.setDataXParameter("LayerMapping", "道路") + import_datax.setDataXParameter("OverwriteExisting", "true") + + import_success = import_datax.importData() + + if not import_success: + print("错误:数据导入失败") + return False + + import_file = import_datax.getImportFileName() + print(f"成功导入: {import_file}") + + # 清理导入参数 + import_datax.clearDataXParameter() + + # ========== 第三阶段:数据预处理 ========== + print("\n[阶段 2/4] 执行数据预处理...") + + # 清空之前的选择集和条件 + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + + # 筛选所有道路对象 + SSProcess.setSelectCondition("SSObj_LayerName", "==", "道路") + SSProcess.selectFilter() + + obj_count = SSProcess.getSelGeoCount() + print(f"找到 {obj_count} 个道路对象") + + if obj_count == 0: + print("警告:没有找到需要处理的道路对象") + return False + + # 创建撤销标记,支持撤销操作 + SSProcess.pushUndoMark("道路属性标准化") + + # 遍历选择集,根据道路等级修改属性 + modified_count = 0 + for i in range(obj_count): + # 读取道路等级属性(假设存在 RoadGrade 字段) + road_grade = SSProcess.getSelGeoValue(i, "RoadGrade") + + # 根据等级设置不同的线型和颜色 + if road_grade == "高速": + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "3") + SSProcess.setSelGeoValue(i, "SSObj_Color", "255") # 红色 + elif road_grade == "省道": + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "2") + SSProcess.setSelGeoValue(i, "SSObj_Color", "16711680") # 蓝色 + elif road_grade == "县道": + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "1.5") + SSProcess.setSelGeoValue(i, "SSObj_Color", "65280") # 绿色 + else: + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "1") + SSProcess.setSelGeoValue(i, "SSObj_Color", "0") # 黑色 + + # 添加数据来源标记 + SSProcess.setSelGeoValue(i, "DataSource", "预处理流程") + + modified_count += 1 + + print(f"已修改 {modified_count} 个道路对象的属性") + + # 批量保存到数据库 + SSProcess.saveBufferToDatabase() + print("数据预处理完成,已保存到数据库") + + # ========== 第四阶段:数据导出 ========== + print("\n[阶段 3/4] 导出处理后的数据...") + + export_datax = DataXScript() + + export_datax.setDataXParameter("ExportPath", "D:\\data\\output\\roads_processed.mdb") + export_datax.setDataXParameter("ExportFormat", "MDB") + export_datax.setDataXParameter("TargetEncoding", "UTF-8") + export_datax.setDataXParameter("CoordSystem", "EPSG:4490") # 转换为 CGCS2000 + export_datax.setDataXParameter("LayerFilter", "道路") + export_datax.setDataXParameter("IncludeAttributes", "true") + + export_success = export_datax.exportData() + + if not export_success: + print("错误:数据导出失败") + return False + + print("数据导出成功") + export_datax.clearDataXParameter() + + # ========== 第五阶段:结果验证 ========== + print("\n[阶段 4/4] 验证输出结果...") + + # 重新导入验证 + verify_datax = DataXScript() + verify_datax.setDataXParameter("ImportPath", "D:\\data\\output\\roads_processed.mdb") + verify_success = verify_datax.importData() + + if verify_success: + print("输出文件验证成功") + else: + print("警告:输出文件验证失败,请检查文件完整性") + + print("\n=== 数据交换流程完成 ===") + return True + +# 执行流程 +if __name__ == "__main__": + success = preprocess_and_exchange() + if success: + print("\n流程执行成功") + else: + print("\n流程执行失败") +``` + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) | [PySSProcess.py](PySSProcess.py#L25-L90) | [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py) + +### 关键步骤对比表 + +| 步骤 | 基础导入导出 | 带预处理的交换 | 增强功能 | +|-----|------------|--------------|---------| +| 导入配置 | 设置 ImportPath 等参数 | 相同 | 相同 | +| 导入执行 | `importData()` | 相同 | 相同 | +| 数据处理 | 无 | 筛选选择集 + 修改属性 | 集成业务逻辑 | +| 缓存管理 | 无需要 | `saveBufferToDatabase()` | 支持撤销 | +| 导出配置 | 设置 ExportPath 等参数 | 相同 | 增加转换参数 | +| 结果验证 | 可选 | 重新导入验证 | 自动化验证 | + +Sources: [PySSDataX.py](PySSDataX.py#L148-L157) | [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py) + +## 模式二:批量文件处理流程 + +当需要处理大量同类文件时,批量文件处理模式可以显著提高效率。该模式遍历指定目录中的文件,逐个执行数据交换,并提供进度跟踪、错误恢复和结果汇总功能。 + +### 批量处理架构 + +```mermaid +flowchart TD + Start([开始批量处理]) --> ScanDir[扫描目录获取文件列表] + ScanDir --> InitProgress[初始化进度条] + InitProgress --> LoopStart{还有文件?} + LoopStart -->|否| GenerateReport[生成处理报告] + GenerateReport --> End([批量处理完成]) + LoopStart -->|是| GetNextFile[获取下一个文件] + GetNextFile --> ValidateFile{文件有效?} + ValidateFile -->|否| LogSkip[记录跳过] --> UpdateProgress1[更新进度] + ValidateFile -->|是| CreateDataX[创建 DataXScript 实例] + CreateDataX --> ConfigParams[配置参数] + ConfigParams --> ExecuteProcess[执行导入导出] + ExecuteProcess --> CheckSuccess{操作成功?} + CheckSuccess -->|否| LogError[记录错误] --> CheckRetry{允许重试?} + CheckRetry -->|是| Retry[重试当前文件] --> ConfigParams + CheckRetry -->|否| UpdateProgress2[更新进度] + CheckSuccess -->|是| UpdateProgress3[更新进度] + UpdateProgress1 --> LoopStart + UpdateProgress2 --> LoopStart + UpdateProgress3 --> LoopStart +``` + +### 批量处理完整示例 + +以下是一个批量文件处理示例,将多个 Shapefile 文件批量导入并统一导出为 MDB 格式,集成进度跟踪和错误处理功能。 + +```python +from sunvpy.PySSDataX import DataXScript +from sunvpy.PySSProcess import SSProcess +from sunvpy.PySSWidget import startProgress, setProgressRange, stepProgress, closeProgress +import os +from pathlib import Path +from datetime import datetime + +def batch_exchange_files(input_dir, output_dir, max_retries=3): + """ + 批量数据交换流程: + 将指定目录中的所有 Shapefile 批量导入并导出为 MDB 格式 + + 参数: + input_dir: 输入目录路径 + output_dir: 输出目录路径 + max_retries: 最大重试次数 + """ + + # ========== 第一阶段:准备阶段 ========== + print(f"=== 批量数据交换流程开始 ===") + print(f"输入目录: {input_dir}") + print(f"输出目录: {output_dir}") + print(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + + # 确保输出目录存在 + os.makedirs(output_dir, exist_ok=True) + + # 扫描输入目录获取所有 .shp 文件 + input_files = list(Path(input_dir).glob("*.shp")) + + if not input_files: + print("错误:输入目录中没有找到 Shapefile 文件") + return False + + total_files = len(input_files) + print(f"找到 {total_files} 个文件需要处理") + + # 初始化统计变量 + success_count = 0 + failed_count = 0 + skipped_count = 0 + error_details = [] + + # ========== 第二阶段:初始化进度条 ========== + SSProcess.startProgress("批量数据交换", total_files) + + # ========== 第三阶段:批量处理 ========== + for index, input_file in enumerate(input_files): + file_name = input_file.name + print(f"\n处理文件 [{index+1}/{total_files}]: {file_name}") + + try: + # 创建 DataXScript 实例 + datax = DataXScript() + + # 配置导入参数 + datax.setDataXParameter("ImportPath", str(input_file)) + datax.setDataXParameter("SourceEncoding", "GBK") + datax.setDataXParameter("CoordSystem", "EPSG:4326") + datax.setDataXParameter("OverwriteExisting", "true") + + # 执行导入(带重试机制) + import_success = False + retry_count = 0 + + while retry_count < max_retries and not import_success: + if retry_count > 0: + print(f" 重试第 {retry_count} 次...") + + import_success = datax.importData() + retry_count += 1 + + if not import_success: + print(f" 错误:文件导入失败(已重试 {max_retries} 次)") + failed_count += 1 + error_details.append(f"{file_name}: 导入失败") + SSProcess.stepProgress(f"失败: {file_name}") + continue + + # 获取导入后的文件名 + import_file_name = datax.getImportFileName() + print(f" 导入成功: {import_file_name}") + + # 清理导入参数 + datax.clearDataXParameter() + + # 配置导出参数 + output_file = Path(output_dir) / f"{input_file.stem}.mdb" + datax.setDataXParameter("ExportPath", str(output_file)) + datax.setDataXParameter("ExportFormat", "MDB") + datax.setDataXParameter("TargetEncoding", "UTF-8") + datax.setDataXParameter("CoordSystem", "EPSG:4490") + datax.setDataXParameter("IncludeAttributes", "true") + + # 执行导出(带重试机制) + export_success = False + retry_count = 0 + + while retry_count < max_retries and not export_success: + if retry_count > 0: + print(f" 重试第 {retry_count} 次...") + + export_success = datax.exportData() + retry_count += 1 + + if not export_success: + print(f" 错误:文件导出失败(已重试 {max_retries} 次)") + failed_count += 1 + error_details.append(f"{file_name}: 导出失败") + SSProcess.stepProgress(f"失败: {file_name}") + continue + + print(f" 导出成功: {output_file.name}") + success_count += 1 + SSProcess.stepProgress(f"成功: {file_name}") + + # 清理导出参数 + datax.clearDataXParameter() + + except Exception as e: + print(f" 异常:{str(e)}") + failed_count += 1 + error_details.append(f"{file_name}: 异常 - {str(e)}") + SSProcess.stepProgress(f"异常: {file_name}") + + # ========== 第四阶段:清理进度条 ========== + SSProcess.closeProgress() + + # ========== 第五阶段:生成报告 ========== + print(f"\n=== 批量处理完成 ===") + print(f"总文件数: {total_files}") + print(f"成功处理: {success_count}") + print(f"处理失败: {failed_count}") + print(f"跳过文件: {skipped_count}") + print(f"结束时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + + if error_details: + print("\n错误详情:") + for detail in error_details: + print(f" - {detail}") + + # 生成报告文件 + report_file = Path(output_dir) / "batch_report.txt" + with open(report_file, 'w', encoding='utf-8') as f: + f.write("批量数据交换处理报告\n") + f.write("=" * 50 + "\n") + f.write(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") + f.write(f"输入目录: {input_dir}\n") + f.write(f"输出目录: {output_dir}\n") + f.write(f"总文件数: {total_files}\n") + f.write(f"成功处理: {success_count}\n") + f.write(f"处理失败: {failed_count}\n") + f.write(f"跳过文件: {skipped_count}\n") + f.write("\n错误详情:\n") + for detail in error_details: + f.write(f" {detail}\n") + + print(f"\n处理报告已保存到: {report_file}") + + return failed_count == 0 + +# 执行批量处理 +if __name__ == "__main__": + input_directory = r"D:\data\batch_input" + output_directory = r"D:\data\batch_output" + + success = batch_exchange_files(input_directory, output_directory) + + if success: + print("\n所有文件处理成功") + else: + print("\n部分文件处理失败,请查看错误详情") +``` + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) | [PySSProcess.py](PySSProcess.py#L25-L90) | [ssprocess_mixins/progress_mixin.py](ssprocess_mixins/progress_mixin.py) + +### 批量处理优化技巧 + +| 优化项 | 优化方法 | 效果 | +|-------|---------|------| +| 进度跟踪 | 使用 SSProcess 的进度条功能 | 提供实时反馈 | +| 错误恢复 | 实现重试机制 | 提高成功率 | +| 资源清理 | 及时 clearDataXParameter() | 避免内存泄漏 | +| 异步处理 | 可考虑多进程处理(需谨慎) | 提高吞吐量 | +| 报告生成 | 自动生成处理报告 | 便于审计和追溯 | + +Sources: [PySSDataX.py](PySSDataX.py#L117-L119) | [ssprocess_mixins/progress_mixin.py](ssprocess_mixins/progress_mixin.py) + +## 模式三:带日志记录和进度跟踪的增强流程 + +在生产环境中,完整的数据交换流程应该包含详细的日志记录和可视化的进度跟踪。这种模式特别适合长时间运行的复杂交换任务,便于问题排查和进度监控。 + +### 增强流程架构 + +```mermaid +graph TB + Start([开始增强流程]) --> SetupLogger[配置日志记录器] + SetupLogger --> LogStart[记录开始信息] + LogStart --> SetupProgress[配置进度条] + SetupProgress --> InitDataX[创建 DataXScript 实例] + InitDataX --> ConfigParams[配置参数] + ConfigParams --> LogParams[记录参数配置] + LogParams --> Execute[执行数据交换] + Execute --> UpdateProgress[更新进度] + UpdateProgress --> CheckResult{成功?} + CheckResult -->|是| LogSuccess[记录成功信息] + CheckResult -->|否| LogError[记录错误信息] + LogSuccess --> NextStep{还有步骤?} + LogError --> NextStep + NextStep -->|是| InitDataX + NextStep -->|否| CloseProgress[关闭进度条] + CloseProgress --> LogComplete[记录完成信息] + LogComplete --> End([流程结束]) +``` + +### 增强流程实现示例 + +```python +from sunvpy.PySSDataX import DataXScript +from sunvpy.PySSProcess import SSProcess +import logging +from datetime import datetime + +def setup_logger(log_file): + """配置日志记录器""" + logger = logging.getLogger('DataExchange') + logger.setLevel(logging.DEBUG) + + # 文件处理器 + file_handler = logging.FileHandler(log_file, encoding='utf-8') + file_handler.setLevel(logging.DEBUG) + + # 控制台处理器 + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + + # 格式化器 + formatter = logging.Formatter( + '%(asctime)s - %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + file_handler.setFormatter(formatter) + console_handler.setFormatter(formatter) + + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + return logger + +def enhanced_exchange_workflow(): + """ + 带日志和进度跟踪的增强数据交换流程 + """ + + # ========== 配置日志 ========== + log_file = f"D:\\logs\\data_exchange_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" + logger = setup_logger(log_file) + SSProcess.set_logger(logger) + + logger.info("=== 数据交换流程开始 ===") + logger.info(f"日志文件: {log_file}") + + try: + # ========== 启用进度条 ========== + SSProcess.startProgress("数据交换流程", 3) + + # ========== 步骤 1:数据导入 ========== + logger.info("[步骤 1/3] 开始数据导入...") + SSProcess.stepProgress("正在导入数据...") + + import_datax = DataXScript() + import_datax.setDataXParameter("ImportPath", "D:\\data\\input\\survey.shp") + import_datax.setDataXParameter("SourceEncoding", "GBK") + import_datax.setDataXParameter("CoordSystem", "EPSG:4326") + import_datax.setDataXParameter("LayerMapping", "测区数据") + + logger.debug("导入参数配置完成") + logger.debug(f" ImportPath: {import_datax.getDataXParameter('ImportPath')}") + + import_success = import_datax.importData() + + if import_success: + import_file = import_datax.getImportFileName() + logger.info(f"数据导入成功: {import_file}") + else: + logger.error("数据导入失败") + SSProcess.log_error_msg("数据导入失败") + raise Exception("导入操作失败") + + import_datax.clearDataXParameter() + + # ========== 步骤 2:数据处理 ========== + logger.info("[步骤 2/3] 开始数据处理...") + SSProcess.stepProgress("正在处理数据...") + + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_LayerName", "==", "测区数据") + SSProcess.selectFilter() + + obj_count = SSProcess.getSelGeoCount() + logger.info(f"找到 {obj_count} 个对象") + + if obj_count > 0: + SSProcess.pushUndoMark("数据交换处理") + logger.info("开始修改对象属性...") + + for i in range(min(obj_count, 100)): # 最多处理100个对象 + SSProcess.setSelGeoValue(i, "DataSource", "增强流程") + SSProcess.setSelGeoValue(i, "ProcessTime", + datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + + SSProcess.saveBufferToDatabase() + logger.info("数据处理完成,已保存到数据库") + else: + logger.warning("没有找到需要处理的对象") + + # ========== 步骤 3:数据导出 ========== + logger.info("[步骤 3/3] 开始数据导出...") + SSProcess.stepProgress("正在导出数据...") + + export_datax = DataXScript() + export_datax.setDataXParameter("ExportPath", "D:\\data\\output\\survey_processed.mdb") + export_datax.setDataXParameter("ExportFormat", "MDB") + export_datax.setDataXParameter("TargetEncoding", "UTF-8") + export_datax.setDataXParameter("CoordSystem", "EPSG:4490") + + logger.debug("导出参数配置完成") + logger.debug(f" ExportPath: {export_datax.getDataXParameter('ExportPath')}") + + export_success = export_datax.exportData() + + if export_success: + logger.info("数据导出成功") + else: + logger.error("数据导出失败") + SSProcess.log_error_msg("数据导出失败") + raise Exception("导出操作失败") + + export_datax.clearDataXParameter() + + # ========== 流程完成 ========== + logger.info("=== 数据交换流程成功完成 ===") + SSProcess.closeProgress() + + return True + + except Exception as e: + logger.error(f"流程执行异常: {str(e)}", exc_info=True) + SSProcess.closeProgress() + return False + +# 执行增强流程 +if __name__ == "__main__": + success = enhanced_exchange_workflow() + if success: + print("\n流程执行成功") + else: + print("\n流程执行失败,请查看日志文件") +``` + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) | [PySSProcess.py](PySSProcess.py#L25-L90) | [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py) | [ssprocess_mixins/progress_mixin.py](ssprocess_mixins/progress_mixin.py) + +### 日志和进度功能对比 + +| 功能 | 基础流程 | 增强流程 | 优势 | +|-----|---------|---------|------| +| 错误记录 | print 输出 | logging 模块 | 持久化、分级 | +| 进度显示 | 无 | 进度条 | 用户友好 | +| 参数记录 | 无 | DEBUG 级别日志 | 便于调试 | +| 异常追踪 | 无 | exc_info | 完整堆栈 | +| 时间戳 | 无 | 自动添加 | 时间分析 | + +Sources: [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py) | [ssprocess_mixins/progress_mixin.py](ssprocess_mixins/progress_mixin.py) + +## 自定义流程设计模式 + +构建自定义数据交换流程时,可以应用以下设计模式提高代码的可维护性和可扩展性。 + +### 模式一:流程模板模式 + +将固定的交换流程定义为模板,通过继承和重写特定步骤实现定制化。 + +```python +from abc import ABC, abstractmethod +from sunvpy.PySSDataX import DataXScript +from sunvpy.PySSProcess import SSProcess + +class DataExchangeTemplate(ABC): + """数据交换流程模板""" + + def execute(self): + """执行完整流程(模板方法)""" + self.preprocess() + self.import_data() + self.process_data() + self.export_data() + self.postprocess() + + def preprocess(self): + """前置处理""" + print("前置处理...") + + def import_data(self): + """导入数据""" + import_datax = DataXScript() + self.configure_import(import_datax) + success = import_datax.importData() + if success: + self.on_import_success(import_datax) + else: + self.on_import_failed() + return success + + def export_data(self): + """导出数据""" + export_datax = DataXScript() + self.configure_export(export_datax) + success = export_datax.exportData() + if success: + self.on_export_success() + else: + self.on_export_failed() + return success + + def postprocess(self): + """后置处理""" + print("后置处理...") + + # 抽象方法,由子类实现 + @abstractmethod + def configure_import(self, datax): + """配置导入参数""" + pass + + @abstractmethod + def configure_export(self, datax): + """配置导出参数""" + pass + + @abstractmethod + def process_data(self): + """处理数据""" + pass + + # 钩子方法,子类可选重写 + def on_import_success(self, datax): + print("导入成功") + + def on_import_failed(self): + print("导入失败") + + def on_export_success(self): + print("导出成功") + + def on_export_failed(self): + print("导出失败") + +# 实现具体流程 +class RoadDataExchange(DataExchangeTemplate): + """道路数据交换流程""" + + def configure_import(self, datax): + datax.setDataXParameter("ImportPath", "D:\\data\\roads.shp") + datax.setDataXParameter("SourceEncoding", "GBK") + datax.setDataXParameter("CoordSystem", "EPSG:4326") + + def configure_export(self, datax): + datax.setDataXParameter("ExportPath", "D:\\output\\roads.mdb") + datax.setDataXParameter("TargetEncoding", "UTF-8") + datax.setDataXParameter("CoordSystem", "EPSG:4490") + + def process_data(self): + """处理道路数据""" + SSProcess.clearSelection() + SSProcess.setSelectCondition("SSObj_LayerName", "==", "道路") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + for i in range(count): + SSProcess.setSelGeoValue(i, "Processed", "true") + + SSProcess.saveBufferToDatabase() + +# 执行流程 +if __name__ == "__main__": + workflow = RoadDataExchange() + workflow.execute() +``` + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) | [PySSProcess.py](PySSProcess.py#L25-L90) + +### 模式二:管道模式 + +将数据交换分解为多个独立的处理阶段,通过管道连接形成完整流程。 + +```python +class DataExchangePipeline: + """数据交换管道""" + + def __init__(self): + self.stages = [] + + def add_stage(self, stage): + """添加处理阶段""" + self.stages.append(stage) + return self + + def execute(self, context): + """执行管道""" + for stage in self.stages: + context = stage.process(context) + if context is None: + return None + return context + +class ExchangeContext: + """交换上下文,在各阶段间传递数据""" + def __init__(self): + self.input_path = None + self.output_path = None + self.datax = None + self.result = True + self.message = "" + + def fail(self, message): + """标记失败""" + self.result = False + self.message = message + return None + +# 定义各个处理阶段 +class ImportStage: + """导入阶段""" + def process(self, context): + datax = DataXScript() + datax.setDataXParameter("ImportPath", context.input_path) + datax.setDataXParameter("SourceEncoding", "GBK") + + if not datax.importData(): + return context.fail("导入失败") + + context.datax = datax + return context + +class ProcessStage: + """处理阶段""" + def process(self, context): + # 执行数据处理逻辑 + SSProcess.clearSelection() + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + for i in range(count): + SSProcess.setSelGeoValue(i, "Processed", "true") + + SSProcess.saveBufferToDatabase() + return context + +class ExportStage: + """导出阶段""" + def process(self, context): + datax = DataXScript() + datax.setDataXParameter("ExportPath", context.output_path) + datax.setDataXParameter("TargetEncoding", "UTF-8") + + if not datax.exportData(): + return context.fail("导出失败") + + return context + +# 构建并执行管道 +if __name__ == "__main__": + context = ExchangeContext() + context.input_path = "D:\\data\\input.shp" + context.output_path = "D:\\data\\output.mdb" + + pipeline = DataExchangePipeline() + pipeline.add_stage(ImportStage()) \ + .add_stage(ProcessStage()) \ + .add_stage(ExportStage()) + + result = pipeline.execute(context) + + if result and result.result: + print("流程执行成功") + else: + print(f"流程执行失败: {context.message}") +``` + +Sources: [PySSDataX.py](PySSDataX.py#L113-L173) | [PySSProcess.py](PySSProcess.py#L25-L90) + +## 错误处理与最佳实践 + +在构建自定义数据交换流程时,完善的错误处理机制和遵循最佳实践可以显著提高脚本的可靠性和可维护性。 + +### 错误处理策略 + +| 错误类型 | 处理策略 | 实现方法 | +|---------|---------|---------| +| 文件不存在 | 提前验证并提示 | `os.path.exists()` | +| 参数配置错误 | 参数验证 | `getDataXParameter()` 检查 | +| 导入导出失败 | 重试机制 | 循环重试逻辑 | +| 数据处理异常 | 异常捕获 | `try-except` 块 | +| 权限问题 | 检查并提示 | 权限验证函数 | + +Sources: [PySSDataX.py](PySSDataX.py#L134-L152) + +### 最佳实践总结 + +| 实践类别 | 最佳实践 | 说明 | +|---------|---------|------| +| 实例管理 | 每次交换创建新 DataXScript 实例 | 避免参数污染 | +| 参数清理 | 执行后调用 clearDataXParameter() | 释放资源 | +| 路径处理 | 使用绝对路径,验证路径有效性 | 避免路径错误 | +| 错误日志 | 使用日志记录器记录详细错误 | 便于问题排查 | +| 进度反馈 | 长时间任务提供进度显示 | 改善用户体验 | +| 撤销支持 | 数据修改前创建撤销标记 | 支持回滚操作 | +| 测试验证 | 导入后重新导入验证 | 确保数据完整性 | + +Sources: [PySSDataX.py](PySSDataX.py#L117-L119) | [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py) | [ssprocess_mixins/progress_mixin.py](ssprocess_mixins/progress_mixin.py) + +### 常见问题排查 + +| 问题现象 | 可能原因 | 解决方法 | +|---------|---------|---------| +| 参数设置后无效 | 参数名称拼写错误 | 检查参数名称准确性 | +| 导入数据乱码 | 字符编码不匹配 | 设置正确的 SourceEncoding | +| 坐标位置偏移 | 坐标系统未设置 | 配置 CoordSystem 参数 | +| 批量处理卡住 | 文件过大或死锁 | 分批处理或检查权限 | +| 进度条不更新 | 进度条未正确初始化 | 检查 startProgress 调用 | +| 日志未生成 | 日志配置错误 | 检查日志路径和权限 | + +Sources: [PySSDataX.py](PySSDataX.py#L134-L152) + +## 学习路径建议 + +掌握了自定义数据交换流程的基础知识后,建议按照以下路径深入学习: + +1. **深入学习选择集操作**:阅读[使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji),了解复杂的选择条件和批量操作技巧,为数据预处理阶段提供更强的数据处理能力。 + +2. **掌握数据检查功能**:学习[数据检查记录管理](30-shu-ju-jian-cha-ji-lu-guan-li)和[自定义检查规则](33-zi-ding-yi-jian-cha-gui-ze),在数据交换后自动进行质量检查,确保输出数据的准确性。 + +3. **理解日志与进度**:阅读[配置日志记录器](37-pei-zhi-ri-zhi-ji-lu-qi)和[进度条使用指南](38-jin-du-tiao-shi-yong-zhi-nan),为长时间运行的交换任务提供完善的监控和反馈机制。 + +4. **掌握错误处理**:学习[错误处理与异常管理](39-cuo-wu-chu-li-yu-yi-chang-guan-li),构建健壮的数据交换流程,能够优雅地处理各种异常情况。 + +5. **探索系统架构**:阅读[Mixin 设计模式](9-mixin-she-ji-mo-shi)和[SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou),深入理解底层设计原理,为构建高级自定义流程奠定理论基础。 + +通过将这些知识点融会贯通,您将能够构建出功能强大、可靠稳定的数据交换自动化系统,满足各种复杂的业务需求。 \ No newline at end of file diff --git a/docs/content/3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing.md b/docs/content/3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing.md new file mode 100644 index 0000000..6b38d52 --- /dev/null +++ b/docs/content/3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing.md @@ -0,0 +1,457 @@ +本页面将引导您编写第一个 SunvStation Python 脚本,从最基础的地物属性查询开始。通过实际案例,您将学习如何使用选择集过滤地物对象,并读取它们的属性信息。这是所有数据处理和编辑操作的基础起点。 + +## 脚本功能概览 + +我们的第一个脚本将实现以下完整流程:在当前地图中按照编码条件筛选地物对象,然后遍历选择集中的每个对象,读取并显示其核心属性信息。这个示例涵盖了脚本开发的四个核心环节——准备工作、筛选对象、遍历结果、输出信息。 + +Sources: [PySSProcess.py](PySSProcess.py#L110-L140) + +## 完整工作流程 + +让我们先通过一个流程图理解整个脚本的数据流转过程,这有助于把握各步骤之间的逻辑关系: + +```mermaid +flowchart LR + A[初始化 SSProcess
获取工作空间与地图] --> B[清除旧选择集
clearSelection] + B --> C[清除旧选择条件
clearSelectCondition] + C --> D[设置筛选条件
setSelectCondition] + D --> E[执行过滤查询
selectFilter] + E --> F{选择集非空?} + F -->|是| G[获取对象数量
getSelGeoCount] + F -->|否| H[脚本结束] + G --> I[循环遍历对象] + I --> J[获取对象属性
getSelGeoValue] + J --> K[输出属性信息] + K --> L{还有对象?} + L -->|是| I + L -->|否| H +``` + +这个流程图展示了脚本的核心执行路径,其中每个节点对应一个关键的 API 调用。接下来的详细教程将逐步解析每个节点的具体实现。 + +Sources: [PySSProcess.py](PySSProcess.py#L110-L140) + +## 步骤一:准备环境与初始化 + +在编写任何脚本之前,首先需要导入 sunvpy 模块中的核心类 `SSProcess`。这是一个全局单例对象,封装了工作空间、地图、选择集以及所有地物操作的核心功能。初始化完成后,`SSProcess` 会自动获取当前 SunvStation 系统的工作空间和活动地图实例,为后续操作做好准备。 + +```python +from sunvpy import SSProcess +``` + +这个简单的导入语句就完成了所有必要的准备工作。`SSProcess` 内部维护了 `WorkSpace`(工作空间)和 `ScaleMap`(比例尺地图)两个核心对象,以及 `GeoBaseList`(地物列表)、`SSearchHelper`(搜索助手)等辅助对象,共同构成了脚本运行的基础环境。 + +Sources: [PySSProcess.py](PySSProcess.py#L35-L70) + +## 步骤二:清理选择集与条件 + +在开始新的查询之前,良好的习惯是清理之前可能残留的选择集和选择条件。这确保了脚本的执行结果不受上一次操作的影响,提高了脚本的可重复性和可靠性。 + +```python +SSProcess.clearSelection() # 清除脚本选择集中的所有对象 +SSProcess.clearSelectCondition() # 清除之前设置的选择条件 +``` + +`clearSelection()` 会清空 `selGeoList`(点线面地物列表)和 `selNoteList`(注记对象列表),而 `clearSelectCondition()` 则会清空 `searchHelper` 中存储的过滤条件。这两个方法都是无参数的简单调用,为后续操作提供一个干净的开始状态。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L28-L50) + +## 步骤三:设置选择条件 + +选择条件定义了我们要筛选地物的规则。SunvStation 支持三种类型的属性:基本属性、几何特性和扩展属性,它们通过不同的前缀标识符来区分。 + +### 条件类型说明 + +| 属性类型 | 前缀标识 | 示例 | 说明 | +|---------|---------|------|------| +| 基本属性 | `SSObj_` | `SSObj_Code` | 以 SSObj_ 开头的系统内置属性 | +| 几何特性 | `< >` | `` | 用尖括号括住的几何判断条件 | +| 扩展属性 | `[ ]` | `[JG]` | 用方括号括住的自定义扩展属性 | + +### 操作符支持 + +系统提供了丰富的比较操作符,满足各种查询需求: + +| 操作符 | 含义 | 示例 | +|--------|------|------| +| `==` | 等于 | `SSObj_Code == "3103013"` | +| `>` | 大于 | `SSObj_Length > "100"` | +| `<` | 小于 | `SSObj_Area < "500"` | +| `<>` | 不等于 | `SSObj_Type <> "NOTE"` | +| `LIKE` | 模糊匹配 | `SSObj_Name LIKE "%道路%"` | +| `NOT LIKE` | 不匹配 | `SSObj_Name NOT LIKE "%临时%"` | +| `CompareNoCase` | 忽略大小写比较 | `SSObj_Name CompareNoCase "MAIN"` | +| `Dec` | 小数位比较 | `SSObj_Area Dec 2` | + +### 设置选择条件代码 + +在我们的第一个脚本中,我们将按照地物编码进行筛选: + +```python +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +``` + +这行代码会调用 `searchHelper.addCondition()` 方法,将条件添加到过滤条件列表中。地物编码 `3103013` 是一个具体的编码值,表示我们要筛选出编码为 3103013 的所有地物对象。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L52-L110) + +## 步骤四:执行过滤查询 + +设置好选择条件后,需要调用 `selectFilter()` 方法来实际执行查询。这个方法会在当前数据源中查找符合所有设置条件的对象,并将它们添加到脚本选择集中。 + +```python +SSProcess.selectFilter() +``` + +`selectFilter()` 方法执行以下操作流程: + +1. 调用 `searchHelper.getFilterObj()` 获取初步过滤的对象列表 +2. 调用 `searchHelper.filterObj()` 进行精确过滤 +3. 将过滤结果根据对象类型分别添加到 `selGeoList` 或 `selNoteList` +4. 在整个过程中显示进度条,提升用户体验 + +执行完成后,所有符合条件的对象都存储在 `SSProcess` 的内部选择集列表中,可以通过索引访问它们。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L112-L133) + +## 步骤五:获取选择集对象数量 + +在遍历选择集之前,通常需要先了解查询到了多少对象,这有助于后续的逻辑判断和循环控制。 + +```python +geo_count = SSProcess.getSelGeoCount() +print(f"选择集中的点线面对象数量: {geo_count}") +``` + +`getSelGeoCount()` 方法返回 `selGeoList` 的长度,即当前选择集中的点、线、面对象总数。如果还有注记对象,可以使用 `getSelNoteCount()` 方法获取注记对象的数量。了解对象数量可以帮助我们判断查询结果是否符合预期,或者避免在空选择集上执行不必要的操作。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L152-L162) + +## 步骤六:遍历选择集并读取属性 + +现在我们进入了脚本的核心部分——遍历选择集中的每个对象,并读取它们的属性值。这需要使用 `getSelGeoValue()` 方法,它接受两个参数:对象在选择集中的索引和属性名称。 + +### 常用地物属性速查表 + +| 属性名称 | 属性说明 | 数据类型 | 示例值 | +|---------|---------|---------|--------| +| `SSObj_ID` | 对象唯一标识 | 整数 | 1001 | +| `SSObj_Code` | 地物编码 | 整数 | 3103013 | +| `SSObj_LayerName` | 所在图层名 | 字符串 | "Default_A" | +| `SSObj_Type` | 对象类型 | 字符串 | "POINT", "LINE", "AREA", "NOTE" | +| `SSObj_Color` | 颜色值 | 整数 | 16777215 (白色) | +| `SSObj_LineType` | 线型 | 整数 | 1 | +| `SSObj_LineWidth` | 线宽 | 整数 | 2 | +| `SSObj_Name` | 对象名称 | 字符串 | "道路1" | +| `SSObj_Byname` | 对象别名 | 字符串 | "主路" | +| `SSObj_Area` | 面积 | 浮点数 | 1234.56 | +| `SSObj_Length` | 长度 | 浮点数 | 567.89 | +| `SSObj_PointCount` | 坐标点数量 | 整数 | 5 | +| `SSObj_X` | X坐标 | 浮点数 | 12345.67 | +| `SSObj_Y` | Y坐标 | 浮点数 | 54321.09 | + +### 遍历代码示例 + +以下代码展示了如何遍历选择集的前10个对象,并读取它们的多个属性: + +```python +# 定义要读取的属性列表 +fields = [ + "SSObj_ID", "SSObj_Code", "SSObj_LayerName", "SSObj_Type", "SSObj_Color", + "SSObj_LineType", "SSObj_LineWidth", "SSObj_Name", "SSObj_Byname", + "SSObj_Area", "SSObj_Length", "SSObj_X", "SSObj_Y" +] + +# 遍历选择集(最多显示前10个对象) +for i in range(min(10, geo_count)): + print(f"第 {i} 个对象属性:") + for field in fields: + value = SSProcess.getSelGeoValue(i, field) + print(f" {field}: {value}") + print("-" * 40) +``` + +`getSelGeoValue()` 方法内部会根据属性名的前缀判断属性类型: +- 如果属性名以 `[` 开头,则调用 `map.getExtentAttr()` 获取扩展属性 +- 否则,调用 `objBaseAttr.getGeoValue()` 获取基本属性 + +这种设计使得属性读取接口对用户保持统一,而内部实现则根据属性类型自动适配。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L189-L261) + +## 完整示例脚本 + +将上述所有步骤组合起来,我们就得到了一个完整可运行的第一个脚本: + +```python +from sunvpy import SSProcess + +# 1. 清理选择集和条件 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 2. 设置筛选条件:按编码筛选 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 3. 执行过滤查询 +SSProcess.selectFilter() + +# 4. 获取选择集对象数量 +geo_count = SSProcess.getSelGeoCount() +print(f"选择集中的点线面对象数量: {geo_count}") + +# 5. 定义要读取的属性列表 +fields = [ + "SSObj_ID", "SSObj_Code", "SSObj_LayerName", "SSObj_Type", "SSObj_Color", + "SSObj_LineType", "SSObj_LineWidth", "SSObj_Name", "SSObj_Byname", + "SSObj_Area", "SSObj_Length", "SSObj_PointCount", "SSObj_X", "SSObj_Y" +] + +# 6. 遍历选择集并读取属性 +for i in range(min(10, geo_count)): + print(f"第 {i} 个对象属性:") + for field in fields: + value = SSProcess.getSelGeoValue(i, field) + print(f" {field}: {value}") + print("-" * 40) +``` + +运行这个脚本后,您将在控制台看到每个选中对象的详细属性信息,格式化输出为清晰的键值对形式,便于查看和调试。 + +Sources: [PySSProcess.py](PySSProcess.py#L110-L140) + +## 脚本执行结果示例 + +假设我们的地图中有3个编码为3103013的地物对象,脚本执行后的输出可能如下: + +``` +选择集中的点线面对象数量: 3 +第 0 个对象属性: + SSObj_ID: 1001 + SSObj_Code: 3103013 + SSObj_LayerName: Default_A + SSObj_Type: LINE + SSObj_Color: 16777215 + SSObj_LineType: 1 + SSObj_LineWidth: 1 + SSObj_Name: 道路1 + SSObj_Byname: 主路 + SSObj_Area: 0.0 + SSObj_Length: 567.89 + SSObj_PointCount: 5 + SSObj_X: 12345.67 + SSObj_Y: 54321.09 +---------------------------------------- +第 1 个对象属性: + SSObj_ID: 1002 + SSObj_Code: 3103013 + SSObj_LayerName: Default_A + SSObj_Type: LINE + SSObj_Color: 16777215 + SSObj_LineType: 1 + SSObj_LineWidth: 1 + SSObj_Name: 道路2 + SSObj_Byname: 支路 + SSObj_Area: 0.0 + SSObj_Length: 234.56 + SSObj_PointCount: 3 + SSObj_X: 13000.00 + SSObj_Y: 55000.00 +---------------------------------------- +第 2 个对象属性: + SSObj_ID: 1003 + SSObj_Code: 3103013 + SSObj_LayerName: Default_A + SSObj_Type: AREA + SSObj_Color: 16711680 + SSObj_LineType: 2 + SSObj_LineWidth: 2 + SSObj_Name: 区域1 + SSObj_Byname: 核心区 + SSObj_Area: 1234.56 + SSObj_Length: 150.00 + SSObj_PointCount: 6 + SSObj_X: 12500.00 + SSObj_Y: 54500.00 +---------------------------------------- +``` + +从输出结果可以看出,我们成功查询到了3个符合条件的对象,包括2个线型对象和1个面对象,每个对象的属性都清晰地显示出来。 + +## 常见问题与解决方案 + +### 问题1:选择集为空 + +**现象**:运行脚本后显示"选择集中的点线面对象数量: 0" + +**可能原因**: +- 指定的编码在当前地图中不存在 +- 当前数据源中没有符合条件的对象 +- 选择条件设置不正确 + +**解决方案**:尝试使用更宽泛的条件,例如按图层筛选: + +```python +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") +``` + +或者不设置任何条件,查询所有对象: + +```python +# 不调用 setSelectCondition,直接执行 selectFilter +SSProcess.selectFilter() +``` + +### 问题2:属性值为空 + +**现象**:某些属性显示为空字符串 + +**可能原因**: +- 该属性对于当前对象类型不适用(例如,点对象的 `SSObj_Area` 总是为 0) +- 扩展属性 `[ ]` 在当前对象上不存在 + +**解决方案**:根据对象类型选择合适的属性。例如,对于线对象,查询 `SSObj_Length`;对于面对象,查询 `SSObj_Area`。 + +### 问题3:扩展属性无法读取 + +**现象**:使用 `[扩展属性名]` 格式读取时返回空值 + +**可能原因**: +- 扩展属性名称拼写错误 +- 当前对象没有该扩展属性 + +**解决方案**:先查询对象的扩展属性列表: + +```python +# 获取对象的扩展属性字段名 +SSProcess.curSelGeoFields.clear() +SSProcess.curSelGeoValues.clear() +SSProcess.map.getExtentAttr(geo, SSProcess.curSelGeoFields, SSProcess.curSelGeoValues) + +# 打印所有扩展属性 +for i in range(SSProcess.curSelGeoFields.size()): + print(f"{SSProcess.curSelGeoFields[i]}: {SSProcess.curSelGeoValues[i]}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L189-L261) + +## 架构原理补充说明 + +### SSProcess 的内部结构 + +`SSProcessManager` 类采用了**Mixin 设计模式**,将不同功能模块分离到独立的 Mixin 类中,然后通过多重继承组合成一个功能完整的管理器: + +```mermaid +classDiagram + class SSProcessManager { + -workspace: WorkSpace + -map: ScaleMap + -selGeoList: GeoBaseList + -selNoteList: GeoBaseList + -searchHelper: SSearchHelper + +clearSelection() + +clearSelectCondition() + +setSelectCondition() + +selectFilter() + +getSelGeoCount() + +getSelGeoValue() + } + + class SelectionMixin { + +clearSelection() + +clearSelectCondition() + +setSelectCondition() + +selectFilter() + +getSelGeoCount() + +getSelGeoValue() + } + + class GeoEditMixin { + +createGeo() + +deleteGeo() + +updateGeo() + } + + class ProjectMixin { + +getWorkspace() + +getMap() + } + + class LogMixin { + +log() + +logger + } + + class ProgressMixin { + +startProgress() + +stepProgress() + +closeProgress() + } + + SSProcessManager --|> SelectionMixin + SSProcessManager --|> GeoEditMixin + SSProcessManager --|> ProjectMixin + SSProcessManager --|> LogMixin + SSProcessManager --|> ProgressMixin +``` + +这种架构设计的优势在于: +- **关注点分离**:每个 Mixin 只负责一个特定的功能领域 +- **代码复用**:不同功能的代码可以独立维护和测试 +- **扩展性强**:新增功能只需添加新的 Mixin 类 +- **清晰的职责边界**:便于理解和使用 + +Sources: [PySSProcess.py](PySSProcess.py#L35-L70) + +### 属性读取机制 + +SunvStation 支持三种属性类型,它们在底层有不同的存储和访问机制: + +```mermaid +flowchart LR + A[getSelGeoValue 调用] --> B{属性名前缀判断} + B -->|基本属性| C[调用 objBaseAttr.getGeoValue] + B -->|几何特性| D[调用 searchHelper 几何判断] + B -->|扩展属性| E[调用 map.getExtentAttr] + + C --> F[返回基本属性值] + D --> G[返回几何特性结果] + E --> H[返回扩展属性值] + + F --> I[统一返回字符串] + G --> I + H --> I +``` + +基本属性存储在 C++ 对象的内部结构中,通过 `ObjBaseAttr` 类的索引机制快速访问;扩展属性存储在数据库或附加结构中,通过地图接口动态获取;几何特性则是实时计算的判断结果。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L1-L50) + +## 下一步学习建议 + +掌握了第一个脚本的基本流程后,您可以根据自己的学习需求选择接下来的学习路径: + +### 继续深入选择集与查询 + +如果您想了解更多选择集操作和高级查询技巧,建议阅读: + +- **[使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji)** - 学习更复杂的选择集管理方法 +- **[设置选择条件](12-she-zhi-xuan-ze-tiao-jian)** - 深入了解多条件组合查询 +- **[遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang)** - 掌握高效的遍历技巧 + +### 学习地物属性操作 + +如果您想学习如何修改地物属性,建议阅读: + +- **[获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi)** - 了解更多属性获取细节 +- **[修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi)** - 学习如何批量修改属性 +- **[地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)** - 查看所有可用属性的完整列表 + +### 探索高级功能 + +如果您已经掌握了基础知识,可以尝试更高级的功能: + +- **[运行内置示例脚本](5-yun-xing-nei-zhi-shi-li-jiao-ben)** - 查看更多实际应用案例 +- **[SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou)** - 理解系统的整体设计原理 + +无论选择哪条路径,都建议您在实际项目中多练习,通过编写不同的脚本加深对 SunvStation Python API 的理解。每个页面都提供了详细的示例代码和源文件引用,可以作为您学习的参考手册。 \ No newline at end of file diff --git a/docs/content/30-shu-ju-jian-cha-ji-lu-guan-li.md b/docs/content/30-shu-ju-jian-cha-ji-lu-guan-li.md new file mode 100644 index 0000000..71cef86 --- /dev/null +++ b/docs/content/30-shu-ju-jian-cha-ji-lu-guan-li.md @@ -0,0 +1,433 @@ +数据检查记录管理是 SunvStation 数据质量保证系统的核心组件,用于记录、追踪和管理数据验证过程中发现的各类问题。通过该机制,您可以系统地捕获检查结果、定位问题对象、记录问题描述,并支持后续的统计分析和问题修复工作。数据检查记录为数据生产流程提供了可追溯的质量控制能力。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160) + +## 系统架构概览 + +数据检查记录管理基于 **CheckFunForPY** 类实现,该类通过 SWIG 封装技术连接 Python 业务逻辑与 C++ 核心检查引擎。在整个系统架构中,CheckFunForPY 位于接口层,与工作空间、地图管理等核心模块协同工作,形成完整的数据质量保障体系。 + +```mermaid +graph TB + subgraph "应用层 Python 业务逻辑" + Script[检查脚本] + end + + subgraph "接口层 SWIG 封装" + CheckFun[CheckFunForPY
检查记录管理类] + OtherMods[其他接口模块
PySSCore, PySSMap等] + end + + subgraph "实现层 C++ 核心库" + CheckDL[_PySSCheck.pyd
检查引擎实现] + OtherDL[其他核心库
_PySSCore.pyd等] + end + + Script -->|实例化| CheckFun + Script -->|可能调用| OtherMods + + CheckFun -->|调用| CheckDL + CheckFun -.->|协作| OtherMods + OtherMods --> OtherDL + + style CheckFun fill:#e1f5ff + style CheckDL fill:#fff4e1 +``` + +CheckFunForPY 类采用了 **记录集管理模式**,检查记录以集合形式在内存中维护,提供增删改查的完整操作。与 SSProcessManager 的单例模式不同,CheckFunForPY 需要显式实例化,这种设计允许同时维护多个独立的检查记录集合,适用于并行检查或分段检查等复杂场景。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160) + +## 核心功能模块 + +数据检查记录管理包含六大核心功能模块,每个模块对应一组相关的方法,共同构成完整的检查记录生命周期管理能力。 + +### 记录生命周期管理 + +| 方法名称 | 功能说明 | 典型应用场景 | +|---------|---------|------------| +| `AddCheckRecord()` | 添加一条新的检查记录 | 数据验证脚本发现问题时记录 | +| `RemoveCheckRecord()` | 删除指定的检查记录 | 误报修正或批量清理 | +| `GetCheckRecordCount()` | 获取当前检查记录总数 | 统计分析、进度监控 | +| `ClearCheckRecord()` | 清空所有检查记录 | 开始新一轮检查前初始化 | + +记录的生命周期从添加开始,经过可能的删除操作,最终通过保存操作持久化。这种设计遵循**最小状态原则**,检查记录仅在内存中维护显式状态,避免隐式的后台同步操作。 + +Sources: [PySSCheck.py](PySSCheck.py#L114-L123) + +### 持久化与IO操作 + +| 方法名称 | 功能说明 | 操作目标 | +|---------|---------|---------| +| `LoadCheckRecord()` | 从文件加载历史检查记录 | 恢复之前保存的检查结果 | +| `SaveCheckRecord()` | 将当前检查记录保存到文件 | 持久化存储检查结果 | +| `WriteCheckRecord()` | 将检查记录写入系统输出 | 与系统检查模块集成 | + +持久化操作支持检查结果的跨会话复用,您可以在不同时间点加载和比较检查结果,追踪数据质量的演变趋势。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L110) + +### 查询与访问 + +| 方法名称 | 功能说明 | 参数说明 | +|---------|---------|---------| +| `GetCheckRecordValue()` | 获取指定记录的字段值 | 支持批量获取多个字段 | +| `ShowCheckOutput()` | 显示检查输出结果 | 在系统界面中呈现 | + +查询方法提供了灵活的数据访问能力,支持按索引定位记录并提取特定字段,便于生成定制化的报告或进行深度分析。 + +Sources: [PySSCheck.py](PySSCheck.py#L124-L125) + +## 检查记录数据结构 + +每条检查记录包含丰富的元数据信息,用于完整描述检查发现的问题。理解这些字段的结构是有效使用检查记录功能的基础。 + +```mermaid +classDiagram + class CheckRecord { + +string group 检查组名 + +string check 检查项名称 + +int checkmodel 检查模式 + +string description 问题描述 + +float x 问题位置X坐标 + +float y 问题位置Y坐标 + +float z 问题位置Z坐标 + +int objtype 对象类型 + +string geoids 地物ID列表 + +string noteids 注记ID列表 + } + + class CheckFunForPY { + +AddCheckRecord(group, check, ...) + +GetCheckRecordValue(index, fields, values) + +RemoveCheckRecord(group, check) + +GetCheckRecordCount() + +LoadCheckRecord() + +SaveCheckRecord() + } + + CheckFunForPY "1" *-- "0..*" CheckRecord : 管理记录集合 +``` + +检查记录采用**坐标定位 + 对象关联**的双重定位机制。通过 x、y、z 坐标可以直接定位问题发生的地理位置,通过 geoids 和 noteids 可以关联到具体的地物对象和注记对象,这种设计既支持空间定位,也支持对象级别的追踪修复。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +### 关键字段说明 + +| 字段名 | 数据类型 | 说明 | 示例值 | +|-------|---------|------|--------| +| `group` | string | 检查组名称,用于分类管理 | "拓扑检查" | +| `check` | string | 检查项名称,标识具体检查类型 | "重叠检查" | +| `checkmodel` | int | 检查模式标识符 | 0 | +| `description` | string | 问题描述或错误详情 | "面对象与线对象存在重叠" | +| `x` | float | 问题位置X坐标 | 123456.78 | +| `y` | float | 问题位置Y坐标 | 345678.90 | +| `z` | float | 问题位置Z坐标(可选) | 0.0 | +| `objtype` | int | 问题对象类型 | 2(面对象) | +| `geoids` | string | 地物对象ID列表,逗号分隔 | "1001,1002,1003" | +| `noteids` | string | 注记对象ID列表,逗号分隔 | "2001,2002" | + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +## 典型使用流程 + +数据检查记录管理遵循标准的 **创建-操作-保存** 流程。理解这个流程有助于编写结构清晰、逻辑严谨的检查脚本。 + +```mermaid +flowchart LR + A[开始数据检查任务] --> B[创建 CheckFunForPY 实例] + B --> C[执行数据检查逻辑] + C --> D{发现数据问题?} + D -->|否| C + D -->|是| E[调用 AddCheckRecord 记录问题] + E --> C + + C --> F{检查流程完成?} + F -->|否| C + F -->|是| G[调用 GetCheckRecordCount 统计] + + G --> H{需要显示结果?} + H -->|是| I[调用 ShowCheckOutput] + H -->|否| J[调用 SaveCheckRecord 保存] + I --> J + + J --> K[检查记录管理完成] +``` + +该流程体现了**渐进式积累**的设计理念:检查记录在检查过程中逐步添加,最后统一处理显示和保存,这种方式避免了频繁的 I/O 操作,提升了大规模数据检查的性能。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L125) + +### 基础实例化 + +与 sunvpy 中其他需要显式实例化的类一样,使用 CheckFunForPY 首先需要创建实例。 + +```python +from sunvpy.PySSCheck import CheckFunForPY + +# 创建检查记录管理实例 +check_fun = CheckFunForPY() +``` + +实例化后,check_fun 对象维护一个独立的检查记录集合,与其他实例或系统全局检查记录互不干扰。 + +Sources: [PySSCheck.py](PySSCheck.py#L156-L158) + +### 添加检查记录 + +添加检查记录是数据质量验证脚本的核心操作。以下示例展示了如何记录一个重叠检查问题: + +```python +# 检查到两个面对象重叠 +group_name = "拓扑检查" +check_name = "重叠检查" +check_model = 0 +desc = "建筑物A与建筑物B存在空间重叠" +x_pos = 123456.78 +y_pos = 345678.90 +z_pos = 0.0 +obj_type = 2 # 面对象 +geo_ids = "1001,1002" # 两个重叠对象的ID +note_ids = "" # 无注记对象 + +# 添加检查记录 +check_fun.AddCheckRecord( + group_name, check_name, check_model, desc, + x_pos, y_pos, z_pos, obj_type, geo_ids, note_ids +) +``` + +在实际应用中,geoids 和 noteids 通常从当前选择集或遍历结果中提取,这需要与 SSProcessManager 的选择集功能配合使用。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +### 统计与查询 + +检查完成后,通常需要获取统计信息或详细记录,用于生成报告或进行后续分析。 + +```python +# 获取检查记录总数 +count = check_fun.GetCheckRecordCount() +print(f"共发现 {count} 个问题") + +# 遍历检查记录 +for i in range(count): + fields = "group,check,description,geoids" + values = "" + + # 获取记录值(通过引用参数返回) + check_fun.GetCheckRecordValue(i, fields, values) + + # values 包含所有请求字段的值,按逗号分隔 + print(f"记录 {i}: {values}") +``` + +GetCheckRecordValue 方法采用 **批量字段获取** 的设计,一次调用可以获取多个字段,减少方法调用次数,提升性能。返回的 values 字符串按照 fields 参数中指定的字段顺序,以逗号分隔各个字段值。 + +Sources: [PySSCheck.py](PySSCheck.py#L124-L125) + +### 持久化与清理 + +检查记录的生命周期管理包括保存和清理操作,确保数据不会意外丢失或占用过多内存。 + +```python +# 保存检查记录到文件 +check_fun.SaveCheckRecord() + +# 在系统界面中显示检查结果 +check_fun.ShowCheckOutput() + +# 清空检查记录,准备下一次检查 +check_fun.ClearCheckRecord() +``` + +保存操作会将当前内存中的所有检查记录写入系统配置的默认位置,通常位于工作目录下的特定文件夹中。ShowCheckOutput 方法会触发系统内置的检查结果查看器,提供可视化的结果浏览界面。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L112) + +## 检查记录的高级应用 + +在实际的数据生产项目中,检查记录管理通常与其他 sunvpy 功能结合使用,形成完整的质量控制解决方案。 + +### 与选择集的协同 + +检查记录通常基于选择集操作的结果生成,以下是一个完整的检查流程示例: + +```python +from sunvpy import SSProcess +from sunvpy.PySSCheck import CheckFunForPY + +# 1. 创建检查记录实例 +check_fun = CheckFunForPY() + +# 2. 设置选择条件,筛选可能存在问题的对象 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_LayerName", "==", "建筑") +SSProcess.setSelectCondition("", "==", "True") + +# 3. 执行过滤查询 +SSProcess.selectFilter() + +# 4. 遍历选择集,记录问题 +count = SSProcess.getSelGeoCount() +for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + layer_name = SSProcess.getSelGeoValue(i, "SSObj_LayerName") + + # 添加检查记录 + check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=0, + description=f"图层 '{layer_name}' 中的地物存在重叠", + x=x, y=y, z=0.0, + objtype=2, + geoids=str(geo_id), + noteids="" + ) + +# 5. 保存并显示结果 +print(f"检查完成,共发现 {check_fun.GetCheckRecordCount()} 个问题") +check_fun.SaveCheckRecord() +check_fun.ShowCheckOutput() +``` + +该示例展示了检查记录管理与选择集操作的典型协作模式,体现了**查询-遍历-记录**的三阶段处理流程。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L29-L38) + +### 历史记录对比 + +通过 LoadCheckRecord 方法,可以加载历史检查记录进行对比分析,追踪数据质量的改进情况。 + +```python +# 加载之前的检查记录 +check_fun.LoadCheckRecord() + +old_count = check_fun.GetCheckRecordCount() +print(f"历史记录中共有 {old_count} 个问题") + +# 执行新的检查... +# ...检查逻辑... + +# 清空历史记录,保存新的检查结果 +check_fun.ClearCheckRecord() +# ...添加新的检查记录... + +new_count = check_fun.GetCheckRecordCount() +print(f"本次检查发现 {new_count} 个问题") +print(f"数据质量改进: {old_count - new_count} 个问题已修复") +``` + +对比分析功能为数据生产质量评估提供了量化指标,是数据质量管理体系的重要组成部分。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L110) + +## 性能考虑与最佳实践 + +在大规模数据检查场景下,合理使用检查记录管理功能对于保证脚本性能至关重要。 + +### 批量操作优化 + +检查记录的添加操作相对轻量,但在数十万级别记录时仍需注意性能。建议采用**分批保存**策略: + +```python +BATCH_SIZE = 1000 # 每1000条记录保存一次 + +for i in range(total_checks): + # 执行检查并添加记录 + check_fun.AddCheckRecord(...) + + # 分批保存 + if (i + 1) % BATCH_SIZE == 0: + check_fun.SaveCheckRecord() + check_fun.ClearCheckRecord() # 可选:清空后继续累积 + +# 保存剩余记录 +if total_checks % BATCH_SIZE != 0: + check_fun.SaveCheckRecord() +``` + +这种策略可以有效控制内存使用,避免检查记录集合过大导致性能下降。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L114) + +### 记录内容优化 + +在记录量大的情况下,精简描述信息可以提升整体性能: + +```python +# 简洁描述(推荐) +desc = f"重叠|obj_{geo_id}|{layer_name}" + +# 冗长描述(避免) +desc = f"在图层 '{layer_name}' 中,编码为 {geo_id} 的地物对象与其他对象存在空间重叠现象,需要进行进一步的空间关系分析和几何修正处理" +``` + +描述信息主要用于问题定位,过度详细的描述会占用额外的存储空间并影响后续查询性能。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +## 常见问题与故障排除 + +### 记录无法保存 + +如果 SaveCheckRecord 调用失败,通常是因为以下原因: + +1. **文件权限问题**:确保脚本有写入输出目录的权限 +2. **路径不存在**:检查系统配置的输出路径是否有效 +3. **磁盘空间不足**:检查磁盘剩余空间 + +```python +# 添加错误处理 +try: + check_fun.SaveCheckRecord() + print("检查记录保存成功") +except Exception as e: + print(f"保存失败: {e}") +``` + +### geoids 和 noteids 格式错误 + +这两个字段需要以逗号分隔的字符串形式提供,错误格式可能导致关联失败: + +```python +# 正确格式 +geo_ids = "1001,1002,1003" + +# 错误格式(会导致问题) +geo_ids = "1001; 1002; 1003" # 使用了分号 +geo_ids = "[1001,1002]" # 使用了括号 +``` + +### GetCheckRecordValue 返回空值 + +当指定索引超出范围或字段名称不存在时,该方法可能返回空字符串。应始终进行有效性检查: + +```python +fields = "group,check,description" +values = "" + +# 确保索引有效 +if index < check_fun.GetCheckRecordCount(): + check_fun.GetCheckRecordValue(index, fields, values) + if not values: + print(f"警告:记录 {index} 的数据不完整") +else: + print(f"错误:索引 {index} 超出范围") +``` + +Sources: [PySSCheck.py](PySSCheck.py#L124-L125) + +## 学习路径建议 + +数据检查记录管理是 SunvStation 数据质量保障体系的基础,掌握本页面的内容后,建议按照以下顺序深入学习: + +1. **[添加与加载检查记录](31-tian-jia-yu-jia-zai-jian-cha-ji-lu)** - 详细了解 AddCheckRecord 和 LoadCheckRecord 的高级用法 +2. **[显示检查结果](32-xian-shi-jian-cha-jie-guo)** - 掌握 ShowCheckOutput 和结果可视化技巧 +3. **[自定义检查规则](33-zi-ding-yi-jian-cha-gui-ze)** - 学习如何构建自定义的数据检查逻辑 + +通过系统学习这些内容,您将能够构建完整的数据质量控制和问题追踪系统。 \ No newline at end of file diff --git a/docs/content/31-tian-jia-yu-jia-zai-jian-cha-ji-lu.md b/docs/content/31-tian-jia-yu-jia-zai-jian-cha-ji-lu.md new file mode 100644 index 0000000..4575ff9 --- /dev/null +++ b/docs/content/31-tian-jia-yu-jia-zai-jian-cha-ji-lu.md @@ -0,0 +1,664 @@ +数据检查记录的添加与加载是 SunvStation 数据质量保证系统中最为核心的两个操作。添加操作用于在数据验证过程中实时记录发现的问题,加载操作则用于恢复历史检查结果或在不同检查会话之间共享数据。这两个操作共同构成了检查记录管理的基础,支撑着完整的数据质量控制生命周期。 + +通过精心设计的参数体系和灵活的持久化机制,添加与加载操作能够适应从快速原型验证到大规模生产检查的各种应用场景。掌握这两个操作的使用方法,是编写高质量数据检查脚本的关键技能。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160) + +## 添加检查记录详解 + +添加检查记录是数据验证脚本中最为频繁的操作,通过 `AddCheckRecord()` 方法将发现的数据问题记录到内存中的检查记录集合中。该方法通过丰富的参数体系完整地描述了检查发现的问题,包括问题分类、空间位置、关联对象等多维度信息。 + +### 方法签名与参数说明 + +`AddCheckRecord()` 方法的完整签名包含10个参数,每个参数都有其特定的语义和使用场景: + +```python +def AddCheckRecord(self, group, check, checkmodel, description, x, y, z, objtype, geoids, noteids): +``` + +| 参数名 | 数据类型 | 必需 | 说明 | 典型值 | +|--------|---------|------|------|--------| +| `group` | string | 是 | 检查组名称,用于逻辑分组 | "拓扑检查"、"属性完整性" | +| `check` | string | 是 | 检查项名称,标识具体检查类型 | "重叠检查"、"必填项缺失" | +| `checkmodel` | int | 是 | 检查模式标识符 | 0-255之间的整数值 | +| `description` | string | 是 | 问题描述或错误详情 | 简洁清晰的问题描述文本 | +| `x` | float | 是 | 问题位置X坐标 | 地理坐标系统中的X值 | +| `y` | float | 是 | 问题位置Y坐标 | 地理坐标系统中的Y值 | +| `z` | float | 是 | 问题位置Z坐标 | 高程值,通常为0.0 | +| `objtype` | int | 是 | 关联对象的类型 | 1=点,2=线,3=面等 | +| `geoids` | string | 是 | 地物对象ID列表,逗号分隔 | "1001,1002,1003" | +| `noteids` | string | 是 | 注记对象ID列表,逗号分隔 | "2001,2002" | + +该设计遵循**信息完整性原则**,确保每条记录包含问题追踪和定位所需的所有信息,同时通过字符串形式的ID列表支持多对象关联场景。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +### 添加操作的工作流程 + +理解添加操作的内部处理流程有助于编写更高效的检查脚本。当调用 `AddCheckRecord()` 时,系统会执行一系列验证和处理步骤: + +```mermaid +flowchart TD + A[调用 AddCheckRecord] --> B{参数有效性验证} + B -->|通过| C[创建检查记录对象] + B -->|失败| D[记录添加失败] + + C --> E[设置 group 和 check 字段] + E --> F[设置空间坐标 x, y, z] + F --> G[设置 objtype 对象类型] + G --> H[解析 geoids 字符串为ID列表] + H --> I[解析 noteids 字符串为ID列表] + I --> J[设置 description 描述信息] + J --> K[记录添加到内存集合] + K --> L[返回成功状态] + + D --> M[抛出异常或返回错误] + + style C fill:#e1f5ff + style K fill:#fff4e1 + style L fill:#d4edda +``` + +该流程体现了**防御性编程**的设计思想,在添加记录前进行参数验证,避免无效数据污染检查记录集合。坐标和对象类型信息的设置支持后续的空间查询和类型过滤,而ID列表的解析则实现了从字符串表示到结构化数据的转换。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +### 基础添加示例 + +以下是一个完整的添加检查记录示例,展示了如何在实际脚本中记录拓扑重叠问题: + +```python +from sunvpy.PySSCheck import CheckFunForPY +from sunvpy import SSProcess + +# 创建检查记录管理实例 +check_fun = CheckFunForPY() + +# 设置选择条件,查找可能存在重叠的建筑物 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() +SSProcess.setSelectCondition("SSObj_LayerName", "==", "建筑") +SSProcess.setSelectCondition("SSObj_Type", "==", "3") # 面对象 +SSProcess.selectFilter() + +# 遍历选择集,假设已通过某种算法检测到重叠 +count = SSProcess.getSelGeoCount() +for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + + # 获取对象的空间位置(以第一个点为例) + point_count = int(SSProcess.getSelGeoValue(i, "SSObj_PointCount")) + if point_count > 0: + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + z = 0.0 + + # 添加检查记录 + check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=1, # 检查模式1表示重叠 + description=f"建筑物 {geo_id} 存在空间重叠", + x=x, y=y, z=z, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + +# 输出统计信息 +print(f"检查完成,共记录 {check_fun.GetCheckRecordCount()} 个重叠问题") +``` + +该示例展示了**选择集遍历与检查记录添加**的典型协作模式,这是数据检查脚本中最常见的使用场景。在实际应用中,重叠检测算法通常需要结合空间索引和几何运算库来实现。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +### 多对象关联添加 + +许多数据质量问题涉及多个对象的相互作用,此时需要将多个对象ID记录到同一条检查记录中: + +```python +# 假设检测到两个建筑物重叠 +obj1_id = "1001" +obj2_id = "1002" +obj1_type = 3 # 面对象 +obj2_type = 3 + +# 计算重叠区域的中心点 +overlap_center_x = 123456.78 +overlap_center_y = 345678.90 +overlap_center_z = 0.0 + +# 添加包含多个对象ID的检查记录 +check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=1, + description=f"建筑物 {obj1_id} 与 {obj2_id} 存在空间重叠", + x=overlap_center_x, + y=overlap_center_y, + z=overlap_center_z, + objtype=obj1_type, # 记录主对象的类型 + geoids=f"{obj1_id},{obj2_id}", # 逗号分隔的多个ID + noteids="" +) + +print(f"已记录重叠问题,关联对象: {obj1_id}, {obj2_id}") +``` + +通过逗号分隔的字符串形式传递多个对象ID,既保持了接口的简洁性,又支持了复杂的多对象关系记录。在查询和分析时,可以按照逗号分隔符解析出各个对象ID,进行批量处理或关联分析。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +## 加载检查记录详解 + +加载检查记录是通过 `LoadCheckRecord()` 方法将持久化的检查记录文件读取到内存中,用于历史数据恢复、对比分析或跨会话数据共享。该方法是检查记录持久化机制的关键组成部分,为数据质量管理提供了时间维度的支持。 + +### 方法功能与返回值 + +`LoadCheckRecord()` 方法的签名非常简洁,没有显式参数: + +```python +def LoadCheckRecord(self): +``` + +该方法会从系统配置的默认位置加载检查记录文件,通常是在最后一次 `SaveCheckRecord()` 调用时保存的文件。方法返回一个布尔值,指示加载操作是否成功: + +- **True**:加载成功,检查记录已恢复到内存中 +- **False**:加载失败,可能是文件不存在、格式错误或权限问题 + +这种设计遵循**最小接口原则**,通过约定优于配置的方式简化了调用方的代码,同时通过返回值提供了必要的错误处理能力。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L109) + +### 加载操作的执行过程 + +理解加载操作的内部流程有助于排查问题并优化使用方式: + +```mermaid +sequenceDiagram + participant Script as 检查脚本 + participant CF as CheckFunForPY + participant File as 持久化文件 + participant Memory as 内存记录集合 + + Script->>CF: LoadCheckRecord() + CF->>CF: 获取默认文件路径 + CF->>File: 打开检查记录文件 + alt 文件存在且可读 + File->>CF: 返回文件句柄 + CF->>CF: 解析文件格式 + CF->>CF: 清空当前内存集合 + loop 遍历文件中的记录 + CF->>Memory: 添加记录到集合 + end + CF->>Script: 返回 True + else 文件不存在或格式错误 + CF->>Script: 返回 False + end +``` + +该流程体现了**原子性替换**的设计思想:加载操作会清空当前内存中的检查记录集合,然后用文件中的记录完全替换。这意味着加载操作是一个破坏性操作,如果需要保留当前记录,应该在加载前进行备份或另存。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L109) + +### 基础加载示例 + +以下是一个完整的加载检查记录示例: + +```python +from sunvpy.PySSCheck import CheckFunForPY + +# 创建检查记录管理实例 +check_fun = CheckFunForPY() + +# 加载历史检查记录 +success = check_fun.LoadCheckRecord() + +if success: + record_count = check_fun.GetCheckRecordCount() + print(f"成功加载 {record_count} 条历史检查记录") + + # 遍历并显示前5条记录 + for i in range(min(5, record_count)): + fields = "group,check,description" + values = "" + check_fun.GetCheckRecordValue(i, fields, values) + print(f" 记录 {i}: {values}") +else: + print("加载失败,可能文件不存在或格式错误") +``` + +该示例展示了加载操作的标准流程:调用方法、检查返回值、获取记录数量、遍历记录内容。在批量处理场景中,通常会在加载后进行统计分析或与其他数据源进行对比。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L109) + +### 加载前的清空处理 + +由于 `LoadCheckRecord()` 会自动清空当前内存中的检查记录集合,在某些场景下可能需要先保存当前记录: + +```python +from sunvpy.PySSCheck import CheckFunForPY +import datetime + +check_fun = CheckFunForPY() + +# 假设当前已有一些检查记录 +current_count = check_fun.GetCheckRecordCount() +print(f"当前内存中有 {current_count} 条检查记录") + +if current_count > 0: + # 生成带时间戳的备份文件名 + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + backup_filename = f"check_backup_{timestamp}.tmp" + print(f"将当前记录备份到: {backup_filename}") + + # 保存当前记录(SaveCheckRecord会使用系统默认路径) + check_fun.SaveCheckRecord() + +# 现在加载历史记录 +print("正在加载历史检查记录...") +success = check_fun.LoadCheckRecord() + +if success: + loaded_count = check_fun.GetCheckRecordCount() + print(f"成功加载 {loaded_count} 条历史检查记录") +``` + +这种**备份-加载**模式在需要保留多个检查会话结果的场景中非常有用,例如在进行迭代式数据修复时,可以对比不同修复阶段的结果。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L112) + +## 实践案例:质量追踪系统 + +在实际的数据生产项目中,添加与加载操作通常被整合到完整的数据质量追踪系统中。以下是一个综合示例,展示了如何构建一个简单的质量追踪解决方案。 + +### 场景说明 + +假设我们需要建立一个数据质量追踪系统,定期执行检查任务并记录结果,用于评估数据质量的改进趋势。系统需要支持以下功能: + +1. 执行数据检查并记录问题 +2. 加载历史记录进行对比 +3. 生成质量报告 + +### 完整实现代码 + +```python +from sunvpy.PySSCheck import CheckFunForPY +from sunvpy import SSProcess +import datetime + +class QualityTracker: + """数据质量追踪器""" + + def __init__(self): + self.check_fun = CheckFunForPY() + self.check_results = [] + + def run_check(self, check_name, check_func): + """执行指定的检查任务""" + print(f"\n开始执行检查: {check_name}") + + # 清空当前检查记录 + self.check_fun.ClearCheckRecord() + + # 执行检查函数 + issue_count = check_func(self.check_fun) + + # 记录检查结果 + result = { + 'name': check_name, + 'timestamp': datetime.datetime.now(), + 'count': issue_count, + 'saved': False + } + self.check_results.append(result) + + print(f"检查完成,发现 {issue_count} 个问题") + return issue_count + + def load_previous_results(self): + """加载上次的检查结果""" + print("\n正在加载历史检查结果...") + success = self.check_fun.LoadCheckRecord() + + if success: + prev_count = self.check_fun.GetCheckRecordCount() + print(f"成功加载 {prev_count} 条历史记录") + return prev_count + else: + print("未找到历史记录,将创建新的基准") + return 0 + + def save_results(self): + """保存当前检查结果""" + if self.check_results: + self.check_fun.SaveCheckRecord() + self.check_results[-1]['saved'] = True + print("\n检查结果已保存") + + def generate_report(self): + """生成质量报告""" + print("\n" + "="*60) + print("数据质量检查报告") + print("="*60) + + prev_count = self.load_previous_results() + + # 执行各项检查 + self.run_check("拓扑重叠检查", self.check_overlap) + self.run_check("属性完整性检查", self.check_attributes) + + # 保存结果 + self.save_results() + + # 输出对比报告 + curr_count = self.check_fun.GetCheckRecordCount() + print(f"\n质量改进情况:") + print(f" 上次检查问题数: {prev_count}") + print(f" 本次检查问题数: {curr_count}") + print(f" 改进/新增: {prev_count - curr_count}") + print("="*60) + + def check_overlap(self, check_fun): + """拓扑重叠检查""" + # 实际应用中这里应有具体的重叠检测算法 + # 以下为模拟代码 + + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "3") # 面对象 + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + issue_count = 0 + + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + + # 模拟重叠检测:假设每10个对象有1个重叠 + if i % 10 == 0: + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + + check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=1, + description=f"面对象 {geo_id} 存在重叠", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + issue_count += 1 + + return issue_count + + def check_attributes(self, check_fun): + """属性完整性检查""" + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Name", "==", "") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + issue_count = 0 + + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + + check_fun.AddCheckRecord( + group="属性检查", + check="名称缺失", + checkmodel=2, + description=f"对象 {geo_id} 缺少名称属性", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + issue_count += 1 + + return issue_count + +# 使用质量追踪器 +if __name__ == "__main__": + tracker = QualityTracker() + tracker.generate_report() +``` + +该示例展示了**面向对象**的检查记录管理模式,通过封装检查逻辑和记录管理,构建了一个可复用的质量追踪系统。系统利用加载操作获取历史基准,通过添加操作累积检查结果,最后通过保存操作持久化数据,形成完整的质量追踪闭环。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L125) + +## 最佳实践与注意事项 + +在实际开发中,遵循最佳实践可以显著提升检查脚本的可靠性和性能。 + +### 参数传递的最佳实践 + +**使用常量定义检查组和检查项名称**,避免硬编码字符串: + +```python +# 定义检查常量 +CHECK_GROUPS = { + 'TOPOLOGY': '拓扑检查', + 'ATTRIBUTE': '属性检查', + 'GEOMETRY': '几何检查' +} + +CHECK_ITEMS = { + 'OVERLAP': '重叠检查', + 'GAP': '间隙检查', + 'MISSING_NAME': '名称缺失', + 'INVALID_VALUE': '值非法' +} + +# 使用常量 +check_fun.AddCheckRecord( + group=CHECK_GROUPS['TOPOLOGY'], + check=CHECK_ITEMS['OVERLAP'], + checkmodel=1, + description="检测到重叠", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=geo_id, + noteids="" +) +``` + +这种做法提高了代码的可维护性,当需要修改检查名称时只需修改常量定义,而不需要查找并替换所有使用位置。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +### 坐标信息的准确获取 + +添加检查记录时的坐标信息对问题定位至关重要,应确保坐标的准确性和一致性: + +```python +def get_problem_center_point(process, geo_index): + """获取问题对象的中心点坐标""" + # 方法1:直接使用对象的X,Y属性 + x = float(process.getSelGeoValue(geo_index, "SSObj_X")) + y = float(process.getSelGeoValue(geo_index, "SSObj_Y")) + z = float(process.getSelGeoValue(geo_index, "SSObj_Z")) + return x, y, z + +def get_problem_focal_point(process, geo_index): + """获取对象的几何中心(更精确)""" + from sunvpy.PySSMath import getPolygonFocus + + # 获取对象的所有坐标点 + point_count = int(process.getSelGeoValue(geo_index, "SSObj_PointCount")) + + # 构建点列表 + points = [] + for i in range(point_count): + # 这里需要根据实际API获取点坐标 + # 简化为使用对象中心 + pass + + # 计算几何中心 + center = getPolygonFocus(...) + return center[0], center[1], 0.0 +``` + +对于面对象,使用几何中心(Focal Point)比使用第一个顶点坐标更准确,能够更好地表示问题的空间位置。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114) + +### 加载操作的错误处理 + +加载操作可能因各种原因失败,应进行适当的错误处理: + +```python +def safe_load_check_record(check_fun): + """安全加载检查记录""" + try: + success = check_fun.LoadCheckRecord() + if success: + return check_fun.GetCheckRecordCount() + else: + print("警告: 加载失败,可能不存在历史记录") + return 0 + except Exception as e: + print(f"加载异常: {e}") + return 0 + +# 使用示例 +prev_count = safe_load_check_record(check_fun) +if prev_count > 0: + print(f"成功加载 {prev_count} 条历史记录") +else: + print("将建立新的检查基准") +``` + +通过try-except结构捕获可能的异常,并提供友好的错误提示,可以显著提升脚本的健壮性。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L109) + +### 批量加载与增量更新 + +在大规模检查场景中,可以考虑增量加载策略: + +```python +class IncrementalChecker: + """增量式检查器""" + + def __init__(self, check_fun): + self.check_fun = check_fun + self.new_records = 0 + self.existing_records = 0 + + def add_with_deduplication(self, group, check, checkmodel, description, x, y, z, objtype, geoids, noteids): + """添加记录时去重""" + # 检查是否已存在相似记录 + count = self.check_fun.GetCheckRecordCount() + is_duplicate = False + + for i in range(count): + fields = "group,check,geoids" + values = "" + self.check_fun.GetCheckRecordValue(i, fields, values) + + # 简单的去重逻辑:相同组、检查项和对象ID视为重复 + if values == f"{group},{check},{geoids}": + is_duplicate = True + break + + if is_duplicate: + self.existing_records += 1 + else: + self.check_fun.AddCheckRecord(group, check, checkmodel, description, x, y, z, objtype, geoids, noteids) + self.new_records += 1 + + def load_and_update(self): + """加载历史记录并进行增量更新""" + # 加载历史记录 + self.check_fun.LoadCheckRecord() + base_count = self.check_fun.GetCheckRecordCount() + + print(f"加载历史记录: {base_count} 条") + + # 执行增量检查(调用 add_with_deduplication 而不是直接调用 AddCheckRecord) + # ... 检查逻辑 ... + + print(f"新增记录: {self.new_records} 条") + print(f"重复记录: {self.existing_records} 条") + print(f"总计记录: {self.check_fun.GetCheckRecordCount()} 条") +``` + +这种**增量式**的检查策略在长期运行的数据质量监控系统中非常有用,可以避免重复记录相同的问题,同时保持检查结果的时效性。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L125) + +## 进阶主题:与系统集成 + +添加与加载检查记录不仅可以在独立脚本中使用,还可以与 SunvStation 系统的其他功能深度集成。 + +### 与地图显示的集成 + +检查记录的空间信息可以用于在地图上高亮显示问题位置: + +```python +from sunvpy.PySSCheck import CheckFunForPY +from sunvpy import SSProcess + +def highlight_check_results(check_fun): + """在地图上高亮显示检查结果""" + count = check_fun.GetCheckRecordCount() + + # 清除当前选择集 + SSProcess.clearSelection() + + for i in range(count): + # 获取记录的坐标信息 + fields = "x,y,description,geoids" + values = "" + check_fun.GetCheckRecordValue(i, fields, values) + + # 解析坐标和描述 + parts = values.split(',') + x = float(parts[0]) + y = float(parts[1]) + description = parts[2] + geo_ids = parts[3] + + # 根据geo_ids选择并高亮对象 + for geo_id in geo_ids.split(','): + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_ID", "==", geo_id) + SSProcess.selectFilter() + + # 可以设置特定的显示样式 + # (具体实现取决于PySSView提供的功能) + + # 缩放到问题区域 + SSProcess.zoomToSelection() + +# 使用示例 +check_fun = CheckFunForPY() +check_fun.LoadCheckRecord() +highlight_check_results(check_fun) +``` + +通过将检查记录的空间坐标与地图显示功能结合,可以实现可视化的质量检查结果展示,便于用户快速定位和修复问题。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L125) + +## 学习路径建议 + +掌握添加与加载检查记录是构建复杂数据检查系统的基础。建议按照以下路径深入学习: + +1. **基础阶段**:首先阅读[数据检查记录管理](30-shu-ju-jian-cha-ji-lu-guan-li),理解检查记录的整体架构和数据结构 +2. **实践阶段**:在[显示检查结果](32-xian-shi-jian-cha-jie-guo)中学习如何可视化和分析检查结果 +3. **进阶阶段**:通过[自定义检查规则](33-zi-ding-yi-jian-cha-gui-ze)学习构建完整的自定义检查解决方案 + +循序渐进的学习路径可以帮助您系统地掌握数据检查的各个组成部分,最终能够独立开发高质量的数据检查脚本。 \ No newline at end of file diff --git a/docs/content/32-xian-shi-jian-cha-jie-guo.md b/docs/content/32-xian-shi-jian-cha-jie-guo.md new file mode 100644 index 0000000..18f0074 --- /dev/null +++ b/docs/content/32-xian-shi-jian-cha-jie-guo.md @@ -0,0 +1,678 @@ +显示检查结果是数据质量验证流程的最后一步,通过可视化界面呈现检查记录中记录的所有问题,帮助用户快速定位、分析和修复数据缺陷。通过 `ShowCheckOutput()` 方法,系统将内存中的检查记录转换为直观的检查结果窗口,提供交互式的问题浏览和定位功能。 + +Sources: [PySSCheck.py](PySSCheck.py#L120-L120) + +## 核心功能概述 + +`ShowCheckOutput()` 是 CheckFunForPY 类提供的关键方法,用于在系统界面中弹出一个独立的检查结果查看窗口。该窗口以表格或列表形式展示所有检查记录,支持按检查组、检查项进行分类展示,并提供空间定位功能,点击某条记录即可自动缩放地图到问题发生的位置。 + +该方法的设计遵循**最小调用原则**,无需任何参数即可完成完整的显示操作,系统会自动读取当前 CheckFunForPY 实例中的所有检查记录并渲染到界面。这种设计降低了使用门槛,使得在检查完成后只需一行代码即可呈现结果。 + +```mermaid +graph TB + subgraph "检查脚本执行流程" + A[创建 CheckFunForPY 实例] --> B[执行数据检查逻辑] + B --> C[调用 AddCheckRecord 记录问题] + C --> D[检查完成] + end + + subgraph "结果显示阶段" + D --> E[调用 ShowCheckOutput] + E --> F[读取内存中的检查记录集合] + F --> G[生成检查结果窗口] + G --> H[用户交互浏览问题] + H --> I[点击定位到地图] + end + + style E fill:#e1f5ff + style G fill:#fff4e1 + style I fill:#d4edda +``` + +Sources: [PySSCheck.py](PySSCheck.py#L120-L120) + +## 基础使用方法 + +### 方法签名 + +`ShowCheckOutput()` 方法的签名非常简洁: + +```python +def ShowCheckOutput(self): +``` + +- **返回值**: 无明确文档说明返回值类型,从调用方代码推断为布尔值或无返回 +- **参数**: 无需任何参数 +- **异常**: 调用失败时可能抛出异常,建议在 try-except 结构中调用 + +### 最简示例 + +以下是使用 ShowCheckOutput 的最简示例,展示了典型的检查-记录-显示流程: + +```python +from sunvpy.PySSCheck import CheckFunForPY + +# 创建检查记录管理实例 +check_fun = CheckFunForPY() + +# ... 执行检查逻辑,调用 AddCheckRecord 添加问题记录 ... +check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=1, + description="建筑物A与建筑物B存在重叠", + x=123456.78, y=345678.90, z=0.0, + objtype=3, + geoids="1001,1002", + noteids="" +) + +# 显示检查结果 +check_fun.ShowCheckOutput() +``` + +执行上述代码后,系统会弹出一个检查结果窗口,显示所有已添加的检查记录。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L120) + +## 检查结果窗口界面 + +### 窗口结构 + +检查结果窗口通常包含以下主要区域: + +| 区域 | 功能 | 说明 | +|------|------|------| +| **记录列表区** | 显示所有检查记录的摘要信息 | 包括组名、检查项、描述、位置等 | +| **详情面板** | 显示当前选中记录的完整信息 | 展示所有字段的详细值 | +| **工具栏** | 提供常用操作按钮 | 定位、刷新、导出等功能 | +| **统计信息** | 显示问题统计概览 | 按组分类统计问题数量 | + +### 记录显示内容 + +每条检查记录在窗口中显示以下核心信息: + +- **检查组**: 用于逻辑分组,如"拓扑检查"、"属性检查" +- **检查项**: 标识具体检查类型,如"重叠检查"、"名称缺失" +- **问题描述**: 简要描述发现的问题 +- **位置坐标**: 问题发生的 X、Y、Z 坐标 +- **关联对象**: 涉及的地物 ID 和注记 ID 列表 + +### 交互功能 + +检查结果窗口支持多种交互操作,提升问题处理的效率: + +```mermaid +flowchart LR + A[检查结果窗口] --> B[点击记录] + B --> C[显示详情] + C --> D{需要定位?} + D -->|是| E[地图自动缩放至问题位置] + D -->|否| F[继续浏览其他记录] + E --> F + + F --> G{需要修复?} + G -->|是| H[切换到地图编辑视图] + H --> I[修改问题对象] + I --> J[返回检查窗口] + J --> F + + G -->|否| F + + F --> K{所有问题处理完毕?} + K -->|否| F + K -->|是| L[关闭窗口] + + style B fill:#e1f5ff + style E fill:#fff4e1 + style I fill:#d4edda +``` + +Sources: [PySSCheck.py](PySSCheck.py#L120-L120) + +## 完整工作流程示例 + +以下是一个完整的检查流程示例,从准备检查到显示结果的全部步骤: + +```python +from sunvpy import SSProcess +from sunvpy.PySSCheck import CheckFunForPY + +def run_topology_check(): + """执行拓扑检查并显示结果""" + + # 步骤1: 初始化检查记录管理器 + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() # 清空之前的记录 + + print("开始拓扑检查...") + + # 步骤2: 设置选择条件 + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "3") # 面对象 + SSProcess.selectFilter() + + # 步骤3: 遍历选择集并检查 + count = SSProcess.getSelGeoCount() + issue_count = 0 + + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + + # 获取对象位置(使用第一个点坐标) + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + z = 0.0 + + # 模拟检查逻辑:每10个对象记录一个重叠问题 + if i % 10 == 0: + check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=1, + description=f"面对象 {geo_id} 存在空间重叠", + x=x, y=y, z=z, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + issue_count += 1 + + # 步骤4: 输出统计信息 + total_count = check_fun.GetCheckRecordCount() + print(f"检查完成,共发现 {total_count} 个拓扑问题") + + # 步骤5: 显示检查结果 + if total_count > 0: + print("正在打开检查结果窗口...") + check_fun.ShowCheckOutput() + else: + print("未发现问题,无需显示结果") + + return total_count + +# 执行检查 +if __name__ == "__main__": + result_count = run_topology_check() +``` + +该示例展示了**分阶段检查**的工作流程:初始化、查询、遍历、记录、统计、显示。通过在每个阶段输出日志,便于追踪检查进度和结果。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L125) + +## 多类型检查结果展示 + +在实际项目中,常常需要同时执行多种类型的检查,并在一个窗口中统一展示。ShowCheckOutput 方法支持混合显示不同组和检查项的记录。 + +### 混合检查示例 + +```python +from sunvpy.PySSCheck import CheckFunForPY +from sunvpy import SSProcess + +def run_comprehensive_check(): + """执行综合检查:拓扑+属性""" + + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + # ===== 检查1: 拓扑重叠 ===== + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "3") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + + if i % 10 == 0: # 模拟重叠检测 + check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=1, + description=f"对象 {geo_id} 重叠", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + # ===== 检查2: 属性完整性 ===== + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Name", "==", "") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + for i in range(min(20, count)): # 限制数量 + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + + check_fun.AddCheckRecord( + group="属性检查", + check="名称缺失", + checkmodel=2, + description=f"对象 {geo_id} 缺少名称属性", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + # 统计各类问题数量 + total_count = check_fun.GetCheckRecordCount() + print(f"\n检查完成,总计 {total_count} 个问题:") + + # 按组统计 + groups = {} + for i in range(total_count): + fields = "group" + values = "" + check_fun.GetCheckRecordValue(i, fields, values) + + if values: + group_name = values.strip() + groups[group_name] = groups.get(group_name, 0) + 1 + + for group, count in groups.items(): + print(f" {group}: {count} 个") + + # 显示结果 + if total_count > 0: + check_fun.ShowCheckOutput() + + return total_count + +# 执行综合检查 +run_comprehensive_check() +``` + +在检查结果窗口中,不同组的记录通常会以分组形式展示,方便用户按问题类型进行分类浏览和定位。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L125) + +## 显示前的准备工作 + +在调用 ShowCheckOutput 之前,建议进行以下准备工作,确保显示结果的完整性和准确性。 + +### 记录数量检查 + +在显示前检查记录数量,避免显示空窗口: + +```python +# 获取记录数量 +count = check_fun.GetCheckRecordCount() + +if count == 0: + print("未发现问题,无需显示检查结果") +else: + print(f"发现 {count} 个问题,正在打开检查结果窗口...") + check_fun.ShowCheckOutput() +``` + +### 记录有效性验证 + +确保所有记录的字段数据完整,避免显示异常: + +```python +def validate_records(check_fun): + """验证检查记录的完整性""" + count = check_fun.GetCheckRecordCount() + valid_count = 0 + invalid_count = 0 + + for i in range(count): + fields = "group,check,description,x,y,geoids" + values = "" + + check_fun.GetCheckRecordValue(i, fields, values) + + # 简单验证:values 不应为空 + if values and "," in values: + valid_count += 1 + else: + invalid_count += 1 + print(f"警告:记录 {i} 数据不完整: {values}") + + print(f"验证完成:有效记录 {valid_count} 条,无效记录 {invalid_count} 条") + return invalid_count == 0 + +# 使用验证 +if validate_records(check_fun): + check_fun.ShowCheckOutput() +else: + print("存在无效记录,建议检查数据后再显示") +``` + +### 保存后显示 + +通常建议先保存检查记录,再显示结果,确保数据不会因系统异常而丢失: + +```python +# 完整流程:保存 → 统计 → 显示 +print("正在保存检查记录...") +check_fun.SaveCheckRecord() + +count = check_fun.GetCheckRecordCount() +print(f"已保存 {count} 条检查记录") + +if count > 0: + check_fun.ShowCheckOutput() +``` + +Sources: [PySSCheck.py](PySSCheck.py#L108-L125) + +## 高级应用场景 + +### 批量检查后的结果展示 + +在自动化批量检查场景中,可能需要积累多次检查的结果后统一显示: + +```python +from sunvpy.PySSCheck import CheckFunForPY + +def batch_check_and_show(layers): + """批量检查多个图层并统一显示结果""" + + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + total_issues = 0 + + for layer_name in layers: + print(f"\n检查图层: {layer_name}") + + # 执行针对该图层的检查逻辑 + # ... 检查代码 ... + + # 模拟:添加一些检查记录 + check_fun.AddCheckRecord( + group="拓扑检查", + check="图层检查", + checkmodel=1, + description=f"图层 {layer_name} 中的问题", + x=0.0, y=0.0, z=0.0, + objtype=3, + geoids="1001", + noteids="" + ) + total_issues += 1 + + print(f"\n批量检查完成,共发现 {total_issues} 个问题") + + # 统一显示所有结果 + check_fun.ShowCheckOutput() + +# 批量检查多个图层 +layers_to_check = ["建筑", "道路", "水系"] +batch_check_and_show(layers_to_check) +``` + +### 历史对比显示 + +在质量追踪场景中,可以加载历史记录并与当前结果对比: + +```python +from sunvpy.PySSCheck import CheckFunForPY + +def compare_and_show_results(): + """对比历史记录并显示当前结果""" + + check_fun = CheckFunForPY() + + # 1. 加载历史记录 + check_fun.LoadCheckRecord() + old_count = check_fun.GetCheckRecordCount() + print(f"历史记录: {old_count} 个问题") + + # 2. 执行新的检查 + check_fun.ClearCheckRecord() + # ... 新的检查逻辑 ... + + # 模拟:添加新记录 + check_fun.AddCheckRecord( + group="拓扑检查", + check="重叠检查", + checkmodel=1, + description="新的重叠问题", + x=0.0, y=0.0, z=0.0, + objtype=3, + geoids="1001", + noteids="" + ) + + new_count = check_fun.GetCheckRecordCount() + print(f"当前检查: {new_count} 个问题") + print(f"质量改进: {old_count - new_count} 个问题已修复") + + # 3. 显示当前结果 + check_fun.ShowCheckOutput() + +compare_and_show_results() +``` + +Sources: [PySSCheck.py](PySSCheck.py#L108-L120) + +## 常见问题与解决方案 + +### 窗口无法显示 + +如果调用 ShowCheckOutput 后没有弹出窗口,可能的原因和解决方法: + +| 原因 | 解决方法 | +|------|----------| +| 检查记录为空 | 检查 `GetCheckRecordCount()` 返回值,确保有记录 | +| 系统界面未初始化 | 确保在 SunvStation 主界面中调用,而非后台脚本 | +| 窗口已打开 | 检查是否已有检查结果窗口处于打开状态 | + +```python +# 安全显示方案 +def safe_show_output(check_fun): + try: + count = check_fun.GetCheckRecordCount() + if count > 0: + print(f"显示 {count} 条检查记录...") + check_fun.ShowCheckOutput() + else: + print("无检查记录可显示") + except Exception as e: + print(f"显示检查结果失败: {e}") + +safe_show_output(check_fun) +``` + +### 大量记录显示缓慢 + +当检查记录数量超过 1000 条时,显示窗口可能加载较慢。建议: + +1. **分批显示**:只显示前 100 条,其他通过导出文件查看 +2. **优化描述**:简化 description 字段的内容 +3. **使用保存替代**:对于大量记录,使用 `SaveCheckRecord()` 保存到文件,而非显示窗口 + +```python +# 大量记录的处理策略 +def handle_large_results(check_fun, max_display=100): + count = check_fun.GetCheckRecordCount() + + if count > max_display: + print(f"记录数量过多 ({count} 条),将保存到文件") + check_fun.SaveCheckRecord() + + # 只显示前 max_display 条的摘要 + print(f"\n前 {max_display} 条记录摘要:") + for i in range(min(max_display, count)): + fields = "group,check,description" + values = "" + check_fun.GetCheckRecordValue(i, fields, values) + print(f" {values}") + else: + check_fun.ShowCheckOutput() + +handle_large_results(check_fun, max_display=100) +``` + +### 空间定位不准确 + +如果点击记录后地图未正确缩放到问题位置,检查以下几点: + +1. **坐标值是否正确**:确保 AddCheckRecord 时传入的 x、y、z 坐标有效 +2. **坐标系统一致性**:检查对象坐标与地图坐标系统是否一致 +3. **对象是否可见**:确认问题对象的图层处于可见状态 + +```python +# 确保坐标信息准确 +def get_valid_coordinates(process, geo_index): + """获取有效的坐标信息""" + try: + x = float(process.getSelGeoValue(geo_index, "SSObj_X")) + y = float(process.getSelGeoValue(geo_index, "SSObj_Y")) + z = float(process.getSelGeoValue(geo_index, "SSObj_Z")) + + # 验证坐标有效性 + if abs(x) > 1e10 or abs(y) > 1e10: + print(f"警告:坐标值异常 ({x}, {y}),使用默认值") + return 0.0, 0.0, 0.0 + + return x, y, z + except Exception as e: + print(f"获取坐标失败: {e}") + return 0.0, 0.0, 0.0 + +# 使用示例 +x, y, z = get_valid_coordinates(SSProcess, i) +check_fun.AddCheckRecord(..., x=x, y=y, z=z, ...) +``` + +Sources: [PySSCheck.py](PySSCheck.py#L113-L125) + +## 最佳实践总结 + +### 显示时机建议 + +```mermaid +flowchart LR + A[检查流程开始] --> B[执行检查逻辑] + B --> C[调用 AddCheckRecord 记录问题] + C --> D{检查完成?} + D -->|否| B + D -->|是| E[调用 GetCheckRecordCount 统计] + E --> F{数量 > 0?} + F -->|否| G[输出无问题提示] + F -->|是| H[调用 SaveCheckRecord 保存] + H --> I[调用 ShowCheckOutput 显示] + I --> J[用户交互处理问题] + + style E fill:#e1f5ff + style H fill:#fff4e1 + style I fill:#d4edda +``` + +推荐的标准流程:**检查 → 统计 → 保存 → 显示** + +1. 检查完成后统计记录数量 +2. 如有记录,先保存确保数据安全 +3. 最后显示结果窗口供用户交互 + +### 代码模板 + +以下是一个推荐的代码模板,适用于大多数检查场景: + +```python +from sunvpy import SSProcess +from sunvpy.PySSCheck import CheckFunForPY + +def standard_check_workflow(check_name, check_logic_func): + """标准的检查工作流程模板""" + + # 1. 初始化 + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + print(f"开始执行: {check_name}") + + # 2. 执行检查逻辑 + try: + check_logic_func(check_fun) + except Exception as e: + print(f"检查执行失败: {e}") + return -1 + + # 3. 统计结果 + count = check_fun.GetCheckRecordCount() + print(f"{check_name} 完成,发现 {count} 个问题") + + # 4. 处理结果 + if count > 0: + # 保存记录 + print("正在保存检查记录...") + try: + check_fun.SaveCheckRecord() + print("保存成功") + except Exception as e: + print(f"保存失败: {e}") + + # 显示结果 + print("正在打开检查结果窗口...") + try: + check_fun.ShowCheckOutput() + except Exception as e: + print(f"显示失败: {e}") + else: + print("未发现问题,数据质量良好") + + return count + +# 使用示例 +def my_check_logic(check_fun): + """自定义检查逻辑""" + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "3") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + + # ... 实际检查逻辑 ... + + # 示例:记录问题 + check_fun.AddCheckRecord( + group="示例检查", + check="示例项", + checkmodel=1, + description=f"示例问题 {geo_id}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + +# 执行检查 +standard_check_workflow("示例拓扑检查", my_check_logic) +``` + +该模板封装了完整的检查流程,包括错误处理和日志输出,可作为各种检查脚本的基础框架。 + +Sources: [PySSCheck.py](PySSCheck.py#L108-L125) + +## 学习路径建议 + +掌握显示检查结果功能后,建议按照以下路径继续深入学习: + +1. **[添加与加载检查记录](31-tian-jia-yu-jia-zai-jian-cha-ji-lu)** - 深入了解检查记录的添加、加载和持久化机制,掌握记录的生命周期管理 +2. **[自定义检查规则](33-zi-ding-yi-jian-cha-gui-ze)** - 学习如何构建复杂的数据检查逻辑,自定义检查规则以适应特定的业务需求 +3. **[清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji)** - 了解如何高效地设置和操作选择集,为数据检查提供准确的数据范围 + +通过系统学习这些内容,您将能够构建完整的数据质量控制和问题追踪系统,实现从检查发现、问题定位到修复验证的闭环管理。 \ No newline at end of file diff --git a/docs/content/33-zi-ding-yi-jian-cha-gui-ze.md b/docs/content/33-zi-ding-yi-jian-cha-gui-ze.md new file mode 100644 index 0000000..580183b --- /dev/null +++ b/docs/content/33-zi-ding-yi-jian-cha-gui-ze.md @@ -0,0 +1,1081 @@ +自定义检查规则是 SunvStation 数据质量保证系统中最为灵活和强大的功能,允许开发者根据特定的业务需求和技术规范编写专属的数据验证逻辑。通过组合 CheckFunForPY 的检查记录管理能力、SSProcessManager 的选择集操作能力以及 Python 的丰富生态系统,您可以构建从简单的属性完整性检查到复杂的空间拓扑验证等各类检查规则。 + +自定义检查规则的核心价值在于**将通用的检查框架与特定的业务逻辑分离**。系统提供了检查记录管理、结果显示、持久化存储等通用能力,而您只需要专注于实现具体的检查算法和数据验证逻辑。这种设计既降低了开发门槛,又保持了系统的扩展性。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160) + +## 检查规则架构设计 + +自定义检查规则采用**分层架构模式**,将检查任务分解为数据准备、检查执行、结果记录三个阶段。每个阶段由不同的组件负责,通过明确定义的接口协作,形成清晰的职责划分。 + +```mermaid +graph TB + subgraph "检查规则脚本层" + Script[检查规则脚本
自定义业务逻辑] + end + + subgraph "功能组件层" + CF[CheckFunForPY
检查记录管理] + SS[SSProcessManager
选择集与数据操作] + Logger[日志组件
日志与进度] + end + + subgraph "数据层" + WS[工作空间
WorkSpace] + Map[地图数据
ScaleMap] + DS[数据源
DataSource] + end + + subgraph "持久化层" + File[检查记录文件] + end + + Script -->|实例化| CF + Script -->|调用| SS + Script -->|使用| Logger + + SS -->|访问| WS + SS -->|操作| Map + WS -->|获取| DS + + CF -->|保存/加载| File + + style Script fill:#e1f5ff + style CF fill:#fff4e1 + style SS fill:#ffe1f5 +``` + +该架构体现了**关注点分离**的设计原则。检查脚本专注于业务逻辑的实现,不关心底层的记录管理和数据访问细节。这种分层设计使得检查规则易于测试、维护和复用。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160), [PySSProcess.py](PySSProcess.py#L18-L140) + +### 核心组件角色 + +| 组件 | 职责 | 主要方法/特性 | +|------|------|-------------| +| **检查规则脚本** | 实现具体的检查逻辑,协调各组件协作 | 自定义函数、类、算法实现 | +| **CheckFunForPY** | 管理检查记录的生命周期 | AddCheckRecord、GetCheckRecordCount、ShowCheckOutput | +| **SSProcessManager** | 提供数据查询、遍历、编辑能力 | setSelectCondition、selectFilter、getSelGeoValue | +| **日志组件** | 记录检查过程,提供进度反馈 | logger.info、startProgress、stepProgress | + +这种设计允许开发者**组合基础组件**构建复杂的检查规则,而不需要从零开始实现所有功能。每个组件都经过充分测试,提供了稳定的 API 接口。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160), [PySSProcess.py](PySSProcess.py#L18-L140) + +## 检查规则的基本结构 + +一个规范的自定义检查规则脚本通常包含五个关键部分:**初始化、数据准备、检查执行、结果处理、清理退出**。遵循这种结构可以确保脚本的逻辑清晰、易于维护。 + +```mermaid +flowchart TD + A[脚本开始] --> B[初始化阶段
创建组件实例] + B --> C[数据准备阶段
设置选择条件、加载数据] + C --> D[检查执行阶段
遍历对象、应用检查逻辑] + D --> E{发现问题?} + E -->|是| F[添加检查记录] + E -->|否| G[继续下一个对象] + F --> G + G --> D + + D --> H{检查完成?} + H -->|否| D + H -->|是| I[结果处理阶段
统计、显示、保存] + I --> J[清理退出阶段
释放资源] + J --> K[脚本结束] + + style B fill:#e1f5ff + style D fill:#fff4e1 + style F fill:#ffd4e1 + style I fill:#d4edda +``` + +### 标准模板 + +以下是一个标准的检查规则脚本模板,包含了所有关键部分: + +```python +from sunvpy import SSProcess +from sunvpy.PySSCheck import CheckFunForPY +import logging + +def run_custom_check(): + """自定义检查规则的标准实现模板""" + + # ========== 初始化阶段 ========== + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() # 清空之前的记录 + + # 配置日志 + if SSProcess.logger is None: + SSProcess.config_logger(log_file="check_log.txt", log_level=logging.INFO) + + logger = SSProcess.logger + logger.info("========== 开始执行自定义检查规则 ==========") + + # ========== 数据准备阶段 ========== + logger.info("准备检查数据...") + + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + + # 设置选择条件 + SSProcess.setSelectCondition("SSObj_LayerName", "==", "建筑") + SSProcess.setSelectCondition("SSObj_Type", "==", "3") + + # 执行查询 + logger.info("执行查询...") + SSProcess.selectFilter() + + total_count = SSProcess.getSelGeoCount() + logger.info(f"查询到 {total_count} 个对象") + + if total_count == 0: + logger.warning("没有需要检查的对象,检查终止") + return 0 + + # 配置进度条 + if SSProcess.enable_progress: + SSProcess.start_progress("自定义检查进度", 0, total_count) + + # ========== 检查执行阶段 ========== + issue_count = 0 + + logger.info("开始执行检查逻辑...") + + for i in range(total_count): + # 更新进度 + if SSProcess.enable_progress and i % 100 == 0: + SSProcess.step_progress() + + # 获取对象信息 + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + obj_code = SSProcess.getSelGeoValue(i, "SSObj_Code") + + # 获取空间位置 + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + z = 0.0 + + # ========== 自定义检查逻辑 ========== + # 这里实现具体的检查规则 + + # 示例:检查编码是否为空 + if not obj_code or obj_code.strip() == "": + issue_count += 1 + check_fun.AddCheckRecord( + group="属性检查", + check="编码缺失检查", + checkmodel=1, + description=f"对象 {geo_id} 的编码为空", + x=x, y=y, z=z, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + logger.warning(f"发现问题:对象 {geo_id} 编码缺失") + + # 添加更多检查规则... + + # ========== 结果处理阶段 ========== + # 关闭进度条 + if SSProcess.enable_progress: + SSProcess.close_progress() + + # 统计结果 + total_issues = check_fun.GetCheckRecordCount() + logger.info(f"检查完成,共发现 {total_issues} 个问题") + logger.info("========== 检查规则执行完毕 ==========") + + # 显示检查结果 + if total_issues > 0: + check_fun.ShowCheckOutput() + + # 保存检查记录 + save_success = check_fun.SaveCheckRecord() + if save_success: + logger.info("检查记录已成功保存") + else: + logger.error("检查记录保存失败") + + # ========== 清理退出阶段 ========== + # 这里可以添加必要的清理代码 + + return total_issues + +if __name__ == "__main__": + result = run_custom_check() + print(f"检查完成,发现问题数:{result}") +``` + +该模板遵循了**防御性编程**的最佳实践,包含完善的错误处理、日志记录和进度反馈机制,适合作为开发新检查规则的起点。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160), [PySSProcess.py](PySSProcess.py#L18-L140) + +## 常见检查类型实现 + +基于不同的检查目标和数据特征,可以将自定义检查规则分为四个主要类型:**属性完整性检查、拓扑关系检查、几何规则检查、业务规则检查**。每种类型有其特定的实现模式和注意事项。 + +### 属性完整性检查 + +属性完整性检查关注对象的属性数据是否符合预定义的规则,包括必填项验证、格式验证、取值范围验证等。这是最基础也是最常见的检查类型。 + +```python +def check_attribute_completeness(): + """属性完整性检查示例""" + + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_LayerName", "==", "建筑") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + + # 定义必填属性规则 + required_fields = [ + {"name": "SSObj_Code", "desc": "编码"}, + {"name": "SSObj_Name", "desc": "名称"}, + {"name": "SSObj_DataMark", "desc": "数据标识"}, + {"name": "[JG]", "desc": "结构类型"}, + {"name": "[CS]", "desc": "层数"} + ] + + issues = 0 + + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + + # 检查每个必填字段 + for field in required_fields: + value = SSProcess.getSelGeoValue(i, field["name"]) + + if not value or value.strip() == "": + issues += 1 + check_fun.AddCheckRecord( + group="属性检查", + check="必填项缺失检查", + checkmodel=1, + description=f"对象 {geo_id} 的必填属性 [{field['desc']}] 为空", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + # 检查编码格式(示例:编码应为7位数字) + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + if code and (len(code) != 7 or not code.isdigit()): + issues += 1 + check_fun.AddCheckRecord( + group="属性检查", + check="编码格式检查", + checkmodel=2, + description=f"对象 {geo_id} 的编码格式错误:{code}(应为7位数字)", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + # 检查层数是否为有效数字且在合理范围内 + floors = SSProcess.getSelGeoValue(i, "[CS]") + if floors: + try: + floor_num = int(floors) + if floor_num < 1 or floor_num > 200: + issues += 1 + check_fun.AddCheckRecord( + group="属性检查", + check="层数范围检查", + checkmodel=3, + description=f"对象 {geo_id} 的层数超出合理范围:{floors}(应为1-200)", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + except ValueError: + issues += 1 + check_fun.AddCheckRecord( + group="属性检查", + check="层数格式检查", + checkmodel=4, + description=f"对象 {geo_id} 的层数不是有效数字:{floors}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + total_issues = check_fun.GetCheckRecordCount() + if total_issues > 0: + check_fun.ShowCheckOutput() + + return total_issues +``` + +属性完整性检查的核心是**规则的可配置性**。通过将检查规则定义为数据结构(如字典或列表),可以方便地修改和扩展规则,而不需要修改检查逻辑代码。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114), [PySSProcess.py](PySSProcess.py#L18-L140) + +### 拓扑关系检查 + +拓扑关系检查关注对象之间的空间关系是否符合预期,如重叠检查、包含检查、邻近检查等。这类检查通常需要更复杂的算法和空间索引支持。 + +```python +def check_topology_overlap(): + """拓扑重叠检查示例(简化版)""" + + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + # 查询所有面对象 + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "3") # 面对象 + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + + # 构建简单的空间索引(基于包围盒) + objects = [] + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + + min_x = float(SSProcess.getSelGeoValue(i, "SSObj_minX")) + min_y = float(SSProcess.getSelGeoValue(i, "SSObj_minY")) + max_x = float(SSProcess.getSelGeoValue(i, "SSObj_maxX")) + max_y = float(SSProcess.getSelGeoValue(i, "SSObj_maxY")) + + objects.append({ + "index": i, + "id": geo_id, + "type": obj_type, + "x": x, "y": y, + "bbox": (min_x, min_y, max_x, max_y) + }) + + # 检查重叠(简化版:仅检查包围盒重叠) + overlap_count = 0 + + for i in range(len(objects)): + for j in range(i + 1, len(objects)): + obj1 = objects[i] + obj2 = objects[j] + + # 检查包围盒是否重叠 + bbox1 = obj1["bbox"] + bbox2 = obj2["bbox"] + + if not (bbox1[2] <= bbox2[0] or bbox1[0] >= bbox2[2] or + bbox1[3] <= bbox2[1] or bbox1[1] >= bbox2[3]): + # 包围盒重叠,记录问题(实际应用中需要更精确的几何检查) + overlap_count += 1 + check_fun.AddCheckRecord( + group="拓扑检查", + check="包围盒重叠检查", + checkmodel=1, + description=f"对象 {obj1['id']} 与对象 {obj2['id']} 可能存在空间重叠", + x=(bbox1[0] + bbox2[0]) / 2, + y=(bbox1[1] + bbox2[1]) / 2, + z=0.0, + objtype=obj1["type"], + geoids=f"{obj1['id']},{obj2['id']}", + noteids="" + ) + + total_issues = check_fun.GetCheckRecordCount() + + if total_issues > 0: + print(f"发现 {total_issues} 处可能的几何重叠") + check_fun.ShowCheckOutput() + + return total_issues +``` + +拓扑关系检查的关键挑战是**性能优化**。对于大规模数据集,O(n²) 的两两比较效率极低。实际应用中应该使用空间索引(如 R-Tree、QuadTree)将复杂度降低到 O(n log n)。本示例仅展示了基本思路,生产环境中需要更高效的空间数据结构。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114), [PySSProcess.py](PySSProcess.py#L18-L140) + +### 几何规则检查 + +几何规则检查关注对象的几何特征是否符合特定的标准,如面积范围、长度限制、点数限制、自相交检测等。 + +```python +def check_geometry_rules(): + """几何规则检查示例""" + + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "3") # 面对象 + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + + # 定义几何规则 + geometry_rules = { + "min_area": 1.0, # 最小面积(平方米) + "max_area": 1000000.0, # 最大面积(平方米) + "min_points": 3, # 最小点数 + "max_points": 10000, # 最大点数 + "min_length": 0.5, # 最小周长(米) + "max_length": 100000.0 # 最大周长(米) + } + + issues = 0 + + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + + # 获取几何属性 + area = float(SSProcess.getSelGeoValue(i, "SSObj_Area")) + length = float(SSProcess.getSelGeoValue(i, "SSObj_Length")) + point_count = int(SSProcess.getSelGeoValue(i, "SSObj_PointCount")) + + # 检查面积范围 + if area < geometry_rules["min_area"]: + issues += 1 + check_fun.AddCheckRecord( + group="几何检查", + check="面积过小检查", + checkmodel=1, + description=f"对象 {geo_id} 的面积 {area:.2f} 小于最小值 {geometry_rules['min_area']}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + elif area > geometry_rules["max_area"]: + issues += 1 + check_fun.AddCheckRecord( + group="几何检查", + check="面积过大检查", + checkmodel=2, + description=f"对象 {geo_id} 的面积 {area:.2f} 超过最大值 {geometry_rules['max_area']}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + # 检查周长范围 + if length < geometry_rules["min_length"]: + issues += 1 + check_fun.AddCheckRecord( + group="几何检查", + check="周长过小检查", + checkmodel=3, + description=f"对象 {geo_id} 的周长 {length:.2f} 小于最小值 {geometry_rules['min_length']}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + elif length > geometry_rules["max_length"]: + issues += 1 + check_fun.AddCheckRecord( + group="几何检查", + check="周长过大检查", + checkmodel=4, + description=f"对象 {geo_id} 的周长 {length:.2f} 超过最大值 {geometry_rules['max_length']}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + # 检查点数范围 + if point_count < geometry_rules["min_points"]: + issues += 1 + check_fun.AddCheckRecord( + group="几何检查", + check="点数过少检查", + checkmodel=5, + description=f"对象 {geo_id} 的点数 {point_count} 小于最小值 {geometry_rules['min_points']}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + elif point_count > geometry_rules["max_points"]: + issues += 1 + check_fun.AddCheckRecord( + group="几何检查", + check="点数过多检查", + checkmodel=6, + description=f"对象 {geo_id} 的点数 {point_count} 超过最大值 {geometry_rules['max_points']}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + total_issues = check_fun.GetCheckRecordCount() + + if total_issues > 0: + check_fun.ShowCheckOutput() + + return total_issues +``` + +几何规则检查的优势在于**规则的可量化性**。所有的几何特征都可以用数值表示,这使得规则的制定和验证都非常明确。同时,这些规则通常具有明确的物理意义,便于理解和管理。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114), [PySSProcess.py](PySSProcess.py#L18-L140), [ObjBaseAttr.py](ObjBaseAttr.py#L61-L69) + +### 业务规则检查 + +业务规则检查关注对象是否符合特定的业务逻辑或行业标准,这些规则通常与具体的应用场景紧密相关。 + +```python +def check_business_rules(): + """业务规则检查示例:建筑物业务规则""" + + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_LayerName", "==", "建筑") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + + issues = 0 + + for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + obj_code = SSProcess.getSelGeoValue(i, "SSObj_Code") + obj_name = SSProcess.getSelGeoValue(i, "SSObj_Name") + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + + # 获取扩展属性 + structure_type = SSProcess.getSelGeoValue(i, "[JG]") # 结构类型 + floors = SSProcess.getSelGeoValue(i, "[CS]") # 层数 + area = float(SSProcess.getSelGeoValue(i, "SSObj_Area")) + + # 业务规则1:高层建筑必须配备电梯(层数 >= 7) + if floors: + try: + floor_num = int(floors) + if floor_num >= 7: + # 检查是否有电梯相关的属性或标记 + # 这里假设使用 DataMark 字段的第2位标记是否配备电梯 + data_mark = SSProcess.getSelGeoValue(i, "SSObj_DataMark") + has_elevator = False + if data_mark and len(data_mark) > 1: + has_elevator = (data_mark[1] == "1") + + if not has_elevator: + issues += 1 + check_fun.AddCheckRecord( + group="业务检查", + check="电梯配置检查", + checkmodel=1, + description=f"对象 {geo_id} 为 {floor_num} 层建筑但未配备电梯", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + except ValueError: + pass + + # 业务规则2:特定结构类型的建筑有面积限制 + if structure_type: + area_limits = { + "砖混": 10000.0, + "框架": 50000.0, + "钢结构": 100000.0 + } + + if structure_type in area_limits: + limit = area_limits[structure_type] + if area > limit: + issues += 1 + check_fun.AddCheckRecord( + group="业务检查", + check="结构面积限制检查", + checkmodel=2, + description=f"对象 {geo_id} 的结构类型为 {structure_type},但面积 {area:.2f} 超过限制 {limit}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=str(geo_id), + noteids="" + ) + + # 业务规则3:建筑物名称不能重复 + if obj_name and obj_name.strip() != "": + # 检查后面是否有同名对象 + for j in range(i + 1, count): + other_name = SSProcess.getSelGeoValue(j, "SSObj_Name") + if obj_name == other_name: + other_id = SSProcess.getSelGeoValue(j, "SSObj_ID") + issues += 1 + check_fun.AddCheckRecord( + group="业务检查", + check="名称重复检查", + checkmodel=3, + description=f"对象 {geo_id} 与对象 {other_id} 存在重复名称:{obj_name}", + x=x, y=y, z=0.0, + objtype=obj_type, + geoids=f"{geo_id},{other_id}", + noteids="" + ) + break + + total_issues = check_fun.GetCheckRecordCount() + + if total_issues > 0: + check_fun.ShowCheckOutput() + + return total_issues +``` + +业务规则检查体现了**领域知识的重要性**。这些规则通常来自行业标准、业务需求或专家经验,需要深入理解应用领域才能准确实现。建议将业务规则与通用规则分离,便于维护和更新。 + +Sources: [PySSCheck.py](PySSCheck.py#L113-L114), [PySSProcess.py](PySSProcess.py#L18-L140) + +## 高级检查模式 + +对于复杂的检查需求,可以通过组合多个检查类型、使用空间索引、实现增量检查等高级模式来提升检查规则的功能和性能。 + +### 组合检查模式 + +组合检查模式将多个检查逻辑整合到一个脚本中,通过统一的流程执行,生成综合性的检查报告。 + +```python +class CombinedChecker: + """组合检查器:整合多个检查类型""" + + def __init__(self): + self.check_fun = CheckFunForPY() + self.check_fun.ClearCheckRecord() + self.logger = SSProcess.logger + + def run_all_checks(self): + """执行所有检查""" + self.logger.info("开始执行组合检查...") + + # 检查结果统计 + results = { + "属性检查": 0, + "几何检查": 0, + "拓扑检查": 0, + "业务检查": 0 + } + + # 1. 属性检查 + results["属性检查"] = self.check_attributes() + + # 2. 几何检查 + results["几何检查"] = self.check_geometry() + + # 3. 拓扑检查(简化版) + results["拓扑检查"] = self.check_topology() + + # 4. 业务检查 + results["业务检查"] = self.check_business() + + # 统计总问题数 + total = sum(results.values()) + self.logger.info("========== 检查结果汇总 ==========") + for check_type, count in results.items(): + self.logger.info(f" {check_type}: {count} 个问题") + self.logger.info(f" 总计: {total} 个问题") + + # 显示结果 + if total > 0: + self.check_fun.ShowCheckOutput() + + return results + + def check_attributes(self): + """属性检查""" + self.logger.info("执行属性检查...") + # 实现属性检查逻辑 + # ... + return 0 + + def check_geometry(self): + """几何检查""" + self.logger.info("执行几何检查...") + # 实现几何检查逻辑 + # ... + return 0 + + def check_topology(self): + """拓扑检查""" + self.logger.info("执行拓扑检查...") + # 实现拓扑检查逻辑 + # ... + return 0 + + def check_business(self): + """业务检查""" + self.logger.info("执行业务检查...") + # 实现业务检查逻辑 + # ... + return 0 + + +# 使用示例 +if __name__ == "__main__": + # 配置日志 + SSProcess.config_logger(log_file="combined_check.log", log_level=logging.INFO) + + # 创建并运行组合检查器 + checker = CombinedChecker() + results = checker.run_all_checks() +``` + +组合检查模式的优势在于**统一的管理和报告**。通过将多个检查整合到一个脚本中,可以生成综合性的检查报告,便于全面了解数据质量状况。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160), [PySSProcess.py](PySSProcess.py#L18-L140) + +### 增量检查模式 + +增量检查模式只检查新增或修改的对象,避免重复检查未变化的数据,大幅提升检查效率。 + +```python +class IncrementalChecker: + """增量检查器:只检查新增或修改的对象""" + + def __init__(self, last_check_time=None): + self.check_fun = CheckFunForPY() + self.check_fun.ClearCheckRecord() + self.last_check_time = last_check_time + self.logger = SSProcess.logger + + def run_incremental_check(self): + """执行增量检查""" + if self.last_check_time is None: + self.logger.info("首次检查,执行全量检查...") + return self.run_full_check() + else: + self.logger.info(f"执行增量检查,时间阈值:{self.last_check_time}...") + return self.run_incremental() + + def run_full_check(self): + """全量检查""" + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + self.logger.info(f"全量检查对象数:{count}") + + # 执行检查逻辑 + # ... + + # 更新最后检查时间 + self.last_check_time = SSProcess.get_current_time() + return count + + def run_incremental(self): + """增量检查:只检查修改时间晚于阈值的对象""" + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + + # 使用 ModifyTime 过滤条件 + # 注意:实际语法需要根据系统支持的运算符调整 + SSProcess.setSelectCondition("SSObj_ModifyTime", ">", self.last_check_time) + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + self.logger.info(f"增量检查对象数:{count}") + + if count == 0: + self.logger.info("没有需要检查的新增或修改对象") + return 0 + + # 执行检查逻辑 + # ... + + # 更新最后检查时间 + self.last_check_time = SSProcess.get_current_time() + return count + + +# 使用示例 +if __name__ == "__main__": + # 从配置或文件中加载上次检查时间 + last_check_time = "2025-01-01 00:00:00" + + checker = IncrementalChecker(last_check_time) + count = checker.run_incremental_check() +``` + +增量检查模式的核心是**时间过滤机制**。通过记录最后检查时间,每次只检查在该时间之后修改的对象,可以大幅减少检查工作量,特别适合频繁更新的数据集。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160), [PySSProcess.py](PySSProcess.py#L18-L140) + +## 性能优化最佳实践 + +编写高效的检查规则需要考虑多个方面,包括数据访问优化、算法复杂度控制、批量处理等。以下是经过验证的最佳实践。 + +### 数据访问优化 + +减少重复的属性访问操作是性能优化的关键。通过缓存和批量访问可以显著提升性能。 + +| 优化策略 | 说明 | 性能提升 | +|---------|------|---------| +| **批量获取属性** | 一次获取多个属性值,减少方法调用次数 | 30%-50% | +| **缓存常用属性** | 将频繁访问的属性值缓存在本地变量中 | 20%-40% | +| **减少类型转换** | 避免频繁的字符串-数值转换 | 10%-20% | +| **使用索引** | 对需要过滤的字段建立索引 | 50%-200% | + +```python +# 优化前:多次访问属性 +for i in range(count): + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + x = float(SSProcess.getSelGeoValue(i, "SSObj_X")) + y = float(SSProcess.getSelGeoValue(i, "SSObj_Y")) + obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type")) + # ... 每次都访问一次 + +# 优化后:批量获取并缓存 +for i in range(count): + # 一次性获取多个属性(假设系统支持) + values = SSProcess.getSelGeoValues(i, ["SSObj_ID", "SSObj_X", "SSObj_Y", "SSObj_Type"]) + + geo_id = values["SSObj_ID"] + x = float(values["SSObj_X"]) + y = float(values["SSObj_Y"]) + obj_type = int(values["SSObj_Type"]) +``` + +Sources: [PySSProcess.py](PySSProcess.py#L18-L140) + +### 算法复杂度控制 + +选择合适的算法和数据结构对性能有决定性影响。 + +```mermaid +graph TB + A[检查性能优化决策树] --> B{数据规模} + B -->|< 1000| C[简单遍历
O n] + B -->|1000-10000| D[使用字典索引
O n log n] + B -->|> 10000| E[使用空间索引
O n log n] + + C --> F[适合:
单对象检查、简单规则] + D --> G[适合:
关联检查、重复检查] + E --> H[适合:
拓扑检查、邻近检查] + + style C fill:#d4edda + style D fill:#fff3cd + style E fill:#f8d7da +``` + +### 进度反馈优化 + +合理的进度反馈机制可以提升用户体验,但过度的进度更新会影响性能。 + +```python +# 优化前:每次循环都更新进度 +for i in range(count): + SSProcess.step_progress() # 性能瓶颈 + # 执行检查逻辑 + +# 优化后:按批次更新进度 +UPDATE_INTERVAL = 100 # 每100个对象更新一次进度 + +for i in range(count): + # 执行检查逻辑 + + if i % UPDATE_INTERVAL == 0: + SSProcess.step_progress() +``` + +Sources: [PySSProcess.py](PySSProcess.py#L18-L140) + +## 错误处理与调试 + +完善的错误处理机制是检查规则稳定运行的关键,包括异常捕获、日志记录、断言验证等。 + +```python +def robust_check(): + """具有完善错误处理的检查脚本""" + + try: + # 初始化 + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + # 配置日志 + SSProcess.config_logger( + log_file="check_robust.log", + log_level=logging.DEBUG + ) + logger = SSProcess.logger + + logger.info("========== 开始执行检查 ==========") + + # 数据准备 + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + SSProcess.setSelectCondition("SSObj_Type", "==", "3") + + try: + SSProcess.selectFilter() + except Exception as e: + logger.error(f"查询失败:{str(e)}") + return 0 + + count = SSProcess.getSelGeoCount() + logger.info(f"查询到 {count} 个对象") + + if count == 0: + logger.warning("没有需要检查的对象") + return 0 + + # 检查执行 + success_count = 0 + error_count = 0 + + for i in range(count): + try: + # 获取对象信息 + geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + + # 验证必要属性 + assert geo_id, f"对象 {i} 的 ID 为空" + + # 执行检查逻辑 + # ... + + success_count += 1 + + except AssertionError as e: + logger.warning(f"验证失败(索引 {i}):{str(e)}") + error_count += 1 + + except Exception as e: + logger.error(f"处理对象时出错(索引 {i}):{str(e)}", exc_info=True) + error_count += 1 + continue + + # 结果汇总 + total_issues = check_fun.GetCheckRecordCount() + logger.info("========== 检查完成 ==========") + logger.info(f"成功处理:{success_count} 个对象") + logger.info(f"处理错误:{error_count} 个对象") + logger.info(f"发现问题:{total_issues} 个") + + # 显示结果 + if total_issues > 0: + check_fun.ShowCheckOutput() + + return total_issues + + except Exception as e: + # 顶层异常处理 + print(f"检查脚本发生严重错误:{str(e)}") + import traceback + traceback.print_exc() + return 0 +``` + +该示例展示了**分层异常处理**的设计模式。不同层级的异常有不同的处理策略:数据层异常记录日志后跳过,逻辑层异常记录警告后继续,顶层异常记录详细信息后终止。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160), [PySSProcess.py](PySSProcess.py#L18-L140) + +## 检查规则的部署与管理 + +随着检查规则数量的增长,需要建立系统的部署和管理机制,包括版本控制、配置管理、自动化执行等。 + +### 配置化检查规则 + +将检查规则与实现逻辑分离,通过配置文件定义规则,提升灵活性。 + +```python +# 检查规则配置文件 (JSON格式) +CHECK_RULES_CONFIG = { + "属性检查": { + "enabled": True, + "rules": [ + { + "name": "编码缺失检查", + "field": "SSObj_Code", + "condition": "is_empty", + "severity": "error" + }, + { + "name": "名称缺失检查", + "field": "SSObj_Name", + "condition": "is_empty", + "severity": "error" + } + ] + }, + "几何检查": { + "enabled": True, + "rules": [ + { + "name": "面积范围检查", + "field": "SSObj_Area", + "min": 1.0, + "max": 1000000.0, + "severity": "warning" + } + ] + } +} + + +def load_check_rules(config_file): + """从配置文件加载检查规则""" + import json + + with open(config_file, 'r', encoding='utf-8') as f: + config = json.load(f) + + return config + + +def run_configurable_checks(config): + """基于配置执行检查""" + check_fun = CheckFunForPY() + check_fun.ClearCheckRecord() + + for group_name, group_config in config.items(): + if not group_config.get("enabled", True): + continue + + # 执行该组的所有规则 + # ... + + return check_fun.GetCheckRecordCount() +``` + +配置化检查的优势在于**规则的可维护性**。业务人员可以通过修改配置文件调整检查规则,而不需要修改代码。同时,不同环境可以使用不同的配置,方便测试和部署。 + +Sources: [PySSCheck.py](PySSCheck.py#L101-L160) + +## 学习路径建议 + +掌握了自定义检查规则后,您可以继续学习以下高级主题,提升数据质量保证能力: + +- **[系统路径管理](35-xi-tong-lu-jing-guan-li)** - 了解如何管理检查规则脚本和配置文件的存储路径 +- **[错误处理与异常管理](39-cuo-wu-chu-li-yu-yi-chang-guan-li)** - 深入学习异常处理模式和错误恢复策略 +- **[日志与进度](38-jin-du-tiao-shi-yong-zhi-nan)** - 掌握高级日志配置和进度管理技巧 +- **[SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api)** - 查阅完整的 API 文档,发现更多有用的功能 + +自定义检查规则是 SunvStation 数据质量保证体系中最强大的工具之一。通过系统学习和实践,您可以构建符合特定业务需求的高质量检查系统,为数据生产提供可靠的质量保障。 \ No newline at end of file diff --git a/docs/content/34-huo-qu-gong-zuo-kong-jian-xin-xi.md b/docs/content/34-huo-qu-gong-zuo-kong-jian-xin-xi.md new file mode 100644 index 0000000..3820e8d --- /dev/null +++ b/docs/content/34-huo-qu-gong-zuo-kong-jian-xin-xi.md @@ -0,0 +1,566 @@ +获取工作空间信息是 SunvStation 开发中的基础操作,它允许脚本访问当前活动的地图实例、系统路径、图层配置以及各种表管理信息。掌握这些信息获取方法对于构建功能完善的脚本至关重要。 + +## 架构概览 + +工作空间信息获取通过 `ProjectMixin` 提供的便捷方法实现,这些方法封装了底层的 `WorkSpace` 和 `ScaleMap` 对象访问逻辑。以下展示了获取工作空间信息的调用层次结构: + +```mermaid +graph TD + A[Python 脚本] -->|调用| B[SSProcess 实例] + B -->|继承| C[ProjectMixin] + C -->|提供方法| D[getWorkspace] + C -->|提供方法| E[getCurrentMap] + C -->|提供方法| F[getSysPathName] + C -->|提供方法| G[getLayerCount/Name] + C -->|提供方法| H[getFeatureCodeTB] + + D -->|访问| WS[WorkSpace 单例] + E -->|调用| WS + WS -->|返回| SM[ScaleMap 当前地图] + F -->|使用| GO[GlobalOptions 单例] + G -->|访问| SM + H -->|访问| SM + + style B fill:#e1f5ff + style C fill:#fff4e1 + style WS fill:#f0f0f0 + style SM fill:#f0f0f0 +``` + +Sources: [PySSProcess.py](PySSProcess.py#L30-L60), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L1-L267) + +## 获取工作空间实例 + +工作空间是 SunvStation 系统的全局单例对象,通过 `getWorkspace()` 方法可以获取当前工作空间的实例。这个实例提供了访问系统级资源和配置的入口。 + +### 基本用法 + +```python +# 获取工作空间实例 +workspace = SSProcess.getWorkspace() + +# 获取当前活动的地图 +current_map = workspace.getCurrentScaleMap() +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L36-L43) + +### 使用场景 + +获取工作空间实例的主要使用场景包括: + +- **访问多个地图**:当需要操作非当前活动的地图时 +- **系统级配置**:获取全局配置选项和路径信息 +- **资源协调**:在不同地图间协调资源访问 + +## 获取当前地图 + +`getCurrentMap()` 方法返回当前活动的地图实例(`ScaleMap` 类型),这是进行地图操作的主要入口。 + +### 获取方法 + +```python +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 检查地图是否存在 +if current_map is None: + print("当前没有打开的地图") + return + +# 获取地图项目名称 +project_name = current_map.getProjectName() +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L45-L50) + +### 地图信息获取表 + +| 信息类型 | 获取方法 | 说明 | +|---------|---------|------| +| 项目名称 | `getProjectName()` | 返回当前工程文件路径 | +| 图层数量 | `getLayerSize()` | 返回地图中的图层数量 | +| 数据源 | `getCurrentDataSource()` | 返回当前活动的数据源 | + +Sources: [PySSMap.py](PySSMap.py#L355-L430) + +## 获取系统路径 + +系统路径信息对于脚本访问配置文件、模板、脚本目录等非常重要。`getSysPathName(mode)` 方法根据模式参数返回不同类型的系统路径。 + +### 路径模式对照表 + +| 模式 | 路径类型 | 说明 | 典型用途 | +|-----|---------|------|---------| +| 0 | 配置路径 | 存放系统配置文件 | 读取系统配置 | +| 1 | 模板路径 | 存放模板文件 | 加载数据模板 | +| 2 | Comm 路径 | 公共资源路径 | 访问共享资源 | +| 3 | Script 路径 | 脚本文件路径 | 动态加载脚本 | +| 4 | SSTemp 路径 | 临时文件路径 | 存储临时数据 | +| 5 | 工程文件路径 | 当前工程所在目录 | 相对路径计算 | +| 6 | 系统目录 | Windows 系统目录或 Unix /usr | 访问系统文件 | +| 7/8 | 工作台面目录 | 用户工作台面目录 | 输出文件保存 | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L52-L80) + +### 使用示例 + +```python +# 获取各类系统路径 +config_path = SSProcess.getSysPathName(0) # 配置路径 +template_path = SSProcess.getSysPathName(1) # 模板路径 +script_path = SSProcess.getSysPathName(3) # 脚本路径 +temp_path = SSProcess.getSysPathName(4) # 临时路径 +project_dir = SSProcess.getSysPathName(5) # 工程目录 + +print(f"配置路径: {config_path}") +print(f"脚本路径: {script_path}") +print(f"工程目录: {project_dir}") + +# 使用系统路径构造文件路径 +config_file = config_path + "system_config.ini" +``` + +### 路径获取流程 + +```mermaid +flowchart LR + A[调用 getSysPathName] --> B{判断 mode 参数} + B -->|mode 0| C[返回配置路径] + B -->|mode 1| D[返回模板路径] + B -->|mode 2| E[返回 Comm 路径] + B -->|mode 3| F[返回 Script 路径] + B -->|mode 4| G[返回 SSTemp 路径] + B -->|mode 5| H{获取当前地图项目名} + H -->|成功| I[返回工程目录] + H -->|失败| J[返回空字符串] + B -->|mode 6| K{判断操作系统} + K -->|Windows| L[返回 WINDIR 路径] + K -->|Unix| M[返回 /usr 路径] + B -->|mode 7/8| N[返回工作台面目录] + B -->|其他| O[返回空字符串] + + style A fill:#e1f5ff + style H fill:#fff4e1 + style K fill:#fff4e1 +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L52-L80) + +## 获取图层信息 + +图层信息获取包括图层数量查询和图层名称查询,这对于批量处理图层和检查图层状态非常有用。 + +### 图层操作方法 + +| 方法 | 功能描述 | 返回值 | +|-----|---------|--------| +| `getLayerCount()` | 获取当前地图中的图层数量 | int | +| `getLayerName(index)` | 获取指定索引的图层名称 | str | +| `setLayerStatus(layerName, status, type)` | 设置图层状态 | bool | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L180-L198) + +### 使用示例 + +```python +# 获取图层数量 +layer_count = SSProcess.getLayerCount() +print(f"当前地图共有 {layer_count} 个图层") + +# 遍历所有图层并输出名称 +for i in range(layer_count): + layer_name = SSProcess.getLayerName(i) + print(f" 图层 {i}: {layer_name}") + +# 设置图层状态 +# type=1: 控制可见性, type=2: 控制编辑锁定 +SSProcess.setLayerStatus("DLG", True, 1) # 显示 DLG 图层 +SSProcess.setLayerStatus("DLG", False, 2) # 解锁 DLG 图层 +``` + +### 图层信息获取流程 + +```mermaid +sequenceDiagram + participant Script as Python 脚本 + participant P as ProjectMixin + participant M as ScaleMap + participant L as Layer + + Script->>P: getLayerCount() + P->>M: getLayerSize() + M->>Script: 返回图层数量 + + Script->>P: getLayerName(index) + P->>M: getLayerName(index) + M->>L: 查询图层名称 + L->>M: 返回名称 + M->>Script: 返回图层名称 + + Script->>P: setLayerStatus(name, status, type) + alt type=1 + P->>M: setLayerVisible(name, status) + else type=2 + P->>M: setLayerLock(name, status) + end + M->>Script: 返回操作结果 +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L180-L198) + +## 获取符号表信息 + +符号表包括要素代码表、符号脚本表和注记模板表,这些表定义了地物的显示样式和属性结构。 + +### 符号表查询方法 + +| 方法 | 功能描述 | 返回值 | +|-----|---------|--------| +| `getFeatureCodeTB()` | 获取当前要素代码表名称 | str | +| `getSymbolScriptTB()` | 获取当前符号脚本表名称 | str | +| `getNoteTemplateTB()` | 获取当前注记模板表名称 | str | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L200-L213) + +### 使用示例 + +```python +# 获取当前符号表信息 +feature_code_tb = SSProcess.getFeatureCodeTB() +symbol_script_tb = SSProcess.getSymbolScriptTB() +note_template_tb = SSProcess.getNoteTemplateTB() + +print(f"要素代码表: {feature_code_tb}") +print(f"符号脚本表: {symbol_script_tb}") +print(f"注记模板表: {note_template_tb}") + +# 检查符号表是否加载 +if not feature_code_tb: + print("警告: 当前未加载要素代码表") +``` + +### 符号表切换 + +当需要切换到不同的符号表时,可以使用设置方法: + +```python +# 设置新的要素代码表和符号表 +success = SSProcess.setFeatureCodeTB("EPS2008", "EPS2008_Symbol") +if success: + print("符号表切换成功") +else: + print("符号表切换失败") + +# 设置注记模板表 +success = SSProcess.setNoteTemplateTB("Note_Template_Default") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L215-L267) + +## 获取地图图幅信息 + +地图图幅是地图的逻辑划分单位,用于组织地图的分幅显示。`ProjectMixin` 提供了完整的图幅管理接口。 + +### 图幅操作方法 + +| 方法 | 功能描述 | 返回值 | +|-----|---------|--------| +| `createMapFrame()` | 创建当前地图的图幅列表 | bool | +| `getMapFrameCount()` | 获取图幅数量 | int | +| `getMapFrameCenterPoint(index)` | 获取指定图幅的中心点坐标 | tuple (x, y) | +| `setCurMapFrame(x, y)` | 设置当前图幅 | GeoBase | +| `getCurMapFrame()` | 获取当前图幅的编号 | int | +| `getMapFrameNumber(x, y)` | 获取指定坐标所在的图幅号 | int | +| `freeMapFrame()` | 释放图幅资源 | void | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L122-L178) + +### 使用示例 + +```python +# 创建图幅列表 +if SSProcess.createMapFrame(): + # 获取图幅数量 + frame_count = SSProcess.getMapFrameCount() + print(f"地图共有 {frame_count} 个图幅") + + # 遍历所有图幅并输出中心点 + for i in range(frame_count): + x, y = SSProcess.getMapFrameCenterPoint(i) + print(f" 图幅 {i} 中心点: ({x}, {y})") + + # 设置当前图幅 + frame_x, frame_y = SSProcess.getMapFrameCenterPoint(0) + SSProcess.setCurMapFrame(frame_x, frame_y) + + # 获取当前图幅编号 + current_frame = SSProcess.getCurMapFrame() + print(f"当前图幅编号: {current_frame}") + + # 查询指定坐标所在的图幅 + test_x, test_y = 1000, 2000 + frame_num = SSProcess.getMapFrameNumber(test_x, test_y) + print(f"坐标 ({test_x}, {test_y}) 位于图幅 {frame_num}") + + # 释放图幅资源 + SSProcess.freeMapFrame() +else: + print("创建图幅列表失败") +``` + +### 图幅处理流程 + +```mermaid +flowchart TD + A[开始] --> B[createMapFrame] + B --> C{创建成功?} + C -->|否| D[报错退出] + C -->|是| E[getMapFrameCount] + E --> F{有图幅?} + F -->|否| G[freeMapFrame] + F -->|是| H[遍历图幅] + H --> I[getMapFrameCenterPoint] + I --> J{还有图幅?} + J -->|是| H + J -->|否| K[setCurMapFrame] + K --> L[getMapFrameNumber] + L --> M[freeMapFrame] + M --> N[结束] + G --> N + + style B fill:#e1f5ff + style E fill:#fff4e1 + style I fill:#fff4e1 +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L122-L178) + +## 综合应用示例 + +以下是一个综合示例,展示如何在实际脚本中组合使用各种工作空间信息获取方法: + +```python +from sunvpy import SSProcess + +def analyze_workspace_info(): + """分析并输出当前工作空间的综合信息""" + + # 获取工作空间和地图 + workspace = SSProcess.getWorkspace() + current_map = SSProcess.getCurrentMap() + + if current_map is None: + print("错误: 当前没有打开的地图") + return + + print("=" * 60) + print("工作空间信息分析") + print("=" * 60) + + # 输出项目信息 + print("\n【项目信息】") + project_name = current_map.getProjectName() + print(f"项目名称: {project_name}") + + # 输出系统路径 + print("\n【系统路径】") + print(f"配置路径: {SSProcess.getSysPathName(0)}") + print(f"模板路径: {SSProcess.getSysPathName(1)}") + print(f"脚本路径: {SSProcess.getSysPathName(3)}") + print(f"工程目录: {SSProcess.getSysPathName(5)}") + + # 输出图层信息 + print("\n【图层信息】") + layer_count = SSProcess.getLayerCount() + print(f"图层数量: {layer_count}") + for i in range(min(5, layer_count)): # 最多显示前5个图层 + layer_name = SSProcess.getLayerName(i) + print(f" - {layer_name}") + if layer_count > 5: + print(f" ... (还有 {layer_count - 5} 个图层)") + + # 输出符号表信息 + print("\n【符号表信息】") + print(f"要素代码表: {SSProcess.getFeatureCodeTB()}") + print(f"符号脚本表: {SSProcess.getSymbolScriptTB()}") + print(f"注记模板表: {SSProcess.getNoteTemplateTB()}") + + # 输出图幅信息 + print("\n【图幅信息】") + if SSProcess.createMapFrame(): + frame_count = SSProcess.getMapFrameCount() + print(f"图幅数量: {frame_count}") + if frame_count > 0: + x, y = SSProcess.getMapFrameCenterPoint(0) + print(f"首个图幅中心点: ({x:.2f}, {y:.2f})") + SSProcess.freeMapFrame() + else: + print("未创建图幅列表") + + print("\n" + "=" * 60) + print("分析完成") + print("=" * 60) + +# 执行分析 +analyze_workspace_info() +``` + +## 最佳实践 + +在使用工作空间信息获取功能时,遵循以下最佳实践可以提高脚本的健壮性和可维护性: + +### 1. 始终检查空引用 + +在访问地图或其方法前,检查地图实例是否存在: + +```python +current_map = SSProcess.getCurrentMap() +if current_map is None: + print("当前没有打开的地图,无法执行操作") + return +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L45-L50) + +### 2. 合理使用系统路径 + +优先使用系统路径而不是硬编码路径,这样可以确保脚本在不同环境下的兼容性: + +```python +# 好的做法 +script_path = SSProcess.getSysPathName(3) +script_file = script_path + "my_script.py" + +# 不好的做法(硬编码) +script_file = "C:\\SunvStation\\scripts\\my_script.py" +``` + +### 3. 及时释放资源 + +对于图幅等需要显式释放的资源,使用 try-finally 确保资源被正确释放: + +```python +try: + SSProcess.createMapFrame() + # 处理图幅... +finally: + SSProcess.freeMapFrame() +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L122-L178) + +### 4. 批量操作前检查图层状态 + +在进行批量操作前,检查目标图层是否存在且可编辑: + +```python +layer_name = "DLG" +layer_count = SSProcess.getLayerCount() +layer_exists = any(SSProcess.getLayerName(i) == layer_name + for i in range(layer_count)) + +if not layer_exists: + print(f"错误: 图层 {layer_name} 不存在") + return + +# 进一步检查图层状态... +``` + +### 5. 使用日志记录关键信息 + +在获取关键工作空间信息时,使用日志记录以便调试和追踪: + +```python +# 配置日志记录器 +SSProcess.configure_logger("workspace_script.log", level="INFO") + +logger = SSProcess.logger +logger.info(f"当前项目: {current_map.getProjectName()}") +logger.info(f"图层数量: {SSProcess.getLayerCount()}") +``` + +Sources: [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py#L1-L50) + +## 错误处理与调试 + +在获取工作空间信息时可能会遇到各种错误情况,以下是一些常见的错误处理模式: + +### 常见错误类型 + +| 错误类型 | 可能原因 | 处理方法 | +|---------|---------|---------| +| 返回 None | 当前没有打开地图 | 检查 getCurrentMap() 返回值 | +| 返回空字符串 | 路径不存在或项目未保存 | 检查返回值是否为空 | +| 索引越界 | 图层索引超出范围 | 使用 getLayerCount() 验证 | +| 图幅创建失败 | 地图中无地物对象 | 检查 createMapFrame() 返回值 | + +### 错误处理示例 + +```python +def safe_get_layer_info(index): + """安全地获取图层信息""" + try: + # 检查地图是否存在 + if SSProcess.getCurrentMap() is None: + raise RuntimeError("当前没有打开的地图") + + # 检查索引是否有效 + layer_count = SSProcess.getLayerCount() + if index < 0 or index >= layer_count: + raise IndexError(f"图层索引 {index} 超出范围 [0, {layer_count-1}]") + + # 获取图层名称 + layer_name = SSProcess.getLayerName(index) + if not layer_name: + raise ValueError(f"图层 {index} 的名称为空") + + return layer_name + + except Exception as e: + print(f"获取图层信息失败: {e}") + return None + +# 使用示例 +layer_name = safe_get_layer_info(0) +if layer_name: + print(f"成功获取图层: {layer_name}") +``` + +## API 快速参考 + +以下是工作空间信息获取相关方法的快速参考表: + +| 方法 | 参数 | 返回值 | 说明 | +|-----|------|--------|------| +| `getWorkspace()` | 无 | WorkSpace | 获取工作空间实例 | +| `getCurrentMap()` | 无 | ScaleMap | 获取当前地图实例 | +| `getSysPathName(mode)` | mode: int | str | 获取系统路径 | +| `getLayerCount()` | 无 | int | 获取图层数量 | +| `getLayerName(index)` | index: int | str | 获取图层名称 | +| `setLayerStatus(name, status, type)` | name: str, status: bool, type: int | bool | 设置图层状态 | +| `getFeatureCodeTB()` | 无 | str | 获取要素代码表名称 | +| `getSymbolScriptTB()` | 无 | str | 获取符号表名称 | +| `getNoteTemplateTB()` | 无 | str | 获取注记模板表名称 | +| `setFeatureCodeTB(codeTB, symbolTB)` | codeTB: str, symbolTB: str | bool | 设置要素代码表 | +| `setNoteTemplateTB(templateTB)` | templateTB: str | bool | 设置注记模板表 | +| `createMapFrame()` | 无 | bool | 创建图幅列表 | +| `getMapFrameCount()` | 无 | int | 获取图幅数量 | +| `getMapFrameCenterPoint(index)` | index: int | tuple | 获取图幅中心点 | +| `setCurMapFrame(x, y)` | x: float, y: float | GeoBase | 设置当前图幅 | +| `getCurMapFrame()` | 无 | int | 获取当前图幅编号 | +| `getMapFrameNumber(x, y)` | x: float, y: float | int | 获取坐标所在图幅号 | +| `freeMapFrame()` | 无 | void | 释放图幅资源 | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L36-L267) + +## 下一步学习 + +掌握了获取工作空间信息的方法后,您可以继续学习以下相关主题: + +- **系统路径管理**:[系统路径管理](35-xi-tong-lu-jing-guan-li) 深入了解更高级的路径操作技巧 +- **地图缩放控制**:[地图缩放控制](36-di-tu-suo-fang-kong-zhi) 学习如何控制地图视图的缩放和平移 +- **选择集与查询**:[清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji) 探索如何在地图中查询和选择地物 +- **工作空间与地图概念**:[工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian) 理解工作空间和地图的底层架构 + +通过系统学习这些内容,您将能够构建功能完善的 SunvStation 二次开发脚本,充分发挥系统的强大功能。 \ No newline at end of file diff --git a/docs/content/35-xi-tong-lu-jing-guan-li.md b/docs/content/35-xi-tong-lu-jing-guan-li.md new file mode 100644 index 0000000..50bad9e --- /dev/null +++ b/docs/content/35-xi-tong-lu-jing-guan-li.md @@ -0,0 +1,527 @@ +系统路径管理是 SunvStation 二次开发中的核心功能之一,它允许脚本动态访问系统配置文件、模板、脚本目录、临时文件目录等关键资源路径。通过统一的接口获取路径信息,可以确保脚本在不同安装环境和操作系统上的兼容性和可移植性。 + +## 架构概览 + +系统路径管理通过 `ProjectMixin` 提供的 `getSysPathName(mode)` 方法实现,该方法封装了底层的 `GlobalOptions` 单例对象访问逻辑,根据模式参数返回不同类型的系统路径。以下展示了系统路径管理的调用层次结构: + +```mermaid +graph TD + A[Python 脚本] -->|调用| B[SSProcess 实例] + B -->|继承| C[ProjectMixin] + C -->|提供方法| D[getSysPathName] + D -->|使用| E[GlobalOptions 单例] + + D -->|mode=0| F[getConfigurePath] + D -->|mode=1| G[getTemplatePath] + D -->|mode=2| H[getCommonPath] + D -->|mode=3| I[getSchemeFilePath] + D -->|mode=4| J[getEpsTempPath] + D -->|mode=5| K[getCurrentMap] + D -->|mode=6| L[os.environ] + D -->|mode=7/8| M[getSchemeFilePath] + + K -->|获取| N[getProjectName] + N -->|Path.parent| O[工程目录] + + style B fill:#e1f5ff + style C fill:#fff4e1 + style E fill:#f0f0f0 +``` + +Sources: [PySSProcess.py](PySSProcess.py#L25-L50), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L71-L116) + +## 路径模式详解 + +`getSysPathName(mode)` 方法支持 9 种路径模式(0-8),每种模式对应不同类型的系统路径。理解这些路径模式的用途对于构建健壮的脚本至关重要。 + +### 路径模式对照表 + +| 模式 | 路径类型 | 底层方法 | 说明 | 典型用途 | +|-----|---------|---------|------|---------| +| 0 | 配置路径 | `getConfigurePath()` | 存放系统配置文件(Windows 下为应用程序路径) | 读取 SSGlobal.xml 等配置文件 | +| 1 | 模板路径 | `getTemplatePath()` | 存放地物模板文件 | 加载 .egdb 模板创建新工程 | +| 2 | Comm 路径 | `getCommonPath()` | 公共资源目录 | 访问共享的数据符号库 | +| 3 | Script 路径 | `getSchemeFilePath("scripts")` | 脚本文件目录 | 动态加载或引用其他脚本 | +| 4 | SSTemp 路径 | `getEpsTempPath()` | 临时文件目录 | 存储中间处理结果 | +| 5 | 工程文件路径 | `getCurrentMap().getProjectName()` | 当前工程文件所在目录 | 计算相对路径、保存输出 | +| 6 | 系统目录 | `WINDIR` 或 `/usr` | 操作系统目录 | 访问系统级文件 | +| 7 | 工作台面目录 | `getSchemeFilePath("")` | 用户工作台面根目录 | 访问用户自定义配置 | +| 8 | 工作台面目录 | `getSchemeFilePath("")` | 用户工作台面根目录 | 同模式 7,保留兼容性 | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L71-L116), [PySSWidget.py](PySSWidget.py#L1019-L1049), [PySSWidget.py](PySSWidget.py#L1059-L1065), [PySSWidget.py](PySSWidget.py#L1172-L1180) + +### 路径特点说明 + +**配置路径(mode 0)**:在 Windows 系统中通常为应用程序安装目录,在 Unix 系统中可能为 `/etc` 或 `/opt` 等系统配置目录。此路径用于存放全局配置文件,如 `SSGlobal.xml`。 + +**模板路径(mode 1)**:存放预定义的地物模板文件(.egdb 格式)。当需要创建新的工程文件时,通常基于这些模板进行初始化。 + +**Comm 路径(mode 2)**:公共资源目录,包含符号库、样式表等跨工程共享的资源文件。 + +**Script 路径(mode 3)**:存放 Python 脚本文件的目录。此路径对于脚本间的相互引用(import)和动态加载(exec)非常重要。 + +**SSTemp 路径(mode 4)**:临时文件目录,用于存储处理过程中的临时数据。脚本完成后应清理此目录中的临时文件。 + +**工程文件路径(mode 5)**:返回当前打开的工程文件(.egdb)所在的父目录。如果当前没有工程或工程未保存,则返回空字符串。此路径对于保存输出文件、创建相对路径非常有用。 + +**系统目录(mode 6)**:根据操作系统类型返回不同的目录。Windows 下为 `%WINDIR%` 环境变量指向的目录(通常为 `C:\Windows`),Unix/Linux 下为 `/usr` 目录。 + +**工作台面目录(mode 7/8)**:返回当前激活的工作台面目录。工作台面是 SunvStation 的用户配置组织单位,不同的工作台面可以有独立的配置、脚本和模板。 + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L104-L116) + +## 基本用法 + +### 获取各类系统路径 + +最简单的用法是直接调用 `getSysPathName(mode)` 获取所需路径: + +```python +from sunvpy import SSProcess + +# 获取配置路径 +config_path = SSProcess.getSysPathName(0) +print(f"配置路径: {config_path}") + +# 获取模板路径 +template_path = SSProcess.getSysPathName(1) +print(f"模板路径: {template_path}") + +# 获取公共资源路径 +common_path = SSProcess.getSysPathName(2) +print(f"公共资源路径: {common_path}") + +# 获取脚本路径 +script_path = SSProcess.getSysPathName(3) +print(f"脚本路径: {script_path}") + +# 获取临时文件路径 +temp_path = SSProcess.getSysPathName(4) +print(f"临时文件路径: {temp_path}") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L71-L116) + +### 构造完整文件路径 + +获取路径后,可以使用路径构造功能完整的文件路径: + +```python +# 构造配置文件的完整路径 +config_file = config_path + "system_config.xml" + +# 构造模板文件的完整路径 +template_file = template_path + "standard_template.egdb" + +# 构造脚本文件的完整路径 +script_file = script_path + "utility_functions.py" + +# 使用 pathlib 进行更安全的路径操作(推荐) +from pathlib import Path + +config_file_safe = Path(config_path) / "system_config.xml" +template_file_safe = Path(template_path) / "standard_template.egdb" +script_file_safe = Path(script_path) / "utility_functions.py" +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L85-L98) + +## 高级用法 + +### 获取工程文件路径 + +工程文件路径(mode 5)需要当前地图已打开并保存才能获取。在实际使用中需要检查返回值: + +```python +# 获取工程文件所在目录 +project_dir = SSProcess.getSysPathName(5) + +if not project_dir: + print("警告: 当前没有打开的工程或工程未保存") + print("无法使用相对路径保存输出文件") +else: + print(f"工程目录: {project_dir}") + + # 在工程目录下创建输出文件 + output_dir = project_dir + "output/" + output_file = output_dir + "result.json" + + print(f"输出文件将保存到: {output_file}") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L99-L103) + +### 跨平台系统目录访问 + +系统目录(mode 6)会根据操作系统类型自动选择正确的路径: + +```python +import os + +# 获取系统目录(跨平台兼容) +system_dir = SSProcess.getSysPathName(6) + +if os.name == "nt": + print(f"Windows 系统目录: {system_dir}") + # 示例:访问 Windows 字体目录 + font_dir = system_dir + "\\Fonts\\" +else: + print(f"Unix/Linux 系统目录: {system_dir}") + # 示例:访问系统共享目录 + font_dir = system_dir + "/share/fonts/" +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L104-L111) + +### 工作台面目录操作 + +工作台面目录(mode 7/8)允许访问用户特定的配置和资源: + +```python +# 获取工作台面目录 +workspace_dir = SSProcess.getSysPathName(7) + +print(f"当前工作台面目录: {workspace_dir}") + +# 工作台面目录的典型子目录 +scripts_dir = workspace_dir + "scripts/" +templates_dir = workspace_dir + "templates/" +config_dir = workspace_dir + "config/" + +print(f"工作台面脚本目录: {scripts_dir}") +print(f"工作台面模板目录: {templates_dir}") +print(f"工作台面配置目录: {config_dir}") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L112-L113) + +## 路径获取流程 + +`getSysPathName` 方法的执行逻辑如下: + +```mermaid +flowchart TD + A[调用 getSysPathName] --> B{判断 mode 参数} + + B -->|mode 0| C[调用 global_options.getConfigurePath] + C --> C1[添加斜杠并返回] + + B -->|mode 1| D[调用 global_options.getTemplatePath] + D --> D1[添加斜杠并返回] + + B -->|mode 2| E[调用 global_options.getCommonPath] + E --> E1[添加斜杠并返回] + + B -->|mode 3| F[调用 global_options.getSchemeFilePath] + F --> F1[参数为 scripts] + F1 --> F2[添加斜杠并返回] + + B -->|mode 4| G[调用 global_options.getEpsTempPath] + G --> G1[添加斜杠并返回] + + B -->|mode 5| H[获取当前地图项目名] + H --> H1{项目名有效?} + H1 -->|否| H2[返回空字符串] + H1 -->|是| H3[使用 Path.parent 提取父目录] + H3 --> H4[返回目录路径] + + B -->|mode 6| I{判断操作系统} + I -->|Windows| J[获取 WINDIR 环境变量] + I -->|Unix| K[返回 /usr] + J --> L[转换为 Path 对象] + K --> L + L --> L1[返回路径字符串] + + B -->|mode 7/8| M[调用 global_options.getSchemeFilePath] + M --> M1[参数为空字符串] + M1 --> M2[添加斜杠并返回] + + B -->|其他| N[返回空字符串] + + style A fill:#e1f5ff + style H fill:#fff4e1 + style I fill:#fff4e1 +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L85-L116) + +## 综合应用示例 + +以下是一个综合示例,展示如何在实际脚本中系统性地使用各种路径功能: + +```python +from sunvpy import SSProcess +from pathlib import Path +import json + +def setup_script_environment(): + """设置脚本运行环境并输出路径信息""" + + print("=" * 70) + print("SunvStation 系统路径信息") + print("=" * 70) + + # 获取各类系统路径 + paths = { + "配置路径": SSProcess.getSysPathName(0), + "模板路径": SSProcess.getSysPathName(1), + "公共资源路径": SSProcess.getSysPathName(2), + "脚本路径": SSProcess.getSysPathName(3), + "临时文件路径": SSProcess.getSysPathName(4), + "工程文件路径": SSProcess.getSysPathName(5), + "系统目录": SSProcess.getSysPathName(6), + "工作台面目录": SSProcess.getSysPathName(7) + } + + # 输出路径信息 + for name, path in paths.items(): + if path: + print(f"✓ {name:15s}: {path}") + else: + print(f"✗ {name:15s}: (未设置或不可用)") + + print("=" * 70) + + # 检查关键路径的可用性 + if not paths["工程文件路径"]: + print("\n警告: 当前没有打开的工程") + print("某些功能可能无法正常工作") + + # 返回路径字典供后续使用 + return paths + +def create_output_file(filename): + """在合适的位置创建输出文件""" + + # 优先使用工程目录 + project_dir = SSProcess.getSysPathName(5) + + if project_dir: + output_dir = Path(project_dir) / "output" + else: + # 降级使用临时目录 + temp_dir = SSProcess.getSysPathName(4) + output_dir = Path(temp_dir) + + # 创建输出目录 + output_dir.mkdir(parents=True, exist_ok=True) + + # 构造完整文件路径 + output_file = output_dir / filename + + return str(output_file) + +def load_custom_config(config_name): + """从工作台面目录加载自定义配置""" + + workspace_dir = SSProcess.getSysPathName(7) + + if not workspace_dir: + print("错误: 无法获取工作台面目录") + return None + + config_dir = Path(workspace_dir) / "config" + config_file = config_dir / config_name + + if not config_file.exists(): + print(f"警告: 配置文件不存在: {config_file}") + return None + + try: + with open(config_file, 'r', encoding='utf-8') as f: + config = json.load(f) + print(f"成功加载配置: {config_file}") + return config + except Exception as e: + print(f"加载配置失败: {e}") + return None + +# 主程序 +if __name__ == "__main__": + # 设置环境并获取路径信息 + paths = setup_script_environment() + + # 创建输出文件 + output_file = create_output_file("script_output.json") + print(f"\n输出文件将保存到: {output_file}") + + # 加载自定义配置 + custom_config = load_custom_config("my_config.json") + if custom_config: + print(f"自定义配置: {custom_config}") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L71-L116), [PySSProcess.py](PySSProcess.py#L53-L86) + +## 最佳实践 + +在使用系统路径管理功能时,遵循以下最佳实践可以提高脚本的健壮性和可移植性: + +### 1. 优先使用系统路径而非硬编码 + +```python +# 好的做法:使用系统路径 +template_path = SSProcess.getSysPathName(1) +template_file = template_path + "standard.egdb" + +# 不好的做法:硬编码路径 +template_file = "C:\\Program Files\\SunvStation\\templates\\standard.egdb" +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L71-L116) + +### 2. 始终检查路径有效性 + +```python +project_dir = SSProcess.getSysPathName(5) +if not project_dir: + print("警告: 工程目录不可用,使用临时目录") + output_dir = SSProcess.getSysPathName(4) +else: + output_dir = project_dir +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L99-L103) + +### 3. 使用 pathlib 进行路径操作 + +```python +from pathlib import Path + +# 推荐做法:使用 pathlib +script_path = SSProcess.getSysPathName(3) +script_file = Path(script_path) / "utils.py" + +# 可以方便地检查文件是否存在 +if script_file.exists(): + print(f"脚本文件存在: {script_file}") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L103-L103) + +### 4. 临时文件及时清理 + +```python +import os + +# 在临时目录创建临时文件 +temp_dir = SSProcess.getSysPathName(4) +temp_file = temp_dir + "temp_data.tmp" + +# 使用后及时清理 +try: + # 处理临时文件... + pass +finally: + if os.path.exists(temp_file): + os.remove(temp_file) + print(f"已删除临时文件: {temp_file}") +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L97-L98) + +### 5. 处理路径中的斜杠 + +`getSysPathName` 返回的路径都以斜杠结尾(`/`),这简化了路径拼接操作: + +```python +config_path = SSProcess.getSysPathName(0) +# config_path 已包含结尾斜杠,无需额外添加 +config_file = config_path + "system.xml" # 正确拼接 +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L90-L98) + +## 错误处理与调试 + +在使用系统路径功能时可能会遇到各种错误情况,以下是一些常见的错误处理模式: + +### 常见错误类型 + +| 错误类型 | 可能原因 | 处理方法 | +|---------|---------|---------| +| 返回空字符串 | 路径不可用或未配置 | 检查返回值,提供降级方案 | +| 路径不存在 | 目录被删除或未创建 | 使用 `os.makedirs()` 创建目录 | +| 权限错误 | 无访问权限 | 使用 try-except 捕获异常 | +| 跨平台路径问题 | 使用了平台特定的路径分隔符 | 使用 `os.path.join()` 或 `pathlib.Path` | + +### 错误处理示例 + +```python +import os +from pathlib import Path + +def safe_get_path(mode): + """安全地获取路径并进行验证""" + + # 获取路径 + path = SSProcess.getSysPathName(mode) + + # 检查路径是否有效 + if not path: + raise ValueError(f"模式 {mode} 对应的路径不可用") + + # 转换为 Path 对象 + path_obj = Path(path) + + # 检查路径是否存在(对于需要创建的路径可跳过此检查) + if not path_obj.exists(): + print(f"警告: 路径不存在 - {path}") + print("尝试创建路径...") + try: + path_obj.mkdir(parents=True, exist_ok=True) + print(f"成功创建路径: {path}") + except PermissionError: + raise PermissionError(f"无权限创建路径: {path}") + except Exception as e: + raise RuntimeError(f"创建路径失败: {e}") + + # 检查是否为目录 + if not path_obj.is_dir(): + raise RuntimeError(f"路径不是目录: {path}") + + return str(path_obj) + +# 使用示例 +try: + config_dir = safe_get_path(0) + print(f"配置目录: {config_dir}") +except Exception as e: + print(f"获取配置目录失败: {e}") + print("使用默认配置目录...") + config_dir = "./default_config/" +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L71-L116) + +## API 快速参考 + +以下是系统路径管理相关方法的快速参考表: + +| 方法 | 参数 | 返回值 | 说明 | +|-----|------|--------|------| +| `getSysPathName(mode)` | mode: int (0-8) | str | 获取指定模式的系统路径 | + +**GlobalOptions 底层方法**(供高级用户参考): + +| 方法 | 返回值 | 说明 | +|-----|--------|------| +| `getConfigurePath()` | std::filesystem::path | 获取配置路径 | +| `getTemplatePath()` | std::filesystem::path | 获取模板路径 | +| `getCommonPath()` | std::filesystem::path | 获取公共资源路径 | +| `getEpsTempPath()` | std::filesystem::path | 获取临时文件路径 | +| `getSchemeFilePath(fileName)` | std::filesystem::path | 获取工作台面下的文件路径 | +| `getScriptsPath()` | std::filesystem::path | 获取当前台面下的 scripts 文件夹路径 | + +Sources: [PySSWidget.py](PySSWidget.py#L989-L1390), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L71-L116) + +## 下一步学习 + +掌握了系统路径管理的方法后,您可以继续学习以下相关主题: + +- **获取工作空间信息**:[获取工作空间信息](34-huo-qu-gong-zuo-kong-jian-xin-xi) 了解如何获取工作空间、地图、图层等系统信息 +- **地图缩放控制**:[地图缩放控制](36-di-tu-suo-fang-kong-zhi) 学习如何控制地图视图的缩放和平移 +- **数据交换与导入导出**:[数据交换参数配置](26-shu-ju-jiao-huan-can-shu-pei-zhi) 探索如何配置和管理数据交换流程 +- **工作空间与地图概念**:[工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian) 深入理解工作空间和地图的底层架构 + +通过系统学习这些内容,您将能够构建功能完善、路径规范的 SunvStation 二次开发脚本,充分发挥系统的强大功能。 \ No newline at end of file diff --git a/docs/content/36-di-tu-suo-fang-kong-zhi.md b/docs/content/36-di-tu-suo-fang-kong-zhi.md new file mode 100644 index 0000000..c817272 --- /dev/null +++ b/docs/content/36-di-tu-suo-fang-kong-zhi.md @@ -0,0 +1,710 @@ +地图缩放控制是 SunvStation 二次开发中的核心功能之一,它允许脚本程序动态调整地图视图的显示范围、比例尺和视角。通过精确的缩放控制,可以实现自动定位、视图切换、数据浏览等丰富的交互功能。本页将系统地介绍地图缩放控制的各项功能、使用方法和最佳实践。 + +Sources: [PySSMap.py](PySSMap.py#L303-L3440), [PySSView.py](PySSView.py#L1000-L1362) + +## 架构概览 + +SunvStation 的地图缩放控制采用分层架构设计,底层的 `ScaleMap` 对象负责地图数据的逻辑管理,顶层的 `VkPainter2D` 或 `VkPainter3D` 对象负责视图的渲染和交互。以下展示了地图缩放控制的调用层次结构: + +```mermaid +graph TB + A[Python 脚本] -->|调用| B[SSProcess 实例] + B -->|继承| C[ProjectMixin] + C -->|提供方法| D[getCurrentMap] + D -->|返回| SM[ScaleMap 地图对象] + + SM -->|包含| VL[ViewList 视图列表] + VL -->|包含| VP2[VkPainter2D 2D视图] + VL -->|包含| VP3[VkPainter3D 3D视图] + + SM -->|提供| MS[map_scale: 比例尺控制] + SM -->|提供| MR[getMapRect: 地图矩形] + SM -->|提供| ZM[zoom: 对象缩放] + + VP2 -->|提供| ZW[zoomWindow: 窗口缩放] + VP2 -->|提供| MP[moveScreenByPoint: 平移] + VP2 -->|提供| GS[getImgScale: 获取缩放比例] + VP2 -->|提供| CTS[坐标转换方法组] + VP2 -->|提供| LC[长度转换方法组] + + VP3 -->|提供| ZW2[zoomWindow: 窗口缩放] + VP3 -->|提供| MP2[moveScreenByPoint: 平移] + VP3 -->|提供| GS2[getImgScale: 获取缩放比例] + VP3 -->|提供| CTS2[坐标转换方法组] + VP3 -->|提供| LC2[长度转换方法组] + + style B fill:#e1f5ff + style C fill:#fff4e1 + style SM fill:#f0f0f0 + style VP2 fill:#e8f5e9 + style VP3 fill:#e8f5e9 +``` + +上图展示了地图缩放控制的双层架构。`ScaleMap` 对象管理地图数据和比例尺,通过 `setMapScale()` 和 `getMapScale()` 方法实现比例尺的设置和查询。`VkPainter2D` 和 `VkPainter3D` 对象负责视图渲染,提供了窗口缩放、平移、坐标转换等视图操作方法。 + +Sources: [PySSMap.py](PySSMap.py#L303-L3440), [PySSView.py](PySSView.py#L950-L1362), [PySSProcess.py](PySSProcess.py#L25-L70) + +## 地图比例尺控制 + +地图比例尺是地图缩放控制的核心参数,它决定了地图上地理要素的显示大小。SunvStation 提供了直接设置和查询地图比例尺的方法,适用于需要精确控制显示比例的场景。 + +### 比例尺控制方法 + +| 方法 | 功能描述 | 返回值 | +|-----|---------|--------| +| `map.setMapScale(lScale)` | 设置地图比例尺 | boolean | +| `map.getMapScale()` | 获取当前地图比例尺 | long | + +**参数说明**: + +- `lScale`:比例尺分母,例如 500 表示 1:500 的比例尺 + +Sources: [PySSMap.py](PySSMap.py#L2330-L2335), [PySSMap.py](PySSMap.py#L2430-L2432) + +### 设置比例尺流程 + +```mermaid +flowchart LR + A[开始设置比例尺] --> B[获取当前地图] + B -->|map| C[调用 setMapScale] + C -->|传入 lScale| D{设置是否成功} + D -->|成功| E[比例尺已更新] + D -->|失败| F[检查参数有效性] + F --> G[重新调用 setMapScale] + E --> H[调用 repaint 更新视图] + H --> I[完成] + + style A fill:#e1f5ff + style D fill:#fff4e1 + style H fill:#ffe8e1 +``` + +### 使用示例 + +```python +from sunvpy import SSProcess + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 获取当前比例尺 +current_scale = current_map.getMapScale() +print(f"当前比例尺: 1:{current_scale}") + +# 设置新比例尺为 1:1000 +new_scale = 1000 +success = current_map.setMapScale(new_scale) +if success: + print(f"比例尺已设置为: 1:{new_scale}") +else: + print("比例尺设置失败") +``` + +Sources: [PySSMap.py](PySSMap.py#L2330-L2335), [PySSMap.py](PySSMap.py#L2430-L2432), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L45-L50) + +## 窗口缩放控制 + +窗口缩放是指通过指定矩形区域来调整地图视图的显示范围,这是实现快速定位和聚焦查看特定区域的有效方法。 + +### 窗口缩放方法 + +| 方法 | 功能描述 | 适用视图 | +|-----|---------|---------| +| `painter.zoomWindow(rect, z)` | 缩放到指定矩形区域 | VkPainter2D, VkPainter3D | + +**参数说明**: + +- `rect`:目标矩形区域(`DblRect` 类型),定义了缩放后的显示范围 +- `z`:缩放因子,控制缩放程度 + +Sources: [PySSView.py](PySSView.py#L1030-L1032), [PySSView.py](PySSView.py#L1154-L1156) + +### 窗口缩放流程 + +```mermaid +sequenceDiagram + participant Script as Python 脚本 + participant Map as ScaleMap + participant Painter as VkPainter2D/3D + + Script->>Map: getCurrentMap() + Map-->>Script: 返回地图对象 + + Script->>Painter: 获取视图对象 + Painter-->>Script: 返回 VkPainter 实例 + + Script->>Painter: zoomWindow(rect, z) + Painter->>Painter: 计算新的视图范围 + Painter->>Painter: 调整摄像机参数 + Painter->>Painter: 重新渲染场景 + Painter-->>Script: 返回操作结果 + + Script->>Painter: repaint() + Painter->>Painter: 刷新显示 +``` + +### 使用示例 + +```python +from sunvpy import SSProcess +from sunvpy.PySSMath import DblRect + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 假设已获取视图对象(实际使用时需根据具体情况获取) +# 这里展示窗口缩放的逻辑 +rect = DblRect() # 创建矩形对象 +# 设置矩形的范围(示例值) +# rect.set(...) + +# 缩放到指定窗口区域 +zoom_factor = 1.0 # 缩放因子 +# painter.zoomWindow(rect, zoom_factor) + +# 刷新视图 +# painter.repaint() +``` + +Sources: [PySSView.py](PySSView.py#L1030-L1032), [PySSView.py](PySSView.py#L1154-L1156), [PySSView.py](PySSView.py#L900-L910) + +## 坐标系统转换 + +坐标系统转换是地图缩放控制中的关键功能,它实现了地理坐标(地图空间)与屏幕坐标(显示空间)之间的双向转换。这对于鼠标交互、定位标注等场景至关重要。 + +### 坐标转换方法表 + +| 方法 | 功能描述 | 输入 | 输出 | +|-----|---------|------|------| +| `painter.geoToScreen(point)` | 地理坐标转屏幕坐标 | Point3D | Point2D | +| `painter.screenToGeo(point)` | 屏幕坐标转地理坐标 | Point2D | Point3D | +| `painter.lengthToPixels(dGeoLength)` | 地理长度转像素 | float(米) | int(像素) | +| `painter.pixelsToLength(nPixels)` | 像素转地理长度 | int(像素) | float(米) | + +Sources: [PySSView.py](PySSView.py#L1034-L1041), [PySSView.py](PySSView.py#L1158-L1165) + +### 坐标转换流程 + +```mermaid +flowchart LR + subgraph "地理坐标到屏幕坐标" + A1[Point3D 地理坐标] -->|geoToScreen| B1[Point2D 屏幕坐标] + end + + subgraph "屏幕坐标到地理坐标" + A2[Point2D 屏幕坐标] -->|screenToGeo| B2[Point3D 地理坐标] + end + + subgraph "长度单位转换" + A3[float 地理长度] -->|lengthToPixels| B3[int 像素值] + A4[int 像素值] -->|pixelsToLength| B4[float 地理长度] + end + + style A1 fill:#e1f5ff + style A2 fill:#e1f5ff + style A3 fill:#fff4e1 + style A4 fill:#fff4e1 +``` + +### 使用示例 + +```python +from sunvpy import SSProcess +from sunvpy.PySSMath import Point3D, Point2D + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 示例:地理坐标转屏幕坐标 +geo_point = Point3D(500000.0, 3000000.0, 0.0) # 地理坐标 +# screen_point = painter.geoToScreen(geo_point) +# print(f"屏幕坐标: ({screen_point.x()}, {screen_point.y()})") + +# 示例:屏幕坐标转地理坐标 +screen_point = Point2D(100, 200) # 屏幕坐标(像素) +# geo_point = painter.screenToGeo(screen_point) +# print(f"地理坐标: ({geo_point.x()}, {geo_point.y()}, {geo_point.z()})") + +# 示例:地理长度转像素 +geo_length = 50.0 # 50米 +# pixels = painter.lengthToPixels(geo_length) +# print(f"{geo_length}米 = {pixels}像素") + +# 示例:像素转地理长度 +pixels = 100 # 100像素 +# geo_length = painter.pixelsToLength(pixels) +# print(f"{pixels}像素 = {geo_length}米") +``` + +Sources: [PySSView.py](PySSView.py#L1034-L1041), [PySSView.py](PySSView.py#L1158-L1165) + +## 视图平移控制 + +视图平移是指在不改变比例尺的情况下,调整地图视图的中心位置,实现地图的漫游浏览效果。 + +### 平移控制方法 + +| 方法 | 功能描述 | 参数说明 | +|-----|---------|---------| +| `painter.moveScreenByPoint(refPoint, bMoveNoIf)` | 按参考点平移视图 | `refPoint`:参考点坐标
`bMoveNoIf`:是否在未移动时跳过 | + +Sources: [PySSView.py](PySSView.py#L1031-L1033), [PySSView.py](PySSView.py#L1155-L1157) + +### 平移流程 + +```mermaid +flowchart LR + A[开始平移] --> B[获取参考点坐标] + B -->|Point3D| C[调用 moveScreenByPoint] + C -->|refPoint, bMoveNoIf| D{需要平移吗?} + D -->|是| E[计算视图偏移量] + E --> F[更新视图中心点] + F --> G[重新渲染场景] + D -->|否| H[跳过操作] + G --> I[完成] + H --> I + + style A fill:#e1f5ff + style D fill:#fff4e1 + style G fill:#ffe8e1 +``` + +### 使用示例 + +```python +from sunvpy import SSProcess +from sunvpy.PySSMath import Point3D + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 定义平移参考点 +ref_point = Point3D(500010.0, 3000010.0, 0.0) + +# 执行平移操作(假设已获取 painter) +# success = painter.moveScreenByPoint(ref_point, False) +# if success: +# print("平移成功") +# # 刷新视图 +# painter.repaint() +``` + +Sources: [PySSView.py](PySSView.py#L1031-L1033), [PySSView.py](PySSView.py#L1155-L1157) + +## 获取视图缩放比例 + +在执行缩放操作前或后,通常需要查询当前的缩放比例,以便进行比例相关的计算或显示。 + +### 获取缩放比例方法 + +| 方法 | 功能描述 | 返回值 | +|-----|---------|--------| +| `painter.getImgScale()` | 获取当前视图的缩放比例 | float | + +Sources: [PySSView.py](PySSView.py#L1032-L1033), [PySSView.py](PySSView.py#L1156-L1157) + +### 使用示例 + +```python +from sunvpy import SSProcess + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 获取当前缩放比例 +# current_scale = painter.getImgScale() +# print(f"当前缩放比例: {current_scale}") + +# 根据缩放比例调整其他参数 +# if current_scale > 1.0: +# print("当前为放大视图") +# elif current_scale < 1.0: +# print("当前为缩小视图") +# else: +# print("当前为1:1视图") +``` + +Sources: [PySSView.py](PySSView.py#L1032-L1033), [PySSView.py](PySSView.py#L1156-L1157) + +## 视图刷新控制 + +视图刷新是确保缩放、平移等操作能够立即显示的关键步骤。 + +### 视图刷新方法 + +| 方法 | 功能描述 | 参数说明 | +|-----|---------|---------| +| `painter.repaint(erase)` | 立即重绘当前窗口 | `erase`:是否擦除背景,默认为 false | + +Sources: [PySSView.py](PySSView.py#L900-L910) + +### 使用示例 + +```python +from sunvpy import SSProcess + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 执行缩放或平移操作后,刷新视图 +# painter.zoomWindow(rect, 1.0) +# painter.repaint(erase=False) # 不擦除背景,优化性能 + +# 或者完全重绘 +# painter.repaint(erase=True) # 擦除背景,完全重绘 +``` + +Sources: [PySSView.py](PySSView.py#L900-L910) + +## 获取地图矩形信息 + +地图矩形定义了地图的地理范围,对于计算缩放区域和视图边界非常有用。 + +### 地图矩形方法 + +| 方法 | 功能描述 | 参数说明 | +|-----|---------|---------| +| `map.getMapRect(rect, arg3)` | 获取地图矩形范围 | `rect`:输出参数,返回矩形
`arg3`:对象类型参数 | + +Sources: [PySSMap.py](PySSMap.py#L2428-L2430) + +### 使用示例 + +```python +from sunvpy import SSProcess +from sunvpy.PySSMath import DblRect +from sunvpy.PySSCore import e_Null_Obj + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 创建矩形对象 +rect = DblRect() + +# 获取地图矩形范围 +# current_map.getMapRect(rect, e_Null_Obj) + +# 输出矩形范围 +# print(f"矩形范围: ({rect.left()}, {rect.bottom()}) - ({rect.right()}, {rect.top()})") +# print(f"矩形宽度: {rect.width()}") +# print(f"矩形高度: {rect.height()}") +``` + +Sources: [PySSMap.py](PySSMap.py#L2428-L2430), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L93-L101) + +## 对象缩放操作 + +除了视图缩放外,SunvStation 还支持对地图中的地理对象进行缩放变换。 + +### 对象缩放方法 + +| 方法 | 功能描述 | 参数说明 | +|-----|---------|---------| +| `map.zoom(GeoList, spCenter, xScale, yScale, fBaselineAngle)` | 缩放指定的地理对象列表 | `GeoList`:对象列表
`spCenter`:缩放中心点
`xScale`:X方向缩放因子
`yScale`:Y方向缩放因子
`fBaselineAngle`:基准线角度 | + +Sources: [PySSMap.py](PySSMap.py#L1588-L1590) + +### 对象缩放流程 + +```mermaid +flowchart LR + A[开始缩放对象] --> B[创建撤销标记] + B --> C[pushUndoMark] + C --> D[准备对象列表] + D --> E[GeoBaseList] + E --> F[设置缩放参数] + F --> G[缩放中心点
xScale/yScale
基准线角度] + G --> H[调用 map.zoom] + H --> I{缩放是否成功} + I -->|成功| J[对象已缩放] + I -->|失败| K[检查参数有效性] + J --> L[刷新视图] + K --> M[重新尝试] + L --> N[完成] + + style A fill:#e1f5ff + style I fill:#fff4e1 + style L fill:#ffe8e1 +``` + +### 使用示例 + +```python +from sunvpy import SSProcess +from sunvpy.PySSMath import Point3D, GeoBaseList + +# 获取当前地图 +current_map = SSProcess.getCurrentMap() + +# 创建撤销标记 +SSProcess.pushUndoMark("缩放对象") + +# 准备要缩放的对象列表 +geo_list = GeoBaseList() + +# 假设已选择了一些对象,添加到列表中 +# geo_list.push_back(selected_geo1) +# geo_list.push_back(selected_geo2) + +# 设置缩放中心点 +center_point = Point3D(500000.0, 3000000.0, 0.0) + +# 设置缩放因子(放大2倍) +x_scale = 2.0 +y_scale = 2.0 +baseline_angle = 0.0 # 基准线角度(弧度) + +# 执行缩放 +# success = current_map.zoom(geo_list, center_point, x_scale, y_scale, baseline_angle) +# if success: +# print("对象缩放成功") +# # 刷新视图 +# painter.repaint() +# else: +# print("对象缩放失败") +``` + +Sources: [PySSMap.py](PySSMap.py#L1588-L1590), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L55-L62) + +## 综合应用示例 + +以下是一个完整的示例,展示了如何综合运用各种缩放控制方法实现自动定位和视图调整功能。 + +### 示例:自动定位到指定区域并调整比例尺 + +```python +from sunvpy import SSProcess +from sunvpy.PySSMath import Point3D, DblRect, GeoBaseList +from sunvpy.PySSCore import e_Null_Obj + +def zoom_to_region(center_x, center_y, scale_denom): + """ + 缩放到指定区域并设置比例尺 + + 参数: + center_x: 目标中心点 X 坐标(米) + center_y: 目标中心点 Y 坐标(米) + scale_denom: 目标比例尺分母(例如 500 表示 1:500) + """ + # 获取当前地图 + current_map = SSProcess.getCurrentMap() + if current_map is None: + print("错误:当前没有打开的地图") + return False + + # 创建撤销标记 + SSProcess.pushUndoMark("缩放到指定区域") + + try: + # 方法1:直接设置比例尺 + print(f"设置比例尺为 1:{scale_denom}") + success = current_map.setMapScale(scale_denom) + if not success: + print(f"警告:设置比例尺 1:{scale_denom} 失败") + + # 方法2:获取当前视图对象(实际实现需根据具体情况) + # 假设通过某种方式获取了 painter + # painter = get_current_painter() + + # 计算目标矩形范围(基于中心点和比例尺) + # 这里需要根据实际比例尺和视图尺寸计算矩形范围 + # rect = calculate_rect_from_center_and_scale(center_x, center_y, scale_denom) + + # 缩放到目标区域 + # painter.zoomWindow(rect, 1.0) + + # 刷新视图 + # painter.repaint(erase=False) + + print("视图缩放操作完成") + return True + + except Exception as e: + print(f"缩放操作失败:{str(e)}") + return False + + +# 使用示例 +if __name__ == "__main__": + # 缩放到中心点 (500000, 3000000),比例尺 1:1000 + success = zoom_to_region(500000.0, 3000000.0, 1000) + if success: + print("操作成功") + else: + print("操作失败") +``` + +Sources: [PySSMap.py](PySSMap.py#L2330-L2335), [PySSMap.py](PySSMap.py#L2430-L2432), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L45-L50), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L55-L62) + +## 常见问题与解决方案 + +### 问题1:比例尺设置失败 + +**症状**:调用 `setMapScale()` 方法返回 false,比例尺未更新。 + +**可能原因**: +- 传入的比例尺值不在有效范围内 +- 当前地图不支持指定的比例尺 + +**解决方案**: + +```python +def safe_set_map_scale(target_scale): + """安全地设置地图比例尺""" + current_map = SSProcess.getCurrentMap() + + # 检查地图是否存在 + if current_map is None: + print("错误:当前没有打开的地图") + return False + + # 获取当前比例尺作为参考 + current_scale = current_map.getMapScale() + print(f"当前比例尺: 1:{current_scale}") + print(f"目标比例尺: 1:{target_scale}") + + # 尝试设置新比例尺 + success = current_map.setMapScale(target_scale) + + if success: + # 验证设置结果 + new_scale = current_map.getMapScale() + print(f"比例尺已更新为: 1:{new_scale}") + return True + else: + print(f"警告:无法设置比例尺 1:{target_scale},保持当前比例尺") + return False +``` + +Sources: [PySSMap.py](PySSMap.py#L2330-L2335), [PySSMap.py](PySSMap.py#L2430-L2432) + +### 问题2:坐标转换结果不准确 + +**症状**:`geoToScreen()` 或 `screenToGeo()` 返回的坐标值与预期不符。 + +**可能原因**: +- 地图比例尺或投影设置不正确 +- 视图尚未完成渲染 + +**解决方案**: + +```python +def accurate_coordinate_conversion(painter, geo_point): + """确保准确的坐标转换""" + # 确保视图是最新的 + painter.repaint(erase=False) + + # 获取当前缩放比例 + img_scale = painter.getImgScale() + print(f"当前缩放比例: {img_scale}") + + # 执行坐标转换 + screen_point = painter.geoToScreen(geo_point) + print(f"地理坐标 ({geo_point.x()}, {geo_point.y()})") + print(f"屏幕坐标 ({screen_point.x()}, {screen_point.y()})") + + # 反向验证 + verified_geo = painter.screenToGeo(screen_point) + print(f"验证地理坐标 ({verified_geo.x()}, {verified_geo.y()})") + + # 检查精度 + error_x = abs(geo_point.x() - verified_geo.x()) + error_y = abs(geo_point.y() - verified_geo.y()) + print(f"转换误差: X={error_x:.6f}, Y={error_y:.6f}") + + return screen_point +``` + +Sources: [PySSView.py](PySSView.py#L1032-L1041), [PySSView.py](PySSView.py#L900-L910) + +### 问题3:视图刷新后显示异常 + +**症状**:调用 `repaint()` 后视图显示不正确或闪烁。 + +**解决方案**: + +```python +def smart_view_update(painter, erase_background=True): + """智能视图更新""" + if erase_background: + # 完全重绘,确保视图完全更新 + painter.repaint(erase=True) + print("执行完全重绘") + else: + # 增量更新,优化性能 + painter.repaint(erase=False) + print("执行增量更新") +``` + +Sources: [PySSView.py](PySSView.py#L900-L910) + +## 最佳实践 + +### 1. 批量操作前创建撤销标记 + +```python +# 在执行多个缩放或变换操作前,创建一个撤销标记 +SSProcess.pushUndoMark("批量视图调整") + +# 执行一系列操作 +# map.zoom(...) +# painter.moveScreenByPoint(...) +# painter.zoomWindow(...) + +# 这样所有操作可以作为一个整体被撤销 +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L55-L62) + +### 2. 缩放操作后刷新视图 + +```python +# 执行缩放或平移操作 +# painter.zoomWindow(rect, z) + +# 总是调用刷新以确保视图更新 +painter.repaint(erase=False) +``` + +Sources: [PySSView.py](PySSView.py#L900-L910) + +### 3. 使用坐标转换实现精确定位 + +```python +# 计算目标屏幕位置 +target_screen_x = 400 +target_screen_y = 300 + +# 转换为地理坐标 +target_geo = painter.screenToGeo(Point2D(target_screen_x, target_screen_y)) + +# 移动视图到目标位置 +# painter.moveScreenByPoint(target_geo, False) +``` + +Sources: [PySSView.py](PySSView.py#L1034-L1041), [PySSView.py](PySSView.py#L1031-L1033) + +### 4. 检查地图有效性 + +```python +# 在执行任何地图操作前,检查地图是否存在 +current_map = SSProcess.getCurrentMap() +if current_map is None: + print("错误:当前没有打开的地图") + return False + +# 检查地图是否有效 +if current_map.getMapScale() <= 0: + print("错误:地图比例尺无效") + return False +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L45-L50), [PySSMap.py](PySSMap.py#L2330-L2335) + +## 相关页面 + +掌握了地图缩放控制后,您可以进一步学习以下相关主题: + +- **[获取工作空间信息](34-huo-qu-gong-zuo-kong-jian-xin-xi)**:了解如何获取当前工作空间和地图实例 +- **[工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian)**:深入理解 SunvStation 的工作空间和地图架构 +- **[撤销标记管理](25-che-xiao-biao-ji-guan-li)**:学习如何管理撤销/重做操作 \ No newline at end of file diff --git a/docs/content/37-pei-zhi-ri-zhi-ji-lu-qi.md b/docs/content/37-pei-zhi-ri-zhi-ji-lu-qi.md new file mode 100644 index 0000000..8baf1a1 --- /dev/null +++ b/docs/content/37-pei-zhi-ri-zhi-ji-lu-qi.md @@ -0,0 +1,536 @@ +日志记录是脚本开发中不可或缺的调试和监控手段,它能帮助您跟踪脚本执行过程、记录错误信息、排查问题根源。本页面将指导您为 SunvStation 脚本配置一个功能完善的日志记录器,让您的脚本具备专业级的日志管理能力。 + +## 日志系统架构概览 + +SunvStation 的日志功能通过 **LogMixin** 混入类实现,这是 SSProcessManager 继承体系中的基础模块之一。日志系统采用**依赖注入**设计模式,允许您将自定义配置的日志记录器注入到 SSProcess 中,从而灵活控制日志的输出方式、格式和级别。 + +```mermaid +classDiagram + class Logger { + <> + +debug(msg) + +info(msg) + +warning(msg) + +error(msg) + +critical(msg) + } + + class LogAware { + <<抽象基类>> + +set_logger(Logger)* + +log_error_msg(str)* + } + + class LogMixin { + +Logger logger + +set_logger(Logger) + +log_error_msg(str) + } + + class SSProcessManager { + +Logger logger + +set_logger(Logger) + +log_error_msg(str) + } + + LogAware <|-- LogMixin + LogMixin <|-- SSProcessManager + SSProcessManager ..> Logger : 使用 +``` + +这个架构设计的核心优势在于**关注点分离**:SSProcessManager 只负责调用日志接口,而日志的具体配置(输出到文件、控制台或远程服务器)完全由您控制,不会影响业务逻辑代码。 + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L19-L42), [PySSProcess.py](PySSProcess.py#L34-L35) + +## 配置日志记录器流程 + +配置日志记录器的过程分为四个关键步骤,下图清晰地展示了从创建到使用的完整流程: + +```mermaid +flowchart TD + A[开始配置日志] --> B[创建Logger实例] + B --> C[配置Handler处理器] + C --> D[设置Formatter格式化器] + D --> E[配置日志级别] + E --> F[注入到SSProcess] + F --> G[开始使用日志功能] + + C --> C1[文件处理器
FileHandler] + C --> C2[控制台处理器
StreamHandler] + C --> C3[综合配置
多处理器] + + E --> E1[DEBUG] + E --> E2[INFO] + E --> E3[WARNING] + E --> E4[ERROR] + + G --> G1[自动记录错误] + G --> G2[手动记录日志] + + style F fill:#e1f5ff + style G fill:#fff4e1 +``` + +理解这个流程后,我们将逐步详细解析每个环节的具体实现方法。 + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L26-L42) + +## 步骤一:创建 Logger 实例 + +首先需要创建一个 Python 标准库的 Logger 实例。建议使用脚本文件名作为 Logger 的名称,这样可以在日志输出中清晰地识别日志来源。 + +```python +import logging + +# 创建 Logger 实例,使用脚本文件名作为标识符 +logger = logging.getLogger('my_script') +logger.setLevel(logging.DEBUG) # 设置最低日志级别 +``` + +### 日志级别说明 + +Python logging 模块提供了五个标准日志级别,按严重程度从低到高排列: + +| 级别 | 数值 | 说明 | 使用场景 | +|-----|------|------|---------| +| DEBUG | 10 | 调试信息 | 详细的程序运行细节,仅在开发和调试时使用 | +| INFO | 20 | 一般信息 | 程序正常运行的关键步骤确认 | +| WARNING | 30 | 警告信息 | 程序可以继续运行但可能存在潜在问题 | +| ERROR | 40 | 错误信息 | 程序遇到错误但能够继续运行 | +| CRITICAL | 50 | 严重错误 | 严重错误导致程序可能无法继续运行 | + +设置日志级别后,只有**等于或高于该级别**的日志消息才会被处理。例如,设置 `WARNING` 级别时,`DEBUG` 和 `INFO` 级别的消息将被忽略。 + +Sources: [Python logging 模块](https://docs.python.org/3/library/logging.html#logging-levels) + +## 步骤二:配置 Handler 处理器 + +Handler 决定了日志消息的输出目的地。常用的 Handler 类型包括文件处理器和控制台处理器。您可以根据需求选择单一处理器或组合使用多个处理器。 + +### 文件处理器配置 + +将日志输出到文件是最常见的需求,特别适合长期运行的脚本和自动化任务。 + +```python +# 创建文件处理器,指定日志文件路径 +file_handler = logging.FileHandler( + 'script_log.log', # 日志文件路径 + mode='a', # 追加模式('a'追加,'w'覆盖) + encoding='utf-8' # 文件编码 +) +file_handler.setLevel(logging.INFO) # 文件处理器只记录 INFO 级别及以上 +``` + +### 控制台处理器配置 + +控制台处理器将日志输出到标准输出流,适合开发调试阶段使用。 + +```python +# 创建控制台处理器 +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.WARNING) # 控制台只显示 WARNING 级别及以上 +``` + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L26-L42) + +## 步骤三:设置 Formatter 格式化器 + +Formatter 定义了日志消息的输出格式,包括时间戳、日志级别、消息内容等信息。合理的格式能让日志更易于阅读和分析。 + +### 基本格式示例 + +```python +# 创建格式化器 +formatter = logging.Formatter( + fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) + +# 将格式化器应用到处理器 +file_handler.setFormatter(formatter) +console_handler.setFormatter(formatter) +``` + +### 格式化参数说明 + +| 格式参数 | 说明 | 示例输出 | +|---------|------|---------| +| `%(asctime)s` | 日志记录时间 | 2024-01-15 14:30:25 | +| `%(name)s` | Logger 名称 | my_script | +| `%(levelname)s` | 日志级别名称 | ERROR | +| `%(message)s` | 日志消息内容 | 无法获取当前数据源 | +| `%(filename)s` | 文件名 | geo_edit_mixin.py | +| `%(lineno)d` | 行号 | 175 | +| `%(funcName)s` | 函数名 | createNewObjByCode | + +### 完整格式示例(包含位置信息) + +```python +# 包含文件名、行号和函数名的详细格式 +detailed_formatter = logging.Formatter( + fmt='%(asctime)s [%(filename)s:%(lineno)d - %(funcName)s] %(levelname)s: %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) +file_handler.setFormatter(detailed_formatter) +``` + +这种详细格式在调试问题时特别有用,可以快速定位到产生日志的具体代码位置。 + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L36-L42) + +## 步骤四:组装并注入到 SSProcess + +完成上述配置后,需要将处理器添加到 Logger,然后将 Logger 注入到 SSProcess 中。 + +```python +from sunvpy import SSProcess + +# 将处理器添加到 Logger +logger.addHandler(file_handler) +logger.addHandler(console_handler) + +# 将配置好的 Logger 注入到 SSProcess +SSProcess.set_logger(logger) + +# 验证配置成功 +print("日志记录器配置完成!") +``` + +至此,SSProcess 已经具备了完整的日志记录能力,所有内部调用 `log_error_msg()` 的错误消息都会按照您的配置输出到指定的目的地。 + +Sources: [PySSProcess.py](PySSProcess.py#L79), [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L175) + +## 常用日志配置方案 + +不同的应用场景需要不同的日志配置策略。以下是几种常用的配置方案,您可以根据实际需求选择或修改。 + +### 方案一:开发调试配置 + +适合开发阶段,输出详细调试信息到控制台,同时记录警告和错误到文件。 + +| 配置项 | 控制台处理器 | 文件处理器 | +|-------|------------|-----------| +| 日志级别 | DEBUG | WARNING | +| 格式 | 简洁格式 | 详细格式 | +| 用途 | 实时查看 | 长期保存 | + +```python +# 开发调试配置 +import logging +from sunvpy import SSProcess + +logger = logging.getLogger('debug_script') +logger.setLevel(logging.DEBUG) + +# 控制台处理器 - 显示所有调试信息 +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.DEBUG) +console_handler.setFormatter(logging.Formatter( + '%(levelname)s: %(message)s' +)) + +# 文件处理器 - 只记录警告和错误 +file_handler = logging.FileHandler('debug.log', encoding='utf-8') +file_handler.setLevel(logging.WARNING) +file_handler.setFormatter(logging.Formatter( + '%(asctime)s - %(levelname)s - %(message)s' +)) + +logger.addHandler(console_handler) +logger.addHandler(file_handler) + +SSProcess.set_logger(logger) +``` + +### 方案二:生产环境配置 + +适合正式运行的脚本,只记录重要信息到文件,避免输出过多调试信息影响性能。 + +| 配置项 | 文件处理器 | +|-------|-----------| +| 日志级别 | INFO | +| 格式 | 包含时间戳和位置信息 | +| 文件轮转 | 按大小或日期自动分割 | + +```python +# 生产环境配置(带日志文件轮转) +import logging +from logging.handlers import RotatingFileHandler +from sunvpy import SSProcess + +logger = logging.getLogger('production_script') +logger.setLevel(logging.INFO) + +# 创建支持文件轮转的处理器 +# 每个日志文件最大 5MB,最多保留 3 个备份文件 +file_handler = RotatingFileHandler( + 'production.log', + maxBytes=5*1024*1024, # 5MB + backupCount=3, + encoding='utf-8' +) +file_handler.setLevel(logging.INFO) +file_handler.setFormatter(logging.Formatter( + '%(asctime)s [%(levelname)s] %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +)) + +logger.addHandler(file_handler) +SSProcess.set_logger(logger) +``` + +### 方案三:简洁配置 + +如果您只需要最基础的日志功能,可以使用以下最简配置: + +```python +# 最简配置 +import logging +from sunvpy import SSProcess + +# 配置根 logger(一次性配置所有 logger) +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + filename='simple.log', + filemode='a' +) + +# 获取并注入 logger +SSProcess.set_logger(logging.getLogger()) +``` + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L26-L42) + +## 日志记录方法说明 + +配置完成后,您可以通过两种方式记录日志: + +### 自动记录(系统内部调用) + +SSProcess 的许多内部操作会在遇到错误时自动调用 `log_error_msg()` 记录日志,例如在无法获取数据源时会自动记录错误。 + +```python +# SSProcess 内部代码示例(来自 geo_edit_mixin.py) +if ds_eps is None: + self.log_error_msg("无法获取当前数据源!") + return self.curNewObj +``` + +这类日志无需您手动触发,会在问题发生时自动记录。 + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L174-L176) + +### 手动记录(自定义日志) + +您也可以在脚本中手动记录自定义日志消息,帮助跟踪脚本执行过程。 + +```python +from sunvpy import SSProcess +import logging + +# 配置日志(使用之前介绍的任何方案) +logger = logging.getLogger('manual_logging') +logger.setLevel(logging.INFO) +handler = logging.FileHandler('manual.log', encoding='utf-8') +handler.setFormatter(logging.Formatter( + '%(asctime)s - %(levelname)s - %(message)s' +)) +logger.addHandler(handler) +SSProcess.set_logger(logger) + +# 记录脚本开始执行 +logger.info("脚本开始执行") + +# 执行选择集查询 +SSProcess.clearSelection() +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +SSProcess.selectFilter() + +count = SSProcess.getSelGeoCount() +logger.info(f"查询完成,共找到 {count} 个对象") + +# 处理结果 +if count == 0: + logger.warning("未找到任何符合条件的对象") +else: + logger.info("开始处理对象...") + # 处理逻辑... + logger.info("对象处理完成") + +# 记录脚本执行结束 +logger.info("脚本执行结束") +``` + +### 日志记录最佳实践 + +| 实践 | 说明 | +|-----|------| +| 使用适当的日志级别 | DEBUG 用于调试,INFO 用于关键步骤,WARNING 用于潜在问题,ERROR 用于错误 | +| 包含上下文信息 | 日志消息应包含足够的信息以便理解问题(如对象 ID、条件值等) | +| 避免过度日志 | 生产环境中避免记录大量 DEBUG 级别日志,影响性能 | +| 使用结构化日志 | 对于复杂应用,考虑使用 JSON 格式的结构化日志 | +| 定期清理日志 | 配置日志轮转或定期清理旧日志文件,避免占用过多磁盘空间 | + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L36-L42) + +## 完整示例:带日志的属性修改脚本 + +以下是一个完整的示例脚本,展示如何在实际项目中集成日志功能。该脚本修改选择集中对象的属性,并在每个关键步骤记录日志。 + +```python +import logging +from logging.handlers import RotatingFileHandler +from sunvpy import SSProcess + +# ========== 日志配置开始 ========== +logger = logging.getLogger('attribute_update_script') +logger.setLevel(logging.INFO) + +# 配置文件处理器(自动轮转) +file_handler = RotatingFileHandler( + 'attribute_update.log', + maxBytes=10*1024*1024, # 10MB + backupCount=5, + encoding='utf-8' +) +file_handler.setLevel(logging.INFO) +file_handler.setFormatter(logging.Formatter( + '%(asctime)s [%(levelname)s] %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +)) + +# 配置控制台处理器(只显示警告和错误) +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.WARNING) + +logger.addHandler(file_handler) +logger.addHandler(console_handler) +SSProcess.set_logger(logger) +# ========== 日志配置结束 ========== + +# ========== 主脚本开始 ========== +logger.info("=" * 60) +logger.info("属性修改脚本开始执行") +logger.info("=" * 60) + +try: + # 步骤 1:清除旧选择集和条件 + logger.info("步骤 1:清除旧选择集和条件") + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + + # 步骤 2:设置选择条件 + logger.info("步骤 2:设置选择条件") + filter_code = "3103013" + SSProcess.setSelectCondition("SSObj_Code", "==", filter_code) + logger.info(f"筛选条件:SSObj_Code == {filter_code}") + + # 步骤 3:执行查询 + logger.info("步骤 3:执行查询") + SSProcess.selectFilter() + + count = SSProcess.getSelGeoCount() + logger.info(f"查询结果:共找到 {count} 个对象") + + if count == 0: + logger.warning("选择集为空,脚本退出") + exit() + + # 步骤 4:批量修改属性 + logger.info("步骤 4:开始批量修改属性") + + success_count = 0 + fail_count = 0 + + for i in range(count): + try: + # 修改属性 + SSProcess.setSelGeoValue(i, "SSObj_Color", "16711680") # 红色 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"修改后对象_{i}") + + success_count += 1 + + # 每 100 个对象记录一次进度 + if (i + 1) % 100 == 0: + logger.info(f"已处理 {i + 1}/{count} 个对象") + + except Exception as e: + fail_count += 1 + logger.error(f"修改第 {i} 个对象时出错:{str(e)}") + + # 步骤 5:保存修改 + logger.info("步骤 5:保存修改到数据库") + SSProcess.saveBufferObjToDatabase() + + # 输出统计信息 + logger.info("=" * 60) + logger.info("执行统计:") + logger.info(f" 总处理对象数:{count}") + logger.info(f" 成功修改数:{success_count}") + logger.info(f" 失败对象数:{fail_count}") + logger.info("=" * 60) + +except Exception as e: + logger.critical(f"脚本执行过程中发生严重错误:{str(e)}", exc_info=True) + raise + +logger.info("脚本执行结束") +logger.info("=" * 60) +``` + +运行此脚本后,日志文件 `attribute_update.log` 将包含完整的执行轨迹,便于后续分析和排查问题。 + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L26-L42), [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L67-L200) + +## 故障排查 + +### 日志文件未生成 + +**问题**:脚本运行后没有生成预期的日志文件。 + +**可能原因及解决方法**: + +| 原因 | 解决方法 | +|-----|---------| +| 日志级别设置过高 | 检查 Logger 和 Handler 的级别设置,确保有符合条件的日志消息 | +| 未将 Handler 添加到 Logger | 确认调用了 `logger.addHandler(handler)` | +| 文件路径无写入权限 | 检查文件路径是否存在且具有写入权限 | +| 日志消息级别低于配置 | 确保记录的日志消息级别不低于 Handler 的级别 | + +### 日志输出乱码 + +**问题**:日志文件中出现中文乱码。 + +**解决方法**:在创建 FileHandler 时显式指定 `encoding='utf-8'` 参数: + +```python +file_handler = logging.FileHandler('log.txt', encoding='utf-8') +``` + +### 未记录 SSProcess 内部错误 + +**问题**:SSProcess 操作出错时没有记录到日志文件。 + +**原因**:SSProcess 内部的 `log_error_msg()` 方法只在配置了 logger 时才会记录日志。 + +**解决方法**:确保在调用任何 SSProcess 方法之前调用 `SSProcess.set_logger(logger)`。 + +```python +# 正确的顺序 +logger = configure_logger() # 先配置 logger +SSProcess.set_logger(logger) # 然后注入 +SSProcess.selectFilter() # 最后才执行操作 +``` + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L36-L42) + +## 下一步学习 + +完成日志配置的学习后,建议您继续探索以下相关主题: + +- [进度条使用指南](38-jin-du-tiao-shi-yong-zhi-nan) - 学习如何在长时间运行的脚本中提供进度反馈 +- [错误处理与异常管理](39-cuo-wu-chu-li-yu-yi-chang-guan-li) - 掌握更高级的错误处理技巧 +- [对象缓存机制](23-dui-xiang-huan-cun-ji-zhi) - 了解如何高效处理大量对象 + +结合日志记录、进度显示和错误处理,您将能够开发出健壮、易调试、用户友好的专业级 SunvStation 脚本。 \ No newline at end of file diff --git a/docs/content/38-jin-du-tiao-shi-yong-zhi-nan.md b/docs/content/38-jin-du-tiao-shi-yong-zhi-nan.md new file mode 100644 index 0000000..75711d5 --- /dev/null +++ b/docs/content/38-jin-du-tiao-shi-yong-zhi-nan.md @@ -0,0 +1,723 @@ +进度条是向用户反馈长时间操作进度的关键交互组件,它能让用户清晰了解任务的执行状态,提升用户体验。本指南将系统讲解如何在 SunvStation 脚本中高效使用进度条功能,涵盖基础用法、高级技巧和最佳实践。 + +在学习本页内容后,建议按照以下路径继续深入: +- [配置日志记录器](37-pei-zhi-ri-zhi-ji-lu-qi) — 了解日志记录的配置方法,与进度条配合使用 +- [错误处理与异常管理](39-cuo-wu-chu-li-yu-yi-chang-guan-li) — 掌握进度条操作中的错误处理 +- [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku) — 查看进度条在实际批量操作中的应用 + +## 进度条系统架构概览 + +SunvStation 的进度条功能采用**分层架构设计**,通过 `ProgressMixin` 混入类与 SSProcessManager 集成,结合底层 C++ 封装的 `Progress` 类和进度条控制函数,形成完整的三层架构体系。 + +```mermaid +classDiagram + class ProgressAware { + <<抽象基类>> + +disable_progress()* + +startProgress(title, total)* + +stepProgress(message)* + +closeProgress()* + } + + class ProgressMixin { + +enable_progress: bool + +progress: Progress + +disable_progress() + +startProgress(title, total) + +stepProgress(message) + +closeProgress() + } + + class SSProcessManager { + +enable_progress: bool + +progress: Progress + +startProgress(title, total) + +stepProgress(message) + +closeProgress() + } + + class Progress { + <> + +setSize(nSize) + +step() boolean + +getPos() int + +getStep() int + } + + class GlobalFunctions { + <<函数模块>> + +startProgress(title, barCount) + +closeProgress() + +setProgressRange(min, max) + +stepProgress(pos, title) + } + + ProgressAware <|-- ProgressMixin + ProgressMixin <|-- SSProcessManager + ProgressMixin ..> Progress : 使用 + ProgressMixin ..> GlobalFunctions : 调用 +``` + +这种架构设计的核心优势在于**关注点分离**:`ProgressMixin` 负责进度条的业务逻辑封装,底层函数处理进度条的创建和更新,而 `Progress` 类则提供了防抖动的智能步进机制,避免频繁更新导致的性能问题。 + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L15-L80), [PySSWidget.py](PySSWidget.py#L934-L977) + +### 核心组件说明 + +| 组件 | 类型 | 职责描述 | +|------|------|----------| +| `ProgressMixin` | Mixin 类 | 提供进度条的封装方法,管理 `enable_progress` 开关 | +| `Progress` | C++ 封装类 | 智能步进控制器,将循环总数映射到 0-100 的进度范围 | +| `enable_progress` | bool 属性 | 控制进度条是否显示的全局开关 | +| `progress` | Progress 实例 | 当前进度条控制器实例 | +| `startProgress()` | 全局函数 | 创建并显示进度条对话框 | +| `stepProgress()` | 全局函数 | 更新进度条的当前位置和提示信息 | +| `closeProgress()` | 全局函数 | 关闭进度条对话框 | + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L22-L80), [PySSWidget.py](PySSWidget.py#L500-L560) + +## 进度条使用基本流程 + +进度条操作遵循"启动 → 更新 → 关闭"的标准生命周期管理流程。理解这个流程对于正确使用进度条至关重要,下图展示了完整的操作步骤: + +```mermaid +flowchart TD + A[开始使用进度条] --> B[调用 startProgress
启动进度条] + B --> C{enable_progress
是否启用?} + C -->|是| D[创建 Progress 实例
设置进度范围 0-100] + C -->|否| E[跳过进度显示] + D --> F[执行循环任务] + F --> G{progress.step()
是否需要更新?} + G -->|是| H[调用 stepProgress
更新进度条显示] + G -->|否| F + H --> F + F --> I{任务是否完成?} + I -->|否| F + I -->|是| J[调用 closeProgress
关闭进度条] + J --> K[进度条使用完成] + E --> K + + style D fill:#e1f5ff + style H fill:#fff4e1 + style J fill:#ffe1e1 +``` + +理解这个流程后,我们将逐步详细解析每个环节的具体实现方法。 + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L32-L80) + +## 步骤一:启动进度条 + +使用 `startProgress()` 方法启动进度条,需要指定标题和总任务数。标题将显示在进度条对话框顶部,总任务数用于计算进度的步进间隔。 + +### 基本用法 + +```python +from sunvpy import SSProcess + +# 启动进度条,显示标题和总任务数 +SSProcess.startProgress("批量导出数据", 1000) +``` + +### 方法参数说明 + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `title` | str | 是 | 进度条对话框标题,描述当前正在执行的任务 | +| `total` | int | 是 | 总任务数,用于计算进度步进间隔 | + +### 实现原理 + +`startProgress()` 内部会执行以下操作: + +1. 检查 `enable_progress` 开关是否启用 +2. 创建 `Progress(total)` 实例,自动计算步进间隔 +3. 调用全局 `startProgress(title, 1)` 创建进度条对话框 +4. 调用 `setProgressRange(0, 100)` 设置进度范围固定为 0-100 + +```mermaid +sequenceDiagram + participant Script as 脚本代码 + participant Mixin as ProgressMixin + participant Progress as Progress类 + participant UI as 进度条UI + + Script->>Mixin: startProgress("导出数据", 1000) + activate Mixin + Mixin->>Mixin: 检查 enable_progress + alt enable_progress == True + Mixin->>Progress: new Progress(1000) + Progress-->>Mixin: 实例创建成功 + Mixin->>UI: startProgress("导出数据", 1) + UI-->>Mixin: 对话框已显示 + Mixin->>UI: setProgressRange(0, 100) + Mixin->>Mixin: 保存实例到 self.progress + end + Mixin-->>Script: 方法返回 + deactivate Mixin +``` + +这种设计的优势在于:**将循环总数自动映射到 0-100 的标准进度范围**,避免了手动计算百分比的繁琐,同时通过 `Progress` 类的智能步进机制,减少不必要的 UI 更新次数。 + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L32-L46), [PySSWidget.py](PySSWidget.py#L495-L500) + +## 步骤二:更新进度条 + +在循环或长时间任务中,使用 `stepProgress()` 方法更新进度条显示。这个方法会自动判断是否真正需要更新 UI,避免频繁刷新导致的性能问题。 + +### 基本用法 + +```python +# 遍历选择集并更新进度 +total_count = SSProcess.getSelGeoCount() +SSProcess.startProgress("处理选择集对象", total_count) + +for i in range(total_count): + # 执行业务逻辑 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"对象_{i}") + + # 更新进度条,显示当前处理的索引 + SSProcess.stepProgress(f"正在处理第 {i+1}/{total_count} 个对象") + +# 关闭进度条 +SSProcess.closeProgress() +``` + +### 方法参数说明 + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `message` | str | 是 | 当前步骤的描述信息,将显示在进度条下方 | + +### 智能步进机制 + +`Progress` 类的核心功能是**智能步进控制**。它会根据总任务数自动计算步进间隔,确保进度条更新不会过于频繁: + +```python +# Progress 内部的步进逻辑(简化示例) +class Progress: + def __init__(self, total): + self.total = total + self.current = 0 + # 自动计算步进间隔,确保在0-100范围内更新不超过100次 + self.step_size = max(1, total // 100) + + def step(self): + self.current += 1 + # 只有当累计步进达到阈值时才返回True,触发UI更新 + if self.current >= self.step_size: + self.current = 0 + return True + return False +``` + +这种机制的效果是:无论循环执行多少次(100次还是100000次),进度条最多只更新100次,大大提高了性能。 + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L48-L60), [PySSWidget.py](PySSWidget.py#L946-L972) + +### 更新频率对比 + +以下对比展示了智能步进机制与传统每次循环都更新的区别: + +| 场景 | 总任务数 | 传统更新次数 | 智能步进更新次数 | 性能提升 | +|------|----------|-------------|----------------|----------| +| 小型任务 | 50 | 50 | 50 | 无提升 | +| 中型任务 | 1000 | 1000 | 100 | 10倍提升 | +| 大型任务 | 100000 | 100000 | 100 | 1000倍提升 | + +Sources: [PySSWidget.py](PySSWidget.py#L950-L972) + +## 步骤三:关闭进度条 + +任务完成后,必须调用 `closeProgress()` 方法关闭进度条对话框。这个方法会清理进度条资源,并确保 UI 正确更新。 + +### 基本用法 + +```python +# 任务完成后关闭进度条 +SSProcess.closeProgress() +``` + +### 方法行为 + +`closeProgress()` 会执行以下操作: + +1. 调用全局 `closeProgress()` 函数关闭对话框 +2. 将 `self.progress` 设置为 `None`,释放资源 +3. 通过异常处理确保即使关闭失败也不会影响程序运行 + +```python +def closeProgress(self): + """关闭进度条。""" + if self.progress is not None: + try: + closeProgress() + except Exception: + pass # 忽略关闭异常 + self.progress = None +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L62-L80), [PySSWidget.py](PySSWidget.py#L505-L510) + +### 关闭时机的重要性 + +确保在以下所有情况下都调用 `closeProgress()`: + +| 场景 | 说明 | 处理方式 | +|------|------|----------| +| 正常完成 | 循环自然结束 | 在循环结束后调用 | +| 异常中断 | 遇到错误提前退出 | 使用 try-finally 确保调用 | +| 用户取消 | 响应用户中断请求 | 在取消处理中调用 | +| 条件跳过 | 不满足某些条件时退出 | 在所有退出分支中调用 | + +### 最佳实践:使用 finally 确保关闭 + +```python +SSProcess.startProgress("处理数据", total_count) + +try: + for i in range(total_count): + # 执行业务逻辑 + process_item(i) + + # 更新进度 + SSProcess.stepProgress(f"处理 {i+1}/{total_count}") + + # 检查是否需要中断 + if should_cancel(): + raise KeyboardInterrupt("用户取消操作") + +except Exception as e: + SSProcess.logger.error(f"处理失败: {e}") + raise + +finally: + # 确保进度条一定会被关闭 + SSProcess.closeProgress() +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L62-L80) + +## 完整示例:批量导出数据 + +下面是一个完整的示例,展示在批量导出选择集对象时如何使用进度条。 + +### 代码实现 + +```python +from sunvpy import SSProcess + +def export_selection_to_csv(file_path): + """将选择集中的对象导出到CSV文件""" + + # 获取选择集数量 + geo_count = SSProcess.getSelGeoCount() + + if geo_count == 0: + print("选择集为空,无需导出") + return + + # 启动进度条 + SSProcess.startProgress("导出选择集到CSV", geo_count) + + try: + # 准备CSV文件 + with open(file_path, 'w', encoding='utf-8') as f: + # 写入CSV表头 + f.write("ID,代码,名称,类型,颜色\n") + + # 遍历选择集并导出 + for i in range(geo_count): + # 获取对象属性 + obj_id = SSProcess.getSelGeoValue(i, "SSObj_ID") + obj_code = SSProcess.getSelGeoValue(i, "SSObj_Code") + obj_name = SSProcess.getSelGeoValue(i, "SSObj_Name") + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + obj_color = SSProcess.getSelGeoValue(i, "SSObj_Color") + + # 写入CSV行 + f.write(f"{obj_id},{obj_code},{obj_name},{obj_type},{obj_color}\n") + + # 每处理10个对象更新一次进度 + SSProcess.stepProgress(f"正在导出第 {i+1}/{geo_count} 个对象") + + print(f"成功导出 {geo_count} 个对象到 {file_path}") + + except Exception as e: + print(f"导出失败: {e}") + SSProcess.logger.error(f"导出失败: {e}") + + finally: + # 确保关闭进度条 + SSProcess.closeProgress() + +# 调用示例 +export_selection_to_csv("export.csv") +``` + +### 代码解析 + +| 代码段 | 说明 | +|--------|------| +| `geo_count = SSProcess.getSelGeoCount()` | 先获取总数量,用于进度条初始化 | +| `SSProcess.startProgress(...)` | 在 try 块之前启动进度条 | +| `SSProcess.stepProgress(...)` | 在循环内部更新进度,显示当前处理位置 | +| `finally: SSProcess.closeProgress()` | 使用 finally 确保进度条一定被关闭 | + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L32-L80) + +## 禁用进度条 + +在某些场景下(如自动化脚本、后台任务),可能需要临时或永久禁用进度条显示。使用 `disable_progress()` 方法可以实现这一需求。 + +### 基本用法 + +```python +# 禁用进度条 +SSProcess.disable_progress() + +# 后续的所有进度条操作都不会显示 +SSProcess.startProgress("处理数据", 100) # 不会显示进度条 +SSProcess.stepProgress("处理中...") # 不会更新进度条 +SSProcess.closeProgress() # 不会执行任何操作 +``` + +### 方法行为 + +`disable_progress()` 会执行以下操作: + +1. 将 `enable_progress` 设置为 `False` +2. 如果当前有正在显示的进度条,立即关闭它 +3. 后续所有进度条方法调用都会被跳过 + +```python +def disable_progress(self): + """关闭进度条显示并立即关闭正在显示的进度条。""" + self.enable_progress = False + if self.progress is not None: + try: + closeProgress() + except Exception: + pass + self.progress = None +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L24-L30) + +### 使用场景对比 + +| 场景 | 是否禁用进度条 | 原因 | +|------|----------------|------| +| 交互式脚本 | 否 | 用户需要看到进度反馈 | +| 批处理自动化任务 | 是 | 无用户交互,节省资源 | +| 后台定时任务 | 是 | 避免弹出窗口干扰 | +| 单元测试 | 是 | 测试环境不需要UI反馈 | +| 调试阶段 | 否 | 需要观察程序执行状态 | + +### 条件禁用示例 + +```python +import sys + +def process_data(): + """根据运行环境决定是否显示进度条""" + + # 如果是从命令行运行且带有 --quiet 参数,则禁用进度条 + if '--quiet' in sys.argv: + SSProcess.disable_progress() + print("静默模式:进度条已禁用") + + # 正常使用进度条(会根据 enable_progress 自动判断) + SSProcess.startProgress("处理数据", 1000) + for i in range(1000): + process_item(i) + SSProcess.stepProgress(f"处理 {i+1}") + SSProcess.closeProgress() + +# 调用示例 +# python script.py --quiet # 禁用进度条 +# python script.py # 显示进度条 +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L24-L30) + +## 进度条与日志配合使用 + +将进度条与日志系统结合使用,可以在提供视觉反馈的同时保留详细的执行记录,特别适合复杂的长时间任务。 + +### 配合模式 + +```mermaid +flowchart LR + A[任务开始] --> B[记录日志 INFO] + B --> C[启动进度条] + C --> D{循环执行} + D --> E[执行子任务] + E --> F{子任务成功?} + F -->|是| G[记录日志 DEBUG
详细信息] + F -->|否| H[记录日志 ERROR
错误信息] + G --> I[更新进度条] + H --> I + I --> J{任务完成?} + J -->|否| D + J -->|是| K[关闭进度条] + K --> L[记录日志 INFO
任务完成] + + style C fill:#e1f5ff + style I fill:#fff4e1 + style K fill:#ffe1e1 +``` + +### 完整示例 + +```python +import logging +from sunvpy import SSProcess + +# 配置日志记录器 +logger = logging.getLogger('batch_process') +logger.setLevel(logging.INFO) +file_handler = logging.FileHandler('batch_process.log', encoding='utf-8') +formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') +file_handler.setFormatter(formatter) +logger.addHandler(file_handler) + +# 将日志注入到 SSProcess +SSProcess.set_logger(logger) + +def batch_process_objects(): + """批量处理对象,配合进度条和日志""" + + logger.info("开始批量处理任务") + + # 获取选择集数量 + total_count = SSProcess.getSelGeoCount() + logger.info(f"选择集对象数量: {total_count}") + + if total_count == 0: + logger.warning("选择集为空,跳过处理") + return + + # 启动进度条 + SSProcess.startProgress("批量处理对象", total_count) + + success_count = 0 + error_count = 0 + + try: + for i in range(total_count): + try: + # 执行业务逻辑 + process_single_object(i) + + # 记录详细日志 + logger.debug(f"成功处理对象 {i+1}/{total_count}") + success_count += 1 + + except Exception as e: + # 记录错误日志 + logger.error(f"处理对象 {i+1} 失败: {str(e)}") + error_count += 1 + + # 更新进度条 + SSProcess.stepProgress(f"处理进度: {i+1}/{total_count}") + + finally: + # 关闭进度条 + SSProcess.closeProgress() + + # 记录汇总日志 + logger.info(f"处理完成: 成功 {success_count} 个, 失败 {error_count} 个") + +def process_single_object(index): + """处理单个对象的业务逻辑""" + # 这里实现具体的处理逻辑 + obj_name = SSProcess.getSelGeoValue(index, "SSObj_Name") + SSProcess.setSelGeoValue(index, "SSObj_Name", f"{obj_name}_已处理") + +# 调用示例 +batch_process_objects() + +# 输出示例: +# 2024-01-15 10:30:00 - INFO - 开始批量处理任务 +# 2024-01-15 10:30:00 - INFO - 选择集对象数量: 100 +# 2024-01-15 10:30:05 - INFO - 处理完成: 成功 98 个, 失败 2 个 +# 2024-01-15 10:30:05 - ERROR - 处理对象 15 失败: 无法获取属性值 +``` + +### 日志级别与进度条的配合策略 + +| 操作阶段 | 进度条操作 | 日志级别 | 说明 | +|----------|-----------|---------|------| +| 任务开始 | startProgress | INFO | 记录任务启动,包含总数量 | +| 每个循环 | stepProgress | DEBUG | 记录详细信息(可关闭) | +| 子任务成功 | - | DEBUG | 记录成功的详细步骤 | +| 子任务失败 | - | ERROR | 记录失败的原因和堆栈 | +| 任务结束 | closeProgress | INFO | 记录任务完成,包含统计 | + +这种配合方式的优势在于:**进度条提供实时视觉反馈,日志提供可追溯的详细记录**,两者互为补充,满足不同场景的需求。 + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L32-L80), [log_mixin.py](ssprocess_mixins/log_mixin.py#L26-L42) + +## 常见问题与解决方案 + +### 问题一:进度条不显示 + +**现象**:调用 `startProgress()` 后进度条没有显示。 + +**可能原因及解决方案**: + +| 原因 | 检查方法 | 解决方案 | +|------|---------|----------| +| 已禁用进度条 | 检查 `SSProcess.enable_progress` | 调用 `SSProcess.enable_progress = True` 重新启用 | +| 总任务数为0 | 检查传入的 `total` 参数 | 确保传入有效的正整数 | +| 主线程阻塞 | 检查是否有耗时操作在主线程 | 将耗时操作放到子线程中执行 | + +```python +# 检查进度条状态 +print(f"进度条启用状态: {SSProcess.enable_progress}") + +# 重新启用进度条 +SSProcess.enable_progress = True +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L24-L30) + +### 问题二:进度条卡住不动 + +**现象**:进度条显示后长时间没有更新。 + +**可能原因及解决方案**: + +```python +# 错误示例:步进过大导致进度条长时间不更新 +SSProcess.startProgress("处理", 100000) # 任务数过大 +for i in range(100000): + process_item(i) + # 每1000次才会更新一次进度,看起来像卡住 + SSProcess.stepProgress(f"处理 {i}") + +# 正确示例:提供更有意义的进度提示 +SSProcess.startProgress("处理", 100000) +for i in range(100000): + process_item(i) + # 进度条内部会智能控制更新频率,但提示信息会实时显示 + SSProcess.stepProgress(f"处理 {i+1}/{100000}") +``` + +Sources: [PySSWidget.py](PySSWidget.py#L950-L972) + +### 问题三:进度条关闭后程序无响应 + +**现象**:调用 `closeProgress()` 后程序似乎卡住。 + +**解决方案**: + +```python +# 原因分析:进度条关闭操作在UI线程执行,可能被其他操作阻塞 + +# 解决方案1:确保在主线程中关闭 +def close_progress_safely(): + if SSProcess.progress is not None: + try: + closeProgress() + except Exception as e: + print(f"关闭进度条时出错: {e}") + finally: + SSProcess.progress = None + +close_progress_safely() + +# 解决方案2:使用超时机制 +import threading +import time + +def close_with_timeout(timeout=5): + def _close(): + try: + closeProgress() + except: + pass + + thread = threading.Thread(target=_close) + thread.start() + thread.join(timeout=timeout) + + if thread.is_alive(): + print("警告:进度条关闭超时") + SSProcess.progress = None + +close_with_timeout() +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L62-L80) + +## 最佳实践总结 + +### 1. 进度条使用检查清单 + +在使用进度条前,请确认以下要点: + +| 检查项 | 说明 | +|--------|------| +| ✓ 确认总任务数 | 使用准确的数字初始化进度条,避免0或负数 | +| ✓ 在try前启动 | 确保进度条启动在try块之前 | +| ✓ 在finally中关闭 | 使用try-finally确保进度条一定会被关闭 | +| ✓ 提供有意义的提示 | `stepProgress` 的message应反映当前操作状态 | +| ✓ 考虑禁用场景 | 自动化任务中考虑使用 `disable_progress()` | + +### 2. 性能优化建议 + +| 优化点 | 说明 | 示例 | +|--------|------|------| +| 减少UI更新 | 利用 `Progress.step()` 的自动步进机制 | 不需要手动计算更新频率 | +| 异步关闭 | 大任务完成后考虑异步关闭进度条 | 使用子线程关闭避免阻塞 | +| 条件显示 | 根据任务时长决定是否显示进度条 | 短任务(<1秒)跳过进度条 | + +### 3. 代码模板 + +```python +# 标准进度条使用模板 +from sunvpy import SSProcess + +def task_with_progress(): + """带进度条的标准任务模板""" + + # 1. 获取总任务数 + total = get_task_count() + if total == 0: + return + + # 2. 启动进度条 + SSProcess.startProgress("任务描述", total) + + try: + # 3. 执行循环任务 + for i in range(total): + # 执行业务逻辑 + do_work(i) + + # 4. 更新进度 + SSProcess.stepProgress(f"处理 {i+1}/{total}") + + except Exception as e: + # 5. 错误处理 + SSProcess.logger.error(f"任务失败: {e}") + raise + + finally: + # 6. 确保关闭 + SSProcess.closeProgress() +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L15-L80) + +## 下一步学习 + +掌握了进度条的基本使用后,您可以继续学习以下相关主题: + +- [配置日志记录器](37-pei-zhi-ri-zhi-ji-lu-qi) — 了解如何将日志与进度条配合,构建完整的反馈机制 +- [错误处理与异常管理](39-cuo-wu-chu-li-yu-yi-chang-guan-li) — 学习在进度条操作中正确处理异常 +- [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku) — 查看进度条在实际批量操作中的应用示例 + +通过这些内容的学习,您将能够构建出用户体验良好、健壮性强的 SunvStation 脚本应用。 \ No newline at end of file diff --git a/docs/content/39-cuo-wu-chu-li-yu-yi-chang-guan-li.md b/docs/content/39-cuo-wu-chu-li-yu-yi-chang-guan-li.md new file mode 100644 index 0000000..2ac6d8d --- /dev/null +++ b/docs/content/39-cuo-wu-chu-li-yu-yi-chang-guan-li.md @@ -0,0 +1,1047 @@ +错误处理与异常管理是构建健壮 SunvStation 脚本的核心能力。通过系统化的错误处理机制,您的脚本能够优雅地处理异常情况、记录关键错误信息、确保数据完整性,并在用户界面中提供清晰的反馈。本页面将深入解析 sunvpy 库的错误处理架构、实用模式和最佳实践。 + +## 错误处理架构概览 + +sunvpy 库采用分层设计,通过 **LogMixin** 混入类提供统一的错误记录能力,结合多种防御性编程模式形成完整的错误处理体系。这种架构将错误记录、异常捕获和状态验证分离到不同层次,确保代码的可维护性和扩展性。 + +```mermaid +classDiagram + class Logger { + <> + +debug(msg) + +info(msg) + +warning(msg) + +error(msg) + +critical(msg) + } + + class LogAware { + <<抽象基类>> + +set_logger(Logger)* + +log_error_msg(str)* + } + + class LogMixin { + +Logger logger + +set_logger(Logger) + +log_error_msg(str) + } + + class SSProcessManager { + +Logger logger + +log_error_msg(str) + } + + class ErrorPatterns { + <<错误处理模式>> + +null_check_return + +type_conversion_try + +silent_exception_pass + +early_return_validation + } + + LogAware <|-- LogMixin + LogMixin <|-- SSProcessManager + SSProcessManager ..> Logger : 使用 + SSProcessManager ..> ErrorPatterns : 应用 +``` + +这种架构设计的核心优势在于**关注点分离**:业务逻辑代码通过统一的 `log_error_msg()` 接口记录错误,而日志的具体输出配置由您完全掌控。错误处理模式则分布在各个 Mixin 类中,针对不同场景提供灵活的应对策略。 + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L19-L42), [PySSProcess.py](PySSProcess.py#L34-L35) + +## 错误处理机制层次 + +sunvpy 的错误处理分为四个层次,每个层次应对不同类型的错误场景。理解这个层次结构对于编写健壮的脚本至关重要。 + +```mermaid +flowchart LR + A[错误输入] --> B[第一层:参数验证
空值检查/范围检查] + B --> C{是否通过?} + C -->|否| D[返回默认值/空值
记录警告日志] + C -->|是| E[第二层:类型转换
try-except 捕获] + E --> F{转换成功?} + F -->|否| G[使用容错值/返回 False
记录错误日志] + F -->|是| H[第三层:业务操作
空指针检查] + H --> I{操作成功?} + I -->|否| J[返回空结果/失败标志
记录错误日志] + I -->|是| K[第四层:资源清理
try-finally 确保] + K --> L[正常返回结果] + + style D fill:#fff4e1 + style G fill:#ffe1e1 + style J fill:#ffe1e1 + style L fill:#e1ffe1 +``` + +### 第一层:参数验证与空值检查 + +这是错误处理的第一道防线,通过前置条件检查防止无效输入进入核心逻辑。sunvpy 广泛使用**边界检查**和**空值检查**模式。 + +**空值检查返回默认值模式:** + +```python +def getSysSelGeoList(self): + """获取当前选中的几何对象列表。""" + map = self.getCurrentMap() + if map is None: + return None # 空值检查,返回 None 表示失败 + return GeoBaseList(map.m_selGeoList) +``` + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L133-L140) + +**边界检查返回空字符串模式:** + +```python +def getSelGeoValue(self, index: int, fieldName: str) -> str: + """获取当前选择集中特定几何对象的属性值。""" + if index < 0 or index >= len(self.selGeoList): + return "" # 边界检查,返回空字符串 + geo = self.selGeoList[index] + if geo is None: + return "" # 空值检查 + # ... 后续逻辑 +``` + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L156-L165) + +### 第二层:类型转换异常捕获 + +当涉及字符串到数值的转换时,sunvpy 使用 try-except 块捕获 `ValueError` 异常,并提供容错机制或失败标记。 + +**类型转换容错模式:** + +```python +def setSelGeoValue(self, index: int, fieldName: str, value: str): + """设置当前选择集中特定几何对象的属性值。""" + # ... 前置检查代码 + if fieldName.lower() == "ssobj_code": + # 类型转换容错:若不能转为 int 则直接用原值 + try: + code_value = int(value) + except Exception: + code_value = value # 容错处理 + for geo in geoList: + geo.setCode(code_value) +``` + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L368-L376) + +**类型转换失败返回 False 模式:** + +```python +case "ssobj_angle": + try: + angle = float(value) + geo.setAngle(angle) + except ValueError: + return False # 转换失败,返回 False 标记 +``` + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L313-L317) + +| 错误类型 | 异常类 | 处理策略 | 使用场景 | +|---------|--------|---------|---------| +| 数值转换失败 | `ValueError` | 返回 False 或使用容错值 | 角度、比例、时间等数值属性设置 | +| 参数类型错误 | `TypeError` | 返回 False 或跳过操作 | 几何对象属性赋值 | +| 通用异常 | `Exception` | 使用容错值或静默处理 | 关键操作的容错处理 | + +### 第三层:业务操作错误处理 + +在执行地理空间操作时,可能遇到数据源不可用、数据集不存在等运行时错误。sunvpy 通过**错误日志记录**和**提前返回**模式处理这类错误。 + +**错误日志记录模式:** + +```python +def createNewObjByCode(self, code: int) -> tuple: + """根据指定的代码创建一个新的几何对象。""" + self.curNewObj = (None, None) # 重置当前新建对象 + ds_eps = self.map.getCurrentDataSourceEPS() + if ds_eps is None: + self.log_error_msg("无法获取当前数据源!") # 记录错误 + return self.curNewObj # 返回空元组 + + fea = ds_eps.getFeature(code) + if fea is None: + fea = ds_eps.getFeature(0) + dataset = getDatasetByFeaCode(ds_eps, fea) + if dataset is None: + self.log_error_msg(f"无法获取数据集, code:{code}") # 记录错误 + return self.curNewObj # 返回空元组 + # ... 后续逻辑 +``` + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L167-L215) + +**错误日志与循环继续模式:** + +```python +def persistTempGeoList(self, geoVec: GeoBaseVector): + """将临时几何对象列表持久化到地图中。""" + for i in range(geoVec.size()): + geo: GeoBase = geoVec.at(i) + code = geo.getCode() + fea = ds_eps.getFeature(code) + if fea is None: + fea = ds_eps.getFeature(0) + dataset = getDatasetByFeaCode(ds_eps, fea) + if dataset is None: + self.log_error_msg(f"无法获取数据集, code:{code}") + continue # 跳过当前对象,继续处理下一个 + obj = GeoObject(dataset, generateUniqueId()) + obj.setGeoBase(geo) + persistVec.push_back(geo, obj) + return persistVec +``` + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L595-L615) + +### 第四层:静默异常处理 + +对于非关键操作(如进度条关闭、UI 清理),sunvpy 使用静默异常处理模式,确保即使操作失败也不会影响主流程。 + +**静默异常处理模式:** + +```python +def disable_progress(self): + """关闭进度条显示并立即关闭正在显示的进度条。""" + self.enable_progress = False + if self.progress is not None: + try: + closeProgress() # 尝试关闭进度条 + except Exception: + pass # 静默处理,不中断流程 + self.progress = None +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L46-L53) + +| 处理模式 | 适用场景 | 优点 | 缺点 | +|---------|---------|------|------| +| **异常抛出** | 关键错误、不可恢复状态 | 强制调用方处理,问题可见 | 需要额外 try-except 代码 | +| **日志记录** | 可恢复错误、业务逻辑错误 | 不中断流程,便于追踪 | 需要配置日志系统 | +| **返回失败值** | 可选操作、容错场景 | 调用方灵活处理 | 需要检查返回值 | +| **静默处理** | 非关键清理、UI 操作 | 简洁,不影响主流程 | 错误信息丢失 | + +## 错误日志记录机制 + +sunvpy 通过 `LogMixin` 提供统一的错误日志记录接口,支持将自定义配置的 Logger 注入到 SSProcess 中。这种设计允许您灵活控制日志的输出方式、格式和存储位置。 + +### 日志记录接口 + +`LogMixin` 提供两个核心方法用于日志记录: + +| 方法 | 签名 | 功能 | 使用场景 | +|------|------|------|---------| +| `set_logger()` | `set_logger(logger: Logger)` | 注入自定义日志记录器 | 脚本初始化时配置 | +| `log_error_msg()` | `log_error_msg(error_msg: str)` | 记录错误消息 | 发生错误时调用 | + +**LogMixin 实现细节:** + +```python +class LogMixin(LogAware): + """Mixin class for logging operations""" + logger : Optional[Logger] = None + + def set_logger(self, logger: Logger): + self.logger = logger + + def log_error_msg(self, error_msg: str): + print("error log in!") + if self.logger is not None: + self.logger.error(error_msg) # 调用标准库 Logger 的 error 方法 +``` + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L32-L42) + +### 日志配置流程 + +配置错误日志记录需要创建 Logger 实例、设置处理器和格式化器,最后注入到 SSProcess 中。 + +```mermaid +flowchart TD + A[开始配置日志] --> B[创建 Logger 实例
logging.getLogger'script_name'] + B --> C[创建 FileHandler
输出到文件] + C --> D[创建 StreamHandler
输出到控制台] + D --> E[设置 Formatter
定义日志格式] + E --> F[配置日志级别
DEBUG/INFO/WARNING/ERROR] + F --> G[添加 Handler 到 Logger] + G --> H[调用 SSProcess.set_logger'logger'] + H --> I[日志配置完成] + + I --> J{调用 log_error_msg} + J -->|logger 未配置| K[仅打印到控制台] + J -->|logger 已配置| L[按配置输出到文件/控制台] + + style H fill:#e1f5ff + style L fill:#e1ffe1 +``` + +**完整日志配置示例:** + +```python +import logging +from sunvpy import SSProcess + +# 步骤 1:创建 Logger 实例 +logger = logging.getLogger('my_script') +logger.setLevel(logging.DEBUG) + +# 步骤 2:创建文件处理器 +file_handler = logging.FileHandler('script_log.log', mode='a', encoding='utf-8') +file_handler.setLevel(logging.ERROR) # 只记录 ERROR 及以上级别 + +# 步骤 3:创建控制台处理器 +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.WARNING) # 只显示 WARNING 及以上级别 + +# 步骤 4:设置格式化器 +formatter = logging.Formatter( + fmt='%(asctime)s [%(filename)s:%(lineno)d] %(levelname)s: %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) +file_handler.setFormatter(formatter) +console_handler.setFormatter(formatter) + +# 步骤 5:将处理器添加到 Logger +logger.addHandler(file_handler) +logger.addHandler(console_handler) + +# 步骤 6:注入到 SSProcess +SSProcess.set_logger(logger) + +# 步骤 7:使用示例 +SSProcess.createNewObjByCode(3103013) # 如果出错,会记录到日志 +``` + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L26-L42) + +### 日志级别选择指南 + +根据错误的严重程度和影响范围,合理选择日志级别对于问题诊断至关重要。 + +| 日志级别 | 错误类型 | 示例场景 | 处理策略 | +|---------|---------|---------|---------| +| DEBUG | 调试信息 | 对象创建过程、参数传递细节 | 仅开发阶段启用 | +| INFO | 重要操作 | 脚本开始/结束、批量处理完成 | 记录关键执行节点 | +| WARNING | 潜在问题 | 使用默认值、对象不存在但可继续 | 不影响脚本运行 | +| ERROR | 错误但可恢复 | 数据源不可用、数据集获取失败 | 记录详细错误信息 | +| CRITICAL | 严重错误 | 无法恢复的异常、致命失败 | 建议终止脚本执行 | + +**最佳实践:为关键操作添加错误日志记录** + +```python +def batch_export_data(dataset_name: str): + """批量导出数据示例""" + # 关键操作前记录日志 + SSProcess.logger.info(f"开始批量导出数据集: {dataset_name}") + + try: + dataset = SSProcess.map.getDataset(dataset_name) + if dataset is None: + SSProcess.logger.error(f"数据集不存在: {dataset_name}") + return False + + SSProcess.startProgress("批量导出", 1000) + for i in range(1000): + # ... 导出逻辑 + SSProcess.stepProgress(f"处理第 {i} 条记录") + + SSProcess.logger.info(f"批量导出完成,共处理 1000 条记录") + SSProcess.closeProgress() + return True + + except Exception as e: + SSProcess.logger.critical(f"批量导出发生严重错误: {str(e)}") + SSProcess.closeProgress() + return False +``` + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L590-L615) + +## 常见错误场景与处理策略 + +了解 sunvpy 中的常见错误场景及其标准处理模式,能够帮助您编写更加健壮的脚本。以下总结了几类典型错误及其推荐处理策略。 + +### 场景一:数据源和数据集访问错误 + +访问地理空间数据时,经常遇到数据源不可用或数据集不存在的情况。 + +| 错误场景 | 检测方法 | 推荐处理策略 | +|---------|---------|-------------| +| 数据源不可用 | `getCurrentDataSourceEPS()` 返回 None | 记录错误日志,返回空结果 | +| 数据集不存在 | `getDataset()` 返回 None | 记录错误日志,跳过当前对象 | +| 特征代码无效 | `getFeature(code)` 返回 None | 使用默认特征代码 0 | + +**标准处理模式:** + +```python +def createGeoObjectByCode(self, code: int): + """根据编码创建地理对象的标准错误处理模式""" + # 获取数据源 + ds_eps = self.map.getCurrentDataSourceEPS() + if ds_eps is None: + self.log_error_msg("无法获取当前数据源!") + return (None, None) # 返回空元组 + + # 获取特征 + fea = ds_eps.getFeature(code) + if fea is None: + fea = ds_eps.getFeature(0) # 使用默认特征 + if fea is None: + self.log_error_msg(f"无法获取特征,code: {code}") + return (None, None) + + # 获取数据集 + dataset = getDatasetByFeaCode(ds_eps, fea) + if dataset is None: + self.log_error_msg(f"无法获取数据集,code: {code}") + return (None, None) + + # 创建对象 + obj_type = fea.nObjectType + obj, geo = self.createDefaultGeoBase(obj_type, dataset) + if obj is None or geo is None: + self.log_error_msg(f"创建地物失败,code: {code}") + return (None, None) + + return (obj, geo) +``` + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L167-L225) + +### 场景二:属性类型转换错误 + +设置对象属性时,需要将字符串值转换为正确的数据类型(int、float、日期等),可能遇到格式错误。 + +| 属性类型 | 目标类型 | 转换错误处理 | +|---------|---------|-------------| +| 角度、比例 | float | 捕获 ValueError,返回 False | +| 编码、线型 | int | 捕获 Exception,使用原值容错 | +| 创建/修改时间 | DateTime | 捕获 ValueError,返回 False | +| 坐标值 | float | 捕获 ValueError,返回 False | + +**类型转换错误处理模式:** + +```python +def setPropertyWithValidation(self, geo: GeoBase, field_name: str, value: str) -> bool: + """带类型转换验证的属性设置方法""" + field_name = field_name.lower().strip() + + match field_name: + case "ssobj_angle" | "ssobj_scalex" | "ssobj_scaley": + try: + float_value = float(value) + geo.setAngle(float_value) if field_name == "ssobj_angle" else None + # ... 其他赋值逻辑 + return True + except ValueError: + self.log_error_msg(f"数值转换失败: {field_name} = {value}") + return False + + case "ssobj_createtime" | "ssobj_modifytime": + try: + datetime_value = parseDateTime(value) + geo.setCreateTime(datetime_value) if field_name == "ssobj_createtime" else None + return True + except ValueError: + self.log_error_msg(f"日期转换失败: {field_name} = {value}") + return False + + case "ssobj_code": + try: + int_value = int(value) + geo.setCode(int_value) + return True + except Exception: + # 容错处理:保持原值 + self.log_error_msg(f"编码转换失败,保持原值: {value}") + return True + + case _: + # 其他属性直接设置 + geo.setObjName(value) + return True +``` + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L310-L390) + +### 场景三:索引越界与空对象访问 + +在遍历选择集或访问集合元素时,可能遇到索引越界或空对象引用错误。 + +| 错误场景 | 检测条件 | 推荐处理 | +|---------|---------|---------| +| 索引越界 | `index < 0` 或 `index >= len(list)` | 返回空值,记录警告 | +| 空对象引用 | `obj is None` | 跳过处理,返回 False | +| 列表为空 | `list.empty() is True` | 直接返回,不执行操作 | + +**集合访问安全模式:** + +```python +def safeGetGeoValue(self, index: int, field_name: str) -> str: + """安全的属性值获取方法""" + # 第一层检查:索引边界 + if index < 0 or index >= len(self.selGeoList): + self.log_error_msg(f"索引越界: {index}, 选择集大小: {len(self.selGeoList)}") + return "" + + # 第二层检查:对象是否为 None + geo = self.selGeoList[index] + if geo is None: + self.log_error_msg(f"索引 {index} 处的对象为空") + return "" + + # 第三层检查:属性是否存在 + if field_name.startswith('['): + # 扩展属性 + fields, values = StringArray(), StringArray() + self.map.getExtentAttr(geo, fields, values) + idx = self.findIndexInStringArray(field_name[1:-1], fields) + if idx == -1: + return "" # 属性不存在,返回空字符串 + return values[idx] + else: + # 基本属性 + return self.objBaseAttr.getGeoValue(self.map, geo, field_name) +``` + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L156-L190) + +### 场景四:资源清理错误 + +在进度条关闭、图形释放等资源清理操作中,可能遇到异常,但不应中断主流程。 + +| 操作类型 | 异常原因 | 推荐处理 | +|---------|---------|---------| +| 关闭进度条 | UI 已关闭、句柄无效 | try-except 静默处理 | +| 释放图形 | 图形已被释放 | 检查对象状态后操作 | +| 清除选择集 | 选择集为空 | 检查状态后再清理 | + +**资源清理模式:** + +```python +def cleanupResources(self): + """安全的资源清理方法""" + # 安全关闭进度条 + if self.progress is not None: + try: + closeProgress() + except Exception: + pass # 静默处理,不中断流程 + finally: + self.progress = None + + # 安全释放图形 + for geo in self.selGeoList: + if geo is not None: + try: + geo.freeGraphics() + except Exception: + pass # 静默处理 + + # 安全清除选择集 + try: + self.selGeoList.clear() + self.selNoteList.clear() + except Exception: + pass # 清理失败不影响其他操作 +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L46-L53) + +## 错误处理最佳实践 + +基于 sunvpy 库的设计理念和实际应用经验,以下错误处理最佳实践将帮助您构建更加健壮和可维护的脚本。 + +### 实践一:前置条件检查 + +在任何操作开始前进行参数和状态验证,遵循"**先检查,后执行**"的原则。 + +```python +def updateGeoAttributes(self, index: int, attributes: dict) -> bool: + """更新地物属性的最佳实践示例""" + # 前置条件 1:检查选择集不为空 + if len(self.selGeoList) == 0: + self.log_error_msg("选择集为空,无法更新属性") + return False + + # 前置条件 2:检查索引有效性 + if index < 0 or index >= len(self.selGeoList): + self.log_error_msg(f"索引无效: {index}") + return False + + # 前置条件 3:检查参数不为空 + if not attributes: + self.log_error_msg("属性字典为空") + return False + + # 前置条件 4:检查地图可用 + if self.map is None: + self.log_error_msg("地图实例不可用") + return False + + # 通过所有验证后,执行核心逻辑 + geo = self.selGeoList[index] + success_count = 0 + for field, value in attributes.items(): + if self.setSelGeoValue(index, field, str(value)): + success_count += 1 + else: + self.log_error_msg(f"设置属性失败: {field} = {value}") + + return success_count > 0 +``` + +### 实践二:精确的异常捕获 + +避免使用过于宽泛的 `except Exception`,优先捕获具体的异常类型,提高错误定位的准确性。 + +| 推荐做法 | 不推荐做法 | 原因 | +|---------|-----------|------| +| `except ValueError` | `except Exception` | 捕获精确的异常类型 | +| `except (ValueError, TypeError)` | `except` | 明确捕获多种预期异常 | +| 先捕获具体异常,最后捕获 Exception | 只捕获 Exception | 分层处理不同错误 | + +**精确异常捕获示例:** + +```python +def convertAngleValue(self, value: str) -> Optional[float]: + """角度值转换的精确异常处理""" + try: + return float(value) + except ValueError: + self.log_error_msg(f"角度值格式错误: {value}") + return None + except TypeError: + self.log_error_msg(f"角度值类型错误,应为字符串: {type(value)}") + return None + except Exception as e: + self.log_error_msg(f"角度值转换发生未预期错误: {str(e)}") + return None +``` + +### 实践三:错误恢复与回滚 + +对于涉及多个步骤的操作,实现错误恢复机制,确保失败时能够回滚到一致状态。 + +```python +def batchUpdateWithRollback(self, indices: list, field_name: str, value: str) -> bool: + """带回滚机制的批量更新""" + # 保存原始值 + original_values = [] + valid_indices = [] + + for idx in indices: + if 0 <= idx < len(self.selGeoList): + original_value = self.getSelGeoValue(idx, field_name) + original_values.append(original_value) + valid_indices.append(idx) + + if not valid_indices: + self.log_error_msg("没有有效的索引需要更新") + return False + + # 执行更新 + updated_count = 0 + for i, idx in enumerate(valid_indices): + if self.setSelGeoValue(idx, field_name, value): + updated_count += 1 + else: + # 更新失败,执行回滚 + self.log_error_msg(f"索引 {idx} 更新失败,开始回滚...") + for j, rollback_idx in enumerate(valid_indices[:i]): + self.setSelGeoValue(rollback_idx, field_name, original_values[j]) + return False + + self.logger.info(f"批量更新成功: {updated_count} 个对象") + return True +``` + +### 实践四:日志与用户反馈结合 + +将技术性的错误日志与面向用户的友好反馈结合,提升用户体验。 + +```python +def importDataWithFeedback(self, file_path: str) -> bool: + """带用户反馈的数据导入""" + try: + # 技术日志 + self.logger.info(f"开始导入文件: {file_path}") + + # 用户反馈 + SSProcess.startProgress("数据导入", 100) + SSProcess.stepProgress("正在读取文件...") + + # 导入逻辑 + # ... 执行导入操作 + + SSProcess.stepProgress("导入完成") + SSProcess.closeProgress() + + # 成功日志 + self.logger.info(f"文件导入成功: {file_path}") + return True + + except FileNotFoundError: + # 技术日志 + self.logger.error(f"文件不存在: {file_path}") + # 用户反馈(通过进度条标题) + SSProcess.startProgress("导入失败", 1) + SSProcess.stepProgress(f"错误:文件不存在 - {file_path}") + SSProcess.closeProgress() + return False + + except PermissionError: + self.logger.error(f"文件访问权限不足: {file_path}") + SSProcess.startProgress("导入失败", 1) + SSProcess.stepProgress("错误:无文件访问权限") + SSProcess.closeProgress() + return False + + except Exception as e: + self.logger.critical(f"导入发生严重错误: {str(e)}") + SSProcess.startProgress("导入失败", 1) + SSProcess.stepProgress("错误:未知错误,请查看日志") + SSProcess.closeProgress() + return False +``` + +### 实践五:错误码与状态管理 + +为不同的错误场景定义清晰的错误码,便于调用方根据错误类型采取不同的恢复策略。 + +```python +class ScriptError: + """脚本错误码定义""" + SUCCESS = 0 + INVALID_PARAM = 1 + DATA_SOURCE_ERROR = 2 + DATASET_ERROR = 3 + CONVERSION_ERROR = 4 + INDEX_OUT_OF_RANGE = 5 + OBJECT_NULL = 6 + +def createObjectWithErrorCode(self, code: int) -> tuple[int, tuple]: + """带错误码的对象创建方法""" + # 检查数据源 + ds_eps = self.map.getCurrentDataSourceEPS() + if ds_eps is None: + self.log_error_msg("数据源不可用") + return (ScriptError.DATA_SOURCE_ERROR, (None, None)) + + # 检查特征 + fea = ds_eps.getFeature(code) + if fea is None: + fea = ds_eps.getFeature(0) + if fea is None: + self.log_error_msg(f"特征代码无效: {code}") + return (ScriptError.DATASET_ERROR, (None, None)) + + # 检查数据集 + dataset = getDatasetByFeaCode(ds_eps, fea) + if dataset is None: + self.log_error_msg(f"数据集不存在,code: {code}") + return (ScriptError.DATASET_ERROR, (None, None)) + + # 创建对象 + obj_type = fea.nObjectType + obj, geo = self.createDefaultGeoBase(obj_type, dataset) + if obj is None or geo is None: + self.log_error_msg(f"对象创建失败,code: {code}") + return (ScriptError.DATASET_ERROR, (None, None)) + + return (ScriptError.SUCCESS, (obj, geo)) + +# 使用示例 +error_code, (obj, geo) = SSProcess.createObjectWithErrorCode(3103013) +if error_code == ScriptError.SUCCESS: + print("对象创建成功") +elif error_code == ScriptError.DATA_SOURCE_ERROR: + print("请检查数据源配置") +elif error_code == ScriptError.DATASET_ERROR: + print("请检查数据集和特征代码") +``` + +## 错误调试与问题排查 + +当脚本遇到错误时,系统化的调试流程能够快速定位问题根源。本节提供一套完整的错误调试方法论。 + +### 错误调试流程 + +```mermaid +flowchart TD + A[脚本发生错误] --> B{是否已配置日志?} + B -->|否| C[配置日志记录器
参考[配置日志记录器] 37-pei-zhi-ri-zhi-ji-lu-qi] + B -->|是| D[检查日志文件
查找 ERROR/CRITICAL 级别消息] + C --> D + D --> E{错误类型判断} + + E -->|数据源/数据集错误| F[检查数据源连接
验证数据集名称] + E -->|类型转换错误| G[检查输入值格式
验证数据类型] + E -->|索引越界错误| H[检查选择集大小
验证索引范围] + E -->|空对象引用错误| I[检查对象初始化
验证对象状态] + E -->|未知错误| J[启用 DEBUG 级别日志
添加详细打印信息] + + F --> K[修复问题] + G --> K + H --> K + I --> K + J --> L[分析堆栈跟踪
定位代码位置] + L --> K + + K --> M[重新运行脚本
验证修复效果] + M --> N{问题解决?} + N -->|是| O[调试完成] + N -->|否| P[重复调试流程] + + style C fill:#fff4e1 + style K fill:#e1ffe1 + style O fill:#e1ffe1 +``` + +### 常见错误排查清单 + +| 错误现象 | 可能原因 | 排查步骤 | 相关页面 | +|---------|---------|---------|---------| +| "无法获取当前数据源" | 工作空间未初始化或数据源关闭 | 检查 [工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian) | - | +| "无法获取数据集" | 图层名称错误或图层不存在 | 验证图层名称,使用 [获取工作空间信息](34-huo-qu-gong-zuo-kong-jian-xin-xi) | - | +| "索引越界" | 选择集为空或索引超出范围 | 使用 [获取选择集对象数量](14-bian-li-xuan-ze-ji-dui-xiang) 检查 | - | +| "角度/比例转换失败" | 输入值格式不正确 | 验证输入值,确保为数字字符串 | - | +| "对象创建失败" | 特征代码无效或对象类型不支持 | 参考 [地理对象类型定义](42-di-li-dui-xiang-lei-xing-ding-yi) | - | + +### 调试辅助代码 + +以下辅助函数可以帮助您在调试时获取详细的系统状态信息。 + +```python +def printSystemStatus(): + """打印系统状态信息,用于调试""" + print("=" * 60) + print("SunvStation 系统状态") + print("=" * 60) + + # 工作空间状态 + workspace = SSProcess.getWorkspace() + if workspace: + print(f"✓ 工作空间已初始化") + map = workspace.getCurrentScaleMap() + if map: + print(f"✓ 当前地图已加载") + print(f" - 图层数量: {map.getLayerSize()}") + print(f" - 总对象数: {map.getObjectSize(e_Null_Obj)}") + else: + print(f"✗ 当前地图未加载") + else: + print(f"✗ 工作空间未初始化") + + # 数据源状态 + if SSProcess.map: + ds_eps = SSProcess.map.getCurrentDataSourceEPS() + if ds_eps: + print(f"✓ 数据源已连接") + else: + print(f"✗ 数据源未连接") + + # 选择集状态 + geo_count = SSProcess.getSelGeoCount() + note_count = SSProcess.getSelNoteCount() + print(f"✓ 选择集状态: {geo_count} 个地物, {note_count} 个注记") + + # 日志状态 + if SSProcess.logger: + print(f"✓ 日志记录器已配置: {SSProcess.logger.name}") + print(f" - 日志级别: {logging.getLevelName(SSProcess.logger.level)}") + print(f" - 处理器数量: {len(SSProcess.logger.handlers)}") + else: + print(f"✗ 日志记录器未配置") + + # 进度条状态 + if SSProcess.progress: + print(f"✓ 进度条已启动") + else: + print(f" 进度条未启动") + + print("=" * 60) + +# 使用示例 +printSystemStatus() +``` + +## 错误处理与相关功能的集成 + +错误处理机制与 sunvpy 的其他核心功能紧密协作,形成完整的脚本开发生态。理解这些集成关系有助于您构建更加全面的解决方案。 + +### 错误处理与进度条管理 + +进度条操作与错误处理密切相关,特别是在长时间运行的任务中。当发生错误时,需要正确关闭进度条,避免 UI 卡顿。 + +```python +def batchProcessWithErrorHandling(self, total_count: int) -> bool: + """批量操作中的错误处理与进度条协作""" + try: + SSProcess.startProgress("批量处理", total_count) + + for i in range(total_count): + try: + # 执行单次处理 + result = self.processSingleItem(i) + + if result: + SSProcess.stepProgress(f"处理完成: {i+1}/{total_count}") + else: + self.log_error_msg(f"项目处理失败: {i}") + # 继续处理下一个项目,不中断整个流程 + + except Exception as e: + self.log_error_msg(f"项目处理发生异常: {i}, 错误: {str(e)}") + # 继续处理下一个项目 + + SSProcess.closeProgress() + return True + + except Exception as e: + # 外层异常,确保进度条关闭 + self.logger.critical(f"批量操作严重错误: {str(e)}") + try: + SSProcess.closeProgress() + except Exception: + pass # 静默处理关闭错误 + return False +``` + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L32-L80) + +### 错误处理与对象缓存机制 + +对象缓存操作中的错误需要特别小心,避免导致数据不一致。当缓存操作失败时,需要清理相关状态。 + +```python +def saveBufferWithValidation(self) -> bool: + """带验证的对象缓存保存""" + try: + # 验证缓存不为空 + if (self.bufferObjList.empty() and + self.bufferNoteList.empty() and + len(self.newBufferObjList) == 0 and + len(self.newBufferNoteList) == 0): + self.logger.info("缓存为空,无需保存") + return True + + # 保存新建对象 + all_new_objs = self.newBufferObjList + self.newBufferNoteList + if all_new_objs: + for obj, geo in all_new_objs: + try: + if geo is None: + self.log_error_msg("新建对象为空,跳过保存") + continue + dataset = geo.getDatasetName() + if not dataset: + self.log_error_msg("对象数据集名称为空,跳过保存") + continue + # ... 保存逻辑 + except Exception as e: + self.log_error_msg(f"保存对象失败: {str(e)}") + continue + + # 保存修改对象 + if not self.bufferObjList.empty(): + self.transMemoDataToExtendAttr(self.bufferObjList) + self.map.saveDatabase(self.bufferObjList) + + if not self.bufferNoteList.empty(): + self.transMemoDataToExtendAttr(self.bufferNoteList) + self.map.saveDatabase(self.bufferNoteList) + + # 清理缓存(无论成功或失败) + self.newBufferObjList.clear() + self.newBufferNoteList.clear() + self.bufferObjList.clear() + self.bufferNoteList.clear() + + self.logger.info("缓存保存成功") + return True + + except Exception as e: + self.logger.critical(f"缓存保存严重错误: {str(e)}") + # 清理缓存以避免不一致状态 + self.newBufferObjList.clear() + self.newBufferNoteList.clear() + return False +``` + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L475-L540) + +### 错误处理与选择集管理 + +选择集操作中的错误处理需要特别注意,避免破坏选择集的状态一致性。 + +```python +def safeSelectAndProcess(self, condition_field: str, condition_op: str, condition_value: str) -> bool: + """安全的选择和操作流程""" + try: + # 清理现有选择集 + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + + # 设置选择条件 + SSProcess.setSelectCondition(condition_field, condition_op, condition_value) + + # 执行过滤 + SSProcess.selectFilter() + + # 检查选择结果 + geo_count = SSProcess.getSelGeoCount() + note_count = SSProcess.getSelNoteCount() + total_count = geo_count + note_count + + if total_count == 0: + self.logger.warning(f"没有找到符合条件的对象: {condition_field} {condition_op} {condition_value}") + return True # 没有对象也是正常情况 + + self.logger.info(f"选择集创建成功: {geo_count} 个地物, {note_count} 个注记") + + # 处理选择集 + success_count = 0 + for i in range(total_count): + try: + # 处理单个对象 + if i < geo_count: + result = self.processGeo(i) + else: + result = self.processNote(i - geo_count) + + if result: + success_count += 1 + + except Exception as e: + self.log_error_msg(f"处理对象 {i} 失败: {str(e)}") + continue + + self.logger.info(f"选择集处理完成: {success_count}/{total_count} 成功") + return success_count > 0 + + except Exception as e: + self.logger.critical(f"选择集操作严重错误: {str(e)}") + # 清理选择集 + try: + SSProcess.clearSelection() + SSProcess.clearSelectCondition() + except Exception: + pass + return False +``` + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L85-L110) + +## 下一步学习建议 + +掌握错误处理与异常管理后,建议按照以下路径深入学习相关主题,构建完整的 SunvStation 脚本开发知识体系: + +- [配置日志记录器](37-pei-zhi-ri-zhi-ji-lu-qi) — 深入了解日志系统的详细配置方法和高级用法 +- [进度条使用指南](38-jin-du-tiao-shi-yong-zhi-nan) — 学习进度条在长时间任务中的应用和错误处理 +- [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku) — 了解批量操作中的错误处理和数据完整性保护 +- [对象缓存机制](23-dui-xiang-huan-cun-ji-zhi) — 理解缓存操作中的状态管理和错误恢复策略 +- [撤销标记管理](25-che-xiao-biao-ji-guan-li) — 学习撤销功能与错误处理的协作机制 \ No newline at end of file diff --git a/docs/content/4-shi-yong-ssprocess-guan-li-xuan-ze-ji.md b/docs/content/4-shi-yong-ssprocess-guan-li-xuan-ze-ji.md new file mode 100644 index 0000000..96214bd --- /dev/null +++ b/docs/content/4-shi-yong-ssprocess-guan-li-xuan-ze-ji.md @@ -0,0 +1,422 @@ +本页面将引导初学者了解如何使用 SSProcess 管理和操作地理对象的选择集。选择集是地理信息系统中的核心概念,它允许您针对一组特定的对象执行批量操作,如属性修改、坐标编辑、数据导出等。SSProcess 提供了完整的选择集管理 API,支持基于条件的复杂查询、属性读写和系统同步等功能。 + +在学习本页内容后,建议按照以下路径继续深入: +- [第一个脚本:查询地物属性](3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing) — 了解属性查询的基础用法 +- [清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji) — 深入学习选择集的生命周期管理 +- [设置选择条件](12-she-zhi-xuan-ze-tiao-jian) — 掌握复杂条件查询技巧 + +## SSProcess 架构概览 + +SSProcess 采用 **Mixin 设计模式** 将不同功能模块化,选择集管理功能位于 `SelectionMixin` 中。这种架构使得代码职责清晰、易于维护和扩展。`SSProcessManager` 类通过多重继承组合了选择集、地理编辑、项目管理、日志和进度等多个功能模块,最终导出全局单例 `SSProcess` 供脚本直接使用。 + +```mermaid +classDiagram + class SSProcessManager { + +workspace: WorkSpace + +map: ScaleMap + +selGeoList: GeoBaseList + +selNoteList: GeoBaseList + +searchHelper: SSearchHelper + +objBaseAttr: ObjBaseAttr + +clearSelection() + +setSelectCondition(name, mode, value) + +selectFilter() + +getSelGeoValue(index, fieldName) + +setSelGeoValue(index, fieldName, value) + +updateSysSelection(mode) + } + + class SelectionMixin { + <> + +clearSelection() + +clearSelectCondition() + +setSelectCondition() + +selectFilter() + +getSelGeoCount() + +getSelNoteCount() + +getSelGeoValue() + +setSelGeoValue() + +updateSysSelection() + +resetSelGeoByCode() + +explodeSelectionObj() + } + + class GeoEditMixin { + <> + +createDefaultGeoBase() + +explodeGeoObject() + } + + class LogMixin { + <> + +set_logger() + +log_error_msg() + } + + class ProgressMixin { + <> + +startProgress() + +stepProgress() + +closeProgress() + } + + class ProjectMixin { + <> + +getCurrentMap() + +getSysSelGeoList() + } + + SSProcessManager *-- SelectionMixin + SSProcessManager *-- GeoEditMixin + SSProcessManager *-- LogMixin + SSProcessManager *-- ProgressMixin + SSProcessManager *-- ProjectMixin + + class SSProcess { + <<全局单例>> + } + SSProcess ..> SSProcessManager : 创建并导出 +``` + +### 核心组件说明 + +| 组件 | 类型 | 职责描述 | +|------|------|----------| +| `selGeoList` | GeoBaseList | 存储脚本选择集中的点、线、面对象 | +| `selNoteList` | GeoBaseList | 存储脚本选择集中的注记对象 | +| `searchHelper` | SSearchHelper | 执行条件查询和过滤操作的核心引擎 | +| `objBaseAttr` | ObjBaseAttr | 管理对象基本属性的读写操作 | +| `workspace` | WorkSpace | 当前工作空间实例,提供地图访问 | +| `map` | ScaleMap | 当前比例尺地图,用于对象同步和显示更新 | + +Sources: [PySSProcess.py](PySSProcess.py#L21-L44), [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L13-L44) + +## 选择集管理基础流程 + +选择集操作遵循"初始化 → 条件设置 → 过滤查询 → 属性操作 → 系统同步"的标准流程。理解这个流程对于高效使用选择集至关重要。 + +```mermaid +flowchart TD + A[获取 SSProcess 实例] --> B[清除选择集
clearSelection] + B --> C[清除选择条件
clearSelectCondition] + C --> D[设置查询条件
setSelectCondition] + D --> E{条件设置完成?} + E -->|否| D + E -->|是| F[执行过滤查询
selectFilter] + F --> G[获取选择集数量
getSelGeoCount] + G --> H{数量 > 0?} + H -->|是| I[遍历对象
获取属性/修改属性] + H -->|否| J[结束流程] + I --> K[保存更改] + K --> L[同步到系统选择集
updateSysSelection] + L --> M[更新地图显示] + M --> J +``` + +### 选择集与系统选择集的关系 + +SSProcess 维护了两个独立的选择集:**脚本选择集**和**系统选择集**。脚本选择集用于脚本内部操作,系统选择集用于地图显示和用户交互。两者可以通过 `updateSysSelection()` 方法进行双向同步。 + +| 同步模式 | mode 参数值 | 同步方向 | 说明 | +|----------|-------------|----------|------| +| 脚本 ← 系统 | 0 | 从系统选择集同步到脚本选择集 | 获取用户在地图上选择的对象 | +| 脚本 → 系统(更新显示) | 1 | 从脚本选择集同步到系统选择集 | 将修改后的对象同步并刷新显示 | +| 脚本 → 系统(不更新显示) | 2 | 从脚本选择集同步到系统选择集 | 仅更新数据不刷新显示(性能优化) | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L102-L126) + +## 选择条件详解 + +`setSelectCondition()` 方法是选择集查询的核心,它支持丰富的属性类型和操作符,能够满足复杂的查询需求。 + +### 属性类型分类 + +SSProcess 支持三种属性类型,通过命名规则进行区分: + +| 属性类型 | 命名格式 | 示例 | 说明 | +|----------|----------|------|------| +| 基本属性 | `SSObj_` 开头 | `SSObj_Code`, `SSObj_ID`, `SSObj_LayerName` | 系统内置的对象属性 | +| 几何特性 | `< >` 括住 | ``, ``, `` | 对象的几何状态和空间关系 | +| 扩展属性 | `[ ]` 括住 | `[JG]`, `[CS]`, `[ExAttr]` | 用户自定义的字段属性 | + +### 常用基本属性速查 + +| 属性名称 | 类型 | 说明 | 示例值 | +|----------|------|------|--------| +| `SSObj_ID` | 字符串 | 对象唯一标识 | "12345" | +| `SSObj_Code` | 字符串/整数 | 对象编码 | "3103013" | +| `SSObj_LayerName` | 字符串 | 所在图层名称 | "DLG", "Default_A" | +| `SSObj_Type` | 字符串 | 对象类型 | "POINT", "LINE", "AREA", "NOTE" | +| `SSObj_Color` | 字符串/整数 | 颜色 | "16777215", "RGB(255,0,0)" | +| `SSObj_LineWidth` | 整数 | 线宽 | "1", "2" | +| `SSObj_Name` | 字符串 | 对象名称 | "建筑物1" | +| `SSObj_Area` | 浮点数 | 面积 | "1500.5" | +| `SSObj_Length` | 浮点数 | 长度 | "200.3" | +| `SSObj_X` | 浮点数 | X坐标 | "100.5" | +| `SSObj_Y` | 浮点数 | Y坐标 | "200.8" | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L107) + +### 操作符说明 + +| 操作符 | 含义 | 适用场景 | 示例 | +|--------|------|----------|------| +| `==` | 等于 | 精确匹配 | `SSObj_Code == "3103013"` | +| `>` | 大于 | 数值比较 | `SSObj_Length > "100"` | +| `<` | 小于 | 数值比较 | `SSObj_Area < "500"` | +| `<>` | 不等于 | 排除特定值 | `SSObj_Type <> "NOTE"` | +| `LIKE` | 模糊匹配 | 字符串部分匹配 | `SSObj_Name LIKE "建筑"` | +| `NOT LIKE` | 不包含 | 排除特定字符串 | `SSObj_Name NOT LIKE "临时"` | +| `CompareNoCase` | 不区分大小写 | 字符串比较 | `SSObj_LayerName CompareNoCase "dlg"` | +| `Dec` | 小数位精度 | 数值精度控制 | `SSObj_Length Dec "2"` | + +### 条件值格式 + +| 值类型 | 格式 | 示例 | 说明 | +|--------|------|------|------| +| 单值 | 直接值 | `"3103013"` | 匹配单个值 | +| 多值 | `值1,值2,值3` | `"3103013,3103014,3103015"` | 匹配任意一个值 | +| 区间 | `值1->值2` | `"100->500"` | 值域范围匹配 | + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L107) + +## 选择集操作核心 API + +### 初始化与清理 + +在开始新的选择操作前,通常需要清理之前的选择集和条件,避免结果混入不相关的对象。 + +```python +# 清除脚本选择集中的所有对象 +SSProcess.clearSelection() + +# 清除已设置的所有选择条件 +SSProcess.clearSelectCondition() +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L34-L43) + +### 执行查询 + +设置好条件后,执行 `selectFilter()` 将符合条件的对象筛选到选择集中。 + +```python +# 设置选择条件:编码等于 3103013 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") + +# 执行过滤查询 +SSProcess.selectFilter() + +# 查询选择集对象数量 +geo_count = SSProcess.getSelGeoCount() +note_count = SSProcess.getSelNoteCount() + +print(f"查询到点线面对象: {geo_count} 个") +print(f"查询到注记对象: {note_count} 个") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L108-L126), [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L152-L168) + +### 读取对象属性 + +遍历选择集中的对象并读取其属性值是常见的操作。 + +```python +# 遍历选择集中的前 10 个对象 +for i in range(min(10, SSProcess.getSelGeoCount())): + # 读取基本属性 + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + layer_name = SSProcess.getSelGeoValue(i, "SSObj_LayerName") + obj_type = SSProcess.getSelGeoValue(i, "SSObj_Type") + + # 读取扩展属性(需要用 [] 括住) + jg_value = SSProcess.getSelGeoValue(i, "[JG]") + + # 读取几何特性(需要用 <> 括住) + is_overlap = SSProcess.getSelGeoValue(i, "") + + print(f"对象 {i}: 编码={code}, 图层={layer_name}, 类型={obj_type}") + print(f" 扩展属性[JG]={jg_value}, 重叠={is_overlap}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L169-L215) + +### 修改对象属性 + +批量修改选择集中对象的属性值,支持基本属性和扩展属性的修改。 + +```python +# 批量修改选择集对象属性 +for i in range(SSProcess.getSelGeoCount()): + # 修改基本属性 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"已修改对象{i}") + SSProcess.setSelGeoValue(i, "SSObj_Color", "16777215") # 白色 + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "2") + + # 修改扩展属性(多个属性用逗号分隔) + SSProcess.setSelGeoValue(i, "[JG],[CS]", "砖混,6") + + # 特殊属性:修改编码 + SSProcess.setSelGeoValue(i, "SSObj_Code", "3103014") +``` + +**重要提示**:修改 `SSObj_Code` 和 `SSObj_LayerName` 会触发对象的重新创建操作,这比普通属性修改更耗时,请谨慎使用。 + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L247-L298) + +### 同步到系统选择集 + +将脚本中对选择集的修改同步到系统选择集,使地图视图更新。 + +```python +# 模式 1:同步并更新显示(最常用) +SSProcess.updateSysSelection(1) + +# 模式 2:仅同步数据不更新显示(性能优化) +SSProcess.updateSysSelection(2) +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L102-L126) + +## 完整示例:批量修改对象属性 + +以下示例展示了完整的选择集操作流程,包括查询、属性修改和系统同步。 + +```python +from sunvpy import SSProcess + +# 步骤 1:初始化选择集 +SSProcess.clearSelection() +SSProcess.clearSelectCondition() + +# 步骤 2:设置查询条件 +# 条件 1:编码为 3103013 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +# 条件 2:且图层为 Default_A(隐式 AND 关系) +SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") + +# 步骤 3:执行过滤查询 +SSProcess.selectFilter() +count = SSProcess.getSelGeoCount() + +print(f"查询到 {count} 个符合条件的对象") + +if count == 0: + print("没有找到符合条件的对象") +else: + # 步骤 4:批量修改属性 + for i in range(count): + # 读取原始属性 + original_name = SSProcess.getSelGeoValue(i, "SSObj_Name") + original_color = SSProcess.getSelGeoValue(i, "SSObj_Color") + + print(f"处理对象 {i}: {original_name}") + + # 修改属性 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"标准_{original_name}") + SSProcess.setSelGeoValue(i, "SSObj_Color", "16711680") # 蓝色 + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "2") + SSProcess.setSelGeoValue(i, "[JG]", "框架") + + # 步骤 5:同步到系统选择集并更新显示 + SSProcess.updateSysSelection(1) + print("批量修改完成,地图显示已更新") +``` + +Sources: [PySSProcess.py](PySSProcess.py#L115-L140) + +## 高级功能:选择集打散操作 + +SSProcess 还提供了选择集对象的打散功能,可以将复杂对象分解为其组成部分。这在数据处理和拓扑修复等场景中非常有用。 + +```python +# 打散选择集对象 +# 参数说明: +# - explodeWay: 0=图形打散, 1=根据编码表打散 +# - delSrcObj: True=删除原始对象, False=保留原始对象 +# - callback: 回调函数名,用于处理打散后的对象 + +def onExplodeComplete(geo, geoVec, noteVec): + """打散完成后的回调函数""" + print(f"原始对象 {geo.getObjName()} 已打散") + print(f"生成 {geoVec.size()} 个几何对象") + print(f"生成 {noteVec.size()} 个注记对象") + +# 执行打散操作 +SSProcess.explodeSelectionObj( + explodeWay=1, + delSrcObj=True, + callback="onExplodeComplete" +) +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L500-L654) + +## 选择集管理最佳实践 + +### 性能优化建议 + +| 场景 | 建议做法 | 原因 | +|------|----------|------| +| 大批量对象处理 | 使用 `updateSysSelection(2)` 不更新显示 | 避免频繁刷新导致的性能下降 | +| 修改编码或图层 | 避免在循环中批量修改 | 这些操作会重新创建对象,耗时较长 | +| 复杂条件查询 | 优先使用索引字段(Code、ID、LayerName) | 提高查询效率 | +| 扩展属性读写 | 缓存常用字段的索引位置 | 避免重复查找 | + +### 错误处理 + +选择集操作中的常见错误及处理方法: + +| 错误类型 | 表现 | 处理建议 | +|----------|------|----------| +| 索引越界 | `getSelGeoValue()` 返回空字符串 | 操作前检查 `getSelGeoCount()` 返回值 | +| 属性名错误 | 属性值读取失败 | 确认属性名拼写及类型(基本属性 vs 扩展属性) | +| 条件格式错误 | `selectFilter()` 无结果 | 检查操作符和条件值格式是否正确 | +| 对象不存在 | 操作失败 | 确保数据源已加载且包含目标图层 | + +### 常见问题排查 + +**问题 1:查询结果为空** + +可能原因: +- 条件值格式错误(如将数值写成字符串) +- 属性名拼写错误 +- 数据源中不包含符合条件的对象 + +排查方法: +```python +# 先查询总数再筛选 +total_before = SSProcess.getSelGeoCount() +SSProcess.selectFilter() +total_after = SSProcess.getSelGeoCount() +print(f"筛选前: {total_before}, 筛选后: {total_after}") +``` + +**问题 2:属性修改不生效** + +可能原因: +- 未调用 `updateSysSelection()` 同步 +- 属性名使用了错误的类型(扩展属性忘记加 `[]`) +- 对象已锁定或只读 + +排查方法: +```python +# 修改后立即读取验证 +SSProcess.setSelGeoValue(0, "SSObj_Name", "新名称") +new_name = SSProcess.getSelGeoValue(0, "SSObj_Name") +print(f"修改后的名称: {new_name}") +``` + +Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L34-L43), [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L169-L215) + +## 下一步学习路径 + +掌握选择集管理的基础操作后,建议继续学习以下主题以提升开发能力: + +- [清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji) — 了解选择集状态管理 +- [执行过滤查询](13-zhi-xing-guo-lv-cha-xun) — 深入学习过滤机制 +- [遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang) — 掌握高效遍历技巧 +- [获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi) — 系统学习属性操作 +- [修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi) — 批量修改最佳实践 + +通过循序渐进地学习这些主题,您将能够熟练使用 SSProcess 管理和操作各种地理对象选择集,为后续的数据处理和分析工作打下坚实基础。 \ No newline at end of file diff --git a/docs/content/40-ssprocessmanager-wan-zheng-api.md b/docs/content/40-ssprocessmanager-wan-zheng-api.md new file mode 100644 index 0000000..2c13946 --- /dev/null +++ b/docs/content/40-ssprocessmanager-wan-zheng-api.md @@ -0,0 +1,463 @@ +SSProcessManager 是 SunvStation 地理信息系统中的核心进程管理类,提供了对工作空间、地图、几何对象选择与编辑的完整操作能力。该类通过 Mixin 设计模式将功能模块化,为高级开发者提供了灵活且强大的地理数据处理接口。本文档将系统性地介绍 SSProcessManager 的完整 API 接口、架构设计以及使用方法。 + +## 核心架构设计 + +SSProcessManager 采用多重继承的 Mixin 设计模式,将复杂的功能拆分为五个独立的模块,每个模块负责特定的领域功能。这种设计使得代码具有高度的可维护性和扩展性,同时保持了良好的关注点分离原则。 + +### 类继承结构 + +```mermaid +classDiagram + class SSProcessManager { + +workspace: WorkSpace + +map: ScaleMap + +selGeoList: GeoBaseList + +selNoteList: GeoBaseList + +bufferObjList: GeoBaseList + +curNewObj: tuple + +logger: Logger + +progress: Progress + -__init__() + } + + class SelectionMixin { + +clearSelection() + +clearSelectCondition() + +setSelectCondition() + +selectFilter() + +getSelGeoCount() + +getSelGeoValue() + +setSelGeoValue() + +updateSysSelection() + } + + class GeoEditMixin { + +createDefaultGeoBase() + +createNewObjByCode() + +createNewObjByClass() + +setNewObjValue() + +addNewObjPoint() + +saveBufferObjToDatabase() + +explodeGeoObject() + } + + class ProjectMixin { + +getWorkspace() + +getCurrentMap() + +getSysPathName() + +getLayerCount() + +setLayerStatus() + +pushUndoMark() + } + + class LogMixin { + +set_logger() + +log_error_msg() + } + + class ProgressMixin { + +disable_progress() + +startProgress() + +stepProgress() + +closeProgress() + } + + SSProcessManager --> SelectionMixin + SSProcessManager --> GeoEditMixin + SSProcessManager --> ProjectMixin + SSProcessManager --> LogMixin + SSProcessManager --> ProgressMixin +``` + +### 模块职责划分 + +**SelectionMixin** - 负责选择集管理,提供条件过滤、属性读写和系统选择集同步功能 +**GeoEditMixin** - 负责地理对象编辑,包括对象创建、属性设置、缓存管理和打散操作 +**ProjectMixin** - 负责项目和工作空间管理,包括图层控制、路径管理和地图帧操作 +**LogMixin** - 负责日志记录,提供统一的错误日志接口 +**ProgressMixin** - 负责进度条管理,提供可视化进度反馈 + +Sources: [PySSProcess.py](PySSProcess.py#L40-L63) + +## 选择集操作 API + +选择集操作是 SSProcessManager 的核心功能之一,提供了强大的条件查询和属性管理能力。选择集分为脚本选择集和系统选择集,两者可以通过特定方法进行双向同步。 + +### 基础选择集管理 + +`clearSelection()` - 清除脚本选择集中的全部点线面和注记对象。此方法不会影响地图显示的选择集,仅清理脚本内部的缓存。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L36-L43) + +`clearSelectCondition()` - 清除所有已设置的选择条件。在执行新的查询前,通常需要调用此方法以避免条件累积。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L52) + +`clearSysSelection()` - 清除地图上的系统选择集并触发选择变更事件。此方法会影响地图的显示状态。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L139-L142) + +### 条件设置与过滤 + +`setSelectCondition(conditionName, operateMode, conditionValue)` - 向选择条件集合中添加过滤条件。条件支持三种类型: + +| 条件类型 | 前缀符号 | 示例 | 说明 | +|---------|---------|------|------| +| 基本属性 | SSObj_ | SSObj_Code, SSObj_Name | 对象固有属性 | +| 几何特性 | <> | , | 几何拓扑关系 | +| 扩展属性 | [] | [JG], [CS] | 用户自定义属性 | + +支持的运算符包括:`==`, `>`, `<`, `<>`, `LIKE`, `NOT LIKE`, `CompareNoCase`(不区分大小写比较), `Dec`(小数位控制) + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L54-L122) + +`selectFilter()` - 执行选择集过滤操作。该方法会清除旧的字段缓存,根据当前设置的条件从数据源中筛选对象,并将结果分类存储到 `selGeoList`(点线面)和 `selNoteList`(注记)中。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L124-L145) + +### 选择集查询 + +`getSelGeoCount()` - 返回脚本选择集中点线面对象的数量。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L147-L154) + +`getSelNoteCount()` - 返回脚本选择集中注记对象的数量。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L156-L163) + +`getSysSelGeoList()` - 获取地图当前选中的几何对象列表。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L166-L177) + +`getSysSelNoteList()` - 获取地图当前选中的注记对象列表。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L179-L190) + +### 属性读写 + +`getSelGeoValue(index, fieldName)` - 获取选择集中指定索引对象的属性值。该方法会自动识别属性类型: + +- **基本属性**:以 `SSObj_` 开头,直接通过 `ObjBaseAttr` 获取 +- **扩展属性**:以 `[]` 包裹,从扩展属性表中查询 +- **多属性查询**:支持使用逗号分隔多个属性名,如 `[JG,CS]` + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L175-L219) + +`getSelNoteValue(index, fieldName)` - 获取注记对象的属性值,方法与 `getSelGeoValue` 类似。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L221-L265) + +`setSelGeoValue(index, fieldName, value)` - 设置选择集中指定对象的属性值。特殊处理: + +- **SSObj_Code**:修改对象编码时直接设置整数值 +- **SSObj_LayerName**:修改图层时需要克隆对象、删除原始对象并创建新对象,同时保留扩展属性 +- **其他属性**:通过 `ObjBaseAttr` 统一处理 + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L267-L320) + +`setSelNoteValue(index, fieldName, value)` - 设置注记对象的属性值。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L322-L375) + +### 坐标操作 + +`getSelGeoPoint(index, pointIndex)` - 获取选择集中指定对象的指定点坐标。返回值为 `Point3D` 对象。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L385-L400) + +`deleteSelGeoPoint(index, pointIndex)` - 删除选择集中指定对象的指定点。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L541-L553) + +### 选择集同步 + +`updateSysSelection(mode)` - 实现脚本选择集与系统选择集的双向同步。mode 参数控制同步方向: + +| mode | 同步方向 | 说明 | +|------|---------|------| +| 0 | 系统 → 脚本 | 从地图选择集同步到脚本选择集 | +| 1 | 脚本 → 系统 | 从脚本选择集同步到地图选择集(更新显示) | +| 2 | 脚本 → 系统 | 从脚本选择集同步到地图选择集(不更新显示) | + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L147-L168) + +## 地理对象编辑 API + +地理对象编辑模块提供了完整的对象生命周期管理能力,包括创建、修改、缓存和持久化等操作。 + +### 对象创建 + +`createDefaultGeoBase(obj_type, dataset)` - 创建基础几何对象。obj_type 参数指定对象类型: + +| obj_type | 几何类型 | 对应类 | +|----------|---------|--------| +| 0 | 点 | PointObject | +| 1 | 线 | LineObject | +| 2 | 面 | AreaObject | +| 3 | 注记 | MarkNote | + +返回值为包含 `GeoObject` 和具体几何对象的元组。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L62-L89) + +`createNewObjByCode(code)` - 根据要素代码创建新对象。该方法会自动查询要素代码表,获取对应的数据集、对象类型和样式属性,并创建完整的几何对象。创建成功后会更新 `curNewObj` 成员变量。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L113-L154) + +`createNewObjByClass(noteClass)` - 根据注记分类号创建新注记对象。该方法会从注记模板表中获取模板,创建注记对象并应用模板样式。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L156-L180) + +### 新建对象操作 + +`setNewObjValue(fieldName, value)` - 设置当前新建对象的属性值。该方法支持批量属性设置,用逗号分隔多个属性名和值。属性类型自动识别: + +- **扩展属性**:以 `[]` 包裹,直接设置到 memoData +- **基本属性**:以 `SSObj_` 开头,调用对应设置方法 +- **注记专属属性**:仅当对象类型为注记时有效 + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L182-L349) + +`addNewObjPoint(x, y, z, type, name)` - 向当前新建对象添加坐标点。type 参数使用二进制位存储点信息枚举。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L351-L371) + +`deleteNewObj()` - 删除当前新建对象并清理 `curNewObj` 成员变量。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L373-L382) + +`addNewObjToSelObjList()` - 将当前新建对象添加到脚本选择集。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L384-L394) + +`addNewObjToSaveObjList()` - 将当前新建对象添加到持久化保存列表。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L396-L407) + +### 缓存与持久化 + +`saveBufferObjToDatabase()` - 将缓存的对象批量保存到数据库。该方法处理三种缓存类型: + +1. **新建对象缓存**:`newBufferObjList` 和 `newBufferNoteList` +2. **修改对象缓存**:`bufferObjList` 和 `bufferNoteList` +3. **删除对象缓存**:`delBufferGeoList` + +保存时会将 memoData 转换为扩展属性,确保数据完整性。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L427-L456) + +`transMemoDataToExtendAttr(geoList)` - 将几何对象的备忘数据转换为扩展属性。该方法使用事务模式批量更新,提高性能。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L409-L424) + +`addSelGeoToSaveGeoList(index)` - 将选择集中的几何对象添加到保存缓存。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L555-L566) + +`addSelNoteToSaveNoteList(index)` - 将选择集中的注记对象添加到保存缓存。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L568-L579) + +### 对象重置 + +`resetSelGeoByCode(index, code)` - 根据要素代码重置选择集中的几何对象。该方法会: + +1. 查询新代码对应的特征信息 +2. 如果在相同数据集,仅修改代码 +3. 如果在不同数据集,创建新对象并复制几何和扩展属性 +4. 将旧对象加入删除缓存,新对象加入新建缓存 + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L381-L451) + +`resetSelNoteByClass(index, noteClass)` - 根据注记分类号重置选择集中的注记对象。逻辑与 `resetSelGeoByCode` 类似,但处理注记特有属性。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L453-L511) + +### 对象打散 + +`explodeGeoObject(geo, explodeWay, callback)` - 将几何对象打散为多个子对象。explodeWay 参数控制打散方式: + +| explodeWay | 打散方式 | 说明 | +|-----------|---------|------| +| 0 | 图形打散 | 保持颜色,打散为基本图形 | +| 1 | 按编码表打散 | 根据符号表进行分解 | +| 11 | 拆分为线 | 转换为线对象列表 | +| 12 | 拆分环 | 按环拆分复杂多边形 | + +callback 参数为回调函数名,用于处理打散后的对象。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L577-L762) + +`explodeNoteObject(note, forExchange, callback)` - 将注记对象打散为多个子注记。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L509-L576) + +`explodeSelectionObj(explodeWay, delSrcObj, callback)` - 批量打散选择集中的所有对象。delSrcObj 参数控制是否删除原始对象。Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L600-L655) + +### 辅助计算 + +`getPolar(pt0, pt1)` - 计算两点之间的距离和角度。返回值为 `(距离, 角度)` 元组。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L91-L105) + +`getPoint(pt0, dist, angle)` - 根据起点、距离和角度计算终点坐标。返回值为 `Point3D` 对象。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L107-L119) + +`getObjectAttr(objId, attrField)` - 根据对象 ID 获取属性值。该方法会先查询对象是否存在,然后读取指定属性。Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L458-L507) + +## 项目与工作空间 API + +项目模块提供了对 SunvStation 工作空间和地图环境的高级访问能力,包括图层管理、路径操作和地图帧控制等功能。 + +### 工作空间与地图 + +`getWorkspace()` - 获取当前工作空间实例。工作空间是 SunvStation 数据组织的顶层容器。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L22-L32) + +`getCurrentMap()` - 获取当前比例尺地图实例。地图是地理对象的显示和管理容器。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L34-L43) + +`pushUndoMark(action)` - 创建撤销标记。在执行可撤销操作前调用此方法,action 参数描述操作名称,默认为 "CommandGroup"。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L45-L58) + +### 系统路径管理 + +`getSysPathName(mode)` - 根据模式获取系统路径。mode 参数支持的路径类型: + +| mode | 路径类型 | 说明 | +|------|---------|------| +| 0 | 配置路径 | GlobalOptions 配置目录 | +| 1 | 模板路径 | 系统模板目录 | +| 2 | Comm路径 | 通用文件目录 | +| 3 | Script路径 | 脚本文件目录 | +| 4 | SSTemp路径 | 临时文件目录 | +| 5 | 工程文件路径 | 当前工程所在目录 | +| 6 | 系统目录 | Windows/System32 或 /usr | +| 7/8 | 方案路径 | 当前方案文件目录 | + +Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L60-L118) + +### 图层管理 + +`getLayerCount()` - 获取当前地图中的图层数量。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L175-L184) + +`getLayerName(index)` - 获取指定索引的图层名称。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L186-L198) + +`setLayerStatus(layerName, status, type)` - 设置图层状态。type 参数控制状态类型: + +| type | 控制类型 | status 含义 | +|------|---------|------------| +| 1 | 图层显示 | True=可见,False=隐藏 | +| 2 | 编辑锁定 | True=锁定,False=解锁 | + +Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L200-L215) + +### 地图帧操作 + +`createMapFrame()` - 创建地图帧。该方法会计算地图范围并生成地图帧点列表。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L120-L149) + +`getMapFrameCount()` - 获取地图帧数量。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L151-L154) + +`getMapFrameCenterPoint(index)` - 获取指定地图帧的中心点坐标。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L156-L163) + +`setCurMapFrame(x, y)` - 设置当前地图帧。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L165-L171) + +`getCurMapFrame()` - 获取当前地图帧的对象 ID。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L173-L178) + +`getMapFrameNumber(x, y)` - 获取指定坐标所在的地图帧编号。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L180-L186) + +`freeMapFrame()` - 释放地图帧缓存。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L188-L190) + +### 系统表管理 + +`getFeatureCodeTB()` - 获取当前要素代码表名称。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L217-L226) + +`getSymbolScriptTB()` - 获取当前符号表名称。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L228-L237) + +`getNoteTemplateTB()` - 获取当前注记模板表名称。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L239-L248) + +`setFeatureCodeTB(featureCodeTB, symbolScriptTB)` - 设置要素代码表和符号表。如果与当前设置不同,会重新加载并触发系统表变更事件。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L250-L262) + +`setNoteTemplateTB(noteTemplateTB)` - 设置注记模板表。Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L264-L273) + +## 进度与日志 API + +进度和日志模块为长时间操作提供了用户反馈和错误跟踪能力。 + +### 进度条管理 + +`disable_progress()` - 禁用进度条显示并立即关闭当前进度条。Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L35-L44) + +`startProgress(title, total)` - 创建并启动进度条。title 为进度条标题,total 为总进度值。Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L46-L58) + +`stepProgress(message)` - 更新进度条。message 为当前步骤描述信息。Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L60-L70) + +`closeProgress()` - 关闭进度条。Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L72-L78) + +### 日志记录 + +`set_logger(logger)` - 设置日志记录器实例。Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L34-L37) + +`log_error_msg(error_msg)` - 记录错误日志。如果设置了 logger,调用 logger.error();否则使用 print 输出。Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L39-L42) + +## 完整 API 参考表 + +下表列出了 SSProcessManager 的所有公共方法及其所属模块: + +| 方法名 | 所属模块 | 功能描述 | 返回值 | +|--------|---------|---------|--------| +| **选择集操作** | +| `clearSelection()` | SelectionMixin | 清除脚本选择集 | None | +| `clearSelectCondition()` | SelectionMixin | 清除选择条件 | None | +| `setSelectCondition(name, mode, value)` | SelectionMixin | 添加选择条件 | None | +| `selectFilter()` | SelectionMixin | 执行过滤查询 | None | +| `getSelGeoCount()` | SelectionMixin | 获取点线面对象数量 | int | +| `getSelNoteCount()` | SelectionMixin | 获取注记对象数量 | int | +| `getSelGeoValue(index, fieldName)` | SelectionMixin | 获取几何对象属性 | str | +| `getSelNoteValue(index, fieldName)` | SelectionMixin | 获取注记对象属性 | str | +| `setSelGeoValue(index, fieldName, value)` | SelectionMixin | 设置几何对象属性 | None | +| `setSelNoteValue(index, fieldName, value)` | SelectionMixin | 设置注记对象属性 | None | +| `getSelGeoPoint(index, pointIndex)` | SelectionMixin | 获取坐标点 | Point3D | +| `deleteSelGeoPoint(index, pointIndex)` | SelectionMixin | 删除坐标点 | bool | +| `updateSysSelection(mode)` | SelectionMixin | 同步选择集 | None | +| `getSysSelGeoList()` | SelectionMixin | 获取系统几何选择集 | GeoBaseList | +| `getSysSelNoteList()` | SelectionMixin | 获取系统注记选择集 | GeoBaseList | +| `clearSysSelection()` | SelectionMixin | 清除系统选择集 | None | +| `resetSelGeoByCode(index, code)` | SelectionMixin | 按代码重置对象 | bool | +| `resetSelNoteByClass(index, noteClass)` | SelectionMixin | 按分类重置注记 | bool | +| `addSelGeoToSaveGeoList(index)` | SelectionMixin | 添加到保存列表 | None | +| `addSelNoteToSaveNoteList(index)` | SelectionMixin | 添加注记到保存列表 | None | +| `explodeSelectionObj(explodeWay, delSrcObj, callback)` | SelectionMixin | 批量打散对象 | bool | +| **对象编辑** | +| `createDefaultGeoBase(obj_type, dataset)` | GeoEditMixin | 创建基础几何对象 | tuple | +| `createNewObjByCode(code)` | GeoEditMixin | 按代码创建对象 | tuple | +| `createNewObjByClass(noteClass)` | GeoEditMixin | 按分类创建注记 | tuple | +| `setNewObjValue(fieldName, value)` | GeoEditMixin | 设置新建对象属性 | bool | +| `addNewObjPoint(x, y, z, type, name)` | GeoEditMixin | 添加坐标点 | bool | +| `deleteNewObj()` | GeoEditMixin | 删除新建对象 | None | +| `addNewObjToSelObjList()` | GeoEditMixin | 添加到选择集 | None | +| `addNewObjToSaveObjList()` | GeoEditMixin | 添加到保存列表 | None | +| `saveBufferObjToDatabase()` | GeoEditMixin | 保存缓存到数据库 | None | +| `transMemoDataToExtendAttr(geoList)` | GeoEditMixin | 转换扩展属性 | None | +| `explodeGeoObject(geo, explodeWay, callback)` | GeoEditMixin | 打散几何对象 | tuple | +| `explodeNoteObject(note, forExchange, callback)` | GeoEditMixin | 打散注记对象 | tuple | +| `getPolar(pt0, pt1)` | GeoEditMixin | 计算距离和角度 | tuple | +| `getPoint(pt0, dist, angle)` | GeoEditMixin | 计算终点坐标 | Point3D | +| `getObjectAttr(objId, attrField)` | GeoEditMixin | 获取对象属性 | str | +| **项目工作空间** | +| `getWorkspace()` | ProjectMixin | 获取工作空间实例 | WorkSpace | +| `getCurrentMap()` | ProjectMixin | 获取地图实例 | ScaleMap | +| `pushUndoMark(action)` | ProjectMixin | 创建撤销标记 | None | +| `getSysPathName(mode)` | ProjectMixin | 获取系统路径 | str | +| `getLayerCount()` | ProjectMixin | 获取图层数量 | int | +| `getLayerName(index)` | ProjectMixin | 获取图层名称 | str | +| `setLayerStatus(name, status, type)` | ProjectMixin | 设置图层状态 | bool | +| `createMapFrame()` | ProjectMixin | 创建地图帧 | bool | +| `getMapFrameCount()` | ProjectMixin | 获取地图帧数量 | int | +| `getMapFrameCenterPoint(index)` | ProjectMixin | 获取地图帧中心点 | tuple | +| `setCurMapFrame(x, y)` | ProjectMixin | 设置当前地图帧 | GeoBase | +| `getCurMapFrame()` | ProjectMixin | 获取当前地图帧ID | int | +| `getMapFrameNumber(x, y)` | ProjectMixin | 获取地图帧编号 | int | +| `freeMapFrame()` | ProjectMixin | 释放地图帧缓存 | None | +| `getFeatureCodeTB()` | ProjectMixin | 获取要素代码表名 | str | +| `getSymbolScriptTB()` | ProjectMixin | 获取符号表名 | str | +| `getNoteTemplateTB()` | ProjectMixin | 获取注记模板表名 | str | +| `setFeatureCodeTB(featTB, symTB)` | ProjectMixin | 设置要素代码表 | bool | +| `setNoteTemplateTB(noteTB)` | ProjectMixin | 设置注记模板表 | bool | +| **进度与日志** | +| `disable_progress()` | ProgressMixin | 禁用进度条 | None | +| `startProgress(title, total)` | ProgressMixin | 启动进度条 | None | +| `stepProgress(message)` | ProgressMixin | 更新进度条 | None | +| `closeProgress()` | ProgressMixin | 关闭进度条 | None | +| `set_logger(logger)` | LogMixin | 设置日志记录器 | None | +| `log_error_msg(error_msg)` | LogMixin | 记录错误日志 | None | + +Sources: [PySSProcess.py](PySSProcess.py#L1-L140) + +## 实例化与使用 + +SSProcessManager 提供了一个全局单例 `SSProcess`,供开发者直接使用: + +```python +from sunvpy.PySSProcess import SSProcess + +# 清除选择条件和选择集 +SSProcess.clearSelectCondition() +SSProcess.clearSelection() + +# 设置选择条件并执行过滤 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") +SSProcess.selectFilter() + +# 遍历选择集 +count = SSProcess.getSelGeoCount() +for i in range(count): + code = SSProcess.getSelGeoValue(i, "SSObj_Code") + name = SSProcess.getSelGeoValue(i, "SSObj_Name") + print(f"对象 {i}: 编码={code}, 名称={name}") + + # 修改属性 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"新名称_{i}") + + # 添加到保存列表 + SSProcess.addSelGeoToSaveGeoList(i) + +# 批量保存到数据库 +SSProcess.pushUndoMark("批量修改属性") +SSProcess.saveBufferObjToDatabase() +``` + +Sources: [PySSProcess.py](PySSProcess.py#L110-L140) + +## 相关文档 + +要深入了解特定功能模块,请参考以下文档: + +- [使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji) - 选择集操作的最佳实践和示例 +- [创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) - 对象创建的详细教程 +- [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku) - 缓存机制和批量保存策略 +- [撤销标记管理](25-che-xiao-biao-ji-guan-li) - 撤销功能的实现原理 +- [配置日志记录器](37-pei-zhi-ri-zhi-ji-lu-qi) - 日志系统的配置方法 +- [进度条使用指南](38-jin-du-tiao-shi-yong-zhi-nan) - 进度反馈的最佳实践 \ No newline at end of file diff --git a/docs/content/41-objbaseattr-shu-xing-suo-yin.md b/docs/content/41-objbaseattr-shu-xing-suo-yin.md new file mode 100644 index 0000000..5e85d6d --- /dev/null +++ b/docs/content/41-objbaseattr-shu-xing-suo-yin.md @@ -0,0 +1,398 @@ +ObjBaseAttr 类是 SunvStation 系统中地物对象属性管理的核心组件,提供统一的属性名称注册、索引映射和属性值读写接口。该类通过集中管理所有地物属性的名称与索引映射关系,实现了属性访问的标准化和高效化,支持点、线、面、注记等多种地物类型的属性操作。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L6-L110) + +## 属性分类体系 + +ObjBaseAttr 将地物属性划分为五大类别,每类属性对应不同的功能维度和数据类型。这种分类设计既体现了属性的业务语义,也便于开发者快速定位所需属性。 + +### 属性分类概览 + +```mermaid +graph TB + A[ObjBaseAttr 属性体系] --> B[点属性] + A --> C[地物通用属性] + A --> D[几何参量属性] + A --> E[注记属性] + A --> F[操作属性] + + B --> B1[SSObj_PointName
坐标点名称] + B --> B2[SSObj_PointCount
坐标点数量] + B --> B3[SSObj_PointType
坐标点类型] + B --> B4[SSObj_X/Y/Z
坐标值] + + C --> C1[标识属性
ID, Code, Name] + C --> C2[图形属性
Color, LineType, LineWidth] + C --> C3[变换属性
Angle, ScaleX, ScaleY] + C --> C4[时间属性
CreateTime, ModifyTime] + + D --> D1[面积属性
Area, EllipsoidArea] + D --> D2[长度属性
Length, 3DLength] + D --> D3[边界属性
minX, minY, maxX, maxY] + + E --> E1[字体属性
FontWidth, FontHeight, FontName] + E --> E2[文本属性
FontString, FontStringCount] + E --> E3[样式属性
Alignment, FontWeight, ItalicAngle] + + F --> F1[SSObj_Reverse
方向反转] + F --> F2[SSObj_Reference
引用关系] +``` + +### 点属性索引 + +点属性用于描述地物对象的坐标点信息,是构成线、面等复杂几何形状的基础元素。此类属性支持通过参数索引访问特定位置的坐标点。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L38-L44) + +| 属性常量 | 属性名 | 数据类型 | 说明 | 参数支持 | +|---------|--------|---------|------|---------| +| `pointName` | SSObj_PointName | string | 坐标点名称 | (n) - 第n个点 | +| `pointCount` | SSObj_PointCount | int | 坐标点数量 | 无 | +| `pointType` | SSObj_PointType | int | 坐标点类型 | (n) - 第n个点 | +| `x` | SSObj_X | double | X坐标值 | (n) - 第n个点 | +| `y` | SSObj_Y | double | Y坐标值 | (n) - 第n个点 | +| `z` | SSObj_Z | double | Z坐标值 | (n) - 第n个点 | + +**参数说明**:括号内的数字表示坐标点索引(从0开始)。例如 `SSObj_X(0)` 获取第一个点的X坐标。 + +### 地物通用属性索引 + +通用属性适用于所有地物类型,涵盖了对象标识、图形表现、变换参数和元数据等核心信息。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L46-L70) + +| 属性常量 | 属性名 | 数据类型 | 说明 | 可读写 | +|---------|--------|---------|------|-------| +| **标识属性** ||||| +| `id` | SSObj_ID | int | 对象唯一标识 | 只读 | +| `groupID` | SSObj_GroupID | int | 分组标识 | 可写 | +| `code` | SSObj_Code | int | 地物编码 | 只读 | +| `byname` | SSObj_Byname | string | 地物别名 | 可写 | +| `name` | SSObj_Name | string | 地物名称 | 可写 | +| `type` | SSObj_Type | string | 对象类型(POINT/LINE/AREA/NOTE) | 只读 | +| **图形属性** ||||| +| `color` | SSObj_Color | int | 颜色值(支持RGB/COLORNO格式) | 可写 | +| `lineType` | SSObj_LineType | int | 线型 | 可写 | +| `lineWidth` | SSObj_LineWidth | int | 线宽 | 可写 | +| `layerName` | SSObj_LayerName | string | 图层名称 | 只读 | +| **变换属性** ||||| +| `angle` | SSObj_Angle | double | 旋转角度(度) | 可写 | +| `scaleX` | SSObj_ScaleX | double | X方向缩放比例 | 可写 | +| `scaleY` | SSObj_ScaleY | double | Y方向缩放比例 | 可写 | +| `scaleXY` | SSObj_ScaleXY | double | 统一缩放比例 | 可写 | +| **元数据属性** ||||| +| `status` | SSObj_Status | int | 对象状态 | 可写 | +| `dataMark` | SSObj_DataMark | string | 数据标记 | 可写 | +| `relationID` | SSObj_RelationID | string | 关联标识 | 可写 | +| `createTime` | SSObj_CreateTime | string | 创建时间(YYYY-MM-DD HH:MM:SS) | 可写 | +| `modifyTime` | SSObj_ModifyTime | string | 修改时间(YYYY-MM-DD HH:MM:SS) | 可写 | +| **扩展属性** ||||| +| `hatchStyle` | SSObj_HatchStyle | int | 填充样式 | 可写 | +| `hatchDensityScale` | SSObj_HatchDensityScale | double | 填充密度比例 | 可写 | +| `lShapeOffset` | SSObj_LShapeOffset | int | L型偏移 | 可写 | +| `memoData` | SSObj_MemoData | string | 备注数据 | 可写 | + +### 几何参量属性索引 + +几何参量属性提供对地物对象空间特征的定量描述,包括面积、长度、边界范围等计算结果。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L72-L85) + +| 属性常量 | 属性名 | 数据类型 | 说明 | 精度 | +|---------|--------|---------|------|------| +| **面积属性** ||||| +| `area` | SSObj_Area | double | 对象面积 | 6位小数 | +| `ellipsoidArea1` | SSObj_EllipsoidArea1 | double | 椭球面积1 | - | +| `ellipsoidArea2` | SSObj_EllipsoidArea2 | double | 椭球面积2 | - | +| **长度属性** ||||| +| `length` | SSObj_Length | double | 对象周长/长度 | 6位小数 | +| `length3D` | SSObj_3DLength | double | 三维长度 | 6位小数 | +| **边界属性** ||||| +| `minX` | SSObj_minX | double | 最小X坐标 | 6位小数 | +| `minY` | SSObj_minY | double | 最小Y坐标 | 6位小数 | +| `maxX` | SSObj_maxX | double | 最大X坐标 | 6位小数 | +| `maxY` | SSObj_maxY | double | 最大Y坐标 | 6位小数 | +| **标签属性** ||||| +| `drawAreaLabelStatus` | SSObj_DrawAreaLabelStatus | string | 区域标签状态 | - | +| `areaLabelX` | SSObj_AreaLabelX | double | 标签X坐标 | - | +| `areaLabelY` | SSObj_AreaLabelY | double | 标签Y坐标 | - | + +### 注记属性索引 + +注记属性专用于注记对象(e_Note_Obj),控制字体、文本内容、对齐方式、角度等显示效果。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L87-L105) + +| 属性常量 | 属性名 | 数据类型 | 说明 | 可读写 | +|---------|--------|---------|------|-------| +| **字体属性** ||||| +| `fontName` | SSObj_FontName | string | 字体名称 | 可写 | +| `fontWidth` | SSObj_FontWidth | double | 字体宽度 | 可写 | +| `fontHeight` | SSObj_FontHeight | double | 字体高度 | 可写 | +| `fontClass` | SSObj_FontClass | string | 注记分类 | 可写 | +| **文本属性** ||||| +| `fontString` | SSObj_FontString | string | 注记文本内容 | 可写 | +| `fontStringCount` | SSObj_FontStringCount | int | 字符串长度 | 只读 | +| `fontRealHeight` | SSObj_FontRealHeight | double | 实际显示高度 | 只读 | +| `fontRealLength` | SSObj_FontRealLength | double | 实际显示长度 | 只读 | +| **对齐与定位** ||||| +| `fontAlignment` | SSObj_FontAlignment | int | 对齐方式 | 可写 | +| `fontPosType` | SSObj_FontPosType | int | 定位类型 | 可写 | +| `fontDirection` | SSObj_FontDirection | int | 文字方向 | 可写 | +| **角度属性** ||||| +| `fontWordAngle` | SSObj_FontWordAngle | double | 单词旋转角度 | 可写 | +| `fontStringAngle` | SSObj_FontStringAngle | double | 字符串旋转角度 | 可写 | +| `fontItalicAngle` | SSObj_FontItalicAngle | double | 斜体角度 | 可写 | +| `fontDownAngle` | SSObj_FontDownAngle | double | 下划线角度 | 可写 | +| **样式属性** ||||| +| `fontWeight` | SSObj_FontWeight | int | 字体粗细 | 可写 | +| `fontUnderLine` | SSObj_FontUnderLine | int | 下划线标志 | 可写 | +| `fontInterval` | SSObj_FontInterval | double | 字符间距 | 可写 | + +### 操作属性索引 + +操作属性用于触发特定的地物处理操作,而非存储常规属性值。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L107-L109) + +| 属性常量 | 属性名 | 操作类型 | 说明 | +|---------|--------|---------|------| +| `reverse` | SSObj_Reverse | 方向反转 | 值为1时执行反转操作 | +| `reference` | SSObj_Reference | 引用关系 | 当前未实现 | + +## 核心方法参考 + +### 属性索引管理 + +ObjBaseAttr 提供三个核心方法用于属性名称与索引的双向映射: + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L111-L178) + +| 方法名 | 功能 | 参数 | 返回值 | +|--------|------|------|-------| +| `registerObjBaseAttrName(name)` | 注册新属性名到索引表 | name: 属性名(自动去除SSObj_前缀) | 属性索引 | +| `get_value_index(field)` | 获取属性名的索引 | field: 属性名(支持SSObj_前缀) | 索引值,未找到返回-1 | +| `get_value_index_param(field)` | 解析带参数的属性名 | field: 格式为'属性名(参数)' | (索引, 参数字符串) | + +**命名规范**:属性名在内部存储时自动转换为小写并去除 `SSObj_` 前缀,外部访问时两种形式均可识别。 + +### 属性值读写 + +#### getGeoValue 方法 + +获取单个地物对象的属性值,支持动态参数解析和多类型对象处理。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L188-L360) + +```python +def getGeoValue(map: ScaleMap, geo: GeoBase, field: str) -> str +``` + +**处理流程**: + +```mermaid +flowchart TD + A[调用 getGeoValue] --> B[解析属性名和参数] + B --> C{属性索引是否存在?} + C -->|否| D[返回空字符串] + C -->|是| E{对象类型?} + E -->|注记对象| F[处理注记专用属性] + E -->|通用对象| G[处理公共基本属性] + F --> H{有值返回?} + G --> H + H -->|是| I[返回属性值] + H -->|否| J[处理坐标点属性] + J --> K{有值返回?} + K -->|是| I + K -->|否| L[处理几何量属性] + L --> I +``` + +**参数支持示例**: +- `SSObj_X(0)` → 获取第一个点的X坐标 +- `SSObj_PointName(2)` → 获取第三个点的名称 +- `SSObj_Area` → 获取对象面积 + +#### setGeoValue 方法 + +批量设置多个地物对象的属性值,支持扩展属性和基本属性的统一处理接口。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L362-L624) + +```python +def setGeoValue(map: ScaleMap, geoList: GeoBaseList, field: str, value: str) +``` + +**扩展属性处理**:当属性名以 `[` 开头时,系统将其识别为扩展属性,存储在 MemoData 中。 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L364-L394) + +**颜色值格式支持**: +- 颜色号格式:`COLORNO(1)` +- RGB格式:`RGB(255,123,224)` +- 数值格式:`16777215`(24位颜色值) + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L408-L411) + +## 属性索引值映射表 + +为便于直接使用,下表列出了所有属性的实际索引值(基于初始化顺序): + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L13-L36) + +| 索引 | 属性名(无前缀) | 属性常量 | +|-----|----------------|---------| +| 0 | angle | `self.angle` | +| 1 | area | `self.area` | +| 2 | arealabelx | `self.areaLabelX` | +| 3 | arealabely | `self.areaLabelY` | +| 4 | byname | `self.byname` | +| 5 | code | `self.code` | +| 6 | color | `self.color` | +| 7 | createdata | `self.createTime` | +| 8 | datamark | `self.dataMark` | +| 9 | drawarealabelstatus | `self.drawAreaLabelStatus` | +| 10 | ellipsoidarea1 | `self.ellipsoidArea1` | +| 11 | ellipsoidarea2 | `self.ellipsoidArea2` | +| 12 | fontalignment | `self.fontAlignment` | +| 13 | fontclass | `self.fontClass` | +| 14 | fontdownangle | `self.fontDownAngle` | +| 15 | fontheight | `self.fontHeight` | +| 16 | fontitalicangle | `self.fontItalicAngle` | +| 17 | fontinterval | `self.fontInterval` | +| 18 | fontname | `self.fontName` | +| 19 | fontpos | `self.fontPosType` | +| 20 | fontrealheight | `self.fontRealHeight` | +| 21 | fontreallength | `self.fontRealLength` | +| 22 | fontstring | `self.fontString` | +| 23 | fontstringangle | `self.fontStringAngle` | +| 24 | fontstringcount | `self.fontStringCount` | +| 25 | fontunderline | `self.fontUnderLine` | +| 26 | fontwidth | `self.fontWidth` | +| 27 | fontwordangle | `self.fontWordAngle` | +| 28 | groupid | `self.groupID` | +| 29 | hatchdensityscale | `self.hatchDensityScale` | +| 30 | hatchstyle | `self.hatchStyle` | +| 31 | id | `self.id` | +| 32 | lshapeoffset | `self.lShapeOffset` | +| 33 | length | `self.length` | +| 34 | length3d | `self.length3D` | +| 35 | layername | `self.layerName` | +| 36 | linetype | `self.lineType` | +| 37 | linewidth | `self.lineWidth` | +| 38 | max | `self.maxX` | +| 39 | maxy | `self.maxY` | +| 40 | memodata | `self.memoData` | +| 41 | minx | `self.minX` | +| 42 | miny | `self.minY` | +| 43 | modifydata | `self.modifyTime` | +| 44 | name | `self.name` | +| 45 | pointcount | `self.pointCount` | +| 46 | pointname | `self.pointName` | +| 47 | pointtype | `self.pointType` | +| 48 | reference | `self.reference` | +| 49 | relationid | `self.relationID` | +| 50 | reverse | `self.reverse` | +| 51 | scale | `self.scaleX` | +| 52 | scalex | `self.scaleX` | +| 53 | scaley | `self.scaleY` | +| 54 | scalexy | `self.scaleXY` | +| 55 | status | `self.status` | +| 56 | type | `self.type` | +| 57 | x | `self.x` | +| 58 | y | `self.y` | +| 59 | z | `self.z` | + +**注意**:索引值按属性名字母顺序排序,通过 `valueNames.sort()` 维护。使用属性常量(如 `attr.area`)比直接使用索引值更具可读性和维护性。 + +## 使用场景与最佳实践 + +### 基础属性访问 + +```python +# 获取对象面积 +area_value = attr.getGeoValue(map, geo, "SSObj_Area") + +# 修改对象颜色(支持多种格式) +attr.setGeoValue(map, geoList, "SSObj_Color", "RGB(255,0,0)") +attr.setGeoValue(map, geoList, "SSObj_Color", "16711680") # 红色 +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L332-L335) + +### 坐标点操作 + +```python +# 获取第一个点的X坐标 +x0 = attr.getGeoValue(map, geo, "SSObj_X(0)") + +# 设置第三个点的Z值为100.0 +attr.setGeoValue(map, geoList, "SSObj_Z(2)", "100.0") +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L307-L318) + +### 扩展属性管理 + +```python +# 设置单个扩展属性 +attr.setGeoValue(map, geoList, "[自定义属性]", "属性值") + +# 批量设置多个扩展属性 +attr.setGeoValue(map, geoList, "[属性1,属性2,属性3]", "值1,值2,值3") +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L364-L394) + +### 注记对象样式控制 + +```python +# 设置注记字体和大小 +attr.setGeoValue(map, geoList, "SSObj_FontName", "宋体") +attr.setGeoValue(map, geoList, "SSObj_FontHeight", "12.5") + +# 设置注记旋转角度 +attr.setGeoValue(map, geoList, "SSObj_FontStringAngle", "30.0") +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L535-L594) + +## 与其他模块的交互 + +ObjBaseAttr 作为属性管理中枢,与多个核心模块协同工作: + +```mermaid +graph LR + A[ObjBaseAttr] --> B[PySSCore
GeoBase/GeoBaseList] + A --> C[PySSMath
几何计算函数] + A --> D[PySSMap
ScaleMap] + + B --> E[提供地物对象] + C --> F[3D长度计算] + D --> G[地图比例尺] + + A --> H[SSProcessManager] + H --> I[选择集管理] + I --> A[属性读写] +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L1-L4) + +**关键依赖**: +- `GeoBase`:地物对象基类,提供属性访问方法 +- `GeoBaseList`:地物对象列表,支持批量操作 +- `ScaleMap`:地图对象,提供比例尺等上下文信息 +- `get3DLength`:来自 PySSMath 的三维长度计算函数 +- `getColorValue`:颜色值解析函数 + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L336-L340) + +## 参考文档延伸 + +要深入了解属性的具体使用场景,可参考以下文档: + +- [获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi):详细说明属性读取的完整流程 +- [修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi):批量属性修改的操作指南 +- [地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie):属性的业务含义详解 +- [扩展属性与自定义属性](18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing):MemoData 扩展机制说明 +- [SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api):结合选择集使用属性的示例 \ No newline at end of file diff --git a/docs/content/42-di-li-dui-xiang-lei-xing-ding-yi.md b/docs/content/42-di-li-dui-xiang-lei-xing-ding-yi.md new file mode 100644 index 0000000..af9a05b --- /dev/null +++ b/docs/content/42-di-li-dui-xiang-lei-xing-ding-yi.md @@ -0,0 +1,622 @@ +地理对象类型定义是 SunvStation 系统中地理数据模型的核心组成部分。系统采用面向对象的设计模式,通过类继承体系和类型标识来管理不同形态的地理要素。理解这些类型定义及其相互关系,是进行地理数据处理、空间分析和可视化的基础。 + +本页面将系统性地介绍地理对象的类型体系、类结构、属性机制以及相关的类型识别和转换方法。建议在学习本页面之前,先了解 [SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou) 和 [C++ 扩展模块与 Python 接口](10-c-kuo-zhan-mo-kuai-yu-python-jie-kou)。完成本页面学习后,可以继续学习 [创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) 和 [地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)。 + +Sources: [PySSCore.py](PySSCore.py#L2600-L3200) + +## 地理对象类型体系 + +SunvStation 系统定义了四种基础地理对象类型,每种类型对应不同的几何形态和应用场景。这些类型通过整数标识符进行区分,并与特定的几何类相对应。类型体系的设计遵循简单、明确、可扩展的原则,为地理数据的存储、查询和展示提供了统一的抽象层次。 + +### 四种基础类型 + +| 类型标识 | 类型名称 | 几何类 | 典型应用场景 | 几何特征 | +|---------|---------|--------|------------|---------| +| 0 | 点对象 | PointObject | 控制点、界碑、建筑物中心点、测量点 | 零维几何,由单个坐标点定义 | +| 1 | 线对象 | LineObject | 道路、管线、河流中心线、边界线 | 一维几何,由有序坐标点序列定义 | +| 2 | 面对象 | AreaObject | 建筑物轮廓、湖泊、行政区划、地块 | 二维几何,由闭合坐标环定义 | +| 3 | 注记对象 | MarkNote | 文字标注、地名说明、图例说明 | 特殊对象,结合文本与定位点 | + +### 类型标识的作用 + +类型标识是系统内部识别对象类型的核心机制,其作用体现在以下几个方面: + +- **对象创建**:`createDefaultGeoBase(obj_type, dataset)` 方法通过类型标识决定创建具体的几何对象实例 +- **类型判断**:`getObjectType()` 方法返回当前对象的类型标识,用于运行时类型识别 +- **数据查询**:查询条件中可以通过类型标识过滤特定类型的地理对象 +- **符号化渲染**:系统根据对象类型应用不同的符号化规则和渲染策略 + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120) + +## 类继承架构 + +地理对象类型体系基于面向对象的继承架构设计,通过基类和派生类的层次结构实现代码复用和多态性。理解这个架构有助于掌握各类地理对象的共性和特性,以及如何正确使用它们提供的方法和属性。 + +### 继承层次结构 + +```mermaid +classDiagram + GeoBase <|-- PointObject + GeoBase <|-- LineObject + GeoBase <|-- AreaObject + GeoBase <|-- MarkNote + + class GeoBase { + <<抽象基类>> + +getId() int + +setId(id) + +getCode() int + +setCode(code) + +getColor() int + +setColor(color) + +getObjectType() int + +getArea(haveSign) float + +getPerimeter() float + +setStatus(flag, status) + +getStatus(status) bool + } + + class PointObject { + +getObjectType() int + +getScaleX/Y/Z() float + +setScaleX/Y/Z(scale) + +rotate(point, vct) + } + + class LineObject { + +getObjectType() int + +getPerimeter() float + +getArea(haveSign) float + +setLineThickness(thickness) + +getLineThickness() float + } + + class AreaObject { + +getObjectType() int + +getArea(haveSign) float + +getPerimeter() float + +getLoops() PointArray + } + + class MarkNote { + +getObjectType() int + +setNote(note) + +getNote() string + +setFontHeight(height) + +setFontWidth(width) + +setAlignment(alignment) + +setNoteClass(number) + } +``` + +### GeoBase 基类 + +`GeoBase` 是所有地理对象的抽象基类,定义了所有地理对象共有的属性和方法。基类的设计遵循"提取共性、隔离差异"的原则,将通用的功能集中在基类中实现,而将特定类型的几何操作委托给派生类。 + +**核心属性**: +- **ID**:对象的唯一标识符(`getId()`/`setId()`) +- **Code**:地物编码,关联符号定义(`getCode()`/`setCode()`) +- **Color**:颜色值(`getColor()`/`setColor()`) +- **LineType/LineWidth**:线型和线宽(`getLineType()`/`setLineType()`, `getLineWidth()`/`setLineWidth()`) +- **Status**:对象状态标志(`setStatus()`/`getStatus()`) + +**核心方法**: +- `getObjectType()`:获取对象类型标识(返回 0、1、2 或 3) +- `getArea()`:计算面积(仅 AreaObject 和 LineObject 返回有效值) +- `getPerimeter()`:计算周长(仅 AreaObject 和 LineObject 返回有效值) + +Sources: [PySSCore.py](PySSCore.py#L2000-L2800) + +### 派生类特性 + +各派生类在继承基类功能的基础上,针对特定的几何类型提供了专门的属性和方法: + +**PointObject(点对象)** +- 支持三维缩放变换(`setScaleX/Y/Z()`) +- 提供旋转功能(`rotate()`) +- 主要用于表示离散的地理位置或标记点 + +**LineObject(线对象)** +- 继承面积计算方法(可用于计算线性要素的缓冲区面积) +- 提供线厚度设置(`setLineThickness()`) +- 由一系列有序坐标点构成,表示连续的地理要素 + +**AreaObject(面对象)** +- 提供面积和周长的精确计算 +- 支持多环结构(通过 `getLoops()` 获取) +- 由闭合坐标环构成,表示有界区域 + +**MarkNote(注记对象)** +- 继承自 GeoBase 但具有独特的属性体系 +- 提供文本内容管理(`setNote()`/`getNote()`) +- 支持字体属性设置(高度、宽度、对齐方式等) +- 提供注记类关联(`setNoteClass()`) + +Sources: [PySSCore.py](PySSCore.py#L2800-L3000) + +## GeoObject 容器对象 + +`GeoObject` 是地理对象的容器类,与具体的几何对象(PointObject、LineObject、AreaObject、MarkNote)协同工作,形成完整的地物对象体系。理解容器对象与几何对象的关系,对于正确创建、管理和操作地物对象至关重要。 + +### 容器与几何对象的分离设计 + +SunvStation 系统采用容器对象与几何对象分离的设计模式,每个地理地物由两个核心组件构成: + +- **GeoObject 容器**:负责数据集关联、对象 ID 管理、属性存储和事务控制 +- **几何对象(GeoBase 派生类)**:负责几何数据存储、空间计算和图形属性 + +这种分离设计的优势在于: +- **关注点分离**:数据管理与几何计算职责清晰 +- **灵活组合**:同一容器可以承载不同类型的几何对象 +- **事务支持**:容器提供统一的事务管理接口 + +### GeoObject 核心功能 + +```mermaid +flowchart LR + subgraph GeoObject容器 + A[数据集引用] + B[唯一ID管理] + C[属性存储] + D[事务控制] + end + + subgraph 几何对象 + E[PointObject] + F[LineObject] + G[AreaObject] + H[MarkNote] + end + + A --> E + A --> F + A --> G + A --> H + + C --> E + C --> F + C --> G + C --> H +``` + +**数据集关联**:GeoObject 维护到数据集的引用,确保对象与数据库表的正确映射 + +**唯一 ID 管理**:通过 `generateUniqueId()` 生成全局唯一的对象标识符 + +**属性管理**:提供属性和图形信息的统一访问接口(`getAttribute()`/`getGraphicInfo()`) + +**几何对象绑定**:通过 `setGeoBase()`/`getGeoBase()` 方法管理几何对象的关联 + +Sources: [PySSCore.py](PySSCore.py#L900-L1000) + +## 类型识别与转换机制 + +系统提供了完整的类型识别和转换机制,支持运行时类型判断和安全地类型转换。这些机制在处理异构对象集合、实现多态操作和类型安全访问时发挥关键作用。 + +### getObjectType() 类型识别方法 + +所有地理对象都实现了 `getObjectType()` 方法,该方法返回对象的类型标识符。这是运行时类型判断的主要方式: + +```python +# 示例:判断对象类型 +geo = getGeoObject() # 获取一个地理对象 +obj_type = geo.getObjectType() + +if obj_type == 0: + print("这是一个点对象") +elif obj_type == 1: + print("这是一个线对象") +elif obj_type == 2: + print("这是一个面对象") +elif obj_type == 3: + print("这是一个注记对象") +``` + +### 类型转换函数 + +系统提供了一组类型转换函数,用于在 `GeoBase` 基类指针和具体类型指针之间进行安全转换: + +| 转换函数 | 目标类型 | 转换条件 | 失败返回 | +|---------|---------|---------|---------| +| `castToPointObject(geo)` | PointObject | 对象类型为 0 | None | +| `castToLineObject(geo)` | LineObject | 对象类型为 1 | None | +| `castToAreaObject(geo)` | AreaObject | 对象类型为 2 | None | +| `castToMarkNote(geo)` | MarkNote | 对象类型为 3 | None | + +**转换示例**: + +```python +# 安全的类型转换 +from sunvpy.PySSCore import castToLineObject, castToMarkNote + +def processObject(geo): + obj_type = geo.getObjectType() + + if obj_type == 1: + # 转换为线对象并访问线特有方法 + line = castToLineObject(geo) + if line is not None: + thickness = line.getLineThickness() + print(f"线对象厚度: {thickness}") + elif obj_type == 3: + # 转换为注记对象并访问注记特有方法 + note = castToMarkNote(geo) + if note is not None: + text = note.getNote() + print(f"注记内容: {text}") +``` + +### 类型转换的工作原理 + +类型转换函数在 C++ 层面实现,采用动态类型检查机制: + +```mermaid +sequenceDiagram + participant Py as Python代码 + participant SWIG as SWIG接口 + participant Cpp as C++实现 + + Py->>SWIG: castToLineObject(geo) + SWIG->>Cpp: 调用转换函数 + Cpp->>Cpp: 检查对象类型 + alt 类型匹配 (getObjectType() == 1) + Cpp->>Cpp: 执行类型转换 + Cpp->>SWIG: 返回 LineObject 指针 + SWIG->>Py: 返回 Python 对象 + else 类型不匹配 + Cpp->>SWIG: 返回 NULL + SWIG->>Py: 返回 None + end +``` + +Sources: [PySSCore.py](PySSCore.py#L3000-L3100) + +## 地理对象列表类型 + +为了高效管理大量同类型地理对象,系统为每种地理对象类型提供了专用的列表容器。这些列表容器继承自标准模板库的 vector 容器,提供了丰富的集合操作接口。 + +### 列表类型体系 + +| 列表类型 | 元素类型 | 典型用途 | 特殊方法 | +|---------|---------|---------|---------| +| `PointObjectList` | PointObject | 控制点集合、测量点集 | 通用列表方法 | +| `LineObjectList` | LineObject | 道路网络、管线系统 | 通用列表方法 | +| `AreaObjectList` | AreaObject | 建筑物群、地块集合 | 通用列表方法 | +| `MarkNoteList` | MarkNote | 标注集合、图例列表 | 通用列表方法 | +| `GeoBaseList` | GeoBase | 混合类型对象集合 | 通用列表方法 | + +### 列表通用方法 + +所有列表容器都提供以下核心方法: + +**基本操作**: +- `size()`:获取元素数量 +- `empty()`:判断是否为空 +- `clear()`:清空列表 +- `append(x)`:在尾部添加元素 +- `pop()`:移除并返回尾部元素 + +**访问操作**: +- `front()`:访问首元素 +- `back()`:访问尾元素 +- `__getitem__(index)`:索引访问(支持负索引) +- `iterator()`:获取迭代器(支持 Python 迭代协议) + +**修改操作**: +- `insert(index, x)`:在指定位置插入元素 +- `erase(index)`:删除指定位置元素 +- `resize(n)`:调整列表大小 + +**列表操作**: +- `swap(other)`:交换两个列表内容 +- `assign(n, x)`:用 n 个 x 填充列表 + +### 类型转换列表 + +系统还提供了列表类型的转换函数,用于在不同列表类型之间进行转换: + +- `castToMarkNoteList(geos)`:将 `GeoBaseList` 转换为 `MarkNoteList` +- `castToGeoBaseList(geos)`:将 `MarkNoteList` 转换为 `GeoBaseList` + +这些转换函数在处理混合类型对象集合时非常有用,例如在选择集操作中。 + +**示例**: + +```python +from sunvpy.PySSCore import GeoBaseList, MarkNoteList, castToMarkNoteList + +# 创建通用列表 +geo_list = GeoBaseList() + +# 添加不同类型的对象 +geo_list.append(point_obj) # 添加点对象 +geo_list.append(line_obj) # 添加线对象 +geo_list.append(note_obj) # 添加注记对象 + +# 转换为注记列表(仅提取注记对象) +note_list = castToMarkNoteList(geo_list) +print(f"注记对象数量: {note_list.size()}") + +# 遍历注记列表 +for i in range(note_list.size()): + note = note_list[i] + print(f"注记内容: {note.getNote()}") +``` + +Sources: [PySSCore.py](PySSCore.py#L3100-L3400) + +## 属性系统与地物基本属性 + +地理对象的属性系统通过 `ObjBaseAttr` 类进行统一管理,该类定义了所有地物对象支持的基本属性名称和索引。属性系统为地物对象的元数据管理提供了标准化的接口,确保了属性访问的一致性和可扩展性。 + +### ObjBaseAttr 类结构 + +`ObjBaseAttr` 类采用注册表模式,维护属性名称到索引的映射关系: + +```python +class ObjBaseAttr: + def __init__(self): + self.valueNames = [] # 属性名称列表(自动排序) + + # 注册所有属性名(去前缀 SSObj_,按升序排列) + attr_names = [ + # 点属性 + "SSObj_PointName", "SSObj_PointCount", "SSObj_PointType", + "SSObj_X", "SSObj_Y", "SSObj_Z", + # 通用属性 + "SSObj_Code", "SSObj_Byname", "SSObj_LayerName", + "SSObj_Color", "SSObj_LineType", "SSObj_LineWidth", + "SSObj_ID", "SSObj_GroupID", "SSObj_Name", "SSObj_Type", + "SSObj_Status", "SSObj_DataMark", "SSObj_RelationID", + "SSObj_CreateTime", "SSObj_ModifyTime", + # ... 更多属性 + ] +``` + +### 属性分类体系 + +属性按照功能和用途分为多个类别,每类属性对应不同的应用场景和操作需求: + +**几何属性**: +- 点坐标:`SSObj_X`, `SSObj_Y`, `SSObj_Z` +- 点信息:`SSObj_PointName`, `SSObj_PointCount`, `SSObj_PointType` +- 几何参量:`SSObj_Area`, `SSObj_Length`, `SSObj_3DLength` +- 边界框:`SSObj_minX`, `SSObj_minY`, `SSObj_maxX`, `SSObj_maxY` + +**显示属性**: +- 颜色:`SSObj_Color`(前景色)、`SSObj_Area`(填充色) +- 线型:`SSObj_LineType`(线型样式)、`SSObj_LineWidth`(线宽) +- 变换:`SSObj_Angle`(旋转角度)、`SSObj_ScaleX/Y/XY`(缩放) + +**数据属性**: +- 标识:`SSObj_Code`(地物编码)、`SSObj_ID`(对象 ID)、`SSObj_Name`(对象名称) +- 分组:`SSObj_GroupID`(分组 ID)、`SSObj_LayerName`(图层名称) +- 时间:`SSObj_CreateTime`(创建时间)、`SSObj_ModifyTime`(修改时间) + +**注记属性**(仅 MarkNote 对象): +- 字体:`SSObj_FontName`, `SSObj_FontHeight`, `SSObj_FontWidth` +- 对齐:`SSObj_FontAlignment`, `SSObj_FontPosType` +- 方向:`SSObj_FontDirection`, `SSObj_FontWordAngle`, `SSObj_FontStringAngle` +- 样式:`SSObj_FontWeight`, `SSObj_FontItalicAngle`, `SSObj_FontUnderLine` + +### 属性索引机制 + +`ObjBaseAttr` 提供了属性名称到索引的映射功能,支持高效的属性访问: + +**核心方法**: + +- `get_value_index(field: str) -> int`:根据属性名获取索引(去除 SSObj_ 前缀) +- `get_value_index_param(field: str) -> tuple`:解析带参数的属性名,返回索引和参数 +- `getGeoValue(map, geo, field) -> str`:获取地理对象的属性值 + +**索引规则**: +- 属性名自动去除 `SSObj_` 前缀并转换为小写 +- 支持带参数的属性名(如 `SSObj_Code(param)`) +- 属性名列表自动按升序排列,确保索引稳定性 + +**使用示例**: + +```python +from sunvpy.ObjBaseAttr import ObjBaseAttr + +attr_mgr = ObjBaseAttr() + +# 获取属性索引 +code_idx = attr_mgr.get_value_index("SSObj_Code") +name_idx = attr_mgr.get_value_index("SSObj_Name") +color_idx = attr_mgr.get_value_index("color") # 不需要前缀 + +print(f"Code 索引: {code_idx}") +print(f"Name 索引: {name_idx}") +print(f"Color 索引: {color_idx}") + +# 获取对象属性值 +value = attr_mgr.getGeoValue(map, geo, "SSObj_Area") +print(f"面积: {value}") +``` + +Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L1-L200) + +## 对象类型与属性的关系 + +不同类型的地理对象在属性支持上存在差异,理解这些差异有助于正确地设置和访问对象属性。某些属性是所有类型通用的,而某些属性仅对特定类型有效。 + +### 通用属性 vs 特定类型属性 + +**所有地理对象共有的属性**: + +- `SSObj_Code`:地物编码 +- `SSObj_ID`:对象唯一标识 +- `SSObj_Name`:对象名称 +- `SSObj_Color`:颜色 +- `SSObj_LineType`:线型 +- `SSObj_LineWidth`:线宽 +- `SSObj_Status`:对象状态 +- `SSObj_CreateTime` / `SSObj_ModifyTime`:时间戳 + +**仅 PointObject 支持的属性**: + +- 点坐标属性:`SSObj_X`, `SSObj_Y`, `SSObj_Z` +- 点信息:`SSObj_PointName`, `SSObj_PointCount`, `SSObj_PointType` + +**仅 LineObject 和 AreaObject 支持的属性**: + +- 几何参量:`SSObj_Length`, `SSObj_3DLength`, `SSObj_Area` +- 边界框:`SSObj_minX`, `SSObj_minY`, `SSObj_maxX`, `SSObj_maxY` + +**仅 AreaObject 支持的属性**: + +- 椭球面积:`SSObj_EllipsoidArea1`, `SSObj_EllipsoidArea2` +- 面积标注:`SSObj_DrawAreaLabelStatus`, `SSObj_AreaLabelX`, `SSObj_AreaLabelY` + +**仅 MarkNote 支持的属性**: + +- 所有以 `SSObj_Font` 开头的字体相关属性 +- `SSObj_FontClass`:注记类 +- `SSObj_FontString`:注记文本内容 + +### 属性有效性判断 + +系统提供了多种方式来判断属性的有效性: + +**基于对象类型的判断**: + +```python +def isValidAttribute(geo, attr_name): + """判断属性是否对当前对象类型有效""" + obj_type = geo.getObjectType() + attr_name_lower = attr_name.lower().replace('ssobj_', '') + + # 点对象专用属性 + if attr_name_lower in ['x', 'y', 'z', 'pointname', 'pointcount', 'pointtype']: + return obj_type == 0 + + # 线对象和面对象的几何属性 + if attr_name_lower in ['length', '3dlength']: + return obj_type in [1, 2] + + # 面对象专用属性 + if attr_name_lower in ['ellipsoidarea1', 'ellipsoidarea2', 'arealabelx', 'arealabely']: + return obj_type == 2 + + # 注记对象专用属性 + if attr_name_lower.startswith('font'): + return obj_type == 3 + + # 通用属性 + return True +``` + +**基于返回值的判断**: + +```python +# 几何属性仅在特定对象类型返回有效值 +area = geo.getArea() +if area > 0.0: + print(f"对象面积为: {area}") # 仅 AreaObject 和 LineObject 有有效面积 + +perimeter = geo.getPerimeter() +if perimeter > 0.0: + print(f"对象周长为: {perimeter}") # 仅 AreaObject 和 LineObject 有有效周长 +``` + +Sources: [PySSCore.py](PySSCore.py#L2600-L2800) + +## 总结与最佳实践 + +地理对象类型定义是 SunvStation 系统地理数据模型的基础,掌握这些概念对于开发高效的地理数据处理脚本至关重要。以下是本页面介绍的核心要点和实际开发中的最佳实践建议。 + +### 核心概念回顾 + +1. **四种基础类型**:点(0)、线(1)、面(2)、注记(3),每种类型对应特定的几何类和应用场景 +2. **继承架构**:所有地理对象继承自 `GeoBase` 基类,共享通用属性和方法,同时提供类型特定的功能 +3. **容器分离**:`GeoObject` 作为容器管理数据和事务,几何对象负责几何计算和属性存储 +4. **类型识别**:通过 `getObjectType()` 方法进行运行时类型判断,使用类型转换函数进行安全类型转换 +5. **属性系统**:`ObjBaseAttr` 统一管理所有地物属性,支持标准化的属性访问机制 + +### 类型识别与处理最佳实践 + +**使用 `getObjectType()` 进行类型判断**: + +```python +# 推荐:显式类型检查 +def processGeoObject(geo): + obj_type = geo.getObjectType() + if obj_type == 0: + processPoint(geo) + elif obj_type == 1: + processLine(geo) + elif obj_type == 2: + processArea(geo) + elif obj_type == 3: + processNote(geo) + else: + print(f"未知对象类型: {obj_type}") +``` + +**使用类型转换函数安全访问类型特定方法**: + +```python +# 推荐:安全转换后访问 +def printObjectDetails(geo): + if geo.getObjectType() == 1: + line = castToLineObject(geo) + if line is not None: + print(f"线厚度: {line.getLineThickness()}") + + if geo.getObjectType() == 3: + note = castToMarkNote(geo) + if note is not None: + print(f"注记: {note.getNote()}") +``` + +### 属性访问最佳实践 + +**使用 `ObjBaseAttr` 统一管理属性索引**: + +```python +# 推荐:使用属性管理器 +attr_mgr = ObjBaseAttr() +code_idx = attr_mgr.get_value_index("Code") + +# 访问属性 +code_value = geo.getAttribute(code_idx) +``` + +**根据对象类型选择有效属性**: + +```python +# 推荐:判断属性有效性后再访问 +def safeGetArea(geo): + if geo.getObjectType() in [1, 2]: # 线对象和面对象 + area = geo.getArea() + return area if area > 0 else 0.0 + else: + return 0.0 # 点对象和注记对象无面积 +``` + +### 创建对象时的类型选择 + +**根据应用场景选择合适的对象类型**: + +```python +# 推荐:明确类型选择 +def createFeature(feature_type, coordinates): + if feature_type == 'control_point': + obj, geo = createDefaultGeoBase(0, dataset) # 点对象 + elif feature_type == 'road': + obj, geo = createDefaultGeoBase(1, dataset) # 线对象 + elif feature_type == 'building': + obj, geo = createDefaultGeoBase(2, dataset) # 面对象 + elif feature_type == 'label': + obj, geo = createDefaultGeoBase(3, dataset) # 注记对象 +``` + +### 后续学习建议 + +完成本页面学习后,建议继续深入以下相关主题: + +- **对象创建**:学习 [创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) 和 [通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang) +- **属性管理**:学习 [地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie) 和 [获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi) +- **类型转换**:学习 [SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api) 中的类型相关方法 +- **高级操作**:学习 [坐标转换工具](44-zuo-biao-zhuan-huan-gong-ju) 中的几何转换功能 \ No newline at end of file diff --git a/docs/content/43-shu-xue-ji-suan-gong-ju.md b/docs/content/43-shu-xue-ji-suan-gong-ju.md new file mode 100644 index 0000000..1cb396e --- /dev/null +++ b/docs/content/43-shu-xue-ji-suan-gong-ju.md @@ -0,0 +1,735 @@ +PySSMath 模块提供了丰富的数学计算功能,专为 GIS 和测绘应用设计。该模块通过 SWIG 封装底层 C++ 实现,提供高性能的几何计算、坐标转换、空间关系判断等核心算法库。本文档面向高级开发者,详细说明各类数学计算工具的 API 接口与应用场景。 + +Sources: [PySSMath.py](PySSMath.py#L1-L20) + +## 模块架构概览 + +PySSMath 模块采用分层架构设计,将数学计算功能划分为多个功能域。底层通过 `_PySSMath.pyd` C++ 扩展模块实现高效计算,上层 Python 接口提供类型安全的函数调用。 + +```mermaid +graph TB + A[PySSMath 模块] --> B[坐标系统转换] + A --> C[距离与长度计算] + A --> D[面积计算] + A --> E[角度与方位角] + A --> F[几何变换] + A --> G[空间关系判断] + A --> H[弧线与圆操作] + A --> I[点与线操作] + + B --> B1[deg/radian/dms转换] + C --> C1[点距离/线长度] + D --> D1[多边形面积/三角形面积] + E --> E1[方位角/夹角/方向] + F --> F1[旋转/偏移/缩放/镜像] + G --> G1[相交/包含/共线] + H --> H1[弧长/中点/打断] + I --> I1[插入/延伸/修剪] + + A --> J[基础数据结构] + J --> J1[Point3D] + J --> J2[Vec3d] + J --> J3[POINT3DLIST] + J --> J4[LINE3DLIST] +``` + +Sources: [PySSMath.py](PySSMath.py#L1-L120) + +## 基础数据结构 + +### Point3D - 三维点类 + +Point3D 是模块的核心数据结构,表示三维空间中的点,支持 x、y、z 坐标访问和丰富的运算符重载。 + +**构造方法**: +- `Point3D()` - 默认构造函数 +- `Point3D(x, y, z)` - 使用坐标构造 +- `Point3D(other)` - 拷贝构造 + +**核心属性与方法**: +- `x()`, `y()`, `z()` - 获取坐标分量 +- `set(x_arg, y_arg, z_arg)` - 设置坐标 +- `__getitem__(i)` / `__setitem__(i, value)` - 索引访问坐标(0=x, 1=y, 2=z) +- `__add__`, `__sub__`, `__neg__` - 向量运算 +- `epsilonEqual(other, epsilon)` - 带容差的相等判断 +- `getName()`, `setName(name)` - 点名称管理 + +Sources: [PySSMath.py](PySSMath.py#L710-L775) + +### Vec3d - 三维向量类 + +Vec3d 提供完整的向量运算功能,包括点积、叉积、缩放等操作。 + +**构造方法**: +- `Vec3d()` - 默认构造 +- `Vec3d(x, y, z)` - 使用分量构造 +- `Vec3d(other)` - 拷贝构造 + +**核心方法**: +- `dot(rhs)` - 点积运算 +- `cross(rhs)` - 叉积运算 +- `__mul__`, `__truediv__` - 标量乘除 +- `set(x_arg, y_arg, z_arg)` - 设置分量 +- `epsilonEqual(other, epsilon)` - 带容差的相等判断 + +Sources: [PySSMath.py](PySSMath.py#L5345-L5400) + +### 容器类 + +模块提供多种容器类用于管理点的集合: +- `POINT3DLIST` - 点列表容器 +- `LINE3DLIST` - 线列表容器 +- `LOOP3DLIST` - 环列表容器(支持带岛复杂面) +- `StringArray` - 字符串数组容器 + +这些容器均支持迭代器模式,提供 `size()`, `empty()`, `clear()`, `push_back()` 等标准容器操作。 + +Sources: [PySSMath.py](PySSMath.py#L122-L200) + +## 坐标系统转换 + +### 角度格式转换 + +PySSMath 提供多种角度表示形式之间的转换功能,支持弧度制、十进制度数、度分秒(DMS)格式互转。 + +| 函数名 | 功能描述 | 参数 | 返回值 | +|--------|----------|------|--------| +| `degToRadian(deg)` | 十进制度数转弧度 | deg: float | 弧度值 | +| `radianToDeg(dRadian)` | 弧度转十进制度数 | dRadian: float | 度数值 | +| `degToDms(deg)` | 十进制度数转度分秒 | deg: float | DMS 值 | +| `dmsToDeg(dms)` | 度分秒转十进制度数 | dms: float | 度数值 | +| `dmsToRadian(dDms)` | 度分秒转弧度 | dDms: float | 弧度值 | +| `radianToDms(dRadian)` | 弧度转度分秒 | dRadian: float | DMS 值 | +| `dmsToSec(dms)` | 度分秒转秒数 | dms: float | 秒数 | +| `secToDms(sec)` | 秒数转度分秒 | sec: float | DMS 值 | + +**角度调整函数**: +- `adjustAngle(dRadian)` - 调整弧度值到 [-π, π] 范围 +- `adjustDmsAngle(dAngle)` - 调整 DMS 角度值 +- `adjustDegAngle(dAngle)` - 调整度数值到 [0, 360] 范围 + +Sources: [PySSMath.py](PySSMath.py#L2772-L2787) + +### 极坐标与直角坐标转换 + +| 函数名 | 功能描述 | +|--------|----------| +| `rightToPolar(x, y)` | 直角坐标转极坐标 | +| `polarToRight(r, angle)` | 极坐标转直角坐标 | +| `getPolar(p1, p2, dist, dRadian)` | 从点 p1 按给定距离和方位角获取极坐标点 | +| `getPoint(p1, p2, dist, dRadian)` - 同 `getPolar` | + +Sources: [PySSMath.py](PySSMath.py#L2808-L2815) + +## 距离与长度计算 + +### 点与点距离 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `distance(p1, p2)` | 两点间二维距离(仅 xy) | float | +| `distance3d(p1, p2)` | 两点间三维距离 | float | +| `getDistSquare(p1, p2)` | 两点间距离的平方 | float | +| `get3dDistSquare(p1, p2)` | 两点间三维距离的平方 | float | + +Sources: [PySSMath.py](PySSMath.py#L2680-L2690) + +### 点到线距离 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `getDistPtToLine(p, p1, p2)` | 点到线段的距离 | float | +| `distPerpend(p0, p1, p2, pResPerpend, pResRelation)` | 点到线的垂距 | float | +| `distParallel(p0, p1, p2)` | 点到线的平行距 | float | + +Sources: [PySSMath.py](PySSMath.py#L2710-L2720) + +### 线段长度 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `getLinesSumlen(pList)` | 点列表构成线段的总长度(2D) | float | +| `getLinesSumlen3d(pList)` | 点列表构成线段的总长度(3D) | float | +| `getSumlen(pList, nLineType, mapScale)` | 获取长度(支持线型类型和比例尺) | float | +| `get3DLength(*args)` | 获取三维长度 | float | + +Sources: [PySSMath.py](PySSMath.py#L2692-L2700) + +### 高级距离查询 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `getNearDist(p0, pList, nOrder)` | 获取第 nOrder 近的距离 | float | +| `getNearstDistSquare(sp, Points, pNodeIndex, pSideIndex, pDirFlag, ptNearstOnline)` | 获取最近距离平方(附带详细信息) | float | +| `getDistForPoint(p, pList)` | 点到点列表中某点的距离 | float | +| `getDistDir(p, pList, irec, flag)` | 获取距离和方向 | float | + +Sources: [PySSMath.py](PySSMath.py#L2702-L2710) + +## 面积计算 + +### 多边形面积 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `getPolyArea(points, bHaveSgin)` | 计算多边形面积 | points: 点列表;bHaveSgin: 是否保留符号(正为逆时针) | +| `calTriHeight(a, b, c)` | 计算三角形高 | a, b, c: 三角形三边长 | + +Sources: [PySSMath.py](PySSMath.py#L2698-L2700) + +### 三角形面积 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `get3DArea(sp0, sp1, sp2)` | 计算三点构成的三角形面积 | float | +| `get3DAreaInDirection(direP, sp0, sp1, sp2)` | 计算指定方向下的三角形面积 | float | + +Sources: [PySSMath.py](PySSMath.py#L2793-L2796) + +## 角度与方位角计算 + +### 方位角计算 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `bearing(x1, y1, x0, y0)` | 计算从 (x0, y0) 到 (x1, y1) 的方位角 | 弧度值 | +| `bearing(p0, p1)` - 重载形式,使用 Point3D 对象 | +| `jiaoPingfenFangWei(x1, y1, x0, y0, x2, y2)` | 计算两线段的夹角平分方位角 | 弧度值 | + +Sources: [PySSMath.py](PySSMath.py#L2789-L2792) + +### 夹角计算 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `openAngle(p1, p0, p2)` | 计算 ∠p1p0p2 的夹角 | 弧度值 | +| `openAngleDeg(p1, p0, p2)` | 计算 ∠p1p0p2 的夹角(度数) | 度数 | + +Sources: [PySSMath.py](PySSMath.py#L2791-L2794) + +### 方向计算 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `get3Direction(p0, p1)` | 获取三维空间方向向量 | Vec3d | +| `getDirection(sp, sp1, sp2)` | 获取方向 | int | + +Sources: [PySSMath.py](PySSMath.py#L2794-L2797) + +## 几何变换操作 + +### 二维/三维变换 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `rotate2DList(Points, angle, basePoint)` | 二维点集旋转 | angle: 旋转角;basePoint: 旋转基点 | +| `rotate3DList(*args)` | 三维点集旋转 | 支持多种参数形式 | +| `offset2DList(Points, dx, dy)` | 二维点集平移 | dx, dy: 平移量 | +| `offset3DList(*args)` | 三维点集偏移 | 支持多种参数形式 | +| `zoom3DList(*args)` | 三维点集缩放 | 支持缩放中心 | +| `mirror3DList(baseP0, baseP1, Ps)` | 三维点集镜像 | baseP0, baseP1: 镜像轴上的两点;Ps: 点集 | +| `extend3DList(Points, dist, bTail)` | 点集延伸 | dist: 延伸距离;bTail: true=尾部延伸,false=头部延伸 | +| `smooth3DList(Ps0, fScale, nFlag)` | 点集平滑 | fScale: 平滑系数;nFlag: 平滑方式 | +| `mapping3DList(Points, ctrlPoints_old, ctrlPoints_new)` | 点集映射变换 | 基于控制点的仿射变换 | + +Sources: [PySSMath.py](PySSMath.py#L2819-L2840) + +### 系统坐标旋转 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `sysRotate(Xold, Yold, Xnew, Ynew, X0, Y0, dRadian)` | 系统旋转 | 将旧坐标系旋转至新坐标系 | +| `grdbodyRotate(*args)` | 网格体旋转 | 支持多种参数形式 | + +Sources: [PySSMath.py](PySSMath.py#L2816-L2820) + +## 几何关系判断 + +### 点与点关系 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `isSamePoint(p0, p1, epsilon)` | 判断两点是否相同(仅 xy) | boolean | +| `isSame3dPoint(p0, p1, epsilon)` | 判断两点是否相同(xyz) | boolean | +| `isSameCoord(*args)` | 判断坐标是否相同 | boolean | + +Sources: [PySSMath.py](PySSMath.py#L2867-L2877) + +### 点与线关系 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `isPointOnLine(sp, sp1, sp2, dbLimit)` | 判断点是否在线段上 | boolean | +| `pointOnLine(*args)` | 点在线上判断(重载) | boolean | +| `getOnLinePosition(sp, sp1, sp2, dbLimit)` | 获取点在线段上的位置 | float | + +Sources: [PySSMath.py](PySSMath.py#L2879-L2885) + +### 点与多边形关系 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `ptInPoly(x, y, pPolygon, limit)` | 判断点是否在多边形内 | boolean | +| `ptInTriangle(x, y, x1, y1, x2, y2, x3, y3)` | 判断点是否在三角形内 | boolean | +| `isPointListInPoly(*args)` | 判断点集是否在多边形内 | boolean | + +Sources: [PySSMath.py](PySSMath.py#L2901-L2905) + +### 线与线关系 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `isLineCrossLine(sp1, sp2, sp3, sp4)` | 判断两线段是否相交 | boolean | +| `isLineCrossLines(sp1, sp2, Ps)` | 判断线段与多段线是否相交 | boolean | +| `getCrossPoint(*args)` | 获取线段交点 | Point3D | +| `lineCrossLine(Line, Line1, newLine, pattr)` - 线段相交处理 | +| `lineCrossLines(*args)` - 线段与多段线相交处理 | + +Sources: [PySSMath.py](PySSMath.py#L5222-L5230) + +### 多边形与多边形关系 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `isPolygonInPolygon(rl, line, limit)` | 判断多边形是否在另一多边形内 | boolean | +| `isPolygonInPolygonComplex(polygon1, polygon2, limit)` | 判断复杂多边形关系(支持带岛) | int | + +**复杂多边形关系返回值**: +- `0` - 不相关 +- `1` - polygon1 包含 polygon2 +- `2` - polygon2 包含 polygon1 +- `3` - 相交 + +Sources: [PySSMath.py](PySSMath.py#L2893-L2903) + +### 其他几何关系 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `isClose(Ps)` | 判断点列是否闭合 | boolean | +| `isClockwise(Rgn)` | 判断多边形是否为顺时针 | boolean | +| `isCross(P0, P1, Ps, nAvoidPoint)` | 判断线段与点列是否相交 | boolean | +| `isSamePointList(Ps1, Ps2, dbLimit, bCompareName, bCompateType, bCompareZ)` | 判断两点集是否相同 | boolean | + +Sources: [PySSMath.py](PySSMath.py#L2862-L2892) + +## 弧线与圆操作 + +### 弧长计算 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `arc3pLength(spCenter, dbRadius, PsArc)` | 计算三点圆弧长度 | spCenter: 圆心;dbRadius: 半径;PsArc: 弧上三点 | +| `getArcLength(spCenter, dbRadius, bClockwise, sp1, sp2)` | 计算弧长 | sp1, sp2: 弧的起点和终点;bClockwise: 是否顺时针 | + +Sources: [PySSMath.py](PySSMath.py#L5233-L5240) + +### 弧线属性判断 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `isArcClockwise(PsArc, pCenter, pRadius)` | 判断弧线是否为顺时针 | boolean | +| `isPointOnArc(sp, PsArc, miniDist, pCenter, pRadius, nArc1, nArc2, bAdjustCoord)` | 判断点是否在弧上 | boolean | + +Sources: [PySSMath.py](PySSMath.py#L5242-L5250) + +### 弧线中点 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `getArcMidPoint(spCenter, dbRadius, bClockwise, sp1, sp2)` | 获取弧线中点 | Point3D | +| `getSupplementaryArc(PsArcIn, PsArcOut)` | 获取补弧 | boolean | + +Sources: [PySSMath.py](PySSMath.py#L5256-L5260) + +### 弧线打断与插入 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `arcBreakByPoint(PsArc, PsBreak, newArcList)` | 用点集打断弧线 | newArcList: 输出的弧线列表 | +| `circleBreakByPoint(PsCir, PsCross, newArcList)` | 用点集打断圆 | newArcList: 输出的弧线列表 | +| `insertPointToArc(sp, ArcPoints, miniDist)` | 在弧线上插入点 | miniDist: 最小距离限差 | +| `insertPointToPLineArc(sp, nLineType, PsLine, miniDist)` - 在折线弧上插入点 | +| `adjustPointToPLineArc(sp, nLineType, PsLine, pRefPoint)` - 调整点到折线弧上 | + +Sources: [PySSMath.py](PySSMath.py#L5252-L5258) + +### 极坐标弧生成 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `xysa_Arc(spCenter, dbRadius, bClockwise, sp1, sp2, dbArcLen, nFlag, pAngle)` | 极坐标法生成弧点 | dbArcLen: 弧长;nFlag: 标志;pAngle: 输出角度 | + +Sources: [PySSMath.py](PySSMath.py#L5231-L5232) + +## 点与线操作 + +### 点插入与延伸 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `innerInsertPoint(sp1, sp2, dbDist, Ps)` | 在两点之间插入点 | dbDist: 距离;Ps: 输出点集 | +| `getInsertPoint(Ps, dbInterv)` | 按间隔插入点 | dbInterv: 间隔距离 | +| `getIntervPoint(Ps, dbInterv, pIndexs)` - 获取间隔点(附带索引) | +| `getlinesIntervP(pList, ResList, dInterv, dZongChang)` - 按总长和间隔获取点 | +| `innerInsertCor(Begin, End, nCount, PointList)` - 在两点间插入 nCount 个点 | +| `extend3DList_Done(Points, dbDist, bTail)` - 延伸点集 | + +Sources: [PySSMath.py](PySSMath.py#L5325-L5335) + +### 点修剪与去重 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `removeSameCoordPoint(*args)` - 移除相同坐标点 | +| `removeRepeatPoint(Ps, dbLimit)` - 移除重复点 | dbLimit: 限差 | +| `getRepeatPoint(Ps, nRepeats, dbLimit)` - 获取重复点 | nRepeats: 重复次数 | + +Sources: [PySSMath.py](PySSMath.py#L5315-L5320) + +### 线段打断 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `lineBreakByPoint(Lines, nAttrs, CrossList, newLines, bIsPLine)` - 用点集打断线段 | +| `plineSplit(PsPLine, nLineType, LineList, nAttrs, bClearPointType)` - 拆分多段线 | +| `plineMerge(*args)` - 合并多段线 | +| `arcSplit(PsArc, LineList, nAttrs)` - 打断弧线 | + +Sources: [PySSMath.py](PySSMath.py#L5267-L5275) + +### 中点与垂足 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `midPoint(*args)` - 获取中点 | Point3D | +| `calPoint(*args)` - 计算点位置 | Point3D | +| `getLineMidPoint(sp, Ps, pInsertAt)` - 获取线段中点 | Point3D | +| `perpend(p, p1, p2)` - 计算垂足 | Point3D | +| `perpendLize(p0, p1, p2)` - 垂直化操作 | Point3D | + +Sources: [PySSMath.py](PySSMath.py#L2841-L2849) + +### 高程插值 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `altitudeInterpolation(sp, sp1, sp2)` - 高程插值 | float | +| `interpolationPoint(sp1, sp2, dbZ, sp)` - 按高程插值点 | Point3D | +| `insertZValue(sp, sp0, sp1)` - 插入 Z 值 | Point3D | + +Sources: [PySSMath.py](PySSMath.py#L2850-L2854) + +## 高级几何操作 + +### 平行线生成 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `parallel(PListFrom, PListTo, dWidth, nDir, nLineType, nSharpAngleTrimType, truncations)` - 生成平行线 | dWidth: 宽度;nDir: 方向;nSharpAngleTrimType: 尖角处理方式(0=不处理,1=平头,2=圆头);truncations: 是否截断 | + +Sources: [PySSMath.py](PySSMath.py#L2920-L2935) + +### 曲线生成 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `arcToPoints(pListFrom, pl, gscale)` - 弧线转点集 | gscale: 缩放比例 | +| `circleToPoints(pListFrom, pl, gscale)` - 圆转点集 | gscale: 缩放比例 | +| `freeCurve(pList, pListRes, gscale)` - 自由曲线生成 | gscale: 缩放比例 | +| `dzlyt(pList, pListRes, gscale)` - 等值线生成 | gscale: 缩放比例 | +| `zlyt(Points, sgm, scale)` - 张力样条曲线 | sgm: 张力系数 | + +Sources: [PySSMath.py](PySSMath.py#L2942-L2950) + +### 椭圆操作 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `createEllipse(*args)` - 创建椭圆点集 | +| `createEllipseArc(*args)` - 创建椭圆弧点集 | + +Sources: [PySSMath.py](PySSMath.py#L2951-L2952) + +### 线型重建 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `gotoBeeline(srcPoints, nLineType, ArcInfoList, pResPoints)` - 转为直线 | ArcInfoList: 弧信息列表 | +| `polylineRebuild(srcPoints, nLineType, ArcInfoList, pResPoints)` - 重建多段线 | +| `gotoPoints(pList, lin_sty, pListRes, gscale, bMarkType, bForCalArea)` - 线型转换点集生成 | lin_sty: 线型;bForCalArea: 是否用于计算面积 | + +Sources: [PySSMath.py](PySSMath.py#L3023-L3030) + +### 矩形与边界操作 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `getLineRect(sp1, sp2, rect)` - 获取线段包围盒 | boolean | +| `getPolyRectFromPointList(points)` - 获取点集的多边形包围盒 | POINT3DLIST | +| `getPolyRectFromStructList(points)` - 获取结构点集的多边形包围盒 | POINT3DLIST | +| `getMinimumRectangle(Polygon, PsRect)` - 获取最小外接矩形 | boolean | +| `isLineOutOfRect(rect, sp1, sp2)` - 判断线段是否在矩形外 | boolean | +| `isRectCrossLine(rect, sp1, sp2)` - 判断矩形与线段是否相交 | boolean | +| `isRectCrossPolygon(rect, rgnPoints)` - 判断矩形与多边形是否相交 | boolean | + +Sources: [PySSMath.py](PySSMath.py#L5285-L5295) + +### 点集排序 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `sortByValue(Ps, arKeys, bAscending)` - 按键值排序点集 | arKeys: 键值数组;bAscending: 是否升序 | + +Sources: [PySSMath.py](PySSMath.py#L5290-L5291) + +## 辅助计算工具 + +### 数值精度处理 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `fRounding(dbData, nDecimal)` - 数值四舍五入 | nDecimal: 小数位数 | + +Sources: [PySSMath.py](PySSMath.py#L5275-L5276) + +### 法向量计算 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `calculateNormal(*args)` - 计算法向量 | Vec3d | + +Sources: [PySSMath.py](PySSMath.py#L2798-L2799) + +### 线段交点 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `getLineIntersect(p1, p2, pList, resP)` - 获取线段与点列表的交点 | resP: 输出交点 | + +Sources: [PySSMath.py](PySSMath.py#L2936-L2937) + +### 三角形计算 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `calTriHeight(a, b, c)` - 计算三角形边 a 对应的高 | float | + +Sources: [PySSMath.py](PySSMath.py#L2677-L2678) + +### 多边形焦点 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `getPolygonFocus(_Point, rlPolygon, pClipRgn, bWidthPreference)` - 获取多边形内焦点 | _Point: 输出焦点;rlPolygon: 多边形点列;pClipRgn: 裁剪区域;bWidthPreference: 宽度优先标志 | float: 返回值 | + +Sources: [PySSMath.py](PySSMath.py#L2906-L2918) + +## 常用常量 + +模块定义了多个数学常量和枚举常量: + +**数学常量**: +- `PI` - 圆周率 π +- `PI_2` - π/2 +- `PI_4` - π/4 +- `ZERO_FLOAT` - 零浮点数阈值 +- `MIN_FLOAT` / `MAX_FLOAT` - 最小/最大浮点数 +- `MINI_COORDINATE` - 最小坐标限差 +- `MINI_FLOAT` / `MINI_DOUBLE` - 最小浮点数/双精度限差 + +**方向常量**: +- `_LEFT` / `_RIGHT` / `_TOP` / `_BOTTOM` - 方向标识 +- `e_East` / `e_North` / `e_West` / `e_South` - 东西北南 +- `_CLOCKWISE` / `_ANTICLOCK` - 顺时针/逆时针 + +**点在多边形关系**: +- `_IN_POLY` - 点在多边形内 +- `_OUT_POLY` - 点在多边形外 +- `_CLIP_POLY` - 点在裁剪多边形边界 + +**线型标识**: +- `e_LS_Null` / `e_LS_Polyline` / `e_LS_PWline` / `e_LS_PolyArea` + +Sources: [PySSMath.py](PySSMath.py#L680-L720) + +## 应用示例 + +### 基础距离与面积计算 + +```python +import PySSMath + +# 创建三维点 +p1 = PySSMath.Point3D(100, 200, 0) +p2 = PySSMath.Point3D(150, 250, 50) + +# 计算距离 +dist_2d = PySSMath.distance(p1, p2) +dist_3d = PySSMath.distance3d(p1, p2) + +# 创建多边形点集 +polygon = PySSMath.POINT3DLIST() +polygon.push_back(PySSMath.Point3D(0, 0, 0)) +polygon.push_back(PySSMath.Point3D(100, 0, 0)) +polygon.push_back(PySSMath.Point3D(100, 100, 0)) +polygon.push_back(PySSMath.Point3D(0, 100, 0)) + +# 计算面积 +area = PySSMath.getPolyArea(polygon) +``` + +Sources: [PySSMath.py](PySSMath.py#L2680-L2698) + +### 坐标转换与角度计算 + +```python +import PySSMath + +# 角度格式转换 +deg = 45.5 +rad = PySSMath.degToRadian(deg) +dms = PySSMath.degToDms(deg) + +# 计算方位角 +azimuth = PySSMath.bearing(100, 200, 0, 0) + +# 计算夹角 +p_center = PySSMath.Point3D(100, 100, 0) +p1 = PySSMath.Point3D(150, 100, 0) +p2 = PySSMath.Point3D(100, 150, 0) +angle_rad = PySSMath.openAngle(p1, p_center, p2) +angle_deg = PySSMath.openAngleDeg(p1, p_center, p2) +``` + +Sources: [PySSMath.py](PySSMath.py#L2772-L2794) + +### 几何变换操作 + +```python +import PySSMath + +# 创建点集 +points = PySSMath.POINT3DLIST() +for i in range(5): + points.push_back(PySSMath.Point3D(i * 10, i * 20, 0)) + +# 旋转 30 度 +base_point = PySSMath.Point3D(0, 0, 0) +angle = PySSMath.degToRadian(30) +rotated = PySSMath.rotate2DList(points, angle, base_point) + +# 平移 +offset_x, offset_y = 50, 50 +offset_points = PySSMath.offset2DList(points, offset_x, offset_y) + +# 镜像 +mirror_p0 = PySSMath.Point3D(0, 0, 0) +mirror_p1 = PySSMath.Point3D(100, 100, 0) +mirrored = PySSMath.mirror3DList(mirror_p0, mirror_p1, points) +``` + +Sources: [PySSMath.py](PySSMath.py#L2819-L2838) + +### 空间关系判断 + +```python +import PySSMath + +# 判断点是否在多边形内 +test_point = PySSMath.Point3D(50, 50, 0) +is_inside = PySSMath.ptInPoly(test_point.x(), test_point.y(), polygon, 0.001) + +# 判断线段是否相交 +line1_p1 = PySSMath.Point3D(0, 0, 0) +line1_p2 = PySSMath.Point3D(100, 100, 0) +line2_p1 = PySSMath.Point3D(0, 100, 0) +line2_p2 = PySSMath.Point3D(100, 0, 0) +is_cross = PySSMath.isLineCrossLine(line1_p1, line1_p2, line2_p1, line2_p2) + +# 获取交点 +cross_point = PySSMath.Point3D() +has_cross = PySSMath.getCrossPoint(line1_p1, line1_p2, line2_p1, line2_p2, cross_point) +``` + +Sources: [PySSMath.py](PySSMath.py#L2893-L2918) + +### 点线操作 + +```python +import PySSMath + +# 在两点之间插入点 +p_start = PySSMath.Point3D(0, 0, 0) +p_end = PySSMath.Point3D(100, 100, 0) +inserted_points = PySSMath.POINT3DLIST() +distance = 25 # 每 25 个单位插入一个点 +PySSMath.innerInsertPoint(p_start, p_end, distance, inserted_points) + +# 延伸线段 +points_to_extend = PySSMath.POINT3DLIST() +# ... 添加点 ... +extended_points = PySSMath.extend3DList(points_to_extend, 10, True) # 尾部延伸 10 个单位 + +# 计算中点 +midpoint = PySSMath.midPoint(p_start, p_end) + +# 计算垂足 +test_point = PySSMath.Point3D(50, 20, 0) +foot_point = PySSMath.perpend(test_point, p_start, p_end) +``` + +Sources: [PySSMath.py](PySSMath.py#L2841-L2850) + +## API 快速索引表 + +### 按功能分类 + +| 功能分类 | 关键函数 | +|----------|----------| +| **坐标转换** | degToRadian, radianToDeg, dmsToDeg, degToDms, rightToPolar, polarToRight | +| **距离计算** | distance, distance3d, getDistSquare, getDistPtToLine, getNearstDistSquare | +| **面积计算** | getPolyArea, get3DArea, get3DAreaInDirection, calTriHeight | +| **角度计算** | bearing, openAngle, openAngleDeg, jiaoPingfenFangWei, getDirection | +| **几何变换** | rotate2DList, rotate3DList, offset2DList, offset3DList, zoom3DList, mirror3DList, smooth3DList | +| **点操作** | midPoint, calPoint, extend3DList, innerInsertPoint, removeRepeatPoint | +| **线操作** | getLinesSumlen, getLinesSumlen3d, parallel, lineBreakByPoint, plineSplit | +| **弧操作** | arc3pLength, getArcLength, getArcMidPoint, isArcClockwise, arcBreakByPoint | +| **关系判断** | isSamePoint, isPointOnLine, ptInPoly, isLineCrossLine, isPolygonInPolygonComplex | +| **辅助工具** | fRounding, calculateNormal, getMinimumRectangle, sortByValue | + +Sources: [PySSMath.py](PySSMath.py#L2670-L5400) + +## 性能优化建议 + +1. **批量操作优先**:对于大量点集的操作,优先使用 `POINT3DLIST` 容器和批量处理函数(如 `rotate3DList`),避免逐点循环。 + +2. **合理使用限差参数**:在关系判断函数中(如 `isSamePoint`, `ptInPoly`),根据数据精度合理设置 `epsilon` 或 `limit` 参数,避免浮点数精度问题。 + +3. **避免重复计算**:对于需要多次使用的结果(如距离、面积),缓存中间结果而非重复计算。 + +4. **使用距离平方**:在仅需比较距离大小的场景下,使用 `getDistSquare` 而非 `distance`,避免开方运算开销。 + +Sources: [PySSMath.py](PySSMath.py#L2680-L2720) + +## 进阶主题 + +### 复杂多边形处理 + +对于带岛(洞)的复杂多边形,使用 `isPolygonInPolygonComplex` 函数判断多边形间关系。该函数支持嵌套多边形结构,返回详细的关系标识(包含、相交、独立等)。 + +### 弧线重建与识别 + +使用 `gotoBeeline` 和 `polylineRebuild` 函数可以将拟合的弧线转换为直线段,或将直线段识别为弧线结构,配合 `ArcInfoList` 输出弧线参数信息。 + +### 高级几何变换 + +`mapping3DList` 函数支持基于控制点的仿射变换,可实现不规则的空间映射,适用于校正变形数据。 + +Sources: [PySSMath.py](PySSMath.py#L2893-L2950) + +## 相关文档 + +- [坐标转换工具](44-zuo-biao-zhuan-huan-gong-ju) - 专门的坐标系统转换模块 +- [地理对象类型定义](42-di-li-dui-xiang-lei-xing-ding-yi) - 地理对象类型与属性 +- [工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian) - 空间参考与投影系统 \ No newline at end of file diff --git a/docs/content/44-zuo-biao-zhuan-huan-gong-ju.md b/docs/content/44-zuo-biao-zhuan-huan-gong-ju.md new file mode 100644 index 0000000..fec1102 --- /dev/null +++ b/docs/content/44-zuo-biao-zhuan-huan-gong-ju.md @@ -0,0 +1,373 @@ +坐标转换工具为 GIS 和测绘应用提供了一套完整的坐标系统转换功能,涵盖角度格式转换、坐标系统转换、几何变换等核心能力。本模块通过 PySSMath 提供高性能的坐标转换算法,支持从基础的角度格式互转到复杂的坐标系统映射变换。本文档面向高级开发者,详细说明各类坐标转换工具的 API 使用方法和应用场景。 + +Sources: [PySSMath.py](PySSMath.py#L2700-L2787) + +## 角度格式转换 + +PySSMath 提供了多种角度表示形式之间的转换功能,支持弧度制、十进制度数、度分秒(DMS)格式之间的灵活互转,满足测绘应用中不同角度表示需求。 + +### 基础角度转换 + +| 函数名 | 功能描述 | 参数 | 返回值 | +|--------|----------|------|--------| +| `degToRadian(deg)` | 十进制度数转弧度 | deg: float | 弧度值 | +| `radianToDeg(dRadian)` | 弧度转十进制度数 | dRadian: float | 度数值 | +| `degToDms(deg)` | 十进制度数转度分秒 | deg: float | DMS 值 | +| `dmsToDeg(dms)` | 度分秒转十进制度数 | dms: float | 度数值 | +| `dmsToRadian(dDms)` | 度分秒转弧度 | dDms: float | 弧度值 | +| `radianToDms(dRadian)` | 弧度转度分秒 | dRadian: float | DMS 值 | +| `dmsToSec(dms)` | 度分秒转秒数 | dms: float | 秒数 | +| `secToDms(sec)` | 秒数转度分秒 | sec: float | DMS 值 | + +### 角度调整函数 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `adjustAngle(dRadian)` | 调整弧度值到 [-π, π] 范围 | dRadian: 待调整的弧度值 | +| `adjustDmsAngle(dAngle)` | 调整 DMS 角度值 | dAngle: 待调整的 DMS 角度值 | +| `adjustDegAngle(dAngle)` | 调整度数值到 [0, 360] 范围 | dAngle: 待调整的度数值 | + +### 角度转换示例 + +```python +import sunvpy.PySSMath as ssMath + +# 十进制度数转弧度 +deg_value = 45.5 +rad_value = ssMath.degToRadian(deg_value) +print(f"{deg_value}° = {rad_value:.6f} rad") + +# 弧度转度分秒 +dms_value = ssMath.radianToDms(1.5708) +print(f"1.5708 rad = {dms_value:.4f} (DMS格式)") + +# 角度调整到标准范围 +adjusted_angle = ssMath.adjustAngle(7.0) # 超出范围的角度 +print(f"调整后角度: {adjusted_angle:.6f} rad") +``` + +Sources: [PySSMath.py](PySSMath.py#L2752-L2767) + +## 极坐标与直角坐标转换 + +极坐标和直角坐标是两种常用的坐标表示方式,适用于不同的应用场景。PySSMath 提供了两者之间的双向转换功能。 + +### 坐标转换函数 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `rightToPolar(x, y)` | 直角坐标转极坐标 | x, y: 直角坐标值,返回 (距离, 方位角) | +| `polarToRight(r, angle)` | 极坐标转直角坐标 | r: 距离;angle: 方位角(弧度) | +| `getPolar(p1, p2, dist, dRadian)` | 从基点按距离和方位角获取点 | p1: 基点;p2: 参考点;dist: 距离;dRadian: 方位角 | +| `getPoint(p1, p2, dist, dRadian)` | 同 getPolar | 参数同 getPolar | + +### 极坐标转换示例 + +```python +import sunvpy.PySSMath as ssMath + +# 直角坐标转极坐标 +x, y = 100.0, 100.0 +distance, angle = ssMath.rightToPolar(x, y) +print(f"直角坐标 ({x}, {y}) -> 极坐标: 距离={distance:.2f}, 方位角={angle:.6f} rad") + +# 极坐标转直角坐标 +r = 141.42 +angle_rad = 0.785398 +x_new, y_new = ssMath.polarToRight(r, angle_rad) +print(f"极坐标 (r={r}, angle={angle_rad}) -> 直角坐标: ({x_new:.2f}, {y_new:.2f})") + +# 从基点获取极坐标点 +import sunvpy.PySSMath.Point3D as Point3D +p1 = Point3D(0, 0, 0) +p2 = Point3D(1, 0, 0) +new_point = ssMath.getPolar(p1, p2, 100, ssMath.degToRadian(45)) +print(f"从原点向东45°方向100米处的点: ({new_point.x():.2f}, {new_point.y():.2f})") +``` + +Sources: [PySSMath.py](PySSMath.py#L2808-L2815) + +## 方位角计算 + +方位角计算是测绘和导航应用中的核心功能,PySSMath 提供了多种方位角计算方法,支持点对点方位角、角度平分等场景。 + +### 方位角计算函数 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `bearing(x1, y1, x0, y0)` | 计算从点 (x0, y0) 到点 (x1, y1) 的方位角 | 返回弧度值 | +| `bearing(p0, p1)` | 计算方位角(使用 Point3D 对象) | p0: 起始点;p1: 目标点 | +| `jiaoPingfenFangWei(x1, y1, x0, y0, x2, y2)` | 计算两线段的夹角平分方位角 | (x1,y1)-(x0,y0) 和 (x2,y2)-(x0,y0) 的平分方向 | + +### 角度计算函数 + +| 函数名 | 功能描述 | 返回值 | +|--------|----------|--------| +| `openAngle(p1, p0, p2)` | 计算 ∠p1p0p2 的夹角 | 弧度值 | +| `openAngleDeg(p1, p0, p2)` | 计算夹角(度数) | 度数 | + +### 方位角计算示例 + +```python +import sunvpy.PySSMath as ssMath +import sunvpy.PySSMath.Point3D as Point3D + +# 计算两点间的方位角 +x0, y0 = 100.0, 100.0 # 起点 +x1, y1 = 200.0, 150.0 # 终点 +azimuth_rad = ssMath.bearing(x1, y1, x0, y0) +azimuth_deg = ssMath.radianToDeg(azimuth_rad) +print(f"从 ({x0}, {y0}) 到 ({x1}, {y1}) 的方位角: {azimuth_deg:.2f}°") + +# 使用 Point3D 对象计算方位角 +p0 = Point3D(100.0, 100.0, 0) +p1 = Point3D(200.0, 150.0, 0) +azimuth_rad2 = ssMath.bearing(p0, p1) +print(f"方位角(弧度): {azimuth_rad2:.6f}") + +# 计算角度平分方向 +# 从 (0,0) 到 (100,0) 和 (0,100) 的夹角平分方向 +bisect_angle = ssMath.jiaoPingfenFangWei(100, 0, 0, 0, 0, 100) +bisect_deg = ssMath.radianToDeg(bisect_angle) +print(f"90°角的平分方位角: {bisect_deg:.2f}°") + +# 计算三点夹角 +p1 = Point3D(0, 100, 0) +p_center = Point3D(0, 0, 0) +p2 = Point3D(100, 0, 0) +angle_rad = ssMath.openAngle(p1, p_center, p2) +angle_deg = ssMath.radianToDeg(angle_rad) +print(f"夹角 ∠p1-center-p2: {angle_deg:.2f}°") +``` + +Sources: [PySSMath.py](PySSMath.py#L2789-L2797) + +## 几何变换操作 + +几何变换是坐标转换的重要应用场景,包括旋转、平移、缩放、镜像等基本变换,以及系统坐标旋转、映射变换等高级变换。 + +### 二维几何变换 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `rotate2DList(Points, angle, basePoint)` | 二维点集旋转 | angle: 旋转角(弧度);basePoint: 旋转基点 | +| `offset2DList(Points, dx, dy)` | 二维点集平移 | dx, dy: X和Y方向的平移量 | + +### 三维几何变换 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `rotate3DList(*args)` | 三维点集旋转 | 支持多种参数形式(绕轴旋转、绕任意轴旋转) | +| `offset3DList(*args)` | 三维点集偏移 | 支持偏移向量或分量形式 | +| `zoom3DList(*args)` | 三维点集缩放 | 支持缩放中心和缩放因子 | +| `mirror3DList(baseP0, baseP1, Ps)` | 三维点集镜像 | baseP0, baseP1: 镜像轴上的两点;Ps: 待变换点集 | +| `extend3DList(Points, dist, bTail)` | 点集延伸 | dist: 延伸距离;bTail: true=尾部延伸,false=头部延伸 | +| `smooth3DList(Ps0, fScale, nFlag)` | 点集平滑 | fScale: 平滑系数;nFlag: 平滑方式 | +| `mapping3DList(Points, ctrlPoints_old, ctrlPoints_new)` | 点集映射变换 | 基于控制点的仿射变换 | + +### 系统坐标变换 + +| 函数名 | 功能描述 | 参数说明 | +|--------|----------|----------| +| `sysRotate(Xold, Yold, Xnew, Ynew, X0, Y0, dRadian)` | 系统旋转 | 将旧坐标系旋转至新坐标系 | +| `grdbodyRotate(*args)` | 网格体旋转 | 支持多种参数形式 | + +### 几何变换示例 + +```python +import sunvpy.PySSMath as ssMath +import sunvpy.PySSMath.POINT3DLIST as POINT3DLIST +import sunvpy.PySSMath.Point3D as Point3D + +# 创建点集 +points = POINT3DLIST() +points.push_back(Point3D(10, 10, 0)) +points.push_back(Point3D(20, 10, 0)) +points.push_back(Point3D(20, 20, 0)) + +# 二维旋转(绕原点旋转90度) +basePoint = Point3D(0, 0, 0) +angle = ssMath.degToRadian(90) +ssMath.rotate2DList(points, angle, basePoint) +print("旋转后的点集:") +for i in range(points.size()): + pt = points.at(i) + print(f" 点{i+1}: ({pt.x():.2f}, {pt.y():.2f}, {pt.z():.2f})") + +# 二维平移 +ssMath.offset2DList(points, 5.0, 5.0) +print("平移后的点集:") +for i in range(points.size()): + pt = points.at(i) + print(f" 点{i+1}: ({pt.x():.2f}, {pt.y():.2f}, {pt.z():.2f})") + +# 镜像变换 +points2 = POINT3DLIST() +points2.push_back(Point3D(10, 10, 0)) +points2.push_back(Point3D(30, 10, 0)) +points2.push_back(Point3D(30, 30, 0)) + +baseP0 = Point3D(0, 0, 0) # 镜像轴起点 +baseP1 = Point3D(1, 0, 0) # 镜像轴终点(X轴) +ssMath.mirror3DList(baseP0, baseP1, points2) +print("镜像后的点集:") +for i in range(points2.size()): + pt = points2.at(i) + print(f" 点{i+1}: ({pt.x():.2f}, {pt.y():.2f}, {pt.z():.2f})") +``` + +Sources: [PySSMath.py](PySSMath.py#L2819-L2840) + +## 坐标转换应用场景 + +### 测绘坐标转换 + +```python +import sunvpy.PySSMath as ssMath + +# 场景1:测量角度转换 +# 将测量得到的度分秒格式转换为十进制度数 +dms_angle = 30.3045 # 30°30'45" 表示为 30.3045 +deg_angle = ssMath.dmsToDeg(dms_angle) +rad_angle = ssMath.degToRadian(deg_angle) +print(f"测量角度 {dms_angle:.4f} (DMS) = {deg_angle:.6f}° = {rad_angle:.6f} rad") + +# 场景2:方位角归一化 +# 确保方位角在 [0, 2π) 范围内 +azimuth = 450.0 # 超出范围的方位角 +normalized_deg = ssMath.adjustDegAngle(azimuth) +normalized_rad = ssMath.degToRadian(normalized_deg) +print(f"归一化方位角: {azimuth}° -> {normalized_deg:.2f}° = {normalized_rad:.6f} rad") + +# 场景3:极坐标测量转直角坐标 +# 从测站向东偏北45°方向测量距离100米 +dist = 100.0 +azimuth_from_north = ssMath.degToRadian(45) # 从北方向向东 +# 注意:测量通常以北方为0°,顺时针为正 +# PySSMath的bearing函数可能以东方为0°,需要根据实际情况调整 +``` + +### GIS 坐标变换 + +```python +import sunvpy.PySSMath as ssMath +import sunvpy.PySSMath.POINT3DLIST as POINT3DLIST +import sunvpy.PySSMath.Point3D as Point3D + +# 场景1:地图旋转校正 +# 将倾斜的地图元素旋转到标准方向 +polygon = POINT3DLIST() +polygon.push_back(Point3D(100, 100, 0)) +polygon.push_back(Point3D(110, 95, 0)) +polygon.push_back(Point3D(105, 105, 0)) + +# 计算需要旋转的角度 +angle_correction = ssMath.degToRadian(5) # 逆时针旋转5度 +rotation_center = Point3D(100, 100, 0) +ssMath.rotate2DList(polygon, angle_correction, rotation_center) + +# 场景2:坐标系平移 +# 将局部坐标系下的坐标转换到全局坐标系 +offset_x = 500000.0 # 全局坐标系X偏移量 +offset_y = 3000000.0 # 全局坐标系Y偏移量 +ssMath.offset2DList(polygon, offset_x, offset_y) + +# 场景3:比例尺变换 +# 应用地图比例尺变换 +scale_factor = 1000.0 # 1:1000比例尺 +zoom_center = Point3D(500000, 3000000, 0) +ssMath.zoom3DList(polygon, scale_factor, scale_factor, scale_factor, zoom_center) +``` + +### 工程应用变换 + +```python +import sunvpy.PySSMath as ssMath +import sunvpy.PySSMath.POINT3DLIST as POINT3DLIST +import sunvpy.PySSMath.Point3D as Point3D + +# 场景:基于控制点的坐标映射 +# 已知旧坐标系和新坐标系中的控制点对 +control_points_old = POINT3DLIST() +control_points_old.push_back(Point3D(0, 0, 0)) +control_points_old.push_back(Point3D(100, 0, 0)) +control_points_old.push_back(Point3D(0, 100, 0)) + +control_points_new = POINT3DLIST() +control_points_new.push_back(Point3D(500000, 3000000, 0)) +control_points_new.push_back(Point3D(500100, 3000000, 0)) +control_points_new.push_back(Point3D(500000, 3000100, 0)) + +# 待变换的点集 +points_to_transform = POINT3DLIST() +points_to_transform.push_back(Point3D(50, 50, 0)) +points_to_transform.push_back(Point3D(75, 25, 0)) + +# 执行映射变换 +ssMath.mapping3DList(points_to_transform, control_points_old, control_points_new) + +print("变换后的点:") +for i in range(points_to_transform.size()): + pt = points_to_transform.at(i) + print(f" 点{i+1}: ({pt.x():.2f}, {pt.y():.2f}, {pt.z():.2f})") +``` + +Sources: [PySSMath.py](PySSMath.py#L2700-L2900) + +## 最佳实践与注意事项 + +### 角度单位处理 + +在进行角度计算时,务必注意角度单位的统一性。PySSMath 的函数默认使用弧度制进行内部计算,但提供了多种角度格式的转换函数。 + +```python +import sunvpy.PySSMath as ssMath + +# 推荐:在计算开始时统一转换为弧度制 +def calculate_with_angles(deg_angle): + rad_angle = ssMath.degToRadian(deg_angle) + # 执行计算 + result = rad_angle * 2 # 示例计算 + # 将结果转换回需要的格式 + return ssMath.radianToDeg(result) +``` + +### 坐标变换顺序 + +多个几何变换的执行顺序会影响最终结果。通常建议的顺序为:平移 → 旋转 → 缩放。 + +```python +import sunvpy.PySSMath as ssMath +import sunvpy.PySSMath.POINT3DLIST as POINT3DLIST +import sunvpy.PySSMath.Point3D as Point3D + +points = POINT3DLIST() +# ... 添加点 ... + +# 推荐的变换顺序 +ssMath.offset3DList(points, dx, dy, dz) # 1. 先平移 +ssMath.rotate3DList(points, angle, axis) # 2. 再旋转 +ssMath.zoom3DList(points, sx, sy, sz, center) # 3. 最后缩放 +``` + +### 精度控制 + +在比较坐标和角度时,使用容差而非精确相等。 + +```python +import sunvpy.PySSMath as ssMath +import sunvpy.PySSMath.Point3D as Point3D + +p1 = Point3D(100.0, 100.0, 0.0) +p2 = Point3D(100.0001, 100.0001, 0.0) + +# 使用带容差的比较 +epsilon = 0.001 +is_same = ssMath.isSamePoint(p1, p2, epsilon) +``` + +## 相关页面 + +- [数学计算工具](43-shu-xue-ji-suan-gong-ju) - 了解更多数学计算相关的 API +- [地理对象类型定义](42-di-li-dui-xiang-lei-xing-ding-yi) - 了解 Point3D 等基础数据结构 +- [库概述](1-ku-gai-shu) - 了解 sunvpy 模块的整体架构 \ No newline at end of file diff --git a/docs/content/45-shu-ju-ku-geng-xin-jie-kou.md b/docs/content/45-shu-ju-ku-geng-xin-jie-kou.md new file mode 100644 index 0000000..7133229 --- /dev/null +++ b/docs/content/45-shu-ju-ku-geng-xin-jie-kou.md @@ -0,0 +1,1136 @@ +数据库更新接口是 SunvStation GIS 系统中用于管理和执行数据库操作的核心组件,提供了从底层 SQL 执行到高级对象同步的完整功能层次。该接口采用 SWIG 封装技术将 C++ 核心功能暴露给 Python,实现了高性能的数据库操作与 Python 脚本的无缝集成。 + +## 架构概览 + +数据库更新接口采用分层架构设计,从底层的直接数据库操作到上层的业务对象管理,提供了不同抽象级别的接口以满足不同场景的需求。 + +```mermaid +graph TB + subgraph "应用层" + GeoEditMixin[GeoEditMixin
地理编辑混合类] + SSProcess[SSProcessManager
流程管理器] + end + + subgraph "业务逻辑层" + SSDbScript[SSDbScript
GIS数据库脚本接口] + DataXScript[DataXScript
数据交换接口] + end + + subgraph "数据访问层" + Database[Database
数据库抽象接口] + StringArray[StringArray
字符串数组容器] + AttrList[AttrList
属性列表] + FeatureList[FeatureList
地物列表] + end + + subgraph "C++核心层" + _PySSGisDBUpdate[_PySSGisDBUpdate
C++GIS数据库模块] + _PySSDatabase[_PySSDatabase
C++数据库模块] + _PySSDataX[_PySSDataX
C++数据交换模块] + end + + GeoEditMixin --> SSDbScript + SSProcess --> GeoEditMixin + SSDbScript --> _PySSGisDBUpdate + DataXScript --> _PySSDataX + Database --> _PySSDatabase + SSDbScript --> Database + Database --> StringArray + Database --> AttrList + Database --> FeatureList +``` + +**核心设计原则**:该架构通过多层抽象,实现了从底层 SQL 执行到高级对象操作的完整覆盖,同时保持了各层之间的清晰边界。SWIG 封装机制确保了 Python 接口与 C++ 实现的透明交互,[7-swig-feng-zhuang-ji-zhi-shuo-ming](7-swig-feng-zhuang-ji-zhi-shuo-ming) 详细解释了这一机制的实现原理。 + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L1-L493), [PySSDatabase.py](PySSDatabase.py#L1-L1643) + +## SSDbScript 核心接口 + +SSDbScript 是 GIS 数据库更新操作的主要接口类,提供了从服务器数据库到本地数据库的数据同步、地物属性更新、表记录管理等完整功能集。 + +### 连接与认证管理 + +SSDbScript 支持多种认证模式,包括基础用户认证和角色认证,确保数据库操作的安全性和权限控制。 + +```mermaid +sequenceDiagram + participant Python + participant SSDbScript + participant Database + participant SDEServer + + Python->>SSDbScript: SSDbScript() + Python->>SSDbScript: login(userName, password) + SSDbScript->>Database: 验证凭证 + Database->>SDEServer: 建立连接 + SDEServer-->>Database: 连接成功 + Database-->>SSDbScript: 认证通过 + SSDbScript-->>Python: 返回 True + + Python->>SSDbScript: connectToTablespace(name) + SSDbScript->>Database: 切换工作空间 + Database-->>SSDbScript: 工作空间就绪 + SSDbScript-->>Python: 返回 True + + Note over Python,SDEServer: 执行数据库操作... + + Python->>SSDbScript: logout() + SSDbScript->>Database: 关闭连接 + Database->>SDEServer: 释放资源 + SSDbScript-->>Python: 会话结束 +``` + +**连接方法**: + +| 方法 | 参数 | 说明 | +|------|------|------| +| `login()` | `userName, password` | 基础用户认证 | +| `login1()` | `userName, password, roleName` | 带角色的用户认证 | +| `logout()` | 无 | 断开数据库连接 | +| `connectToTablespace()` | `tablespaceName` | 连接到指定工作空间 | +| `getTablespaceNameList()` | `tablespaceType` | 获取工作空间名称列表 | +| `getUserRoleNameList()` | 无 | 获取用户角色列表 | +| `resetCurrentRoleName()` | `roleName` | 重置当前用户角色 | + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L78-L100) + +### 数据下载接口 + +数据下载接口支持从服务器 SDE 数据库下载指定范围或指定条件的数据到本地数据库,提供了灵活的数据提取策略。 + +```python +# 示例:按区域范围下载指定图层数据 +from sunvpy.PySSGisDBUpdate import SSDbScript + +db_script = SSDbScript() +db_script.login("username", "password") + +# 定义下载区域坐标范围 +region_coords = [(116.3, 39.9), (116.5, 39.9), + (116.5, 40.0), (116.3, 40.0)] + +# 下载指定图层的当前版本数据 +result = db_script.downloadDBToLocalDB( + workspace_handle, # 工作空间句柄 + region_coords, # 区域坐标 + "RoadLayer", # 图层名称 + "code > 100", # WHERE 条件 + False # 是否下载历史版本 +) + +print(f"下载结果: {'成功' if result else '失败'}") +``` + +**下载方法变体**: + +| 方法 | 场景 | 关键参数 | +|------|------|----------| +| `downloadDBToLocalDB()` | 按坐标范围和图层下载 | `regionCoords`, `layerName`, `whereClause`, `isHistory` | +| `downloadDBToLocalDB1()` | 按 GUID 区域下载 | `regionGUID`, `isUpdateDownload` | +| `downloadDBToLocalDB2()` | 按 GUID 和图层下载 | `regionGUID`, `layerName`, `isUpdateDownload` | +| `downloadDBToLocalDB3()` | 带 GUID 列表的批量下载 | `regionGUID`, `byteObjList` | +| `downloadDBToLocalDB4()` | 带坐标列表的批量下载 | `regionCoords`, `byteObjList` | +| `downloadDBToLocalDB5()` | 按 GeoID 下载 | `regionGeoID`, `layerName` | + +**参数说明**: +- `workspaceHandle`:工作空间句柄,通过 `map.getWorkspaceHandle()` 获取 +- `regionCoords`:坐标范围,使用 `DblRect` 或坐标点列表表示 +- `regionGUID`/`regionGeoID`:区域的唯一标识符 +- `layerName`:目标图层名称 +- `whereClause`:SQL WHERE 条件表达式 +- `isHistory`:是否下载历史版本数据 +- `isUpdateDownload`:是否为增量下载模式 +- `byteObjList`:对象 GUID 字节数组列表,用于指定特定对象 + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L102-L122) + +### 数据上传接口 + +数据上传接口将本地数据库中的修改同步到服务器 SDE 数据库,支持不同的更新策略。 + +| updateMode 值 | 说明 | 适用场景 | +|---------------|------|----------| +| 0 | 仅新增 | 添加新对象到服务器 | +| 1 | 仅更新 | 更新服务器上已存在的对象 | +| 2 | 新增+更新 | 默认模式,同时处理新增和更新 | +| 3 | 删除 | 删除服务器上的对象 | + +```python +# 示例:上传本地修改到服务器 +result = db_script.uploadLocalDBToDB( + workspace_handle, # 工作空间句柄 + "RoadLayer", # 目标图层 + 2 # 更新模式:新增+更新 +) + +if result: + print("数据上传成功") +else: + print(f"上传失败: {db_script.m_strLogInfos}") +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L123-L125) + +### 地物操作接口 + +地物操作接口提供了对单个地物的增删改查功能,支持复杂的查询条件和跨图层操作。 + +**地物复制**: + +```python +# 在同一工作空间内复制地物 +result = db_script.copyFeatureToNewLayer( + workspace_handle, # 源工作空间 + "SourceLayer", # 源图层 + "TargetLayer", # 目标图层 + "code = 150", # 复制条件 + True # 是否删除目标图层中旧对象 +) + +# 跨工作空间复制地物 +result = db_script.copyFeatureToNewLayer1( + workspace_handle_src, # 源工作空间 + "SourceLayer", # 源图层 + workspace_handle_tag, # 目标工作空间 + "TargetLayer", # 目标图层 + "status = 1" # 复制条件 +) +``` + +**地物删除与更新**: + +```python +# 删除满足条件的地物 +result = db_script.deleteFeature( + workspace_handle, + "RoadLayer", + "age > 10" # 删除条件 +) + +# 更新指定地物的属性 +result = db_script.updateFeatureAttr( + workspace_handle, + "RoadLayer", + "{guid-of-feature}", # 地物 GUID + "code,status,name", # 要更新的字段列表(逗号分隔) + "200,1,UpdatedRoad" # 对应的字段值(逗号分隔) +) +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L142-L153), [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L155-L167) + +### 表记录管理接口 + +表记录管理接口提供了对 SDE 数据库中自定义表的 CRUD 操作,支持动态表创建和复杂查询。 + +```mermaid +flowchart TD + A[表记录操作] --> B{操作类型} + B -->|创建| C[createSDEDBTable] + B -->|查询| D[searchSDEDBTableRecord] + B -->|新增| E[addSDEDBTableRecord] + B -->|修改| F[editSDEDBTableRecord] + B -->|删除| G[deleteSDEDBTableRecord] + B -->|自定义查询| H[customQuerySDETableRecord] + + C --> C1[fieldInfos: 字段定义] + D --> D1[strCondition: WHERE 条件] + D --> D2[strOrderBy: 排序字段] + E --> E1[fields: 字段名列表] + E --> E2[values: 字段值列表] + F --> F1[strCondition: 更新条件] + G --> G1[strCondition: 删除条件] + H --> H1[dlgWidth/Height: 对话框尺寸] +``` + +**完整示例**: + +```python +from sunvpy.PySSGisDBUpdate import SSDbScript + +db_script = SSDbScript() + +# 1. 检查表是否存在 +if not db_script.isExistSDEDBTable(workspace_handle, "MyCustomTable"): + # 2. 创建新表 + field_infos = [ + {"name": "id", "type": "INTEGER", "primary": True}, + {"name": "name", "type": "VARCHAR(100)"}, + {"name": "value", "type": "DOUBLE"}, + {"name": "created_at", "type": "DATETIME"} + ] + db_script.createSDEDBTable(workspace_handle, "MyCustomTable", field_infos) + +# 3. 添加记录 +fields = ["name", "value", "created_at"] +values = ["测试记录", 123.45, "2024-01-15 10:30:00"] +db_script.addSDEDBTableRecord(workspace_handle, "MyCustomTable", fields, values) + +# 4. 查询记录 +sel_fields = ["id", "name", "value"] +results = db_script.searchSDEDBTableRecord( + workspace_handle, + "MyCustomTable", + "value > 100", # WHERE 条件 + sel_fields # 查询字段 +) + +# 5. 更新记录 +update_fields = ["value"] +update_values = ["234.56"] +db_script.editSDEDBTableRecord( + workspace_handle, + "MyCustomTable", + "name = '测试记录'", # 更新条件 + update_fields, + update_values +) + +# 6. 删除记录 +db_script.deleteSDEDBTableRecord( + workspace_handle, + "MyCustomTable", + "id < 1000" # 删除条件 +) +``` + +**查询方法变体**: + +| 方法 | 特点 | 适用场景 | +|------|------|----------| +| `searchSDEDBTableRecord()` | 基础查询 | 简单条件查询 | +| `searchSDEDBTableRecord1()` | 支持排序和字段选择 | 需要指定排序和返回字段 | +| `customQuerySDETableRecord()` | 自定义查询对话框 | 交互式查询 | +| `searchFeatureAttr()` | 地物属性查询 | 查询地物属性信息 | + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L184-L211) + +### 数据库同步接口 + +数据库同步接口支持在不同工作空间之间同步数据,包括全量同步和增量同步模式。 + +```python +# 全量同步指定图层 +sync_layers = ["RoadLayer", "BuildingLayer", "WaterLayer"] +result = db_script.synchronousDatabase( + "PublicScheme", # 同步方案名称 + workspace_handle_src, # 源工作空间 + workspace_handle_tag, # 目标工作空间 + sync_layers # 要同步的图层列表 +) + +# 带坐标转换脚本的增量同步 +result = db_script.synchronousDatabase1( + "PublicScheme", # 同步方案 + workspace_handle_src, + workspace_handle_tag, + sync_layers, + "TransformCoords(proj_src=4326, proj_dest=3857)" # 坐标转换脚本 +) + +# 带过滤条件的同步 +result = db_script.synchronousDatabase2( + "PublicScheme", + workspace_handle_src, + workspace_handle_tag, + sync_layers, + "TransformCoords(...)", # 坐标转换脚本 + "status = 1 AND code > 100" # 同步过滤条件 +) +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L168-L183) + +### 备份与恢复接口 + +备份接口支持完整备份和增量备份两种模式,确保数据安全。 + +```python +# 完整备份数据库到 EGDB 文件 +result = db_script.backupDataToEgdb( + workspace_handle, + "D:/Backup/full_backup_20240115.egdb" +) + +# 增量备份(仅备份变更数据) +result = db_script.incrementalBackupToEgdb( + workspace_handle, + "D:/Backup/incremental_20240115.egdb" +) +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L276-L281) + +### 高级操作接口 + +高级接口提供了一些特殊场景下的操作功能,如创建更新区域、重置图形信息、按坐标下载对象等。 + +```python +# 创建道路更新区域 +region_fields = ["region_id", "region_name", "created_by"] +region_values = [1001, "MainRoadUpdate", "admin"] +result = db_script.createRoadUpdateRegion( + workspace_handle, + "road_type = 1", # 道路筛选条件 + "StartPoint", # 起点字段名 + "EndPoint", # 终点字段名 + 50.0, # 缓冲距离(米) + True, # 是否处理关联道路 + region_fields, # 区域字段 + region_values # 区域值 +) + +# 重置图形信息 +result = db_script.resetFeatureGraphicinfo( + workspace_handle, + "RoadLayer", + region_coords, # 重置区域 + "color < 0" # 重置条件 +) + +# 按坐标下载对象 +result = db_script.downloadObjByCoord( + workspace_handle, + "RoadLayer", + 150, # 对象编码 + [(x1, y1), (x2, y2), ...] # 搜索坐标 +) + +# 执行自定义 SQL +sql = "UPDATE MyTable SET value = value * 1.1 WHERE category = 'A'" +result = db_script.dbWorkspaceExecuteSQL(workspace_handle, sql) +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L240-L268), [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L283-L286) + +## Database 底层数据库接口 + +Database 类提供了底层数据库访问接口,支持事务管理、几何对象存取、SQL 执行等核心功能。与 SSDbScript 相比,Database 接口更接近数据库底层,适合需要精细控制或高性能批量操作的场景。 + +### 连接与事务管理 + +Database 接口提供了完整的数据库连接生命周期管理和事务控制功能。 + +```mermaid +stateDiagram-v2 + [*] --> Closed: 初始状态 + Closed --> Open: openDatabase() + Open --> Closed: closeDatabase() + + Open --> Transaction: beginTransaction() + Transaction --> Open: commitTransaction() + Transaction --> Open: rollbackTransaction() + + state Open { + [*] --> Query: execute查询 + [*] --> Modify: execute更新/插入/删除 + Query --> [*] + Modify --> [*] + } + + state Transaction { + [*] --> Executing: 执行操作 + Executing --> Success: 操作成功 + Executing --> Error: 操作失败 + Success --> [*] + Error --> [*] + } +``` + +**连接方法**: + +```python +from sunvpy.PySSDatabase import Database + +# 数据库连接通常通过工作空间获取 +database = workspace.getDatabase() + +# 事务处理示例 +database.beginTransaction() +try: + # 执行多个操作 + database.execute("UPDATE table1 SET value = value * 1.1") + database.execute("UPDATE table2 SET status = 1") + + # 所有操作成功,提交事务 + database.commitTransaction() +except Exception as e: + # 出现错误,回滚事务 + database.rollbackTransaction() + print(f"事务失败: {e}") +``` + +**数据库信息查询**: + +```python +# 获取数据库类型 +db_type = database.getDBType() # 返回 EpsDBType 枚举值 + +# 获取连接字符串 +uri = database.getURI() + +# 检查表和字段是否存在 +if database.isTableExist("RoadLayer"): + if database.isFieldExist("RoadLayer", "code"): + print("表和字段都存在") + +# 执行简单 SQL(无结果集) +result = database.execute("CREATE INDEX idx_code ON RoadLayer(code)") +``` + +Sources: [PySSDatabase.py](PySSDatabase.py#L244-L332) + +### 几何对象存取 + +Geometry 存取是 Database 接口的核心功能,支持按区域、按 ID 列表、按 SQL 条件等多种方式加载几何对象。 + +```python +from sunvpy.PySSCore import GeoBaseList, BoundingRect +from sunvpy.PySSMap import DatasetDLG + +# 获取数据集 +dataset = map.getDataset("RoadLayer") + +# 方式1:按矩形区域加载 +rect = BoundingRect() +rect.set(116.3, 39.9, 116.5, 40.0) +obj_list = GeoBaseList() +max_id = database.loadGeoObject(rect, dataset, 1, obj_list) + +# 方式2:按 ID 列表加载 +from sunvpy.PySSCore import RowIdList +id_list = RowIdList() +for obj_id in [1001, 1002, 1003]: + id_list.append(obj_id) +obj_list = GeoBaseList() +max_id = database.loadGeoObject(id_list, dataset, 1, obj_list) + +# 方式3:按 SQL 查询加载 +sql = "SELECT * FROM RoadLayer WHERE code > 100" +obj_list = GeoBaseList() +max_id = database.loadGeoObject(sql, dataset, 1, obj_list) + +# 遍历加载的对象 +for i in range(obj_list.size()): + geo = obj_list.at(i) + print(f"对象ID: {geo.getObjectId()}, 代码: {geo.getCode()}") +``` + +**动态分批加载**: + +```python +# 动态分批加载(适合大数据量场景) +def callback(obj_list, has_more): + """回调函数,处理每批加载的对象""" + print(f"收到 {obj_list.size()} 个对象") + + # 处理当前批次 + for i in range(obj_list.size()): + geo = obj_list.at(i) + # 处理对象... + pass + + # 返回 False 则停止加载,返回 True 则继续加载 + return has_more + +exist_ids = RowIdList() # 已加载对象的 RowId +database.dynBatchLoadObject( + rect, # 加载区域 + dataset, # 数据集 + exist_ids, # 已存在的对象 ID + callback, # 回调函数 + 1000.0, # 限制面积/长度(小于此值不加载) + False # 是否忽略细节级别 +) +``` + +Sources: [PySSDatabase.py](PySSDatabase.py#L368-L465) + +### 对象保存与删除 + +保存和删除操作支持单个对象、批量对象、SQL 条件删除等多种方式。 + +```python +# 保存单个对象 +geo = create_new_geo_object() # 创建新对象 +result = database.saveGeoObject(dataset, geo) + +# 批量保存对象 +obj_list = GeoBaseList() +obj_list.append(geo1) +obj_list.append(geo2) +result = database.saveGeoObject(dataset, obj_list) + +# 删除单个对象(按 ID) +result = database.deleteObject(1001, "RoadLayer") + +# 按 SQL 删除 +result = database.deleteObject("DELETE FROM RoadLayer WHERE status = 0") + +# 按区域和类型删除 +from sunvpy.PySSCore import DblRect, e_Line_Obj +rect = DblRect(116.3, 39.9, 116.4, 39.95) +result = database.deleteObject(rect, "RoadLayer", e_Line_Obj) +``` + +### 状态与时间管理 + +Database 接口提供了对象状态和时间戳的更新功能,这对于追踪对象变更历史非常重要。 + +```python +# 更新对象修改时间 +import time +current_time = int(time.time()) +database.resetDateTime(1001, current_time, "RoadLayer") + +# 更新对象状态 +database.resetStatus(1001, dataset) + +# 批量更新状态和时间 +geo_list = GeoBaseList() +# ... 加载对象到 geo_list ... +database.resetObjStatusAndDateTime("RoadLayer", geo_list) +``` + +Sources: [PySSDatabase.py](PySSDatabase.py#L482-L526) + +## GeoEditMixin 高级编辑接口 + +GeoEditMixin 将数据库操作与对象编辑功能结合,提供了更高级的抽象,适合脚本化工作流程中的地理数据编辑场景。该接口通过对象缓存机制,实现了批量编辑和事务性保存。 + +### 对象创建与缓存流程 + +GeoEditMixin 使用缓存机制提高编辑效率,所有修改首先在内存中进行,最后统一保存到数据库。 + +```mermaid +flowchart TD + A[开始编辑] --> B[创建新对象
createNewObjByCode] + B --> C[设置属性
setNewObjValue] + C --> D[添加坐标点
addNewObjPoint] + D --> E{操作类型} + + E -->|添加到选择集| F[addNewObjToSelObjList
仅显示,不保存] + E -->|添加到保存列表| G[addNewObjToSaveObjList
准备保存] + + F --> H[继续编辑其他对象] + G --> H + + H --> I{是否完成编辑?} + I -->|否| B + I -->|是| J[saveBufferObjToDatabase
批量保存] + + J --> K[转换 MemoData
transMemoDataToExtendAttr] + K --> L[添加到地图
addGeoObject] + L --> M[保存到数据库
saveDatabase] + M --> N[清理缓存
clear lists] + N --> O[编辑完成] +``` + +**完整示例**: + +```python +from sunvpy.PySSCore import GeoBaseList +from sunvpy.PySSMath import Point3D + +# 1. 通过编码创建新对象 +obj, geo = ss_process.createNewObjByCode(150) # 道路编码 + +# 2. 设置基本属性 +ss_process.setNewObjValue("SSObj_Name", "新建道路") +ss_process.setNewObjValue("SSObj_Code", "150") +ss_process.setNewObjValue("SSObj_Color", "255") + +# 3. 设置扩展属性 +ss_process.setNewObjValue("[road_type]", "主干道") +ss_process.setNewObjValue("[pavement]", "沥青") +ss_process.setNewObjValue("[width]", "12.5") + +# 4. 添加坐标点 +points = [(116.400, 39.900, 0.0), + (116.410, 39.905, 0.0), + (116.420, 39.910, 0.0)] + +for pt in points: + ss_process.addNewObjPoint( + pt[0], pt[1], pt[2], # x, y, z + 0, # 点类型 + "" # 点名称 + ) + +# 5. 添加到保存列表(准备保存到数据库) +ss_process.addNewObjToSaveObjList() + +# 6. 创建另一个对象 +obj2, geo2 = ss_process.createNewObjByClass("道路注记") +ss_process.setNewObjValue("SSObj_FontString", "主干道") +ss_process.addNewObjPoint(116.410, 39.905, 0.0, 0, "") +ss_process.addNewObjToSaveObjList() + +# 7. 批量保存所有缓存对象到数据库 +ss_process.saveBufferObjToDatabase() +print("所有对象已保存到数据库") +``` + +**关键方法说明**: + +| 方法 | 功能 | 缓存位置 | +|------|------|----------| +| `createNewObjByCode()` | 通过编码创建对象 | `curNewObj` | +| `createNewObjByClass()` | 通过注记类创建对象 | `curNewObj` | +| `setNewObjValue()` | 设置对象属性 | `curNewObj` | +| `addNewObjPoint()` | 添加坐标点 | `curNewObj` | +| `addNewObjToSelObjList()` | 添加到选择集 | `selGeoList` / `selNoteList` | +| `addNewObjToSaveObjList()` | 添加到保存列表 | `newBufferObjList` / `newBufferNoteList` | +| `saveBufferObjToDatabase()` | 批量保存到数据库 | 全部缓存 | + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L100-L450) + +### MemoData 与扩展属性转换 + +GeoEditMixin 提供了 MemoData(备注数据)与扩展属性之间的自动转换机制,确保数据的一致性和完整性。 + +```python +# 将选择集对象的 MemoData 转换为扩展属性 +sel_geo_list = GeoBaseList() +# ... 加载对象到 sel_geo_list ... + +ss_process.transMemoDataToExtendAttr(sel_geo_list) +# 现在对象的 MemoData 已转换为标准扩展属性 + +# 在保存时会自动进行转换 +ss_process.bufferObjList.append(geo_with_memodata) +ss_process.saveBufferObjToDatabase() # 自动调用转换 +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L430-L450) + +### 删除缓存管理 + +GeoEditMixin 提供了删除对象的缓存机制,支持批量删除操作。 + +```python +# 标记要删除的对象 +del_list = GeoBaseList() +del_list.append(geo1) +del_list.append(geo2) + +# 添加到删除缓存 +ss_process.delBufferGeoList.append(del_list) + +# 在 saveBufferObjToDatabase() 时统一删除 +ss_process.saveBufferObjToDatabase() # 会处理 delBufferGeoList +``` + +Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L450-L460) + +## 数据结构容器 + +数据库更新接口使用了多个 SWIG 封装的数据容器类,这些容器提供了高效的集合操作和与 C++ 的无缝交互。 + +### StringArray 字符串数组 + +StringArray 是用于存储字符串序列的动态数组容器,广泛用于字段名列表、值列表等场景。 + +```python +from sunvpy.PySSDatabase import StringArray + +fields = StringArray() +fields.append("code") +fields.append("name") +fields.append("value") + +# 访问元素 +first_field = fields[0] # "code" + +# 迭代访问 +for i in range(fields.size()): + print(fields[i]) + +# 查找元素 +idx = -1 +for i in range(fields.size()): + if fields[i] == "name": + idx = i + break + +# 删除元素 +if idx != -1: + fields.erase(idx) + +# 清空数组 +fields.clear() +``` + +Sources: [PySSDatabase.py](PySSDatabase.py#L100-L245) + +### AttrList 属性列表 + +AttrList 是专门用于存储地物属性的键值对容器,提供了类似字典的访问接口。 + +```python +from sunvpy.PySSGisDBUpdate import AttrList + +attrs = AttrList() +attrs["code"] = "150" +attrs["name"] = "道路" +attrs["width"] = "12.5" + +# 访问属性 +code = attrs["code"] + +# 检查键是否存在 +if "name" in attrs: + name = attrs["name"] + +# 获取所有键 +keys = attrs.keys() +for key in keys: + value = attrs[key] + print(f"{key}: {value}") + +# 转换为 Python 字典 +attrs_dict = attrs.asdict() + +# 删除属性 +if "width" in attrs: + del attrs["width"] +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L299-L398) + +### FeatureList 地物列表 + +FeatureList 是专门用于存储地物对象的容器,支持批量地物操作。 + +```python +from sunvpy.PySSGisDBUpdate import FeatureList +from sunvpy.PySSCore import GeoBase + +features = FeatureList() +features.append(geo1) +features.append(geo2) + +# 访问地物 +first_feature = features[0] + +# 批量操作 +for i in range(features.size()): + geo = features[i] + geo.setCode(200) # 修改编码 + +# 删除地物 +if features.size() > 0: + features.pop_back() # 删除最后一个 + +# 清空列表 +features.clear() +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L401-L493) + +## 完整工作流示例 + +以下示例展示了如何使用数据库更新接口完成一个完整的数据同步和更新流程。 + +```python +from sunvpy.PySSGisDBUpdate import SSDbScript +from sunvpy.PySSCore import GeoBaseList, Point3D +from sunvpy.PySSDatabase import StringArray + +def sync_and_update_road_data(): + """完整的道路数据同步和更新流程""" + + # 1. 初始化和连接 + db_script = SSDbScript() + if not db_script.login("admin", "password"): + print("登录失败") + return False + + if not db_script.connectToTablespace("MainWorkspace"): + print("连接工作空间失败") + return False + + # 2. 下载服务器数据到本地 + region_coords = [(116.3, 39.9), (116.5, 39.9), + (116.5, 40.0), (116.3, 40.0)] + + download_ok = db_script.downloadDBToLocalDB( + workspace_handle, + region_coords, + "RoadLayer", + "status = 1", + False + ) + + if not download_ok: + print(f"下载失败: {db_script.m_strLogInfos}") + return False + + # 3. 在本地进行数据编辑 + # ... 使用 GeoEditMixin 或直接使用 Database 接口编辑数据 ... + + # 4. 查询需要更新的对象 + fields = StringArray() + values = StringArray() + fields.append("code") + values.append("150") + + results = db_script.searchFeatureAttr( + workspace_handle, + "RoadLayer", + "status = 1", + "code", # 排序字段 + fields # 查询字段 + ) + + # 5. 批量更新属性 + update_fields = StringArray() + update_values = StringArray() + update_fields.append("status") + update_values.append("2") + + db_script.editSDEDBTableRecord( + workspace_handle, + "RoadLayer", + "code IN (150, 151, 152)", + update_fields, + update_values + ) + + # 6. 上传本地修改到服务器 + upload_ok = db_script.uploadLocalDBToDB( + workspace_handle, + "RoadLayer", + 2 # 新增+更新模式 + ) + + if not upload_ok: + print(f"上传失败: {db_script.m_strLogInfos}") + return False + + # 7. 创建备份 + backup_ok = db_script.backupDataToEgdb( + workspace_handle, + f"D:/Backup/road_backup_{time.strftime('%Y%m%d')}.egdb" + ) + + # 8. 登出 + db_script.logout() + + print("数据同步和更新完成") + return True + +# 执行流程 +if __name__ == "__main__": + sync_and_update_road_data() +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L1-L493), [PySSDatabase.py](PySSDatabase.py#L1-L1643) + +## 错误处理与日志 + +数据库更新接口提供了完善的错误处理和日志记录机制,帮助开发者诊断和解决问题。 + +### 日志信息获取 + +SSDbScript 类提供了 `m_strLogInfos` 属性用于获取操作日志信息。 + +```python +db_script = SSDbScript() + +# 执行操作 +result = db_script.uploadLocalDBToDB(workspace_handle, "RoadLayer", 2) + +# 检查结果并获取日志 +if not result: + log_info = db_script.m_strLogInfos + print(f"操作失败: {log_info}") + + # 可以将日志写入文件 + with open("db_error.log", "a", encoding="utf-8") as f: + f.write(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {log_info}\n") + +# 也可以使用 outputMsgInfo 输出信息 +db_script.outputMsgInfo("操作开始...") +db_script.outputMsgInfo("操作完成") +``` + +### 常见错误处理 + +```python +try: + # 连接错误处理 + if not db_script.login("user", "pass"): + raise ConnectionError("数据库连接失败") + + # 权限错误处理 + result = db_script.uploadLocalDBToDB(workspace_handle, "ProtectedLayer", 2) + if not result and "permission" in db_script.m_strLogInfos.lower(): + raise PermissionError("没有权限执行此操作") + + # 数据验证错误 + result = db_script.addSDEDBTableRecord( + workspace_handle, "MyTable", fields, values + ) + if not result and "constraint" in db_script.m_strLogInfos.lower(): + raise ValueError("数据违反约束条件") + +except ConnectionError as e: + print(f"连接错误: {e}") + db_script.logout() + +except PermissionError as e: + print(f"权限错误: {e}") + # 提示用户联系管理员 + +except ValueError as e: + print(f"数据错误: {e}") + # 记录错误数据 + +except Exception as e: + print(f"未知错误: {e}") + print(f"日志信息: {db_script.m_strLogInfos}") +``` + +Sources: [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L76-L78), [PySSGisDBUpdate.py](PySSGisDBUpdate.py#L283-L284) + +## 性能优化建议 + +在使用数据库更新接口时,遵循以下性能优化建议可以显著提升操作效率: + +### 批量操作优先 + +```python +# 不推荐:逐个保存对象 +for obj in large_object_list: + database.saveGeoObject(dataset, obj) # 每次都提交事务 + +# 推荐:批量保存 +obj_list = GeoBaseList() +for obj in large_object_list: + obj_list.append(obj) +database.saveGeoObject(dataset, obj_list) # 一次性保存 +``` + +### 合理使用事务 + +```python +# 批量操作使用事务 +database.beginTransaction() +try: + for i in range(1000): + database.execute(f"UPDATE Table SET value = {i}") + database.commitTransaction() +except: + database.rollbackTransaction() +``` + +### 使用增量下载 + +```python +# 首次全量下载 +db_script.downloadDBToLocalDB1(workspace_handle, region_guid, False) + +# 后续增量下载(只下载变更数据) +db_script.downloadDBToLocalDB1(workspace_handle, region_guid, True) +``` + +### 限制查询范围 + +```python +# 不推荐:查询整个表 +result = db_script.searchFeatureAttr(tablespace, "Layer", "", "", fields) + +# 推荐:限制查询条件 +result = db_script.searchFeatureAttr( + tablespace, + "Layer", + "status = 1 AND code > 100", # 添加过滤条件 + "code", + fields +) +``` + +### 使用对象缓存 + +```python +# 使用 GeoEditMixin 的缓存机制 +for i in range(100): + obj, geo = ss_process.createNewObjByCode(code) + ss_process.setNewObjValue("name", f"对象{i}") + ss_process.addNewObjPoint(x, y, z, 0, "") + ss_process.addNewObjToSaveObjList() + +# 一次性保存所有对象 +ss_process.saveBufferObjToDatabase() +``` + +Sources: [PySSDatabase.py](PySSDatabase.py#L332-L348), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L430-L460) + +## 相关接口与扩展 + +数据库更新接口与其他 SunvStation 组件紧密集成,形成了完整的 GIS 数据管理生态系统。 + +### 与数据交换的集成 + +数据库更新接口与数据交换接口配合使用,可以实现数据的导入导出和格式转换。 + +```python +from sunvpy.PySSDataX import DataXScript + +# 配置数据交换参数 +data_x = DataXScript() +data_x.setDataXParameter("ImportFormat", "SHP") +data_x.setDataXParameter("ImportPath", "D:/Data/roads.shp") + +# 执行数据导入 +data_x.importData() + +# 使用数据库更新接口处理导入的数据 +# ... 执行更新操作 ... + +# 配置数据导出 +data_x.clearDataXParameter() +data_x.setDataXParameter("ExportFormat", "GDB") +data_x.setDataXParameter("ExportPath", "D:/Data/output.gdb") + +# 执行数据导出 +data_x.exportData() +``` + +更多数据交换详情请参考 [数据交换参数配置](26-shu-ju-jiao-huan-can-shu-pei-zhi)。 + +### 与地理对象编辑的集成 + +数据库更新接口与地理对象编辑功能深度集成,支持从对象创建到数据库保存的完整流程。 + +```python +# 创建对象(使用 GeoEditMixin) +obj, geo = ss_process.createNewObjByCode(150) +ss_process.setNewObjValue("name", "测试道路") +ss_process.addNewObjPoint(x1, y1, z1, 0, "") +ss_process.addNewObjPoint(x2, y2, z2, 0, "") +ss_process.addNewObjPoint(x3, y3, z3, 0, "") + +# 添加到保存列表 +ss_process.addNewObjToSaveObjList() + +# 使用 Database 接口进行高级操作 +database.beginTransaction() +ss_process.saveBufferObjToDatabase() +database.commitTransaction() +``` + +更多地理对象编辑详情请参考 [创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) 和 [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)。 + +Sources: [PySSDataX.py](PySSDataX.py#L100-L173), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L100-L460) + +## 下一步学习 + +掌握数据库更新接口后,建议继续学习以下相关主题,以构建完整的 SunvStation 开发知识体系: + +- **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**:深入了解对象缓存机制和批量保存策略 +- **[数据交换参数配置](26-shu-ju-jiao-huan-can-shu-pei-zhi)**:学习如何配置和执行数据导入导出操作 +- **[创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang)**:掌握对象创建和属性设置的完整流程 +- **[SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api)**:查看完整的 API 参考文档 +- **[错误处理与异常管理](39-cuo-wu-chu-li-yu-yi-chang-guan-li)**:学习系统级的错误处理和日志管理 \ No newline at end of file diff --git a/docs/content/5-yun-xing-nei-zhi-shi-li-jiao-ben.md b/docs/content/5-yun-xing-nei-zhi-shi-li-jiao-ben.md new file mode 100644 index 0000000..17aa646 --- /dev/null +++ b/docs/content/5-yun-xing-nei-zhi-shi-li-jiao-ben.md @@ -0,0 +1,228 @@ +sunvpy提供了一个内置的示例脚本,帮助初学者快速理解如何使用SSProcess进行地物查询、属性读取和修改操作。这个示例脚本位于PySSProcess模块的`__main__`代码块中,展示了完整的数据处理工作流程,从筛选对象到修改属性再到验证结果的全部过程。 + +Sources: [PySSProcess.py](PySSProcess.py#L93-L140) + +## 示例脚本架构概览 + +内置示例脚本通过一个连贯的演示,将之前学习的选择集管理和属性操作知识整合在一起。该脚本展示了如何在SunvStation环境中执行典型的批量数据处理任务:筛选特定编码的地物对象、查看其属性信息、批量修改多个属性字段,并最终验证修改结果。 + +```mermaid +graph TB + A[脚本执行入口] --> B[初始化阶段
清理选择集与条件] + B --> C[筛选阶段
按编码过滤地物] + C --> D[读取阶段
遍历并显示原始属性] + D --> E[修改阶段
批量更新属性值] + E --> F[验证阶段
显示修改后属性] + + B --> B1[clearSelection
清空选择集] + B --> B2[clearSelectCondition
清空筛选条件] + + C --> C1[setSelectCondition
设置编码条件] + C --> C2[selectFilter
执行查询] + + D --> D1[getSelGeoCount
获取对象数量] + D --> D2[getSelGeoValue
读取属性值] + + E --> E1[基本属性修改
ID/线型/颜色等] + E --> E2[扩展属性修改
#91;JG#93;,#91;CS#93;等] + + F --> F1[二次遍历对象] + F --> F2[对比显示结果] +``` + +这个流程图清晰地展示了脚本的四个主要阶段:初始化、筛选、修改和验证。每个阶段都对应一组核心API调用,形成了一个完整的数据处理闭环。 + +Sources: [PySSProcess.py](PySSProcess.py#L93-L140) + +## 脚本运行方式 + +### 方法一:直接执行模块 + +在Windows命令行中,通过Python解释器直接执行PySSProcess模块文件: + +```cmd +python D:\1SunvStationDev\sunvstation-release\build\bin\Release\script\python313\Lib\site-packages\sunvpy\PySSProcess.py +``` + +这种方式的优点是简单直接,无需额外代码即可运行示例。 + +### 方法二:从Python脚本导入 + +创建一个Python脚本文件(如`run_example.py`),通过导入执行: + +```python +import sunvpy.PySSProcess +``` + +这种方法更加灵活,可以在执行前后添加自己的代码逻辑。 + +Sources: [PySSProcess.py](PySSProcess.py#L93-L140) + +## 示例脚本详解 + +### 阶段一:初始化与筛选 + +脚本首先清理环境并建立筛选条件,确保操作的准确性和可重复性。 + +```python +SSProcess.clearSelection() # 清除之前的选择集 +SSProcess.clearSelectCondition() # 清除之前的筛选条件 +SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") # 按编码筛选 +SSProcess.selectFilter() # 执行查询 +print(f"选择集中的点线面对象数量: {SSProcess.getSelGeoCount()}") +``` + +这几行代码完成了所有准备工作。`3103013`是示例使用的地物编码,在实际运行前应替换为当前地图中实际存在的编码值。 + +Sources: [PySSProcess.py](PySSProcess.py#L94-L98) + +### 阶段二:属性字段列表 + +脚本定义了一个包含35个属性字段的列表,涵盖了基本属性、几何特性和扩展属性: + +```python +fields = [ + "SSObj_ID", "SSObj_Code", "SSObj_LayerName", "SSObj_Type", "SSObj_Color", + "SSObj_LineType", "SSObj_LineWidth", "SSObj_Name", "SSObj_Byname", "SSObj_Angle", + "SSObj_DataMark", "SSObj_CreateTime", "SSObj_ModifyTime", "SSObj_ExplodeStatus", + "SSObj_FontWidth", "SSObj_FontHeight", "SSObj_FontName", "SSObj_FontClass", + "SSObj_FontAlignment", "SSObj_FontWordAngle", "SSObj_FontStringAngle", "SSObj_FontWeight", + "SSObj_FontIlaticAngle", "SSObj_FontDownAngle", "SSObj_FontUnderLine", "SSObj_FontInterval", + "SSObj_FontString", "SSObj_Area", "SSObj_Length", "SSObj_PointCount", "SSObj_X", + "SSObj_Y", "SSObj_Z", "SSObj_PointName", "SSObj_PointType", "SSObj_SymType", "[JG]", "[CS]" +] +``` + +| 属性类别 | 字段示例 | 说明 | +|---------|---------|------| +| 基本标识 | SSObj_ID, SSObj_Code, SSObj_Name | 对象的唯一标识、编码和名称 | +| 显示属性 | SSObj_Color, SSObj_LineType, SSObj_LineWidth | 颜色、线型、线宽等显示特征 | +| 几何特性 | SSObj_Area, SSObj_Length, SSObj_PointCount | 面积、长度、点数等几何参数 | +| 坐标信息 | SSObj_X, SSObj_Y, SSObj_Z | 对象的空间坐标位置 | +| 扩展属性 | [JG], [CS] | 结构、层数等自定义扩展属性 | + +Sources: [PySSProcess.py](PySSProcess.py#L99-L108) + +### 阶段三:读取并显示原始属性 + +脚本遍历选择集的前10个对象,读取并显示所有定义的属性值: + +```python +for i in range(0, 10): + print(f"第 {i} 个对象属性:") + for field in fields: + value = SSProcess.getSelGeoValue(i, field) + print(f" {field}: {value}") + print("-" * 40) +``` + +这段代码会为每个对象输出格式化的属性信息,方便查看原始数据状态。 + +Sources: [PySSProcess.py](PySSProcess.py#L110-L115) + +### 阶段四:批量修改属性 + +脚本演示了如何修改不同类型的属性值: + +```python +for i in range(0, 10): + SSProcess.setSelGeoValue(i, "< SSObj_ID >", f"{i+1000}") # 几何属性修改 + SSProcess.setSelGeoValue(i, "", "3") # 线型修改 + SSProcess.setSelGeoValue(i, "SSObj_LineWidth", "2") # 基本属性修改 + SSProcess.setSelGeoValue(i, "SSObj_Color", "16777215") # 颜色修改为白色 + SSProcess.setSelGeoValue(i, "SSObj_Name", f"对象{i+1}") # 名称修改 + SSProcess.setSelGeoValue(i, "SSObj_Byname", f"别名{i+1}") # 别名修改 + SSProcess.setSelGeoValue(i, "SSObj_Angle", "180") # 角度修改 + SSProcess.setSelGeoValue(i, "SSObj_DataMark", "1") # 数据标记 + SSProcess.setSelGeoValue(i, "SSObj_CreateTime", "2025-5-01 12:00:00") # 创建时间 + SSProcess.setSelGeoValue(i, "SSObj_ModifyTime", "2023-7-01 12:00:00") # 修改时间 + SSProcess.setSelGeoValue(i, "[JG],[CS]", "砖混, 6") # 扩展属性修改(结构、层数) +``` + +| 属性类型 | 修改方式 | 示例 | +|---------|---------|------| +| 几何属性 | 使用尖括号`< >`包围 | `< SSObj_ID >` | +| 基本属性 | 直接使用属性名 | `SSObj_Color` | +| 扩展属性 | 使用方括号`[ ]`包围 | `[JG],[CS]` | +| 多值属性 | 逗号分隔多个字段 | `[JG],[CS]` | + + Sources: [PySSProcess.py](PySSProcess.py#L117-L130) + +### 阶段五:验证修改结果 + +最后,脚本再次遍历对象,显示修改后的属性值,用于对比验证: + +```python +print("修改后的选择集对象属性:") +for i in range(0, 10): + print(f"第 {i} 个对象属性:") + for field in fields: + value = SSProcess.getSelGeoValue(i, field) + print(f" {field}: {value}") + print("-" * 40) +``` + +通过对比修改前后的输出,可以清楚地看到属性变化,验证脚本执行的正确性。 + +Sources: [PySSProcess.py](PySSProcess.py#L132-L138) + +## 注意事项与最佳实践 + +### 运行前准备 + +在运行示例脚本前,请确保满足以下条件: + +| 检查项 | 说明 | 检查方法 | +|-------|------|---------| +| SunvStation环境 | 必须在SunvStation系统中运行 | 确认系统已启动 | +| 工作空间 | 需要有打开的工作空间 | 检查是否有激活项目 | +| 地物编码 | 编码3103013必须存在于当前地图 | 使用系统查询工具确认 | +| Python路径 | Python环境需正确配置 | 运行`python --version`验证 | + +### 修改建议 + +实际运行时,建议根据当前地图情况调整脚本参数: + +```python +# 1. 替换为实际存在的编码 +SSProcess.setSelectCondition("SSObj_Code", "==", "你的实际编码") + +# 2. 调整遍历对象数量以匹配实际选择集大小 +obj_count = SSProcess.getSelGeoCount() +display_count = min(10, obj_count) # 显示对象数量不超过实际数量 +for i in range(display_count): + # 处理逻辑 + pass + +# 3. 修改属性值时考虑数据类型的一致性 +# 例如:颜色值应为整数,时间格式应符合系统要求 +``` + +Sources: [PySSProcess.py](PySSProcess.py#L96-L98) + +## 学习价值 + +这个内置示例脚本集成了sunvpy的多个核心概念,具有很高的学习价值: + +- **选择集管理**:演示了完整的选择集生命周期(清理、查询、遍历) +- **属性读取**:展示了如何读取基本属性和扩展属性 +- **属性修改**:涵盖了不同类型属性的修改技巧 +- **工作流程**:提供了标准的数据处理流程模板 + +建议初学者仔细阅读并运行这个示例,然后尝试修改其中的参数和逻辑,逐步加深对sunvpy API的理解。 + +Sources: [PySSProcess.py](PySSProcess.py#L93-L140) + +## 下一步学习 + +掌握内置示例脚本后,建议按照以下路径继续深入学习: + +1. **深入学习选择集管理**:阅读[使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji),了解更复杂的选择条件组合和批量操作技巧 + +2. **掌握地理对象编辑**:学习[创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang)和[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi),理解对象创建和缓存管理 + +3. **探索数据交换功能**:查看[导入外部数据](27-dao-ru-wai-bu-shu-ju)和[导出数据到文件](28-dao-chu-shu-ju-dao-wen-jian),学习如何与其他系统交换数据 + +4. **理解系统架构**:阅读[SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou)和[Mixin 设计模式](9-mixin-she-ji-mo-shi),深入理解底层设计原理 + +通过这个示例脚本的实际运行和代码研究,您将建立起对sunvpy开发框架的整体认知,为后续的高级开发奠定坚实基础。 \ No newline at end of file diff --git a/docs/content/6-sunvstation-xi-tong-jia-gou.md b/docs/content/6-sunvstation-xi-tong-jia-gou.md new file mode 100644 index 0000000..e36f41d --- /dev/null +++ b/docs/content/6-sunvstation-xi-tong-jia-gou.md @@ -0,0 +1,275 @@ +本文档从架构层面阐述 SunvStation 系统的设计理念、核心组件及其交互关系,帮助开发者理解系统的整体结构,为深入学习和二次开发奠定基础。 + +## 整体架构概览 + +SunvStation 采用分层架构设计,将 C++ 核心能力、Python 接口封装和业务逻辑管理清晰分离,形成高内聚、低耦合的系统结构。整个系统围绕 SSProcessManager 核心管理类展开,通过 Mixin 设计模式将功能模块化组合,同时借助 SWIG 技术实现 C++ 与 Python 的无缝集成。 + +Sources: [__init__.py](__init__.py#L1-L12), [PySSProcess.py](PySSProcess.py#L1-L100) + +```mermaid +graph TB + subgraph "应用层 Python 业务逻辑" + SSProcess[SSProcessManager
核心管理类] + + subgraph "Mixin 功能模块" + SelectionM[SelectionMixin
选择集操作] + GeoEditM[GeoEditMixin
地理对象编辑] + ProjectM[ProjectMixin
项目管理] + LogM[LogMixin
日志记录] + ProgressM[ProgressMixin
进度管理] + end + + ObjBase[ObjBaseAttr
属性管理器] + end + + subgraph "接口层 SWIG 封装" + Core[PySSCore
核心类型与工作空间] + Database[PySSDatabase
数据库操作] + Map[PySSMap
地图与数据集] + DataSource[PySSDataSource
数据源访问] + View[PySSView
视图控制] + DataX[PySSDataX
数据交换] + Check[PySSCheck
数据检查] + Math[PySSMath
数学计算] + Widget[PySSWidget
UI组件] + end + + subgraph "实现层 C++ 核心库" + CoreDL[_PySSCore.pyd] + DatabaseDL[_PySSDatabase.pyd] + MapDL[_PySSMap.pyd] + DataSourceDL[_PySSDataSource.pyd] + ViewDL[_PySSView.pyd] + DataXDL[_PySSDataX.pyd] + CheckDL[_PySSCheck.pyd] + MathDL[_PySSMath.pyd] + WidgetDL[_PySSWidget.pyd] + end + + SSProcess -.->|继承| SelectionM + SSProcess -.->|继承| GeoEditM + SSProcess -.->|继承| ProjectM + SSProcess -.->|继承| LogM + SSProcess -.->|继承| ProgressM + SSProcess -->|使用| ObjBase + + SelectionM -->|调用| Core + SelectionM -->|调用| DataSource + GeoEditM -->|调用| Core + GeoEditM -->|调用| Database + ProjectM -->|调用| Core + ProjectM -->|调用| Map + LogM -.->|回调| Widget + ProgressM -->|调用| Widget + + Core -->|加载| CoreDL + Database -->|加载| DatabaseDL + Map -->|加载| MapDL + DataSource -->|加载| DataSourceDL + View -->|加载| ViewDL + DataX -->|加载| DataXDL + Check -->|加载| CheckDL + Math -->|加载| MathDL + Widget -->|加载| WidgetDL + + style SSProcess fill:#e1f5ff + style CoreDL fill:#fff4e1 + style DatabaseDL fill:#fff4e1 + style MapDL fill:#fff4e1 + style DataSourceDL fill:#fff4e1 + style ViewDL fill:#fff4e1 + style DataXDL fill:#fff4e1 + style CheckDL fill:#fff4e1 + style MathDL fill:#fff4e1 + style WidgetDL fill:#fff4e1 +``` + +### 架构层次说明 + +SunvStation 系统架构分为三个层次,各层职责明确,通过标准接口实现交互。 + +**应用层**负责业务逻辑编排和用户交互,包含 SSProcessManager 核心管理类和多个 Mixin 功能模块。SSProcessManager 通过继承多个 Mixin 类组合功能,对外提供统一的 API 接口,对内协调各个功能模块的协作。ObjBaseAttr 作为属性管理器,统一管理地物属性的名称映射和索引转换。Sources: [PySSProcess.py](PySSProcess.py#L28-L70) + +**接口层**由多个 SWIG 自动生成的 Python 模块组成,每个模块对应特定的功能域。这些模块将 C++ 对象和方法封装为 Python 可调用的接口,同时保持与底层实现的高效通信。所有接口模块遵循相同的 SWIG 封装模式,包括类型代理、迭代器支持和动态属性管理。Sources: [PySSCore.py](PySSCore.py#L1-L50), [PySSDatabase.py](PySSDatabase.py#L1-L50), [PySSView.py](PySSView.py#L1-L50) + +**实现层**是编译为动态链接库(.pyd 文件)的 C++ 核心代码,提供高性能的地理数据处理能力。这一层包含工作空间管理、地图渲染、数据库访问、空间分析等核心算法和功能。C++ 实现通过 SWIG 暴露给 Python,既保证了性能,又提供了易用的脚本接口。Sources: [PySSMap.py](PySSMap.py#L1-L50), [PySSDataX.py](PySSDataX.py#L1-L50), [PySSCheck.py](PySSCheck.py#L1-L50) + +## 核心组件详解 + +### SWIG 封装层 + +SWIG(Simplified Wrapper and Interface Generator)是连接 C++ 和 Python 的桥梁,通过自动生成的代理类实现类型安全的跨语言调用。所有 PySS*.py 文件都包含统一的 SWIG 生成代码模板,包括代理对象表示、动态属性控制、元类支持和迭代器实现。Sources: [PySSCore.py](PySSCore.py#L10-L45) + +| SWIG 模块 | 功能域 | C++ 动态库 | +|---------|--------|-----------| +| PySSCore | 核心类型、工作空间、几何对象 | _PySSCore.pyd | +| PySSDatabase | 数据库操作、对象存储 | _PySSDatabase.pyd | +| PySSMap | 地图管理、数据集访问 | _PySSMap.pyd | +| PySSDataSource | 数据源访问、查询 | _PySSDataSource.pyd | +| PySSView | 视图控制、地图显示 | _PySSView.pyd | +| PySSDataX | 数据交换、导入导出 | _PySSDataX.pyd | +| PySSCheck | 数据检查、验证规则 | _PySSCheck.pyd | +| PySSMath | 数学计算、坐标转换 | _PySSMath.pyd | +| PySSWidget | UI 组件、进度条 | _PySSWidget.pyd | + +SWIG 封装层使用版本 4.4.0,通过条件导入机制支持包内和独立模块两种导入方式,确保在不同部署环境下的兼容性。Sources: [PySSCore.py](PySSCore.py#L10-L14), [PySSDatabase.py](PySSDatabase.py#L10-L14) + +### SSProcessManager 核心管理类 + +SSProcessManager 是 SunvStation Python 接口的核心入口,通过单例模式 SSProcess 向外提供服务。该类在初始化时获取工作空间和当前地图实例,创建必要的辅助对象,为后续操作准备环境。Sources: [PySSProcess.py](PySSProcess.py#L28-L70) + +```mermaid +flowchart LR + A[SSProcessManager.__init__] --> B[获取 WorkSpace 单例] + B --> C[获取当前 ScaleMap] + C --> D[获取 GlobalOptions 单例] + D --> E[创建 ObjBaseAttr 属性管理器] + E --> F[创建 GeoBaseList 选择集] + F --> G[创建 SSearchHelper 搜索助手] + G --> H[创建缓存对象列表] + H --> I[创建进度条和日志对象] + I --> J[初始化完成] + + style A fill:#e1f5ff + style J fill:#d4edda +``` + +SSProcessManager 的成员变量涵盖了工作空间管理的各个方面,包括工作空间引用、地图实例、全局配置、属性管理器、选择集列表、搜索助手、当前选中对象、新建对象缓存、删除对象缓存、进度条和日志记录器等。这种设计将所有操作所需的状态集中管理,简化了跨模块协作。Sources: [PySSProcess.py](PySSProcess.py#L33-L66) + +### Mixin 设计模式 + +Mixin 设计模式是 SSProcessManager 架构的核心特征,通过将功能拆分为独立的 Mixin 类,实现代码复用和职责分离。SSProcessManager 继承自五个 Mixin 类:SelectionMixin、GeoEditMixin、ProjectMixin、LogMixin 和 ProgressMixin,每个 Mixin 负责特定的功能域。Sources: [PySSProcess.py](PySSProcess.py#L28) + +Mixin 之间存在依赖关系,形成了清晰的功能层次。SelectionMixin 继承自 GeoEditAware、LogAware 和 ProgressAware,继承了地理编辑、日志记录和进度管理的抽象接口。GeoEditMixin 定义了地理对象编辑的抽象方法,为具体实现提供规范。这种基于抽象基类的设计确保了 Mixin 之间的松耦合和高内聚。Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L21-L40), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L13-L55) + +| Mixin 类 | 功能域 | 主要方法 | +|---------|--------|----------| +| SelectionMixin | 选择集管理 | clearSelection, setSelectCondition, selectFilter, getSelGeoCount | +| GeoEditMixin | 地理对象编辑 | createDefaultGeoBase, createNewObjByCode, addNewObjPoint, saveBufferObjToDatabase | +| ProjectMixin | 项目和工作空间 | getWorkspace, getCurrentMap, pushUndoMark, getSysPathName, mapZoom | +| LogMixin | 日志记录 | set_logger, log_error_msg | +| ProgressMixin | 进度管理 | disable_progress, startProgress, stepProgress, closeProgress | + +### 属性管理系统 + +ObjBaseAttr 类负责地物属性的统一管理,将属性名称映射为索引,提供类型安全的属性访问。该类在初始化时注册所有预定义的属性名称,包括点属性、地物通用属性、几何参量、注记属性等,并为常用属性提供便捷访问属性。Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L6-L80) + +属性名称采用 SSObj_ 前缀的命名约定,涵盖了地物对象的各个方面。点属性包括 PointName、PointCount、PointType、X、Y、Z;地物通用属性包括 Code、LayerName、Color、LineType、ID、Name、Type 等;几何参量包括 Area、Length、3DLength、边界坐标等;注记属性包括字体、颜色、对齐方式、方向等。通过统一的属性命名和管理,系统确保了属性访问的一致性和可维护性。Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L13-L60) + +## 模块架构与职责 + +### 核心模块 + +PySSCore 模块定义了系统的基础类型和工作空间管理类,是整个系统的核心依赖。该模块包含 WorkSpace 单例类、GeoBase 地物基类、GeoBaseList 地物列表、SSearchHelper 搜索助手等核心类型。WorkSpace 采用单例模式,提供全局唯一的工作空间实例,通过 getInstance() 方法访问。ScaleMap 代表比例尺地图,管理数据集和图层。Sources: [PySSProcess.py](PySSProcess.py#L55-L66) + +PySSDatabase 模块负责数据库操作,包括对象的创建、修改、删除和查询。该模块封装了底层数据库访问逻辑,提供事务支持和缓存管理。PySSMap 模块管理地图和数据集,提供图层控制、视图操作和数据集访问功能。PySSDataSource 模块处理数据源访问,支持多种数据格式和查询方式。Sources: [PySSDatabase.py](PySSDatabase.py#L1-L80), [PySSMap.py](PySSMap.py#L1-L100) + +### 功能域划分 + +SunvStation 系统按照功能域划分为六个主要领域,每个领域由相应的模块和 Mixin 负责实现。选择集与查询领域由 SelectionMixin 和 SSearchHelper 负责,支持条件设置、过滤查询和选择集遍历。地理对象编辑领域由 GeoEditMixin 负责,提供对象创建、坐标添加、属性设置和数据库保存功能。Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L44-L65), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L13-L55) + +数据交换领域由 PySSDataX 模块负责,支持外部数据的导入导出和格式转换。数据检查领域由 PySSCheck 模块负责,提供检查记录管理和自定义规则验证。高级功能领域由 ProjectMixin、LogMixin 和 ProgressMixin 共同负责,涵盖工作空间管理、日志记录和进度显示。参考手册领域则提供完整的 API 文档和工具函数索引。Sources: [PySSDataX.py](PySSDataX.py#L1-L80), [PySSCheck.py](PySSCheck.py#L1-L50) + +## 设计模式与架构特性 + +### Mixin 设计模式 + +Mixin 设计模式是系统架构的核心特征,通过多重继承实现功能的组合。每个 Mixin 类专注于单一职责,提供相关的方法集合。SelectionMixin 专注于选择集操作,包括清除选择集、设置条件、执行过滤等。GeoEditMixin 专注于地理对象编辑,包括对象创建、属性修改、缓存管理等。ProjectMixin 专注于项目和工作空间操作,包括获取工作空间、地图缩放、撤销标记等。Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L44-L65), [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L31-L56) + +Mixin 之间通过抽象基类建立契约关系,确保接口的一致性。LogAware 和 ProgressAware 定义了日志和进度管理的抽象接口,LogMixin 和 ProgressMixin 提供具体实现。GeoEditAware 定义了地理编辑的抽象方法,GeoEditMixin 实现这些方法,其他需要编辑功能的 Mixin 可以继承 GeoEditAware 或依赖 GeoEditMixin。Sources: [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py#L17-L28), [ssprocess_mixins/progress_mixin.py](ssprocess_mixins/progress_mixin.py#L17-L35) + +### 单例模式 + +单例模式在系统中广泛使用,确保全局唯一对象的创建和访问。WorkSpace 采用单例模式,通过 getInstance() 方法获取唯一实例,全局维护工作空间状态。GlobalOptions 同样采用单例模式,管理系统全局配置选项。SSProcess 作为全局导出的单例,提供统一的访问入口,简化了 API 的使用。Sources: [PySSProcess.py](PySSProcess.py#L55-L58), [PySSProcess.py](PySSProcess.py#L136-L137) + +### 抽象基类模式 + +抽象基类(ABC)用于定义 Mixin 之间的契约,确保接口的一致性和可扩展性。LogAware 和 ProgressAware 使用 abc.ABC 作为基类,定义了必须实现的抽象方法。GeoEditAware 继承自 abc.ABC,定义了地理编辑的抽象方法列表。这种设计利用 Python 的类型系统,在编译时检查接口的完整性,提高了代码的健壮性。Sources: [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py#L17-L18), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L12) + +### 依赖注入模式 + +依赖注入模式在系统中体现在对象成员的显式声明和初始化上。SSProcessManager 和各个 Mixin 类都显式声明了成员变量类型,包括 workspace、map、global_options、logger 等。这种设计使得依赖关系清晰可见,便于单元测试和模块替换。成员变量的类型注解使用 typing 模块,包括 Optional 和 Callable,提高了代码的可读性和 IDE 支持度。Sources: [PySSProcess.py](PySSProcess.py#L33-L66), [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L21-L40) + +## 技术栈与依赖 + +### SWIG 封装技术 + +SWIG 版本 4.4.0 是系统跨语言集成的核心技术,通过自动生成的代理类实现 C++ 和 Python 的无缝连接。每个 PySS*.py 文件都包含 SWIG 生成的标准模板,包括动态属性控制、迭代器支持和元类实现。SWIG 使用 _swig_repr 提供对象的字符串表示,使用 _swig_setattr_nondynamic_instance_variable 和 _swig_setattr_nondynamic_class_variable 防止动态属性添加,确保类型安全。Sources: [PySSCore.py](PySSCore.py#L1-L45), [PySSDatabase.py](PySSDatabase.py#L1-L45) + +### Python 类型提示 + +系统广泛使用 Python 类型提示,提高代码的可读性和 IDE 支持度。typing.Optional 用于可能为 None 的对象,如 logger 和 progress。typing.Callable 用于回调函数类型。成员变量使用显式类型注解,如 workspace: WorkSpace、map: ScaleMap、enable_progress: bool。这种设计利用 Python 3.5+ 的类型系统,在不影响运行时性能的前提下提供静态类型检查。Sources: [PySSProcess.py](PySSProcess.py#L33-L66), [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py#L17-L28) + +### 抽象基类(ABC) + +abc 模块用于定义抽象基类和抽象方法,建立 Mixin 之间的契约。LogAware 和 ProgressAware 定义了日志和进度管理的抽象方法,LogMixin 和 ProgressMixin 提供具体实现。GeoEditAware 定义了地理编辑的抽象方法,包括 createDefaultGeoBase、createNewObjByCode、addNewObjPoint 等。这种设计利用 Python 的抽象基类机制,在编译时检查接口实现,提高了代码的健壮性。Sources: [ssprocess_mixins/log_mixin.py](ssprocess_mixins/log_mixin.py#L17-L28), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L12) + +## 数据流与交互 + +### 初始化流程 + +系统初始化从导入 sunvpy 模块开始,通过 __init__.py 定义包的元信息和导出接口。创建 SSProcessManager 实例时,依次获取 WorkSpace 单例、当前 ScaleMap、GlobalOptions 单例,创建 ObjBaseAttr 属性管理器、GeoBaseList 选择集、SSearchHelper 搜索助手,初始化缓存对象列表、进度条和日志对象。初始化完成后,SSProcess 作为全局单例提供服务。Sources: [PySSProcess.py](PySSProcess.py#L28-L70), [PySSProcess.py](PySSProcess.py#L136-L137) + +### 操作流程 + +用户通过 SSProcess 调用 Mixin 提供的方法,如 setSelectCondition 设置选择条件,selectFilter 执行过滤查询,getSelGeoCount 获取选择集数量。方法调用通过 Mixin 委托给 SWIG 封装的 C++ 对象,如 SSearchHelper 的 m_selectConditions 属性,WorkSpace 的 getCurrentScaleMap 方法。结果通过 SWIG 代理对象返回 Python 层,由 Mixin 进行必要的数据转换和缓存管理。Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L44-L65) + +### 缓存管理 + +系统采用多级缓存机制,提高性能和事务管理能力。selGeoList 和 selNoteList 缓存脚本选择集的地物和注记,bufferObjList 和 bufferNoteList 缓存需要保存的对象,newBufferObjList 和 newBufferNoteList 缓存新创建的对象,delBufferGeoList 缓存需要删除的对象。通过 saveBufferObjToDatabase 方法批量将缓存对象保存到数据库,通过 pushUndoMark 方法创建撤销标记,支持操作回滚。Sources: [PySSProcess.py](PySSProcess.py#L59-L66), [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L56-L60) + +```mermaid +sequenceDiagram + participant User as 用户代码 + participant SSProcess as SSProcessManager + participant Mixin as Mixin 模块 + participant SWIG as SWIG 封装层 + participant CPP as C++ 核心库 + + User->>SSProcess: SSProcess.setSelectCondition() + SSProcess->>Mixin: SelectionMixin.setSelectCondition() + Mixin->>SWIG: searchHelper.m_selectConditions.add() + SWIG->>CPP: SSearchHelper::addCondition() + CPP-->>SWIG: 返回结果 + SWIG-->>Mixin: 返回结果 + Mixin-->>SSProcess: 完成 + SSProcess-->>User: 返回 + + User->>SSProcess: SSProcess.selectFilter() + SSProcess->>Mixin: SelectionMixin.selectFilter() + Mixin->>SWIG: searchHelper.search() + SWIG->>CPP: SSearchHelper::executeQuery() + CPP-->>SWIG: 返回 GeoBaseList + SWIG-->>Mixin: 返回选择集 + Mixin->>Mixin: 缓存到 selGeoList + Mixin-->>SSProcess: 完成 + SSProcess-->>User: 返回选择集数量 + + User->>SSProcess: SSProcess.saveBufferObjToDatabase() + SSProcess->>Mixin: GeoEditMixin.saveBufferObjToDatabase() + Mixin->>SWIG: GeoBaseList.saveToDatabase() + SWIG->>CPP: Database::batchSave() + CPP-->>SWIG: 返回保存结果 + SWIG-->>Mixin: 返回结果 + Mixin->>Mixin: 清空缓存 + Mixin-->>SSProcess: 完成 + SSProcess-->>User: 返回 +``` + +## 推荐学习路径 + +基于系统架构和文档目录,建议按照以下顺序深入学习 SunvStation 系统: + +1. **基础概念**:首先阅读[库概述](1-ku-gai-shu)和[安装与环境配置](2-an-zhuang-yu-huan-jing-pei-zhi),了解系统基本概念和部署要求。 + +2. **入门实践**:通过[第一个脚本:查询地物属性](3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing)和[使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji)进行实践操作,熟悉基本 API。 + +3. **架构理解**:在实践基础上,深入理解本文档[SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou),然后学习[SWIG 封装机制说明](7-swig-feng-zhuang-ji-zhi-shuo-ming)和[C++ 扩展模块与 Python 接口](10-c-kuo-zhan-mo-kuai-yu-python-jie-kou),理解跨语言集成原理。 + +4. **核心概念**:学习[工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian)和[Mixin 设计模式](9-mixin-she-ji-mo-shi),理解系统核心概念和设计思想。 + +5. **功能深入**:根据业务需求,深入学习各个功能域的文档,包括选择集与查询、地理对象编辑、数据交换、数据检查等章节。 + +6. **参考手册**:在开发过程中,随时查阅[SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api)、[ObjBaseAttr 属性索引](41-objbaseattr-shu-xing-suo-yin)和[地理对象类型定义](42-di-li-dui-xiang-lei-xing-ding-yi)等参考手册。 + +这种学习路径从基础到深入,从实践到理论,帮助开发者逐步掌握 SunvStation 系统的核心能力和架构设计。 \ No newline at end of file diff --git a/docs/content/7-swig-feng-zhuang-ji-zhi-shuo-ming.md b/docs/content/7-swig-feng-zhuang-ji-zhi-shuo-ming.md new file mode 100644 index 0000000..185c03f --- /dev/null +++ b/docs/content/7-swig-feng-zhuang-ji-zhi-shuo-ming.md @@ -0,0 +1,265 @@ +本文档详细说明 sunvpy 库中使用的 SWIG(Simplified Wrapper and Interface Generator)封装机制,阐述 Python 接口如何通过 SWIG 与 C++ 核心库进行交互。这种封装机制使开发者能够以 Pythonic 的方式调用高性能的 C++ 地理信息系统功能,同时保持接近原生 C++ 的执行效率。理解这一机制对于高级功能开发、性能优化和问题调试具有重要意义。 + +Sources: [PySSCore.py](PySSCore.py#L1-L6), [__init__.py](__init__.py#L1-L12) + +## SWIG 封装架构概览 + +sunvpy 采用双层架构设计实现 SWIG 封装:顶层是 Python 代理类,底层是 C++ 扩展动态链接库。每个功能模块都对应一个模块对,例如 PySSCore.py(Python 接口层)和 _PySSCore.pyd(C++ 实现层)。SWIG 4.4.0 版本自动生成了这些 Python 代理文件,将复杂的 C++ 对象模型映射为 Python 类和函数。Python 代码通过这些代理类调用底层 C++ 方法,代理类负责参数类型转换、异常处理和内存管理协调。这种设计既保持了 Python 的易用性,又充分利用了 C++ 的计算性能,特别适合地理信息系统中的大规模空间数据处理需求。 + +Sources: [PySSCore.py](PySSCore.py#L1-L12), [PySSDatabase.py](PySSDatabase.py#L1-L12), [PySSMath.py](PySSMath.py#L1-L12) + +### 双层架构交互流程 + +```mermaid +sequenceDiagram + participant User as 用户 Python 代码 + participant Proxy as Python 代理类
(PySS*.py) + participant Module as C++ 扩展模块
(_PySS*.pyd) + participant Core as C++ 核心库 + + User->>Proxy: geo = GeoBase() + Proxy->>Module: new_GeoBase(*args) + Module->>Core: 创建 C++ 对象 + Core-->>Module: 返回 C++ 指针 + Module-->>Proxy: 返回代理对象引用 + Proxy->>Proxy: 设置 thisown = True + Proxy-->>User: 返回 GeoBase 实例 + + User->>Proxy: geo.getId() + Proxy->>Module: GeoBase_getId(self) + Module->>Core: 调用 C++ 方法 + Core-->>Module: 返回 ID 值 + Module-->>Proxy: 返回 Python 值 + Proxy-->>User: 返回 ID +``` + +此序列图展示了从 Python 代码到 C++ 核心库的完整调用路径。代理类作为桥梁,将 Python 对象操作转换为底层 C++ 方法调用,实现了无缝的语言边界穿越。SWIG 自动生成的代理代码处理了所有底层细节,包括指针传递、类型转换和引用计数。 + +Sources: [PySSCore.py](PySSCore.py#L1936-L1938), [PySSCore.py](PySSCore.py#L2018-L2019) + +## 代理对象机制 + +每个 SWIG 封装的类都继承自特定的元类系统,确保对象行为的一致性。代理类包含几个关键组件:`this` 属性持有 C++ 对象的指针引用,`thisown` 属性控制内存所有权,`__swig_repr__` 方法提供调试信息,以及一系列特殊方法支持 Python 语义。例如 GeoBase 类在 [PySSCore.py](PySSCore.py#L1930) 中定义,其构造函数通过 `_PySSCore.GeoBase_swiginit` 初始化,该方法将新创建的 C++ 对象指针绑定到 Python 代理实例。这种设计使得 Python 代码可以像操作原生对象一样操作 C++ 对象,而无需关心底层实现细节。 + +Sources: [PySSCore.py](PySSCore.py#L1930-L1938), [PySSCore.py](PySSCore.py#L19-L24) + +### 核心代理类结构 + +```mermaid +classDiagram + class SwigPyObject { + +this: C++ 指针 + +own(): 设置所有权 + +thisown: 所有权标志 + } + + class ProxyClass { + +thisown: property + +__repr__(): 调试用 + +__swig_destroy__(): 析构函数 + +业务方法(): 转发到 C++ + } + + class _SwigNonDynamicMeta { + <> + +__setattr__: 限制动态属性 + } + + class CppObject { + +实际 C++ 实现 + +业务逻辑 + +内存管理 + } + + SwigPyObject <-- ProxyClass : 持有 + ProxyClass <|.. _SwigNonDynamicMeta : 使用 + ProxyClass --> CppObject : 代理 +``` + +此类图展示了 SWIG 代理对象的层次结构。`_SwigNonDynamicMeta` 元类通过重写 `__setattr__` 方法防止用户意外添加未在 C++ 类中定义的属性,这有助于维护类型安全和封装完整性。所有代理类都通过 `this` 属性持有 C++ 对象的指针,并通过 `thisown` 属性控制内存生命周期管理。 + +Sources: [PySSCore.py](PySSCore.py#L56-L58), [PySSCore.py](PySSCore.py#L27-L37) + +## 内存所有权管理 + +SWIG 封装中最关键的设计之一是内存所有权管理机制,通过 `thisown` 属性实现。当 `thisown` 为 True 时,Python 代理对象拥有底层 C++ 对象的所有权,会在代理对象被垃圾回收时自动调用 `__swig_destroy__` 方法释放 C++ 内存。反之,当 `thisown` 为 False 时,Python 代理只是一个视图,不负责内存释放,所有权通常归其他对象所有。这种机制在对象传递和共享引用时尤为重要,例如当 C++ 对象被多个 Python 代理引用时,只有拥有所有权的代理才会触发析构。SWIG 还提供了 `SHARED_PTR_DISOWN` 常量,用于与智能指针交互时明确放弃所有权。 + +Sources: [PySSCore.py](PySSCore.py#L121), [PySSCore.py](PySSCore.py#L123), [PySSCore.py](PySSCore.py#L31-L33) + +### 内存所有权状态表 + +| thisown 值 | 所有权归属 | 析构行为 | 典型场景 | +|------------|------------|----------|----------| +| True | Python 代理对象 | 代理销毁时调用 `delete` 方法 | 通过构造函数直接创建的对象 | +| False | C++ 端或其他对象 | 代理销毁时不释放 C++ 内存 | 从 C++ 函数返回的共享对象 | +| 0 | 明确放弃所有权 | 禁用自动析构 | 与智能指针配合使用时 | +| 1 | 明确持有所有权 | 启用自动析构 | 从 C++ 转移所有权到 Python 时 | + +Sources: [PySSCore.py](PySSCore.py#L121), [PySSCore.py](PySSCore.py#L131-L136) + +## 非动态属性限制机制 + +为维护 C++ 类的封装完整性,SWIG 使用 `_SwigNonDynamicMeta` 元类阻止动态属性添加。该元类重写了 `__setattr__` 方法,只有当属性名是 `this`、`thisown` 或已存在的类属性(包括属性装饰器)时,才允许设置。任何尝试添加新属性的操作都会抛出 `AttributeError` 异常,提示用户不能添加实例属性。这种设计避免了用户意外破坏类型系统,同时保持了与 C++ 类定义的一致性。对于需要额外数据存储的场景,应该使用类中已有的属性管理机制,或者通过继承和组合模式扩展功能。 + +Sources: [PySSCore.py](PySSCore.py#L56-L58), [PySSCore.py](PySSCore.py#L40-L46) + +## 迭代器支持与集合类型 + +SWIG 为标准容器类型(如 `std::vector`、`std::list`)提供了 Python 迭代器接口,使 C++ 容器对象可以直接用于 `for` 循环。以 `StringArray` 为例,SWIG 生成的代理类实现了 `__iter__`、`__next__`、`__len__`、`__getitem__` 等魔术方法,使其行为完全符合 Python 序列协议。这些方法实际上调用底层的 `SwigPyIterator` 类,该抽象类封装了 C++ 迭代器的功能。通过这种机制,Python 开发者可以使用自然的迭代语法遍历 C++ 集合,而不需要关心底层实现细节。`SwigPyIterator` 还支持距离计算、前后移动、复制操作等高级功能,为复杂数据结构的操作提供了完整支持。 + +Sources: [PySSCore.py](PySSCore.py#L61-L120), [PySSCore.py](PySSCore.py#L122-L200) + +## 类型转换系统 + +SWIG 提供了强大的类型转换系统,处理 Python 和 C++ 之间的类型映射。对于内置类型,SWIG 自动处理整数、浮点数、字符串等基本类型的转换。对于复杂类型,SWIG 使用代理类和指针映射。特别重要的是类型转换函数,如 `castToMarkNote`、`castToPointObject`、`castToLineObject`、`castToAreaObject`、`castToGeoBase` 等,这些函数允许在运行时将 `GeoBase` 基类引用安全地转换为具体的派生类类型。这种设计模仿了 C++ 中的 `dynamic_cast`,在保持类型安全的同时提供了多态操作的灵活性。类型转换函数在处理地理对象层次结构时尤其重要,因为不同的几何对象类型需要调用特定的方法。 + +Sources: [PySSCore.py](PySSCore.py#L3092-L3111) + +### 类型转换关系图 + +```mermaid +graph TB + GeoBase[GeoBase 基类] + Point[PointObject 点对象] + Line[LineObject 线对象] + Area[AreaObject 面对象] + Note[MarkNote 注记对象] + List[GeoBaseList 对象列表] + + GeoBase -->|castToPointObject| Point + GeoBase -->|castToLineObject| Line + GeoBase -->|castToAreaObject| Area + GeoBase -->|castToMarkNote| Note + List -->|castToMarkNoteList| NoteList + List -->|castToGeoBaseList| BaseList + + style GeoBase fill:#f9f,stroke:#333,stroke-width:2px + style Point fill:#bbf,stroke:#333,stroke-width:1px + style Line fill:#bfb,stroke:#333,stroke-width:1px + style Area fill:#fbb,stroke:#333,stroke-width:1px +``` + +此关系图展示了 `GeoBase` 类层次结构中的类型转换路径。SWIG 生成的类型转换函数确保了在运行时安全地将基类引用转换为派生类,这是实现多态操作的关键机制。这些函数在底层会验证对象类型,转换失败时返回 None 或抛出异常。 + +Sources: [PySSCore.py](PySSCore.py#L3092-L3111) + +## 模块组织结构 + +sunvpy 库将功能划分为多个独立的 SWIG 模块,每个模块负责特定领域的功能。从文件大小可以看出模块的复杂度分布:`_PySSCore.pyd`(2.79 MB)包含核心类如 `GeoBase`、`Attribute`、`GraphicInfo`;`_PySSMath.pyd`(2.53 MB)提供数学计算功能;`_PySSMap.pyd`(1.22 MB)处理地图相关操作;`_PySSDataSource.pyd`(1.64 MB)管理数据源;其他模块如 `_PySSDatabase.pyd`(488 KB)、`_PySSView.pyd`(450 KB)、`_PySSWidget.pyd`(423 KB)分别处理数据库、视图和界面组件。这种模块化设计不仅提高了代码的可维护性,还允许用户按需导入模块,减少内存占用。高层封装类如 `SSProcessManager` 在 [PySSProcess.py](PySSProcess.py#L25) 中通过 Mixin 模式组合多个模块的功能,为用户提供统一的操作接口。 + +Sources: [PySSProcess.py](PySSProcess.py#L2-L6), [PySSProcess.py](PySSProcess.py#L25-L30) + +### 模块功能对照表 + +| 模块名称 | Python 接口 | C++ 扩展 | 文件大小 | 主要功能 | +|----------|-------------|-----------|----------|----------| +| 核心模块 | PySSCore.py | _PySSCore.pyd | 2.79 MB | GeoBase、Attribute、GraphicInfo 等基础类 | +| 数学模块 | PySSMath.py | _PySSMath.pyd | 2.53 MB | 坐标转换、几何计算、数学运算 | +| 数据源模块 | PySSDataSource.py | _PySSDataSource.pyd | 1.64 MB | 数据集管理、数据源连接 | +| 地图模块 | PySSMap.py | _PySSMap.pyd | 1.22 MB | ScaleMap、WorkSpace 等地图类 | +| 数据库模块 | PySSDatabase.py | _PySSDatabase.pyd | 488 KB | 数据库操作、GIS 数据更新 | +| 视图模块 | PySSView.py | _PySSView.pyd | 450 KB | 视图控制、显示管理 | +| 界面模块 | PySSWidget.py | _PySSWidget.pyd | 423 KB | 进度条、全局选项、对话框 | + +Sources: [PySSCore.py](PySSCore.py#L1-L12), [PySSProcess.py](PySSProcess.py#L2-L6) + +## 与 Python 生态的集成 + +SWIG 封装不仅提供了基本的 C++ 对象访问,还集成了 Python 生态系统的高级特性。通过 `__repr__` 方法的自定义实现,代理对象提供有意义的字符串表示,便于调试和日志记录。代理类支持 Python 的上下文管理协议(虽然当前生成的代码中没有显式展示),使对象可以用于 `with` 语句进行资源管理。SWIG 还自动处理异常转换,将 C++ 异常映射为 Python 异常,保持一致的错误处理模型。对于异步编程,虽然当前实现是同步的,但 SWIG 生成的代码结构为未来支持协程提供了可能。这种深度集成使得 sunvpy 能够无缝融入 Python 的数据分析、科学计算和工作流自动化生态系统。 + +Sources: [PySSCore.py](PySSCore.py#L19-L24), [PySSProcess.py](PySSProcess.py#L93-L139) + +## 封装机制与 Mixin 设计的协同 + +sunvpy 在 SWIG 封装的基础上,进一步使用了 Python Mixin 设计模式来构建高层抽象。`SSProcessManager` 类通过多重继承组合了五个 Mixin:`SelectionMixin`、`GeoEditMixin`、`ProjectMixin`、`LogMixin` 和 `ProgressMixin`。这些 Mixin 类直接操作 SWIG 封装的 C++ 对象,如 `WorkSpace`、`ScaleMap`、`GeoBaseList` 等,提供了更加 Pythonic 和易于使用的高级接口。这种分层设计清晰地分离了关注点:SWIG 封装层负责语言边界和类型安全,Mixin 层负责业务逻辑和用户体验,而 C++ 核心层负责性能和算法实现。开发者可以在不修改 SWIG 生成的代码的情况下,通过扩展 Mixin 类添加新功能,这大大提高了系统的可扩展性。 + +Sources: [PySSProcess.py](PySSProcess.py#L18-L25), [PySSProcess.py](PySSProcess.py#L53-L86) + +### 架构层次关系图 + +```mermaid +graph TB + subgraph "Python 应用层" + User[用户脚本] + Process[SSProcessManager] + end + + subgraph "Python Mixin 层" + Select[SelectionMixin] + Edit[GeoEditMixin] + Proj[ProjectMixin] + Log[LogMixin] + Progress[ProgressMixin] + end + + subgraph "SWIG 代理层" + CoreProxy[PySSCore.py] + MapProxy[PySSMap.py] + DataProxy[PySSDataSource.py] + WidgetProxy[PySSWidget.py] + end + + subgraph "C++ 实现层" + CoreDll[_PySSCore.pyd] + MapDll[_PySSMap.pyd] + DataDll[_PySSDataSource.pyd] + WidgetDll[_PySSWidget.pyd] + end + + subgraph "C++ 核心层" + CoreLib[SunvStation Core Library] + end + + User --> Process + Process --> Select + Process --> Edit + Process --> Proj + Process --> Log + Process --> Progress + + Select --> CoreProxy + Edit --> CoreProxy + Proj --> MapProxy + Log --> WidgetProxy + Progress --> WidgetProxy + + CoreProxy --> CoreDll + MapProxy --> MapDll + DataProxy --> DataDll + WidgetProxy --> WidgetDll + + CoreDll --> CoreLib + MapDll --> CoreLib + DataDll --> CoreLib + WidgetDll --> CoreLib + + style Process fill:#bbf,stroke:#333,stroke-width:2px + style CoreProxy fill:#bfb,stroke:#333,stroke-width:2px + style CoreDll fill:#fbb,stroke:#333,stroke-width:2px + style CoreLib fill:#fb9,stroke:#333,stroke-width:2px +``` + +此架构图展示了从用户代码到 C++ 核心库的完整调用层次。SWIG 封装层作为中间桥梁,连接了 Python Mixin 层和 C++ 实现层,实现了语言边界的透明穿越。这种分层设计使得每一层都可以独立演进,同时保持整体架构的稳定性和可维护性。 + +Sources: [PySSProcess.py](PySSProcess.py#L25-L86), [PySSCore.py](PySSCore.py#L1930-L2000) + +## 性能考虑与优化建议 + +SWIG 封装虽然提供了便利,但跨语言调用会引入一定的性能开销。在性能关键的场景下,开发者应该注意以下几点:首先,尽量减少跨语言调用的次数,将多个操作合并为单个 C++ 方法调用;其次,对于大规模数据处理,考虑使用 SWIG 封装的集合操作而不是在 Python 中循环;再次,合理使用内存所有权管理,避免不必要的对象复制;最后,对于计算密集型任务,直接调用 C++ 核心库的数学和几何算法模块,如 `_PySSMath.pyd` 中提供的高性能计算函数。理解 SWIG 封装的内部机制可以帮助开发者做出更明智的性能优化决策。 + +Sources: [PySSMath.py](PySSMath.py#L1-L12), [PySSCore.py](PySSCore.py#L1276-L1300) + +## 调试与问题排查 + +在开发过程中遇到 SWIG 封装相关问题时,有几个关键的调试工具和技巧可以使用。首先,使用 `_swig_repr__` 方法可以查看代理对象的基本信息,包括 C++ 指针地址;其次,检查 `thisown` 属性可以确认内存所有权状态,避免内存泄漏或双重释放;再次,类型转换函数的返回值可以验证对象类型转换是否成功;最后,查看 SWIG 生成的 Python 代码(虽然不应修改)可以理解具体的调用路径。对于更复杂的问题,可能需要查看 C++ 端的日志或使用调试器跟踪跨语言调用。理解 SWIG 的封装机制是高效排查问题的关键。 + +Sources: [PySSCore.py](PySSCore.py#L19-L24), [PySSCore.py](PySSCore.py#L123), [PySSCore.py](PySSCore.py#L3092-L3111) + +## 下一步学习 + +理解 SWIG 封装机制后,建议继续学习以下相关主题以构建完整的知识体系: + +- **核心概念**:深入了解 [SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou),理解整个系统的分层设计和模块依赖关系。 +- **架构模式**:学习 [Mixin 设计模式](9-mixin-she-ji-mo-shi),掌握如何通过组合多个功能模块构建灵活的高级接口。 +- **C++ 扩展**:阅读 [C++ 扩展模块与 Python 接口](10-c-kuo-zhan-mo-kuai-yu-python-jie-kou),了解 SWIG 接口文件的编写和扩展方法。 +- **实践应用**:通过 [获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi) 和 [修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi) 等实战文档,学习如何在具体场景中使用这些封装类。 \ No newline at end of file diff --git a/docs/content/8-gong-zuo-kong-jian-yu-di-tu-gai-nian.md b/docs/content/8-gong-zuo-kong-jian-yu-di-tu-gai-nian.md new file mode 100644 index 0000000..33d3217 --- /dev/null +++ b/docs/content/8-gong-zuo-kong-jian-yu-di-tu-gai-nian.md @@ -0,0 +1,319 @@ +SunvStation 地理信息系统采用分层架构设计,其中工作空间与地图是理解整个系统的核心概念。本页将详细阐述这两个核心组件的职责、相互关系以及在 Python 脚本中的使用方式。掌握这些概念是高效使用 sunvpy 库进行二次开发的基础。 + +## 系统架构概览 + +SunvStation 系统采用单例模式的工作空间作为顶级容器,管理所有地图实例和系统资源。工作空间通过 `getInstance()` 方法获取全局唯一实例,确保整个应用程序共享同一资源上下文。地图对象则表示特定比例尺的地理数据视图,包含图层、地物、数据源等子组件。 + +```mermaid +graph TB + subgraph "应用程序级别" + WS[WorkSpace 工作空间
单例实例] + end + + subgraph "地图级别" + SM1[ScaleMap 地图1
比例尺1:500] + SM2[ScaleMap 地图2
比例尺1:1000] + end + + subgraph "SM1 组件" + L1[图层1] + L2[图层2] + DS1[数据源EPS] + end + + subgraph "SM2 组件" + L3[图层3] + L4[图层4] + DS2[数据源EPS] + end + + subgraph "Python 脚本" + PSS[SSProcessManager
SSProcess全局实例] + end + + PSS --> |WorkSpace.getInstance| WS + PSS --> |getCurrentScaleMap| SM1 + WS --> |管理多个| SM1 + WS --> |管理多个| SM2 + SM1 --> |包含| L1 + SM1 --> |包含| L2 + SM1 --> |引用| DS1 + SM2 --> |包含| L3 + SM2 --> |包含| L4 + SM2 --> |引用| DS2 +``` + +上图展示了系统的核心架构。工作空间作为顶级容器,管理所有地图实例。每个地图对象包含一组图层和关联的数据源。Python 脚本通过 `SSProcess` 全局实例访问工作空间和当前地图,实现与系统资源的交互。 + +Sources: [PySSProcess.py](PySSProcess.py#L30-L60) + +## 工作空间 + +工作空间是 SunvStation 系统的全局单例对象,负责管理整个应用程序的资源和上下文。它提供统一的入口点来访问当前活动的地图、配置信息和系统路径。 + +### 核心特性 + +工作空间采用单例设计模式,确保整个应用程序中只有一个工作空间实例。这种设计有以下优势: + +- **资源统一管理**:所有地图实例和共享资源由工作空间统一分配和协调 +- **全局状态一致性**:确保不同模块访问的系统状态保持一致 +- **生命周期控制**:工作空间控制整个应用程序的生命周期,包括资源的创建和销毁 + +### 获取工作空间实例 + +在 Python 脚本中,通过 `WorkSpace.getInstance()` 方法获取工作空间实例。`SSProcessManager` 在初始化时会自动获取工作空间实例并存储为成员变量 `self.workspace`。 + +Sources: [PySSProcess.py](PySSProcess.py#L42-L43) + +### 主要职责 + +工作空间的核心职责包括: + +- **地图管理**:维护所有打开的地图实例,提供获取当前活动地图的接口 +- **资源协调**:协调地图之间的资源共享和互斥访问 +- **全局配置**:存储和管理全局配置信息 +- **系统路径**:提供系统级路径信息(配置路径、模板路径、脚本路径等) + +### 便捷访问方法 + +`ProjectMixin` 提供了便捷方法 `getWorkspace()` 来获取工作空间实例: + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L36-L43) + +## 地图 + +地图对象(`ScaleMap`)表示特定比例尺的地理数据视图,是工作空间中最核心的可视化和编辑单元。每个地图包含一组图层、地物对象和关联的数据源。 + +### 地图对象定义 + +`ScaleMap` 类定义在 `PySSMap` 模块中,通过 SWIG 从 C++ 封装而来。它是地图数据的主要容器和管理者。 + +Sources: [PySSMap.py](PySSMap.py#L303-L330) + +### 地图组成结构 + +地图由以下核心组件构成: + +| 组件类型 | 职责 | Python 类型 | +|---------|------|-----------| +| 图层 | 组织和管理地物对象,控制可见性和锁定状态 | Layer | +| 数据源 | 存储地物数据的底层存储(EPS 数据库) | DataSource | +| 地物对象 | 点、线、面等地理要素 | GeoObject | +| 选择集 | 当前选中的地物集合 | GeoBaseList | +| 符号表 | 要素编码和符号样式定义 | FeatureList | + +### 图层管理 + +图层是地图中组织地物的逻辑单元。每个图层对应特定的数据类型(点、线、面、注记),可以独立控制其可见性和编辑锁定状态。 + +#### 图层操作 API + +| 方法 | 功能描述 | +|-----|---------| +| `getLayerSize()` | 获取图层数量 | +| `getLayerName(index)` | 获取指定索引的图层名称 | +| `setLayerVisible(layerName, status)` | 设置图层可见性 | +| `isLayerVisible(layerName)` | 检查图层是否可见 | +| `setLayerLock(layerName, status)` | 设置图层锁定状态 | +| `isLayerLock(layerName)` | 检查图层是否锁定 | + +Sources: [PySSMap.py](PySSMap.py#L355-L430) + +#### 便捷访问方法 + +`ProjectMixin` 提供了简化的图层访问接口: + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L180-L198) + +### 数据源管理 + +数据源是存储地物数据的底层存储,通常是 EPS 格式的数据库。地图可以加载多个数据源,每个数据源包含多个数据集。 + +| 方法 | 功能描述 | +|-----|---------| +| `getCurrentDataSource()` | 获取当前激活的数据源 | +| `setCurrentDataSource(dataSource)` | 设置当前数据源 | +| `unloadDataSource(dataSource)` | 卸载指定的数据源 | +| `getDataSourceSet(dataSourceSet)` | 获取所有可见图层使用的数据源集合 | + +Sources: [PySSMap.py](PySSMap.py#L445-L480) + +### 地物搜索与检索 + +地图提供了强大的地物搜索功能,支持多种搜索条件: + +| 方法 | 功能描述 | +|-----|---------| +| `searchObject(objList, ...)` | 根据编码、矩形范围、点位置等条件搜索地物 | +| `searchMarkNote(geoList, ...)` | 搜索注记对象 | +| `getNearObject(point, range, ...)` | 获取指定点附近的地物或注记 | +| `getObjectSize(objType)` | 获取指定类型的地物个数 | + +Sources: [PySSMap.py](PySSMap.py#L650-L1000) + +### 撤销与重做 + +地图内置了完整的撤销/重做机制,所有可撤销操作都会被记录在命令栈中。 + +| 方法 | 功能描述 | +|-----|---------| +| `pushUndoMark(action)` | 创建撤销标记,用于分组多个操作 | +| `undo(step=1)` | 执行撤销操作,step 指定步数 | +| `redo(step=1)` | 执行重做操作 | +| `getUndoStackSize()` | 获取撤销栈的大小 | +| `getRedoStackSize()` | 获取重做栈的大小 | + +Sources: [PySSMap.py](PySSMap.py#L1565-L1610) + +## 工作空间与地图的关系 + +工作空间和地图之间的关系是整体与部分的关系。工作空间作为全局容器,可以管理多个地图实例,但通常只有一个当前活动的地图。 + +### 访问当前地图 + +通过工作空间的 `getCurrentScaleMap()` 方法获取当前活动的地图实例。在 `SSProcessManager` 初始化时,会自动获取当前地图并存储为成员变量 `self.map`。 + +Sources: [PySSProcess.py](PySSProcess.py#L42-L43) + +### 地图切换 + +当用户切换地图时(例如从不同比例尺的地图视图切换),工作空间会更新当前活动的地图引用。Python 脚本可以通过以下方式获取最新的当前地图: + +```python +# 方法1:直接使用 SSProcess 的 map 成员 +current_map = SSProcess.map + +# 方法2:通过工作空间获取 +current_map = SSProcess.workspace.getCurrentScaleMap() + +# 方法3:使用便捷方法 +current_map = SSProcess.getCurrentMap() +``` + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L45-L50) + +## 系统路径管理 + +工作空间和相关组件提供了获取系统路径的接口,这些路径对于脚本操作文件和配置非常重要。 + +### 路径类型表 + +| 模式 | 路径类型 | 说明 | +|-----|---------|------| +| 0 | 配置路径 | 存放系统配置文件 | +| 1 | 模板路径 | 存放模板文件 | +| 2 | Comm 路径 | 公共资源路径 | +| 3 | Script 路径 | 脚本文件路径 | +| 4 | SSTemp 路径 | 临时文件路径 | +| 5 | 工程文件路径 | 当前工程所在目录 | +| 6 | 系统目录 | Windows 系统目录或 Unix /usr | +| 7/8 | 工作台面目录 | 用户工作台面目录 | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L52-L80) + +### 使用示例 + +```python +# 获取脚本路径 +script_path = SSProcess.getSysPathName(3) + +# 获取当前工程文件所在目录 +project_dir = SSProcess.getSysPathName(5) + +# 获取配置路径 +config_path = SSProcess.getSysPathName(0) +``` + +## 符号表管理 + +地图使用符号表来定义地物的显示样式和要素编码。符号表包括要素代码表、符号脚本表和注记模板表。 + +| 方法 | 功能描述 | +|-----|---------| +| `getFeatureCodeTB()` | 获取当前要素代码表名称 | +| `getSymbolScriptTB()` | 获取当前符号表名称 | +| `getNoteTemplateTB()` | 获取当前注记模板表名称 | +| `setFeatureCodeTB(codeTB, symbolTB)` | 设置要素代码表和符号表 | +| `setNoteTemplateTB(templateTB)` | 设置注记模板表 | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L200-L267) + +## 地图图幅管理 + +地图图幅是地图的一个逻辑划分单位,用于组织和管理地图的分幅显示。`ProjectMixin` 提供了图幅相关操作: + +| 方法 | 功能描述 | +|-----|---------| +| `createMapFrame()` | 创建当前地图的图幅列表 | +| `getMapFrameCount()` | 获取图幅数量 | +| `getMapFrameCenterPoint(index)` | 获取指定图幅的中心点坐标 | +| `setCurMapFrame(x, y)` | 设置当前图幅 | +| `getCurMapFrame()` | 获取当前图幅的编号 | +| `getMapFrameNumber(x, y)` | 获取指定坐标所在的图幅号 | +| `freeMapFrame()` | 释放图幅资源 | + +Sources: [ssprocess_mixins/project_mixin.py](ssprocess_mixins/project_mixin.py#L122-L178) + +## 最佳实践 + +在使用工作空间和地图时,遵循以下最佳实践可以编写更健壮和高效的代码: + +### 1. 始终检查空引用 + +访问地图或工作空间对象前,检查是否为 None: + +```python +current_map = SSProcess.getCurrentMap() +if current_map is None: + print("当前没有打开的地图") + return +``` + +### 2. 使用便捷方法优先 + +`ProjectMixin` 提供的便捷方法已经处理了常见的边界情况,优先使用这些方法而不是直接访问底层对象。 + +### 3. 批量操作使用撤销标记 + +执行批量修改操作前,先创建撤销标记: + +```python +SSProcess.pushUndoMark("批量属性修改") +# 执行批量操作... +``` + +### 4. 及时释放资源 + +对于创建的临时资源(如图幅列表),使用完毕后及时释放: + +```python +try: + SSProcess.createMapFrame() + # 处理图幅... +finally: + SSProcess.freeMapFrame() +``` + +### 5. 尊重图层锁定状态 + +修改地物前检查图层是否锁定: + +```python +layer_name = "DLG" +if not SSProcess.map.isLayerLock(layer_name): + # 执行修改操作 + pass +else: + print(f"图层 {layer_name} 已锁定,无法编辑") +``` + +## 与其他文档的关联 + +理解工作空间与地图概念后,可以继续深入学习以下主题: + +- **选择集与查询**:[清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji) 了解如何在地图中查询和选择地物 +- **地理对象编辑**:[创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) 学习如何在工作空间和地图中创建地物 +- **项目与工作流**:[获取工作空间信息](34-huo-qu-gong-zuo-kong-jian-xin-xi) 探索更多工作空间信息获取方法 +- **Mixin 设计模式**:[Mixin 设计模式](9-mixin-she-ji-mo-shi) 理解 ProjectMixin 等模块的设计理念 + +通过掌握工作空间与地图的核心概念,您将能够更高效地使用 sunvpy 库进行二次开发,构建功能强大的地理信息处理脚本。 \ No newline at end of file diff --git a/docs/content/9-mixin-she-ji-mo-shi.md b/docs/content/9-mixin-she-ji-mo-shi.md new file mode 100644 index 0000000..cbc6a38 --- /dev/null +++ b/docs/content/9-mixin-she-ji-mo-shi.md @@ -0,0 +1,276 @@ +Mixin 设计模式是一种通过**多重继承**实现代码复用的技术,它将不同功能模块拆分为独立的可复用单元,并在运行时动态组合成完整的类实例。在 SunvStation 地理信息系统开发中,Mixin 模式被用于构建 SSProcessManager 核心类,将选择集管理、地理对象编辑、进度显示、日志记录和项目操作等功能模块化,实现了高度解耦和灵活复用的架构设计。该模式的核心优势在于:通过组合而非继承来扩展功能,避免了复杂的类层次结构,同时保持了代码的清晰性和可维护性。 + +## Mixin 架构概览 + +SunvStation 的 Mixin 架构采用**抽象基类(ABC)定义接口 + Mixin 类实现功能**的双重设计模式。每个功能领域都有对应的 `*Aware` 抽象基类定义契约,以及 `*Mixin` 实现类提供具体实现。SSProcessManager 作为最终的组合类,通过多重继承将所有 Mixin 组合成一个功能完整的管理器实例。 + +```mermaid +classDiagram + class SSProcessManager { + +WorkSpace workspace + +ScaleMap map + +GlobalOptions global_options + +ObjBaseAttr objBaseAttr + +GeoBaseList selGeoList + +GeoBaseList selNoteList + +SSearchHelper searchHelper + +GeoBase curSelGeo + +StringArray curSelGeoFields + +StringArray curSelGeoValues + +GeoBaseList bufferObjList + +list newBufferObjList + +tuple curNewObj + +bool enable_progress + +Progress progress + +Logger logger + } + + class LogAware { + <> + +set_logger(Logger) abstract + +log_error_msg(str) abstract + } + + class LogMixin { + +Logger logger + +set_logger(Logger) + +log_error_msg(str) + } + + class ProgressAware { + <> + +disable_progress() abstract + +startProgress(str, int) abstract + +stepProgress(str) abstract + +closeProgress() abstract + } + + class ProgressMixin { + +bool enable_progress + +Progress progress + +disable_progress() + +startProgress(str, int) + +stepProgress(str) + +closeProgress() + } + + class GeoEditAware { + <> + +createDefaultGeoBase(int, Dataset) abstract + +getPolar(Point3D, Point3D) abstract + +createNewObjByCode(int) abstract + +addNewObjPoint(float, float, float, int, str) abstract + +saveBufferObjToDatabase() abstract + +updateRequest() abstract + } + + class GeoEditMixin { + +createDefaultGeoBase(int, Dataset) + +getPolar(Point3D, Point3D) + +createNewObjByCode(int) + +addNewObjPoint(float, float, float, int, str) + +saveBufferObjToDatabase() + +updateRequest() + } + + class ProjectMixin { + +getWorkspace() + +getCurrentMap() + +pushUndoMark(str) + +getSysPathName(int) + +createMapFrame() + +getLayerCount() + +setLayerStatus(str, bool, int) + } + + class SelectionMixin { + +clearSelection() + +clearSelectCondition() + +setSelectCondition(str, str, str) + +selectFilter() + +updateSysSelection(int) + +getSysSelGeoList() + +getSysSelNoteList() + } + + SSProcessManager --> LogMixin + SSProcessManager --> ProgressMixin + SSProcessManager --> GeoEditMixin + SSProcessManager --> ProjectMixin + SSProcessManager --> SelectionMixin + + LogMixin ..|> LogAware + ProgressMixin ..|> ProgressAware + GeoEditMixin ..|> GeoEditAware + SelectionMixin ..|> GeoEditAware + SelectionMixin ..|> LogAware + SelectionMixin ..|> ProgressAware +``` + +这种架构设计的优势体现在三个方面:**接口隔离**确保每个 Mixin 只依赖必要的能力,**组合灵活性**允许按需选择功能模块,**类型安全**通过抽象基类强制实现契约。 + +Sources: [PySSProcess.py](PySSProcess.py#L18-L25), [log_mixin.py](ssprocess_mixins/log_mixin.py#L19-L22), [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L19-L26) + +## Mixin 组合关系 + +SSProcessManager 通过多重继承组合五个 Mixin 类,继承顺序为 `SelectionMixin → GeoEditMixin → ProjectMixin → LogMixin → ProgressMixin`。这种顺序安排不是随意的,而是基于功能依赖关系精心设计的。SelectionMixin 依赖 GeoEditAware、LogAware 和 ProgressAware 接口,因此它继承了这些抽象基类但不提供实现;GeoEditMixin 依赖 LogAware 接口来记录错误;ProjectMixin 相对独立,主要提供工作空间和地图操作。最终的 SSProcessManager 通过继承所有 Mixin 实现类,获得完整的功能集合。 + +```mermaid +graph TB + subgraph 接口层 + LA[LogAware] + PA[ProgressAware] + GA[GeoEditAware] + end + + subgraph 实现层 + LM[LogMixin] + PM[ProgressMixin] + GM[GeoEditMixin] + PJM[ProjectMixin] + SM[SelectionMixin] + end + + subgraph 组合层 + SSM[SSProcessManager] + end + + LM -.实现.-> LA + PM -.实现.-> PA + GM -.实现.-> GA + SM -.依赖.-> GA + SM -.依赖.-> LA + SM -.依赖.-> PA + + SSM -.-> SM + SSM -.-> GM + SSM -.-> PJM + SSM -.-> LM + SSM -.-> PM + + style SSM fill:#e1f5ff + style SM fill:#fff4e1 + style GM fill:#fff4e1 + style PJM fill:#fff4e1 + style LM fill:#fff4e1 + style PM fill:#fff4e1 +``` + +这个组合结构体现了**功能分层**的设计思想:接口层定义契约,实现层提供具体功能,组合层将功能模块统一为可用的类实例。每个 Mixin 都是**独立可测试**的单元,可以单独开发和维护,而不需要关心其他 Mixin 的实现细节。 + +Sources: [PySSProcess.py](PySSProcess.py#L34), [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L22-L25), [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L40-L65) + +## 功能模块详解 + +### 日志记录模块(LogMixin) + +LogMixin 是最基础的功能模块,提供统一的日志记录接口。它实现 LogAware 抽象基类定义的两个方法:`set_logger()` 用于注入日志记录器实例,`log_error_msg()` 用于记录错误消息。该模块的设计遵循**依赖注入**原则,允许调用方提供自定义的 Logger 实现而非硬编码特定的日志框架。在 SSProcessManager 的 __init__ 方法中,logger 成员被初始化为 None,只有在调用者显式调用 `set_logger()` 后才激活日志功能。这种**延迟初始化**策略确保了 Mixin 的可选性和灵活性,不会因为某个功能未配置而阻止其他功能的使用。 + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L26-L42), [PySSProcess.py](PySSProcess.py#L79) + +### 进度显示模块(ProgressMixin) + +ProgressMixin 管理进度条的显示和更新,提供了完整的进度反馈机制。该模块通过 `enable_progress` 布尔标志控制是否显示进度条,允许在批处理或非交互场景中禁用进度显示以提高性能。核心方法包括 `startProgress()` 初始化进度条、`stepProgress()` 更新进度、`closeProgress()` 关闭进度条,以及 `disable_progress()` 一次性禁用进度功能。ProgressMixin 内部使用来自 PySSWidget 模块的 Progress 类和辅助函数实现跨平台的进度显示,同时封装了异常处理逻辑,即使进度显示失败也不会影响主流程的正常执行。 + +Sources: [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L39-L80), [PySSProcess.py](PySSProcess.py#L78-L79) + +### 地理编辑模块(GeoEditMixin) + +GeoEditMixin 是最复杂的功能模块,提供了地理对象的创建、修改和保存等核心操作。该模块包含三十多个方法,涵盖了几何对象的完整生命周期管理。关键功能包括:`createDefaultGeoBase()` 根据类型创建点线面注记对象,`getPolar()` 和 `getPoint()` 进行坐标计算,`createNewObjByCode()` 和 `createNewObjByClass()` 通过编码或分类创建新对象,`addNewObjPoint()` 添加坐标点,`saveBufferObjToDatabase()` 将缓存对象批量保存到数据库。GeoEditMixin 还实现了复杂的对象打散功能(explodeNoteObject 和 explodeGeoObject),支持将组合对象分解为独立子对象,并在打散过程中保留或重置属性。 + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L67-L200), [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L760-L860) + +### 项目管理模块(ProjectMixin) + +ProjectMixin 提供工作空间和地图相关的高级操作,不依赖其他 Mixin 接口。主要功能包括:`getWorkspace()` 和 `getCurrentMap()` 获取当前工作空间和地图实例,`pushUndoMark()` 创建撤销标记以支持操作回滚,`getSysPathName()` 根据模式参数返回不同系统路径(配置、模板、脚本、临时文件等),`createMapFrame()` 和相关方法管理地图图框,`getLayerCount()`、`getLayerName()` 和 `setLayerStatus()` 进行图层操作。该模块还包含了 `_is_have_data()` 私有方法,用于检测指定多边形区域是否包含地理数据,这是一个辅助地理编辑的复杂空间查询功能。 + +Sources: [project_mixin.py](ssprocess_mixins/project_mixin.py#L28-L155), [project_mixin.py](ssprocess_mixins/project_mixin.py#L157-L267) + +### 选择集管理模块(SelectionMixin) + +SelectionMixin 负责选择集的管理和查询操作,它继承自 GeoEditAware、LogAware 和 ProgressAware,体现了 Mixin 之间的依赖关系。核心功能包括:`clearSelection()` 清除脚本选择集,`clearSelectCondition()` 清除选择条件,`setSelectCondition()` 设置复杂的选择条件(支持基本属性、几何特性和扩展属性),`selectFilter()` 执行过滤查询并更新选择集,`updateSysSelection()` 在脚本选择集和系统选择集之间同步数据。该模块通过集成 LogMixin 和 ProgressMixin,在选择过滤过程中自动记录错误和显示进度,展示了 Mixin 组合带来的**功能增强**效果。 + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L22-L150) + +## 共享状态管理 + +所有 Mixin 类共享一组核心实例变量,通过类型注解声明以确保类型安全和代码可读性。这些共享状态包括:工作空间实例(workspace)、地图实例(map)、全局选项(global_options)、基础属性管理器(objBaseAttr)、脚本选择集列表(selGeoList、selNoteList)、搜索助手(searchHelper)、缓存对象列表(bufferObjList、bufferNoteList、newBufferObjList、newBufferNoteList)、当前操作对象(curSelGeo、curNewObj)、删除缓冲区(delBufferGeoList)、进度控制标志(enable_progress)以及进度条和日志实例(progress、logger)。这种**共享状态设计**避免了参数在方法间传递的复杂性,但也要求 Mixin 之间有良好的协作约定,确保状态访问的线程安全和一致性。 + +Sources: [PySSProcess.py](PySSProcess.py#L36-L48), [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L26-L40), [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L67-L80) + +## Mixin 模式对比 + +Mixin 设计模式与传统的设计模式在应用场景和实现方式上存在显著差异。下表对比了 Mixin 模式与几种常见模式在 SunvStation 架构中的应用特点: + +| 模式类型 | 核心机制 | 代码复用方式 | 继承层次 | 适用场景 | SunvStation 应用 | +|---------|---------|------------|---------|---------|----------------| +| Mixin 模式 | 多重继承 | 水平组合 | 扁平化 | 功能模块化、可选特性 | 选择集、日志、进度、编辑、项目管理 | +| 策略模式 | 组合+接口 | 算法替换 | 无继承 | 运行时行为变化 | 进度条实现策略(启用/禁用) | +| 装饰器模式 | 包装+递归 | 动态增强 | 多层包装 | 功能动态叠加 | 暂未应用 | +| 模板方法 | 继承+钩子 | 流程定制 | 单继承 | 算法骨架定义 | 对象打散流程(explodeObj 模板) | + +Mixin 模式的独特优势在于它同时提供了**编译时类型安全**和**运行时组合灵活性**。与装饰器模式相比,Mixin 在组合时就确定了方法解析顺序(MRO),性能更好且更易于调试;与策略模式相比,Mixin 可以访问共享状态,更适合功能深度集成的场景。SunvStation 选择 Mixin 模式的主要原因包括:地理信息系统功能模块天然适合水平分类,SSProcessManager 需要同时支持多种操作且这些操作之间存在依赖关系,以及团队开发者熟悉 Python 的多重继承机制。 + +Sources: [geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L745-L770), [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L39-L55) + +## 设计模式应用实例 + +选择集过滤流程是 Mixin 组合协同工作的典型实例。当用户调用 `selectFilter()` 执行选择集过滤时,多个 Mixin 的功能被无缝集成: + +1. ProgressMixin 的 `startProgress()` 初始化进度条显示 +2. ProgressMixin 的 `stepProgress()` 显示"清理缓存"状态 +3. SelectionMixin 清空 `curSelGeoFields` 和 `curSelGeoValues` 缓存 +4. ProgressMixin 的 `stepProgress()` 显示"执行选择过滤"状态 +5. SelectionMixin 使用 `searchHelper` 根据条件过滤对象 +6. SelectionMixin 将过滤结果分类到 `selGeoList` 和 `selNoteList` +7. ProgressMixin 的 `stepProgress()` 显示"更新选择集"状态 +8. ProgressMixin 的 `closeProgress()` 关闭进度条 +9. 如果过滤过程中发生错误,LogMixin 的 `log_error_msg()` 记录异常 + +整个流程中,SelectionMixin 提供核心业务逻辑,ProgressMixin 提供用户反馈,LogMixin 提供错误处理,三个 Mixin 通过共享状态协同工作,无需显式传递参数或调用链。这种**协作式设计**使得复杂的业务流程被分解为清晰的关注点,每个 Mixin 只负责自己的职责,代码易于理解和维护。 + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L96-L125) + +## 扩展与定制 + +Mixin 模式的另一个重要优势在于支持**功能扩展和定制**。开发者可以通过以下方式扩展 SSProcessManager 的功能: + +1. **新增 Mixin 类**:创建新的 `*Mixin` 类实现特定功能,如 `DataExportMixin` 负责数据导出,或 `ValidationMixin` 负责数据验证。新增 Mixin 需要继承相关的 `*Aware` 接口以确保类型安全。 + +2. **覆盖现有方法**:创建 SSProcessManager 的子类,覆盖特定 Mixin 方法以修改行为。例如,可以覆盖 `log_error_msg()` 方法,不仅记录日志还弹窗提示用户。 + +3. **组合现有 Mixin**:创建新的管理器类,只继承需要的 Mixin。例如,创建一个只包含日志和进度功能的轻量级管理器,用于不需要地理编辑的脚本场景。 + +4. **自定义 Logger 和 Progress 实现**:通过 `set_logger()` 和 `enable_progress` 接口,注入自定义的日志记录器和进度显示实现,实现与企业系统的集成。 + +扩展时需要遵循的原则包括:保持 Mixin 的**单一职责**,避免让一个 Mixin 做太多事情;确保共享状态的**一致性约定**,防止不同 Mixin 之间的状态冲突;提供**合理的默认实现**,使 Mixin 在没有依赖项时也能工作(如 LogMixin 在 logger 为 None 时不崩溃)。 + +Sources: [log_mixin.py](ssprocess_mixins/log_mixin.py#L37-L42), [PySSProcess.py](PySSProcess.py#L34) + +## 最佳实践与注意事项 + +在使用 Mixin 设计模式时,需要遵循以下最佳实践以确保代码质量: + +1. **优先使用抽象基类定义接口**:每个功能领域都应该有对应的 `*Aware` 抽象基类,明确定义契约。这提供了编译时类型检查,帮助开发者理解 Mixin 之间的依赖关系。 + +2. **控制继承深度和宽度**:虽然 Mixin 支持多重继承,但应该避免过深的继承层次(超过 3 层)和过宽的继承宽度(超过 7 个 Mixin)。SunvStation 的 SSProcessManager 继承了 5 个 Mixin,处于合理范围内。 + +3. **避免钻石继承问题**:当多个 Mixin 继承同一个基类时,需要理解 Python 的方法解析顺序(MRO)。SunvStation 通过让 SelectionMixin 继承多个 `*Aware` 接口但不提供实现,而由 SSProcessManager 继承具体的 Mixin 实现类,避免了复杂的继承冲突。 + +4. **明确共享状态的读写权限**:共享状态虽然简化了代码,但也带来了耦合。应该通过文档明确哪些状态是只读的,哪些可以修改,以及在什么生命周期阶段访问是安全的。 + +5. **提供可选功能的开关机制**:不是所有 Mixin 功能在所有场景下都需要。像 ProgressMixin 的 `enable_progress` 标志这样的开关机制,允许调用方根据场景选择是否启用某个功能。 + +Sources: [selection_mixin.py](ssprocess_mixins/selection_mixin.py#L22-L40), [progress_mixin.py](ssprocess_mixins/progress_mixin.py#L39-L52), [PySSProcess.py](PySSProcess.py#L34) + +## 相关文档 + +Mixin 设计模式是 SunvStation 架构的核心组成部分,与其他设计模式和功能模块密切相关。如需深入了解相关概念,建议按以下顺序阅读: + +- [SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou) 了解 SSProcessManager 在整体架构中的位置和职责 +- [使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji) 掌握 SelectionMixin 提供的选择集操作 +- [配置日志记录器](37-pei-zhi-ri-zhi-ji-lu-qi) 学习 LogMixin 的实际应用 +- [进度条使用指南](38-jin-du-tiao-shi-yong-zhi-nan) 探索 ProgressMixin 的进阶用法 +- [SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api) 查看所有 Mixin 方法的详细说明 + +通过理解 Mixin 设计模式,开发者可以更好地扩展和定制 SunvStation 的功能,构建高效、可维护的地理信息系统脚本。 \ No newline at end of file diff --git a/docs/content/wiki.json b/docs/content/wiki.json new file mode 100644 index 0000000..ffbb532 --- /dev/null +++ b/docs/content/wiki.json @@ -0,0 +1,349 @@ +{ + "id": "2026-04-07-163229", + "generated_at": "2026-04-07T08:32:29.7375064Z", + "language": "zh", + "pages": [ + { + "slug": "1-ku-gai-shu", + "title": "库概述", + "file": "1-ku-gai-shu.md", + "section": "快速入门", + "level": "Beginner" + }, + { + "slug": "2-an-zhuang-yu-huan-jing-pei-zhi", + "title": "安装与环境配置", + "file": "2-an-zhuang-yu-huan-jing-pei-zhi.md", + "section": "快速入门", + "level": "Beginner" + }, + { + "slug": "3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing", + "title": "第一个脚本:查询地物属性", + "file": "3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing.md", + "section": "快速入门", + "level": "Beginner" + }, + { + "slug": "4-shi-yong-ssprocess-guan-li-xuan-ze-ji", + "title": "使用 SSProcess 管理选择集", + "file": "4-shi-yong-ssprocess-guan-li-xuan-ze-ji.md", + "section": "快速入门", + "level": "Beginner" + }, + { + "slug": "5-yun-xing-nei-zhi-shi-li-jiao-ben", + "title": "运行内置示例脚本", + "file": "5-yun-xing-nei-zhi-shi-li-jiao-ben.md", + "section": "快速入门", + "level": "Beginner" + }, + { + "slug": "6-sunvstation-xi-tong-jia-gou", + "title": "SunvStation 系统架构", + "file": "6-sunvstation-xi-tong-jia-gou.md", + "section": "核心概念与架构", + "level": "Intermediate" + }, + { + "slug": "7-swig-feng-zhuang-ji-zhi-shuo-ming", + "title": "SWIG 封装机制说明", + "file": "7-swig-feng-zhuang-ji-zhi-shuo-ming.md", + "section": "核心概念与架构", + "level": "Intermediate" + }, + { + "slug": "8-gong-zuo-kong-jian-yu-di-tu-gai-nian", + "title": "工作空间与地图概念", + "file": "8-gong-zuo-kong-jian-yu-di-tu-gai-nian.md", + "section": "核心概念与架构", + "level": "Intermediate" + }, + { + "slug": "9-mixin-she-ji-mo-shi", + "title": "Mixin 设计模式", + "file": "9-mixin-she-ji-mo-shi.md", + "section": "核心概念与架构", + "level": "Intermediate" + }, + { + "slug": "10-c-kuo-zhan-mo-kuai-yu-python-jie-kou", + "title": "C++ 扩展模块与 Python 接口", + "file": "10-c-kuo-zhan-mo-kuai-yu-python-jie-kou.md", + "section": "核心概念与架构", + "level": "Advanced" + }, + { + "slug": "11-qing-chu-yu-chu-shi-hua-xuan-ze-ji", + "title": "清除与初始化选择集", + "file": "11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md", + "section": "选择集与查询", + "group": "选择集基础操作", + "level": "Beginner" + }, + { + "slug": "12-she-zhi-xuan-ze-tiao-jian", + "title": "设置选择条件", + "file": "12-she-zhi-xuan-ze-tiao-jian.md", + "section": "选择集与查询", + "group": "选择集基础操作", + "level": "Intermediate" + }, + { + "slug": "13-zhi-xing-guo-lu-cha-xun", + "title": "执行过滤查询", + "file": "13-zhi-xing-guo-lu-cha-xun.md", + "section": "选择集与查询", + "group": "选择集基础操作", + "level": "Intermediate" + }, + { + "slug": "14-bian-li-xuan-ze-ji-dui-xiang", + "title": "遍历选择集对象", + "file": "14-bian-li-xuan-ze-ji-dui-xiang.md", + "section": "选择集与查询", + "group": "选择集基础操作", + "level": "Intermediate" + }, + { + "slug": "15-huo-qu-di-wu-shu-xing-zhi", + "title": "获取地物属性值", + "file": "15-huo-qu-di-wu-shu-xing-zhi.md", + "section": "选择集与查询", + "group": "地物属性读写", + "level": "Intermediate" + }, + { + "slug": "16-xiu-gai-di-wu-shu-xing-zhi", + "title": "修改地物属性值", + "file": "16-xiu-gai-di-wu-shu-xing-zhi.md", + "section": "选择集与查询", + "group": "地物属性读写", + "level": "Intermediate" + }, + { + "slug": "17-di-wu-ji-ben-shu-xing-xiang-jie", + "title": "地物基本属性详解", + "file": "17-di-wu-ji-ben-shu-xing-xiang-jie.md", + "section": "选择集与查询", + "group": "地物属性读写", + "level": "Intermediate" + }, + { + "slug": "18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing", + "title": "扩展属性与自定义属性", + "file": "18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing.md", + "section": "选择集与查询", + "group": "地物属性读写", + "level": "Advanced" + }, + { + "slug": "19-chuang-jian-mo-ren-di-wu-dui-xiang", + "title": "创建默认地物对象", + "file": "19-chuang-jian-mo-ren-di-wu-dui-xiang.md", + "section": "地理对象编辑", + "group": "对象创建与管理", + "level": "Intermediate" + }, + { + "slug": "20-tong-guo-bian-ma-chuang-jian-dui-xiang", + "title": "通过编码创建对象", + "file": "20-tong-guo-bian-ma-chuang-jian-dui-xiang.md", + "section": "地理对象编辑", + "group": "对象创建与管理", + "level": "Intermediate" + }, + { + "slug": "21-tian-jia-dui-xiang-zuo-biao-dian", + "title": "添加对象坐标点", + "file": "21-tian-jia-dui-xiang-zuo-biao-dian.md", + "section": "地理对象编辑", + "group": "对象创建与管理", + "level": "Intermediate" + }, + { + "slug": "22-shan-chu-dui-xiang-cao-zuo", + "title": "删除对象操作", + "file": "22-shan-chu-dui-xiang-cao-zuo.md", + "section": "地理对象编辑", + "group": "对象创建与管理", + "level": "Intermediate" + }, + { + "slug": "23-dui-xiang-huan-cun-ji-zhi", + "title": "对象缓存机制", + "file": "23-dui-xiang-huan-cun-ji-zhi.md", + "section": "地理对象编辑", + "group": "批量操作与缓存", + "level": "Advanced" + }, + { + "slug": "24-pi-liang-bao-cun-dao-shu-ju-ku", + "title": "批量保存到数据库", + "file": "24-pi-liang-bao-cun-dao-shu-ju-ku.md", + "section": "地理对象编辑", + "group": "批量操作与缓存", + "level": "Advanced" + }, + { + "slug": "25-che-xiao-biao-ji-guan-li", + "title": "撤销标记管理", + "file": "25-che-xiao-biao-ji-guan-li.md", + "section": "地理对象编辑", + "group": "批量操作与缓存", + "level": "Advanced" + }, + { + "slug": "26-shu-ju-jiao-huan-can-shu-pei-zhi", + "title": "数据交换参数配置", + "file": "26-shu-ju-jiao-huan-can-shu-pei-zhi.md", + "section": "数据交换与导入导出", + "level": "Intermediate" + }, + { + "slug": "27-dao-ru-wai-bu-shu-ju", + "title": "导入外部数据", + "file": "27-dao-ru-wai-bu-shu-ju.md", + "section": "数据交换与导入导出", + "level": "Intermediate" + }, + { + "slug": "28-dao-chu-shu-ju-dao-wen-jian", + "title": "导出数据到文件", + "file": "28-dao-chu-shu-ju-dao-wen-jian.md", + "section": "数据交换与导入导出", + "level": "Intermediate" + }, + { + "slug": "29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng", + "title": "自定义数据交换流程", + "file": "29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng.md", + "section": "数据交换与导入导出", + "level": "Advanced" + }, + { + "slug": "30-shu-ju-jian-cha-ji-lu-guan-li", + "title": "数据检查记录管理", + "file": "30-shu-ju-jian-cha-ji-lu-guan-li.md", + "section": "数据检查与验证", + "level": "Intermediate" + }, + { + "slug": "31-tian-jia-yu-jia-zai-jian-cha-ji-lu", + "title": "添加与加载检查记录", + "file": "31-tian-jia-yu-jia-zai-jian-cha-ji-lu.md", + "section": "数据检查与验证", + "level": "Intermediate" + }, + { + "slug": "32-xian-shi-jian-cha-jie-guo", + "title": "显示检查结果", + "file": "32-xian-shi-jian-cha-jie-guo.md", + "section": "数据检查与验证", + "level": "Intermediate" + }, + { + "slug": "33-zi-ding-yi-jian-cha-gui-ze", + "title": "自定义检查规则", + "file": "33-zi-ding-yi-jian-cha-gui-ze.md", + "section": "数据检查与验证", + "level": "Advanced" + }, + { + "slug": "34-huo-qu-gong-zuo-kong-jian-xin-xi", + "title": "获取工作空间信息", + "file": "34-huo-qu-gong-zuo-kong-jian-xin-xi.md", + "section": "高级功能", + "group": "项目与工作流", + "level": "Intermediate" + }, + { + "slug": "35-xi-tong-lu-jing-guan-li", + "title": "系统路径管理", + "file": "35-xi-tong-lu-jing-guan-li.md", + "section": "高级功能", + "group": "项目与工作流", + "level": "Intermediate" + }, + { + "slug": "36-di-tu-suo-fang-kong-zhi", + "title": "地图缩放控制", + "file": "36-di-tu-suo-fang-kong-zhi.md", + "section": "高级功能", + "group": "项目与工作流", + "level": "Intermediate" + }, + { + "slug": "37-pei-zhi-ri-zhi-ji-lu-qi", + "title": "配置日志记录器", + "file": "37-pei-zhi-ri-zhi-ji-lu-qi.md", + "section": "高级功能", + "group": "日志与进度", + "level": "Beginner" + }, + { + "slug": "38-jin-du-tiao-shi-yong-zhi-nan", + "title": "进度条使用指南", + "file": "38-jin-du-tiao-shi-yong-zhi-nan.md", + "section": "高级功能", + "group": "日志与进度", + "level": "Beginner" + }, + { + "slug": "39-cuo-wu-chu-li-yu-yi-chang-guan-li", + "title": "错误处理与异常管理", + "file": "39-cuo-wu-chu-li-yu-yi-chang-guan-li.md", + "section": "高级功能", + "group": "日志与进度", + "level": "Advanced" + }, + { + "slug": "40-ssprocessmanager-wan-zheng-api", + "title": "SSProcessManager 完整 API", + "file": "40-ssprocessmanager-wan-zheng-api.md", + "section": "参考手册", + "group": "核心类与模块", + "level": "Advanced" + }, + { + "slug": "41-objbaseattr-shu-xing-suo-yin", + "title": "ObjBaseAttr 属性索引", + "file": "41-objbaseattr-shu-xing-suo-yin.md", + "section": "参考手册", + "group": "核心类与模块", + "level": "Advanced" + }, + { + "slug": "42-di-li-dui-xiang-lei-xing-ding-yi", + "title": "地理对象类型定义", + "file": "42-di-li-dui-xiang-lei-xing-ding-yi.md", + "section": "参考手册", + "group": "核心类与模块", + "level": "Advanced" + }, + { + "slug": "43-shu-xue-ji-suan-gong-ju", + "title": "数学计算工具", + "file": "43-shu-xue-ji-suan-gong-ju.md", + "section": "参考手册", + "group": "工具函数", + "level": "Advanced" + }, + { + "slug": "44-zuo-biao-zhuan-huan-gong-ju", + "title": "坐标转换工具", + "file": "44-zuo-biao-zhuan-huan-gong-ju.md", + "section": "参考手册", + "group": "工具函数", + "level": "Advanced" + }, + { + "slug": "45-shu-ju-ku-geng-xin-jie-kou", + "title": "数据库更新接口", + "file": "45-shu-ju-ku-geng-xin-jie-kou.md", + "section": "参考手册", + "group": "工具函数", + "level": "Advanced" + } + ] +} \ No newline at end of file diff --git a/docs/css/style.css b/docs/css/style.css new file mode 100644 index 0000000..95ea259 --- /dev/null +++ b/docs/css/style.css @@ -0,0 +1,719 @@ +/* === CSS Variables & Theme === */ +:root { + --bg-primary: #ffffff; + --bg-sidebar: #f8f9fa; + --bg-toc: #f8f9fa; + --bg-code: #f5f5f5; + --bg-hover: #e9ecef; + --bg-overlay: rgba(0, 0, 0, 0.4); + --text-primary: #1a1a2e; + --text-secondary: #666; + --text-muted: #999; + --border-color: #e0e0e0; + --border-light: #eee; + --accent: #2563eb; + --accent-light: #dbeafe; + --sidebar-width: 260px; + --toc-width: 220px; + --header-height: 50px; + --shadow-sm: 0 1px 3px rgba(0,0,0,0.08); + --shadow-md: 0 4px 12px rgba(0,0,0,0.12); + --radius: 6px; + --transition: 0.2s ease; +} + +[data-theme="dark"] { + --bg-primary: #0d1117; + --bg-sidebar: #161b22; + --bg-toc: #161b22; + --bg-code: #161b22; + --bg-hover: #21262d; + --bg-overlay: rgba(0, 0, 0, 0.6); + --text-primary: #c9d1d9; + --text-secondary: #8b949e; + --text-muted: #6e7681; + --border-color: #30363d; + --border-light: #21262d; + --accent: #58a6ff; + --accent-light: #1c2d41; + --shadow-sm: 0 1px 3px rgba(0,0,0,0.3); + --shadow-md: 0 4px 12px rgba(0,0,0,0.4); +} + +/* === Reset & Base === */ +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +html { + font-size: 15px; + scroll-behavior: smooth; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", sans-serif; + color: var(--text-primary); + background: var(--bg-primary); + line-height: 1.75; + overflow: hidden; + height: 100vh; +} + +a { color: var(--accent); text-decoration: none; } +a:hover { text-decoration: underline; } + +/* === Layout === */ +.layout { + display: grid; + grid-template-columns: var(--sidebar-width) 1fr var(--toc-width); + height: 100vh; + overflow: hidden; +} + +/* === Sidebar === */ +.sidebar { + background: var(--bg-sidebar); + border-right: 1px solid var(--border-color); + display: flex; + flex-direction: column; + height: 100vh; + overflow: hidden; + position: relative; + z-index: 20; +} + +.sidebar-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 16px 12px; + border-bottom: 1px solid var(--border-light); + flex-shrink: 0; +} + +.logo { + font-size: 1.1rem; + font-weight: 700; + color: var(--text-primary); +} + +.theme-toggle, .theme-toggle-mobile { + background: none; + border: 1px solid var(--border-color); + border-radius: var(--radius); + padding: 6px; + cursor: pointer; + color: var(--text-secondary); + display: flex; + align-items: center; + justify-content: center; + transition: var(--transition); +} +.theme-toggle:hover, .theme-toggle-mobile:hover { + background: var(--bg-hover); + color: var(--text-primary); +} + +/* Show sun in dark, moon in light */ +.icon-sun { display: none; } +.icon-moon { display: block; } +[data-theme="dark"] .icon-sun { display: block; } +[data-theme="dark"] .icon-moon { display: none; } + +/* Sidebar search button */ +.sidebar-search { + padding: 8px 12px; + flex-shrink: 0; +} + +.sidebar-search-btn { + display: flex; + align-items: center; + gap: 8px; + width: 100%; + padding: 8px 12px; + background: var(--bg-primary); + border: 1px solid var(--border-color); + border-radius: var(--radius); + color: var(--text-muted); + cursor: pointer; + font-size: 0.85rem; + transition: var(--transition); +} +.sidebar-search-btn:hover { + border-color: var(--accent); + color: var(--text-secondary); +} +.sidebar-search-btn kbd { + margin-left: auto; + background: var(--bg-code); + border: 1px solid var(--border-color); + border-radius: 3px; + padding: 1px 6px; + font-size: 0.75rem; + font-family: inherit; + color: var(--text-muted); +} + +/* Sidebar navigation */ +.sidebar-nav { + flex: 1; + overflow-y: auto; + padding: 8px 0; + scrollbar-width: thin; + scrollbar-color: var(--border-color) transparent; +} +.sidebar-nav::-webkit-scrollbar { width: 4px; } +.sidebar-nav::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 2px; } + +.nav-section { margin-bottom: 2px; } + +.nav-section-header { + display: flex; + align-items: center; + padding: 8px 16px; + font-size: 0.8rem; + font-weight: 600; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + user-select: none; + transition: var(--transition); +} +.nav-section-header:hover { color: var(--text-primary); } +.nav-section-header .chevron { + margin-right: 6px; + transition: transform 0.2s ease; + flex-shrink: 0; +} +.nav-section.collapsed .chevron { transform: rotate(-90deg); } +.nav-section.collapsed .nav-section-body { display: none; } + +.nav-group-label { + padding: 6px 16px 2px 32px; + font-size: 0.78rem; + color: var(--text-muted); + font-weight: 500; +} + +.nav-page { + display: block; + padding: 5px 16px 5px 32px; + color: var(--text-secondary); + font-size: 0.88rem; + text-decoration: none; + border-left: 3px solid transparent; + transition: var(--transition); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.nav-page:hover { + color: var(--text-primary); + background: var(--bg-hover); + text-decoration: none; +} +.nav-page.active { + color: var(--accent); + background: var(--accent-light); + border-left-color: var(--accent); + font-weight: 500; +} +.nav-group .nav-page { + padding-left: 42px; +} + +/* Level badges */ +.nav-page .level-badge { + display: inline-block; + font-size: 0.65rem; + padding: 1px 5px; + border-radius: 3px; + margin-left: 4px; + vertical-align: middle; + font-weight: 500; +} +.level-badge.beginner { background: #dcfce7; color: #166534; } +.level-badge.intermediate { background: #dbeafe; color: #1e40af; } +.level-badge.advanced { background: #fef3c7; color: #92400e; } +[data-theme="dark"] .level-badge.beginner { background: #064e3b; color: #6ee7b7; } +[data-theme="dark"] .level-badge.intermediate { background: #1e3a5f; color: #93c5fd; } +[data-theme="dark"] .level-badge.advanced { background: #78350f; color: #fcd34d; } + +/* === Content Area === */ +.content { + overflow-y: auto; + padding: 32px 40px; + height: 100vh; + scrollbar-width: thin; + scrollbar-color: var(--border-color) transparent; +} +.content::-webkit-scrollbar { width: 6px; } +.content::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 3px; } + +#article { + max-width: 820px; + margin: 0 auto; +} + +/* Page title (dynamically inserted by app.js) */ +.page-title { + margin-bottom: 1.5rem; + padding-bottom: 1rem; + border-bottom: 2px solid var(--border-color); +} +.page-title h1 { + font-size: 1.8rem; + font-weight: 700; + color: var(--text-primary); + margin: 0; + line-height: 1.3; +} +.page-meta { + margin-top: 8px; + font-size: 0.85rem; + color: var(--text-muted); +} + +#article h2 { + font-size: 1.5rem; + font-weight: 700; + margin: 2rem 0 1rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid var(--border-light); + color: var(--text-primary); +} + +#article h3 { + font-size: 1.2rem; + font-weight: 600; + margin: 1.5rem 0 0.75rem; + color: var(--text-primary); +} + +#article h4 { + font-size: 1.05rem; + font-weight: 600; + margin: 1.2rem 0 0.5rem; +} + +#article p { + margin: 0.75rem 0; +} + +#article strong { + font-weight: 600; + color: var(--text-primary); +} + +#article ul, #article ol { + margin: 0.5rem 0; + padding-left: 1.5rem; +} + +#article li { + margin: 0.25rem 0; +} + +/* Source references */ +.source-ref { + font-size: 0.82rem; + color: var(--text-muted); + border-left: 3px solid var(--border-color); + padding: 4px 12px; + margin: 8px 0; + background: var(--bg-code); + border-radius: 0 var(--radius) var(--radius) 0; +} + +/* Source file links (dead links) */ +a[href$=".py"], a[href*=".py#"], a[href$=".pyd"] { + color: var(--text-muted); + pointer-events: none; + text-decoration: line-through dotted; +} + +/* Tables */ +#article table { + width: 100%; + border-collapse: collapse; + margin: 1rem 0; + font-size: 0.9rem; + overflow-x: auto; + display: block; +} + +#article th, #article td { + border: 1px solid var(--border-color); + padding: 8px 12px; + text-align: left; +} + +#article th { + background: var(--bg-code); + font-weight: 600; + white-space: nowrap; +} + +#article tr:nth-child(even) { + background: var(--bg-sidebar); +} + +#article tr:hover { + background: var(--bg-hover); +} + +/* Code blocks */ +#article pre { + background: var(--bg-code); + border: 1px solid var(--border-color); + border-radius: var(--radius); + padding: 16px; + overflow-x: auto; + margin: 1rem 0; + position: relative; + font-size: 0.88rem; + line-height: 1.6; +} + +#article code { + font-family: "Cascadia Code", "Fira Code", "JetBrains Mono", Consolas, monospace; + font-size: 0.9em; +} + +#article :not(pre) > code { + background: var(--bg-code); + padding: 2px 6px; + border-radius: 3px; + border: 1px solid var(--border-light); +} + +/* Code language label */ +.code-lang { + position: absolute; + top: 6px; + left: 12px; + font-size: 0.7rem; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; + pointer-events: none; +} + +/* Copy button */ +.copy-btn { + position: absolute; + top: 8px; + right: 8px; + background: var(--bg-primary); + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 4px 8px; + font-size: 0.75rem; + cursor: pointer; + color: var(--text-muted); + opacity: 0; + transition: var(--transition); +} +#article pre:hover .copy-btn { opacity: 1; } +.copy-btn:hover { color: var(--text-primary); background: var(--bg-hover); } + +/* Mermaid diagrams */ +.mermaid-wrapper { + text-align: center; + margin: 1.5rem 0; + padding: 20px; + background: var(--bg-sidebar); + border: 1px solid var(--border-color); + border-radius: var(--radius); + overflow-x: auto; +} + +.mermaid-wrapper svg { + max-width: 100%; + height: auto; +} + +/* Loading state */ +.loading { + text-align: center; + padding: 4rem 0; + color: var(--text-muted); + font-size: 1rem; +} + +/* === Page Navigation (Prev/Next) === */ +.page-nav { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 820px; + margin: 2rem auto 0; + padding-top: 1.5rem; + border-top: 1px solid var(--border-light); + gap: 16px; +} + +.page-nav-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + background: var(--bg-sidebar); + border: 1px solid var(--border-color); + border-radius: var(--radius); + color: var(--text-secondary); + font-size: 0.88rem; + text-decoration: none; + transition: var(--transition); + flex: 1; + min-width: 0; +} +.page-nav-btn:hover { + border-color: var(--accent); + color: var(--accent); + text-decoration: none; +} +.page-nav-btn.next { justify-content: flex-end; text-align: right; } +.page-nav-btn .label { font-size: 0.75rem; color: var(--text-muted); } +.page-nav-btn .title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* === TOC (Table of Contents) === */ +.toc { + background: var(--bg-toc); + border-left: 1px solid var(--border-color); + padding: 20px 16px; + height: 100vh; + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: var(--border-color) transparent; +} +.toc::-webkit-scrollbar { width: 4px; } +.toc::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 2px; } + +.toc-title { + font-size: 0.8rem; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 12px; +} + +.toc-nav ul { + list-style: none; + padding: 0; +} + +.toc-nav li { + margin: 0; +} + +.toc-nav a { + display: block; + padding: 3px 0; + font-size: 0.82rem; + color: var(--text-secondary); + text-decoration: none; + transition: var(--transition); + line-height: 1.4; +} +.toc-nav a:hover { color: var(--accent); } +.toc-nav a.active { + color: var(--accent); + font-weight: 500; +} +.toc-nav .toc-h3 { padding-left: 14px; } + +/* === Mobile Header === */ +.mobile-header { + display: none; + align-items: center; + padding: 0 12px; + height: var(--header-height); + background: var(--bg-sidebar); + border-bottom: 1px solid var(--border-color); + gap: 12px; + flex-shrink: 0; +} +.hamburger { + background: none; + border: none; + color: var(--text-primary); + cursor: pointer; + padding: 4px; + display: flex; +} +.mobile-title { + font-weight: 600; + font-size: 1rem; + flex: 1; +} +.mobile-actions { + display: flex; + gap: 4px; +} +.search-btn-mobile { + background: none; + border: none; + color: var(--text-secondary); + cursor: pointer; + padding: 6px; + display: flex; +} + +.sidebar-backdrop { + display: none; + position: fixed; + inset: 0; + background: var(--bg-overlay); + z-index: 15; +} + +/* === Search Modal === */ +.search-overlay { + display: none; + position: fixed; + inset: 0; + background: var(--bg-overlay); + z-index: 100; + align-items: flex-start; + justify-content: center; + padding-top: 15vh; +} +.search-overlay.active { display: flex; } + +.search-modal { + background: var(--bg-primary); + border: 1px solid var(--border-color); + border-radius: 12px; + width: 90%; + max-width: 560px; + box-shadow: var(--shadow-md); + overflow: hidden; +} + +.search-input-wrap { + display: flex; + align-items: center; + padding: 12px 16px; + gap: 10px; + border-bottom: 1px solid var(--border-light); + color: var(--text-muted); +} +.search-input-wrap input { + flex: 1; + border: none; + outline: none; + font-size: 1rem; + background: transparent; + color: var(--text-primary); + font-family: inherit; +} +.search-input-wrap input::placeholder { color: var(--text-muted); } + +.search-close { + background: var(--bg-code); + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 3px 8px; + font-size: 0.7rem; + cursor: pointer; + color: var(--text-muted); + font-family: inherit; +} + +.search-results { + max-height: 400px; + overflow-y: auto; + padding: 8px; + scrollbar-width: thin; + scrollbar-color: var(--border-color) transparent; +} + +.search-hint { + text-align: center; + padding: 24px 0; + color: var(--text-muted); + font-size: 0.9rem; +} + +.search-result-item { + display: block; + padding: 10px 12px; + border-radius: var(--radius); + cursor: pointer; + text-decoration: none; + color: var(--text-primary); + transition: var(--transition); +} +.search-result-item:hover { + background: var(--bg-hover); + text-decoration: none; +} +.search-result-item .result-title { + font-weight: 600; + font-size: 0.92rem; + margin-bottom: 2px; +} +.search-result-item .result-section { + font-size: 0.78rem; + color: var(--text-muted); + margin-bottom: 4px; +} +.search-result-item .result-context { + font-size: 0.82rem; + color: var(--text-secondary); + line-height: 1.4; +} +.search-result-item mark { + background: var(--accent-light); + color: var(--accent); + padding: 0 2px; + border-radius: 2px; +} + +/* === Responsive === */ +@media (max-width: 1023px) { + .toc { display: none; } + .layout { + grid-template-columns: var(--sidebar-width) 1fr; + } +} + +@media (max-width: 767px) { + .mobile-header { display: flex; } + .layout { + grid-template-columns: 1fr; + padding-top: var(--header-height); + margin-top: calc(var(--header-height) * -1); + } + .sidebar { + position: fixed; + left: -100%; + top: 0; + width: 280px; + height: 100vh; + z-index: 30; + transition: left 0.25s ease; + box-shadow: var(--shadow-md); + } + .sidebar.open { left: 0; } + .sidebar-backdrop.open { display: block; } + .content { + padding: 20px 16px; + } + .toc { display: none; } + .page-nav { flex-direction: column; } + .page-nav-btn { text-align: center; justify-content: center; } +} + +/* === Print === */ +@media print { + .sidebar, .toc, .mobile-header, .page-nav { display: none; } + .content { padding: 0; height: auto; overflow: visible; } + .layout { display: block; } +} diff --git a/docs/data/nav.json b/docs/data/nav.json new file mode 100644 index 0000000..cc2aba3 --- /dev/null +++ b/docs/data/nav.json @@ -0,0 +1,362 @@ +{ + "sections": [ + { + "id": "快速入门", + "title": "快速入门", + "pages": [ + { + "slug": "1-ku-gai-shu", + "title": "库概述", + "file": "1-ku-gai-shu.md", + "level": "Beginner" + }, + { + "slug": "2-an-zhuang-yu-huan-jing-pei-zhi", + "title": "安装与环境配置", + "file": "2-an-zhuang-yu-huan-jing-pei-zhi.md", + "level": "Beginner" + }, + { + "slug": "3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing", + "title": "第一个脚本:查询地物属性", + "file": "3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing.md", + "level": "Beginner" + }, + { + "slug": "4-shi-yong-ssprocess-guan-li-xuan-ze-ji", + "title": "使用 SSProcess 管理选择集", + "file": "4-shi-yong-ssprocess-guan-li-xuan-ze-ji.md", + "level": "Beginner" + }, + { + "slug": "5-yun-xing-nei-zhi-shi-li-jiao-ben", + "title": "运行内置示例脚本", + "file": "5-yun-xing-nei-zhi-shi-li-jiao-ben.md", + "level": "Beginner" + } + ] + }, + { + "id": "核心概念与架构", + "title": "核心概念与架构", + "pages": [ + { + "slug": "6-sunvstation-xi-tong-jia-gou", + "title": "SunvStation 系统架构", + "file": "6-sunvstation-xi-tong-jia-gou.md", + "level": "Intermediate" + }, + { + "slug": "7-swig-feng-zhuang-ji-zhi-shuo-ming", + "title": "SWIG 封装机制说明", + "file": "7-swig-feng-zhuang-ji-zhi-shuo-ming.md", + "level": "Intermediate" + }, + { + "slug": "8-gong-zuo-kong-jian-yu-di-tu-gai-nian", + "title": "工作空间与地图概念", + "file": "8-gong-zuo-kong-jian-yu-di-tu-gai-nian.md", + "level": "Intermediate" + }, + { + "slug": "9-mixin-she-ji-mo-shi", + "title": "Mixin 设计模式", + "file": "9-mixin-she-ji-mo-shi.md", + "level": "Intermediate" + }, + { + "slug": "10-c-kuo-zhan-mo-kuai-yu-python-jie-kou", + "title": "C++ 扩展模块与 Python 接口", + "file": "10-c-kuo-zhan-mo-kuai-yu-python-jie-kou.md", + "level": "Advanced" + } + ] + }, + { + "id": "选择集与查询", + "title": "选择集与查询", + "groups": [ + { + "title": "选择集基础操作", + "pages": [ + { + "slug": "11-qing-chu-yu-chu-shi-hua-xuan-ze-ji", + "title": "清除与初始化选择集", + "file": "11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md", + "level": "Beginner" + }, + { + "slug": "12-she-zhi-xuan-ze-tiao-jian", + "title": "设置选择条件", + "file": "12-she-zhi-xuan-ze-tiao-jian.md", + "level": "Intermediate" + }, + { + "slug": "13-zhi-xing-guo-lu-cha-xun", + "title": "执行过滤查询", + "file": "13-zhi-xing-guo-lu-cha-xun.md", + "level": "Intermediate" + }, + { + "slug": "14-bian-li-xuan-ze-ji-dui-xiang", + "title": "遍历选择集对象", + "file": "14-bian-li-xuan-ze-ji-dui-xiang.md", + "level": "Intermediate" + } + ] + }, + { + "title": "地物属性读写", + "pages": [ + { + "slug": "15-huo-qu-di-wu-shu-xing-zhi", + "title": "获取地物属性值", + "file": "15-huo-qu-di-wu-shu-xing-zhi.md", + "level": "Intermediate" + }, + { + "slug": "16-xiu-gai-di-wu-shu-xing-zhi", + "title": "修改地物属性值", + "file": "16-xiu-gai-di-wu-shu-xing-zhi.md", + "level": "Intermediate" + }, + { + "slug": "17-di-wu-ji-ben-shu-xing-xiang-jie", + "title": "地物基本属性详解", + "file": "17-di-wu-ji-ben-shu-xing-xiang-jie.md", + "level": "Intermediate" + }, + { + "slug": "18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing", + "title": "扩展属性与自定义属性", + "file": "18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing.md", + "level": "Advanced" + } + ] + } + ] + }, + { + "id": "地理对象编辑", + "title": "地理对象编辑", + "groups": [ + { + "title": "对象创建与管理", + "pages": [ + { + "slug": "19-chuang-jian-mo-ren-di-wu-dui-xiang", + "title": "创建默认地物对象", + "file": "19-chuang-jian-mo-ren-di-wu-dui-xiang.md", + "level": "Intermediate" + }, + { + "slug": "20-tong-guo-bian-ma-chuang-jian-dui-xiang", + "title": "通过编码创建对象", + "file": "20-tong-guo-bian-ma-chuang-jian-dui-xiang.md", + "level": "Intermediate" + }, + { + "slug": "21-tian-jia-dui-xiang-zuo-biao-dian", + "title": "添加对象坐标点", + "file": "21-tian-jia-dui-xiang-zuo-biao-dian.md", + "level": "Intermediate" + }, + { + "slug": "22-shan-chu-dui-xiang-cao-zuo", + "title": "删除对象操作", + "file": "22-shan-chu-dui-xiang-cao-zuo.md", + "level": "Intermediate" + } + ] + }, + { + "title": "批量操作与缓存", + "pages": [ + { + "slug": "23-dui-xiang-huan-cun-ji-zhi", + "title": "对象缓存机制", + "file": "23-dui-xiang-huan-cun-ji-zhi.md", + "level": "Advanced" + }, + { + "slug": "24-pi-liang-bao-cun-dao-shu-ju-ku", + "title": "批量保存到数据库", + "file": "24-pi-liang-bao-cun-dao-shu-ju-ku.md", + "level": "Advanced" + }, + { + "slug": "25-che-xiao-biao-ji-guan-li", + "title": "撤销标记管理", + "file": "25-che-xiao-biao-ji-guan-li.md", + "level": "Advanced" + } + ] + } + ] + }, + { + "id": "数据交换与导入导出", + "title": "数据交换与导入导出", + "pages": [ + { + "slug": "26-shu-ju-jiao-huan-can-shu-pei-zhi", + "title": "数据交换参数配置", + "file": "26-shu-ju-jiao-huan-can-shu-pei-zhi.md", + "level": "Intermediate" + }, + { + "slug": "27-dao-ru-wai-bu-shu-ju", + "title": "导入外部数据", + "file": "27-dao-ru-wai-bu-shu-ju.md", + "level": "Intermediate" + }, + { + "slug": "28-dao-chu-shu-ju-dao-wen-jian", + "title": "导出数据到文件", + "file": "28-dao-chu-shu-ju-dao-wen-jian.md", + "level": "Intermediate" + }, + { + "slug": "29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng", + "title": "自定义数据交换流程", + "file": "29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng.md", + "level": "Advanced" + } + ] + }, + { + "id": "数据检查与验证", + "title": "数据检查与验证", + "pages": [ + { + "slug": "30-shu-ju-jian-cha-ji-lu-guan-li", + "title": "数据检查记录管理", + "file": "30-shu-ju-jian-cha-ji-lu-guan-li.md", + "level": "Intermediate" + }, + { + "slug": "31-tian-jia-yu-jia-zai-jian-cha-ji-lu", + "title": "添加与加载检查记录", + "file": "31-tian-jia-yu-jia-zai-jian-cha-ji-lu.md", + "level": "Intermediate" + }, + { + "slug": "32-xian-shi-jian-cha-jie-guo", + "title": "显示检查结果", + "file": "32-xian-shi-jian-cha-jie-guo.md", + "level": "Intermediate" + }, + { + "slug": "33-zi-ding-yi-jian-cha-gui-ze", + "title": "自定义检查规则", + "file": "33-zi-ding-yi-jian-cha-gui-ze.md", + "level": "Advanced" + } + ] + }, + { + "id": "高级功能", + "title": "高级功能", + "groups": [ + { + "title": "项目与工作流", + "pages": [ + { + "slug": "34-huo-qu-gong-zuo-kong-jian-xin-xi", + "title": "获取工作空间信息", + "file": "34-huo-qu-gong-zuo-kong-jian-xin-xi.md", + "level": "Intermediate" + }, + { + "slug": "35-xi-tong-lu-jing-guan-li", + "title": "系统路径管理", + "file": "35-xi-tong-lu-jing-guan-li.md", + "level": "Intermediate" + }, + { + "slug": "36-di-tu-suo-fang-kong-zhi", + "title": "地图缩放控制", + "file": "36-di-tu-suo-fang-kong-zhi.md", + "level": "Intermediate" + } + ] + }, + { + "title": "日志与进度", + "pages": [ + { + "slug": "37-pei-zhi-ri-zhi-ji-lu-qi", + "title": "配置日志记录器", + "file": "37-pei-zhi-ri-zhi-ji-lu-qi.md", + "level": "Beginner" + }, + { + "slug": "38-jin-du-tiao-shi-yong-zhi-nan", + "title": "进度条使用指南", + "file": "38-jin-du-tiao-shi-yong-zhi-nan.md", + "level": "Beginner" + }, + { + "slug": "39-cuo-wu-chu-li-yu-yi-chang-guan-li", + "title": "错误处理与异常管理", + "file": "39-cuo-wu-chu-li-yu-yi-chang-guan-li.md", + "level": "Advanced" + } + ] + } + ] + }, + { + "id": "参考手册", + "title": "参考手册", + "groups": [ + { + "title": "核心类与模块", + "pages": [ + { + "slug": "40-ssprocessmanager-wan-zheng-api", + "title": "SSProcessManager 完整 API", + "file": "40-ssprocessmanager-wan-zheng-api.md", + "level": "Advanced" + }, + { + "slug": "41-objbaseattr-shu-xing-suo-yin", + "title": "ObjBaseAttr 属性索引", + "file": "41-objbaseattr-shu-xing-suo-yin.md", + "level": "Advanced" + }, + { + "slug": "42-di-li-dui-xiang-lei-xing-ding-yi", + "title": "地理对象类型定义", + "file": "42-di-li-dui-xiang-lei-xing-ding-yi.md", + "level": "Advanced" + } + ] + }, + { + "title": "工具函数", + "pages": [ + { + "slug": "43-shu-xue-ji-suan-gong-ju", + "title": "数学计算工具", + "file": "43-shu-xue-ji-suan-gong-ju.md", + "level": "Advanced" + }, + { + "slug": "44-zuo-biao-zhuan-huan-gong-ju", + "title": "坐标转换工具", + "file": "44-zuo-biao-zhuan-huan-gong-ju.md", + "level": "Advanced" + }, + { + "slug": "45-shu-ju-ku-geng-xin-jie-kou", + "title": "数据库更新接口", + "file": "45-shu-ju-ku-geng-xin-jie-kou.md", + "level": "Advanced" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/data/search-index.json b/docs/data/search-index.json new file mode 100644 index 0000000..eb76d79 --- /dev/null +++ b/docs/data/search-index.json @@ -0,0 +1,1502 @@ +[ + { + "slug": "1-ku-gai-shu", + "title": "库概述", + "section": "快速入门", + "headings": [ + "核心架构", + "模块功能概览", + "主要特性", + "快速上手", + "项目结构", + "学习路径建议" + ], + "content": "sunvpy是SunvStation地理信息系统的Python脚本接口库,专为二次开发和自动化数据处理任务设计。该库通过SWIG封装技术将C++核心功能暴露给Python,提供了完整的地理对象管理、空间查询、数据交换和质量检查能力。\n\n\n\n## 核心架构\n\nsunvpy采用分层架构设计,底层为SWIG封装的C++扩展模块,上层为面向Python的高级API封装。SSProcessManager作为主要入口类,通过Mixin模式组织功能模块,实现了关注点分离和代码复用。\n\n```mermaid\ngraph TB\n subgraph \"Python API层\"\n A[SSProcessManager
进程管理器]\n B[ObjBaseAttr
属性管理器]\n C[SelectionMixin
选择集操作]\n D[GeoEditMixin
地理编辑]\n E[ProjectMixin
工程管理]\n F[LogMixin
日志记录]\n G[ProgressMixin
进度管理]\n end\n \n subgraph \"SWIG封装层\"\n H[PySSCore.pyd
核心功能]\n I[PySSMap.pyd
地图操作]\n J[PySSDataSource.pyd
数据源管理]\n K[PySSDatabase.pyd
数据库操作]\n L[PySSDataX.pyd
数据交换]\n M[PySSCheck.pyd
数据检查]\n N[PySSMath.pyd
数学计算]\n O[PySSWidget.pyd
UI组件]\n P[PySSView.pyd
视图控制]\n Q[PySSGisDBUpdate.pyd
GIS数据库更新]\n end\n \n subgraph \"C++核心层\"\n R[SunvStation
C++引擎]\n end\n \n A --> C\n A --> D\n A --> E\n A --> F\n A --> G\n A --> H\n A --> I\n A --> J\n A --> K\n A --> L\n A --> M\n A --> N\n A --> O\n A --> P\n A --> Q\n B --> H\n \n H -.-> R\n I -.-> R\n J -.-> R\n K -.-> R\n L -.-> R\n M -.-> R\n N -.-> R\n O -.-> R\n P -.-> R\n Q -.-> R\n```\n\nSSProcessManager继承自五个功能Mixin类,每个Mixin负责特定的功能域。这种设计使得代码组织清晰,易于维护和扩展。全局单例SSProcess提供统一访问入口,确保工作空间和地图实例的一致性。\n\n\n\n## 模块功能概览\n\nsunvpy包含多个功能模块,每个模块对应特定的地理信息系统操作领域。下表列出了主要模块及其功能描述。\n\n| 模块名称 | 文件名 | 功能描述 | 封装类型 |\n|---------|--------|---------|---------|\n| 核心功能 | PySSCore.pyd | 提供基础数据结构、工作空间管理、地物对象等核心类 | SWIG封装 |\n| 地图操作 | PySSMap.pyd | 地图显示、缩放控制、坐标系转换等地图相关功能 | SWIG封装 |\n| 数据源管理 | PySSDataSource.pyd | 数据集访问、数据源管理、数据浏览等功能 | SWIG封装 |\n| 数据库操作 | PySSDatabase.pyd | 数据库连接、查询、更新等数据库操作功能 | SWIG封装 |\n| 数据交换 | PySSDataX.pyd | 数据导入导出、格式转换等数据交换功能 | SWIG封装 |\n| 数据检查 | PySSCheck.pyd | 拓扑检查、规则验证等数据质量检查功能 | SWIG封装 |\n| 数学计算 | PySSMath.pyd | 几何计算、坐标变换、数学运算等数学工具 | SWIG封装 |\n| UI组件 | PySSWidget.pyd | 进" + }, + { + "slug": "2-an-zhuang-yu-huan-jing-pei-zhi", + "title": "安装与环境配置", + "section": "快速入门", + "headings": [ + "系统要求", + "安装方法", + "自动安装", + "手动安装", + "环境验证", + "导入测试", + "功能测试", + "版本信息检查", + "常见问题排查", + "调试技巧", + "目录结构说明", + "环境配置最佳实践", + "推荐开发环境设置", + "下一步学习" + ], + "content": "本页面介绍 sunvpy Python 库的安装流程、环境配置要求以及验证方法。sunvpy 是 SunvStation 地理信息系统的官方 Python 脚本接口,通过 SWIG 技术将 C++ 核心功能封装为 Python 模块,为开发者提供高效的二次开发和自动化数据处理能力。\n\n\n\n## 系统要求\n\n使用 sunvpy 库需要满足以下软硬件环境要求。下表详细列出了各项配置要求和建议。\n\n| 配置项 | 最低要求 | 推荐配置 | 说明 |\n|-------|---------|---------|------|\n| 操作系统 | Windows 7/8.1/10 | Windows 10/11 | sunvpy 目前仅支持 Windows 平台 |\n| Python 版本 | Python 3.8+ | Python 3.10 - 3.13 | 需要与 SunvStation 版本匹配的 Python 版本 |\n| SunvStation | SunvStation 10.0+ | 最新稳定版 | SunvStation 软件本体必须已正确安装 |\n| 磁盘空间 | 100 MB | 200 MB+ | 包含 sunvpy 模块及其依赖库 |\n| 内存 | 2 GB RAM | 4 GB RAM+ | 处理大规模数据集时需要更多内存 |\n| 架构 | x86-64 | x86-64 | 仅支持 64 位操作系统和 Python |\n\nPython 版本的选择尤为重要,因为 sunvpy 中的 `.pyd` 扩展模块是编译好的二进制文件,必须与 Python 解释器的版本和位数完全匹配。错误的环境配置会导致模块加载失败。\n\n\n\n## 安装方法\n\nsunvpy 通常作为 SunvStation 安装包的一部分自动安装到 Python 的 site-packages 目录。安装流程可以分为自动安装和手动安装两种方式。\n\n### 自动安装\n\n自动安装是最推荐的方式,由 SunvStation 安装程序自动完成所有配置工作。\n\n```mermaid\nflowchart LR\n A[运行 SunvStation 安装程序] --> B{选择 Python 版本}\n B -->|指定 Python 安装路径| C[安装程序自动检测 Python 环境]\n B -->|使用自带 Python| D[安装程序部署内置 Python 环境]\n C --> E[复制 sunvpy 到 site-packages]\n D --> E\n E --> F[注册环境变量]\n F --> G[创建桌面快捷方式]\n G --> H[完成安装]\n```\n\n在安装 SunvStation 时,安装程序会自动检测系统中的 Python 环境,并提示用户选择使用现有的 Python 解释器还是安装 SunvStation 自带的 Python 版本。安装程序会将 sunvpy 包复制到指定 Python 版本的 `Lib\\site-packages\\sunvpy` 目录下。\n\n### 手动安装\n\n如果需要手动配置 sunvpy 环境,可以按照以下步骤操作。\n\n| 步骤 | 操作 | 详细说明 |\n|-----|------|---------|\n| 1 | 定位安装目录 | 找到 SunvStation 安装目录下的 script 子目录 |\n| 2 | 复制文件 | 将 sunvpy 整个文件夹复制到 Python 的 site-packages 目录 |\n| 3 | 验证依赖 | 确保所有 .pyd 文件和对应的 .py 文件完整 |\n| 4 | 配置环境变量 | 如有需要,添加相关路径到 PATH 环境变量 |\n| 5 | 测试导入 | 运行 Python 测试导入是否成功 |\n\n手动安装需要确保所有模块文件完整,包括 Python 封装文件(.py)和 C++ 扩展文件(.pyd)。缺失任何一个文件都可能导致模块功能异常。\n\n\n\n## 环境验证\n\n安装完成后,通过以下步骤验证环境配置是否正确。验证过程分为导入测试、功能测试和版本检查三个环节。\n\n### 导入测试\n\n打开命令行或 Python 解释器,尝试导入 sunvpy 模块。\n\n```python\n# 测试基本导入\nimport sunvpy\nprint(f\"sunvpy 版本: {sunvpy.get_version()}\")\n\n# 测试 SSProcess 导入\nfrom sunvpy import SSProcess\nprint(\"SSProcess 导入成功\")\n```\n\n如果导入成功且没有报错,说明基本环境配置正确。如果出现 `ModuleN" + }, + { + "slug": "3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing", + "title": "第一个脚本:查询地物属性", + "section": "快速入门", + "headings": [ + "脚本功能概览", + "完整工作流程", + "步骤一:准备环境与初始化", + "步骤二:清理选择集与条件", + "步骤三:设置选择条件", + "条件类型说明", + "操作符支持", + "设置选择条件代码", + "步骤四:执行过滤查询", + "步骤五:获取选择集对象数量", + "步骤六:遍历选择集并读取属性", + "常用地物属性速查表", + "遍历代码示例", + "完整示例脚本", + "脚本执行结果示例", + "常见问题与解决方案", + "问题1:选择集为空", + "问题2:属性值为空", + "问题3:扩展属性无法读取", + "架构原理补充说明", + "SSProcess 的内部结构", + "属性读取机制", + "下一步学习建议", + "继续深入选择集与查询", + "学习地物属性操作", + "探索高级功能" + ], + "content": "本页面将引导您编写第一个 SunvStation Python 脚本,从最基础的地物属性查询开始。通过实际案例,您将学习如何使用选择集过滤地物对象,并读取它们的属性信息。这是所有数据处理和编辑操作的基础起点。\n\n## 脚本功能概览\n\n我们的第一个脚本将实现以下完整流程:在当前地图中按照编码条件筛选地物对象,然后遍历选择集中的每个对象,读取并显示其核心属性信息。这个示例涵盖了脚本开发的四个核心环节——准备工作、筛选对象、遍历结果、输出信息。\n\n\n\n## 完整工作流程\n\n让我们先通过一个流程图理解整个脚本的数据流转过程,这有助于把握各步骤之间的逻辑关系:\n\n```mermaid\nflowchart LR\n A[初始化 SSProcess
获取工作空间与地图] --> B[清除旧选择集
clearSelection]\n B --> C[清除旧选择条件
clearSelectCondition]\n C --> D[设置筛选条件
setSelectCondition]\n D --> E[执行过滤查询
selectFilter]\n E --> F{选择集非空?}\n F -->|是| G[获取对象数量
getSelGeoCount]\n F -->|否| H[脚本结束]\n G --> I[循环遍历对象]\n I --> J[获取对象属性
getSelGeoValue]\n J --> K[输出属性信息]\n K --> L{还有对象?}\n L -->|是| I\n L -->|否| H\n```\n\n这个流程图展示了脚本的核心执行路径,其中每个节点对应一个关键的 API 调用。接下来的详细教程将逐步解析每个节点的具体实现。\n\n\n\n## 步骤一:准备环境与初始化\n\n在编写任何脚本之前,首先需要导入 sunvpy 模块中的核心类 `SSProcess`。这是一个全局单例对象,封装了工作空间、地图、选择集以及所有地物操作的核心功能。初始化完成后,`SSProcess` 会自动获取当前 SunvStation 系统的工作空间和活动地图实例,为后续操作做好准备。\n\n```python\nfrom sunvpy import SSProcess\n```\n\n这个简单的导入语句就完成了所有必要的准备工作。`SSProcess` 内部维护了 `WorkSpace`(工作空间)和 `ScaleMap`(比例尺地图)两个核心对象,以及 `GeoBaseList`(地物列表)、`SSearchHelper`(搜索助手)等辅助对象,共同构成了脚本运行的基础环境。\n\n\n\n## 步骤二:清理选择集与条件\n\n在开始新的查询之前,良好的习惯是清理之前可能残留的选择集和选择条件。这确保了脚本的执行结果不受上一次操作的影响,提高了脚本的可重复性和可靠性。\n\n```python\nSSProcess.clearSelection() # 清除脚本选择集中的所有对象\nSSProcess.clearSelectCondition() # 清除之前设置的选择条件\n```\n\n`clearSelection()` 会清空 `selGeoList`(点线面地物列表)和 `selNoteList`(注记对象列表),而 `clearSelectCondition()` 则会清空 `searchHelper` 中存储的过滤条件。这两个方法都是无参数的简单调用,为后续操作提供一个干净的开始状态。\n\n\n\n## 步骤三:设置选择条件\n\n选择条件定义了我们要筛选地物的规则。SunvStation 支持三种类型的属性:基本属性、几何特性和扩展属性,它们通过不同的前缀标识符来区分。\n\n### 条件类型说明\n\n| 属性类型 | 前缀标识 | 示例 | 说明 |\n|---------|---------|------|------|\n| 基本属性 | `SSObj_` | `SSObj_Code` | 以 SSObj_ 开头的系统内置属性 |\n| 几何特性 | `< >` | `` | 用尖括号括住的几何判断条件 |\n| 扩展属性 | `[ ]` | `[JG]` | 用方括号括住的自定义扩展属性 |\n\n### 操作符支持\n\n系统提供了丰富的比较操作符,满足各种查询需求:\n\n| 操作符 | 含义 | 示例 |\n|--------|------|------|\n| `==` | 等于 | `SSObj_Code == \"3103013\"` |\n| `>` | 大于 | `SSObj_Length > \"100\"` |\n| `<` | 小于 | `SSObj_Area < \"500\"` |" + }, + { + "slug": "4-shi-yong-ssprocess-guan-li-xuan-ze-ji", + "title": "使用 SSProcess 管理选择集", + "section": "快速入门", + "headings": [ + "SSProcess 架构概览", + "核心组件说明", + "选择集管理基础流程", + "选择集与系统选择集的关系", + "选择条件详解", + "属性类型分类", + "常用基本属性速查", + "操作符说明", + "条件值格式", + "选择集操作核心 API", + "初始化与清理", + "执行查询", + "读取对象属性", + "修改对象属性", + "同步到系统选择集", + "完整示例:批量修改对象属性", + "高级功能:选择集打散操作", + "选择集管理最佳实践", + "性能优化建议", + "错误处理", + "常见问题排查", + "下一步学习路径" + ], + "content": "本页面将引导初学者了解如何使用 SSProcess 管理和操作地理对象的选择集。选择集是地理信息系统中的核心概念,它允许您针对一组特定的对象执行批量操作,如属性修改、坐标编辑、数据导出等。SSProcess 提供了完整的选择集管理 API,支持基于条件的复杂查询、属性读写和系统同步等功能。\n\n在学习本页内容后,建议按照以下路径继续深入:\n- [第一个脚本:查询地物属性](3-di-ge-jiao-ben-cha-xun-di-wu-shu-xing) — 了解属性查询的基础用法\n- [清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji) — 深入学习选择集的生命周期管理\n- [设置选择条件](12-she-zhi-xuan-ze-tiao-jian) — 掌握复杂条件查询技巧\n\n## SSProcess 架构概览\n\nSSProcess 采用 **Mixin 设计模式** 将不同功能模块化,选择集管理功能位于 `SelectionMixin` 中。这种架构使得代码职责清晰、易于维护和扩展。`SSProcessManager` 类通过多重继承组合了选择集、地理编辑、项目管理、日志和进度等多个功能模块,最终导出全局单例 `SSProcess` 供脚本直接使用。\n\n```mermaid\nclassDiagram\n class SSProcessManager {\n +workspace: WorkSpace\n +map: ScaleMap\n +selGeoList: GeoBaseList\n +selNoteList: GeoBaseList\n +searchHelper: SSearchHelper\n +objBaseAttr: ObjBaseAttr\n +clearSelection()\n +setSelectCondition(name, mode, value)\n +selectFilter()\n +getSelGeoValue(index, fieldName)\n +setSelGeoValue(index, fieldName, value)\n +updateSysSelection(mode)\n }\n \n class SelectionMixin {\n <>\n +clearSelection()\n +clearSelectCondition()\n +setSelectCondition()\n +selectFilter()\n +getSelGeoCount()\n +getSelNoteCount()\n +getSelGeoValue()\n +setSelGeoValue()\n +updateSysSelection()\n +resetSelGeoByCode()\n +explodeSelectionObj()\n }\n \n class GeoEditMixin {\n <>\n +createDefaultGeoBase()\n +explodeGeoObject()\n }\n \n class LogMixin {\n <>\n +set_logger()\n +log_error_msg()\n }\n \n class ProgressMixin {\n <>\n +startProgress()\n +stepProgress()\n +closeProgress()\n }\n \n class ProjectMixin {\n <>\n +getCurrentMap()\n +getSysSelGeoList()\n }\n \n SSProcessManager *-- SelectionMixin\n SSProcessManager *-- GeoEditMixin\n SSProcessManager *-- LogMixin\n SSProcessManager *-- ProgressMixin\n " + }, + { + "slug": "5-yun-xing-nei-zhi-shi-li-jiao-ben", + "title": "运行内置示例脚本", + "section": "快速入门", + "headings": [ + "示例脚本架构概览", + "脚本运行方式", + "方法一:直接执行模块", + "方法二:从Python脚本导入", + "示例脚本详解", + "阶段一:初始化与筛选", + "阶段二:属性字段列表", + "阶段三:读取并显示原始属性", + "阶段四:批量修改属性", + "阶段五:验证修改结果", + "注意事项与最佳实践", + "运行前准备", + "修改建议", + "学习价值", + "下一步学习" + ], + "content": "sunvpy提供了一个内置的示例脚本,帮助初学者快速理解如何使用SSProcess进行地物查询、属性读取和修改操作。这个示例脚本位于PySSProcess模块的`__main__`代码块中,展示了完整的数据处理工作流程,从筛选对象到修改属性再到验证结果的全部过程。\n\n\n\n## 示例脚本架构概览\n\n内置示例脚本通过一个连贯的演示,将之前学习的选择集管理和属性操作知识整合在一起。该脚本展示了如何在SunvStation环境中执行典型的批量数据处理任务:筛选特定编码的地物对象、查看其属性信息、批量修改多个属性字段,并最终验证修改结果。\n\n```mermaid\ngraph TB\n A[脚本执行入口] --> B[初始化阶段
清理选择集与条件]\n B --> C[筛选阶段
按编码过滤地物]\n C --> D[读取阶段
遍历并显示原始属性]\n D --> E[修改阶段
批量更新属性值]\n E --> F[验证阶段
显示修改后属性]\n\n B --> B1[clearSelection
清空选择集]\n B --> B2[clearSelectCondition
清空筛选条件]\n\n C --> C1[setSelectCondition
设置编码条件]\n C --> C2[selectFilter
执行查询]\n\n D --> D1[getSelGeoCount
获取对象数量]\n D --> D2[getSelGeoValue
读取属性值]\n\n E --> E1[基本属性修改
ID/线型/颜色等]\n E --> E2[扩展属性修改
#91;JG#93;,#91;CS#93;等]\n\n F --> F1[二次遍历对象]\n F --> F2[对比显示结果]\n```\n\n这个流程图清晰地展示了脚本的四个主要阶段:初始化、筛选、修改和验证。每个阶段都对应一组核心API调用,形成了一个完整的数据处理闭环。\n\n\n\n## 脚本运行方式\n\n### 方法一:直接执行模块\n\n在Windows命令行中,通过Python解释器直接执行PySSProcess模块文件:\n\n```cmd\npython D:\\1SunvStationDev\\sunvstation-release\\build\\bin\\Release\\script\\python313\\Lib\\site-packages\\sunvpy\\PySSProcess.py\n```\n\n这种方式的优点是简单直接,无需额外代码即可运行示例。\n\n### 方法二:从Python脚本导入\n\n创建一个Python脚本文件(如`run_example.py`),通过导入执行:\n\n```python\nimport sunvpy.PySSProcess\n```\n\n这种方法更加灵活,可以在执行前后添加自己的代码逻辑。\n\n\n\n## 示例脚本详解\n\n### 阶段一:初始化与筛选\n\n脚本首先清理环境并建立筛选条件,确保操作的准确性和可重复性。\n\n```python\nSSProcess.clearSelection() # 清除之前的选择集\nSSProcess.clearSelectCondition() # 清除之前的筛选条件\nSSProcess.setSelectCondition(\"SSObj_Code\", \"==\", \"3103013\") # 按编码筛选\nSSProcess.selectFilter() # 执行查询\nprint(f\"选择集中的点线面对象数量: {SSProcess.getSelGeoCount()}\")\n```\n\n这几行代码完成了所有准备工作。`3103013`是示例使用的地物编码,在实际运行前应替换为当前地图中实际存在的编码值。\n\n\n\n### 阶段二:属性字段列表\n\n脚本定义了一个包含35个属性字段的列表,涵盖了基本属性、几何特性和扩展属性:\n\n```python\nfields = [\n \"SSObj_ID\", \"SSObj_Code\", \"SSObj_LayerName\", \"SSObj_Type\", \"SSObj_Color\",\n \"SSObj_LineType\", \"SSObj_LineWidth\", \"SSObj_Name\", \"SSObj_Byname\", \"SSObj_Angle\",\n \"SSObj_DataMark\", \"SSObj_CreateTime\", \"SSObj_ModifyTime\", \"SSObj_ExplodeStatus\",\n \"SSObj_FontWidth\", \"SSObj_Font" + }, + { + "slug": "6-sunvstation-xi-tong-jia-gou", + "title": "SunvStation 系统架构", + "section": "核心概念与架构", + "headings": [ + "整体架构概览", + "架构层次说明", + "核心组件详解", + "SWIG 封装层", + "SSProcessManager 核心管理类", + "Mixin 设计模式", + "属性管理系统", + "模块架构与职责", + "核心模块", + "功能域划分", + "设计模式与架构特性", + "Mixin 设计模式", + "单例模式", + "抽象基类模式", + "依赖注入模式", + "技术栈与依赖", + "SWIG 封装技术", + "Python 类型提示", + "抽象基类(ABC)", + "数据流与交互", + "初始化流程", + "操作流程", + "缓存管理", + "推荐学习路径" + ], + "content": "本文档从架构层面阐述 SunvStation 系统的设计理念、核心组件及其交互关系,帮助开发者理解系统的整体结构,为深入学习和二次开发奠定基础。\n\n## 整体架构概览\n\nSunvStation 采用分层架构设计,将 C++ 核心能力、Python 接口封装和业务逻辑管理清晰分离,形成高内聚、低耦合的系统结构。整个系统围绕 SSProcessManager 核心管理类展开,通过 Mixin 设计模式将功能模块化组合,同时借助 SWIG 技术实现 C++ 与 Python 的无缝集成。\n\n\n\n```mermaid\ngraph TB\n subgraph \"应用层 Python 业务逻辑\"\n SSProcess[SSProcessManager
核心管理类]\n \n subgraph \"Mixin 功能模块\"\n SelectionM[SelectionMixin
选择集操作]\n GeoEditM[GeoEditMixin
地理对象编辑]\n ProjectM[ProjectMixin
项目管理]\n LogM[LogMixin
日志记录]\n ProgressM[ProgressMixin
进度管理]\n end\n \n ObjBase[ObjBaseAttr
属性管理器]\n end\n \n subgraph \"接口层 SWIG 封装\"\n Core[PySSCore
核心类型与工作空间]\n Database[PySSDatabase
数据库操作]\n Map[PySSMap
地图与数据集]\n DataSource[PySSDataSource
数据源访问]\n View[PySSView
视图控制]\n DataX[PySSDataX
数据交换]\n Check[PySSCheck
数据检查]\n Math[PySSMath
数学计算]\n Widget[PySSWidget
UI组件]\n end\n \n subgraph \"实现层 C++ 核心库\"\n CoreDL[_PySSCore.pyd]\n DatabaseDL[_PySSDatabase.pyd]\n MapDL[_PySSMap.pyd]\n DataSourceDL[_PySSDataSource.pyd]\n ViewDL[_PySSView.pyd]\n DataXDL[_PySSDataX.pyd]\n CheckDL[_PySSCheck.pyd]\n MathDL[_PySSMath.pyd]\n WidgetDL[_PySSWidget.pyd]\n end\n \n SSProcess -.->|继承| SelectionM\n SSProcess -.->|继承| GeoEditM\n SSProcess -.->|继承| ProjectM\n SSProcess -.->|继承| LogM\n SSProcess -.->|继承| ProgressM\n SSProcess -->|使用| ObjBase\n \n SelectionM -->|调用| Core\n SelectionM -->|调用| DataSource\n GeoEditM -->|调用| Core\n GeoEditM -->|调用| Database\n ProjectM -->|调用| Core\n ProjectM -->|调用| Map\n LogM -.->|回调| Widget\n ProgressM -->|调用| Widget\n \n Core -->|加载| CoreDL\n Database -->|加载| DatabaseDL\n Map -->|加载| MapDL\n DataSource -->|加载| DataSourceDL\n View -->|加载| ViewDL\n DataX -->|加载| DataXDL\n Check -->|加载| CheckDL\n Math -->" + }, + { + "slug": "7-swig-feng-zhuang-ji-zhi-shuo-ming", + "title": "SWIG 封装机制说明", + "section": "核心概念与架构", + "headings": [ + "SWIG 封装架构概览", + "双层架构交互流程", + "代理对象机制", + "核心代理类结构", + "内存所有权管理", + "内存所有权状态表", + "非动态属性限制机制", + "迭代器支持与集合类型", + "类型转换系统", + "类型转换关系图", + "模块组织结构", + "模块功能对照表", + "与 Python 生态的集成", + "封装机制与 Mixin 设计的协同", + "架构层次关系图", + "性能考虑与优化建议", + "调试与问题排查", + "下一步学习" + ], + "content": "本文档详细说明 sunvpy 库中使用的 SWIG(Simplified Wrapper and Interface Generator)封装机制,阐述 Python 接口如何通过 SWIG 与 C++ 核心库进行交互。这种封装机制使开发者能够以 Pythonic 的方式调用高性能的 C++ 地理信息系统功能,同时保持接近原生 C++ 的执行效率。理解这一机制对于高级功能开发、性能优化和问题调试具有重要意义。\n\n\n\n## SWIG 封装架构概览\n\nsunvpy 采用双层架构设计实现 SWIG 封装:顶层是 Python 代理类,底层是 C++ 扩展动态链接库。每个功能模块都对应一个模块对,例如 PySSCore.py(Python 接口层)和 _PySSCore.pyd(C++ 实现层)。SWIG 4.4.0 版本自动生成了这些 Python 代理文件,将复杂的 C++ 对象模型映射为 Python 类和函数。Python 代码通过这些代理类调用底层 C++ 方法,代理类负责参数类型转换、异常处理和内存管理协调。这种设计既保持了 Python 的易用性,又充分利用了 C++ 的计算性能,特别适合地理信息系统中的大规模空间数据处理需求。\n\n\n\n### 双层架构交互流程\n\n```mermaid\nsequenceDiagram\n participant User as 用户 Python 代码\n participant Proxy as Python 代理类
(PySS*.py)\n participant Module as C++ 扩展模块
(_PySS*.pyd)\n participant Core as C++ 核心库\n \n User->>Proxy: geo = GeoBase()\n Proxy->>Module: new_GeoBase(*args)\n Module->>Core: 创建 C++ 对象\n Core-->>Module: 返回 C++ 指针\n Module-->>Proxy: 返回代理对象引用\n Proxy->>Proxy: 设置 thisown = True\n Proxy-->>User: 返回 GeoBase 实例\n \n User->>Proxy: geo.getId()\n Proxy->>Module: GeoBase_getId(self)\n Module->>Core: 调用 C++ 方法\n Core-->>Module: 返回 ID 值\n Module-->>Proxy: 返回 Python 值\n Proxy-->>User: 返回 ID\n```\n\n此序列图展示了从 Python 代码到 C++ 核心库的完整调用路径。代理类作为桥梁,将 Python 对象操作转换为底层 C++ 方法调用,实现了无缝的语言边界穿越。SWIG 自动生成的代理代码处理了所有底层细节,包括指针传递、类型转换和引用计数。\n\n\n\n## 代理对象机制\n\n每个 SWIG 封装的类都继承自特定的元类系统,确保对象行为的一致性。代理类包含几个关键组件:`this` 属性持有 C++ 对象的指针引用,`thisown` 属性控制内存所有权,`__swig_repr__` 方法提供调试信息,以及一系列特殊方法支持 Python 语义。例如 GeoBase 类在 [PySSCore.py](PySSCore.py#L1930) 中定义,其构造函数通过 `_PySSCore.GeoBase_swiginit` 初始化,该方法将新创建的 C++ 对象指针绑定到 Python 代理实例。这种设计使得 Python 代码可以像操作原生对象一样操作 C++ 对象,而无需关心底层实现细节。\n\n\n\n### 核心代理类结构\n\n```mermaid\nclassDiagram\n class SwigPyObject {\n +this: C++ 指针\n +own(): 设置所有权\n +thisown: 所有权标志\n }\n \n class ProxyClass {\n +thisown: property\n +__repr__(): 调试用\n +__swig_destroy__(): 析构函数\n +业务方法(): 转发到 C++\n }\n \n class _SwigNonDynamicMeta {\n <>\n +__setattr__: 限制动态属性\n " + }, + { + "slug": "8-gong-zuo-kong-jian-yu-di-tu-gai-nian", + "title": "工作空间与地图概念", + "section": "核心概念与架构", + "headings": [ + "系统架构概览", + "工作空间", + "核心特性", + "获取工作空间实例", + "主要职责", + "便捷访问方法", + "地图", + "地图对象定义", + "地图组成结构", + "图层管理", + "数据源管理", + "地物搜索与检索", + "撤销与重做", + "工作空间与地图的关系", + "访问当前地图", + "地图切换", + "系统路径管理", + "路径类型表", + "使用示例", + "符号表管理", + "地图图幅管理", + "最佳实践", + "1. 始终检查空引用", + "2. 使用便捷方法优先", + "3. 批量操作使用撤销标记", + "4. 及时释放资源", + "5. 尊重图层锁定状态", + "与其他文档的关联" + ], + "content": "SunvStation 地理信息系统采用分层架构设计,其中工作空间与地图是理解整个系统的核心概念。本页将详细阐述这两个核心组件的职责、相互关系以及在 Python 脚本中的使用方式。掌握这些概念是高效使用 sunvpy 库进行二次开发的基础。\n\n## 系统架构概览\n\nSunvStation 系统采用单例模式的工作空间作为顶级容器,管理所有地图实例和系统资源。工作空间通过 `getInstance()` 方法获取全局唯一实例,确保整个应用程序共享同一资源上下文。地图对象则表示特定比例尺的地理数据视图,包含图层、地物、数据源等子组件。\n\n```mermaid\ngraph TB\n subgraph \"应用程序级别\"\n WS[WorkSpace 工作空间
单例实例]\n end\n \n subgraph \"地图级别\"\n SM1[ScaleMap 地图1
比例尺1:500]\n SM2[ScaleMap 地图2
比例尺1:1000]\n end\n \n subgraph \"SM1 组件\"\n L1[图层1]\n L2[图层2]\n DS1[数据源EPS]\n end\n \n subgraph \"SM2 组件\"\n L3[图层3]\n L4[图层4]\n DS2[数据源EPS]\n end\n \n subgraph \"Python 脚本\"\n PSS[SSProcessManager
SSProcess全局实例]\n end\n \n PSS --> |WorkSpace.getInstance| WS\n PSS --> |getCurrentScaleMap| SM1\n WS --> |管理多个| SM1\n WS --> |管理多个| SM2\n SM1 --> |包含| L1\n SM1 --> |包含| L2\n SM1 --> |引用| DS1\n SM2 --> |包含| L3\n SM2 --> |包含| L4\n SM2 --> |引用| DS2\n```\n\n上图展示了系统的核心架构。工作空间作为顶级容器,管理所有地图实例。每个地图对象包含一组图层和关联的数据源。Python 脚本通过 `SSProcess` 全局实例访问工作空间和当前地图,实现与系统资源的交互。\n\n\n\n## 工作空间\n\n工作空间是 SunvStation 系统的全局单例对象,负责管理整个应用程序的资源和上下文。它提供统一的入口点来访问当前活动的地图、配置信息和系统路径。\n\n### 核心特性\n\n工作空间采用单例设计模式,确保整个应用程序中只有一个工作空间实例。这种设计有以下优势:\n\n- **资源统一管理**:所有地图实例和共享资源由工作空间统一分配和协调\n- **全局状态一致性**:确保不同模块访问的系统状态保持一致\n- **生命周期控制**:工作空间控制整个应用程序的生命周期,包括资源的创建和销毁\n\n### 获取工作空间实例\n\n在 Python 脚本中,通过 `WorkSpace.getInstance()` 方法获取工作空间实例。`SSProcessManager` 在初始化时会自动获取工作空间实例并存储为成员变量 `self.workspace`。\n\n\n\n### 主要职责\n\n工作空间的核心职责包括:\n\n- **地图管理**:维护所有打开的地图实例,提供获取当前活动地图的接口\n- **资源协调**:协调地图之间的资源共享和互斥访问\n- **全局配置**:存储和管理全局配置信息\n- **系统路径**:提供系统级路径信息(配置路径、模板路径、脚本路径等)\n\n### 便捷访问方法\n\n`ProjectMixin` 提供了便捷方法 `getWorkspace()` 来获取工作空间实例:\n\n\n\n## 地图\n\n地图对象(`ScaleMap`)表示特定比例尺的地理数据视图,是工作空间中最核心的可视化和编辑单元。每个地图包含一组图层、地物对象和关联的数据源。\n\n### 地图对象定义\n\n`ScaleMap` 类定义在 `PySSMap` 模块中,通过 SWIG 从 C++ 封装而来。它是地图数据的主要容器和管理者。\n\n\n\n### 地图组成结构\n\n地图由以下核心组件构成:\n\n| 组件类型 | 职责 | Python 类型 |\n|---------|------|-----------|\n| 图层 | 组织和管理地物对象,控制可见性和锁定状态 | Layer |\n| 数据源 | 存储地物数据的底层存储(EPS 数" + }, + { + "slug": "9-mixin-she-ji-mo-shi", + "title": "Mixin 设计模式", + "section": "核心概念与架构", + "headings": [ + "Mixin 架构概览", + "Mixin 组合关系", + "功能模块详解", + "日志记录模块(LogMixin)", + "进度显示模块(ProgressMixin)", + "地理编辑模块(GeoEditMixin)", + "项目管理模块(ProjectMixin)", + "选择集管理模块(SelectionMixin)", + "共享状态管理", + "Mixin 模式对比", + "设计模式应用实例", + "扩展与定制", + "最佳实践与注意事项", + "相关文档" + ], + "content": "Mixin 设计模式是一种通过**多重继承**实现代码复用的技术,它将不同功能模块拆分为独立的可复用单元,并在运行时动态组合成完整的类实例。在 SunvStation 地理信息系统开发中,Mixin 模式被用于构建 SSProcessManager 核心类,将选择集管理、地理对象编辑、进度显示、日志记录和项目操作等功能模块化,实现了高度解耦和灵活复用的架构设计。该模式的核心优势在于:通过组合而非继承来扩展功能,避免了复杂的类层次结构,同时保持了代码的清晰性和可维护性。\n\n## Mixin 架构概览\n\nSunvStation 的 Mixin 架构采用**抽象基类(ABC)定义接口 + Mixin 类实现功能**的双重设计模式。每个功能领域都有对应的 `*Aware` 抽象基类定义契约,以及 `*Mixin` 实现类提供具体实现。SSProcessManager 作为最终的组合类,通过多重继承将所有 Mixin 组合成一个功能完整的管理器实例。\n\n```mermaid\nclassDiagram\n class SSProcessManager {\n +WorkSpace workspace\n +ScaleMap map\n +GlobalOptions global_options\n +ObjBaseAttr objBaseAttr\n +GeoBaseList selGeoList\n +GeoBaseList selNoteList\n +SSearchHelper searchHelper\n +GeoBase curSelGeo\n +StringArray curSelGeoFields\n +StringArray curSelGeoValues\n +GeoBaseList bufferObjList\n +list newBufferObjList\n +tuple curNewObj\n +bool enable_progress\n +Progress progress\n +Logger logger\n }\n \n class LogAware {\n <>\n +set_logger(Logger) abstract\n +log_error_msg(str) abstract\n }\n \n class LogMixin {\n +Logger logger\n +set_logger(Logger)\n +log_error_msg(str)\n }\n \n class ProgressAware {\n <>\n +disable_progress() abstract\n +startProgress(str, int) abstract\n +stepProgress(str) abstract\n +closeProgress() abstract\n }\n \n class ProgressMixin {\n +bool enable_progress\n +Progress progress\n +disable_progress()\n +startProgress(str, int)\n +stepProgress(str)\n +closeProgress()\n }\n \n class GeoEditAware {\n <>\n +createDefaultGeoBase(int, Dataset) abstract\n +getPolar(Point3D, Point3D) abstract\n +createNewObjByCode(int) abstract\n +addNewObjPoint(float, float, float, int, str) abstract\n +saveBufferObjToDatabase() abstract\n +updateRequest() abstract\n }\n \n class GeoEditMixin {\n +cre" + }, + { + "slug": "10-c-kuo-zhan-mo-kuai-yu-python-jie-kou", + "title": "C++ 扩展模块与 Python 接口", + "section": "核心概念与架构", + "headings": [ + "架构概览", + "SWIG 封装机制", + "SWIG 自动生成特征", + "模块导入机制", + "C++ 扩展模块清单", + "Python 类型封装", + "内存管理机制", + "动态属性控制", + "迭代器支持", + "高层架构设计", + "SSProcessManager 类", + "Mixin 类层次", + "全局单例模式", + "数据类型映射", + "变体类型系统", + "调用路径分析", + "错误处理与异常机制", + "性能优化策略", + "延迟加载设计", + "对象缓存机制", + "扩展开发指南", + "理解模块依赖关系", + "类型注解规范", + "学习路径建议", + "总结" + ], + "content": "本文档深入解析 sunvpy 库的 C++ 扩展模块架构、SWIG 封装机制以及 Python 接口设计模式,帮助高级开发者理解系统的底层实现原理和技术架构。\n\n\n\n## 架构概览\n\nsunvpy 采用了**三层架构设计**,将底层 C++ 功能无缝集成到 Python 生态系统中。这种架构既保证了核心功能的高性能执行,又提供了灵活易用的 Python 接口。\n\n\n\n```mermaid\ngraph TB\n subgraph \"Python 应用层\"\n A[SSProcessManager
高级API]\n B[Mixin 类集合
SelectionMixin, GeoEditMixin等]\n end\n \n subgraph \"SWIG 封装层\"\n C[PySSCore.py]\n D[PySSMap.py]\n E[PySSDatabase.py]\n F[其他 PySS*.py 模块]\n end\n \n subgraph \"C++ 扩展层\"\n G[_PySSCore.pyd]\n H[_PySSMap.pyd]\n I[_PySSDatabase.pyd]\n J[其他 _PySS*.pyd 模块]\n end\n \n subgraph \"原生 C++ 核心\"\n K[Core C++ 类库]\n end\n \n A --> B\n B --> C\n B --> D\n B --> E\n B --> F\n C --> G\n D --> H\n E --> I\n F --> J\n G --> K\n H --> K\n I --> K\n J --> K\n```\n\n## SWIG 封装机制\n\nsunvpy 使用 **SWIG 4.4.0** 作为 C++ 到 Python 的桥接工具,自动生成 Python 包装代码。每个功能模块对应两个文件:`.pyd` 二进制扩展和 `.py` 接口封装。\n\n\n\n### SWIG 自动生成特征\n\n所有 SWIG 生成的 Python 模块都包含标准的头注释,明确标识其自动生成性质:\n\n```python\n# This file was automatically generated by SWIG (https://www.swig.org).\n# Version 4.4.0\n#\n# Do not make changes to this file unless you know what you are doing - modify\n# the SWIG interface file instead.\n```\n\n\n\n### 模块导入机制\n\nSWIG 生成的模块采用条件导入策略,确保在不同上下文中正确加载底层 C++ 扩展:\n\n```python\nfrom sys import version_info as _swig_python_version_info\n# Import the low-level C/C++ module\nif getattr(globals().get(\"__spec__\"), \"parent\", None) or __package__ or \".\" in __name__:\n from . import _PySSCore\nelse:\n import _PySSCore\n```\n\n\n\n这种设计支持模块的独立运行和包内导入两种场景。\n\n## C++ 扩展模块清单\n\nsunvpy 包含 10 个 C++ 扩展模块,每个模块负责特定的功能域:\n\n| 模块名称 | C++ 扩展文件 | SWIG 封装文件 | 功能描述 |\n|---------|-------------|--------------|---------|\n| Core | _PySSCore.pyd | PySSCore.py | 核心数据结构、基础类型、字段约束 |\n| Map | _PySSMap.pyd | PySSMap.py | 地图操作、工作空间、SDL 接口 |\n| Database | _PySSDatabase.pyd | PySSDatabase.py | 数据库访问、事务管理 |\n| DataSource | _PySSDataSource.pyd | PySSDataSource.py | 数据源管理、数据集操作 |\n| Widget | _PySSWidget.pyd | PySS" + }, + { + "slug": "11-qing-chu-yu-chu-shi-hua-xuan-ze-ji", + "title": "清除与初始化选择集", + "section": "选择集与查询", + "headings": [ + "选择集基本概念", + "选择集的自动初始化", + "清除脚本选择集", + "清除选择条件", + "清除系统选择集", + "典型使用场景", + "场景一:开始新的查询操作", + "场景二:脚本结束前的清理", + "场景三:条件筛选后重试", + "三种清除方法的对比", + "选择集状态检查", + "完整工作流程示例", + "常见问题与注意事项", + "学习路径建议" + ], + "content": "本页面介绍 SunvStation Python 脚本中选择集的初始化机制与清除操作。选择集是脚本操作地理对象的核心容器,掌握其初始化和清除方法对于编写稳定的数据处理脚本至关重要。\n\n## 选择集基本概念\n\n在 SunvStation 脚本环境中,存在两种类型的选择集:**脚本选择集**和**系统选择集**。脚本选择集由 `SSProcessManager` 在内存中维护,用于批量操作地理对象;系统选择集则是地图界面中当前选中的对象集合,直接影响地图显示效果。两者可以相互同步,但具有不同的生命周期和管理方式。\n\n脚本选择集由两个核心列表组成:`selGeoList` 存储点、线、面对象,`selNoteList` 存储注记对象。这种分离设计便于对不同类型的地理对象进行差异化管理。\n\n\n\n## 选择集的自动初始化\n\n当导入 `sunvpy` 模块或创建 `SSProcessManager` 实例时,选择集会自动完成初始化。初始化过程不需要开发者手动干预,确保脚本一开始就拥有可用的选择集容器。\n\n自动初始化包含以下步骤:获取当前工作空间实例、获取当前比例尺地图、创建地物和注记的空列表、初始化搜索助手、配置数据源和数据集列表。\n\n```mermaid\nflowchart LR\n A[模块导入] --> B[创建 SSProcessManager 实例]\n B --> C[获取工作空间 WorkSpace]\n C --> D[获取当前地图 ScaleMap]\n D --> E[初始化选择集容器]\n E --> F[selGeoList = GeoBaseList]\n E --> G[selNoteList = GeoBaseList]\n E --> H[searchHelper = SSearchHelper]\n H --> I[配置数据源和数据集]\n I --> J[初始化完成,准备就绪]\n```\n\n\n\n**关键初始化代码**展示了这一过程的实现:\n\n```python\n# 脚本选择集容器(在 __init__ 中自动创建)\nself.selGeoList = GeoBaseList() # 点线面对象列表\nself.selNoteList = GeoBaseList() # 注记对象列表\nself.searchHelper = SSearchHelper() # 搜索助手\n```\n\n\n\n## 清除脚本选择集\n\n`clearSelection()` 方法用于清空脚本选择集中的所有对象。该方法会同时清除地物列表和注记列表,将选择集恢复到初始空状态。这个操作不会影响系统选择集(地图上显示的选中状态),也不会影响数据库中的原始数据。\n\n```python\n# 清除脚本选择集中的所有地物和注记\nSSProcess.clearSelection()\n```\n\n\n\n**清除操作的实际效果**:调用 `clearSelection()` 后,`selGeoList` 和 `selNoteList` 都会变为空列表,后续的选择查询和遍历操作将基于空集进行。这是开启新一轮选择操作前的标准准备步骤。\n\n## 清除选择条件\n\n`clearSelectCondition()` 方法专门用于清除选择条件,而不影响选择集对象本身。选择条件由 `searchHelper` 内部维护,包含用于过滤查询的各种规则。清除条件后,新的查询将不再受之前设置条件的约束。\n\n```python\n# 清除之前设置的所有选择条件\nSSProcess.clearSelectCondition()\n```\n\n\n\n选择条件与选择集对象的区别:选择条件是\"筛选规则\",选择集对象是\"筛选结果\"。`clearSelectCondition()` 清除规则,保留结果;`clearSelection()` 清除结果,保留规则。在实际脚本中,通常先清除条件,再设置新条件,最后执行查询。\n\n## 清除系统选择集\n\n`clearSysSelection()` 方法操作的是地图系统选择集,会移除地图界面上所有高亮显示的选中对象。这直接影响地图的视觉效果,使地图恢复到无选中状态。\n\n```python\n# 清除地图系统选择集(移除地图上的高亮显示)\nSSProcess.clearSysSelection()\n```\n\n\n\n**脚本选择集与系统选择集的协同**:在需要完全重置选择状态的场景下,通常连续调用三种清除方法:先清除脚本选择集对象,再清除选择条件,最后清除系统选择集的高亮显示。\n\n## 典型使用场景\n\n### 场景一:开始新的查询操作\n\n在执行新一轮数据查询前,需要重置选择集状态,确保不受到之前查询结果的干扰。\n\n```mermaid\nf" + }, + { + "slug": "12-she-zhi-xuan-ze-tiao-jian", + "title": "设置选择条件", + "section": "选择集与查询", + "headings": [ + "核心方法概述", + "条件名称类型", + "基本属性", + "几何特性", + "扩展属性", + "操作模式", + "基本比较操作符", + "字符串匹配操作符", + "特殊操作符", + "条件值方式", + "单值方式", + "多值方式", + "区间方式", + "条件设置流程", + "基础使用示例", + "示例一:精确匹配查询", + "示例二:组合条件查询", + "高级使用示例", + "示例三:模糊匹配与扩展属性", + "示例四:几何特性查询", + "示例五:区间数值查询", + "示例六:多值匹配查询", + "条件设置的注意事项", + "条件的累积特性", + "条件与查询的分离", + "值格式的正确使用", + "扩展属性的大小写敏感性", + "典型应用场景", + "场景一:按图层批量处理", + "场景二:数据质量检查", + "场景三:按时间范围查询", + "场景四:按类型批量查询", + "条件设置的性能考虑", + "多条件的查询效率", + "避免过度复杂的条件", + "下一步学习" + ], + "content": "本页面介绍 SunvStation Python 脚本中设置选择条件的方法。选择条件是过滤地理对象的查询规则,通过组合不同条件可以精确筛选出符合特定要求的地物对象。掌握条件设置的语法和技巧,能够显著提升数据处理脚本的效率和准确性。\n\n\n\n## 核心方法概述\n\n`setSelectCondition()` 方法是设置选择条件的主要接口。该方法将指定的条件添加到脚本选择集的查询规则中,可以多次调用以构建复合查询条件。条件由三个部分组成:条件名称、操作模式和条件值,三者组合形成一个完整的查询表达式。\n\n```python\nSSProcess.setSelectCondition(conditionName, operateMode, conditionValue)\n```\n\n\n\n**方法的底层实现**通过调用 `searchHelper.addCondition()` 将条件添加到内部维护的条件列表中。这些条件在调用 `selectFilter()` 时被实际执行,从而过滤出符合所有条件的地理对象。\n\n\n\n## 条件名称类型\n\n选择条件的名称(conditionName)决定了查询的目标属性。系统支持三种类型的条件名称:基本属性、几何特性和扩展属性,每种类型有不同的前缀标识规则。\n\n\n\n### 基本属性\n\n以 `SSObj_` 开头的属性称为基本属性,这些是地理对象的内置属性,涵盖对象的标识、外观、几何信息等。基本属性是最常用的查询条件,覆盖了大多数常规筛选需求。\n\n\n\n**常用基本属性列表**:\n\n| 属性名称 | 说明 | 示例值 |\n|---------|------|--------|\n| `SSObj_ID` | 对象唯一标识 | \"1001\" |\n| `SSObj_Code` | 编码 | \"3103013\" |\n| `SSObj_LayerName` | 层名 | \"Default_A\" |\n| `SSObj_Type` | 对象类型 | \"POINT\", \"LINE\", \"AREA\", \"NOTE\" |\n| `SSObj_Color` | 颜色 | \"RGB(255,0,0)\", \"16777215\" |\n| `SSObj_Name` | 对象名称 | \"建筑物1\" |\n| `SSObj_Area` | 面积 | \"150.5\" |\n| `SSObj_Length` | 长度 | \"230.8\" |\n| `SSObj_PointCount` | 点数 | \"1\", \"1,2,4\" |\n| `SSObj_X` / `SSObj_Y` / `SSObj_Z` | 坐标 | \"12345.67\", \"2345.89\", \"0\" |\n| `SSObj_CreateTime` | 创建时间 | \"2023-07-01 12:00:00\" |\n| `SSObj_ModifyTime` | 修改时间 | \"2023-08-15 09:30:00\" |\n\n\n\n**注记对象特有属性**:\n\n| 属性名称 | 说明 |\n|---------|------|\n| `SSObj_FontWidth` | 字宽 |\n| `SSObj_FontHeight` | 字高 |\n| `SSObj_FontName` | 字体名 |\n| `SSObj_FontClass` | 注记分类号 |\n| `SSObj_FontAlignment` | 对齐方式 |\n| `SSObj_FontString` | 注记内容 |\n\n\n\n### 几何特性\n\n使用尖括号 `<>` 括住的属性称为几何特性,用于查询对象的拓扑或几何状态特征。这些条件不直接比较属性值,而是判断对象是否满足特定的几何条件。\n\n\n\n**常用几何特性**:\n\n| 特性名称 | 说明 | 常用操作符 |\n|---------|------|----------|\n| `` | 重叠 | \"==\" |\n| `` | 封闭 | \"==\" |\n\n\n\n几何特性通常使用 `\"==\"` 操作符,条件值为 `\"True\"` 或 `\"False\"`,用于筛选出具有特定拓扑状态的对象。\n\n\n\n### 扩展属性\n\n使用方括号 `[]` 括住的属性称为扩展属性,这些是用户自定义的属性字段,存储在对象的扩展属性表中。扩展属性允许根据业务需求灵活定义查询条件,是数据查询的强大工具。\n\n\n\n**扩展属性示例**:\n\n```python\n# 查询扩展属性名为\"建筑结构\"的对象\nSSProcess.setSelectCondition(\"[建筑结构]\", \"==\", \"砖混\")\n\n# 查询扩展属性为\"层数\"大于10的对象\nSSProcess.setSelectCondition(\"[层数]\", \">" + }, + { + "slug": "13-zhi-xing-guo-lu-cha-xun", + "title": "执行过滤查询", + "section": "选择集与查询", + "headings": [ + "核心方法概述", + "执行流程", + "详细执行步骤", + "步骤一:清理缓存", + "步骤二:获取候选对象", + "步骤三:精确过滤", + "步骤四:结果分类存储", + "完整使用示例", + "基础查询示例", + "多条件复合查询", + "使用多值和区间查询", + "查询前后的选择集状态对比", + "结果处理最佳实践", + "检查查询结果", + "批量处理对象", + "同步到系统选择集", + "常见问题与故障排除", + "问题一:查询结果为空", + "问题二:查询结果不符合预期", + "问题三:进度条不显示", + "问题四:性能问题", + "完整工作流示例", + "与其他方法的协作关系", + "延伸阅读" + ], + "content": "本页面介绍 SunvStation Python 脚本中执行过滤查询的方法。`selectFilter()` 方法是选择集查询的核心执行环节,它根据之前设置的选择条件,从数据源中筛选出符合条件的地理对象,并将结果填充到脚本选择集中。掌握此方法的执行机制和结果处理,是构建高效数据查询脚本的关键。\n\n\n\n## 核心方法概述\n\n`selectFilter()` 方法负责执行实际的选择集过滤操作。该方法内部协调搜索助手 `searchHelper`,通过两阶段查询机制完成对象筛选:首先获取候选对象列表,然后根据完整条件进行精确过滤,最后将结果分类存储到脚本选择集中。\n\n```python\nSSProcess.selectFilter()\n```\n\n\n\n**方法返回值**:该方法无返回值,执行结果通过脚本选择集成员变量 `selGeoList`(点线面对象)和 `selNoteList`(注记对象)提供访问。查询成功后,可以使用 `getSelGeoCount()` 和 `getSelNoteCount()` 获取结果数量,使用 `getSelGeoValue()` 等方法遍历对象属性。\n\n\n\n## 执行流程\n\n过滤查询的执行过程包含四个关键阶段:缓存清理、候选对象获取、精确过滤、结果分类存储。整个流程由进度条模块提供可视化反馈,确保操作透明可控。\n\n```mermaid\nflowchart TD\n A[调用 selectFilter] --> B[清理缓存]\n B --> C[清空 curSelGeoFields]\n C --> D[清空 curSelGeoValues]\n D --> E[执行选择过滤]\n E --> F[创建临时 GeoBaseList]\n F --> G[getFilterObj 获取候选对象]\n G --> H{候选对象非空?}\n H -->|是| I[filterObj 精确过滤]\n H -->|否| J[跳过过滤步骤]\n I --> K[遍历结果列表]\n J --> K\n K --> L{对象类型判断}\n L -->|注记对象| M[添加到 selNoteList]\n L -->|点线面对象| N[添加到 selGeoList]\n M --> O[完成选择集过滤]\n N --> O\n O --> P[关闭进度条]\n```\n\n\n\n**进度反馈机制**:方法执行过程中会调用 `stepProgress()` 方法报告当前进度,包括\"清理缓存\"、\"执行选择过滤\"、\"更新选择集\"、\"完成选择集过滤\"四个阶段。开发者可以通过 `enable_progress` 属性控制是否显示进度条。\n\n\n\n## 详细执行步骤\n\n### 步骤一:清理缓存\n\n执行查询前,方法首先清理属性缓存字段 `curSelGeoFields` 和 `curSelGeoValues`。这两个字符串数组用于存储当前选中对象的属性字段和对应值,清理缓存确保新的查询结果不会受到之前属性访问的干扰。\n\n\n\n### 步骤二:获取候选对象\n\n方法创建临时的 `GeoBaseList` 容器,并调用 `searchHelper.getFilterObj()` 方法。该方法根据 `m_selectConditions` 中存储的选择条件,从当前数据源中获取满足条件的候选对象列表。这一步是初步筛选,可能包含部分不完全符合所有条件的对象。\n\n\n\n### 步骤三:精确过滤\n\n如果候选对象列表非空,方法调用 `searchHelper.filterObj()` 进行精确过滤。这一步对候选对象应用完整的条件规则集合,确保最终结果严格满足所有设置的条件。只有通过精确过滤的对象才会被加入最终的选择集。\n\n\n\n### 步骤四:结果分类存储\n\n最后,方法遍历过滤后的对象列表,根据对象类型将其分类存储:注记对象(`e_Note_Obj`)添加到 `selNoteList`,其他类型的点线面对象添加到 `selGeoList`。这种分离存储便于后续对不同类型对象进行差异化处理。\n\n\n\n## 完整使用示例\n\n以下示例展示了一个完整的过滤查询流程,从条件设置到结果处理的各个步骤。\n\n```mermaid\nflowchart LR\n A[开始查询] --> B[clearSelection
清除旧结果]\n B --> C[clearSelectCondition
清除旧条件]\n C --> D[setSelectCondition
设置查询条件]\n D --> E[selectFilter
执行过滤]\n E --> F{检查结果数" + }, + { + "slug": "14-bian-li-xuan-ze-ji-dui-xiang", + "title": "遍历选择集对象", + "section": "选择集与查询", + "headings": [ + "选择集数据结构概述", + "核心迭代 API 方法", + "基本遍历流程", + "完整工作流示例", + "坐标点遍历", + "扩展属性遍历", + "最佳实践与注意事项", + "应用场景示例", + "下一步学习" + ], + "content": "遍历选择集对象是 SunvStation 自动化脚本中的核心操作,用于批量处理地理对象的属性和几何信息。通过遍历选择集,可以高效地读取、修改、验证或分析大量地理数据,实现数据质量检查、批量属性更新、统计分析等复杂业务逻辑。\n\n## 选择集数据结构概述\n\nSunvStation 的选择集由两个核心列表组成:`selGeoList` 存储点线面等几何对象,`selNoteList` 存储注记对象。这两个列表都是 `GeoBaseList` 类型,支持索引访问和迭代操作。选择集对象通过 `SSProcessManager` 类统一管理,该类通过 `SelectionMixin` 提供了完整的迭代 API。\n\n```mermaid\nflowchart TD\n A[SSProcessManager] --> B[SelectionMixin]\n B --> C[selGeoList
点线面对象列表]\n B --> D[selNoteList
注记对象列表]\n C --> E[GeoBaseList
索引访问]\n D --> E\n E --> F[getSelGeoValue
getSelNoteValue
getSelGeoPoint]\n E --> G[setSelGeoValue
setSelNoteValue]\n F --> H[属性读取循环]\n G --> I[属性修改循环]\n```\n\n选择集对象通常通过两种方式构建:一是通过 `setSelectCondition` 和 `selectFilter` 基于条件过滤生成;二是通过 `updateSysSelection(0)` 从系统地图的选择集中同步。构建完成后,即可使用索引方式遍历处理每个对象。\n\n\n\n## 核心迭代 API 方法\n\n遍历选择集依赖于以下关键方法,这些方法提供了从对象数量统计到具体属性访问的完整功能链。\n\n| 方法名称 | 参数说明 | 返回值 | 功能描述 |\n|---------|---------|--------|---------|\n| `getSelGeoCount()` | 无 | int | 获取选择集中点线面对象的数量 |\n| `getSelNoteCount()` | 无 | int | 获取选择集中注记对象的数量 |\n| `getSelGeoValue(index, fieldName)` | index: 对象索引, fieldName: 属性名称 | str | 获取指定几何对象的属性值 |\n| `getSelNoteValue(index, fieldName)` | index: 对象索引, fieldName: 属性名称 | str | 获取指定注记对象的属性值 |\n| `setSelGeoValue(index, fieldName, value)` | index: 对象索引, fieldName: 属性名称, value: 属性值 | None | 设置指定几何对象的属性值 |\n| `setSelNoteValue(index, fieldName, value)` | index: 对象索引, fieldName: 属性名称, value: 属性值 | None | 设置指定注记对象的属性值 |\n| `getSelGeoPoint(index, pointIndex)` | index: 对象索引, pointIndex: 点索引 | Point | 获取指定几何对象的坐标点 |\n\n`index` 参数从 0 开始,最大值为对象数量减 1。属性名称包括以 `SSObj_` 开头的基本属性(如 `SSObj_Code`、`SSObj_Area`)、以 `<>` 括住的几何特性(如 ``)、以 `[]` 括住的扩展属性(如 `[建筑结构]`)。当索引越界时,`getSelGeoValue` 和 `getSelNoteValue` 返回空字符串,而 `setSelGeoValue` 和 `setSelNoteValue` 则直接返回不执行操作。\n\n\n\n## 基本遍历流程\n\n遍历选择集对象遵循标准的索引循环模式。首先获取对象总数,然后使用 `for` 循环遍历每个索引,在每个迭代中读取或修改对象属性。\n\n```mermaid\nflowchart LR\n A[开始] --> B[获取对象数量
getSelGeoCount / getSelNoteCount]\n B --> C[初始化循环索引 i = 0]\n C --> D{i < 对象数量?}\n D -->|是| E[访问对象属性" + }, + { + "slug": "15-huo-qu-di-wu-shu-xing-zhi", + "title": "获取地物属性值", + "section": "选择集与查询", + "headings": [ + "属性类型与命名规则", + "基本属性", + "几何特性", + "扩展属性", + "核心 API 方法", + "getSelGeoValue 方法", + "getSelNoteValue 方法", + "属性获取流程", + "基本属性读取示例", + "示例 1:读取单个对象的多个属性", + "示例 2:批量读取所有对象的核心属性", + "坐标点属性读取", + "几何特性读取示例", + "扩展属性读取示例", + "读取单个扩展属性", + "读取多个扩展属性", + "获取对象的完整扩展属性列表", + "注记对象属性读取", + "综合应用示例", + "常见问题与解决方案", + "问题 1:属性值返回空字符串", + "问题 2:扩展属性无法读取", + "问题 3:坐标点属性读取失败", + "问题 4:几何特性返回值不是预期的布尔值", + "属性读取性能优化建议", + "建议 1:批量读取多个属性", + "建议 2:避免重复读取", + "建议 3:使用字典存储对象属性", + "下一步学习" + ], + "content": "本文档详细说明如何在 SunvStation Python 脚本中读取地物对象的属性值,涵盖基本属性、几何特性和扩展属性三种类型的属性访问方式。通过掌握这些方法,您可以高效地获取和分析地理对象的各类信息,为后续的数据处理、质量检查和统计分析奠定基础。\n\n## 属性类型与命名规则\n\nSunvStation 系统中,地物属性根据来源和用途分为三类,每类属性使用特定的前缀标识符进行区分。理解这些分类和命名规则是正确读取属性的前提。\n\n```mermaid\nflowchart TD\n A[地物属性] --> B[基本属性 SSObj_]\n A --> C[几何特性 #60; #62;]\n A --> D[扩展属性 #91; #93;]\n \n B --> B1[对象标识
SSObj_ID, SSObj_Code]\n B --> B2[外观属性
SSObj_Color, SSObj_LineType, SSObj_LineWidth]\n B --> B3[名称属性
SSObj_Name, SSObj_Byname, SSObj_LayerName]\n B --> B4[几何参量
SSObj_Area, SSObj_Length, SSObj_PointCount]\n B --> B5[时间属性
SSObj_CreateTime, SSObj_ModifyTime]\n B --> B6[坐标信息
SSObj_X, SSObj_Y, SSObj_Z, SSObj_PointName]\n B --> B7[注记属性
SSObj_FontString, SSObj_FontHeight, SSObj_FontWidth]\n \n C --> C1[拓扑判断
#60;Overlap#62;, #60;Close#62;]\n C --> C2[几何判断
#60;Convex#62;, #60;SelfIntersect#62;]\n \n D --> D1[业务属性
#91;JG#93;, #91;CS#93;, #91;建筑结构#93;]\n D --> D2[自定义属性
#91;自定义字段1#93;, #91;自定义字段2#93;]\n```\n\n### 基本属性\n\n以 `SSObj_` 开头,表示系统内置的地物基本属性,包括对象标识、外观、几何参量、时间戳等。这些属性直接存储在地理对象内部,访问效率最高。\n\n| 属性名称 | 属性说明 | 数据类型 | 适用对象类型 |\n|---------|---------|---------|------------|\n| `SSObj_ID` | 对象唯一标识 | 整数 | 所有类型 |\n| `SSObj_Code` | 地物编码 | 整数 | 所有类型 |\n| `SSObj_LayerName` | 所在图层名 | 字符串 | 所有类型 |\n| `SSObj_Type` | 对象类型 | 字符串(POINT/LINE/AREA/NOTE) | 所有类型 |\n| `SSObj_Color` | 颜色值 | 整数 | 所有类型 |\n| `SSObj_LineType` | 线型 | 整数 | LINE/AREA |\n| `SSObj_LineWidth` | 线宽 | 整数 | LINE/AREA |\n| `SSObj_Name` | 对象名称 | 字符串 | 所有类型 |\n| `SSObj_Byname` | 对象别名 | 字符串 | 所有类型 |\n| `SSObj_Angle` | 旋转角度 | 浮点数 | 所有类型 |\n| `SSObj_ScaleX` | X 方向缩放 | 浮点数 | 所有类型 |\n| `SSObj_ScaleY` | Y 方向缩放 | 浮点数 | 所有类型 |\n| `SSObj_Area` | 面积 | 浮点数 | AREA |\n| `SSObj_Length` | 周长/长度 | 浮点数 | LINE/AREA |\n| `SSObj_3DLength` | 三维长度 | 浮点数 | LINE/AREA |\n| `SSObj_PointCount` | 坐标点数量 | 整数 | POINT/LINE/AREA |\n| `SSObj_X` | X 坐标 | 浮点数 | POINT/线对象指定点 |\n| `SSObj_Y` | Y 坐标 | 浮点数 | POINT/线对象指定点 |\n| `SSObj_Z` | Z 坐标 | 浮点数 | POINT/线对象指定点 |\n| `SSObj_PointName` | " + }, + { + "slug": "16-xiu-gai-di-wu-shu-xing-zhi", + "title": "修改地物属性值", + "section": "选择集与查询", + "headings": [ + "属性修改架构概览", + "属性类型与命名规范", + "基本属性分类", + "修改新建对象的属性", + "基本属性设置", + "扩展属性设置", + "注记属性设置", + "修改选择集中对象的属性", + "选择集对象属性修改流程", + "修改单个对象的属性", + "批量修改选择集对象的属性", + "修改注记对象的属性", + "特殊属性处理", + "编码属性(SSObj_Code)修改", + "图层属性(SSObj_LayerName)修改", + "点坐标修改(SSObj_X, SSObj_Y, SSObj_Z)", + "点名称与类型修改(SSObj_PointName, SSObj_PointType)", + "颜色属性设置详解", + "完整示例:批量更新道路属性", + "完整示例:创建并设置新对象", + "注意事项与最佳实践", + "属性修改注意事项", + "保存机制", + "错误处理", + "进阶操作:通过对象ID直接修改属性", + "下一步学习" + ], + "content": "修改地物属性值是 SunvStation Python API 中最核心的数据操作功能之一。本页将系统性地介绍如何通过脚本修改地物的基本属性、扩展属性以及几何属性,并确保修改内容正确保存到数据库。\n\n## 属性修改架构概览\n\n地物属性修改涉及三个核心层次:**新建对象属性设置**、**选择集对象属性修改**和**批量保存机制**。理解这个架构对于正确使用 API 至关重要。\n\n```mermaid\nflowchart TB\n A[开始属性修改] --> B{修改场景}\n B --> C[新建对象]\n B --> D[选择集对象]\n B --> E[批量修改]\n \n C --> C1[createDefaultGeoBase
创建对象]\n C1 --> C2[setNewObjValue
设置属性]\n C2 --> C3[addNewObjToSaveObjList
添加到保存列表]\n \n D --> D1[遍历选择集对象]\n D1 --> D2{属性类型}\n D2 --> D3[SSObj_Code/LayerName
特殊处理]\n D2 --> D4[基本属性
setGeoValue]\n D2 --> D5[扩展属性
setMemoData]\n D3 --> D6[addSelGeoToSaveGeoList
添加到保存列表]\n D4 --> D6\n D5 --> D6\n \n E --> E1[setSelGeoValue -1
批量设置]\n E1 --> E2[addSelGeoToSaveGeoList -1
批量添加]\n \n C3 --> F[saveBufferObjToDatabase
保存到数据库]\n D6 --> F\n E2 --> F\n F --> G[updateRequest
刷新地图显示]\n G --> H[完成]\n```\n\n## 属性类型与命名规范\n\nSunvStation 支持三种不同类型的属性,每种类型使用特定的命名前缀和语法规则。\n\n| 属性类型 | 命名格式 | 示例 | 说明 |\n|---------|---------|------|------|\n| **基本属性** | `SSObj_` 开头 | `SSObj_Code`, `SSObj_Name`, `SSObj_Color` | 系统预定义的固有属性 |\n| **扩展属性** | `[属性名]` 格式 | `[建筑类型]`, `[施工状态]` | 用户自定义的扩展字段 |\n| **几何属性** | `<属性名>` 格式 | ``, ``, `` | 对象的几何特性和坐标信息 |\n\n### 基本属性分类\n\n**通用属性**:涵盖对象的标识、图层和图形表现。这包括对象 ID、编码、图层名称、颜色、线型和线宽等关键属性。\n\n**几何属性**:涉及对象的坐标、几何尺寸和拓扑特征。包括坐标点(X, Y, Z)、面积、长度、边界框等几何信息。\n\n**注记属性**:专门针对文本标注的样式和格式。包括字体宽度、高度、名称、内容、对齐方式和角度等详细属性。\n\n**时间与状态**:记录对象的创建和修改时间,以及对象的状态标记。\n\n\n\n## 修改新建对象的属性\n\n当通过 `createDefaultGeoBase()` 或 `createNewObjByCode()` 创建新地物对象后,可以使用 `setNewObjValue()` 方法设置其属性。这种方法适用于单次创建并立即设置属性的场景。\n\n### 基本属性设置\n\n```python\n# 创建编码为 100 的线对象\nobj, geo = ssp.createNewObjByCode(100)\n\n# 设置基本属性\nssp.setNewObjValue(\"SSObj_Name\", \"主干道\")\nssp.setNewObjValue(\"SSObj_Color\", \"16711680\") # RGB 红色\nssp.setNewObjValue(\"SSObj_LineWidth\", \"2\")\nssp.setNewObjValue(\"SSObj_Angle\", \"45.0\")\n```\n\n### 扩展属性设置\n\n扩展属性使用方括号 `[]` 包裹属性名,可以同时设置多个属性:\n\n```python\n# 设置单个扩展属性\nssp.setNewObjValue(\"[建筑类型]\", \"住宅楼\")\nssp.setNewObjVa" + }, + { + "slug": "17-di-wu-ji-ben-shu-xing-xiang-jie", + "title": "地物基本属性详解", + "section": "选择集与查询", + "headings": [ + "属性体系概览", + "标识属性详解", + "SSObj_ID:系统唯一标识", + "SSObj_Code:业务编码", + "SSObj_Name 与 SSObj_Byname", + "SSObj_LayerName 与 SSObj_GroupID", + "几何属性详解", + "坐标点属性体系", + "几何尺寸属性", + "边界框属性", + "几何变换属性", + "外观属性详解", + "颜色属性(SSObj_Color)", + "线型属性(SSObj_LineType)", + "填充样式属性", + "时间属性详解", + "SSObj_CreateTime:创建时间戳", + "SSObj_ModifyTime:修改时间戳", + "注记属性详解", + "字体属性组", + "内容属性组", + "布局属性组", + "属性访问机制深入", + "属性名称注册与索引映射", + "参数化属性解析", + "属性值获取流程", + "属性修改机制深入", + "扩展属性的特殊处理", + "基本属性的值转换", + "批量操作与循环优化", + "只读属性保护", + "应用场景与最佳实践", + "数据质量检查与验证", + "批量属性更新", + "空间分析与统计", + "注记符号化与布局", + "最佳实践建议", + "总结" + ], + "content": "本文档深入解析 SunvStation 地物基本属性体系,阐述各类属性的物理含义、存储机制、应用场景以及底层实现原理。通过系统地理解这些属性,开发者可以更高效地进行地理数据管理和空间分析。\n\n## 属性体系概览\n\n地物基本属性体系是一个层次化的概念架构,将地理对象的各种特征抽象为可管理和可查询的属性集合。这个体系遵循从抽象到具体的分层原则,覆盖了对象的标识、几何、外观、时间等完整维度的信息。\n\n```mermaid\nflowchart TB\n A[地物基本属性体系] --> B[标识属性组]\n A --> C[几何属性组]\n A --> D[外观属性组]\n A --> E[时间属性组]\n A --> F[注记属性组]\n \n B --> B1[SSObj_ID
系统唯一标识]\n B --> B2[SSObj_Code
业务编码]\n B --> B3[SSObj_Name
对象名称]\n B --> B4[SSObj_Byname
对象别名]\n B --> B5[SSObj_LayerName
图层归属]\n B --> B6[SSObj_GroupID
分组标识]\n \n C --> C1[坐标点
X, Y, Z, PointName, PointType]\n C --> C2[几何尺寸
Area, Length, 3DLength]\n C --> C3[边界框
minX, minY, maxX, maxY]\n C --> C4[变换参数
Angle, ScaleX, ScaleY]\n \n D --> D1[颜色属性
Color, HatchStyle]\n D --> D2[线条属性
LineType, LineWidth]\n D --> D3[状态属性
Status, DataMark]\n \n E --> E1[CreateTime
创建时间戳]\n E --> E2[ModifyTime
修改时间戳]\n \n F --> F1[字体属性
FontName, FontWidth, FontHeight]\n F --> F2[内容属性
FontString, FontStringCount]\n F --> F3[样式属性
FontAlignment, FontDirection, FontWeight]\n```\n\n这个属性体系通过 `ObjBaseAttr` 类进行统一管理。该类在初始化时会注册所有预定义的属性名称,并分配唯一的索引值,用于高效的属性访问和查找。属性索引化的设计使得属性访问从字符串匹配转换为整数索引查找,显著提升了性能,特别是在批量处理大量地物对象时。\n\n\n\n## 标识属性详解\n\n标识属性是地物对象的身份特征,用于唯一确定和组织地理对象。理解这些属性的含义和作用,是构建有效数据管理策略的基础。\n\n### SSObj_ID:系统唯一标识\n\n`SSObj_ID` 是系统分配的地物对象全局唯一标识符,通常为长整型数值。该属性具有以下关键特性:**不可变性**(对象创建后不会改变)、**全局唯一性**(在整个工作空间范围内唯一)、**自动分配**(由系统自动生成,无需手动指定)。该属性主要用于对象间引用关系管理、数据关联操作以及撤销操作的对象定位。\n\n在实际应用中,当对象间需要建立关联时,通过 `SSObj_ID` 进行引用是最可靠的方式。例如,对象 A 需要引用对象 B,应存储对象 B 的 `SSObj_ID` 而非 `SSObj_Code`,因为编码可能在业务流程中被修改,而 ID 保持不变。\n\n### SSObj_Code:业务编码\n\n`SSObj_Code` 是地物对象的业务分类编码,通常对应国家或行业标准中的要素代码。该属性反映了地物的**语义分类**,如 100 代表控制点、200 代表道路等。与 `SSObj_ID` 不同,`SSObj_Code` 是业务概念层面的标识,可以在一定规则下修改。\n\n在数据交换和跨系统集成场景中,`SSObj_Code` 扮演着关键角色。它使得不同系统间的数据映射成为可能,同时保证了数据语义的一致性。开发者在设计业务逻辑时,应优先基于 `SSObj_Code` 进行对象分类和功能分发,而不是硬编码具体的对象类型。\n\n### SSObj_Name 与 SSObj_Byname\n\n`SSObj_Name` 是地物对象的正式名称,通常用于地图标注、报表输出等展示场景。`SSObj_Byn" + }, + { + "slug": "18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing", + "title": "扩展属性与自定义属性", + "section": "选择集与查询", + "headings": [ + "扩展属性体系架构", + "扩展属性命名与语法规则", + "单个属性访问", + "多个属性访问", + "读取扩展属性", + "读取几何对象扩展属性", + "读取注记对象扩展属性", + "扩展属性读取流程", + "设置扩展属性", + "修改已有对象的扩展属性", + "批量修改扩展属性", + "设置多个扩展属性", + "为新建对象设置扩展属性", + "完整的新建对象流程", + "新建对象扩展属性设置机制", + "在选择条件中使用扩展属性", + "基于扩展属性的选择", + "复合选择条件", + "支持的操作符", + "扩展属性应用场景与最佳实践", + "典型应用场景", + "最佳实践", + "常见问题与故障排除", + "问题1:扩展属性读取返回空字符串", + "问题2:批量设置多个属性失败", + "问题3:基于扩展属性的选择无结果", + "问题4:修改后的扩展属性未保存", + "完整示例:建筑物维护管理系统", + "示例输出", + "下一步学习" + ], + "content": "本页专门讲解 SunvStation 中**扩展属性与自定义属性**的使用方法。扩展属性是存储在对象扩展属性表中的用户自定义字段,用于满足业务特定的数据管理需求。通过扩展属性,开发者可以在不修改系统架构的前提下,为地物对象添加任意的业务信息,如建筑结构、施工状态、维护记录等。\n\n## 扩展属性体系架构\n\n扩展属性与系统基本属性(SSObj_)不同,它采用灵活的键值对存储机制,允许开发者根据业务需求动态定义属性名称和值。理解这个架构有助于正确使用扩展属性功能。\n\n```mermaid\nflowchart TB\n A[扩展属性体系] --> B[存储机制
MemoData StringArray]\n A --> C[访问语法
方括号包裹]\n A --> D[应用场景
业务特定信息]\n \n B --> B1[Fields: 属性名数组]\n B --> B2[Values: 属性值数组]\n B1 --> B3[getMemoData/setMemoData]\n B2 --> B3\n \n C --> C1[单个属性: #91属性名#92]\n C --> C2[多个属性: #91属性1#92,#91属性2#92,...]\n \n D --> D1[建筑管理: 结构, 层数, 面积]\n D --> D2[道路管理: 宽度, 材质, 等级]\n D --> D3[设施管理: 状态, 维护日期, 责任人]\n```\n\n扩展属性的核心优势在于其**灵活性和可扩展性**。与固定的系统属性不同,扩展属性可以根据项目需求随时添加新的字段,无需修改数据库结构或系统代码。这种设计使得 SunvStation 能够适应各种专业领域的需求。\n\n\n\n## 扩展属性命名与语法规则\n\n扩展属性使用特定的命名约定,以区别于系统基本属性和几何特性。掌握这些规则是正确使用扩展属性的前提。\n\n| 属性类型 | 命名格式 | 示例 | 存储位置 | 适用场景 |\n|---------|---------|------|---------|---------|\n| **扩展属性** | `[属性名]` | `[建筑结构]`、`[施工状态]` | 对象扩展属性表 | 用户自定义业务字段 |\n| **基本属性** | `SSObj_属性名` | `SSObj_Code`、`SSObj_Name` | 对象内部属性 | 系统预定义固有属性 |\n| **几何特性** | `<属性名>` | ``、`` | 几何计算结果 | 拓扑和几何判断 |\n\n### 单个属性访问\n\n访问单个扩展属性时,使用方括号包裹属性名:\n\n```python\n# 获取扩展属性值\nstructure = SSProcess.getSelGeoValue(0, \"[建筑结构]\")\nprint(f\"建筑结构: {structure}\")\n\n# 设置扩展属性值\nSSProcess.setSelGeoValue(0, \"[建筑结构]\", \"钢筋混凝土\")\n```\n\n### 多个属性访问\n\n使用逗号分隔可以一次性访问或设置多个扩展属性:\n\n```python\n# 获取多个扩展属性(逗号分隔属性名)\ncombined_value = SSProcess.getSelGeoValue(0, \"[建筑结构],[层数],[建成年份]\")\n# 返回格式: \"钢筋混凝土,18,2020\"\nprint(combined_value)\n\n# 设置多个扩展属性(逗号分隔属性名和值)\nSSProcess.setSelGeoValue(0, \"[建筑结构],[层数],[建成年份]\", \"钢结构,25,2015\")\n```\n\n**注意**:设置多个属性时,属性名和值的数量必须一一对应,否则操作不会执行。\n\n\n\n## 读取扩展属性\n\n读取扩展属性主要通过 `getSelGeoValue()` 和 `getSelNoteValue()` 方法实现。这两个方法会自动识别方括号语法,从对象的扩展属性表中提取对应的值。\n\n### 读取几何对象扩展属性\n\n```python\nfrom sunvpy import SSProcess\n\n# 清除并设置选择条件\nSSProcess.clearSelection()\nSSProcess.clearSelectCondition()\nSSProcess.setSelectCondition(\"SSObj_Code\", \"==\", \"100\") # 选择建筑物\nSSProcess.selectFilter()\n\nif SSProcess.getSelGeoCount() > 0:\n " + }, + { + "slug": "19-chuang-jian-mo-ren-di-wu-dui-xiang", + "title": "创建默认地物对象", + "section": "地理对象编辑", + "headings": [ + "地物对象类型概述", + "createDefaultGeoBase 方法详解", + "方法签名", + "参数说明", + "返回值", + "创建地物对象的工作流程", + "基础创建示例", + "创建点对象", + "创建线对象", + "创建面对象", + "创建注记对象", + "完整创建流程示例", + "创建并保存点对象", + "创建并保存线对象", + "错误处理与验证", + "常见错误及处理方式", + "错误处理示例", + "与其他创建方法的对比", + "使用场景对比示例", + "属性设置与扩展", + "基本属性设置", + "扩展属性设置", + "批量创建与性能优化", + "批量创建流程", + "性能优化建议", + "下一步学习" + ], + "content": "本文档详细介绍如何在 SunvStation 系统中创建默认地物对象。地物对象是地理信息系统中的核心数据单元,包括点、线、面和注记四种基本类型。创建默认地物对象是进行地理数据编辑和管理的第一步,为后续的属性设置、坐标添加和数据持久化奠定基础。\n\n建议在学习本页面之前,先了解 [SSProcess 基础概念](4-shi-yong-ssprocess-guan-li-xuan-ze-ji) 和 [地物基本属性](17-di-wu-ji-ben-shu-xing-xiang-jie)。完成本页面学习后,可以继续学习 [通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang) 和 [添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)。\n\n\n\n## 地物对象类型概述\n\nSunvStation 系统支持四种基本的地物对象类型,每种类型对应不同的几何形态和应用场景。理解这些类型的差异是正确使用创建方法的前提。\n\n| 对象类型 | 类型标识 | 几何类 | 典型应用场景 |\n|---------|---------|--------|------------|\n| 点对象 | 0 | PointObject | 控制点、界碑、建筑物中心点 |\n| 线对象 | 1 | LineObject | 道路、管线、河流中心线 |\n| 面对象 | 2 | AreaObject | 建筑物轮廓、湖泊、行政区划 |\n| 注记对象 | 3 | MarkNote | 文字标注、地名说明 |\n\n地物对象由两个核心组件构成:`GeoObject` 容器对象和具体的几何对象(`PointObject`、`LineObject`、`AreaObject`、`MarkNote`)。`GeoObject` 负责管理对象的数据集关联和唯一标识,而几何对象负责存储具体的几何数据和图形属性。\n\n\n\n## createDefaultGeoBase 方法详解\n\n`createDefaultGeoBase` 是创建默认地物对象的核心方法,属于 `GeoEditMixin` 混入类。该方法接受对象类型和数据集两个参数,返回包含 `GeoObject` 和几何对象的元组。\n\n### 方法签名\n\n```python\ndef createDefaultGeoBase(self, obj_type: int, dataset) -> tuple:\n```\n\n### 参数说明\n\n| 参数名 | 类型 | 必需 | 说明 |\n|--------|------|------|------|\n| obj_type | int | 是 | 地物对象类型(0-点,1-线,2-面,3-注记) |\n| dataset | Dataset | 是 | 目标数据集实例,用于存储对象 |\n\n### 返回值\n\n返回一个包含两个元素的元组:\n- 第一个元素:`GeoObject` 实例,作为地物对象的容器\n- 第二个元素:具体的几何对象实例(`PointObject`/`LineObject`/`AreaObject`/`MarkNote`)\n\n\n\n## 创建地物对象的工作流程\n\n创建默认地物对象涉及多个步骤,从获取数据集到最终保存到数据库。理解完整的流程有助于正确地组织代码和处理异常情况。\n\n```mermaid\nflowchart TD\n A[开始] --> B[获取当前数据源EPS]\n B --> C{EPS是否有效?}\n C -->|否| D[记录错误并返回]\n C -->|是| E[获取目标数据集]\n E --> F{数据集是否有效?}\n F -->|否| G[记录错误并返回]\n F -->|是| H[调用createDefaultGeoBase]\n H --> I[创建GeoObject容器]\n I --> J{对象类型?}\n J -->|0| K[创建PointObject]\n J -->|1| L[创建LineObject]\n J -->|2| M[创建AreaObject]\n J -->|3| N[创建MarkNote]\n K --> O[设置几何对象]\n L --> O\n M --> O\n N --> O\n O --> P[返回对象元组]\n P --> Q[设置对象属性]\n Q --> R[添加坐标点]\n R --> S[添加到保存列表]\n S --> T[保存到数据库]\n T --> U[结束]\n```\n\n\n\n## 基础创建示例\n\n以下示例展示了如何使用 `createDef" + }, + { + "slug": "20-tong-guo-bian-ma-chuang-jian-dui-xiang", + "title": "通过编码创建对象", + "section": "地理对象编辑", + "headings": [ + "地物编码体系概念", + "createNewObjByCode 方法详解", + "方法签名", + "参数说明", + "返回值", + "对象创建工作流程", + "Feature 编码解析机制", + "对比:编码创建 vs 默认创建", + "基础创建示例", + "创建点对象", + "创建线对象", + "创建面对象", + "属性设置与自定义", + "属性设置示例", + "批量对象创建", + "注记对象创建", + "错误处理与调试", + "常见错误类型", + "完整错误处理示例", + "完整应用示例:创建标准地图要素", + "对象选择集集成", + "性能优化建议", + "批量创建优化策略", + "性能对比", + "学习路径建议" + ], + "content": "本页面详细介绍如何使用地物编码(Feature Code)在 SunvStation 系统中创建地理对象。通过编码创建对象是一种快速、标准化的对象创建方式,系统会根据预定义的地物编码自动应用对应的符号样式、图层属性和几何类型,确保创建的对象符合制图规范和数据标准。\n\n建议在学习本页面之前,先了解[创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang)和[地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)。完成本页面学习后,可以继续学习[添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)和[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)。\n\n\n\n## 地物编码体系概念\n\n地物编码(Feature Code)是 SunvStation 系统中用于标识和管理不同类型地理对象的数字标识系统。每个地物编码对应一组预定义的属性配置,包括对象类型、颜色、线型、线宽等显示属性,以及所属的数据集(图层)。通过编码创建对象时,系统会自动从编码定义中读取这些属性并应用到新创建的对象上,确保对象符合制图规范。\n\n**地物编码的核心优势**在于将对象的几何定义与符号化表达分离。开发者只需指定编码值,系统即可自动处理所有的符号化细节,这大大简化了对象的创建流程,并保证了数据的一致性。编码体系通常遵循行业标准或企业内部规范,例如控制点可能使用编码 100,道路可能使用编码 200,建筑物可能使用编码 300 等。\n\n\n\n## createNewObjByCode 方法详解\n\n`createNewObjByCode` 是通过编码创建地理对象的核心方法,该方法封装了从编码查询、对象创建到属性设置的完整流程。与 `createDefaultGeoBase` 不同,该方法不需要开发者手动指定对象类型和数据集,这些信息会根据编码自动推断和获取。\n\n### 方法签名\n\n```python\ndef createNewObjByCode(self, code: int) -> tuple:\n```\n\n### 参数说明\n\n| 参数名 | 类型 | 必需 | 说明 |\n|--------|------|------|------|\n| code | int | 是 | 地物编码值,用于标识要创建的对象类型 |\n\n### 返回值\n\n返回一个包含两个元素的元组:\n- 第一个元素:`GeoObject` 实例,作为地物对象的容器\n- 第二个元素:具体的几何对象实例(`PointObject`/`LineObject`/`AreaObject`)\n\n如果创建失败,返回 `(None, None)`。\n\n\n\n## 对象创建工作流程\n\n通过编码创建对象是一个多步骤的自动化流程,系统会执行从编码解析到对象初始化的一系列操作。理解这个流程有助于开发者在出现问题时快速定位原因,并在需要时进行扩展或自定义。\n\n```mermaid\nflowchart TD\n A[调用 createNewObjByCode] --> B[重置当前新建对象]\n B --> C[获取当前数据源EPS]\n C --> D{数据源EPS有效?}\n D -->|否| E[记录错误并返回 None,None]\n D -->|是| F[根据编码查询Feature定义]\n F --> G{Feature存在?}\n G -->|否| H[使用默认编码0的Feature]\n G -->|是| I[获取Feature对象]\n H --> I\n I --> J[从Feature获取数据集]\n J --> K{数据集有效?}\n K -->|否| L[记录错误并返回 None,None]\n K -->|是| M[读取对象类型]\n M --> N[调用createDefaultGeoBase创建对象]\n N --> O[应用Feature样式属性]\n O --> P[设置编码值]\n P --> Q[设置颜色]\n Q --> R[设置填充颜色]\n R --> S[设置线宽]\n S --> T[设置线型]\n T --> U[保存到curNewObj]\n U --> V[返回对象元组]\n```\n\n\n\n## Feature 编码解析机制\n\nFeature 编码解析是创建过程的核心环节。系统首先通过 `getCurrentDataSourceEPS()` 获取当前地图的数据源 EPS(Extended Parameter System)对象,该对象维护了所有预定义的 Feat" + }, + { + "slug": "21-tian-jia-dui-xiang-zuo-biao-dian", + "title": "添加对象坐标点", + "section": "地理对象编辑", + "headings": [ + "方法概述", + "工作流程", + "使用场景", + "代码示例", + "示例 1: 创建点对象并添加坐标", + "示例 2: 创建线对象并添加多个坐标点", + "示例 3: 创建面对象并形成闭合多边形", + "点类型枚举", + "注意事项", + "前置条件检查", + "坐标系统", + "对象类型适配", + "保存机制", + "错误处理", + "相关功能", + "最佳实践" + ], + "content": "本文档详细说明如何为新建的地理对象添加坐标点,这是地理对象编辑流程中的核心步骤。通过坐标点的添加,可以构建点、线、面等不同类型的几何对象,为后续的保存和数据库存储奠定基础。\n\n## 方法概述\n\n`addNewObjPoint` 方法用于向当前新建的地理对象添加一个空间坐标点。该方法属于 `GeoEditMixin` 混合类,通过 `SSProcessManager` 实例调用。它支持三维坐标输入,并可设置点的类型和名称属性。\n\n**方法签名**:\n```python\naddNewObjPoint(x: float, y: float, z: float, type: int, name: str) -> bool\n```\n\n**参数说明**:\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| x | float | 点的 X 坐标值 |\n| y | float | 点的 Y 坐标值 |\n| z | float | 点的 Z 坐标值(高程) |\n| type | int | 点的类型,使用 PointInfoEnum 点信息枚举的二进制位存储 |\n| name | str | 点的名称标识 |\n\n**返回值**:\n- `True`: 添加成功\n- `False`: 添加失败(通常是因为当前没有新建对象)\n\n\n\n## 工作流程\n\n添加坐标点的操作必须建立在已创建地理对象的基础上。完整的工作流程包括对象创建、坐标点添加、对象保存等步骤。\n\n```mermaid\nflowchart TD\n A[开始] --> B[创建地理对象
createNewObjByCode]\n B --> C[是否创建成功?]\n C -->|否| D[返回错误]\n C -->|是| E[添加第一个坐标点
addNewObjPoint]\n E --> F[需要添加更多点?]\n F -->|是| G[添加后续坐标点
addNewObjPoint]\n G --> F\n F -->|否| H[添加到选择集
addNewObjToSelObjList]\n H --> I[添加到保存列表
addNewObjToSaveObjList]\n I --> J[保存到数据库
saveBufferObjToDatabase]\n J --> K[结束]\n```\n\n\n\n## 使用场景\n\n根据几何对象类型的不同,添加坐标点的行为有所差异:\n\n| 对象类型 | 所需点数 | 点的顺序要求 | 典型应用 |\n|----------|---------|-------------|---------|\n| 点对象 | 1个 | 无 | 地标点、测量控制点 |\n| 线对象 | ≥2个 | 需按路径顺序 | 道路中心线、管线 |\n| 面对象 | ≥3个 | 按顺时针或逆时针闭合 | 建筑物轮廓、地块边界 |\n| 注记对象 | 1个(定位点) | 无 | 文字标注位置 |\n\n\n\n## 代码示例\n\n### 示例 1: 创建点对象并添加坐标\n\n```python\n# 创建点对象(代码 1001 表示某种特定类型的点)\nobj, geo = SSProcess.createNewObjByCode(1001)\nif obj and geo:\n # 添加唯一坐标点\n success = SSProcess.addNewObjPoint(\n x=123456.789,\n y=3456789.012,\n z=45.5,\n type=ATTR_NORMAL_POINT,\n name=\"控制点P1\"\n )\n if success:\n # 添加到选择集和保存列表\n SSProcess.addNewObjToSelObjList()\n SSProcess.addNewObjToSaveObjList()\n SSProcess.saveBufferObjToDatabase()\n```\n\n\n\n### 示例 2: 创建线对象并添加多个坐标点\n\n```python\n# 创建线对象(代码 2001 表示道路中心线)\nobj, geo = SSProcess.createNewObjByCode(2001)\nif obj and geo:\n # 添加路径上的坐标点\n points = [\n (123456.789, 3456789.012, 45.5, \"起点\"),\n (123460.78" + }, + { + "slug": "22-shan-chu-dui-xiang-cao-zuo", + "title": "删除对象操作", + "section": "地理对象编辑", + "headings": [ + "删除操作概述", + "deleteNewObj 方法详解", + "方法签名", + "功能说明", + "特点", + "删除新建对象的工作流程", + "使用场景与示例", + "场景 1: 取消创建过程中的对象", + "场景 2: 条件判断后删除", + "场景 3: 异常处理中的清理", + "批量删除机制", + "批量删除的工作原理", + "批量删除的实现", + "批量删除示例", + "示例 1: 基于选择集的批量删除", + "示例 2: 删除指定图层中的所有对象", + "示例 3: 基于属性条件的批量删除", + "删除操作与选择集的结合", + "操作流程", + "综合示例:条件判断后批量删除", + "方法对比", + "注意事项", + "前置条件检查", + "对象生命周期", + "批量删除的保存要求", + "数据完整性", + "性能考虑", + "并发与锁定", + "错误处理与调试", + "常见问题", + "调试技巧" + ], + "content": "本文档详细说明如何在 SunvStation 系统中删除地理对象。删除操作是地理数据维护的重要环节,包括删除当前新建对象、批量删除多个对象以及与选择集结合的删除场景。掌握删除操作的机制和使用方法,能够帮助开发者有效管理地图数据,确保数据的准确性和一致性。\n\n建议在学习本页面之前,先了解 [创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) 和 [添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)。完成本页面学习后,可以继续学习 [对象缓存机制](23-dui-xiang-huan-cun-ji-zhi) 和 [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)。\n\n\n\n## 删除操作概述\n\nSunvStation 提供了两种主要的删除方式:单对象删除和批量删除。单对象删除主要用于删除当前正在创建的对象,而批量删除则适用于处理多个已存在的地理对象。\n\n| 删除方式 | 方法名称 | 适用场景 | 操作时机 |\n|---------|---------|---------|---------|\n| 单对象删除 | `deleteNewObj` | 删除当前新建对象 | 对象创建后、保存前 |\n| 批量删除 | `delBufferGeoList` + `saveBufferObjToDatabase` | 删除多个对象 | 对象已添加到删除缓冲区后 |\n\n删除操作的核心机制基于 `delBufferGeoList` 缓冲区,该缓冲区存储待删除的地理对象。当调用 `saveBufferObjToDatabase()` 方法时,系统会自动处理这些删除操作。\n\n\n\n## deleteNewObj 方法详解\n\n`deleteNewObj` 方法用于删除当前新建的地理对象。这是一个即时的删除操作,不需要保存到数据库即可生效。\n\n### 方法签名\n\n```python\ndef deleteNewObj(self):\n```\n\n### 功能说明\n\n该方法执行以下操作:\n1. 检查当前是否有新建对象(`self.curNewObj` 不为空)\n2. 如果存在新建对象,调用地图的 `delGeoObject` 方法删除该对象\n3. 将 `self.curNewObj` 重置为 `(None, None)`,表示当前没有新建对象\n\n### 特点\n\n- **无需参数**:该方法不接受任何参数\n- **无返回值**:不返回任何结果,仅执行删除操作\n- **即时生效**:删除操作立即执行,无需等待数据库保存\n- **仅限新建对象**:只能删除通过创建方法生成的当前对象\n\n\n\n## 删除新建对象的工作流程\n\n删除当前新建对象是一个简单直接的操作,但需要了解其在整个对象生命周期中的位置。\n\n```mermaid\nflowchart TD\n A[开始] --> B[创建新对象
createNewObjByCode]\n B --> C{是否需要保留?}\n C -->|是| D[添加坐标点
addNewObjPoint]\n D --> E[添加到保存列表
addNewObjToSaveObjList]\n E --> F[保存到数据库
saveBufferObjToDatabase]\n F --> G[对象持久化成功]\n C -->|否| H[删除对象
deleteNewObj]\n H --> I[curNewObj 重置为 None]\n I --> J[对象从内存中移除]\n J --> K[结束]\n G --> K\n```\n\n\n\n## 使用场景与示例\n\n### 场景 1: 取消创建过程中的对象\n\n在创建对象的过程中,如果发现对象不符合要求或需要中止创建,可以使用 `deleteNewObj` 方法取消。\n\n```python\n# 尝试创建一个线对象\nobj, geo = SSProcess.createNewObjByCode(2001)\nif obj and geo:\n # 添加第一个坐标点\n SSProcess.addNewObjPoint(100.0, 200.0, 0.0, 0, \"起点\")\n \n # 发现该线对象不符合要求,决定删除\n SSProcess.deleteNewObj()\n print(\"新创建的线对象已被删除\")\n \n # 重新创建符合要求的对象\n obj, geo = SSProcess.createNewObjByCode(2002)\n if obj a" + }, + { + "slug": "23-dui-xiang-huan-cun-ji-zhi", + "title": "对象缓存机制", + "section": "地理对象编辑", + "headings": [ + "缓存架构概述", + "缓存类型与分类", + "按操作状态分类", + "按对象类型分类", + "缓存生命周期管理", + "核心API详解", + "对象创建API", + "属性设置API", + "批量持久化API", + "备忘数据转换API", + "缓存与选择集的关系", + "最佳实践与注意事项", + "批量操作的性能优化", + "内存管理注意事项", + "并发安全注意事项", + "与撤销系统的集成", + "相关主题" + ], + "content": "对象缓存机制是SunvStation地理编辑系统的核心组件,用于在批量创建和修改地理对象时提供高效的内存管理。该机制通过在内存中暂存对象,避免频繁的数据库I/O操作,显著提升大批量数据处理的性能。缓存机制区分了新建对象和修改对象两种场景,分别采用不同的缓存策略,并通过统一的事务性接口完成数据库持久化。\n\n\n\n## 缓存架构概述\n\n对象缓存机制采用多层次的缓存架构,通过SSProcessManager类的成员变量管理不同类型的缓存。缓存系统分为三大类别:新建对象缓存、修改对象缓存和删除对象缓存,每种类别又进一步区分为地物对象和注记对象。\n\n```mermaid\nclassDiagram\n class SSProcessManager {\n +GeoBaseList bufferObjList\n +GeoBaseList bufferNoteList\n +list newBufferObjList\n +list newBufferNoteList\n +tuple curNewObj\n +GeoBaseList delBufferGeoList\n +createNewObjByCode(code)\n +setNewObjValue(field, value)\n +addNewObjPoint(x, y, z, type, name)\n +addNewObjToSaveObjList()\n +saveBufferObjToDatabase()\n }\n \n class GeoEditMixin {\n <>\n +transMemoDataToExtendAttr(geoList)\n +persistTempGeoList(geoVec)\n +persistTempNoteList(noteVec)\n }\n \n class GeoBaseList {\n +append(geo)\n +empty()\n +clear()\n }\n \n class GeoBase {\n +getObjectType()\n +getCode()\n +setMemoData(fields, values)\n +getDatasetName()\n }\n \n SSProcessManager *-- GeoBaseList : 管理缓存列表\n SSProcessManager *-- GeoBase : 封装几何对象\n SSProcessManager --> GeoEditMixin : 继承缓存操作\n GeoBaseList o-- GeoBase : 包含对象\n```\n\n该架构体现了**关注点分离**的设计原则:SSProcessManager负责缓存容器管理,GeoEditMixin提供缓存操作的具体实现,GeoBase和GeoBaseList作为数据载体。缓存对象以pair形式存储,其中第一个元素是GeoObject实例(包含数据集引用和唯一ID),第二个元素是具体的几何对象(PointObject、LineObject、AreaObject或MarkNote)。\n\n\n\n## 缓存类型与分类\n\n缓存机制根据对象状态和类型进行明确分类,这种设计使得系统能够对不同场景采用优化的处理策略。\n\n### 按操作状态分类\n\n| 缓存类型 | 存储容器 | 对象来源 | 持久化方式 | 典型应用场景 |\n|---------|---------|---------|-----------|------------|\n| 新建对象缓存 | `newBufferObjList` / `newBufferNoteList` | 脚本创建的新对象 | `addGeoObject()` 添加到地图 | 批量导入数据、程序化生成地物 |\n| 修改对象缓存 | `bufferObjList` / `bufferNoteList` | 从地图加载并修改的对象 | `saveDatabase()` 更新数据库 | 属性批量更新、几何形状编辑 |\n| 删除对象缓存 | `delBufferGeoList` | 标记为删除的对象 | `delGeoBaseComponent()` 执行删除 | 清理过期数据、对象合并操作 |\n| 当前新建对象 | `curNewObj` | 正在创建过程" + }, + { + "slug": "24-pi-liang-bao-cun-dao-shu-ju-ku", + "title": "批量保存到数据库", + "section": "地理对象编辑", + "headings": [ + "批量保存架构设计", + "核心方法详解", + "saveBufferObjToDatabase()", + "transMemoDataToExtendAttr()", + "操作类型与处理流程", + "新建对象的保存流程", + "修改对象的保存流程", + "删除对象的保存流程", + "使用场景与最佳实践", + "场景一:批量新建地物对象", + "场景二:批量更新对象属性", + "场景三:对象替换(删除旧对象,创建新对象)", + "性能优化建议", + "数据集分组优化", + "事务边界管理", + "缓存容量控制", + "错误处理与异常管理", + "与其他功能的关联", + "与对象缓存机制的关系", + "与撤销标记管理的关系", + "与地图视图更新的关系" + ], + "content": "批量保存到数据库是SunvStation地理编辑系统中实现高效数据持久化的核心机制。该功能通过统一的事务接口,将缓存中新建、修改和删除的地理对象批量提交到数据库,避免了逐个对象保存带来的性能开销和事务一致性问题。批量保存机制与[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)紧密配合,构成了完整的对象生命周期管理体系。\n\n\n\n## 批量保存架构设计\n\n批量保存采用三段式处理架构,针对不同状态的对象采用差异化的持久化策略。新建对象通过`addGeoObject()`添加到地图并自动保存,修改对象通过`saveDatabase()`更新数据库,删除对象通过`delGeoBaseComponent()`从数据库中移除。这种设计遵循了**单一职责原则**,使每种操作类型都有专门的处理路径。\n\n```mermaid\nflowchart TB\n Start[saveBufferObjToDatabase] --> NewObj{新建对象?}\n Start --> ModObj{修改对象?}\n Start --> DelObj{删除对象?}\n \n NewObj -->|是| GroupByDataset[按数据集分组]\n GroupByDataset --> AddGeo[map.addGeoObject]\n AddGeo --> TransAttr1[transMemoDataToExtendAttr]\n TransAttr1 --> ClearNew[清空newBuffer列表]\n \n ModObj -->|是| CheckBuffer1[bufferObjList非空?]\n CheckBuffer1 -->|是| TransAttr2[transMemoDataToExtendAttr]\n TransAttr2 --> SaveDB1[map.saveDatabase]\n SaveDB1 --> ClearBuffer1[清空bufferObjList]\n \n CheckBuffer1 -->|否| CheckNote1[bufferNoteList非空?]\n CheckNote1 -->|是| TransAttr3[transMemoDataToExtendAttr]\n TransAttr3 --> SaveDB2[map.saveDatabase]\n SaveDB2 --> ClearBuffer2[清空bufferNoteList]\n \n DelObj -->|是| CheckDel[delBufferGeoList非空?]\n CheckDel -->|是| DeleteGeo[map.delGeoBaseComponent]\n DeleteGeo --> ClearDel[清空delBufferGeoList]\n \n ClearNew --> End[完成]\n ClearBuffer1 --> End\n ClearBuffer2 --> End\n ClearDel --> End\n \n style Start fill:#e1f5ff\n style End fill:#e1f5ff\n style AddGeo fill:#fff4e1\n style SaveDB1 fill:#fff4e1\n style SaveDB2 fill:#fff4e1\n style DeleteGeo fill:#ffe1e1\n```\n\n该架构体现了**分离关注点**的设计理念:新建对象的添加操作由地图对象负责,修改对象的更新操作由数据库事务处理,删除操作通过地理组件接口执行。这种分工使得系统能够针对不同场景进行性能优化,例如对新对象按数据集分组处理以减少数据库锁的粒度。\n\n\n\n## 核心方法详解\n\n### saveBufferObjToDatabase()\n\n`saveBufferObjToDatabase()` 方法是批量保存的统一入口,负责处理所有缓存对象的事务性持久化。该方法无参数且无返回值,其执行结果通过内部日志记录。\n\n**方法签名:**\n```python\ndef saveBufferObjToDatabase(self) -> None:\n```\n\n**执行步骤:**\n\n1. **处理新建对象**:合并`newBufferObjList`和`newBufferNoteList`,按数据集名称分组,对每个数据集调用`map.addGeoObject(geoList)`批量添加,然后调用`transMemoDat" + }, + { + "slug": "25-che-xiao-biao-ji-guan-li", + "title": "撤销标记管理", + "section": "地理对象编辑", + "headings": [ + "撤销标记系统架构", + "核心 API 方法", + "创建撤销标记", + "执行撤销操作", + "执行重做操作", + "栈状态查询与控制", + "手动压栈操作", + "操作流程规范", + "标准编辑流程", + "标记创建时机", + "典型应用场景", + "批量属性修改", + "对象创建与删除", + "几何变换操作", + "最佳实践建议", + "标记命名规范", + "性能优化建议", + "错误处理机制", + "与其他模块的集成" + ], + "content": "撤销标记管理是 SunvStation 地理编辑系统中的一项核心功能,它通过在执行可撤销操作前创建标记,支持用户对编辑操作进行撤销和重做。该机制基于命令模式,将每次可撤销操作封装为独立的命令单元,存储在 Undo/Redo 栈中,确保数据编辑的安全性和可追溯性。\n\n撤销标记管理在批量地理对象编辑、属性修改和几何变换等场景中尤为重要,能够有效防止误操作导致的数据丢失,提升编辑流程的容错能力和用户体验。\n\n## 撤销标记系统架构\n\n撤销标记系统采用双层架构设计:上层通过 `SSProcessManager` 提供统一的 Python 接口,下层由 `ScaleMap` 的 C++ 核心实现命令存储和状态管理。系统维护两个命令栈:Undo 栈存储已执行的操作历史,Redo 栈存储被撤销的操作,两者协同工作实现操作的双向回溯。\n\n```mermaid\nflowchart TD\n A[用户操作] --> B[SSProcessManager
pushUndoMark]\n B --> C[ScaleMap
pushUndoMark]\n C --> D{创建命令标记}\n D --> E[命令序列化]\n E --> F[Undo栈
LIFO结构]\n F --> G[操作执行]\n G --> H{用户触发撤销?}\n H -->|是| I[undo方法]\n H -->|否| J{用户触发重做?}\n I --> K[弹出Undo栈顶命令]\n K --> L[执行逆向操作]\n L --> M[压入Redo栈]\n J -->|是| N[redo方法]\n N --> O[弹出Redo栈顶命令]\n O --> P[执行正向操作]\n P --> Q[压入Undo栈]\n```\n\n## 核心 API 方法\n\n### 创建撤销标记\n\n`pushUndoMark()` 方法是撤销标记管理的入口,在执行任何可撤销操作前调用,为后续操作建立撤销点。该方法接受可选的操作描述参数,用于标识命令组的用途。\n\n| 方法 | 参数 | 返回值 | 说明 |\n|------|------|--------|------|\n| `pushUndoMark(action=\"CommandGroup\")` | `action`: 命令组名称(可选) | void | 在 Undo 栈中创建新的标记位置 |\n\n**使用示例**:\n\n```python\n# 批量修改前创建撤销标记\nSSProcess.pushUndoMark(\"批量修改管线属性\")\n\nfor i in range(SSProcess.getSelGeoCount()):\n SSProcess.setSelGeoValue(i, \"SSObj_Color\", \"16777215\")\n SSProcess.setSelGeoValue(i, \"SSObj_LineWidth\", \"2\")\n\n# 修改完成后,用户可通过 Ctrl+Z 或调用 undo() 方法撤销\n```\n\n\n\n### 执行撤销操作\n\n`undo()` 方法从 Undo 栈中弹出最近执行的命令并执行逆向操作,恢复数据到操作前的状态。支持指定步数或使用标记进行批量撤销。\n\n| 方法 | 参数 | 返回值 | 说明 |\n|------|------|--------|------|\n| `undo(step=1)` | `step`: 执行步数,-1 时使用 undo 标签 | void | 撤销指定步数的操作 |\n\n**使用示例**:\n\n```python\n# 撤销最近一次操作\nSSProcess.undo()\n\n# 撤销最近 5 次操作\nSSProcess.undo(5)\n\n# 撤销到上一个标记位置\nSSProcess.undo(-1)\n```\n\n\n\n### 执行重做操作\n\n`redo()` 方法从 Redo 栈中弹出被撤销的命令并重新执行,恢复之前撤销的操作。与 `undo()` 方法形成对称操作。\n\n| 方法 | 参数 | 返回值 | 说明 |\n|------|------|--------|------|\n| `redo(step=1)` | `step`: 执行步数,-1 时使用 undo 标签 | void | 重做指定步数的操作 |\n\n**使用示例**:\n\n```python\n# 重做最近一次撤销的操作\nSSProcess.redo()\n\n# 重做最近 3 次撤销的操作\nSSProcess.redo(3)\n```\n\n\n\n### 栈状态查询与控制\n\n系统提供多个方法用于查询 Undo/Redo 栈的状态,以及重置栈内容,便于" + }, + { + "slug": "26-shu-ju-jiao-huan-can-shu-pei-zhi", + "title": "数据交换参数配置", + "section": "数据交换与导入导出", + "headings": [ + "核心概念与架构", + "参数管理核心方法", + "设置数据交换参数", + "读取数据交换参数", + "清除数据交换参数", + "数据交换工作流程", + "数据导入流程", + "数据导出流程", + "常见参数类型参考", + "文件路径相关参数", + "格式和编码相关参数", + "坐标系统和投影参数", + "数据处理相关参数", + "完整实践示例", + "最佳实践与注意事项", + "参数配置建议", + "常见问题排查", + "性能优化建议", + "学习路径建议" + ], + "content": "本页面介绍数据交换的参数配置机制,这是进行数据导入导出操作前的关键步骤。通过正确配置数据交换参数,您可以精确控制数据转换的行为,包括格式映射、编码规则、坐标系统等关键属性。掌握参数配置是构建可靠数据交换流程的基础。\n\n\n\n## 核心概念与架构\n\n数据交换参数配置基于 **DataXScript** 类实现,该类采用经典的 **参数-执行模式** 设计。用户首先通过一系列参数设置方法配置数据转换的各项属性,然后调用执行方法触发实际的导入或导出操作。这种设计将配置逻辑与执行逻辑分离,提高了代码的可读性和可维护性。\n\n```mermaid\ngraph LR\n A[创建 DataXScript 实例] --> B[配置交换参数
setDataXParameter]\n B --> C[可选:读取参数
getDataXParameter]\n C --> D{参数配置完成?}\n D -->|否| B\n D -->|是| E[选择操作类型]\n E -->|导入| F[调用 importData]\n E -->|导出| G[调用 exportData]\n F --> H[数据交换完成]\n G --> H\n H --> I[可选:清理参数
clearDataXParameter]\n```\n\nDataXScript 类的实例不作为 sunvpy 的全局单例对象暴露,因此每次需要进行数据交换时都需要创建新的实例。这种设计确保了不同数据交换任务的参数不会相互干扰,提高了脚本的隔离性和安全性。\n\n\n\n## 参数管理核心方法\n\nDataXScript 类提供了三个核心方法用于参数的配置、读取和清理操作。这些方法是所有数据交换操作的基础,理解它们的用法是掌握数据交换功能的第一步。\n\n| 方法名称 | 方法签名 | 功能描述 | 返回值 |\n|---------|---------|---------|--------|\n| `setDataXParameter` | `setDataXParameter(name, value)` | 设置单个数据转换参数 | 无 |\n| `getDataXParameter` | `getDataXParameter(name)` | 获取指定参数的当前值 | 字符串形式的参数值 |\n| `clearDataXParameter` | `clearDataXParameter()` | 清除所有已配置的参数 | 无 |\n\n这些方法的设计遵循简单直观的原则,所有参数都以字符串形式传入和传出,底层会根据参数名称自动进行类型转换和验证。\n\n\n\n### 设置数据交换参数\n\n`setDataXParameter()` 方法是配置数据交换的主要方法,它接受两个参数:参数名称和参数值。参数名称是系统预定义的键,用于标识特定的配置项;参数值则是用户希望设置的值,可以是字符串、数字等各种类型,但都会以字符串形式传递。\n\n```python\nfrom sunvpy.PySSDataX import DataXScript\n\n# 创建数据交换脚本实例\ndatax = DataXScript()\n\n# 设置文件路径参数\ndatax.setDataXParameter(\"ImportPath\", \"D:\\\\data\\\\import\\\\roads.shp\")\ndatax.setDataXParameter(\"ExportPath\", \"D:\\\\data\\\\export\\\\output.mdb\")\n\n# 设置编码参数\ndatax.setDataXParameter(\"SourceEncoding\", \"GBK\")\ndatax.setDataXParameter(\"TargetEncoding\", \"UTF-8\")\n\n# 设置坐标系统参数\ndatax.setDataXParameter(\"CoordSystem\", \"EPSG:4326\")\n```\n\n参数名称通常采用大驼峰命名法,如 `ImportPath`、`CoordSystem` 等。在实际使用中,应根据具体的导入导出格式选择合适的参数名称。错误的参数名称可能会被忽略或导致后续执行失败。\n\n\n\n### 读取数据交换参数\n\n`getDataXParameter()` 方法允许您获取当前已设置的参数值,这对于参数验证和调试非常有用。该方法接受一个参数名称,返回该参数的当前值。如果参数未被设置,可能返回空字符串或默认值。\n\n```python\n# 读取之前设置的参数\nimport_path = datax.getDataXParameter(\"ImportPath\")\nprint(f\"导入路径: {import_path" + }, + { + "slug": "27-dao-ru-wai-bu-shu-ju", + "title": "导入外部数据", + "section": "数据交换与导入导出", + "headings": [ + "数据导入架构概览", + "支持的数据源类型", + "标准矢量数据格式", + "CAD 和工程数据格式", + "栅格和影像数据格式", + "三维和点云数据格式", + "数据导入核心方法", + "执行数据导入", + "获取导入文件名", + "数据导入流程详解", + "第一步:准备和验证源文件", + "第二步:配置导入参数", + "第三步:执行数据导入", + "第四步:验证导入结果", + "完整导入示例", + "批量导入数据", + "常见导入场景与参数配置", + "场景一:导入带中文字段的 Shapefile", + "场景二:导入不同坐标系统的数据", + "场景三:导入 CAD 数据(DXF/DWG)", + "场景四:增量导入数据", + "错误排查与问题解决", + "常见错误与解决方案", + "调试技巧", + "性能优化建议", + "优化参数配置", + "分批导入策略", + "学习路径建议" + ], + "content": "本页面详细介绍如何将各种格式的外部数据导入到 SunvStation 工作空间中。数据导入是地理信息系统中最常用的功能之一,通过合理配置导入参数,您可以精确控制数据转换行为,包括坐标系统、编码方式、图层映射等关键属性。掌握数据导入功能是构建数据处理流程的基础技能。\n\n\n\n## 数据导入架构概览\n\n数据导入功能基于 **DataXScript** 类实现,该类通过参数配置与执行分离的设计模式,提供了灵活且可扩展的数据交换框架。导入过程涉及数据源类型识别、参数配置、坐标转换和数据验证等多个环节,确保导入的数据能够正确集成到 SunvStation 工作空间中。\n\n```mermaid\ngraph TB\n A[开始数据导入] --> B[准备导入参数]\n B --> C{识别数据源类型}\n C -->|Shapefile| D[SHP 格式处理]\n C -->|MDB| E[数据库格式处理]\n C -->|DXF| F[CAD 格式处理]\n C -->|其他| G[GDAL 通用处理]\n D --> H[创建 DataXScript 实例]\n E --> H\n F --> H\n G --> H\n H --> I[配置导入参数]\n I --> J[importData 执行导入]\n J --> K{导入成功?}\n K -->|是| L[验证导入结果]\n K -->|否| M[检查错误信息]\n L --> N[更新工作空间]\n M --> N\n```\n\n数据导入的核心是 **DataXScript** 类,该类不作为全局单例暴露,因此每次导入任务都需要创建新的实例。这种设计避免了不同导入任务之间的参数污染,提高了脚本的隔离性和安全性。\n\n\n\n## 支持的数据源类型\n\nSunvStation 支持通过 GDAL 和 OGR 库导入多种常见的数据格式。系统通过静态方法 `DataSource.getDataSourceTypeByExt()` 自动识别文件扩展名并选择合适的数据源处理器。\n\n### 标准矢量数据格式\n\n| 格式名称 | 文件扩展名 | 数据源类型 | 支持的几何类型 | 适用场景 |\n|---------|-----------|-----------|--------------|---------|\n| Shapefile | `.shp` | `e_DataSource_EPS_GDAL` | 点、线、面 | 基础矢量数据交换 |\n| Personal Geodatabase | `.mdb` | `e_DataSource_EPS_GDAL` | 点、线、面 | ArcGIS 数据格式 |\n| File Geodatabase | `.gdb` | `e_DataSource_EPS_GDAL` | 点、线、面 | 大型空间数据库 |\n| GeoPackage | `.gpkg` | `e_DataSource_EPS_GDAL` | 点、线、面 | 现代 GIS 数据格式 |\n| KML/KMZ | `.kml`, `.kmz` | `e_DataSource_EPS_GDAL` | 点、线、面 | Google Earth 数据 |\n| GeoJSON | `.geojson`, `.json` | `e_DataSource_EPS_GDAL` | 点、线、面 | Web GIS 数据 |\n| CSV | `.csv` | `e_DataSource_EPS_GDAL` | 点(含坐标) | 表格坐标数据 |\n\n### CAD 和工程数据格式\n\n| 格式名称 | 文件扩展名 | 数据源类型 | 支持的几何类型 | 适用场景 |\n|---------|-----------|-----------|--------------|---------|\n| AutoCAD DXF | `.dxf` | `e_DataSource_DWG` | 点、线、面、文字 | CAD 数据交换 |\n| AutoCAD DWG | `.dwg` | `e_DataSource_DWG` | 点、线、面、文字 | AutoCAD 原生格式 |\n\n### 栅格和影像数据格式\n\n| 格式名称 | 文件扩展名 | 数据源类型 | 支持的数据类型 | 适用场景 |\n|---------|-----------|-----------|--------------|---------|\n| GeoTIFF | `.tif`, `.tiff` | `e_DataSource_IMG` | 栅格影像 | 高精度正射影像 |\n| ECW | `.e" + }, + { + "slug": "28-dao-chu-shu-ju-dao-wen-jian", + "title": "导出数据到文件", + "section": "数据交换与导入导出", + "headings": [ + "数据导出架构概览", + "支持的导出格式", + "标准矢量数据格式", + "CAD 和工程数据格式", + "栅格和影像数据格式", + "数据导出核心方法", + "执行数据导出", + "完整导出流程", + "导出参数配置详解", + "基础路径和格式参数", + "坐标系统参数", + "字段映射和筛选参数", + "导出场景实战", + "场景一:导出选择集数据为 Shapefile", + "场景二:导出为 GeoJSON 用于 Web 地图", + "场景三:导出为 AutoCAD DXF 格式", + "场景四:批量导出多个图层", + "错误处理与故障排除", + "常见导出错误及解决方案", + "导出前参数验证清单", + "最佳实践与性能优化", + "性能优化建议", + "代码组织建议", + "进阶学习路径" + ], + "content": "本页面详细介绍如何将 SunvStation 工作空间中的地理数据导出为各种格式的文件。数据导出是地理信息系统数据共享和交换的重要手段,通过合理配置导出参数,您可以精确控制输出格式、编码方式、坐标系统和属性字段映射等关键属性,确保导出的数据能够满足不同应用场景的需求。\n\n\n\n## 数据导出架构概览\n\n数据导出功能基于 **DataXScript** 类实现,该类采用与数据导入相同的架构设计,通过参数配置与执行分离的模式,提供了灵活且可扩展的数据交换框架。导出过程涉及数据源识别、参数配置、坐标转换、属性映射和文件生成等多个环节,确保导出的数据能够在其他系统中正确加载和使用。\n\n```mermaid\ngraph TB\n A[开始数据导出] --> B[准备导出数据源]\n B --> C{识别导出格式}\n C -->|Shapefile| D[SHP 格式处理]\n C -->|MDB| E[数据库格式处理]\n C -->|DXF| F[CAD 格式处理]\n C -->|GeoJSON| G[Web 格式处理]\n C -->|其他| H[GDAL 通用处理]\n D --> I[创建 DataXScript 实例]\n E --> I\n F --> I\n G --> I\n H --> I\n I --> J[配置导出参数]\n J --> K[exportData 执行导出]\n K --> L{导出成功?}\n L -->|是| M[验证输出文件]\n L -->|否| N[检查错误信息]\n M --> O[导出完成]\n N --> O\n```\n\nDataXScript 类作为数据导出的核心组件,提供了完整的参数管理和执行接口。与数据导入类似,导出功能也不依赖全局单例,每次导出任务都需要创建新的实例。这种设计确保了不同导出任务之间的参数隔离,提高了脚本的可靠性和可维护性。\n\n\n\n## 支持的导出格式\n\nSunvStation 支持通过 GDAL 和 OGR 库导出多种常见的数据格式,覆盖了从传统 GIS 格式到现代 Web GIS 格式的广泛范围。系统会根据指定的输出文件扩展名自动选择合适的导出驱动器,并应用相应的格式转换规则。\n\n### 标准矢量数据格式\n\n| 格式名称 | 文件扩展名 | 导出特点 | 几何类型支持 | 属性字段限制 |\n|---------|-----------|---------|------------|------------|\n| Shapefile | `.shp` | 最常用的交换格式,字段名限制 10 字符 | 点、线、面 | 单文件 2GB 限制 |\n| Personal Geodatabase | `.mdb` | Microsoft Access 数据库,支持复杂关系 | 点、线、面 | 2GB 数据库限制 |\n| File Geodatabase | `.gdb` | Esri 现代格式,支持大数据量 | 点、线、面 | 单数据集 1TB 限制 |\n| GeoPackage | `.gpkg` | OGC 标准,轻量级跨平台 | 点、线、面 | 无明确大小限制 |\n| KML/KMZ | `.kml`, `.kmz` | Google Earth 格式,支持样式和标注 | 点、线、面 | 适合可视化展示 |\n| GeoJSON | `.geojson`, `.json` | Web 标准,基于 JSON | 点、线、面 | 适合 Web 应用 |\n| CSV | `.csv` | 文本表格格式,可导出坐标信息 | 点(带坐标) | 适合表格处理 |\n\n### CAD 和工程数据格式\n\n| 格式名称 | 文件扩展名 | 导出特点 | 几何类型支持 | 样式保留 |\n|---------|-----------|---------|------------|---------|\n| AutoCAD DXF | `.dxf` | 开放的 CAD 交换格式 | 点、线、面、文字 | 部分样式保留 |\n| AutoCAD DWG | `.dwg` | AutoCAD 原生格式 | 点、线、面、文字 | 完整样式保留 |\n\n### 栅格和影像数据格式\n\n| 格式名称 | 文件扩展名 | 导出特点 | 压缩支持 | 适用场景 |\n|---------|-----------|---------|---------|---------|\n| GeoTIFF | `.tif`, `.tiff` | 地理信息标准格式 | LZW, DEFLATE, JPEG | 高质量影像输出 |\n| ECW | `.ecw" + }, + { + "slug": "29-zi-ding-yi-shu-ju-jiao-huan-liu-cheng", + "title": "自定义数据交换流程", + "section": "数据交换与导入导出", + "headings": [ + "自定义数据交换架构", + "模式一:带数据预处理的交换流程", + "流程架构与步骤", + "完整代码示例", + "关键步骤对比表", + "模式二:批量文件处理流程", + "批量处理架构", + "批量处理完整示例", + "批量处理优化技巧", + "模式三:带日志记录和进度跟踪的增强流程", + "增强流程架构", + "增强流程实现示例", + "日志和进度功能对比", + "自定义流程设计模式", + "模式一:流程模板模式", + "模式二:管道模式", + "错误处理与最佳实践", + "错误处理策略", + "最佳实践总结", + "常见问题排查", + "学习路径建议" + ], + "content": "本页面详细讲解如何构建自定义数据交换流程,将基础的数据导入导出功能组合成复杂的工作流。通过将 DataXScript 与 SSProcessManager 集合,并结合选择集操作、数据处理和进度跟踪等功能,您可以实现自动化的批量数据转换、质量检查和多格式同步导出等高级场景。\n\n\n\n## 自定义数据交换架构\n\n自定义数据交换流程的核心思想是将数据交换作为数据处理工作流中的一个环节,与选择集管理、属性编辑、数据验证等功能有机结合。这种架构允许在数据导入后进行预处理,在数据导出前进行质量检查,实现端到端的自动化数据处理。\n\n```mermaid\ngraph TB\n A[开始自定义数据交换流程] --> B{选择流程类型}\n B -->|简单导入导出| C[基础模式]\n B -->|带数据预处理| D[处理模式]\n B -->|批量文件处理| E[批量模式]\n B -->|多格式同步导出| F[同步模式]\n \n C --> C1[配置参数]\n C1 --> C2[执行交换]\n C2 --> C3[结果验证]\n \n D --> D1[数据导入]\n D1 --> D2[选择集筛选]\n D2 --> D3[数据转换]\n D3 --> D4[质量检查]\n D4 --> D5[数据导出]\n \n E --> E1[遍历文件列表]\n E1 --> E2[逐个导入]\n E2 --> E3[进度跟踪]\n E3 --> E4[错误恢复]\n \n F --> F1[数据准备]\n F1 --> F2[配置多目标参数]\n F2 --> F3[并行/串行导出]\n F3 --> F4[结果汇总]\n \n C3 --> G[流程完成]\n D5 --> G\n E4 --> G\n F4 --> G\n```\n\n自定义数据交换流程基于以下核心组件构建:**DataXScript** 负责数据交换,**SSProcessManager** 提供工作流控制,**Mixin 模块** 提供日志、进度等辅助功能。这种模块化设计使您能够根据需求灵活组合功能。\n\n\n\n## 模式一:带数据预处理的交换流程\n\n这种模式适用于需要在数据导入后进行数据处理再导出的场景,例如数据清洗、属性标准化、坐标转换等。典型的应用包括:将外部数据导入后根据业务规则修改属性,然后导出为标准格式。\n\n### 流程架构与步骤\n\n```mermaid\nflowchart TD\n Start([开始预处理交换流程]) --> Init[初始化 SSProcessManager]\n Init --> InitDataX[创建 DataXScript 实例]\n InitDataX --> ConfigImport[配置导入参数]\n ConfigImport --> ExecuteImport[执行 importData]\n ExecuteImport --> CheckImport{导入成功?}\n CheckImport -->|否| LogImportError[记录导入错误] --> ErrorEnd([流程失败])\n CheckImport -->|是| SelectData[筛选需要处理的数据]\n SelectData --> SetCondition[设置筛选条件]\n SetCondition --> Filter[执行 selectFilter]\n Filter --> CheckData{有选择集?}\n CheckData -->|否| NoDataEnd([无数据需处理])\n CheckData -->|是| ProcessData[遍历选择集处理数据]\n ProcessData --> ModifyAttributes[修改属性]\n ModifyAttributes --> SaveChanges[保存到数据库]\n SaveChanges --> ConfigExport[配置导出参数]\n ConfigExport --> ExecuteExport[执行 exportData]\n ExecuteExport --> CheckExport{导出成功?}\n CheckExport -->|否| LogExportError[记录导出错误] --> ErrorEnd\n CheckExport -->|是| VerifyResult[验证输出文件]\n VerifyResult --> SuccessEnd([流程成功" + }, + { + "slug": "30-shu-ju-jian-cha-ji-lu-guan-li", + "title": "数据检查记录管理", + "section": "数据检查与验证", + "headings": [ + "系统架构概览", + "核心功能模块", + "记录生命周期管理", + "持久化与IO操作", + "查询与访问", + "检查记录数据结构", + "关键字段说明", + "典型使用流程", + "基础实例化", + "添加检查记录", + "统计与查询", + "持久化与清理", + "检查记录的高级应用", + "与选择集的协同", + "历史记录对比", + "性能考虑与最佳实践", + "批量操作优化", + "记录内容优化", + "常见问题与故障排除", + "记录无法保存", + "geoids 和 noteids 格式错误", + "GetCheckRecordValue 返回空值", + "学习路径建议" + ], + "content": "数据检查记录管理是 SunvStation 数据质量保证系统的核心组件,用于记录、追踪和管理数据验证过程中发现的各类问题。通过该机制,您可以系统地捕获检查结果、定位问题对象、记录问题描述,并支持后续的统计分析和问题修复工作。数据检查记录为数据生产流程提供了可追溯的质量控制能力。\n\n\n\n## 系统架构概览\n\n数据检查记录管理基于 **CheckFunForPY** 类实现,该类通过 SWIG 封装技术连接 Python 业务逻辑与 C++ 核心检查引擎。在整个系统架构中,CheckFunForPY 位于接口层,与工作空间、地图管理等核心模块协同工作,形成完整的数据质量保障体系。\n\n```mermaid\ngraph TB\n subgraph \"应用层 Python 业务逻辑\"\n Script[检查脚本]\n end\n \n subgraph \"接口层 SWIG 封装\"\n CheckFun[CheckFunForPY
检查记录管理类]\n OtherMods[其他接口模块
PySSCore, PySSMap等]\n end\n \n subgraph \"实现层 C++ 核心库\"\n CheckDL[_PySSCheck.pyd
检查引擎实现]\n OtherDL[其他核心库
_PySSCore.pyd等]\n end\n \n Script -->|实例化| CheckFun\n Script -->|可能调用| OtherMods\n \n CheckFun -->|调用| CheckDL\n CheckFun -.->|协作| OtherMods\n OtherMods --> OtherDL\n \n style CheckFun fill:#e1f5ff\n style CheckDL fill:#fff4e1\n```\n\nCheckFunForPY 类采用了 **记录集管理模式**,检查记录以集合形式在内存中维护,提供增删改查的完整操作。与 SSProcessManager 的单例模式不同,CheckFunForPY 需要显式实例化,这种设计允许同时维护多个独立的检查记录集合,适用于并行检查或分段检查等复杂场景。\n\n\n\n## 核心功能模块\n\n数据检查记录管理包含六大核心功能模块,每个模块对应一组相关的方法,共同构成完整的检查记录生命周期管理能力。\n\n### 记录生命周期管理\n\n| 方法名称 | 功能说明 | 典型应用场景 |\n|---------|---------|------------|\n| `AddCheckRecord()` | 添加一条新的检查记录 | 数据验证脚本发现问题时记录 |\n| `RemoveCheckRecord()` | 删除指定的检查记录 | 误报修正或批量清理 |\n| `GetCheckRecordCount()` | 获取当前检查记录总数 | 统计分析、进度监控 |\n| `ClearCheckRecord()` | 清空所有检查记录 | 开始新一轮检查前初始化 |\n\n记录的生命周期从添加开始,经过可能的删除操作,最终通过保存操作持久化。这种设计遵循**最小状态原则**,检查记录仅在内存中维护显式状态,避免隐式的后台同步操作。\n\n\n\n### 持久化与IO操作\n\n| 方法名称 | 功能说明 | 操作目标 |\n|---------|---------|---------|\n| `LoadCheckRecord()` | 从文件加载历史检查记录 | 恢复之前保存的检查结果 |\n| `SaveCheckRecord()` | 将当前检查记录保存到文件 | 持久化存储检查结果 |\n| `WriteCheckRecord()` | 将检查记录写入系统输出 | 与系统检查模块集成 |\n\n持久化操作支持检查结果的跨会话复用,您可以在不同时间点加载和比较检查结果,追踪数据质量的演变趋势。\n\n\n\n### 查询与访问\n\n| 方法名称 | 功能说明 | 参数说明 |\n|---------|---------|---------|\n| `GetCheckRecordValue()` | 获取指定记录的字段值 | 支持批量获取多个字段 |\n| `ShowCheckOutput()` | 显示检查输出结果 | 在系统界面中呈现 |\n\n查询方法提供了灵活的数据访问能力,支持按索引定位记录并提取特定字段,便于生成定制化的报告或进行深度分析。\n\n\n\n## 检查记录数据结构\n\n每条检查记录包含丰富的元数据信息,用于完整描述检查发现的问题。理解这些字段的结构是有效使" + }, + { + "slug": "31-tian-jia-yu-jia-zai-jian-cha-ji-lu", + "title": "添加与加载检查记录", + "section": "数据检查与验证", + "headings": [ + "添加检查记录详解", + "方法签名与参数说明", + "添加操作的工作流程", + "基础添加示例", + "多对象关联添加", + "加载检查记录详解", + "方法功能与返回值", + "加载操作的执行过程", + "基础加载示例", + "加载前的清空处理", + "实践案例:质量追踪系统", + "场景说明", + "完整实现代码", + "最佳实践与注意事项", + "参数传递的最佳实践", + "坐标信息的准确获取", + "加载操作的错误处理", + "批量加载与增量更新", + "进阶主题:与系统集成", + "与地图显示的集成", + "学习路径建议" + ], + "content": "数据检查记录的添加与加载是 SunvStation 数据质量保证系统中最为核心的两个操作。添加操作用于在数据验证过程中实时记录发现的问题,加载操作则用于恢复历史检查结果或在不同检查会话之间共享数据。这两个操作共同构成了检查记录管理的基础,支撑着完整的数据质量控制生命周期。\n\n通过精心设计的参数体系和灵活的持久化机制,添加与加载操作能够适应从快速原型验证到大规模生产检查的各种应用场景。掌握这两个操作的使用方法,是编写高质量数据检查脚本的关键技能。\n\n\n\n## 添加检查记录详解\n\n添加检查记录是数据验证脚本中最为频繁的操作,通过 `AddCheckRecord()` 方法将发现的数据问题记录到内存中的检查记录集合中。该方法通过丰富的参数体系完整地描述了检查发现的问题,包括问题分类、空间位置、关联对象等多维度信息。\n\n### 方法签名与参数说明\n\n`AddCheckRecord()` 方法的完整签名包含10个参数,每个参数都有其特定的语义和使用场景:\n\n```python\ndef AddCheckRecord(self, group, check, checkmodel, description, x, y, z, objtype, geoids, noteids):\n```\n\n| 参数名 | 数据类型 | 必需 | 说明 | 典型值 |\n|--------|---------|------|------|--------|\n| `group` | string | 是 | 检查组名称,用于逻辑分组 | \"拓扑检查\"、\"属性完整性\" |\n| `check` | string | 是 | 检查项名称,标识具体检查类型 | \"重叠检查\"、\"必填项缺失\" |\n| `checkmodel` | int | 是 | 检查模式标识符 | 0-255之间的整数值 |\n| `description` | string | 是 | 问题描述或错误详情 | 简洁清晰的问题描述文本 |\n| `x` | float | 是 | 问题位置X坐标 | 地理坐标系统中的X值 |\n| `y` | float | 是 | 问题位置Y坐标 | 地理坐标系统中的Y值 |\n| `z` | float | 是 | 问题位置Z坐标 | 高程值,通常为0.0 |\n| `objtype` | int | 是 | 关联对象的类型 | 1=点,2=线,3=面等 |\n| `geoids` | string | 是 | 地物对象ID列表,逗号分隔 | \"1001,1002,1003\" |\n| `noteids` | string | 是 | 注记对象ID列表,逗号分隔 | \"2001,2002\" |\n\n该设计遵循**信息完整性原则**,确保每条记录包含问题追踪和定位所需的所有信息,同时通过字符串形式的ID列表支持多对象关联场景。\n\n\n\n### 添加操作的工作流程\n\n理解添加操作的内部处理流程有助于编写更高效的检查脚本。当调用 `AddCheckRecord()` 时,系统会执行一系列验证和处理步骤:\n\n```mermaid\nflowchart TD\n A[调用 AddCheckRecord] --> B{参数有效性验证}\n B -->|通过| C[创建检查记录对象]\n B -->|失败| D[记录添加失败]\n \n C --> E[设置 group 和 check 字段]\n E --> F[设置空间坐标 x, y, z]\n F --> G[设置 objtype 对象类型]\n G --> H[解析 geoids 字符串为ID列表]\n H --> I[解析 noteids 字符串为ID列表]\n I --> J[设置 description 描述信息]\n J --> K[记录添加到内存集合]\n K --> L[返回成功状态]\n \n D --> M[抛出异常或返回错误]\n \n style C fill:#e1f5ff\n style K fill:#fff4e1\n style L fill:#d4edda\n```\n\n该流程体现了**防御性编程**的设计思想,在添加记录前进行参数验证,避免无效数据污染检查记录集合。坐标和对象类型信息的设置支持后续的空间查询和类型过滤,而ID列表的解析则实现了从字符串表示到结构化数据的转换。\n\n\n\n### 基础添加示例\n\n以下是一个完整的添加检查记录示例,展示了如何在实际脚本中记录拓扑重叠问题:\n\n```python\nfrom sunvpy.PySSCheck import CheckFunForPY\nfrom sunvpy import SSProcess\n\n#" + }, + { + "slug": "32-xian-shi-jian-cha-jie-guo", + "title": "显示检查结果", + "section": "数据检查与验证", + "headings": [ + "核心功能概述", + "基础使用方法", + "方法签名", + "最简示例", + "检查结果窗口界面", + "窗口结构", + "记录显示内容", + "交互功能", + "完整工作流程示例", + "多类型检查结果展示", + "混合检查示例", + "显示前的准备工作", + "记录数量检查", + "记录有效性验证", + "保存后显示", + "高级应用场景", + "批量检查后的结果展示", + "历史对比显示", + "常见问题与解决方案", + "窗口无法显示", + "大量记录显示缓慢", + "空间定位不准确", + "最佳实践总结", + "显示时机建议", + "代码模板", + "学习路径建议" + ], + "content": "显示检查结果是数据质量验证流程的最后一步,通过可视化界面呈现检查记录中记录的所有问题,帮助用户快速定位、分析和修复数据缺陷。通过 `ShowCheckOutput()` 方法,系统将内存中的检查记录转换为直观的检查结果窗口,提供交互式的问题浏览和定位功能。\n\n\n\n## 核心功能概述\n\n`ShowCheckOutput()` 是 CheckFunForPY 类提供的关键方法,用于在系统界面中弹出一个独立的检查结果查看窗口。该窗口以表格或列表形式展示所有检查记录,支持按检查组、检查项进行分类展示,并提供空间定位功能,点击某条记录即可自动缩放地图到问题发生的位置。\n\n该方法的设计遵循**最小调用原则**,无需任何参数即可完成完整的显示操作,系统会自动读取当前 CheckFunForPY 实例中的所有检查记录并渲染到界面。这种设计降低了使用门槛,使得在检查完成后只需一行代码即可呈现结果。\n\n```mermaid\ngraph TB\n subgraph \"检查脚本执行流程\"\n A[创建 CheckFunForPY 实例] --> B[执行数据检查逻辑]\n B --> C[调用 AddCheckRecord 记录问题]\n C --> D[检查完成]\n end\n \n subgraph \"结果显示阶段\"\n D --> E[调用 ShowCheckOutput]\n E --> F[读取内存中的检查记录集合]\n F --> G[生成检查结果窗口]\n G --> H[用户交互浏览问题]\n H --> I[点击定位到地图]\n end\n \n style E fill:#e1f5ff\n style G fill:#fff4e1\n style I fill:#d4edda\n```\n\n\n\n## 基础使用方法\n\n### 方法签名\n\n`ShowCheckOutput()` 方法的签名非常简洁:\n\n```python\ndef ShowCheckOutput(self):\n```\n\n- **返回值**: 无明确文档说明返回值类型,从调用方代码推断为布尔值或无返回\n- **参数**: 无需任何参数\n- **异常**: 调用失败时可能抛出异常,建议在 try-except 结构中调用\n\n### 最简示例\n\n以下是使用 ShowCheckOutput 的最简示例,展示了典型的检查-记录-显示流程:\n\n```python\nfrom sunvpy.PySSCheck import CheckFunForPY\n\n# 创建检查记录管理实例\ncheck_fun = CheckFunForPY()\n\n# ... 执行检查逻辑,调用 AddCheckRecord 添加问题记录 ...\ncheck_fun.AddCheckRecord(\n group=\"拓扑检查\",\n check=\"重叠检查\",\n checkmodel=1,\n description=\"建筑物A与建筑物B存在重叠\",\n x=123456.78, y=345678.90, z=0.0,\n objtype=3,\n geoids=\"1001,1002\",\n noteids=\"\"\n)\n\n# 显示检查结果\ncheck_fun.ShowCheckOutput()\n```\n\n执行上述代码后,系统会弹出一个检查结果窗口,显示所有已添加的检查记录。\n\n\n\n## 检查结果窗口界面\n\n### 窗口结构\n\n检查结果窗口通常包含以下主要区域:\n\n| 区域 | 功能 | 说明 |\n|------|------|------|\n| **记录列表区** | 显示所有检查记录的摘要信息 | 包括组名、检查项、描述、位置等 |\n| **详情面板** | 显示当前选中记录的完整信息 | 展示所有字段的详细值 |\n| **工具栏** | 提供常用操作按钮 | 定位、刷新、导出等功能 |\n| **统计信息** | 显示问题统计概览 | 按组分类统计问题数量 |\n\n### 记录显示内容\n\n每条检查记录在窗口中显示以下核心信息:\n\n- **检查组**: 用于逻辑分组,如\"拓扑检查\"、\"属性检查\"\n- **检查项**: 标识具体检查类型,如\"重叠检查\"、\"名称缺失\"\n- **问题描述**: 简要描述发现的问题\n- **位置坐标**: 问题发生的 X、Y、Z 坐标\n- **关联对象**: 涉及的地物 ID 和注记 ID 列表\n\n### 交互功能\n\n检查结果窗口支持多种交互操作,提升问题处理的效率:\n\n```mermaid\nflowchart LR\n A[检" + }, + { + "slug": "33-zi-ding-yi-jian-cha-gui-ze", + "title": "自定义检查规则", + "section": "数据检查与验证", + "headings": [ + "检查规则架构设计", + "核心组件角色", + "检查规则的基本结构", + "标准模板", + "常见检查类型实现", + "属性完整性检查", + "拓扑关系检查", + "几何规则检查", + "业务规则检查", + "高级检查模式", + "组合检查模式", + "增量检查模式", + "性能优化最佳实践", + "数据访问优化", + "算法复杂度控制", + "进度反馈优化", + "错误处理与调试", + "检查规则的部署与管理", + "配置化检查规则", + "学习路径建议" + ], + "content": "自定义检查规则是 SunvStation 数据质量保证系统中最为灵活和强大的功能,允许开发者根据特定的业务需求和技术规范编写专属的数据验证逻辑。通过组合 CheckFunForPY 的检查记录管理能力、SSProcessManager 的选择集操作能力以及 Python 的丰富生态系统,您可以构建从简单的属性完整性检查到复杂的空间拓扑验证等各类检查规则。\n\n自定义检查规则的核心价值在于**将通用的检查框架与特定的业务逻辑分离**。系统提供了检查记录管理、结果显示、持久化存储等通用能力,而您只需要专注于实现具体的检查算法和数据验证逻辑。这种设计既降低了开发门槛,又保持了系统的扩展性。\n\n\n\n## 检查规则架构设计\n\n自定义检查规则采用**分层架构模式**,将检查任务分解为数据准备、检查执行、结果记录三个阶段。每个阶段由不同的组件负责,通过明确定义的接口协作,形成清晰的职责划分。\n\n```mermaid\ngraph TB\n subgraph \"检查规则脚本层\"\n Script[检查规则脚本
自定义业务逻辑]\n end\n \n subgraph \"功能组件层\"\n CF[CheckFunForPY
检查记录管理]\n SS[SSProcessManager
选择集与数据操作]\n Logger[日志组件
日志与进度]\n end\n \n subgraph \"数据层\"\n WS[工作空间
WorkSpace]\n Map[地图数据
ScaleMap]\n DS[数据源
DataSource]\n end\n \n subgraph \"持久化层\"\n File[检查记录文件]\n end\n \n Script -->|实例化| CF\n Script -->|调用| SS\n Script -->|使用| Logger\n \n SS -->|访问| WS\n SS -->|操作| Map\n WS -->|获取| DS\n \n CF -->|保存/加载| File\n \n style Script fill:#e1f5ff\n style CF fill:#fff4e1\n style SS fill:#ffe1f5\n```\n\n该架构体现了**关注点分离**的设计原则。检查脚本专注于业务逻辑的实现,不关心底层的记录管理和数据访问细节。这种分层设计使得检查规则易于测试、维护和复用。\n\n\n\n### 核心组件角色\n\n| 组件 | 职责 | 主要方法/特性 |\n|------|------|-------------|\n| **检查规则脚本** | 实现具体的检查逻辑,协调各组件协作 | 自定义函数、类、算法实现 |\n| **CheckFunForPY** | 管理检查记录的生命周期 | AddCheckRecord、GetCheckRecordCount、ShowCheckOutput |\n| **SSProcessManager** | 提供数据查询、遍历、编辑能力 | setSelectCondition、selectFilter、getSelGeoValue |\n| **日志组件** | 记录检查过程,提供进度反馈 | logger.info、startProgress、stepProgress |\n\n这种设计允许开发者**组合基础组件**构建复杂的检查规则,而不需要从零开始实现所有功能。每个组件都经过充分测试,提供了稳定的 API 接口。\n\n\n\n## 检查规则的基本结构\n\n一个规范的自定义检查规则脚本通常包含五个关键部分:**初始化、数据准备、检查执行、结果处理、清理退出**。遵循这种结构可以确保脚本的逻辑清晰、易于维护。\n\n```mermaid\nflowchart TD\n A[脚本开始] --> B[初始化阶段
创建组件实例]\n B --> C[数据准备阶段
设置选择条件、加载数据]\n C --> D[检查执行阶段
遍历对象、应用检查逻辑]\n D --> E{发现问题?}\n E -->|是| F[添加检查记录]\n E -->|否| G[继续下一个对象]\n F --> G\n G --> D\n \n D --> H{检查完成?}\n H -->|否| D\n H -->|是| I[结果处理阶段
统计、显示、保存]\n I --> J[清理退出阶段
释放资源]\n " + }, + { + "slug": "34-huo-qu-gong-zuo-kong-jian-xin-xi", + "title": "获取工作空间信息", + "section": "高级功能", + "headings": [ + "架构概览", + "获取工作空间实例", + "基本用法", + "使用场景", + "获取当前地图", + "获取方法", + "地图信息获取表", + "获取系统路径", + "路径模式对照表", + "使用示例", + "路径获取流程", + "获取图层信息", + "图层操作方法", + "使用示例", + "图层信息获取流程", + "获取符号表信息", + "符号表查询方法", + "使用示例", + "符号表切换", + "获取地图图幅信息", + "图幅操作方法", + "使用示例", + "图幅处理流程", + "综合应用示例", + "最佳实践", + "1. 始终检查空引用", + "2. 合理使用系统路径", + "3. 及时释放资源", + "4. 批量操作前检查图层状态", + "5. 使用日志记录关键信息", + "错误处理与调试", + "常见错误类型", + "错误处理示例", + "API 快速参考", + "下一步学习" + ], + "content": "获取工作空间信息是 SunvStation 开发中的基础操作,它允许脚本访问当前活动的地图实例、系统路径、图层配置以及各种表管理信息。掌握这些信息获取方法对于构建功能完善的脚本至关重要。\n\n## 架构概览\n\n工作空间信息获取通过 `ProjectMixin` 提供的便捷方法实现,这些方法封装了底层的 `WorkSpace` 和 `ScaleMap` 对象访问逻辑。以下展示了获取工作空间信息的调用层次结构:\n\n```mermaid\ngraph TD\n A[Python 脚本] -->|调用| B[SSProcess 实例]\n B -->|继承| C[ProjectMixin]\n C -->|提供方法| D[getWorkspace]\n C -->|提供方法| E[getCurrentMap]\n C -->|提供方法| F[getSysPathName]\n C -->|提供方法| G[getLayerCount/Name]\n C -->|提供方法| H[getFeatureCodeTB]\n \n D -->|访问| WS[WorkSpace 单例]\n E -->|调用| WS\n WS -->|返回| SM[ScaleMap 当前地图]\n F -->|使用| GO[GlobalOptions 单例]\n G -->|访问| SM\n H -->|访问| SM\n \n style B fill:#e1f5ff\n style C fill:#fff4e1\n style WS fill:#f0f0f0\n style SM fill:#f0f0f0\n```\n\n\n\n## 获取工作空间实例\n\n工作空间是 SunvStation 系统的全局单例对象,通过 `getWorkspace()` 方法可以获取当前工作空间的实例。这个实例提供了访问系统级资源和配置的入口。\n\n### 基本用法\n\n```python\n# 获取工作空间实例\nworkspace = SSProcess.getWorkspace()\n\n# 获取当前活动的地图\ncurrent_map = workspace.getCurrentScaleMap()\n```\n\n\n\n### 使用场景\n\n获取工作空间实例的主要使用场景包括:\n\n- **访问多个地图**:当需要操作非当前活动的地图时\n- **系统级配置**:获取全局配置选项和路径信息\n- **资源协调**:在不同地图间协调资源访问\n\n## 获取当前地图\n\n`getCurrentMap()` 方法返回当前活动的地图实例(`ScaleMap` 类型),这是进行地图操作的主要入口。\n\n### 获取方法\n\n```python\n# 获取当前地图\ncurrent_map = SSProcess.getCurrentMap()\n\n# 检查地图是否存在\nif current_map is None:\n print(\"当前没有打开的地图\")\n return\n\n# 获取地图项目名称\nproject_name = current_map.getProjectName()\n```\n\n\n\n### 地图信息获取表\n\n| 信息类型 | 获取方法 | 说明 |\n|---------|---------|------|\n| 项目名称 | `getProjectName()` | 返回当前工程文件路径 |\n| 图层数量 | `getLayerSize()` | 返回地图中的图层数量 |\n| 数据源 | `getCurrentDataSource()` | 返回当前活动的数据源 |\n\n\n\n## 获取系统路径\n\n系统路径信息对于脚本访问配置文件、模板、脚本目录等非常重要。`getSysPathName(mode)` 方法根据模式参数返回不同类型的系统路径。\n\n### 路径模式对照表\n\n| 模式 | 路径类型 | 说明 | 典型用途 |\n|-----|---------|------|---------|\n| 0 | 配置路径 | 存放系统配置文件 | 读取系统配置 |\n| 1 | 模板路径 | 存放模板文件 | 加载数据模板 |\n| 2 | Comm 路径 | 公共资源路径 | 访问共享资源 |\n| 3 | Script 路径 | 脚本文件路径 | 动态加载脚本 |\n| 4 | SSTemp 路径 | 临时文件路径 | 存储临时数据 |\n| 5 | 工程文件路径 | 当前工程所在目录 | 相对路径计算 |\n| 6 | 系统目录 | Windows 系统目录或 Unix /usr | 访问系统文件 |\n| 7/8 | 工作台面目录 | 用户工作台面目录 | 输出文件" + }, + { + "slug": "35-xi-tong-lu-jing-guan-li", + "title": "系统路径管理", + "section": "高级功能", + "headings": [ + "架构概览", + "路径模式详解", + "路径模式对照表", + "路径特点说明", + "基本用法", + "获取各类系统路径", + "构造完整文件路径", + "高级用法", + "获取工程文件路径", + "跨平台系统目录访问", + "工作台面目录操作", + "路径获取流程", + "综合应用示例", + "最佳实践", + "1. 优先使用系统路径而非硬编码", + "2. 始终检查路径有效性", + "3. 使用 pathlib 进行路径操作", + "4. 临时文件及时清理", + "5. 处理路径中的斜杠", + "错误处理与调试", + "常见错误类型", + "错误处理示例", + "API 快速参考", + "下一步学习" + ], + "content": "系统路径管理是 SunvStation 二次开发中的核心功能之一,它允许脚本动态访问系统配置文件、模板、脚本目录、临时文件目录等关键资源路径。通过统一的接口获取路径信息,可以确保脚本在不同安装环境和操作系统上的兼容性和可移植性。\n\n## 架构概览\n\n系统路径管理通过 `ProjectMixin` 提供的 `getSysPathName(mode)` 方法实现,该方法封装了底层的 `GlobalOptions` 单例对象访问逻辑,根据模式参数返回不同类型的系统路径。以下展示了系统路径管理的调用层次结构:\n\n```mermaid\ngraph TD\n A[Python 脚本] -->|调用| B[SSProcess 实例]\n B -->|继承| C[ProjectMixin]\n C -->|提供方法| D[getSysPathName]\n D -->|使用| E[GlobalOptions 单例]\n \n D -->|mode=0| F[getConfigurePath]\n D -->|mode=1| G[getTemplatePath]\n D -->|mode=2| H[getCommonPath]\n D -->|mode=3| I[getSchemeFilePath]\n D -->|mode=4| J[getEpsTempPath]\n D -->|mode=5| K[getCurrentMap]\n D -->|mode=6| L[os.environ]\n D -->|mode=7/8| M[getSchemeFilePath]\n \n K -->|获取| N[getProjectName]\n N -->|Path.parent| O[工程目录]\n \n style B fill:#e1f5ff\n style C fill:#fff4e1\n style E fill:#f0f0f0\n```\n\n\n\n## 路径模式详解\n\n`getSysPathName(mode)` 方法支持 9 种路径模式(0-8),每种模式对应不同类型的系统路径。理解这些路径模式的用途对于构建健壮的脚本至关重要。\n\n### 路径模式对照表\n\n| 模式 | 路径类型 | 底层方法 | 说明 | 典型用途 |\n|-----|---------|---------|------|---------|\n| 0 | 配置路径 | `getConfigurePath()` | 存放系统配置文件(Windows 下为应用程序路径) | 读取 SSGlobal.xml 等配置文件 |\n| 1 | 模板路径 | `getTemplatePath()` | 存放地物模板文件 | 加载 .egdb 模板创建新工程 |\n| 2 | Comm 路径 | `getCommonPath()` | 公共资源目录 | 访问共享的数据符号库 |\n| 3 | Script 路径 | `getSchemeFilePath(\"scripts\")` | 脚本文件目录 | 动态加载或引用其他脚本 |\n| 4 | SSTemp 路径 | `getEpsTempPath()` | 临时文件目录 | 存储中间处理结果 |\n| 5 | 工程文件路径 | `getCurrentMap().getProjectName()` | 当前工程文件所在目录 | 计算相对路径、保存输出 |\n| 6 | 系统目录 | `WINDIR` 或 `/usr` | 操作系统目录 | 访问系统级文件 |\n| 7 | 工作台面目录 | `getSchemeFilePath(\"\")` | 用户工作台面根目录 | 访问用户自定义配置 |\n| 8 | 工作台面目录 | `getSchemeFilePath(\"\")` | 用户工作台面根目录 | 同模式 7,保留兼容性 |\n\n\n\n### 路径特点说明\n\n**配置路径(mode 0)**:在 Windows 系统中通常为应用程序安装目录,在 Unix 系统中可能为 `/etc` 或 `/opt` 等系统配置目录。此路径用于存放全局配置文件,如 `SSGlobal.xml`。\n\n**模板路径(mode 1)**:存放预定义的地物模板文件(.egdb 格式)。当需要创建新的工程文件时,通常基于这些模板进行初始化。\n\n**Comm 路径(mode 2)**:公共资源目录,包含符号库、样式表等跨工程共享的资源文件。\n\n**Script 路径(mode 3)**:存放 Python 脚本文件的目录。此路径对于脚本间的相互引用(import)和动态加载(exec)非常重要。\n\n**SSTemp 路径(m" + }, + { + "slug": "36-di-tu-suo-fang-kong-zhi", + "title": "地图缩放控制", + "section": "高级功能", + "headings": [ + "架构概览", + "地图比例尺控制", + "比例尺控制方法", + "设置比例尺流程", + "使用示例", + "窗口缩放控制", + "窗口缩放方法", + "窗口缩放流程", + "使用示例", + "坐标系统转换", + "坐标转换方法表", + "坐标转换流程", + "使用示例", + "视图平移控制", + "平移控制方法", + "平移流程", + "使用示例", + "获取视图缩放比例", + "获取缩放比例方法", + "使用示例", + "视图刷新控制", + "视图刷新方法", + "使用示例", + "获取地图矩形信息", + "地图矩形方法", + "使用示例", + "对象缩放操作", + "对象缩放方法", + "对象缩放流程", + "使用示例", + "综合应用示例", + "示例:自动定位到指定区域并调整比例尺", + "常见问题与解决方案", + "问题1:比例尺设置失败", + "问题2:坐标转换结果不准确", + "问题3:视图刷新后显示异常", + "最佳实践", + "1. 批量操作前创建撤销标记", + "2. 缩放操作后刷新视图", + "3. 使用坐标转换实现精确定位", + "4. 检查地图有效性", + "相关页面" + ], + "content": "地图缩放控制是 SunvStation 二次开发中的核心功能之一,它允许脚本程序动态调整地图视图的显示范围、比例尺和视角。通过精确的缩放控制,可以实现自动定位、视图切换、数据浏览等丰富的交互功能。本页将系统地介绍地图缩放控制的各项功能、使用方法和最佳实践。\n\n\n\n## 架构概览\n\nSunvStation 的地图缩放控制采用分层架构设计,底层的 `ScaleMap` 对象负责地图数据的逻辑管理,顶层的 `VkPainter2D` 或 `VkPainter3D` 对象负责视图的渲染和交互。以下展示了地图缩放控制的调用层次结构:\n\n```mermaid\ngraph TB\n A[Python 脚本] -->|调用| B[SSProcess 实例]\n B -->|继承| C[ProjectMixin]\n C -->|提供方法| D[getCurrentMap]\n D -->|返回| SM[ScaleMap 地图对象]\n \n SM -->|包含| VL[ViewList 视图列表]\n VL -->|包含| VP2[VkPainter2D 2D视图]\n VL -->|包含| VP3[VkPainter3D 3D视图]\n \n SM -->|提供| MS[map_scale: 比例尺控制]\n SM -->|提供| MR[getMapRect: 地图矩形]\n SM -->|提供| ZM[zoom: 对象缩放]\n \n VP2 -->|提供| ZW[zoomWindow: 窗口缩放]\n VP2 -->|提供| MP[moveScreenByPoint: 平移]\n VP2 -->|提供| GS[getImgScale: 获取缩放比例]\n VP2 -->|提供| CTS[坐标转换方法组]\n VP2 -->|提供| LC[长度转换方法组]\n \n VP3 -->|提供| ZW2[zoomWindow: 窗口缩放]\n VP3 -->|提供| MP2[moveScreenByPoint: 平移]\n VP3 -->|提供| GS2[getImgScale: 获取缩放比例]\n VP3 -->|提供| CTS2[坐标转换方法组]\n VP3 -->|提供| LC2[长度转换方法组]\n \n style B fill:#e1f5ff\n style C fill:#fff4e1\n style SM fill:#f0f0f0\n style VP2 fill:#e8f5e9\n style VP3 fill:#e8f5e9\n```\n\n上图展示了地图缩放控制的双层架构。`ScaleMap` 对象管理地图数据和比例尺,通过 `setMapScale()` 和 `getMapScale()` 方法实现比例尺的设置和查询。`VkPainter2D` 和 `VkPainter3D` 对象负责视图渲染,提供了窗口缩放、平移、坐标转换等视图操作方法。\n\n\n\n## 地图比例尺控制\n\n地图比例尺是地图缩放控制的核心参数,它决定了地图上地理要素的显示大小。SunvStation 提供了直接设置和查询地图比例尺的方法,适用于需要精确控制显示比例的场景。\n\n### 比例尺控制方法\n\n| 方法 | 功能描述 | 返回值 |\n|-----|---------|--------|\n| `map.setMapScale(lScale)` | 设置地图比例尺 | boolean |\n| `map.getMapScale()` | 获取当前地图比例尺 | long |\n\n**参数说明**:\n\n- `lScale`:比例尺分母,例如 500 表示 1:500 的比例尺\n\n\n\n### 设置比例尺流程\n\n```mermaid\nflowchart LR\n A[开始设置比例尺] --> B[获取当前地图]\n B -->|map| C[调用 setMapScale]\n C -->|传入 lScale| D{设置是否成功}\n D -->|成功| E[比例尺已更新]\n D -->|失败| F[检查参数有效性]\n F --> G[重新调用 setMapScale]\n E --> H[调用 repaint 更新视图]\n H --> I[完成]\n \n style A fill:#e1f5ff\n style D fill:#fff4e1\n style H fill:#ffe8e1\n```\n\n### 使用示例\n\n```python\nfrom sunvpy import SSProcess\n\n# " + }, + { + "slug": "37-pei-zhi-ri-zhi-ji-lu-qi", + "title": "配置日志记录器", + "section": "高级功能", + "headings": [ + "日志系统架构概览", + "配置日志记录器流程", + "步骤一:创建 Logger 实例", + "日志级别说明", + "步骤二:配置 Handler 处理器", + "文件处理器配置", + "控制台处理器配置", + "步骤三:设置 Formatter 格式化器", + "基本格式示例", + "格式化参数说明", + "完整格式示例(包含位置信息)", + "步骤四:组装并注入到 SSProcess", + "常用日志配置方案", + "方案一:开发调试配置", + "方案二:生产环境配置", + "方案三:简洁配置", + "日志记录方法说明", + "自动记录(系统内部调用)", + "手动记录(自定义日志)", + "日志记录最佳实践", + "完整示例:带日志的属性修改脚本", + "故障排查", + "日志文件未生成", + "日志输出乱码", + "未记录 SSProcess 内部错误", + "下一步学习" + ], + "content": "日志记录是脚本开发中不可或缺的调试和监控手段,它能帮助您跟踪脚本执行过程、记录错误信息、排查问题根源。本页面将指导您为 SunvStation 脚本配置一个功能完善的日志记录器,让您的脚本具备专业级的日志管理能力。\n\n## 日志系统架构概览\n\nSunvStation 的日志功能通过 **LogMixin** 混入类实现,这是 SSProcessManager 继承体系中的基础模块之一。日志系统采用**依赖注入**设计模式,允许您将自定义配置的日志记录器注入到 SSProcess 中,从而灵活控制日志的输出方式、格式和级别。\n\n```mermaid\nclassDiagram\n class Logger {\n <>\n +debug(msg)\n +info(msg)\n +warning(msg)\n +error(msg)\n +critical(msg)\n }\n \n class LogAware {\n <<抽象基类>>\n +set_logger(Logger)*\n +log_error_msg(str)*\n }\n \n class LogMixin {\n +Logger logger\n +set_logger(Logger)\n +log_error_msg(str)\n }\n \n class SSProcessManager {\n +Logger logger\n +set_logger(Logger)\n +log_error_msg(str)\n }\n \n LogAware <|-- LogMixin\n LogMixin <|-- SSProcessManager\n SSProcessManager ..> Logger : 使用\n```\n\n这个架构设计的核心优势在于**关注点分离**:SSProcessManager 只负责调用日志接口,而日志的具体配置(输出到文件、控制台或远程服务器)完全由您控制,不会影响业务逻辑代码。\n\n\n\n## 配置日志记录器流程\n\n配置日志记录器的过程分为四个关键步骤,下图清晰地展示了从创建到使用的完整流程:\n\n```mermaid\nflowchart TD\n A[开始配置日志] --> B[创建Logger实例]\n B --> C[配置Handler处理器]\n C --> D[设置Formatter格式化器]\n D --> E[配置日志级别]\n E --> F[注入到SSProcess]\n F --> G[开始使用日志功能]\n \n C --> C1[文件处理器
FileHandler]\n C --> C2[控制台处理器
StreamHandler]\n C --> C3[综合配置
多处理器]\n \n E --> E1[DEBUG]\n E --> E2[INFO]\n E --> E3[WARNING]\n E --> E4[ERROR]\n \n G --> G1[自动记录错误]\n G --> G2[手动记录日志]\n \n style F fill:#e1f5ff\n style G fill:#fff4e1\n```\n\n理解这个流程后,我们将逐步详细解析每个环节的具体实现方法。\n\n\n\n## 步骤一:创建 Logger 实例\n\n首先需要创建一个 Python 标准库的 Logger 实例。建议使用脚本文件名作为 Logger 的名称,这样可以在日志输出中清晰地识别日志来源。\n\n```python\nimport logging\n\n# 创建 Logger 实例,使用脚本文件名作为标识符\nlogger = logging.getLogger('my_script')\nlogger.setLevel(logging.DEBUG) # 设置最低日志级别\n```\n\n### 日志级别说明\n\nPython logging 模块提供了五个标准日志级别,按严重程度从低到高排列:\n\n| 级别 | 数值 | 说明 | 使用场景 |\n|-----|------|------|---------|\n| DEBUG | 10 | 调试信息 | 详细的程序运行细节,仅在开发和调试时使用 |\n| INFO | 20 | 一般信息 | 程序正常运行的关键步骤确认 |\n| WARNING | 30 | 警告" + }, + { + "slug": "38-jin-du-tiao-shi-yong-zhi-nan", + "title": "进度条使用指南", + "section": "高级功能", + "headings": [ + "进度条系统架构概览", + "核心组件说明", + "进度条使用基本流程", + "步骤一:启动进度条", + "基本用法", + "方法参数说明", + "实现原理", + "步骤二:更新进度条", + "基本用法", + "方法参数说明", + "智能步进机制", + "更新频率对比", + "步骤三:关闭进度条", + "基本用法", + "方法行为", + "关闭时机的重要性", + "最佳实践:使用 finally 确保关闭", + "完整示例:批量导出数据", + "代码实现", + "代码解析", + "禁用进度条", + "基本用法", + "方法行为", + "使用场景对比", + "条件禁用示例", + "进度条与日志配合使用", + "配合模式", + "完整示例", + "日志级别与进度条的配合策略", + "常见问题与解决方案", + "问题一:进度条不显示", + "问题二:进度条卡住不动", + "问题三:进度条关闭后程序无响应", + "最佳实践总结", + "1. 进度条使用检查清单", + "2. 性能优化建议", + "3. 代码模板", + "下一步学习" + ], + "content": "进度条是向用户反馈长时间操作进度的关键交互组件,它能让用户清晰了解任务的执行状态,提升用户体验。本指南将系统讲解如何在 SunvStation 脚本中高效使用进度条功能,涵盖基础用法、高级技巧和最佳实践。\n\n在学习本页内容后,建议按照以下路径继续深入:\n- [配置日志记录器](37-pei-zhi-ri-zhi-ji-lu-qi) — 了解日志记录的配置方法,与进度条配合使用\n- [错误处理与异常管理](39-cuo-wu-chu-li-yu-yi-chang-guan-li) — 掌握进度条操作中的错误处理\n- [批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku) — 查看进度条在实际批量操作中的应用\n\n## 进度条系统架构概览\n\nSunvStation 的进度条功能采用**分层架构设计**,通过 `ProgressMixin` 混入类与 SSProcessManager 集成,结合底层 C++ 封装的 `Progress` 类和进度条控制函数,形成完整的三层架构体系。\n\n```mermaid\nclassDiagram\n class ProgressAware {\n <<抽象基类>>\n +disable_progress()*\n +startProgress(title, total)*\n +stepProgress(message)*\n +closeProgress()*\n }\n \n class ProgressMixin {\n +enable_progress: bool\n +progress: Progress\n +disable_progress()\n +startProgress(title, total)\n +stepProgress(message)\n +closeProgress()\n }\n \n class SSProcessManager {\n +enable_progress: bool\n +progress: Progress\n +startProgress(title, total)\n +stepProgress(message)\n +closeProgress()\n }\n \n class Progress {\n <>\n +setSize(nSize)\n +step() boolean\n +getPos() int\n +getStep() int\n }\n \n class GlobalFunctions {\n <<函数模块>>\n +startProgress(title, barCount)\n +closeProgress()\n +setProgressRange(min, max)\n +stepProgress(pos, title)\n }\n \n ProgressAware <|-- ProgressMixin\n ProgressMixin <|-- SSProcessManager\n ProgressMixin ..> Progress : 使用\n ProgressMixin ..> GlobalFunctions : 调用\n```\n\n这种架构设计的核心优势在于**关注点分离**:`ProgressMixin` 负责进度条的业务逻辑封装,底层函数处理进度条的创建和更新,而 `Progress` 类则提供了防抖动的智能步进机制,避免频繁更新导致的性能问题。\n\n\n\n### 核心组件说明\n\n| 组件 | 类型 | 职责描述 |\n|------|------|----------|\n| `ProgressMixin` | Mixin 类 | 提供进度条的封装方法,管理 `enable_progress` 开关 |\n| `Progress` | C++ 封装类 | 智能步进控制器,将循环总数映射到 0-100 的进度范围 |\n| `enable_progress` | bool 属性 | 控制进度条是否显示的全局开关 |\n| `progress` | Progress 实例 | 当前进度条控制器实例 |\n| `startProgress()` | 全局函数 | 创建并显示进度条对话框 |" + }, + { + "slug": "39-cuo-wu-chu-li-yu-yi-chang-guan-li", + "title": "错误处理与异常管理", + "section": "高级功能", + "headings": [ + "错误处理架构概览", + "错误处理机制层次", + "第一层:参数验证与空值检查", + "第二层:类型转换异常捕获", + "第三层:业务操作错误处理", + "第四层:静默异常处理", + "错误日志记录机制", + "日志记录接口", + "日志配置流程", + "日志级别选择指南", + "常见错误场景与处理策略", + "场景一:数据源和数据集访问错误", + "场景二:属性类型转换错误", + "场景三:索引越界与空对象访问", + "场景四:资源清理错误", + "错误处理最佳实践", + "实践一:前置条件检查", + "实践二:精确的异常捕获", + "实践三:错误恢复与回滚", + "实践四:日志与用户反馈结合", + "实践五:错误码与状态管理", + "错误调试与问题排查", + "错误调试流程", + "常见错误排查清单", + "调试辅助代码", + "错误处理与相关功能的集成", + "错误处理与进度条管理", + "错误处理与对象缓存机制", + "错误处理与选择集管理", + "下一步学习建议" + ], + "content": "错误处理与异常管理是构建健壮 SunvStation 脚本的核心能力。通过系统化的错误处理机制,您的脚本能够优雅地处理异常情况、记录关键错误信息、确保数据完整性,并在用户界面中提供清晰的反馈。本页面将深入解析 sunvpy 库的错误处理架构、实用模式和最佳实践。\n\n## 错误处理架构概览\n\nsunvpy 库采用分层设计,通过 **LogMixin** 混入类提供统一的错误记录能力,结合多种防御性编程模式形成完整的错误处理体系。这种架构将错误记录、异常捕获和状态验证分离到不同层次,确保代码的可维护性和扩展性。\n\n```mermaid\nclassDiagram\n class Logger {\n <>\n +debug(msg)\n +info(msg)\n +warning(msg)\n +error(msg)\n +critical(msg)\n }\n \n class LogAware {\n <<抽象基类>>\n +set_logger(Logger)*\n +log_error_msg(str)*\n }\n \n class LogMixin {\n +Logger logger\n +set_logger(Logger)\n +log_error_msg(str)\n }\n \n class SSProcessManager {\n +Logger logger\n +log_error_msg(str)\n }\n \n class ErrorPatterns {\n <<错误处理模式>>\n +null_check_return\n +type_conversion_try\n +silent_exception_pass\n +early_return_validation\n }\n \n LogAware <|-- LogMixin\n LogMixin <|-- SSProcessManager\n SSProcessManager ..> Logger : 使用\n SSProcessManager ..> ErrorPatterns : 应用\n```\n\n这种架构设计的核心优势在于**关注点分离**:业务逻辑代码通过统一的 `log_error_msg()` 接口记录错误,而日志的具体输出配置由您完全掌控。错误处理模式则分布在各个 Mixin 类中,针对不同场景提供灵活的应对策略。\n\n\n\n## 错误处理机制层次\n\nsunvpy 的错误处理分为四个层次,每个层次应对不同类型的错误场景。理解这个层次结构对于编写健壮的脚本至关重要。\n\n```mermaid\nflowchart LR\n A[错误输入] --> B[第一层:参数验证
空值检查/范围检查]\n B --> C{是否通过?}\n C -->|否| D[返回默认值/空值
记录警告日志]\n C -->|是| E[第二层:类型转换
try-except 捕获]\n E --> F{转换成功?}\n F -->|否| G[使用容错值/返回 False
记录错误日志]\n F -->|是| H[第三层:业务操作
空指针检查]\n H --> I{操作成功?}\n I -->|否| J[返回空结果/失败标志
记录错误日志]\n I -->|是| K[第四层:资源清理
try-finally 确保]\n K --> L[正常返回结果]\n \n style D fill:#fff4e1\n style G fill:#ffe1e1\n style J fill:#ffe1e1\n style L fill:#e1ffe1\n```\n\n### 第一层:参数验证与空值检查\n\n这是错误处理的第一道防线,通过前置条件检查防止无效输入进入核心逻辑。sunvpy 广泛使用**边界检查**和**空值检查**模式。\n\n**空值检查返回默认值模式:**\n\n```python\ndef getSysSelGeoList(self):\n \"\"\"获取当前选中的几何对象列表。\"\"\"\n map = self.getCurrentMap()\n if map is None:\n return None # 空值检查,返" + }, + { + "slug": "40-ssprocessmanager-wan-zheng-api", + "title": "SSProcessManager 完整 API", + "section": "参考手册", + "headings": [ + "核心架构设计", + "类继承结构", + "模块职责划分", + "选择集操作 API", + "基础选择集管理", + "条件设置与过滤", + "选择集查询", + "属性读写", + "坐标操作", + "选择集同步", + "地理对象编辑 API", + "对象创建", + "新建对象操作", + "缓存与持久化", + "对象重置", + "对象打散", + "辅助计算", + "项目与工作空间 API", + "工作空间与地图", + "系统路径管理", + "图层管理", + "地图帧操作", + "系统表管理", + "进度与日志 API", + "进度条管理", + "日志记录", + "完整 API 参考表", + "实例化与使用", + "相关文档" + ], + "content": "SSProcessManager 是 SunvStation 地理信息系统中的核心进程管理类,提供了对工作空间、地图、几何对象选择与编辑的完整操作能力。该类通过 Mixin 设计模式将功能模块化,为高级开发者提供了灵活且强大的地理数据处理接口。本文档将系统性地介绍 SSProcessManager 的完整 API 接口、架构设计以及使用方法。\n\n## 核心架构设计\n\nSSProcessManager 采用多重继承的 Mixin 设计模式,将复杂的功能拆分为五个独立的模块,每个模块负责特定的领域功能。这种设计使得代码具有高度的可维护性和扩展性,同时保持了良好的关注点分离原则。\n\n### 类继承结构\n\n```mermaid\nclassDiagram\n class SSProcessManager {\n +workspace: WorkSpace\n +map: ScaleMap\n +selGeoList: GeoBaseList\n +selNoteList: GeoBaseList\n +bufferObjList: GeoBaseList\n +curNewObj: tuple\n +logger: Logger\n +progress: Progress\n -__init__()\n }\n \n class SelectionMixin {\n +clearSelection()\n +clearSelectCondition()\n +setSelectCondition()\n +selectFilter()\n +getSelGeoCount()\n +getSelGeoValue()\n +setSelGeoValue()\n +updateSysSelection()\n }\n \n class GeoEditMixin {\n +createDefaultGeoBase()\n +createNewObjByCode()\n +createNewObjByClass()\n +setNewObjValue()\n +addNewObjPoint()\n +saveBufferObjToDatabase()\n +explodeGeoObject()\n }\n \n class ProjectMixin {\n +getWorkspace()\n +getCurrentMap()\n +getSysPathName()\n +getLayerCount()\n +setLayerStatus()\n +pushUndoMark()\n }\n \n class LogMixin {\n +set_logger()\n +log_error_msg()\n }\n \n class ProgressMixin {\n +disable_progress()\n +startProgress()\n +stepProgress()\n +closeProgress()\n }\n \n SSProcessManager --> SelectionMixin\n SSProcessManager --> GeoEditMixin\n SSProcessManager --> ProjectMixin\n SSProcessManager --> LogMixin\n SSProcessManager --> ProgressMixin\n```\n\n### 模块职责划分\n\n**SelectionMixin** - 负责选择集管理,提供条件过滤、属性读写和系统选择集同步功能\n**GeoEditMixin** - 负责地理对象编辑,包括对象创建、属性设置、缓存管理和打散操作\n**ProjectMixin** - 负责项目和工作空间管理,包括图层控制、路径管理和地图帧操作\n**LogMixin** - 负责日志记录,提供统一的错误日志接口\n**ProgressMixin** - 负责进度条管理,提供可视化进度反馈\n\n\n\n## 选择集操作 API\n\n选择集操作是 SSProcessManager 的核心功" + }, + { + "slug": "41-objbaseattr-shu-xing-suo-yin", + "title": "ObjBaseAttr 属性索引", + "section": "参考手册", + "headings": [ + "属性分类体系", + "属性分类概览", + "点属性索引", + "地物通用属性索引", + "几何参量属性索引", + "注记属性索引", + "操作属性索引", + "核心方法参考", + "属性索引管理", + "属性值读写", + "属性索引值映射表", + "使用场景与最佳实践", + "基础属性访问", + "坐标点操作", + "扩展属性管理", + "注记对象样式控制", + "与其他模块的交互", + "参考文档延伸" + ], + "content": "ObjBaseAttr 类是 SunvStation 系统中地物对象属性管理的核心组件,提供统一的属性名称注册、索引映射和属性值读写接口。该类通过集中管理所有地物属性的名称与索引映射关系,实现了属性访问的标准化和高效化,支持点、线、面、注记等多种地物类型的属性操作。\n\n\n\n## 属性分类体系\n\nObjBaseAttr 将地物属性划分为五大类别,每类属性对应不同的功能维度和数据类型。这种分类设计既体现了属性的业务语义,也便于开发者快速定位所需属性。\n\n### 属性分类概览\n\n```mermaid\ngraph TB\n A[ObjBaseAttr 属性体系] --> B[点属性]\n A --> C[地物通用属性]\n A --> D[几何参量属性]\n A --> E[注记属性]\n A --> F[操作属性]\n \n B --> B1[SSObj_PointName
坐标点名称]\n B --> B2[SSObj_PointCount
坐标点数量]\n B --> B3[SSObj_PointType
坐标点类型]\n B --> B4[SSObj_X/Y/Z
坐标值]\n \n C --> C1[标识属性
ID, Code, Name]\n C --> C2[图形属性
Color, LineType, LineWidth]\n C --> C3[变换属性
Angle, ScaleX, ScaleY]\n C --> C4[时间属性
CreateTime, ModifyTime]\n \n D --> D1[面积属性
Area, EllipsoidArea]\n D --> D2[长度属性
Length, 3DLength]\n D --> D3[边界属性
minX, minY, maxX, maxY]\n \n E --> E1[字体属性
FontWidth, FontHeight, FontName]\n E --> E2[文本属性
FontString, FontStringCount]\n E --> E3[样式属性
Alignment, FontWeight, ItalicAngle]\n \n F --> F1[SSObj_Reverse
方向反转]\n F --> F2[SSObj_Reference
引用关系]\n```\n\n### 点属性索引\n\n点属性用于描述地物对象的坐标点信息,是构成线、面等复杂几何形状的基础元素。此类属性支持通过参数索引访问特定位置的坐标点。\n\n\n\n| 属性常量 | 属性名 | 数据类型 | 说明 | 参数支持 |\n|---------|--------|---------|------|---------|\n| `pointName` | SSObj_PointName | string | 坐标点名称 | (n) - 第n个点 |\n| `pointCount` | SSObj_PointCount | int | 坐标点数量 | 无 |\n| `pointType` | SSObj_PointType | int | 坐标点类型 | (n) - 第n个点 |\n| `x` | SSObj_X | double | X坐标值 | (n) - 第n个点 |\n| `y` | SSObj_Y | double | Y坐标值 | (n) - 第n个点 |\n| `z` | SSObj_Z | double | Z坐标值 | (n) - 第n个点 |\n\n**参数说明**:括号内的数字表示坐标点索引(从0开始)。例如 `SSObj_X(0)` 获取第一个点的X坐标。\n\n### 地物通用属性索引\n\n通用属性适用于所有地物类型,涵盖了对象标识、图形表现、变换参数和元数据等核心信息。\n\n\n\n| 属性常量 | 属性名 | 数据类型 | 说明 | 可读写 |\n|---------|--------|---------|------|-------|\n| **标识属性** |||||\n| `id` | SSObj_ID | int | 对象唯一标识 | 只读 |\n| `groupID` | SSObj_GroupID | int | 分组标识 | 可写 |\n| `code` | SSObj_Code | int | 地物编码 | 只读 |\n| `byname` | SSObj_Byname | string | 地物别名 | 可写 |\n| `name` | SSObj_Name | str" + }, + { + "slug": "42-di-li-dui-xiang-lei-xing-ding-yi", + "title": "地理对象类型定义", + "section": "参考手册", + "headings": [ + "地理对象类型体系", + "四种基础类型", + "类型标识的作用", + "类继承架构", + "继承层次结构", + "GeoBase 基类", + "派生类特性", + "GeoObject 容器对象", + "容器与几何对象的分离设计", + "GeoObject 核心功能", + "类型识别与转换机制", + "getObjectType() 类型识别方法", + "类型转换函数", + "类型转换的工作原理", + "地理对象列表类型", + "列表类型体系", + "列表通用方法", + "类型转换列表", + "属性系统与地物基本属性", + "ObjBaseAttr 类结构", + "属性分类体系", + "属性索引机制", + "对象类型与属性的关系", + "通用属性 vs 特定类型属性", + "属性有效性判断", + "总结与最佳实践", + "核心概念回顾", + "类型识别与处理最佳实践", + "属性访问最佳实践", + "创建对象时的类型选择", + "后续学习建议" + ], + "content": "地理对象类型定义是 SunvStation 系统中地理数据模型的核心组成部分。系统采用面向对象的设计模式,通过类继承体系和类型标识来管理不同形态的地理要素。理解这些类型定义及其相互关系,是进行地理数据处理、空间分析和可视化的基础。\n\n本页面将系统性地介绍地理对象的类型体系、类结构、属性机制以及相关的类型识别和转换方法。建议在学习本页面之前,先了解 [SunvStation 系统架构](6-sunvstation-xi-tong-jia-gou) 和 [C++ 扩展模块与 Python 接口](10-c-kuo-zhan-mo-kuai-yu-python-jie-kou)。完成本页面学习后,可以继续学习 [创建默认地物对象](19-chuang-jian-mo-ren-di-wu-dui-xiang) 和 [地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie)。\n\n\n\n## 地理对象类型体系\n\nSunvStation 系统定义了四种基础地理对象类型,每种类型对应不同的几何形态和应用场景。这些类型通过整数标识符进行区分,并与特定的几何类相对应。类型体系的设计遵循简单、明确、可扩展的原则,为地理数据的存储、查询和展示提供了统一的抽象层次。\n\n### 四种基础类型\n\n| 类型标识 | 类型名称 | 几何类 | 典型应用场景 | 几何特征 |\n|---------|---------|--------|------------|---------|\n| 0 | 点对象 | PointObject | 控制点、界碑、建筑物中心点、测量点 | 零维几何,由单个坐标点定义 |\n| 1 | 线对象 | LineObject | 道路、管线、河流中心线、边界线 | 一维几何,由有序坐标点序列定义 |\n| 2 | 面对象 | AreaObject | 建筑物轮廓、湖泊、行政区划、地块 | 二维几何,由闭合坐标环定义 |\n| 3 | 注记对象 | MarkNote | 文字标注、地名说明、图例说明 | 特殊对象,结合文本与定位点 |\n\n### 类型标识的作用\n\n类型标识是系统内部识别对象类型的核心机制,其作用体现在以下几个方面:\n\n- **对象创建**:`createDefaultGeoBase(obj_type, dataset)` 方法通过类型标识决定创建具体的几何对象实例\n- **类型判断**:`getObjectType()` 方法返回当前对象的类型标识,用于运行时类型识别\n- **数据查询**:查询条件中可以通过类型标识过滤特定类型的地理对象\n- **符号化渲染**:系统根据对象类型应用不同的符号化规则和渲染策略\n\n\n\n## 类继承架构\n\n地理对象类型体系基于面向对象的继承架构设计,通过基类和派生类的层次结构实现代码复用和多态性。理解这个架构有助于掌握各类地理对象的共性和特性,以及如何正确使用它们提供的方法和属性。\n\n### 继承层次结构\n\n```mermaid\nclassDiagram\n GeoBase <|-- PointObject\n GeoBase <|-- LineObject\n GeoBase <|-- AreaObject\n GeoBase <|-- MarkNote\n \n class GeoBase {\n <<抽象基类>>\n +getId() int\n +setId(id)\n +getCode() int\n +setCode(code)\n +getColor() int\n +setColor(color)\n +getObjectType() int\n +getArea(haveSign) float\n +getPerimeter() float\n +setStatus(flag, status)\n +getStatus(status) bool\n }\n \n class PointObject {\n +getObjectType() int\n +getScaleX/Y/Z() float\n +setScaleX/Y/Z(scale)\n +rotate(point, vct)\n }\n \n class LineObject {\n +getObjectType() int\n +getPerimeter() float\n +getArea(haveSign) fl" + }, + { + "slug": "43-shu-xue-ji-suan-gong-ju", + "title": "数学计算工具", + "section": "参考手册", + "headings": [ + "模块架构概览", + "基础数据结构", + "Point3D - 三维点类", + "Vec3d - 三维向量类", + "容器类", + "坐标系统转换", + "角度格式转换", + "极坐标与直角坐标转换", + "距离与长度计算", + "点与点距离", + "点到线距离", + "线段长度", + "高级距离查询", + "面积计算", + "多边形面积", + "三角形面积", + "角度与方位角计算", + "方位角计算", + "夹角计算", + "方向计算", + "几何变换操作", + "二维/三维变换", + "系统坐标旋转", + "几何关系判断", + "点与点关系", + "点与线关系", + "点与多边形关系", + "线与线关系", + "多边形与多边形关系", + "其他几何关系", + "弧线与圆操作", + "弧长计算", + "弧线属性判断", + "弧线中点", + "弧线打断与插入", + "极坐标弧生成", + "点与线操作", + "点插入与延伸", + "点修剪与去重", + "线段打断", + "中点与垂足", + "高程插值", + "高级几何操作", + "平行线生成", + "曲线生成", + "椭圆操作", + "线型重建", + "矩形与边界操作", + "点集排序", + "辅助计算工具", + "数值精度处理", + "法向量计算", + "线段交点", + "三角形计算", + "多边形焦点", + "常用常量", + "应用示例", + "基础距离与面积计算", + "坐标转换与角度计算", + "几何变换操作", + "空间关系判断", + "点线操作", + "API 快速索引表", + "按功能分类", + "性能优化建议", + "进阶主题", + "复杂多边形处理", + "弧线重建与识别", + "高级几何变换", + "相关文档" + ], + "content": "PySSMath 模块提供了丰富的数学计算功能,专为 GIS 和测绘应用设计。该模块通过 SWIG 封装底层 C++ 实现,提供高性能的几何计算、坐标转换、空间关系判断等核心算法库。本文档面向高级开发者,详细说明各类数学计算工具的 API 接口与应用场景。\n\n\n\n## 模块架构概览\n\nPySSMath 模块采用分层架构设计,将数学计算功能划分为多个功能域。底层通过 `_PySSMath.pyd` C++ 扩展模块实现高效计算,上层 Python 接口提供类型安全的函数调用。\n\n```mermaid\ngraph TB\n A[PySSMath 模块] --> B[坐标系统转换]\n A --> C[距离与长度计算]\n A --> D[面积计算]\n A --> E[角度与方位角]\n A --> F[几何变换]\n A --> G[空间关系判断]\n A --> H[弧线与圆操作]\n A --> I[点与线操作]\n \n B --> B1[deg/radian/dms转换]\n C --> C1[点距离/线长度]\n D --> D1[多边形面积/三角形面积]\n E --> E1[方位角/夹角/方向]\n F --> F1[旋转/偏移/缩放/镜像]\n G --> G1[相交/包含/共线]\n H --> H1[弧长/中点/打断]\n I --> I1[插入/延伸/修剪]\n \n A --> J[基础数据结构]\n J --> J1[Point3D]\n J --> J2[Vec3d]\n J --> J3[POINT3DLIST]\n J --> J4[LINE3DLIST]\n```\n\n\n\n## 基础数据结构\n\n### Point3D - 三维点类\n\nPoint3D 是模块的核心数据结构,表示三维空间中的点,支持 x、y、z 坐标访问和丰富的运算符重载。\n\n**构造方法**:\n- `Point3D()` - 默认构造函数\n- `Point3D(x, y, z)` - 使用坐标构造\n- `Point3D(other)` - 拷贝构造\n\n**核心属性与方法**:\n- `x()`, `y()`, `z()` - 获取坐标分量\n- `set(x_arg, y_arg, z_arg)` - 设置坐标\n- `__getitem__(i)` / `__setitem__(i, value)` - 索引访问坐标(0=x, 1=y, 2=z)\n- `__add__`, `__sub__`, `__neg__` - 向量运算\n- `epsilonEqual(other, epsilon)` - 带容差的相等判断\n- `getName()`, `setName(name)` - 点名称管理\n\n\n\n### Vec3d - 三维向量类\n\nVec3d 提供完整的向量运算功能,包括点积、叉积、缩放等操作。\n\n**构造方法**:\n- `Vec3d()` - 默认构造\n- `Vec3d(x, y, z)` - 使用分量构造\n- `Vec3d(other)` - 拷贝构造\n\n**核心方法**:\n- `dot(rhs)` - 点积运算\n- `cross(rhs)` - 叉积运算\n- `__mul__`, `__truediv__` - 标量乘除\n- `set(x_arg, y_arg, z_arg)` - 设置分量\n- `epsilonEqual(other, epsilon)` - 带容差的相等判断\n\n\n\n### 容器类\n\n模块提供多种容器类用于管理点的集合:\n- `POINT3DLIST` - 点列表容器\n- `LINE3DLIST` - 线列表容器\n- `LOOP3DLIST` - 环列表容器(支持带岛复杂面)\n- `StringArray` - 字符串数组容器\n\n这些容器均支持迭代器模式,提供 `size()`, `empty()`, `clear()`, `push_back()` 等标准容器操作。\n\n\n\n## 坐标系统转换\n\n### 角度格式转换\n\nPySSMath 提供多种角度表示形式之间的转换功能,支持弧度制、十进制度数、度分秒(DMS)格式互转。\n\n| 函数名 | 功能描述 | 参数 | 返回值 |\n|--------|----------|------|--------|\n| `degToRadian(deg)` | 十进制度数转弧度 | deg: float | 弧度值 |\n| `radianToDeg(dRadian)` | 弧度转十进制度数 | dRadian: float | 度数值 |\n| `degToDms(deg)` | 十进制度" + }, + { + "slug": "44-zuo-biao-zhuan-huan-gong-ju", + "title": "坐标转换工具", + "section": "参考手册", + "headings": [ + "角度格式转换", + "基础角度转换", + "角度调整函数", + "角度转换示例", + "极坐标与直角坐标转换", + "坐标转换函数", + "极坐标转换示例", + "方位角计算", + "方位角计算函数", + "角度计算函数", + "方位角计算示例", + "几何变换操作", + "二维几何变换", + "三维几何变换", + "系统坐标变换", + "几何变换示例", + "坐标转换应用场景", + "测绘坐标转换", + "GIS 坐标变换", + "工程应用变换", + "最佳实践与注意事项", + "角度单位处理", + "坐标变换顺序", + "精度控制", + "相关页面" + ], + "content": "坐标转换工具为 GIS 和测绘应用提供了一套完整的坐标系统转换功能,涵盖角度格式转换、坐标系统转换、几何变换等核心能力。本模块通过 PySSMath 提供高性能的坐标转换算法,支持从基础的角度格式互转到复杂的坐标系统映射变换。本文档面向高级开发者,详细说明各类坐标转换工具的 API 使用方法和应用场景。\n\n\n\n## 角度格式转换\n\nPySSMath 提供了多种角度表示形式之间的转换功能,支持弧度制、十进制度数、度分秒(DMS)格式之间的灵活互转,满足测绘应用中不同角度表示需求。\n\n### 基础角度转换\n\n| 函数名 | 功能描述 | 参数 | 返回值 |\n|--------|----------|------|--------|\n| `degToRadian(deg)` | 十进制度数转弧度 | deg: float | 弧度值 |\n| `radianToDeg(dRadian)` | 弧度转十进制度数 | dRadian: float | 度数值 |\n| `degToDms(deg)` | 十进制度数转度分秒 | deg: float | DMS 值 |\n| `dmsToDeg(dms)` | 度分秒转十进制度数 | dms: float | 度数值 |\n| `dmsToRadian(dDms)` | 度分秒转弧度 | dDms: float | 弧度值 |\n| `radianToDms(dRadian)` | 弧度转度分秒 | dRadian: float | DMS 值 |\n| `dmsToSec(dms)` | 度分秒转秒数 | dms: float | 秒数 |\n| `secToDms(sec)` | 秒数转度分秒 | sec: float | DMS 值 |\n\n### 角度调整函数\n\n| 函数名 | 功能描述 | 参数说明 |\n|--------|----------|----------|\n| `adjustAngle(dRadian)` | 调整弧度值到 [-π, π] 范围 | dRadian: 待调整的弧度值 |\n| `adjustDmsAngle(dAngle)` | 调整 DMS 角度值 | dAngle: 待调整的 DMS 角度值 |\n| `adjustDegAngle(dAngle)` | 调整度数值到 [0, 360] 范围 | dAngle: 待调整的度数值 |\n\n### 角度转换示例\n\n```python\nimport sunvpy.PySSMath as ssMath\n\n# 十进制度数转弧度\ndeg_value = 45.5\nrad_value = ssMath.degToRadian(deg_value)\nprint(f\"{deg_value}° = {rad_value:.6f} rad\")\n\n# 弧度转度分秒\ndms_value = ssMath.radianToDms(1.5708)\nprint(f\"1.5708 rad = {dms_value:.4f} (DMS格式)\")\n\n# 角度调整到标准范围\nadjusted_angle = ssMath.adjustAngle(7.0) # 超出范围的角度\nprint(f\"调整后角度: {adjusted_angle:.6f} rad\")\n```\n\n\n\n## 极坐标与直角坐标转换\n\n极坐标和直角坐标是两种常用的坐标表示方式,适用于不同的应用场景。PySSMath 提供了两者之间的双向转换功能。\n\n### 坐标转换函数\n\n| 函数名 | 功能描述 | 参数说明 |\n|--------|----------|----------|\n| `rightToPolar(x, y)` | 直角坐标转极坐标 | x, y: 直角坐标值,返回 (距离, 方位角) |\n| `polarToRight(r, angle)` | 极坐标转直角坐标 | r: 距离;angle: 方位角(弧度) |\n| `getPolar(p1, p2, dist, dRadian)` | 从基点按距离和方位角获取点 | p1: 基点;p2: 参考点;dist: 距离;dRadian: 方位角 |\n| `getPoint(p1, p2, dist, dRadian)` | 同 getPolar | 参数同 getPolar |\n\n### 极坐标转换示例\n\n```python\nimport sunvpy.PySSMath as ssMath\n\n# 直角坐标转极坐标\nx, y = 100.0, 100.0\ndistance, angle = ssMath.rightToPolar(x, y)\nprint(f\"直角坐标 ({x}, {y}) -> 极坐标: 距离={distance:" + }, + { + "slug": "45-shu-ju-ku-geng-xin-jie-kou", + "title": "数据库更新接口", + "section": "参考手册", + "headings": [ + "架构概览", + "SSDbScript 核心接口", + "连接与认证管理", + "数据下载接口", + "数据上传接口", + "地物操作接口", + "表记录管理接口", + "数据库同步接口", + "备份与恢复接口", + "高级操作接口", + "Database 底层数据库接口", + "连接与事务管理", + "几何对象存取", + "对象保存与删除", + "状态与时间管理", + "GeoEditMixin 高级编辑接口", + "对象创建与缓存流程", + "MemoData 与扩展属性转换", + "删除缓存管理", + "数据结构容器", + "StringArray 字符串数组", + "AttrList 属性列表", + "FeatureList 地物列表", + "完整工作流示例", + "错误处理与日志", + "日志信息获取", + "常见错误处理", + "性能优化建议", + "批量操作优先", + "合理使用事务", + "使用增量下载", + "限制查询范围", + "使用对象缓存", + "相关接口与扩展", + "与数据交换的集成", + "与地理对象编辑的集成", + "下一步学习" + ], + "content": "数据库更新接口是 SunvStation GIS 系统中用于管理和执行数据库操作的核心组件,提供了从底层 SQL 执行到高级对象同步的完整功能层次。该接口采用 SWIG 封装技术将 C++ 核心功能暴露给 Python,实现了高性能的数据库操作与 Python 脚本的无缝集成。\n\n## 架构概览\n\n数据库更新接口采用分层架构设计,从底层的直接数据库操作到上层的业务对象管理,提供了不同抽象级别的接口以满足不同场景的需求。\n\n```mermaid\ngraph TB\n subgraph \"应用层\"\n GeoEditMixin[GeoEditMixin
地理编辑混合类]\n SSProcess[SSProcessManager
流程管理器]\n end\n \n subgraph \"业务逻辑层\"\n SSDbScript[SSDbScript
GIS数据库脚本接口]\n DataXScript[DataXScript
数据交换接口]\n end\n \n subgraph \"数据访问层\"\n Database[Database
数据库抽象接口]\n StringArray[StringArray
字符串数组容器]\n AttrList[AttrList
属性列表]\n FeatureList[FeatureList
地物列表]\n end\n \n subgraph \"C++核心层\"\n _PySSGisDBUpdate[_PySSGisDBUpdate
C++GIS数据库模块]\n _PySSDatabase[_PySSDatabase
C++数据库模块]\n _PySSDataX[_PySSDataX
C++数据交换模块]\n end\n \n GeoEditMixin --> SSDbScript\n SSProcess --> GeoEditMixin\n SSDbScript --> _PySSGisDBUpdate\n DataXScript --> _PySSDataX\n Database --> _PySSDatabase\n SSDbScript --> Database\n Database --> StringArray\n Database --> AttrList\n Database --> FeatureList\n```\n\n**核心设计原则**:该架构通过多层抽象,实现了从底层 SQL 执行到高级对象操作的完整覆盖,同时保持了各层之间的清晰边界。SWIG 封装机制确保了 Python 接口与 C++ 实现的透明交互,[7-swig-feng-zhuang-ji-zhi-shuo-ming](7-swig-feng-zhuang-ji-zhi-shuo-ming) 详细解释了这一机制的实现原理。\n\n\n\n## SSDbScript 核心接口\n\nSSDbScript 是 GIS 数据库更新操作的主要接口类,提供了从服务器数据库到本地数据库的数据同步、地物属性更新、表记录管理等完整功能集。\n\n### 连接与认证管理\n\nSSDbScript 支持多种认证模式,包括基础用户认证和角色认证,确保数据库操作的安全性和权限控制。\n\n```mermaid\nsequenceDiagram\n participant Python\n participant SSDbScript\n participant Database\n participant SDEServer\n \n Python->>SSDbScript: SSDbScript()\n Python->>SSDbScript: login(userName, password)\n SSDbScript->>Database: 验证凭证\n Database->>SDEServer: 建立连接\n SDEServer-->>Database: 连接成功\n Database-->>SSDbScript: 认证通过\n SSDbScript-->>Python: 返回 True\n \n Python->>SSDbScript: connectToTablespace(name)\n SSDbScript->>Database: 切换工作空间\n Database-->>SSDbScript: 工" + } +] \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..1b93a44 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,129 @@ + + + + + + sunvpy 文档 + + + + + + +
+ + sunvpy 文档 +
+ + +
+
+ + + + +
+ + + + +
+
+
加载中...
+
+ +
+ + + +
+ + +
+
+
+ + + + + + +
+
+
输入关键词开始搜索
+
+
+
+ + + + + + + + + + + + + diff --git a/docs/js/app.js b/docs/js/app.js new file mode 100644 index 0000000..1928b09 --- /dev/null +++ b/docs/js/app.js @@ -0,0 +1,469 @@ +/** + * app.js — Main logic for sunvpy static documentation site. + * Handles routing, markdown rendering, navigation, TOC, and theme. + */ +(function () { + "use strict"; + + // --- State --- + let navData = null; + let flatPages = []; // ordered array of all slugs + let currentPage = null; + let isDark = false; + let mermaidInitialized = false; + + // --- DOM refs --- + const sidebarNav = document.getElementById("sidebarNav"); + const article = document.getElementById("article"); + const pageNav = document.getElementById("pageNav"); + const tocNav = document.getElementById("tocNav"); + const contentEl = document.getElementById("content"); + + // --- Init --- + async function init() { + // Theme + const saved = localStorage.getItem("sunvpy-theme"); + if (saved === "dark" || (!saved && window.matchMedia("(prefers-color-scheme: dark)").matches)) { + setTheme(true, false); + } + + // Load nav + try { + const resp = await fetch("data/nav.json"); + navData = await resp.json(); + } catch (e) { + article.innerHTML = '
无法加载导航数据。请通过 HTTP 服务器访问(如 python -m http.server)。
'; + return; + } + + // Build flat page list + flatPages = []; + navData.sections.forEach(function (section) { + if (section.pages) { + section.pages.forEach(function (p) { flatPages.push(p.slug); }); + } + if (section.groups) { + section.groups.forEach(function (group) { + group.pages.forEach(function (p) { flatPages.push(p.slug); }); + }); + } + }); + + // Build sidebar + renderSidebar(); + + // Route + handleRoute(); + window.addEventListener("hashchange", handleRoute); + + // Theme toggle buttons + document.getElementById("themeToggle").addEventListener("click", function () { setTheme(!isDark, true); }); + document.getElementById("themeToggleMobile").addEventListener("click", function () { setTheme(!isDark, true); }); + + // Mobile sidebar + document.getElementById("hamburger").addEventListener("click", toggleMobileSidebar); + document.getElementById("sidebarBackdrop").addEventListener("click", closeMobileSidebar); + } + + // --- Theme --- + function setTheme(dark, save) { + isDark = dark; + document.documentElement.setAttribute("data-theme", dark ? "dark" : "light"); + + const lightSheet = document.getElementById("hljs-light-theme"); + const darkSheet = document.getElementById("hljs-dark-theme"); + lightSheet.disabled = dark; + darkSheet.disabled = !dark; + + if (save) localStorage.setItem("sunvpy-theme", dark ? "dark" : "light"); + + // Re-render mermaid if already initialized + if (mermaidInitialized && currentPage) { + rerenderMermaid(); + } + } + + // --- Sidebar --- + function renderSidebar() { + var html = ""; + navData.sections.forEach(function (section) { + var isActive = currentPage && isSectionActive(section); + html += '"; + }); + sidebarNav.innerHTML = html; + } + + function renderPageLink(page) { + var active = currentPage === page.slug ? " active" : ""; + var levelClass = page.level ? page.level.toLowerCase() : ""; + var badge = page.level ? ' ' + escHtml(page.level.charAt(0)) + "" : ""; + return '' + escHtml(page.title) + badge + ""; + } + + function isSectionActive(section) { + if (!currentPage) return false; + if (section.pages) { + for (var i = 0; i < section.pages.length; i++) { + if (section.pages[i].slug === currentPage) return true; + } + } + if (section.groups) { + for (var g = 0; g < section.groups.length; g++) { + for (var j = 0; j < section.groups[g].pages.length; j++) { + if (section.groups[g].pages[j].slug === currentPage) return true; + } + } + } + return false; + } + + // Expose toggleSection globally for onclick + window.toggleSection = function (header) { + header.parentElement.classList.toggle("collapsed"); + }; + + // --- Routing --- + function handleRoute() { + var hash = window.location.hash.slice(1) || flatPages[0]; + if (!hash || hash === currentPage) return; + loadPage(hash); + } + + // --- Load & Render Page --- + async function loadPage(slug) { + currentPage = slug; + + // Update sidebar active state + renderSidebar(); + + // Scroll content to top + contentEl.scrollTop = 0; + + // Show loading + article.innerHTML = '
加载中...
'; + tocNav.innerHTML = ""; + pageNav.innerHTML = ""; + + // Fetch markdown + var md; + try { + var resp = await fetch("content/" + slug + ".md"); + if (!resp.ok) throw new Error(resp.status); + md = await resp.text(); + } catch (e) { + article.innerHTML = '
无法加载页面: ' + escHtml(slug) + "
"; + return; + } + + // Pre-process: transform cross-doc links + md = md.replace(/\]\((\d+-[\w-]+)\)/g, function (match, linkSlug) { + // Only transform if it matches a known page slug + if (flatPages.indexOf(linkSlug) !== -1) { + return "](#" + linkSlug + ")"; + } + return match; + }); + + // Configure marked + var renderer = new marked.Renderer(); + + // Custom paragraph handler for "Sources:" lines + renderer.paragraph = function (obj) { + var text = typeof obj === "object" ? obj.text : obj; + if (text && (text.indexOf("Sources:") === 0 || text.indexOf("Sources: [") === 0)) { + return '
' + text + "
"; + } + return "

" + text + "

"; + }; + + // Add IDs to headings + var headingIndex = {}; + renderer.heading = function (text, depth) { + // marked v15 passes heading data as object or text+depth + var headingText = typeof text === "object" ? text.text : text; + var headingDepth = typeof text === "object" ? text.depth : depth; + var raw = headingText.replace(/<[^>]+>/g, ""); + var baseId = raw.toLowerCase() + .replace(/[^\w\u4e00-\u9fff]+/g, "-") + .replace(/^-|-$/g, ""); + if (!baseId) baseId = "heading"; + if (headingIndex[baseId] !== undefined) { + headingIndex[baseId]++; + baseId = baseId + "-" + headingIndex[baseId]; + } else { + headingIndex[baseId] = 0; + } + return '' + headingText + ""; + }; + + // Code block handler + renderer.code = function (obj) { + var code, lang; + if (typeof obj === "object") { + code = obj.text; + lang = obj.lang || ""; + } else { + code = obj; + lang = ""; + } + if (lang === "mermaid") { + return '
' + escHtml(code) + "
"; + } + var highlighted = ""; + try { + if (lang && hljs.getLanguage(lang)) { + highlighted = hljs.highlight(code, { language: lang }).value; + } else { + highlighted = hljs.highlightAuto(code).value; + } + } catch (e) { + highlighted = escHtml(code); + } + var langLabel = lang ? '' + escHtml(lang) + "" : ""; + return "
" + langLabel + '' + highlighted + "
"; + }; + + marked.use({ + renderer: renderer, + gfm: true, + breaks: false, + }); + + // Render + var html; + try { + html = marked.parse(md); + } catch (e) { + console.error("Markdown render error:", e); + article.innerHTML = '
渲染出错: ' + escHtml(String(e)) + '
'; + return; + } + article.innerHTML = html; + + // Add page title from nav data + var pageInfo = findPageInfo(slug); + if (pageInfo) { + var titleDiv = document.createElement("div"); + titleDiv.className = "page-title"; + titleDiv.innerHTML = "

" + escHtml(pageInfo.title) + "

"; + if (pageInfo.section) { + titleDiv.innerHTML += '
' + escHtml(pageInfo.section); + if (pageInfo.level) titleDiv.innerHTML += ' · ' + escHtml(pageInfo.level) + ""; + titleDiv.innerHTML += "
"; + } + article.insertBefore(titleDiv, article.firstChild); + } + + // Render mermaid diagrams + await renderMermaid(); + + // Build TOC + buildTOC(); + + // Prev/Next navigation + renderPageNav(); + + // Update document title + document.title = (pageInfo ? pageInfo.title + " — " : "") + "sunvpy 文档"; + } + + // --- Mermaid --- + async function renderMermaid() { + var mermaidDivs = article.querySelectorAll(".mermaid"); + if (mermaidDivs.length === 0) return; + + if (!mermaidInitialized) { + mermaid.initialize({ + startOnLoad: false, + theme: isDark ? "dark" : "default", + securityLevel: "loose", + maxTextSize: 90000, + }); + mermaidInitialized = true; + } + + try { + await mermaid.run({ nodes: mermaidDivs, suppressErrors: true }); + } catch (e) { + console.warn("Mermaid render error:", e); + } + } + + async function rerenderMermaid() { + var wrappers = article.querySelectorAll(".mermaid-wrapper"); + wrappers.forEach(function (wrapper) { + var div = wrapper.querySelector(".mermaid"); + if (!div) return; + var source = div.getAttribute("data-mermaid-source"); + if (source) { + div.removeAttribute("data-processed"); + div.innerHTML = escHtml(source); + } + }); + + mermaid.initialize({ + startOnLoad: false, + theme: isDark ? "dark" : "default", + securityLevel: "loose", + maxTextSize: 90000, + }); + + try { + await mermaid.run({ nodes: article.querySelectorAll(".mermaid"), suppressErrors: true }); + } catch (e) { + console.warn("Mermaid re-render error:", e); + } + } + + // --- TOC --- + function buildTOC() { + var headings = article.querySelectorAll("h2, h3"); + if (headings.length === 0) { + tocNav.innerHTML = '
无目录
'; + return; + } + + var html = ""; + tocNav.innerHTML = html; + + // Scroll spy + setupScrollSpy(headings); + } + + function setupScrollSpy(headings) { + var links = tocNav.querySelectorAll("a"); + + contentEl.removeEventListener("scroll", scrollSpyHandler); + contentEl.addEventListener("scroll", scrollSpyHandler); + + function scrollSpyHandler() { + var scrollTop = contentEl.scrollTop; + var activeIdx = 0; + for (var i = headings.length - 1; i >= 0; i--) { + if (headings[i].offsetTop - 100 <= scrollTop) { + activeIdx = i; + break; + } + } + links.forEach(function (link, idx) { + link.classList.toggle("active", idx === activeIdx); + }); + } + } + + // --- Prev/Next --- + function renderPageNav() { + var idx = flatPages.indexOf(currentPage); + if (idx === -1) { pageNav.innerHTML = ""; return; } + + var html = ""; + if (idx > 0) { + var prevInfo = findPageInfo(flatPages[idx - 1]); + html += '"; + } else { + html += "
"; + } + if (idx < flatPages.length - 1) { + var nextInfo = findPageInfo(flatPages[idx + 1]); + html += '"; + } + pageNav.innerHTML = html; + } + + // --- Helpers --- + function findPageInfo(slug) { + for (var s = 0; s < navData.sections.length; s++) { + var section = navData.sections[s]; + if (section.pages) { + for (var i = 0; i < section.pages.length; i++) { + if (section.pages[i].slug === slug) { + return Object.assign({}, section.pages[i], { section: section.title }); + } + } + } + if (section.groups) { + for (var g = 0; g < section.groups.length; g++) { + for (var j = 0; j < section.groups[g].pages.length; j++) { + if (section.groups[g].pages[j].slug === slug) { + return Object.assign({}, section.groups[g].pages[j], { section: section.title }); + } + } + } + } + } + return null; + } + + function escHtml(s) { + if (!s) return ""; + return String(s).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); + } + + function escAttr(s) { + return escHtml(s); + } + + // Copy code to clipboard + window.copyCode = function (btn) { + var code = btn.parentElement.querySelector("code"); + var text = code.textContent; + navigator.clipboard.writeText(text).then(function () { + btn.textContent = "已复制"; + setTimeout(function () { btn.textContent = "复制"; }, 1500); + }); + }; + + // --- Mobile sidebar --- + function toggleMobileSidebar() { + document.getElementById("sidebar").classList.toggle("open"); + document.getElementById("sidebarBackdrop").classList.toggle("open"); + } + function closeMobileSidebar() { + document.getElementById("sidebar").classList.remove("open"); + document.getElementById("sidebarBackdrop").classList.remove("open"); + } + + // Close mobile sidebar on nav + document.addEventListener("click", function (e) { + if (e.target.classList.contains("nav-page")) { + closeMobileSidebar(); + } + }); + + // --- Start --- + init(); +})(); diff --git a/docs/js/search.js b/docs/js/search.js new file mode 100644 index 0000000..b5c8529 --- /dev/null +++ b/docs/js/search.js @@ -0,0 +1,161 @@ +/** + * search.js — Full-text search for sunvpy docs using Fuse.js + */ +(function () { + "use strict"; + + var fuse = null; + var searchIndex = null; + var searchOverlay = document.getElementById("searchOverlay"); + var searchInput = document.getElementById("searchInput"); + var searchResults = document.getElementById("searchResults"); + var debounceTimer = null; + + // Open search + function openSearch() { + searchOverlay.classList.add("active"); + searchInput.value = ""; + searchResults.innerHTML = '
输入关键词开始搜索
'; + searchInput.focus(); + loadIndex(); + } + + // Close search + function closeSearch() { + searchOverlay.classList.remove("active"); + searchInput.blur(); + } + + // Lazy-load search index + async function loadIndex() { + if (searchIndex) return; + try { + var resp = await fetch("data/search-index.json"); + searchIndex = await resp.json(); + fuse = new Fuse(searchIndex, { + keys: [ + { name: "title", weight: 0.4 }, + { name: "headings", weight: 0.3 }, + { name: "content", weight: 0.3 }, + ], + threshold: 0.3, + ignoreLocation: true, + includeMatches: true, + minMatchCharLength: 2, + }); + } catch (e) { + searchResults.innerHTML = '
无法加载搜索索引
'; + } + } + + // Perform search + function doSearch(query) { + if (!fuse || !query.trim()) { + searchResults.innerHTML = '
输入关键词开始搜索
'; + return; + } + + var results = fuse.search(query, { limit: 20 }); + + if (results.length === 0) { + searchResults.innerHTML = '
未找到匹配结果
'; + return; + } + + var html = ""; + results.forEach(function (result) { + var item = result.item; + var context = getContext(result.matches, item); + html += '' + + '
' + escHtml(item.title) + "
" + + '
' + escHtml(item.section) + "
" + + '
' + context + "
" + + "
"; + }); + searchResults.innerHTML = html; + } + + // Get matching context snippet + function getContext(matches, item) { + if (!matches || matches.length === 0) return ""; + + // Prefer title/content match context + for (var i = 0; i < matches.length; i++) { + var m = matches[i]; + if (m.key === "content" && m.indices && m.indices.length > 0) { + var idx = m.indices[0]; + var start = Math.max(0, idx[0] - 30); + var end = Math.min(item.content.length, idx[1] + 30); + var snippet = (start > 0 ? "..." : "") + item.content.substring(start, end) + (end < item.content.length ? "..." : ""); + return highlightMatch(snippet, m.value.substring(idx[0], idx[1] + 1)); + } + if (m.key === "headings" && m.indices && m.indices.length > 0) { + var arr = item.headings; + for (var h = 0; h < arr.length; h++) { + if (arr[h].toLowerCase().indexOf(m.value.toLowerCase()) !== -1) { + return highlightMatch(arr[h], m.value); + } + } + } + } + return ""; + } + + function highlightMatch(text, match) { + if (!match) return escHtml(text); + var escaped = escHtml(text); + var escapedMatch = escHtml(match); + return escaped.replace(new RegExp(escapeRegex(escapedMatch), "gi"), "$&"); + } + + function escapeRegex(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + + // Close search global + window.closeSearch = closeSearch; + + // Event listeners + searchInput.addEventListener("input", function () { + clearTimeout(debounceTimer); + debounceTimer = setTimeout(function () { + doSearch(searchInput.value); + }, 200); + }); + + document.getElementById("searchClose").addEventListener("click", closeSearch); + searchOverlay.addEventListener("click", function (e) { + if (e.target === searchOverlay) closeSearch(); + }); + + // Keyboard shortcut: Ctrl+K / Cmd+K + document.addEventListener("keydown", function (e) { + if ((e.ctrlKey || e.metaKey) && e.key === "k") { + e.preventDefault(); + openSearch(); + } + if (e.key === "Escape" && searchOverlay.classList.contains("active")) { + closeSearch(); + } + }); + + // Sidebar search button + document.getElementById("sidebarSearchBtn").addEventListener("click", openSearch); + var mobileSearchBtn = document.getElementById("searchBtnMobile"); + if (mobileSearchBtn) mobileSearchBtn.addEventListener("click", openSearch); + + // Navigate on result click + searchResults.addEventListener("click", function (e) { + var item = e.target.closest(".search-result-item"); + if (item) { + closeSearch(); + } + }); + + function escHtml(s) { + if (!s) return ""; + return String(s).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); + } + + function escAttr(s) { return escHtml(s); } +})(); diff --git a/docs/libs/fuse.min.js b/docs/libs/fuse.min.js new file mode 100644 index 0000000..1f534ad --- /dev/null +++ b/docs/libs/fuse.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?$.getFn:n,o=t.fieldNormWeight,c=void 0===o?$.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(F).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),c=parseFloat(Math.round(o*r)/r);return n.set(i,c),c},clear:function(){n.clear()}}}(c,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,m(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();m(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?$.getFn:r,o=n.fieldNormWeight,c=void 0===o?$.fieldNormWeight:o,a=new R({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(A)),a.setSources(t),a.create(),a}function N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?$.distance:s,h=t.ignoreLocation,l=void 0===h?$.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(a-o);return u?f+d/u:d?1:f}var W=32;function T(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?$.location:i,c=r.distance,a=void 0===c?$.distance:c,s=r.threshold,u=void 0===s?$.threshold:s,h=r.findAllMatches,l=void 0===h?$.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?$.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?$.includeMatches:v,y=r.ignoreLocation,p=void 0===y?$.ignoreLocation:y;if(t.length>W)throw new Error("Pattern length exceeds max of ".concat(W,"."));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,w=b,S=d>1||g,L=S?Array(M):[];(m=e.indexOf(t,w))>-1;){var _=N(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(_,x),w=m+k,S)for(var O=0;O=P;D-=1){var K=D-1,q=n[e.charAt(K)];if(S&&(L[K]=+!!q),z[D]=(z[D+1]<<1|1)&q,E&&(z[D]|=(j[D+1]|j[D])<<1|1|j[D+1]),z[D]&C&&(A=N(t,{errors:E,currentLocation:K,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=A,(w=K)<=b)break;P=Math.max(1,2*b-w)}}if(N(t,{errors:E+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;j=z}var B={isMatch:w>=0,score:Math.max(.001,A)};if(S){var J=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}(L,d);J.length?g&&(B.indices=J):B.isMatch=!1}return B}function z(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?$.location:o,a=i.threshold,s=void 0===a?$.threshold:a,u=i.distance,h=void 0===u?$.distance:u,l=i.includeMatches,f=void 0===l?$.includeMatches:l,d=i.findAllMatches,v=void 0===d?$.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?$.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?$.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?$.ignoreLocation:k;if(r(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:f,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){n.chunks.push({pattern:e,alphabet:z(e),startIndex:t})},x=this.pattern.length;if(x>W){for(var w=0,S=x%W,L=x-S;w1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?$.location:c,s=o.threshold,u=void 0===s?$.threshold:s,h=o.distance,l=void 0===h?$.distance:h,f=o.includeMatches,d=void 0===f?$.includeMatches:f,v=o.findAllMatches,g=void 0===v?$.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?$.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?$.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?$.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new D(e,{location:a,threshold:u,distance:l,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),i}return o(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(K),X=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(K),Y=[B,X,U,V,H,G,J,Q],Z=Y.length,ee=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,te=new Set([Q.type,X.type]),ne=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?$.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?$.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?$.minMatchCharLength:s,h=n.ignoreLocation,l=void 0===h?$.ignoreLocation:h,f=n.findAllMatches,d=void 0===f?$.findAllMatches:f,v=n.location,g=void 0===v?$.location:v,y=n.threshold,p=void 0===y?$.threshold:y,m=n.distance,k=void 0===m?$.distance:m;r(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:l,location:g,threshold:p,distance:k},this.pattern=o?t:t.toLowerCase(),this.query=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(ee).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n;return ue(e)||(e=he(e)),function e(n){var i=Object.keys(n),o=function(e){return!!e[ae]}(n);if(!o&&i.length>1&&!ue(n))return e(he(n));if(function(e){return!g(e)&&b(e)&&!ue(e)}(n)){var c=o?n[ae]:i[0],a=o?n[se]:n[c];if(!m(a))throw new Error(function(e){return"Invalid value for key ".concat(e)}(c));var s={keyId:C(c),pattern:a};return r&&(s.searcher=ie(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];g(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u}(e)}function fe(e,t){var n=e.matches;t.matches=[],x(n)&&n.forEach((function(e){if(x(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function de(e,t){t.score=e.score}var ve=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},$),i),this.options.useExtendedSearch,this._keyStore=new j(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof R))throw new Error("Incorrect 'index' type");this._myIndex=t||P(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){x(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,c=r.shouldSort,a=r.sortFn,s=r.ignoreFieldNorm,u=m(e)?m(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?$.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,c=n?n.weight:null;t*=Math.pow(0===o&&c?Number.EPSILON:o,(c||1)*(r?1:i))})),e.score=t}))}(u,{ignoreFieldNorm:s}),c&&u.sort(a),k(n)&&n>-1&&(u=u.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?$.includeMatches:r,o=n.includeScore,c=void 0===o?$.includeScore:o,a=[];return i&&a.push(fe),c&&a.push(de),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}(u,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=ie(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(x(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=le(e,this.options),r=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?$.getFn:n,i=t.fieldNormWeight,o=void 0===i?$.fieldNormWeight:i,c=e.keys,a=e.records,s=new R({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ve.config=$,function(){re.push.apply(re,arguments)}(ne),ve},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/docs/libs/github-dark.min.css b/docs/libs/github-dark.min.css new file mode 100644 index 0000000..03b6da8 --- /dev/null +++ b/docs/libs/github-dark.min.css @@ -0,0 +1,10 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: GitHub Dark + Description: Dark theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-dark + Current colors taken from GitHub's CSS +*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c} \ No newline at end of file diff --git a/docs/libs/github.min.css b/docs/libs/github.min.css new file mode 100644 index 0000000..275239a --- /dev/null +++ b/docs/libs/github.min.css @@ -0,0 +1,10 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: GitHub + Description: Light theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-light + Current colors taken from GitHub's CSS +*/.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0} \ No newline at end of file diff --git a/docs/libs/highlight.min.js b/docs/libs/highlight.min.js new file mode 100644 index 0000000..5442f21 --- /dev/null +++ b/docs/libs/highlight.min.js @@ -0,0 +1,1232 @@ +/*! + Highlight.js v11.10.0 (git: 366a8bd012) + (c) 2006-2024 Josh Goebel and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";function e(n){ +return n instanceof Map?n.clear=n.delete=n.set=()=>{ +throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ +const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) +})),n}class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] +;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope +;class r{constructor(e,n){ +this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ +this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ +if(e.startsWith("language:"))return e.replace("language:","language-") +;if(e.includes(".")){const t=e.split(".") +;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") +}return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} +closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const s=(e={})=>{const n={children:[]} +;return Object.assign(n,e),n};class o{constructor(){ +this.rootNode=s(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const n=s({scope:e}) +;this.add(n),this.stack.push(n)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ +return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), +n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} +addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ +this.closeNode()}__addSublanguage(e,n){const t=e.root +;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ +return new r(this,this.options).value()}finalize(){ +return this.closeAllNodes(),!0}}function c(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} +function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} +function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ +const n=e[e.length-1] +;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} +})(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} +function p(e){return RegExp(e.toString()+"|").exec("").length-1} +const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function h(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t +;let a=c(e),i="";for(;a.length>0;){const e=_.exec(a);if(!e){i+=a;break} +i+=a.substring(0,e.index), +a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], +"("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} +const f="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",w="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",N="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},k={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},x={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},O=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, +contains:[]},t);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:b(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},M=O("//","$"),A=O("/\\*","\\*/"),S=O("#","$");var C=Object.freeze({ +__proto__:null,APOS_STRING_MODE:k,BACKSLASH_ESCAPE:v,BINARY_NUMBER_MODE:{ +scope:"number",begin:N,relevance:0},BINARY_NUMBER_RE:N,COMMENT:O, +C_BLOCK_COMMENT_MODE:A,C_LINE_COMMENT_MODE:M,C_NUMBER_MODE:{scope:"number", +begin:w,relevance:0},C_NUMBER_RE:w,END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}}),HASH_COMMENT_MODE:S,IDENT_RE:f, +MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+E,relevance:0}, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y, +PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},QUOTE_STRING_MODE:x,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, +end:/\/[gimuy]*/,contains:[v,{begin:/\[/,end:/\]/,relevance:0,contains:[v]}]}, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const n=/^#![ ]*\// +;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, +end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, +TITLE_MODE:{scope:"title",begin:f,relevance:0},UNDERSCORE_IDENT_RE:E, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0}});function T(e,n){ +"."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ +n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function I(e,n){ +Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function L(e,n){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function B(e,n){ +void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] +})),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ +relevance:0,contains:[Object.assign(t,{endsParent:!0})] +},e.relevance=0,delete t.beforeMatch +},F=["of","and","for","in","not","or","if","then","parent","list","value"],z="keyword" +;function j(e,n,t=z){const a=Object.create(null) +;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ +Object.assign(a,j(e[t],n,t))})),a;function i(e,t){ +n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") +;a[t[0]]=[e,U(t[0],t[1])]}))}}function U(e,n){ +return n?Number(n):(e=>F.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},q=(e,...n)=>{console.log("WARN: "+e,...n)},H=(e,n)=>{ +P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) +},G=Error();function Z(e,n,{key:t}){let a=0;const i=e[t],r={},s={} +;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=p(n[e-1]) +;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=h(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=h(e.end,{joinWith:""})}})(e)}function Q(e){ +function n(n,t){ +return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) +}class t{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,n){ +n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), +this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(h(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const n=this.matcherRe.exec(e);if(!n)return null +;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] +;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t +;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), +n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ +this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ +const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex +;let t=n.exec(e) +;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ +const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} +return t&&(this.regexIndex+=t.position+1, +this.regexIndex===this.count&&this.considerAll()),t}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(r,s){const o=r +;if(r.isCompiled)return o +;[R,L,W,$].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), +r.__beforeBegin=null,[D,I,B].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +l=r.keywords.$pattern, +delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=j(r.keywords,e.case_insensitive)), +o.keywordPatternRe=n(l,!0), +s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(o.endRe=n(o.end)), +o.terminatorEnd=c(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), +r.illegal&&(o.illegalRe=n(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ +variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) +})),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new i +;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ +return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ +constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} +const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ +const a=Object.create(null),i=Object.create(null),r=[];let s=!0 +;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let p={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function _(e){ +return p.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" +;"object"==typeof n?(a=e, +t=n.ignoreIllegals,i=n.language):(H("10.7.0","highlight(lang, code, ...args) has been deprecated."), +H("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};O("before:highlight",r) +;const s=r.result?r.result:f(r.language,r.code,t) +;return s.code=r.code,O("after:highlight",s),s}function f(e,t,i,r){ +const l=Object.create(null);function c(){if(!O.keywords)return void A.addText(S) +;let e=0;O.keywordPatternRe.lastIndex=0;let n=O.keywordPatternRe.exec(S),t="" +;for(;n;){t+=S.substring(e,n.index) +;const i=N.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,O.keywords[a]);if(r){ +const[e,a]=r +;if(A.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ +const t=N.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] +;e=O.keywordPatternRe.lastIndex,n=O.keywordPatternRe.exec(S)}var a +;t+=S.substring(e),A.addText(t)}function d(){null!=O.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof O.subLanguage){ +if(!a[O.subLanguage])return void A.addText(S) +;e=f(O.subLanguage,S,!0,M[O.subLanguage]),M[O.subLanguage]=e._top +}else e=E(S,O.subLanguage.length?O.subLanguage:null) +;O.relevance>0&&(C+=e.relevance),A.__addSublanguage(e._emitter,e.language) +})():c(),S=""}function g(e,n){ +""!==e&&(A.startScope(n),A.addText(e),A.endScope())}function u(e,n){let t=1 +;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} +const a=N.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(S=i,c(),S=""),t++}} +function b(e,n){ +return e.scope&&"string"==typeof e.scope&&A.openNode(N.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(g(S,N.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,n),S="")),O=Object.create(e,{parent:{ +value:O}}),O}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) +;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) +;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,t,a)}function _(e){ +return 0===O.matcher.regexIndex?(S+=e[0],1):(D=!0,0)}function h(e){ +const n=e[0],a=t.substring(e.index),i=m(O,e,a);if(!i)return ee;const r=O +;O.endScope&&O.endScope._wrap?(d(), +g(n,O.endScope._wrap)):O.endScope&&O.endScope._multi?(d(), +u(O.endScope,e)):r.skip?S+=n:(r.returnEnd||r.excludeEnd||(S+=n), +d(),r.excludeEnd&&(S=n));do{ +O.scope&&A.closeNode(),O.skip||O.subLanguage||(C+=O.relevance),O=O.parent +}while(O!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} +let y={};function w(a,r){const o=r&&r[0];if(S+=a,null==o)return d(),0 +;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===o){ +if(S+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) +;throw n.languageName=e,n.badRule=y.rule,n}return 1} +if(y=r,"begin"===r.type)return(e=>{ +const t=e[0],a=e.rule,i=new n(a),r=[a.__beforeBegin,a["on:begin"]] +;for(const n of r)if(n&&(n(e,i),i.isMatchIgnored))return _(t) +;return a.skip?S+=t:(a.excludeBegin&&(S+=t), +d(),a.returnBegin||a.excludeBegin||(S=t)),b(a,e),a.returnBegin?0:t.length})(r) +;if("illegal"===r.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(O.scope||"")+'"') +;throw e.mode=O,e}if("end"===r.type){const e=h(r);if(e!==ee)return e} +if("illegal"===r.type&&""===o)return 1 +;if(R>1e5&&R>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=o,o.length}const N=v(e) +;if(!N)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const k=Q(N);let x="",O=r||k;const M={},A=new p.__emitter(p);(()=>{const e=[] +;for(let n=O;n!==N;n=n.parent)n.scope&&e.unshift(n.scope) +;e.forEach((e=>A.openNode(e)))})();let S="",C=0,T=0,R=0,D=!1;try{ +if(N.__emitTokens)N.__emitTokens(t,A);else{for(O.matcher.considerAll();;){ +R++,D?D=!1:O.matcher.considerAll(),O.matcher.lastIndex=T +;const e=O.matcher.exec(t);if(!e)break;const n=w(t.substring(T,e.index),e) +;T=e.index+n}w(t.substring(T))}return A.finalize(),x=A.toHTML(),{language:e, +value:x,relevance:C,illegal:!1,_emitter:A,_top:O}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, +context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:x},_emitter:A};if(s)return{ +language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:A,_top:O} +;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ +const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} +;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(x).map((n=>f(n,e,!1))) +;i.unshift(t);const r=i.sort(((e,n)=>{ +if(e.relevance!==n.relevance)return n.relevance-e.relevance +;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 +;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,l=s +;return l.secondBest=o,l}function y(e){let n=null;const t=(e=>{ +let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" +;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) +;return n||(q(o.replace("{}",t[1])), +q("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} +return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return +;if(O("before:highlightElement",{el:e,language:t +}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) +;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) +;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) +;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t +;e.classList.add("hljs"),e.classList.add("language-"+a) +})(e,t,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),O("after:highlightElement",{el:e,result:r,text:a})}let w=!1;function N(){ +"loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(y):w=!0 +}function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} +function k(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=n}))}function x(e){const n=v(e) +;return n&&!n.disableAutodetect}function O(e,n){const t=e;r.forEach((e=>{ +e[t]&&e[t](n)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +w&&N()}),!1),Object.assign(t,{highlight:h,highlightAuto:E,highlightAll:N, +highlightElement:y, +highlightBlock:e=>(H("10.7.0","highlightBlock will be removed entirely in v12.0"), +H("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)}, +initHighlighting:()=>{ +N(),H("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +N(),H("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!s)throw n;K(n),i=c} +i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&k(i.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete a[e] +;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, +listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:k, +autoDetection:x,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ +e["before:highlightBlock"](Object.assign({block:n.el},n)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ +e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}, +removePlugin:e=>{const n=r.indexOf(e);-1!==n&&r.splice(n,1)}}),t.debugMode=()=>{ +s=!1},t.safeMode=()=>{s=!0},t.versionString="11.10.0",t.regex={concat:b, +lookahead:d,either:m,optional:u,anyNumberOfTimes:g} +;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t +},te=ne({});te.newInstance=()=>ne({});const ae=e=>({IMPORTANT:{scope:"meta", +begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ +scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, +FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, +ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}),ie=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],re=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),se=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),oe=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),le=["accent-color","align-content","align-items","align-self","alignment-baseline","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-end-end-radius","border-end-start-radius","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","cx","cy","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","empty-cells","enable-background","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","flood-color","flood-opacity","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","inset","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","kerning","justify-content","justify-items","justify-self","left","letter-spacing","lighting-color","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","marker","marker-end","marker-mid","marker-start","mask","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","scale","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","speak","speak-as","src","tab-size","table-layout","text-anchor","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-offset","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","vector-effect","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index"].sort().reverse(),ce=se.concat(oe).sort().reverse() +;var de="[0-9](_*[0-9])*",ge=`\\.(${de})`,ue="[0-9a-fA-F](_*[0-9a-fA-F])*",be={ +className:"number",variants:[{ +begin:`(\\b(${de})((${ge})|\\.)?|(${ge}))[eE][+-]?(${de})[fFdD]?\\b`},{ +begin:`\\b(${de})((${ge})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${ge})[fFdD]?\\b`},{begin:`\\b(${de})[fFdD]\\b`},{ +begin:`\\b0[xX]((${ue})\\.?|(${ue})?\\.(${ue}))[pP][+-]?(${de})[fFdD]?\\b`},{ +begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${ue})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function me(e,n,t){return-1===t?"":e.replace(n,(a=>me(e,n,t-1)))} +const pe="[A-Za-z$_][0-9A-Za-z$_]*",_e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],he=["true","false","null","undefined","NaN","Infinity"],fe=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Ee=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],ye=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],we=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Ne=[].concat(ye,fe,Ee) +;function ve(e){const n=e.regex,t=pe,a={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const t=e[0].length+e.index,a=e.input[t] +;if("<"===a||","===a)return void n.ignoreMatch();let i +;">"===a&&(((e,{after:n})=>{const t="e+"\\s*\\(")), +n.concat("(?!",v.join("|"),")")),t,n.lookahead(/\s*\(/)), +className:"title.function",relevance:0};var v;const k={ +begin:n.concat(/\./,n.lookahead(n.concat(t,/(?![0-9A-Za-z$_(])/))),end:t, +excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},x={ +match:[/get|set/,/\s+/,t,/(?=\()/],className:{1:"keyword",3:"title.function"}, +contains:[{begin:/\(\)/},f] +},O="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",M={ +match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(O)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]} +;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ +PARAMS_CONTAINS:h,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/, +contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,y,{ +className:"attr",begin:t+n.lookahead(":"),relevance:0},M,{ +begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ +className:"function",begin:O,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,keywords:i,contains:h}]}]},{begin:/,/,relevance:0 +},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, +"on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ +begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},w,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:t, +className:"title.function"})]},{match:/\.\.\./,relevance:0},k,{match:"\\$"+t, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[f]},N,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},E,x,{match:/\$[(.]/}]}} +const ke=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),xe=["Protocol","Type"].map(ke),Oe=["init","self"].map(ke),Me=["Any","Self"],Ae=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Se=["false","nil","true"],Ce=["assignment","associativity","higherThan","left","lowerThan","none","right"],Te=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],Re=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],De=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Ie=m(De,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Le=b(De,Ie,"*"),Be=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),$e=m(Be,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Fe=b(Be,$e,"*"),ze=b(/[A-Z]/,$e,"*"),je=["attached","autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Fe,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Ue=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;var Pe=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ +begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} +;Object.assign(t,{className:"variable",variants:[{ +begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE] +},r=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),s={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(o);const l={begin:/\$?\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},c=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),d={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[c,e.SHEBANG(),d,l,r,s,{match:/(\/[a-z._-]+)+/},o,{match:/\\"/},{ +className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}},grmr_c:e=>{ +const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},b=[c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:b.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:b.concat(["self"]),relevance:0}]),relevance:0},p={ +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], +relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, +keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s] +}]},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, +strings:o,keywords:u}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="(?!struct)("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{ +begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)" +},{ +begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},b={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) +},m=[b,c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],p={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:m.concat(["self"]),relevance:0}]),relevance:0},_={className:"function", +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{ +begin:/:/,endsWithParent:!0,contains:[o,l]},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:u, +relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s]}] +},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:u,illegal:"",keywords:u,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:u},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ +keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/, +keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]}) +;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE], +o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[{className:"string", +begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1 +},c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},u={begin:"<",end:">", +contains:[{beginKeywords:"in out"},t] +},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +keyword:"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,a,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ +const n=e.regex,t=ae(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ +name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ +keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, +contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+se.join("|")+")"},{begin:":(:)?("+oe.join("|")+")"}] +},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+le.join("|")+")\\b"},{ +begin:/:/,end:/[;}{]/, +contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0, +excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", +relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ +},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:re.join(" ")},contains:[{ +begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ +className:"selector-tag",begin:"\\b("+ie.join("|")+")\\b"}]}},grmr_diff:e=>{ +const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ +className:"meta",relevance:10, +match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) +},{className:"comment",variants:[{ +begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), +end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]}},grmr_go:e=>{const n={ +keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], +type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], +literal:["true","false","iota","nil"], +built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{const n=e.regex +;return{name:"GraphQL",aliases:["gql"],case_insensitive:!0,disableAutodetect:!1, +keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:n.concat(/[_A-Za-z][_0-9A-Za-z]*/,n.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}},grmr_ini:e=>{const n=e.regex,t={ +className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{ +begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{begin:/;/,end:/$/},{begin:/#/, +end:/$/}];const i={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{ +begin:/\$\{(.*?)\}/}]},r={className:"literal", +begin:/\bon|off|true|false|yes|no\b/},s={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0 +},l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ +const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+me("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},s={className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", +3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0, +contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,be,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},be,r]}},grmr_javascript:ve, +grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", +beginKeywords:n.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{ +literal:n},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/, +relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], +illegal:"\\S"}},grmr_kotlin:e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] +},l=be,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 +},e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{ +begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ +3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, +excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},l]}},grmr_less:e=>{ +const n=ae(e),t=ce,a="[\\w-]+",i="("+a+"|@\\{"+a+"\\})",r=[],s=[],o=e=>({ +className:"string",begin:"~?"+e+".*?"+e}),l=(e,n,t)=>({className:e,begin:n, +relevance:t}),c={$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:re.join(" ")},d={begin:"\\(",end:"\\)",contains:s,keywords:c, +relevance:0} +;s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,o("'"),o('"'),n.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},n.HEXCOLOR,d,l("variable","@@?"+a,10),l("variable","@\\{"+a+"\\}"),l("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const g=s.concat({ +begin:/\{/,end:/\}/,contains:r}),u={beginKeywords:"when",endsWithParent:!0, +contains:[{beginKeywords:"and not"}].concat(s)},b={begin:i+"\\s*:", +returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ +},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+le.join("|")+")\\b", +end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}] +},m={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:c,returnEnd:!0,contains:s,relevance:0}},p={ +className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a +}],starts:{end:"[;}]",returnEnd:!0,contains:g}},_={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:i,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u,l("keyword","all\\b"),l("variable","@\\{"+a+"\\}"),{ +begin:"\\b("+ie.join("|")+")\\b",className:"selector-tag" +},n.CSS_NUMBER_MODE,l("selector-tag",i,0),l("selector-id","#"+i),l("selector-class","\\."+i,0),l("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+se.join("|")+")"},{ +className:"selector-pseudo",begin:":(:)?("+oe.join("|")+")"},{begin:/\(/, +end:/\)/,relevance:0,contains:g},{begin:"!important"},n.FUNCTION_DISPATCH]},h={ +begin:a+":(:)?"+`(${t.join("|")})`,returnBegin:!0,contains:[_]} +;return r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,m,p,h,b,_,u,n.FUNCTION_DISPATCH), +{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:r}}, +grmr_lua:e=>{const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] +},i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,t,{contains:[a],relevance:10 +})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:i}].concat(i) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{ +const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={ +variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},r=e.inherit(a,{contains:[] +}),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r) +;let o=[n,t];return[a,i,r,s].forEach((e=>{e.contains=e.contains.concat(o) +})),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal", +match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}, +grmr_objectivec:e=>{const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, +keyword:["@interface","@class","@protocol","@implementation"]};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{"variable.language":["this","super"],$pattern:n, +keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], +literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], +built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], +type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] +},illegal:"/,end:/$/,illegal:"\\n" +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", +begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, +contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, +relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={ +$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot class close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl field fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map method mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/, +end:/\}/},s={scope:"attr",match:/\s+:\s*\w+(\s*\(.*?\))?/},o={scope:"variable", +variants:[{begin:/\$\d/},{ +begin:n.concat(/[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@](?!")[^\s\w{=]|\$=/,relevance:0}],contains:[s]},l={ +className:"number",variants:[{match:/0?\.[0-9][0-9_]+\b/},{ +match:/\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/},{ +match:/\b0[0-7][0-7_]*\b/},{match:/\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/},{ +match:/\b0b[0-1][0-1_]*\b/}],relevance:0 +},c=[e.BACKSLASH_ESCAPE,i,o],d=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],g=(e,a,i="\\1")=>{ +const r="\\1"===i?i:n.concat(i,a) +;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t) +},u=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),b=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),r,{className:"string",contains:c,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},l,{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:g("s|tr|y",n.either(...d,{capture:!0}))},{begin:g("s|tr|y","\\(","\\)")},{ +begin:g("s|tr|y","\\[","\\]")},{begin:g("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:u("(?:m|qr)?",/\//,/\//)},{begin:u("m|qr",n.either(...d,{capture:!0 +}),/\1/)},{begin:u("m|qr",/\(/,/\)/)},{begin:u("m|qr",/\[/,/\]/)},{ +begin:u("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub method", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,s] +},{className:"class",beginKeywords:"class",end:"[;{]",excludeEnd:!0,relevance:5, +contains:[e.TITLE_MODE,s,l]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$", +end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$", +className:"comment"}]}];return i.contains=b,r.contains=b,{name:"Perl", +aliases:["pl","pm"],keywords:a,contains:b}},grmr_php:e=>{ +const n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={ +scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ +begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ +illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),o,{ +begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(s),"on:begin":(e,n)=>{ +n.data._beginMatch=e[1]||e[2]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}},e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ +begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" +}],relevance:0 +},g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],m={ +keyword:u,literal:(e=>{const n=[];return e.forEach((e=>{ +n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase()) +})),n})(g),built_in:b},p=e=>e.map((e=>e.replace(/\|\d+$/,""))),_={variants:[{ +match:[/new/,n.concat(l,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i],scope:{ +1:"keyword",4:"title.class"}}]},h=n.concat(a,"\\b(?!\\()"),f={variants:[{ +match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" +}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ +match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", +3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))], +scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class", +3:"variable.language"}}]},E={scope:"attr", +match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, +begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] +},w={relevance:0, +match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], +scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(w) +;const N=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, +keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, +endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ +begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, +contains:["self",...N]},...N,{scope:"meta",match:i}] +},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ +scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, +keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, +contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ +begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ +begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,w,f,{ +match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ +scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, +excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" +},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", +begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m, +contains:["self",r,f,e.C_BLOCK_COMMENT_MODE,c,d]}]},{scope:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ +beginKeywords:"use",relevance:0,end:";",contains:[{ +match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},c,d]} +},grmr_php_template:e=>({name:"PHP template",subLanguage:"xml",contains:[{ +begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*", +end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0 +},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null, +contains:null,skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0}),grmr_python:e=>{ +const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:a, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, +end:/\}/,keywords:i,illegal:/#/},o={begin:/\{\{/,relevance:0},l={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,o,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})` +}]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, +contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, +illegal:/(<\/|\?)|=>/,contains:[r,u,{scope:"variable.language",match:/\bself\b/ +},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword" +},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{1:"keyword", +3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,l]}]}}, +grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt", +starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{ +begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{ +const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) +;return{name:"R",keywords:{$pattern:t, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, +starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), +endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ +scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 +}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] +}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], +variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ +1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"}, +match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{ +2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"}, +match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ +match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`", +contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{ +const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={ +"variable.constant":["__FILE__","__LINE__","__ENCODING__"], +"variable.language":["self","super"], +keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], +built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], +literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},o={ +begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[s] +}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, +end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ +begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ +begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, +end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ +begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ +begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), +contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[e.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},b={variants:[{match:/\(\)/},{ +className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, +keywords:r}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ +match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", +4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{ +2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{ +1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ +match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ +begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, +relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", +keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], +illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ +begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", +end:"\\][a-z]*"}]}].concat(o,l),relevance:0}].concat(o,l) +;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} +},{className:"meta.prompt", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",keywords:r,contains:m}}];return l.unshift(o),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, +grmr_rust:e=>{ +const n=e.regex,t=/(r#)?/,a=n.concat(t,e.UNDERSCORE_IDENT_RE),i=n.concat(t,e.IDENT_RE),r={ +className:"title.function.invoke",relevance:0, +begin:n.concat(/\b/,/(?!let|for|while|if|else|match\b)/,i,n.lookahead(/\s*\(/)) +},s="([ui](8|16|32|64|128|size)|f(32|64))?",o=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],l=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:l, +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:o},illegal:""},r]}}, +grmr_scss:e=>{const n=ae(e),t=oe,a=se,i="@[a-z-]+",r={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", +case_insensitive:!0,illegal:"[=/|']", +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+ie.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+a.join("|")+")"},{className:"selector-pseudo", +begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, +contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+le.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:/:/,end:/[;}{]/,relevance:0, +contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] +},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ +begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:re.join(" ")},contains:[{begin:i, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] +},n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta.prompt", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]}),grmr_sql:e=>{ +const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=r,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!r.includes(e))),c={ +begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} +;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t +;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, +keyword:l.concat(s),literal:a,type:i}},{className:"type", +begin:n.either("double precision","large object","with timezone","without timezone") +},c,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", +variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, +contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ +className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, +relevance:0}]}},grmr_swift:e=>{const n={match:/\s+/,relevance:0 +},t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ +match:[/\./,m(...xe,...Oe)],className:{2:"keyword"}},r={match:b(/\./,m(...Ae)), +relevance:0},s=Ae.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ +className:"keyword", +match:m(...Ae.filter((e=>"string"!=typeof e)).concat(Me).map(ke),...Oe)}]},l={ +$pattern:m(/\b\w+/,/#\w+/),keyword:s.concat(Te),literal:Se},c=[i,r,o],g=[{ +match:b(/\./,m(...Re)),relevance:0},{className:"built_in", +match:b(/\b/,m(...Re),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ +className:"operator",relevance:0,variants:[{match:Le},{match:`\\.(\\.|${Ie})+`}] +}],_="([0-9]_*)+",h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0, +variants:[{match:`\\b(${_})(\\.(${_}))?([eE][+-]?(${_}))?\\b`},{ +match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(${_}))?\\b`},{match:/\b0o([0-7]_*)+\b/ +},{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ +match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] +}),y=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) +}),w=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ +}),N=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),y(e),w(e)] +}),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),w(e)]}),k={ +className:"string", +variants:[N(),N("#"),N("##"),N("###"),v(),v("#"),v("##"),v("###")] +},x=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, +contains:[e.BACKSLASH_ESCAPE]}],O={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, +contains:x},M=e=>{const n=b(e,/\//),t=b(/\//,e);return{begin:n,end:t, +contains:[...x,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},A={ +scope:"regexp",variants:[M("###"),M("##"),M("#"),O]},S={match:b(/`/,Fe,/`/) +},C=[S,{className:"variable",match:/\$\d+/},{className:"variable", +match:`\\$${$e}+`}],T=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ +contains:[{begin:/\(/,end:/\)/,keywords:Ue,contains:[...p,f,k]}]}},{ +scope:"keyword",match:b(/@/,m(...je),d(m(/\(/,/\s+/)))},{scope:"meta", +match:b(/@/,Fe)}],R={match:d(/\b[A-Z]/),relevance:0,contains:[{className:"type", +match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,$e,"+") +},{className:"type",match:ze,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d(ze)),relevance:0}]},D={ +begin://,keywords:l,contains:[...a,...c,...T,u,R]};R.contains.push(D) +;const I={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ +match:b(Fe,/\s*:/),keywords:"_|0",relevance:0 +},...a,A,...c,...g,...p,f,k,...C,...T,R]},L={begin://, +keywords:"repeat each",contains:[...a,R]},B={begin:/\(/,end:/\)/,keywords:l, +contains:[{begin:m(d(b(Fe,/\s*:/)),d(b(Fe,/\s+/,Fe,/\s*:/))),end:/:/, +relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params", +match:Fe}]},...a,...c,...p,f,k,...T,R,I],endsParent:!0,illegal:/["']/},$={ +match:[/(func|macro)/,/\s+/,m(S.match,Fe,Le)],className:{1:"keyword", +3:"title.function"},contains:[L,B,n],illegal:[/\[/,/%/]},F={ +match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, +contains:[L,B,n],illegal:/\[|%/},z={match:[/operator/,/\s+/,Le],className:{ +1:"keyword",3:"title"}},j={begin:[/precedencegroup/,/\s+/,ze],className:{ +1:"keyword",3:"title"},contains:[R],keywords:[...Ce,...Se],end:/}/},U={ +begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,Fe,/\s*/], +beginScope:{1:"keyword",3:"title.class"},keywords:l,contains:[L,...c,{begin:/:/, +end:/\{/,keywords:l,contains:[{scope:"title.class.inherited",match:ze},...c], +relevance:0}]};for(const e of k.variants){ +const n=e.contains.find((e=>"interpol"===e.label));n.keywords=l +;const t=[...c,...g,...p,f,k,...C];n.contains=[...t,{begin:/\(/,end:/\)/, +contains:["self",...t]}]}return{name:"Swift",keywords:l, +contains:[...a,$,F,U,z,j,{beginKeywords:"import",end:/$/,contains:[...a], +relevance:0},A,...c,...g,...p,f,k,...C,...T,R,I]}},grmr_typescript:e=>{ +const n=ve(e),t=pe,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={ +begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:"keyword",3:"title.class"} +},r={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{ +keyword:"interface extends",built_in:a},contains:[n.exports.CLASS_REFERENCE] +},s={$pattern:pe, +keyword:_e.concat(["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"]), +literal:he,built_in:Ne.concat(a),"variable.language":we},o={className:"meta", +begin:"@"+t},l=(e,n,t)=>{const a=e.contains.findIndex((e=>e.label===n)) +;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} +;Object.assign(n.keywords,s),n.exports.PARAMS_CONTAINS.push(o) +;const c=n.contains.find((e=>"attr"===e.className)) +;return n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,c]), +n.contains=n.contains.concat([o,i,r]), +l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ +name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n},grmr_vbnet:e=>{ +const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ +className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ +begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ +begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}] +},o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] +}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) +;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, +classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},o,l,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +keyword:"const disable else elseif enable end externalsource if region then"}, +contains:[l]}]}},grmr_wasm:e=>{e.regex;const n=e.COMMENT(/\(;/,/;\)/) +;return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/, +keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] +},contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/], +className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ +match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ +begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", +3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, +className:"type"},{className:"keyword", +match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ +},{className:"number",relevance:0, +match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ +}]}},grmr_xml:e=>{ +const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[i,r,o,s]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:n.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ +className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ +className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} +},grmr_yaml:e=>{ +const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/, +end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", +contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ +begin:/\w[\w :()\./-]*:(?=[ \t]|$)/},{begin:/"\w[\w :()\./-]*":(?=[ \t]|$)/},{ +begin:/'\w[\w :()\./-]*':(?=[ \t]|$)/}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", +begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] +;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:l}}});const Ke=te;for(const e of Object.keys(Pe)){ +const n=e.replace("grmr_","").replace("_","-");Ke.registerLanguage(n,Pe[e])} +return Ke}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/docs/libs/marked.min.js b/docs/libs/marked.min.js new file mode 100644 index 0000000..e6be4f0 --- /dev/null +++ b/docs/libs/marked.min.js @@ -0,0 +1,6 @@ +/** + * marked v15.0.0 - a markdown parser + * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).marked={})}(this,(function(e){"use strict";function t(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function n(t){e.defaults=t}e.defaults={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};const s={exec:()=>null};function r(e,t=""){let n="string"==typeof e?e:e.source;const s={replace:(e,t)=>{let r="string"==typeof t?t:t.source;return r=r.replace(i.caret,"$1"),n=n.replace(e,r),s},getRegex:()=>new RegExp(n,t)};return s}const i={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[\t ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},l=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,o=/(?:[*+-]|\d{1,9}[.)])/,a=r(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,o).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),c=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,h=/(?!\s*\])(?:\\.|[^\[\]\\])+/,p=r(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",h).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),u=r(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,o).getRegex(),g="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",k=/|$))/,d=r("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$))","i").replace("comment",k).replace("tag",g).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),f=r(c).replace("hr",l).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",g).getRegex(),x={blockquote:r(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",f).getRegex(),code:/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,def:p,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:l,html:d,lheading:a,list:u,newline:/^(?:[ \t]*(?:\n|$))+/,paragraph:f,table:s,text:/^[^\n]+/},b=r("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",l).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3}\t)[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",g).getRegex(),m={...x,table:b,paragraph:r(c).replace("hr",l).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",b).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",g).getRegex()},w={...x,html:r("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",k).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:s,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:r(c).replace("hr",l).replace("heading"," *#{1,6} *[^\n]").replace("lheading",a).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},y=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,$=/^( {2,}|\\)\n(?!\s*$)/,R="\\p{P}\\p{S}",T=r(/^((?![*_])[\spunctuation])/,"u").replace(/punctuation/g,R).getRegex(),z=r(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,R).getRegex(),A=r("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,R).getRegex(),S=r("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,R).getRegex(),_=r(/\\([punct])/,"gu").replace(/punct/g,R).getRegex(),I=r(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),L=r(k).replace("(?:--\x3e|$)","--\x3e").getRegex(),B=r("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",L).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),C=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,E=r(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",C).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),q=r(/^!?\[(label)\]\[(ref)\]/).replace("label",C).replace("ref",h).getRegex(),P=r(/^!?\[(ref)\](?:\[\])?/).replace("ref",h).getRegex(),Z={_backpedal:s,anyPunctuation:_,autolink:I,blockSkip:/\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g,br:$,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:s,emStrongLDelim:z,emStrongRDelimAst:A,emStrongRDelimUnd:S,escape:y,link:E,nolink:P,punctuation:T,reflink:q,reflinkSearch:r("reflink|nolink(?!\\()","g").replace("reflink",q).replace("nolink",P).getRegex(),tag:B,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},N=e=>j[e];function G(e,t){if(t){if(i.escapeTest.test(e))return e.replace(i.escapeReplace,N)}else if(i.escapeTestNoEncode.test(e))return e.replace(i.escapeReplaceNoEncode,N);return e}function H(e){try{e=encodeURI(e).replace(i.percentDecode,"%")}catch{return null}return e}function X(e,t){const n=e.replace(i.findPipe,((e,t,n)=>{let s=!1,r=t;for(;--r>=0&&"\\"===n[r];)s=!s;return s?"|":" |"})).split(i.splitPipe);let s=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const e=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:F(e,"\n")}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const e=t[0],n=function(e,t,n){const s=e.match(n.other.indentCodeCompensation);if(null===s)return t;const r=s[1];return t.split("\n").map((e=>{const t=e.match(n.other.beginningSpace);if(null===t)return e;const[s]=t;return s.length>=r.length?e.slice(r.length):e})).join("\n")}(e,t[3]||"",this.rules);return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(this.rules.other.endingHash.test(e)){const t=F(e,"#");this.options.pedantic?e=t.trim():t&&!this.rules.other.endingSpaceChar.test(t)||(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:F(t[0],"\n")}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){let e=F(t[0],"\n").split("\n"),n="",s="";const r=[];for(;e.length>0;){let t=!1;const i=[];let l;for(l=0;l1,r={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");const i=this.rules.other.listItemRegex(n);let l=!1;for(;e;){let n=!1,s="",o="";if(!(t=i.exec(e)))break;if(this.rules.block.hr.test(e))break;s=t[0],e=e.substring(s.length);let a=t[2].split("\n",1)[0].replace(this.rules.other.listReplaceTabs,(e=>" ".repeat(3*e.length))),c=e.split("\n",1)[0],h=!a.trim(),p=0;if(this.options.pedantic?(p=2,o=a.trimStart()):h?p=t[1].length+1:(p=t[2].search(this.rules.other.nonSpaceChar),p=p>4?1:p,o=a.slice(p),p+=t[1].length),h&&this.rules.other.blankLine.test(c)&&(s+=c+"\n",e=e.substring(c.length+1),n=!0),!n){const t=this.rules.other.nextBulletRegex(p),n=this.rules.other.hrRegex(p),r=this.rules.other.fencesBeginRegex(p),i=this.rules.other.headingBeginRegex(p),l=this.rules.other.htmlBeginRegex(p);for(;e;){const u=e.split("\n",1)[0];let g;if(c=u,this.options.pedantic?(c=c.replace(this.rules.other.listReplaceNesting," "),g=c):g=c.replace(this.rules.other.tabCharGlobal," "),r.test(c))break;if(i.test(c))break;if(l.test(c))break;if(t.test(c))break;if(n.test(c))break;if(g.search(this.rules.other.nonSpaceChar)>=p||!c.trim())o+="\n"+g.slice(p);else{if(h)break;if(a.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4)break;if(r.test(a))break;if(i.test(a))break;if(n.test(a))break;o+="\n"+c}h||c.trim()||(h=!0),s+=u+"\n",e=e.substring(u.length+1),a=g.slice(p)}}r.loose||(l?r.loose=!0:this.rules.other.doubleBlankLine.test(s)&&(l=!0));let u,g=null;this.options.gfm&&(g=this.rules.other.listIsTask.exec(o),g&&(u="[ ] "!==g[0],o=o.replace(this.rules.other.listReplaceTask,""))),r.items.push({type:"list_item",raw:s,task:!!g,checked:u,loose:!1,text:o,tokens:[]}),r.raw+=s}r.items[r.items.length-1].raw=r.items[r.items.length-1].raw.trimEnd(),r.items[r.items.length-1].text=r.items[r.items.length-1].text.trimEnd(),r.raw=r.raw.trimEnd();for(let e=0;e"space"===e.type)),n=t.length>0&&t.some((e=>this.rules.other.anyLine.test(e.raw)));r.loose=n}if(r.loose)for(let e=0;e({text:e,tokens:this.lexer.inline(e),header:!1,align:i.align[t]}))));return i}}lheading(e){const t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){const t=this.rules.block.paragraph.exec(e);if(t){const e="\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){const t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){const t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){const t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const e=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(e)){if(!this.rules.other.endAngleBracket.test(e))return;const t=F(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{const e=function(e,t){if(-1===e.indexOf(t[1]))return-1;let n=0;for(let s=0;s-1){const n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],s="";if(this.options.pedantic){const e=this.rules.other.pedanticHrefTitle.exec(n);e&&(n=e[1],s=e[3])}else s=t[3]?t[3].slice(1,-1):"";return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(n=this.options.pedantic&&!this.rules.other.endAngleBracket.test(e)?n.slice(1):n.slice(1,-1)),U(t,{href:n?n.replace(this.rules.inline.anyPunctuation,"$1"):n,title:s?s.replace(this.rules.inline.anyPunctuation,"$1"):s},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){const e=t[(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," ").toLowerCase()];if(!e){const e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return U(n,e,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s)return;if(s[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(s[1]||s[2]||"")||!n||this.rules.inline.punctuation.exec(n)){const n=[...s[0]].length-1;let r,i,l=n,o=0;const a="*"===s[0][0]?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(a.lastIndex=0,t=t.slice(-1*e.length+n);null!=(s=a.exec(t));){if(r=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!r)continue;if(i=[...r].length,s[3]||s[4]){l+=i;continue}if((s[5]||s[6])&&n%3&&!((n+i)%3)){o+=i;continue}if(l-=i,l>0)continue;i=Math.min(i,i+l+o);const t=[...s[0]][0].length,a=e.slice(0,n+s.index+t+i);if(Math.min(n,i)%2){const e=a.slice(1,-1);return{type:"em",raw:a,text:e,tokens:this.lexer.inlineTokens(e)}}const c=a.slice(2,-2);return{type:"strong",raw:a,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(this.rules.other.newLineCharGlobal," ");const n=this.rules.other.nonSpaceChar.test(e),s=this.rules.other.startingSpaceChar.test(e)&&this.rules.other.endingSpaceChar.test(e);return n&&s&&(e=e.substring(1,e.length-1)),{type:"codespan",raw:t[0],text:e}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let e,n;return"@"===t[2]?(e=t[1],n="mailto:"+e):(e=t[1],n=e),{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if("@"===t[2])e=t[0],n="mailto:"+e;else{let s;do{s=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??""}while(s!==t[0]);e=t[0],n="www."===t[1]?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){const e=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:e}}}}class K{tokens;options;state;tokenizer;inlineQueue;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||e.defaults,this.options.tokenizer=this.options.tokenizer||new J,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};const n={other:i,block:M.normal,inline:O.normal};this.options.pedantic?(n.block=M.pedantic,n.inline=O.pedantic):this.options.gfm&&(n.block=M.gfm,this.options.breaks?n.inline=O.breaks:n.inline=O.gfm),this.tokenizer.rules=n}static get rules(){return{block:M,inline:O}}static lex(e,t){return new K(t).lex(e)}static lexInline(e,t){return new K(t).inlineTokens(e)}lex(e){e=e.replace(i.carriageReturn,"\n"),this.blockTokens(e,this.tokens);for(let e=0;e!!(s=n.call({lexer:this},e,t))&&(e=e.substring(s.raw.length),t.push(s),!0)))))if(s=this.tokenizer.space(e))e=e.substring(s.raw.length),1===s.raw.length&&t.length>0?t[t.length-1].raw+="\n":t.push(s);else if(s=this.tokenizer.code(e))e=e.substring(s.raw.length),r=t[t.length-1],!r||"paragraph"!==r.type&&"text"!==r.type?t.push(s):(r.raw+="\n"+s.raw,r.text+="\n"+s.text,this.inlineQueue[this.inlineQueue.length-1].src=r.text);else if(s=this.tokenizer.fences(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.heading(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.hr(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.blockquote(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.list(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.html(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.def(e))e=e.substring(s.raw.length),r=t[t.length-1],!r||"paragraph"!==r.type&&"text"!==r.type?this.tokens.links[s.tag]||(this.tokens.links[s.tag]={href:s.href,title:s.title}):(r.raw+="\n"+s.raw,r.text+="\n"+s.raw,this.inlineQueue[this.inlineQueue.length-1].src=r.text);else if(s=this.tokenizer.table(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.lheading(e))e=e.substring(s.raw.length),t.push(s);else{if(l=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0;const n=e.slice(1);let s;this.options.extensions.startBlock.forEach((e=>{s=e.call({lexer:this},n),"number"==typeof s&&s>=0&&(t=Math.min(t,s))})),t<1/0&&t>=0&&(l=e.substring(0,t+1))}if(this.state.top&&(s=this.tokenizer.paragraph(l)))r=t[t.length-1],n&&"paragraph"===r?.type?(r.raw+="\n"+s.raw,r.text+="\n"+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(s),n=l.length!==e.length,e=e.substring(s.raw.length);else if(s=this.tokenizer.text(e))e=e.substring(s.raw.length),r=t[t.length-1],r&&"text"===r.type?(r.raw+="\n"+s.raw,r.text+="\n"+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(s);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,s,r,i,l,o,a=e;if(this.tokens.links){const e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(a));)e.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(a));)a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.anyPunctuation.exec(a));)a=a.slice(0,i.index)+"++"+a.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(l||(o=""),l=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((s=>!!(n=s.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.escape(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.tag(e))e=e.substring(n.raw.length),s=t[t.length-1],t.push(n);else if(n=this.tokenizer.link(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(n.raw.length),s=t[t.length-1],s&&"text"===n.type&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(n=this.tokenizer.emStrong(e,a,o))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.codespan(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.br(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.del(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.autolink(e))e=e.substring(n.raw.length),t.push(n);else if(this.state.inLink||!(n=this.tokenizer.url(e))){if(r=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0;const n=e.slice(1);let s;this.options.extensions.startInline.forEach((e=>{s=e.call({lexer:this},n),"number"==typeof s&&s>=0&&(t=Math.min(t,s))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(n=this.tokenizer.inlineText(r))e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(o=n.raw.slice(-1)),l=!0,s=t[t.length-1],s&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}else e=e.substring(n.raw.length),t.push(n);return t}}class V{options;parser;constructor(t){this.options=t||e.defaults}space(e){return""}code({text:e,lang:t,escaped:n}){const s=(t||"").match(i.notSpaceStart)?.[0],r=e.replace(i.endingNewline,"")+"\n";return s?'
'+(n?r:G(r,!0))+"
\n":"
"+(n?r:G(r,!0))+"
\n"}blockquote({tokens:e}){return`
\n${this.parser.parse(e)}
\n`}html({text:e}){return e}heading({tokens:e,depth:t}){return`${this.parser.parseInline(e)}\n`}hr(e){return"
\n"}list(e){const t=e.ordered,n=e.start;let s="";for(let t=0;t\n"+s+"\n"}listitem(e){let t="";if(e.task){const n=this.checkbox({checked:!!e.checked});e.loose?e.tokens.length>0&&"paragraph"===e.tokens[0].type?(e.tokens[0].text=n+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&"text"===e.tokens[0].tokens[0].type&&(e.tokens[0].tokens[0].text=n+" "+G(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:"text",raw:n+" ",text:n+" ",escaped:!0}):t+=n+" "}return t+=this.parser.parse(e.tokens,!!e.loose),`
  • ${t}
  • \n`}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    \n`}table(e){let t="",n="";for(let t=0;t${s}`),"\n\n"+t+"\n"+s+"
    \n"}tablerow({text:e}){return`\n${e}\n`}tablecell(e){const t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`\n`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${G(e,!0)}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:t,tokens:n}){const s=this.parser.parseInline(n),r=H(e);if(null===r)return s;let i='
    ",i}image({href:e,title:t,text:n}){const s=H(e);if(null===s)return G(n);let r=`${n}{const r=e[s].flat(1/0);n=n.concat(this.walkTokens(r,t))})):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach((e=>{const n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach((e=>{if(!e.name)throw new Error("extension name required");if("renderer"in e){const n=t.renderers[e.name];t.renderers[e.name]=n?function(...t){let s=e.renderer.apply(this,t);return!1===s&&(s=n.apply(this,t)),s}:e.renderer}if("tokenizer"in e){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");const n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&("block"===e.level?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:"inline"===e.level&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}"childTokens"in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)})),n.extensions=t),e.renderer){const t=this.defaults.renderer||new V(this.defaults);for(const n in e.renderer){if(!(n in t))throw new Error(`renderer '${n}' does not exist`);if(["options","parser"].includes(n))continue;const s=n,r=e.renderer[s],i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n||""}}n.renderer=t}if(e.tokenizer){const t=this.defaults.tokenizer||new J(this.defaults);for(const n in e.tokenizer){if(!(n in t))throw new Error(`tokenizer '${n}' does not exist`);if(["options","rules","lexer"].includes(n))continue;const s=n,r=e.tokenizer[s],i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){const t=this.defaults.hooks||new ee;for(const n in e.hooks){if(!(n in t))throw new Error(`hook '${n}' does not exist`);if(["options","block"].includes(n))continue;const s=n,r=e.hooks[s],i=t[s];ee.passThroughHooks.has(n)?t[s]=e=>{if(this.defaults.async)return Promise.resolve(r.call(t,e)).then((e=>i.call(t,e)));const n=r.call(t,e);return i.call(t,n)}:t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){const t=this.defaults.walkTokens,s=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(s.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}})),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return K.lex(e,t??this.defaults)}parser(e,t){return Y.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{const s={...n},r={...this.defaults,...s},i=this.onError(!!r.silent,!!r.async);if(!0===this.defaults.async&&!1===s.async)return i(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(null==t)return i(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof t)return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));r.hooks&&(r.hooks.options=r,r.hooks.block=e);const l=r.hooks?r.hooks.provideLexer():e?K.lex:K.lexInline,o=r.hooks?r.hooks.provideParser():e?Y.parse:Y.parseInline;if(r.async)return Promise.resolve(r.hooks?r.hooks.preprocess(t):t).then((e=>l(e,r))).then((e=>r.hooks?r.hooks.processAllTokens(e):e)).then((e=>r.walkTokens?Promise.all(this.walkTokens(e,r.walkTokens)).then((()=>e)):e)).then((e=>o(e,r))).then((e=>r.hooks?r.hooks.postprocess(e):e)).catch(i);try{r.hooks&&(t=r.hooks.preprocess(t));let e=l(t,r);r.hooks&&(e=r.hooks.processAllTokens(e)),r.walkTokens&&this.walkTokens(e,r.walkTokens);let n=o(e,r);return r.hooks&&(n=r.hooks.postprocess(n)),n}catch(e){return i(e)}}}onError(e,t){return n=>{if(n.message+="\nPlease report this to https://github.com/markedjs/marked.",e){const e="

    An error occurred:

    "+G(n.message+"",!0)+"
    ";return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}}const ne=new te;function se(e,t){return ne.parse(e,t)}se.options=se.setOptions=function(e){return ne.setOptions(e),se.defaults=ne.defaults,n(se.defaults),se},se.getDefaults=t,se.defaults=e.defaults,se.use=function(...e){return ne.use(...e),se.defaults=ne.defaults,n(se.defaults),se},se.walkTokens=function(e,t){return ne.walkTokens(e,t)},se.parseInline=ne.parseInline,se.Parser=Y,se.parser=Y.parse,se.Renderer=V,se.TextRenderer=W,se.Lexer=K,se.lexer=K.lex,se.Tokenizer=J,se.Hooks=ee,se.parse=se;const re=se.options,ie=se.setOptions,le=se.use,oe=se.walkTokens,ae=se.parseInline,ce=se,he=Y.parse,pe=K.lex;e.Hooks=ee,e.Lexer=K,e.Marked=te,e.Parser=Y,e.Renderer=V,e.TextRenderer=W,e.Tokenizer=J,e.getDefaults=t,e.lexer=pe,e.marked=se,e.options=re,e.parse=ce,e.parseInline=ae,e.parser=he,e.setOptions=ie,e.use=le,e.walkTokens=oe})); diff --git a/docs/libs/mermaid.min.js b/docs/libs/mermaid.min.js new file mode 100644 index 0000000..fd60dd6 --- /dev/null +++ b/docs/libs/mermaid.min.js @@ -0,0 +1,2314 @@ +"use strict";var __esbuild_esm_mermaid=(()=>{var ixe=Object.create;var Z1=Object.defineProperty;var axe=Object.getOwnPropertyDescriptor;var sxe=Object.getOwnPropertyNames;var oxe=Object.getPrototypeOf,lxe=Object.prototype.hasOwnProperty;var o=(t,e)=>Z1(t,"name",{value:e,configurable:!0});var M=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ei=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),vr=(t,e)=>{for(var r in e)Z1(t,r,{get:e[r],enumerable:!0})},$b=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of sxe(e))!lxe.call(t,i)&&i!==r&&Z1(t,i,{get:()=>e[i],enumerable:!(n=axe(e,i))||n.enumerable});return t},Sr=(t,e,r)=>($b(t,e,"default"),r&&$b(r,e,"default")),Ji=(t,e,r)=>(r=t!=null?ixe(oxe(t)):{},$b(e||!t||!t.__esModule?Z1(r,"default",{value:t,enumerable:!0}):r,t)),cxe=t=>$b(Z1({},"__esModule",{value:!0}),t);var Vb=Ei((_S,LS)=>{"use strict";(function(t,e){typeof _S=="object"&&typeof LS<"u"?LS.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(_S,function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",s="hour",l="day",u="week",h="month",f="quarter",d="year",p="date",m="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:o(function(k){var R=["th","st","nd","rd"],C=k%100;return"["+k+(R[(C-20)%10]||R[C]||R[0])+"]"},"ordinal")},x=o(function(k,R,C){var O=String(k);return!O||O.length>=R?k:""+Array(R+1-O.length).join(C)+k},"m"),b={s:x,z:o(function(k){var R=-k.utcOffset(),C=Math.abs(R),O=Math.floor(C/60),N=C%60;return(R<=0?"+":"-")+x(O,2,"0")+":"+x(N,2,"0")},"z"),m:o(function k(R,C){if(R.date()1)return k(F[0])}else{var B=R.name;_[B]=R,N=B}return!O&&N&&(w=N),N||!O&&w},"t"),S=o(function(k,R){if(E(k))return k.clone();var C=typeof R=="object"?R:{};return C.date=k,C.args=arguments,new I(C)},"O"),A=b;A.l=L,A.i=E,A.w=function(k,R){return S(k,{locale:R.$L,utc:R.$u,x:R.$x,$offset:R.$offset})};var I=function(){function k(C){this.$L=L(C.locale,null,!0),this.parse(C),this.$x=this.$x||C.x||{},this[T]=!0}o(k,"M");var R=k.prototype;return R.parse=function(C){this.$d=function(O){var N=O.date,P=O.utc;if(N===null)return new Date(NaN);if(A.u(N))return new Date;if(N instanceof Date)return new Date(N);if(typeof N=="string"&&!/Z$/i.test(N)){var F=N.match(g);if(F){var B=F[2]-1||0,G=(F[7]||"0").substring(0,3);return P?new Date(Date.UTC(F[1],B,F[3]||1,F[4]||0,F[5]||0,F[6]||0,G)):new Date(F[1],B,F[3]||1,F[4]||0,F[5]||0,F[6]||0,G)}}return new Date(N)}(C),this.init()},R.init=function(){var C=this.$d;this.$y=C.getFullYear(),this.$M=C.getMonth(),this.$D=C.getDate(),this.$W=C.getDay(),this.$H=C.getHours(),this.$m=C.getMinutes(),this.$s=C.getSeconds(),this.$ms=C.getMilliseconds()},R.$utils=function(){return A},R.isValid=function(){return this.$d.toString()!==m},R.isSame=function(C,O){var N=S(C);return this.startOf(O)<=N&&N<=this.endOf(O)},R.isAfter=function(C,O){return S(C){"use strict";IF=Ji(Vb(),1),au={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},Y={trace:o((...t)=>{},"trace"),debug:o((...t)=>{},"debug"),info:o((...t)=>{},"info"),warn:o((...t)=>{},"warn"),error:o((...t)=>{},"error"),fatal:o((...t)=>{},"fatal")},J1=o(function(t="fatal"){let e=au.fatal;typeof t=="string"?t.toLowerCase()in au&&(e=au[t]):typeof t=="number"&&(e=t),Y.trace=()=>{},Y.debug=()=>{},Y.info=()=>{},Y.warn=()=>{},Y.error=()=>{},Y.fatal=()=>{},e<=au.fatal&&(Y.fatal=console.error?console.error.bind(console,Ao("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",Ao("FATAL"))),e<=au.error&&(Y.error=console.error?console.error.bind(console,Ao("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",Ao("ERROR"))),e<=au.warn&&(Y.warn=console.warn?console.warn.bind(console,Ao("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",Ao("WARN"))),e<=au.info&&(Y.info=console.info?console.info.bind(console,Ao("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",Ao("INFO"))),e<=au.debug&&(Y.debug=console.debug?console.debug.bind(console,Ao("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Ao("DEBUG"))),e<=au.trace&&(Y.trace=console.debug?console.debug.bind(console,Ao("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Ao("TRACE")))},"setLogLevel"),Ao=o(t=>`%c${(0,IF.default)().format("ss.SSS")} : ${t} : `,"format")});var uxe,up,DS,OF,Ub=M(()=>{"use strict";uxe=Object.freeze({left:0,top:0,width:16,height:16}),up=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),DS=Object.freeze({...uxe,...up}),OF=Object.freeze({...DS,body:"",hidden:!1})});var hxe,PF,BF=M(()=>{"use strict";Ub();hxe=Object.freeze({width:null,height:null}),PF=Object.freeze({...hxe,...up})});var Hb,NS,Wb,FF=M(()=>{"use strict";Hb=/^[a-z0-9]+(-[a-z0-9]+)*$/,NS=o((t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let l=i.pop(),u=i.pop(),h={provider:i.length>0?i[0]:n,prefix:u,name:l};return e&&!Wb(h)?null:h}let a=i[0],s=a.split("-");if(s.length>1){let l={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!Wb(l)?null:l}if(r&&n===""){let l={provider:n,prefix:"",name:a};return e&&!Wb(l,r)?null:l}return null},"stringToIcon"),Wb=o((t,e)=>t?!!((t.provider===""||t.provider.match(Hb))&&(e&&t.prefix===""||t.prefix.match(Hb))&&t.name.match(Hb)):!1,"validateIconName")});function zF(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var GF=M(()=>{"use strict";o(zF,"mergeIconTransformations")});function RS(t,e){let r=zF(t,e);for(let n in OF)n in up?n in t&&!(n in r)&&(r[n]=up[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var $F=M(()=>{"use strict";Ub();GF();o(RS,"mergeIconData")});function VF(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let l=n[s]&&n[s].parent,u=l&&a(l);u&&(i[s]=[l].concat(u))}return i[s]}return o(a,"resolve"),(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var UF=M(()=>{"use strict";o(VF,"getIconsTree")});function HF(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(l){a=RS(n[l]||i[l],a)}return o(s,"parse"),s(e),r.forEach(s),RS(t,a)}function MS(t,e){if(t.icons[e])return HF(t,e,[]);let r=VF(t,[e])[e];return r?HF(t,e,r):null}var WF=M(()=>{"use strict";$F();UF();o(HF,"internalGetIconData");o(MS,"getIconData")});function IS(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(fxe);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=dxe.test(a);for(;;){if(s){let l=parseFloat(a);isNaN(l)?i.push(a):i.push(Math.ceil(l*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var fxe,dxe,YF=M(()=>{"use strict";fxe=/(-?[0-9.]*[0-9]+[0-9.]*)/g,dxe=/^-?[0-9.]*[0-9]+[0-9.]*$/g;o(IS,"calculateSize")});function pxe(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf("",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function mxe(t,e){return t?""+t+""+e:e}function qF(t,e,r){let n=pxe(t);return mxe(n.defs,e+n.content+r)}var XF=M(()=>{"use strict";o(pxe,"splitSVGDefs");o(mxe,"mergeDefsAndContent");o(qF,"wrapSVGContent")});function OS(t,e){let r={...DS,...t},n={...PF,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(y=>{let v=[],x=y.hFlip,b=y.vFlip,w=y.rotate;x?b?w+=2:(v.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),v.push("scale(-1 1)"),i.top=i.left=0):b&&(v.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),v.push("scale(1 -1)"),i.top=i.left=0);let _;switch(w<0&&(w-=Math.floor(w/4)*4),w=w%4,w){case 1:_=i.height/2+i.top,v.unshift("rotate(90 "+_.toString()+" "+_.toString()+")");break;case 2:v.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:_=i.width/2+i.left,v.unshift("rotate(-90 "+_.toString()+" "+_.toString()+")");break}w%2===1&&(i.left!==i.top&&(_=i.left,i.left=i.top,i.top=_),i.width!==i.height&&(_=i.width,i.width=i.height,i.height=_)),v.length&&(a=qF(a,'',""))});let s=n.width,l=n.height,u=i.width,h=i.height,f,d;s===null?(d=l===null?"1em":l==="auto"?h:l,f=IS(d,u/h)):(f=s==="auto"?u:s,d=l===null?IS(f,h/u):l==="auto"?h:l);let p={},m=o((y,v)=>{gxe(v)||(p[y]=v.toString())},"setAttr");m("width",f),m("height",d);let g=[i.left,i.top,u,h];return p.viewBox=g.join(" "),{attributes:p,viewBox:g,body:a}}var gxe,jF=M(()=>{"use strict";Ub();BF();YF();XF();gxe=o(t=>t==="unset"||t==="undefined"||t==="none","isUnsetKeyword");o(OS,"iconToSVG")});function PS(t,e=vxe){let r=[],n;for(;n=yxe.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(xxe++).toString(),l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var yxe,vxe,xxe,KF=M(()=>{"use strict";yxe=/\sid="(\S+)"/g,vxe="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),xxe=0;o(PS,"replaceIDs")});function BS(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"+t+""}var QF=M(()=>{"use strict";o(BS,"iconToHTML")});var JF=Ei((Pat,ZF)=>{"use strict";var hp=1e3,fp=hp*60,dp=fp*60,jf=dp*24,bxe=jf*7,wxe=jf*365.25;ZF.exports=function(t,e){e=e||{};var r=typeof t;if(r==="string"&&t.length>0)return Txe(t);if(r==="number"&&isFinite(t))return e.long?Exe(t):kxe(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function Txe(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*wxe;case"weeks":case"week":case"w":return r*bxe;case"days":case"day":case"d":return r*jf;case"hours":case"hour":case"hrs":case"hr":case"h":return r*dp;case"minutes":case"minute":case"mins":case"min":case"m":return r*fp;case"seconds":case"second":case"secs":case"sec":case"s":return r*hp;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}o(Txe,"parse");function kxe(t){var e=Math.abs(t);return e>=jf?Math.round(t/jf)+"d":e>=dp?Math.round(t/dp)+"h":e>=fp?Math.round(t/fp)+"m":e>=hp?Math.round(t/hp)+"s":t+"ms"}o(kxe,"fmtShort");function Exe(t){var e=Math.abs(t);return e>=jf?Yb(t,e,jf,"day"):e>=dp?Yb(t,e,dp,"hour"):e>=fp?Yb(t,e,fp,"minute"):e>=hp?Yb(t,e,hp,"second"):t+" ms"}o(Exe,"fmtLong");function Yb(t,e,r,n){var i=e>=r*1.5;return Math.round(t/r)+" "+n+(i?"s":"")}o(Yb,"plural")});var tz=Ei((Fat,ez)=>{"use strict";function Sxe(t){r.debug=r,r.default=r,r.coerce=u,r.disable=a,r.enable=i,r.enabled=s,r.humanize=JF(),r.destroy=h,Object.keys(t).forEach(f=>{r[f]=t[f]}),r.names=[],r.skips=[],r.formatters={};function e(f){let d=0;for(let p=0;p{if(E==="%%")return"%";_++;let S=r.formatters[L];if(typeof S=="function"){let A=v[_];E=S.call(x,A),v.splice(_,1),_--}return E}),r.formatArgs.call(x,v),(x.log||r.log).apply(x,v)}return o(y,"debug"),y.namespace=f,y.useColors=r.useColors(),y.color=r.selectColor(f),y.extend=n,y.destroy=r.destroy,Object.defineProperty(y,"enabled",{enumerable:!0,configurable:!1,get:o(()=>p!==null?p:(m!==r.namespaces&&(m=r.namespaces,g=r.enabled(f)),g),"get"),set:o(v=>{p=v},"set")}),typeof r.init=="function"&&r.init(y),y}o(r,"createDebug");function n(f,d){let p=r(this.namespace+(typeof d>"u"?":":d)+f);return p.log=this.log,p}o(n,"extend");function i(f){r.save(f),r.namespaces=f,r.names=[],r.skips=[];let d,p=(typeof f=="string"?f:"").split(/[\s,]+/),m=p.length;for(d=0;d"-"+d)].join(",");return r.enable(""),f}o(a,"disable");function s(f){if(f[f.length-1]==="*")return!0;let d,p;for(d=0,p=r.skips.length;d{"use strict";Qs.formatArgs=Axe;Qs.save=_xe;Qs.load=Lxe;Qs.useColors=Cxe;Qs.storage=Dxe();Qs.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();Qs.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Cxe(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let t;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}o(Cxe,"useColors");function Axe(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+qb.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let r=0,n=0;t[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(r++,i==="%c"&&(n=r))}),t.splice(n,0,e)}o(Axe,"formatArgs");Qs.log=console.debug||console.log||(()=>{});function _xe(t){try{t?Qs.storage.setItem("debug",t):Qs.storage.removeItem("debug")}catch{}}o(_xe,"save");function Lxe(){let t;try{t=Qs.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}o(Lxe,"load");function Dxe(){try{return localStorage}catch{}}o(Dxe,"localstorage");qb.exports=tz()(Qs);var{formatters:Nxe}=qb.exports;Nxe.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var $at,nz=M(()=>{"use strict";FF();WF();jF();KF();QF();$at=Ji(rz(),1)});var zS,FS,iz,Xb,Rxe,_o,su=M(()=>{"use strict";ut();nz();zS={body:'?',height:80,width:80},FS=new Map,iz=new Map,Xb=o(t=>{for(let e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(Y.debug("Registering icon pack:",e.name),"loader"in e)iz.set(e.name,e.loader);else if("icons"in e)FS.set(e.name,e.icons);else throw Y.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),Rxe=o(async(t,e)=>{let r=NS(t,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${t}`);let n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let i=FS.get(n);if(!i){let s=iz.get(n);if(!s)throw new Error(`Icon set not found: ${r.prefix}`);try{i={...await s(),prefix:n},FS.set(n,i)}catch(l){throw Y.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let a=MS(i,r.name);if(!a)throw new Error(`Icon not found: ${t}`);return a},"getRegisteredIconData"),_o=o(async(t,e)=>{let r;try{r=await Rxe(t,e?.fallbackPrefix)}catch(a){Y.error(a),r=zS}let n=OS(r,e);return BS(PS(n.body),n.attributes)},"getIconSVG")});function jb(t){for(var e=[],r=1;r{"use strict";o(jb,"dedent")});var Kb,Kf,az,Qb=M(()=>{"use strict";Kb=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,Kf=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,az=/\s*%%.*\n/gm});var pp,$S=M(()=>{"use strict";pp=class extends Error{static{o(this,"UnknownDiagramError")}constructor(e){super(e),this.name="UnknownDiagramError"}}});var Qf,mp,Zb,VS,sz,Zf=M(()=>{"use strict";ut();Qb();$S();Qf={},mp=o(function(t,e){t=t.replace(Kb,"").replace(Kf,"").replace(az,` +`);for(let[r,{detector:n}]of Object.entries(Qf))if(n(t,e))return r;throw new pp(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),Zb=o((...t)=>{for(let{id:e,detector:r,loader:n}of t)VS(e,r,n)},"registerLazyLoadedDiagrams"),VS=o((t,e,r)=>{Qf[t]&&Y.warn(`Detector with key ${t} already exists. Overwriting.`),Qf[t]={detector:e,loader:r},Y.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),sz=o(t=>Qf[t].loader,"getDiagramLoader")});var ey,oz,US=M(()=>{"use strict";ey=function(){var t=o(function($e,ye,X,fe){for(X=X||{},fe=$e.length;fe--;X[$e[fe]]=ye);return X},"o"),e=[1,24],r=[1,25],n=[1,26],i=[1,27],a=[1,28],s=[1,63],l=[1,64],u=[1,65],h=[1,66],f=[1,67],d=[1,68],p=[1,69],m=[1,29],g=[1,30],y=[1,31],v=[1,32],x=[1,33],b=[1,34],w=[1,35],_=[1,36],T=[1,37],E=[1,38],L=[1,39],S=[1,40],A=[1,41],I=[1,42],D=[1,43],k=[1,44],R=[1,45],C=[1,46],O=[1,47],N=[1,48],P=[1,50],F=[1,51],B=[1,52],G=[1,53],z=[1,54],W=[1,55],Z=[1,56],j=[1,57],oe=[1,58],K=[1,59],ee=[1,60],J=[14,42],H=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],q=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Q=[1,82],ae=[1,83],ue=[1,84],ce=[1,85],te=[12,14,42],Ne=[12,14,33,42],se=[12,14,33,42,76,77,79,80],ke=[12,33],Re=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Ce={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:o(function(ye,X,fe,he,ge,ne,ve){var U=ne.length-1;switch(ge){case 3:he.setDirection("TB");break;case 4:he.setDirection("BT");break;case 5:he.setDirection("RL");break;case 6:he.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:he.setC4Type(ne[U-3]);break;case 19:he.setTitle(ne[U].substring(6)),this.$=ne[U].substring(6);break;case 20:he.setAccDescription(ne[U].substring(15)),this.$=ne[U].substring(15);break;case 21:this.$=ne[U].trim(),he.setTitle(this.$);break;case 22:case 23:this.$=ne[U].trim(),he.setAccDescription(this.$);break;case 28:ne[U].splice(2,0,"ENTERPRISE"),he.addPersonOrSystemBoundary(...ne[U]),this.$=ne[U];break;case 29:ne[U].splice(2,0,"SYSTEM"),he.addPersonOrSystemBoundary(...ne[U]),this.$=ne[U];break;case 30:he.addPersonOrSystemBoundary(...ne[U]),this.$=ne[U];break;case 31:ne[U].splice(2,0,"CONTAINER"),he.addContainerBoundary(...ne[U]),this.$=ne[U];break;case 32:he.addDeploymentNode("node",...ne[U]),this.$=ne[U];break;case 33:he.addDeploymentNode("nodeL",...ne[U]),this.$=ne[U];break;case 34:he.addDeploymentNode("nodeR",...ne[U]),this.$=ne[U];break;case 35:he.popBoundaryParseStack();break;case 39:he.addPersonOrSystem("person",...ne[U]),this.$=ne[U];break;case 40:he.addPersonOrSystem("external_person",...ne[U]),this.$=ne[U];break;case 41:he.addPersonOrSystem("system",...ne[U]),this.$=ne[U];break;case 42:he.addPersonOrSystem("system_db",...ne[U]),this.$=ne[U];break;case 43:he.addPersonOrSystem("system_queue",...ne[U]),this.$=ne[U];break;case 44:he.addPersonOrSystem("external_system",...ne[U]),this.$=ne[U];break;case 45:he.addPersonOrSystem("external_system_db",...ne[U]),this.$=ne[U];break;case 46:he.addPersonOrSystem("external_system_queue",...ne[U]),this.$=ne[U];break;case 47:he.addContainer("container",...ne[U]),this.$=ne[U];break;case 48:he.addContainer("container_db",...ne[U]),this.$=ne[U];break;case 49:he.addContainer("container_queue",...ne[U]),this.$=ne[U];break;case 50:he.addContainer("external_container",...ne[U]),this.$=ne[U];break;case 51:he.addContainer("external_container_db",...ne[U]),this.$=ne[U];break;case 52:he.addContainer("external_container_queue",...ne[U]),this.$=ne[U];break;case 53:he.addComponent("component",...ne[U]),this.$=ne[U];break;case 54:he.addComponent("component_db",...ne[U]),this.$=ne[U];break;case 55:he.addComponent("component_queue",...ne[U]),this.$=ne[U];break;case 56:he.addComponent("external_component",...ne[U]),this.$=ne[U];break;case 57:he.addComponent("external_component_db",...ne[U]),this.$=ne[U];break;case 58:he.addComponent("external_component_queue",...ne[U]),this.$=ne[U];break;case 60:he.addRel("rel",...ne[U]),this.$=ne[U];break;case 61:he.addRel("birel",...ne[U]),this.$=ne[U];break;case 62:he.addRel("rel_u",...ne[U]),this.$=ne[U];break;case 63:he.addRel("rel_d",...ne[U]),this.$=ne[U];break;case 64:he.addRel("rel_l",...ne[U]),this.$=ne[U];break;case 65:he.addRel("rel_r",...ne[U]),this.$=ne[U];break;case 66:he.addRel("rel_b",...ne[U]),this.$=ne[U];break;case 67:ne[U].splice(0,1),he.addRel("rel",...ne[U]),this.$=ne[U];break;case 68:he.updateElStyle("update_el_style",...ne[U]),this.$=ne[U];break;case 69:he.updateRelStyle("update_rel_style",...ne[U]),this.$=ne[U];break;case 70:he.updateLayoutConfig("update_layout_config",...ne[U]),this.$=ne[U];break;case 71:this.$=[ne[U]];break;case 72:ne[U].unshift(ne[U-1]),this.$=ne[U];break;case 73:case 75:this.$=ne[U].trim();break;case 74:let Te={};Te[ne[U-1].trim()]=ne[U].trim(),this.$=Te;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee},{13:70,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee},{13:71,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee},{13:72,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee},{13:73,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee},{14:[1,74]},t(J,[2,13],{43:23,29:49,30:61,32:62,20:75,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee}),t(J,[2,14]),t(H,[2,16],{12:[1,76]}),t(J,[2,36],{12:[1,77]}),t(q,[2,19]),t(q,[2,20]),{25:[1,78]},{27:[1,79]},t(q,[2,23]),{35:80,75:81,76:Q,77:ae,79:ue,80:ce},{35:86,75:81,76:Q,77:ae,79:ue,80:ce},{35:87,75:81,76:Q,77:ae,79:ue,80:ce},{35:88,75:81,76:Q,77:ae,79:ue,80:ce},{35:89,75:81,76:Q,77:ae,79:ue,80:ce},{35:90,75:81,76:Q,77:ae,79:ue,80:ce},{35:91,75:81,76:Q,77:ae,79:ue,80:ce},{35:92,75:81,76:Q,77:ae,79:ue,80:ce},{35:93,75:81,76:Q,77:ae,79:ue,80:ce},{35:94,75:81,76:Q,77:ae,79:ue,80:ce},{35:95,75:81,76:Q,77:ae,79:ue,80:ce},{35:96,75:81,76:Q,77:ae,79:ue,80:ce},{35:97,75:81,76:Q,77:ae,79:ue,80:ce},{35:98,75:81,76:Q,77:ae,79:ue,80:ce},{35:99,75:81,76:Q,77:ae,79:ue,80:ce},{35:100,75:81,76:Q,77:ae,79:ue,80:ce},{35:101,75:81,76:Q,77:ae,79:ue,80:ce},{35:102,75:81,76:Q,77:ae,79:ue,80:ce},{35:103,75:81,76:Q,77:ae,79:ue,80:ce},{35:104,75:81,76:Q,77:ae,79:ue,80:ce},t(te,[2,59]),{35:105,75:81,76:Q,77:ae,79:ue,80:ce},{35:106,75:81,76:Q,77:ae,79:ue,80:ce},{35:107,75:81,76:Q,77:ae,79:ue,80:ce},{35:108,75:81,76:Q,77:ae,79:ue,80:ce},{35:109,75:81,76:Q,77:ae,79:ue,80:ce},{35:110,75:81,76:Q,77:ae,79:ue,80:ce},{35:111,75:81,76:Q,77:ae,79:ue,80:ce},{35:112,75:81,76:Q,77:ae,79:ue,80:ce},{35:113,75:81,76:Q,77:ae,79:ue,80:ce},{35:114,75:81,76:Q,77:ae,79:ue,80:ce},{35:115,75:81,76:Q,77:ae,79:ue,80:ce},{20:116,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee},{12:[1,118],33:[1,117]},{35:119,75:81,76:Q,77:ae,79:ue,80:ce},{35:120,75:81,76:Q,77:ae,79:ue,80:ce},{35:121,75:81,76:Q,77:ae,79:ue,80:ce},{35:122,75:81,76:Q,77:ae,79:ue,80:ce},{35:123,75:81,76:Q,77:ae,79:ue,80:ce},{35:124,75:81,76:Q,77:ae,79:ue,80:ce},{35:125,75:81,76:Q,77:ae,79:ue,80:ce},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(J,[2,15]),t(H,[2,17],{21:22,19:130,22:e,23:r,24:n,26:i,28:a}),t(J,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:r,24:n,26:i,28:a,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:_,52:T,53:E,54:L,55:S,56:A,57:I,58:D,59:k,60:R,61:C,62:O,63:N,64:P,65:F,66:B,67:G,68:z,69:W,70:Z,71:j,72:oe,73:K,74:ee}),t(q,[2,21]),t(q,[2,22]),t(te,[2,39]),t(Ne,[2,71],{75:81,35:132,76:Q,77:ae,79:ue,80:ce}),t(se,[2,73]),{78:[1,133]},t(se,[2,75]),t(se,[2,76]),t(te,[2,40]),t(te,[2,41]),t(te,[2,42]),t(te,[2,43]),t(te,[2,44]),t(te,[2,45]),t(te,[2,46]),t(te,[2,47]),t(te,[2,48]),t(te,[2,49]),t(te,[2,50]),t(te,[2,51]),t(te,[2,52]),t(te,[2,53]),t(te,[2,54]),t(te,[2,55]),t(te,[2,56]),t(te,[2,57]),t(te,[2,58]),t(te,[2,60]),t(te,[2,61]),t(te,[2,62]),t(te,[2,63]),t(te,[2,64]),t(te,[2,65]),t(te,[2,66]),t(te,[2,67]),t(te,[2,68]),t(te,[2,69]),t(te,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(ke,[2,28]),t(ke,[2,29]),t(ke,[2,30]),t(ke,[2,31]),t(ke,[2,32]),t(ke,[2,33]),t(ke,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t(H,[2,18]),t(J,[2,38]),t(Ne,[2,72]),t(se,[2,74]),t(te,[2,24]),t(te,[2,35]),t(Re,[2,25]),t(Re,[2,26],{12:[1,138]}),t(Re,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:o(function(ye,X){if(X.recoverable)this.trace(ye);else{var fe=new Error(ye);throw fe.hash=X,fe}},"parseError"),parse:o(function(ye){var X=this,fe=[0],he=[],ge=[null],ne=[],ve=this.table,U="",Te=0,ie=0,Ee=0,Ae=2,Ge=1,Be=ne.slice.call(arguments,1),me=Object.create(this.lexer),He={yy:{}};for(var Oe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Oe)&&(He.yy[Oe]=this.yy[Oe]);me.setInput(ye,He.yy),He.yy.lexer=me,He.yy.parser=this,typeof me.yylloc>"u"&&(me.yylloc={});var et=me.yylloc;ne.push(et);var bt=me.options&&me.options.ranges;typeof He.yy.parseError=="function"?this.parseError=He.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function kt(Bt){fe.length=fe.length-2*Bt,ge.length=ge.length-Bt,ne.length=ne.length-Bt}o(kt,"popStack");function vt(){var Bt;return Bt=he.pop()||me.lex()||Ge,typeof Bt!="number"&&(Bt instanceof Array&&(he=Bt,Bt=he.pop()),Bt=X.symbols_[Bt]||Bt),Bt}o(vt,"lex");for(var rt,yt,Ue,tt,ht,Et,er={},dt,Je,ct,Ct;;){if(Ue=fe[fe.length-1],this.defaultActions[Ue]?tt=this.defaultActions[Ue]:((rt===null||typeof rt>"u")&&(rt=vt()),tt=ve[Ue]&&ve[Ue][rt]),typeof tt>"u"||!tt.length||!tt[0]){var pt="";Ct=[];for(dt in ve[Ue])this.terminals_[dt]&&dt>Ae&&Ct.push("'"+this.terminals_[dt]+"'");me.showPosition?pt="Parse error on line "+(Te+1)+`: +`+me.showPosition()+` +Expecting `+Ct.join(", ")+", got '"+(this.terminals_[rt]||rt)+"'":pt="Parse error on line "+(Te+1)+": Unexpected "+(rt==Ge?"end of input":"'"+(this.terminals_[rt]||rt)+"'"),this.parseError(pt,{text:me.match,token:this.terminals_[rt]||rt,line:me.yylineno,loc:et,expected:Ct})}if(tt[0]instanceof Array&&tt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ue+", token: "+rt);switch(tt[0]){case 1:fe.push(rt),ge.push(me.yytext),ne.push(me.yylloc),fe.push(tt[1]),rt=null,yt?(rt=yt,yt=null):(ie=me.yyleng,U=me.yytext,Te=me.yylineno,et=me.yylloc,Ee>0&&Ee--);break;case 2:if(Je=this.productions_[tt[1]][1],er.$=ge[ge.length-Je],er._$={first_line:ne[ne.length-(Je||1)].first_line,last_line:ne[ne.length-1].last_line,first_column:ne[ne.length-(Je||1)].first_column,last_column:ne[ne.length-1].last_column},bt&&(er._$.range=[ne[ne.length-(Je||1)].range[0],ne[ne.length-1].range[1]]),Et=this.performAction.apply(er,[U,ie,Te,He.yy,tt[1],ge,ne].concat(Be)),typeof Et<"u")return Et;Je&&(fe=fe.slice(0,-1*Je*2),ge=ge.slice(0,-1*Je),ne=ne.slice(0,-1*Je)),fe.push(this.productions_[tt[1]][0]),ge.push(er.$),ne.push(er._$),ct=ve[fe[fe.length-2]][fe[fe.length-1]],fe.push(ct);break;case 3:return!0}}return!0},"parse")},Pe=function(){var $e={EOF:1,parseError:o(function(X,fe){if(this.yy.parser)this.yy.parser.parseError(X,fe);else throw new Error(X)},"parseError"),setInput:o(function(ye,X){return this.yy=X||this.yy||{},this._input=ye,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var ye=this._input[0];this.yytext+=ye,this.yyleng++,this.offset++,this.match+=ye,this.matched+=ye;var X=ye.match(/(?:\r\n?|\n).*/g);return X?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ye},"input"),unput:o(function(ye){var X=ye.length,fe=ye.split(/(?:\r\n?|\n)/g);this._input=ye+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-X),this.offset-=X;var he=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),fe.length-1&&(this.yylineno-=fe.length-1);var ge=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:fe?(fe.length===he.length?this.yylloc.first_column:0)+he[he.length-fe.length].length-fe[0].length:this.yylloc.first_column-X},this.options.ranges&&(this.yylloc.range=[ge[0],ge[0]+this.yyleng-X]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(ye){this.unput(this.match.slice(ye))},"less"),pastInput:o(function(){var ye=this.matched.substr(0,this.matched.length-this.match.length);return(ye.length>20?"...":"")+ye.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var ye=this.match;return ye.length<20&&(ye+=this._input.substr(0,20-ye.length)),(ye.substr(0,20)+(ye.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var ye=this.pastInput(),X=new Array(ye.length+1).join("-");return ye+this.upcomingInput()+` +`+X+"^"},"showPosition"),test_match:o(function(ye,X){var fe,he,ge;if(this.options.backtrack_lexer&&(ge={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ge.yylloc.range=this.yylloc.range.slice(0))),he=ye[0].match(/(?:\r\n?|\n).*/g),he&&(this.yylineno+=he.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:he?he[he.length-1].length-he[he.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ye[0].length},this.yytext+=ye[0],this.match+=ye[0],this.matches=ye,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ye[0].length),this.matched+=ye[0],fe=this.performAction.call(this,this.yy,this,X,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),fe)return fe;if(this._backtrack){for(var ne in ge)this[ne]=ge[ne];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ye,X,fe,he;this._more||(this.yytext="",this.match="");for(var ge=this._currentRules(),ne=0;neX[0].length)){if(X=fe,he=ne,this.options.backtrack_lexer){if(ye=this.test_match(fe,ge[ne]),ye!==!1)return ye;if(this._backtrack){X=!1;continue}else return!1}else if(!this.options.flex)break}return X?(ye=this.test_match(X,ge[he]),ye!==!1?ye:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var X=this.next();return X||this.lex()},"lex"),begin:o(function(X){this.conditionStack.push(X)},"begin"),popState:o(function(){var X=this.conditionStack.length-1;return X>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(X){return X=this.conditionStack.length-1-Math.abs(X||0),X>=0?this.conditionStack[X]:"INITIAL"},"topState"),pushState:o(function(X){this.begin(X)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(X,fe,he,ge){var ne=ge;switch(he){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return $e}();Ce.lexer=Pe;function Ie(){this.yy={}}return o(Ie,"Parser"),Ie.prototype=Ce,Ce.Parser=Ie,new Ie}();ey.parser=ey;oz=ey});var HS,Vn,gp=M(()=>{"use strict";HS=o((t,e,{depth:r=2,clobber:n=!1}={})=>{let i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(a=>HS(t,a,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(a=>{t.includes(a)||t.push(a)}),t):t===void 0||r<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(a=>{typeof e[a]=="object"&&(t[a]===void 0||typeof t[a]=="object")?(t[a]===void 0&&(t[a]=Array.isArray(e[a])?[]:{}),t[a]=HS(t[a],e[a],{depth:r-1,clobber:n})):(n||typeof t[a]!="object"&&typeof e[a]!="object")&&(t[a]=e[a])}),t)},"assignWithDepth"),Vn=HS});var Jb,lz,cz=M(()=>{"use strict";Jb={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:o(t=>t>=255?255:t<0?0:t,"r"),g:o(t=>t>=255?255:t<0?0:t,"g"),b:o(t=>t>=255?255:t<0?0:t,"b"),h:o(t=>t%360,"h"),s:o(t=>t>=100?100:t<0?0:t,"s"),l:o(t=>t>=100?100:t<0?0:t,"l"),a:o(t=>t>=1?1:t<0?0:t,"a")},toLinear:o(t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},"toLinear"),hue2rgb:o((t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<.16666666666666666?t+(e-t)*6*r:r<.5?e:r<.6666666666666666?t+(e-t)*(.6666666666666666-r)*6:t),"hue2rgb"),hsl2rgb:o(({h:t,s:e,l:r},n)=>{if(!e)return r*2.55;t/=360,e/=100,r/=100;let i=r<.5?r*(1+e):r+e-r*e,a=2*r-i;switch(n){case"r":return Jb.hue2rgb(a,i,t+.3333333333333333)*255;case"g":return Jb.hue2rgb(a,i,t)*255;case"b":return Jb.hue2rgb(a,i,t-.3333333333333333)*255}},"hsl2rgb"),rgb2hsl:o(({r:t,g:e,b:r},n)=>{t/=255,e/=255,r/=255;let i=Math.max(t,e,r),a=Math.min(t,e,r),s=(i+a)/2;if(n==="l")return s*100;if(i===a)return 0;let l=i-a,u=s>.5?l/(2-i-a):l/(i+a);if(n==="s")return u*100;switch(i){case t:return((e-r)/l+(e{"use strict";Mxe={clamp:o((t,e,r)=>e>r?Math.min(e,Math.max(r,t)):Math.min(r,Math.max(e,t)),"clamp"),round:o(t=>Math.round(t*1e10)/1e10,"round")},uz=Mxe});var Ixe,fz,dz=M(()=>{"use strict";Ixe={dec2hex:o(t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`},"dec2hex")},fz=Ixe});var Oxe,Yt,ac=M(()=>{"use strict";cz();hz();dz();Oxe={channel:lz,lang:uz,unit:fz},Yt=Oxe});var ou,Pi,ty=M(()=>{"use strict";ac();ou={};for(let t=0;t<=255;t++)ou[t]=Yt.unit.dec2hex(t);Pi={ALL:0,RGB:1,HSL:2}});var WS,pz,mz=M(()=>{"use strict";ty();WS=class{static{o(this,"Type")}constructor(){this.type=Pi.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=Pi.ALL}is(e){return this.type===e}},pz=WS});var YS,gz,yz=M(()=>{"use strict";ac();mz();ty();YS=class{static{o(this,"Channels")}constructor(e,r){this.color=r,this.changed=!1,this.data=e,this.type=new pz}set(e,r){return this.color=r,this.changed=!1,this.data=e,this.type.type=Pi.ALL,this}_ensureHSL(){let e=this.data,{h:r,s:n,l:i}=e;r===void 0&&(e.h=Yt.channel.rgb2hsl(e,"h")),n===void 0&&(e.s=Yt.channel.rgb2hsl(e,"s")),i===void 0&&(e.l=Yt.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r,g:n,b:i}=e;r===void 0&&(e.r=Yt.channel.hsl2rgb(e,"r")),n===void 0&&(e.g=Yt.channel.hsl2rgb(e,"g")),i===void 0&&(e.b=Yt.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,r=e.r;return!this.type.is(Pi.HSL)&&r!==void 0?r:(this._ensureHSL(),Yt.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,r=e.g;return!this.type.is(Pi.HSL)&&r!==void 0?r:(this._ensureHSL(),Yt.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,r=e.b;return!this.type.is(Pi.HSL)&&r!==void 0?r:(this._ensureHSL(),Yt.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,r=e.h;return!this.type.is(Pi.RGB)&&r!==void 0?r:(this._ensureRGB(),Yt.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,r=e.s;return!this.type.is(Pi.RGB)&&r!==void 0?r:(this._ensureRGB(),Yt.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,r=e.l;return!this.type.is(Pi.RGB)&&r!==void 0?r:(this._ensureRGB(),Yt.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(Pi.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(Pi.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(Pi.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(Pi.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(Pi.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(Pi.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},gz=YS});var Pxe,hh,ry=M(()=>{"use strict";yz();Pxe=new gz({r:0,g:0,b:0,a:0},"transparent"),hh=Pxe});var vz,Jf,qS=M(()=>{"use strict";ry();ty();vz={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:o(t=>{if(t.charCodeAt(0)!==35)return;let e=t.match(vz.re);if(!e)return;let r=e[1],n=parseInt(r,16),i=r.length,a=i%4===0,s=i>4,l=s?1:17,u=s?8:4,h=a?0:-1,f=s?255:15;return hh.set({r:(n>>u*(h+3)&f)*l,g:(n>>u*(h+2)&f)*l,b:(n>>u*(h+1)&f)*l,a:a?(n&f)*l/255:1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`#${ou[Math.round(e)]}${ou[Math.round(r)]}${ou[Math.round(n)]}${ou[Math.round(i*255)]}`:`#${ou[Math.round(e)]}${ou[Math.round(r)]}${ou[Math.round(n)]}`},"stringify")},Jf=vz});var e4,ny,xz=M(()=>{"use strict";ac();ry();e4={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:o(t=>{let e=t.match(e4.hueRe);if(e){let[,r,n]=e;switch(n){case"grad":return Yt.channel.clamp.h(parseFloat(r)*.9);case"rad":return Yt.channel.clamp.h(parseFloat(r)*180/Math.PI);case"turn":return Yt.channel.clamp.h(parseFloat(r)*360)}}return Yt.channel.clamp.h(parseFloat(t))},"_hue2deg"),parse:o(t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let r=t.match(e4.re);if(!r)return;let[,n,i,a,s,l]=r;return hh.set({h:e4._hue2deg(n),s:Yt.channel.clamp.s(parseFloat(i)),l:Yt.channel.clamp.l(parseFloat(a)),a:s?Yt.channel.clamp.a(l?parseFloat(s)/100:parseFloat(s)):1},t)},"parse"),stringify:o(t=>{let{h:e,s:r,l:n,a:i}=t;return i<1?`hsla(${Yt.lang.round(e)}, ${Yt.lang.round(r)}%, ${Yt.lang.round(n)}%, ${i})`:`hsl(${Yt.lang.round(e)}, ${Yt.lang.round(r)}%, ${Yt.lang.round(n)}%)`},"stringify")},ny=e4});var t4,XS,bz=M(()=>{"use strict";qS();t4={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:o(t=>{t=t.toLowerCase();let e=t4.colors[t];if(e)return Jf.parse(e)},"parse"),stringify:o(t=>{let e=Jf.stringify(t);for(let r in t4.colors)if(t4.colors[r]===e)return r},"stringify")},XS=t4});var wz,iy,Tz=M(()=>{"use strict";ac();ry();wz={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:o(t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let r=t.match(wz.re);if(!r)return;let[,n,i,a,s,l,u,h,f]=r;return hh.set({r:Yt.channel.clamp.r(i?parseFloat(n)*2.55:parseFloat(n)),g:Yt.channel.clamp.g(s?parseFloat(a)*2.55:parseFloat(a)),b:Yt.channel.clamp.b(u?parseFloat(l)*2.55:parseFloat(l)),a:h?Yt.channel.clamp.a(f?parseFloat(h)/100:parseFloat(h)):1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`rgba(${Yt.lang.round(e)}, ${Yt.lang.round(r)}, ${Yt.lang.round(n)}, ${Yt.lang.round(i)})`:`rgb(${Yt.lang.round(e)}, ${Yt.lang.round(r)}, ${Yt.lang.round(n)})`},"stringify")},iy=wz});var Bxe,Bi,lu=M(()=>{"use strict";qS();xz();bz();Tz();ty();Bxe={format:{keyword:XS,hex:Jf,rgb:iy,rgba:iy,hsl:ny,hsla:ny},parse:o(t=>{if(typeof t!="string")return t;let e=Jf.parse(t)||iy.parse(t)||ny.parse(t)||XS.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},"parse"),stringify:o(t=>!t.changed&&t.color?t.color:t.type.is(Pi.HSL)||t.data.r===void 0?ny.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?iy.stringify(t):Jf.stringify(t),"stringify")},Bi=Bxe});var Fxe,r4,jS=M(()=>{"use strict";ac();lu();Fxe=o((t,e)=>{let r=Bi.parse(t);for(let n in e)r[n]=Yt.channel.clamp[n](e[n]);return Bi.stringify(r)},"change"),r4=Fxe});var zxe,Zs,KS=M(()=>{"use strict";ac();ry();lu();jS();zxe=o((t,e,r=0,n=1)=>{if(typeof t!="number")return r4(t,{a:e});let i=hh.set({r:Yt.channel.clamp.r(t),g:Yt.channel.clamp.g(e),b:Yt.channel.clamp.b(r),a:Yt.channel.clamp.a(n)});return Bi.stringify(i)},"rgba"),Zs=zxe});var Gxe,ay,kz=M(()=>{"use strict";ac();lu();Gxe=o((t,e)=>Yt.lang.round(Bi.parse(t)[e]),"channel"),ay=Gxe});var $xe,Ez,Sz=M(()=>{"use strict";ac();lu();$xe=o(t=>{let{r:e,g:r,b:n}=Bi.parse(t),i=.2126*Yt.channel.toLinear(e)+.7152*Yt.channel.toLinear(r)+.0722*Yt.channel.toLinear(n);return Yt.lang.round(i)},"luminance"),Ez=$xe});var Vxe,Cz,Az=M(()=>{"use strict";Sz();Vxe=o(t=>Ez(t)>=.5,"isLight"),Cz=Vxe});var Uxe,fa,_z=M(()=>{"use strict";Az();Uxe=o(t=>!Cz(t),"isDark"),fa=Uxe});var Hxe,n4,QS=M(()=>{"use strict";ac();lu();Hxe=o((t,e,r)=>{let n=Bi.parse(t),i=n[e],a=Yt.channel.clamp[e](i+r);return i!==a&&(n[e]=a),Bi.stringify(n)},"adjustChannel"),n4=Hxe});var Wxe,_t,Lz=M(()=>{"use strict";QS();Wxe=o((t,e)=>n4(t,"l",e),"lighten"),_t=Wxe});var Yxe,It,Dz=M(()=>{"use strict";QS();Yxe=o((t,e)=>n4(t,"l",-e),"darken"),It=Yxe});var qxe,Me,Nz=M(()=>{"use strict";lu();jS();qxe=o((t,e)=>{let r=Bi.parse(t),n={};for(let i in e)e[i]&&(n[i]=r[i]+e[i]);return r4(t,n)},"adjust"),Me=qxe});var Xxe,Rz,Mz=M(()=>{"use strict";lu();KS();Xxe=o((t,e,r=50)=>{let{r:n,g:i,b:a,a:s}=Bi.parse(t),{r:l,g:u,b:h,a:f}=Bi.parse(e),d=r/100,p=d*2-1,m=s-f,y=((p*m===-1?p:(p+m)/(1+p*m))+1)/2,v=1-y,x=n*y+l*v,b=i*y+u*v,w=a*y+h*v,_=s*d+f*(1-d);return Zs(x,b,w,_)},"mix"),Rz=Xxe});var jxe,mt,Iz=M(()=>{"use strict";lu();Mz();jxe=o((t,e=100)=>{let r=Bi.parse(t);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,Rz(r,t,e)},"invert"),mt=jxe});var Oz=M(()=>{"use strict";KS();kz();_z();Lz();Dz();Nz();Iz()});var Lo=M(()=>{"use strict";Oz()});var fh,dh,sy=M(()=>{"use strict";fh="#ffffff",dh="#f2f2f2"});var Si,yp=M(()=>{"use strict";Lo();Si=o((t,e)=>e?Me(t,{s:-40,l:10}):Me(t,{s:-40,l:-10}),"mkBorder")});var ZS,Bz,Fz=M(()=>{"use strict";Lo();sy();yp();ZS=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||Me(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||Me(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Si(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Si(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||mt(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||mt(this.tertiaryColor),this.lineColor=this.lineColor||mt(this.background),this.arrowheadColor=this.arrowheadColor||mt(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?It(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||It(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||mt(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||_t(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.darkMode)for(let r=0;r{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},Bz=o(t=>{let e=new ZS;return e.calculate(t),e},"getThemeVariables")});var JS,zz,Gz=M(()=>{"use strict";Lo();yp();JS=class{static{o(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=_t(this.primaryColor,16),this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=mt(this.background),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=mt(this.primaryColor),this.secondaryTextColor=mt(this.secondaryColor),this.tertiaryTextColor=mt(this.tertiaryColor),this.lineColor=mt(this.background),this.textColor=mt(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=_t(mt("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=Zs(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=It("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=It(this.sectionBkgColor,10),this.taskBorderColor=Zs(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=Zs(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=_t(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=_t(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=_t(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=Me(this.primaryColor,{h:64}),this.fillType3=Me(this.secondaryColor,{h:64}),this.fillType4=Me(this.primaryColor,{h:-64}),this.fillType5=Me(this.secondaryColor,{h:-64}),this.fillType6=Me(this.primaryColor,{h:128}),this.fillType7=Me(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330});for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},zz=o(t=>{let e=new JS;return e.calculate(t),e},"getThemeVariables")});var eC,vp,i4=M(()=>{"use strict";Lo();yp();sy();eC=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=Me(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=mt(this.primaryColor),this.secondaryTextColor=mt(this.secondaryColor),this.tertiaryTextColor=mt(this.tertiaryColor),this.lineColor=mt(this.background),this.textColor=mt(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=Zs(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||It(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||It(this.tertiaryColor,40);for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},vp=o(t=>{let e=new eC;return e.calculate(t),e},"getThemeVariables")});var tC,$z,Vz=M(()=>{"use strict";Lo();sy();yp();tC=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=_t("#cde498",10),this.primaryBorderColor=Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=mt(this.primaryColor),this.secondaryTextColor=mt(this.secondaryColor),this.tertiaryTextColor=mt(this.primaryColor),this.lineColor=mt(this.background),this.textColor=mt(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=It(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||It(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||It(this.tertiaryColor,40);for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},$z=o(t=>{let e=new tC;return e.calculate(t),e},"getThemeVariables")});var rC,Uz,Hz=M(()=>{"use strict";Lo();yp();sy();rC=class{static{o(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=_t(this.contrast,55),this.background="#ffffff",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=mt(this.primaryColor),this.secondaryTextColor=mt(this.secondaryColor),this.tertiaryTextColor=mt(this.tertiaryColor),this.lineColor=mt(this.background),this.textColor=mt(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=_t(this.contrast,55),this.border2=this.contrast,this.actorBorder=_t(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},Uz=o(t=>{let e=new rC;return e.calculate(t),e},"getThemeVariables")});var Do,a4=M(()=>{"use strict";Fz();Gz();i4();Vz();Hz();Do={base:{getThemeVariables:Bz},dark:{getThemeVariables:zz},default:{getThemeVariables:vp},forest:{getThemeVariables:$z},neutral:{getThemeVariables:Uz}}});var cu,Wz=M(()=>{"use strict";cu={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1}});var Yz,qz,Xz,ur,bs=M(()=>{"use strict";a4();Wz();Yz={...cu,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF"},themeCSS:void 0,themeVariables:Do.default.getThemeVariables(),sequence:{...cu.sequence,messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:o(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:o(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...cu.gantt,tickInterval:void 0,useWidth:void 0},c4:{...cu.c4,useWidth:void 0,personFont:o(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),external_personFont:o(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:o(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:o(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:o(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:o(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:o(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:o(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:o(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:o(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:o(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:o(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:o(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:o(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:o(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:o(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:o(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:o(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:o(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:o(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:o(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...cu.pie,useWidth:984},xyChart:{...cu.xyChart,useWidth:void 0},requirement:{...cu.requirement,useWidth:void 0},packet:{...cu.packet}},qz=o((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:typeof t[n]=="object"&&t[n]!==null?[...r,e+n,...qz(t[n],"")]:[...r,e+n],[]),"keyify"),Xz=new Set(qz(Yz,"")),ur=Yz});var xp,Kxe,nC=M(()=>{"use strict";bs();ut();xp=o(t=>{if(Y.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>xp(e));return}for(let e of Object.keys(t)){if(Y.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!Xz.has(e)||t[e]==null){Y.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){Y.debug("sanitizing object",e),xp(t[e]);continue}let r=["themeCSS","fontFamily","altFontFamily"];for(let n of r)e.includes(n)&&(Y.debug("sanitizing css option",e),t[e]=Kxe(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}Y.debug("After sanitization",t)}},"sanitizeDirective"),Kxe=o(t=>{let e=0,r=0;for(let n of t){if(e{"use strict";gp();ut();a4();bs();nC();ph=Object.freeze(ur),ws=Vn({},ph),bp=[],oy=Vn({},ph),s4=o((t,e)=>{let r=Vn({},t),n={};for(let i of e)Jz(i),n=Vn(n,i);if(r=Vn(r,n),n.theme&&n.theme in Do){let i=Vn({},Kz),a=Vn(i.themeVariables||{},n.themeVariables);r.theme&&r.theme in Do&&(r.themeVariables=Do[r.theme].getThemeVariables(a))}return oy=r,tG(oy),oy},"updateCurrentConfig"),iC=o(t=>(ws=Vn({},ph),ws=Vn(ws,t),t.theme&&Do[t.theme]&&(ws.themeVariables=Do[t.theme].getThemeVariables(t.themeVariables)),s4(ws,bp),ws),"setSiteConfig"),Qz=o(t=>{Kz=Vn({},t)},"saveConfigFromInitialize"),Zz=o(t=>(ws=Vn(ws,t),s4(ws,bp),ws),"updateSiteConfig"),aC=o(()=>Vn({},ws),"getSiteConfig"),o4=o(t=>(tG(t),Vn(oy,t),Cr()),"setConfig"),Cr=o(()=>Vn({},oy),"getConfig"),Jz=o(t=>{t&&(["secure",...ws.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(Y.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&Jz(t[e])}))},"sanitize"),eG=o(t=>{xp(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),bp.push(t),s4(ws,bp)},"addDirective"),ly=o((t=ws)=>{bp=[],s4(t,bp)},"reset"),Qxe={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},jz={},Zxe=o(t=>{jz[t]||(Y.warn(Qxe[t]),jz[t]=!0)},"issueWarning"),tG=o(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&Zxe("LAZY_LOAD_DEPRECATED")},"checkConfig")});var lC=Ei((sC,oC)=>{"use strict";(function(t,e){typeof sC=="object"&&typeof oC<"u"?oC.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self,t.DOMPurify=e())})(sC,function(){"use strict";let{entries:t,setPrototypeOf:e,isFrozen:r,getPrototypeOf:n,getOwnPropertyDescriptor:i}=Object,{freeze:a,seal:s,create:l}=Object,{apply:u,construct:h}=typeof Reflect<"u"&&Reflect;a||(a=o(function(Ce){return Ce},"freeze")),s||(s=o(function(Ce){return Ce},"seal")),u||(u=o(function(Ce,Pe,Ie){return Ce.apply(Pe,Ie)},"apply")),h||(h=o(function(Ce,Pe){return new Ce(...Pe)},"construct"));let f=E(Array.prototype.forEach),d=E(Array.prototype.pop),p=E(Array.prototype.push),m=E(String.prototype.toLowerCase),g=E(String.prototype.toString),y=E(String.prototype.match),v=E(String.prototype.replace),x=E(String.prototype.indexOf),b=E(String.prototype.trim),w=E(Object.prototype.hasOwnProperty),_=E(RegExp.prototype.test),T=L(TypeError);function E(Re){return function(Ce){for(var Pe=arguments.length,Ie=new Array(Pe>1?Pe-1:0),$e=1;$e2&&arguments[2]!==void 0?arguments[2]:m;e&&e(Re,null);let Ie=Ce.length;for(;Ie--;){let $e=Ce[Ie];if(typeof $e=="string"){let ye=Pe($e);ye!==$e&&(r(Ce)||(Ce[Ie]=ye),$e=ye)}Re[$e]=!0}return Re}o(S,"addToSet");function A(Re){for(let Ce=0;Ce/gm),oe=s(/\${[\w\W]*}/gm),K=s(/^data-[\-\w.\u00B7-\uFFFF]/),ee=s(/^aria-[\-\w]+$/),J=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),H=s(/^(?:\w+script|data):/i),q=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Q=s(/^html$/i),ae=s(/^[a-z][.\w]*(-[.\w]+)+$/i);var ue=Object.freeze({__proto__:null,MUSTACHE_EXPR:Z,ERB_EXPR:j,TMPLIT_EXPR:oe,DATA_ATTR:K,ARIA_ATTR:ee,IS_ALLOWED_URI:J,IS_SCRIPT_OR_DATA:H,ATTR_WHITESPACE:q,DOCTYPE_NAME:Q,CUSTOM_ELEMENT:ae});let ce={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},te=o(function(){return typeof window>"u"?null:window},"getGlobal"),Ne=o(function(Ce,Pe){if(typeof Ce!="object"||typeof Ce.createPolicy!="function")return null;let Ie=null,$e="data-tt-policy-suffix";Pe&&Pe.hasAttribute($e)&&(Ie=Pe.getAttribute($e));let ye="dompurify"+(Ie?"#"+Ie:"");try{return Ce.createPolicy(ye,{createHTML(X){return X},createScriptURL(X){return X}})}catch{return console.warn("TrustedTypes policy "+ye+" could not be created."),null}},"_createTrustedTypesPolicy");function se(){let Re=arguments.length>0&&arguments[0]!==void 0?arguments[0]:te(),Ce=o(Kt=>se(Kt),"DOMPurify");if(Ce.version="3.1.6",Ce.removed=[],!Re||!Re.document||Re.document.nodeType!==ce.document)return Ce.isSupported=!1,Ce;let{document:Pe}=Re,Ie=Pe,$e=Ie.currentScript,{DocumentFragment:ye,HTMLTemplateElement:X,Node:fe,Element:he,NodeFilter:ge,NamedNodeMap:ne=Re.NamedNodeMap||Re.MozNamedAttrMap,HTMLFormElement:ve,DOMParser:U,trustedTypes:Te}=Re,ie=he.prototype,Ee=D(ie,"cloneNode"),Ae=D(ie,"remove"),Ge=D(ie,"nextSibling"),Be=D(ie,"childNodes"),me=D(ie,"parentNode");if(typeof X=="function"){let Kt=Pe.createElement("template");Kt.content&&Kt.content.ownerDocument&&(Pe=Kt.content.ownerDocument)}let He,Oe="",{implementation:et,createNodeIterator:bt,createDocumentFragment:kt,getElementsByTagName:vt}=Pe,{importNode:rt}=Ie,yt={};Ce.isSupported=typeof t=="function"&&typeof me=="function"&&et&&et.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:Ue,ERB_EXPR:tt,TMPLIT_EXPR:ht,DATA_ATTR:Et,ARIA_ATTR:er,IS_SCRIPT_OR_DATA:dt,ATTR_WHITESPACE:Je,CUSTOM_ELEMENT:ct}=ue,{IS_ALLOWED_URI:Ct}=ue,pt=null,Bt=S({},[...k,...R,...C,...N,...F]),Tr=null,yr=S({},[...B,...G,...z,...W]),or=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ln=null,Or=null,ii=!0,mn=!0,On=!1,_r=!0,mi=!1,vs=!0,Pn=!1,So=!1,gl=!1,Bn=!1,ki=!1,At=!1,Pt=!0,wt=!1,We="user-content-",Ft=!0,de=!1,gn={},xe=null,ja=S({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),W1=null,Y1=S({},["audio","video","img","source","image","track"]),q1=null,X1=S({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),op="http://www.w3.org/1998/Math/MathML",Kn="http://www.w3.org/2000/svg",ca="http://www.w3.org/1999/xhtml",tc=ca,Wf=!1,j1=null,TF=S({},[op,Kn,ca],g),Yf=null,ua=["application/xhtml+xml","text/html"],K1="text/html",En=null,Oi=null,kF=Pe.createElement("form"),lp=o(function(Le){return Le instanceof RegExp||Le instanceof Function},"isRegexOrFunction"),rc=o(function(){let Le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(Oi&&Oi===Le)){if((!Le||typeof Le!="object")&&(Le={}),Le=I(Le),Yf=ua.indexOf(Le.PARSER_MEDIA_TYPE)===-1?K1:Le.PARSER_MEDIA_TYPE,En=Yf==="application/xhtml+xml"?g:m,pt=w(Le,"ALLOWED_TAGS")?S({},Le.ALLOWED_TAGS,En):Bt,Tr=w(Le,"ALLOWED_ATTR")?S({},Le.ALLOWED_ATTR,En):yr,j1=w(Le,"ALLOWED_NAMESPACES")?S({},Le.ALLOWED_NAMESPACES,g):TF,q1=w(Le,"ADD_URI_SAFE_ATTR")?S(I(X1),Le.ADD_URI_SAFE_ATTR,En):X1,W1=w(Le,"ADD_DATA_URI_TAGS")?S(I(Y1),Le.ADD_DATA_URI_TAGS,En):Y1,xe=w(Le,"FORBID_CONTENTS")?S({},Le.FORBID_CONTENTS,En):ja,ln=w(Le,"FORBID_TAGS")?S({},Le.FORBID_TAGS,En):{},Or=w(Le,"FORBID_ATTR")?S({},Le.FORBID_ATTR,En):{},gn=w(Le,"USE_PROFILES")?Le.USE_PROFILES:!1,ii=Le.ALLOW_ARIA_ATTR!==!1,mn=Le.ALLOW_DATA_ATTR!==!1,On=Le.ALLOW_UNKNOWN_PROTOCOLS||!1,_r=Le.ALLOW_SELF_CLOSE_IN_ATTR!==!1,mi=Le.SAFE_FOR_TEMPLATES||!1,vs=Le.SAFE_FOR_XML!==!1,Pn=Le.WHOLE_DOCUMENT||!1,Bn=Le.RETURN_DOM||!1,ki=Le.RETURN_DOM_FRAGMENT||!1,At=Le.RETURN_TRUSTED_TYPE||!1,gl=Le.FORCE_BODY||!1,Pt=Le.SANITIZE_DOM!==!1,wt=Le.SANITIZE_NAMED_PROPS||!1,Ft=Le.KEEP_CONTENT!==!1,de=Le.IN_PLACE||!1,Ct=Le.ALLOWED_URI_REGEXP||J,tc=Le.NAMESPACE||ca,or=Le.CUSTOM_ELEMENT_HANDLING||{},Le.CUSTOM_ELEMENT_HANDLING&&lp(Le.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(or.tagNameCheck=Le.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Le.CUSTOM_ELEMENT_HANDLING&&lp(Le.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(or.attributeNameCheck=Le.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Le.CUSTOM_ELEMENT_HANDLING&&typeof Le.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(or.allowCustomizedBuiltInElements=Le.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),mi&&(mn=!1),ki&&(Bn=!0),gn&&(pt=S({},F),Tr=[],gn.html===!0&&(S(pt,k),S(Tr,B)),gn.svg===!0&&(S(pt,R),S(Tr,G),S(Tr,W)),gn.svgFilters===!0&&(S(pt,C),S(Tr,G),S(Tr,W)),gn.mathMl===!0&&(S(pt,N),S(Tr,z),S(Tr,W))),Le.ADD_TAGS&&(pt===Bt&&(pt=I(pt)),S(pt,Le.ADD_TAGS,En)),Le.ADD_ATTR&&(Tr===yr&&(Tr=I(Tr)),S(Tr,Le.ADD_ATTR,En)),Le.ADD_URI_SAFE_ATTR&&S(q1,Le.ADD_URI_SAFE_ATTR,En),Le.FORBID_CONTENTS&&(xe===ja&&(xe=I(xe)),S(xe,Le.FORBID_CONTENTS,En)),Ft&&(pt["#text"]=!0),Pn&&S(pt,["html","head","body"]),pt.table&&(S(pt,["tbody"]),delete ln.tbody),Le.TRUSTED_TYPES_POLICY){if(typeof Le.TRUSTED_TYPES_POLICY.createHTML!="function")throw T('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Le.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw T('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');He=Le.TRUSTED_TYPES_POLICY,Oe=He.createHTML("")}else He===void 0&&(He=Ne(Te,$e)),He!==null&&typeof Oe=="string"&&(Oe=He.createHTML(""));a&&a(Le),Oi=Le}},"_parseConfig"),qf=S({},["mi","mo","mn","ms","mtext"]),Co=S({},["foreignobject","annotation-xml"]),zb=S({},["title","style","font","a","script"]),Xf=S({},[...R,...C,...O]),cp=S({},[...N,...P]),Ka=o(function(Le){let ft=me(Le);(!ft||!ft.tagName)&&(ft={namespaceURI:tc,tagName:"template"});let zt=m(Le.tagName),Sn=m(ft.tagName);return j1[Le.namespaceURI]?Le.namespaceURI===Kn?ft.namespaceURI===ca?zt==="svg":ft.namespaceURI===op?zt==="svg"&&(Sn==="annotation-xml"||qf[Sn]):!!Xf[zt]:Le.namespaceURI===op?ft.namespaceURI===ca?zt==="math":ft.namespaceURI===Kn?zt==="math"&&Co[Sn]:!!cp[zt]:Le.namespaceURI===ca?ft.namespaceURI===Kn&&!Co[Sn]||ft.namespaceURI===op&&!qf[Sn]?!1:!cp[zt]&&(zb[zt]||!Xf[zt]):!!(Yf==="application/xhtml+xml"&&j1[Le.namespaceURI]):!1},"_checkValidNamespace"),nc=o(function(Le){p(Ce.removed,{element:Le});try{me(Le).removeChild(Le)}catch{Ae(Le)}},"_forceRemove"),Gb=o(function(Le,ft){try{p(Ce.removed,{attribute:ft.getAttributeNode(Le),from:ft})}catch{p(Ce.removed,{attribute:null,from:ft})}if(ft.removeAttribute(Le),Le==="is"&&!Tr[Le])if(Bn||ki)try{nc(ft)}catch{}else try{ft.setAttribute(Le,"")}catch{}},"_removeAttribute"),EF=o(function(Le){let ft=null,zt=null;if(gl)Le=""+Le;else{let ha=y(Le,/^[\r\n\t ]+/);zt=ha&&ha[0]}Yf==="application/xhtml+xml"&&tc===ca&&(Le=''+Le+"");let Sn=He?He.createHTML(Le):Le;if(tc===ca)try{ft=new U().parseFromString(Sn,Yf)}catch{}if(!ft||!ft.documentElement){ft=et.createDocument(tc,"template",null);try{ft.documentElement.innerHTML=Wf?Oe:Sn}catch{}}let Da=ft.body||ft.documentElement;return Le&&zt&&Da.insertBefore(Pe.createTextNode(zt),Da.childNodes[0]||null),tc===ca?vt.call(ft,Pn?"html":"body")[0]:Pn?ft.documentElement:Da},"_initDocument"),SF=o(function(Le){return bt.call(Le.ownerDocument||Le,Le,ge.SHOW_ELEMENT|ge.SHOW_COMMENT|ge.SHOW_TEXT|ge.SHOW_PROCESSING_INSTRUCTION|ge.SHOW_CDATA_SECTION,null)},"_createNodeIterator"),CF=o(function(Le){return Le instanceof ve&&(typeof Le.nodeName!="string"||typeof Le.textContent!="string"||typeof Le.removeChild!="function"||!(Le.attributes instanceof ne)||typeof Le.removeAttribute!="function"||typeof Le.setAttribute!="function"||typeof Le.namespaceURI!="string"||typeof Le.insertBefore!="function"||typeof Le.hasChildNodes!="function")},"_isClobbered"),AF=o(function(Le){return typeof fe=="function"&&Le instanceof fe},"_isNode"),iu=o(function(Le,ft,zt){yt[Le]&&f(yt[Le],Sn=>{Sn.call(Ce,ft,zt,Oi)})},"_executeHook"),_F=o(function(Le){let ft=null;if(iu("beforeSanitizeElements",Le,null),CF(Le))return nc(Le),!0;let zt=En(Le.nodeName);if(iu("uponSanitizeElement",Le,{tagName:zt,allowedTags:pt}),Le.hasChildNodes()&&!AF(Le.firstElementChild)&&_(/<[/\w]/g,Le.innerHTML)&&_(/<[/\w]/g,Le.textContent)||Le.nodeType===ce.progressingInstruction||vs&&Le.nodeType===ce.comment&&_(/<[/\w]/g,Le.data))return nc(Le),!0;if(!pt[zt]||ln[zt]){if(!ln[zt]&&DF(zt)&&(or.tagNameCheck instanceof RegExp&&_(or.tagNameCheck,zt)||or.tagNameCheck instanceof Function&&or.tagNameCheck(zt)))return!1;if(Ft&&!xe[zt]){let Sn=me(Le)||Le.parentNode,Da=Be(Le)||Le.childNodes;if(Da&&Sn){let ha=Da.length;for(let xs=ha-1;xs>=0;--xs){let ic=Ee(Da[xs],!0);ic.__removalCount=(Le.__removalCount||0)+1,Sn.insertBefore(ic,Ge(Le))}}}return nc(Le),!0}return Le instanceof he&&!Ka(Le)||(zt==="noscript"||zt==="noembed"||zt==="noframes")&&_(/<\/no(script|embed|frames)/i,Le.innerHTML)?(nc(Le),!0):(mi&&Le.nodeType===ce.text&&(ft=Le.textContent,f([Ue,tt,ht],Sn=>{ft=v(ft,Sn," ")}),Le.textContent!==ft&&(p(Ce.removed,{element:Le.cloneNode()}),Le.textContent=ft)),iu("afterSanitizeElements",Le,null),!1)},"_sanitizeElements"),LF=o(function(Le,ft,zt){if(Pt&&(ft==="id"||ft==="name")&&(zt in Pe||zt in kF))return!1;if(!(mn&&!Or[ft]&&_(Et,ft))){if(!(ii&&_(er,ft))){if(!Tr[ft]||Or[ft]){if(!(DF(Le)&&(or.tagNameCheck instanceof RegExp&&_(or.tagNameCheck,Le)||or.tagNameCheck instanceof Function&&or.tagNameCheck(Le))&&(or.attributeNameCheck instanceof RegExp&&_(or.attributeNameCheck,ft)||or.attributeNameCheck instanceof Function&&or.attributeNameCheck(ft))||ft==="is"&&or.allowCustomizedBuiltInElements&&(or.tagNameCheck instanceof RegExp&&_(or.tagNameCheck,zt)||or.tagNameCheck instanceof Function&&or.tagNameCheck(zt))))return!1}else if(!q1[ft]){if(!_(Ct,v(zt,Je,""))){if(!((ft==="src"||ft==="xlink:href"||ft==="href")&&Le!=="script"&&x(zt,"data:")===0&&W1[Le])){if(!(On&&!_(dt,v(zt,Je,"")))){if(zt)return!1}}}}}}return!0},"_isValidAttribute"),DF=o(function(Le){return Le!=="annotation-xml"&&y(Le,ct)},"_isBasicCustomElement"),NF=o(function(Le){iu("beforeSanitizeAttributes",Le,null);let{attributes:ft}=Le;if(!ft)return;let zt={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Tr},Sn=ft.length;for(;Sn--;){let Da=ft[Sn],{name:ha,namespaceURI:xs,value:ic}=Da,Q1=En(ha),Qa=ha==="value"?ic:b(ic);if(zt.attrName=Q1,zt.attrValue=Qa,zt.keepAttr=!0,zt.forceKeepAttr=void 0,iu("uponSanitizeAttribute",Le,zt),Qa=zt.attrValue,vs&&_(/((--!?|])>)|<\/(style|title)/i,Qa)){Gb(ha,Le);continue}if(zt.forceKeepAttr||(Gb(ha,Le),!zt.keepAttr))continue;if(!_r&&_(/\/>/i,Qa)){Gb(ha,Le);continue}mi&&f([Ue,tt,ht],MF=>{Qa=v(Qa,MF," ")});let RF=En(Le.nodeName);if(LF(RF,Q1,Qa)){if(wt&&(Q1==="id"||Q1==="name")&&(Gb(ha,Le),Qa=We+Qa),He&&typeof Te=="object"&&typeof Te.getAttributeType=="function"&&!xs)switch(Te.getAttributeType(RF,Q1)){case"TrustedHTML":{Qa=He.createHTML(Qa);break}case"TrustedScriptURL":{Qa=He.createScriptURL(Qa);break}}try{xs?Le.setAttributeNS(xs,ha,Qa):Le.setAttribute(ha,Qa),CF(Le)?nc(Le):d(Ce.removed)}catch{}}}iu("afterSanitizeAttributes",Le,null)},"_sanitizeAttributes"),nxe=o(function Kt(Le){let ft=null,zt=SF(Le);for(iu("beforeSanitizeShadowDOM",Le,null);ft=zt.nextNode();)iu("uponSanitizeShadowNode",ft,null),!_F(ft)&&(ft.content instanceof ye&&Kt(ft.content),NF(ft));iu("afterSanitizeShadowDOM",Le,null)},"_sanitizeShadowDOM");return Ce.sanitize=function(Kt){let Le=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},ft=null,zt=null,Sn=null,Da=null;if(Wf=!Kt,Wf&&(Kt=""),typeof Kt!="string"&&!AF(Kt))if(typeof Kt.toString=="function"){if(Kt=Kt.toString(),typeof Kt!="string")throw T("dirty is not a string, aborting")}else throw T("toString is not a function");if(!Ce.isSupported)return Kt;if(So||rc(Le),Ce.removed=[],typeof Kt=="string"&&(de=!1),de){if(Kt.nodeName){let ic=En(Kt.nodeName);if(!pt[ic]||ln[ic])throw T("root node is forbidden and cannot be sanitized in-place")}}else if(Kt instanceof fe)ft=EF(""),zt=ft.ownerDocument.importNode(Kt,!0),zt.nodeType===ce.element&&zt.nodeName==="BODY"||zt.nodeName==="HTML"?ft=zt:ft.appendChild(zt);else{if(!Bn&&!mi&&!Pn&&Kt.indexOf("<")===-1)return He&&At?He.createHTML(Kt):Kt;if(ft=EF(Kt),!ft)return Bn?null:At?Oe:""}ft&&gl&&nc(ft.firstChild);let ha=SF(de?Kt:ft);for(;Sn=ha.nextNode();)_F(Sn)||(Sn.content instanceof ye&&nxe(Sn.content),NF(Sn));if(de)return Kt;if(Bn){if(ki)for(Da=kt.call(ft.ownerDocument);ft.firstChild;)Da.appendChild(ft.firstChild);else Da=ft;return(Tr.shadowroot||Tr.shadowrootmode)&&(Da=rt.call(Ie,Da,!0)),Da}let xs=Pn?ft.outerHTML:ft.innerHTML;return Pn&&pt["!doctype"]&&ft.ownerDocument&&ft.ownerDocument.doctype&&ft.ownerDocument.doctype.name&&_(Q,ft.ownerDocument.doctype.name)&&(xs=" +`+xs),mi&&f([Ue,tt,ht],ic=>{xs=v(xs,ic," ")}),He&&At?He.createHTML(xs):xs},Ce.setConfig=function(){let Kt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};rc(Kt),So=!0},Ce.clearConfig=function(){Oi=null,So=!1},Ce.isValidAttribute=function(Kt,Le,ft){Oi||rc({});let zt=En(Kt),Sn=En(Le);return LF(zt,Sn,ft)},Ce.addHook=function(Kt,Le){typeof Le=="function"&&(yt[Kt]=yt[Kt]||[],p(yt[Kt],Le))},Ce.removeHook=function(Kt){if(yt[Kt])return d(yt[Kt])},Ce.removeHooks=function(Kt){yt[Kt]&&(yt[Kt]=[])},Ce.removeAllHooks=function(){yt={}},Ce}o(se,"createDOMPurify");var ke=se();return ke})});var _$={};vr(_$,{default:()=>Y4e});function abe(t){return String(t).replace(ibe,e=>nbe[e])}function cbe(t){if(t.default)return t.default;var e=t.type,r=Array.isArray(e)?e[0]:e;if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function gbe(t){for(var e=0;e=i[0]&&t<=i[1])return r.name}return null}function IG(t){for(var e=0;e=b4[e]&&t<=b4[e+1])return!0;return!1}function Abe(t,e){lc[t]=e}function IC(t,e,r){if(!lc[e])throw new Error("Font metrics not found for font: "+e+".");var n=t.charCodeAt(0),i=lc[e][n];if(!i&&t[0]in nG&&(n=nG[t[0]].charCodeAt(0),i=lc[e][n]),!i&&r==="text"&&IG(n)&&(i=lc[e][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}function _be(t){var e;if(t>=5?e=0:t>=3?e=1:e=2,!cC[e]){var r=cC[e]={cssEmPerMu:l4.quad[e]/18};for(var n in l4)l4.hasOwnProperty(n)&&(r[n]=l4[n][e])}return cC[e]}function sG(t){if(t instanceof Es)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}function Rbe(t){if(t instanceof nd)return t;throw new Error("Expected span but got "+String(t)+".")}function $(t,e,r,n,i,a){Cn[t][i]={font:e,group:r,replace:n},a&&n&&(Cn[t][n]=Cn[t][i])}function St(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},u=0;u0&&(a.push(m4(s,e)),s=[]),a.push(n[l]));s.length>0&&a.push(m4(s,e));var h;r?(h=m4(Fi(r,e,!0)),h.classes=["tag"],a.push(h)):i&&a.push(i);var f=pu(["katex-html"],a);if(f.setAttribute("aria-hidden","true"),h){var d=h.children[0];d.style.height=gt(f.height+f.depth),f.depth&&(d.style.verticalAlign=gt(-f.depth))}return f}function YG(t){return new rd(t)}function hG(t,e,r,n,i){var a=Ss(t,r),s;a.length===1&&a[0]instanceof ks&&Jt.contains(["mrow","mtable"],a[0].type)?s=a[0]:s=new at.MathNode("mrow",a);var l=new at.MathNode("annotation",[new at.TextNode(e)]);l.setAttribute("encoding","application/x-tex");var u=new at.MathNode("semantics",[s,l]),h=new at.MathNode("math",[u]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&h.setAttribute("display","block");var f=i?"katex":"katex-mathml";return Fe.makeSpan([f],[h])}function gr(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function FC(t){var e=N4(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function N4(t){return t&&(t.type==="atom"||Ibe.hasOwnProperty(t.type))?t:null}function KG(t,e){var r=Fi(t.body,e,!0);return u4e([t.mclass],r,e)}function QG(t,e){var r,n=Ss(t.body,e);return t.mclass==="minner"?r=new at.MathNode("mpadded",n):t.mclass==="mord"?t.isCharacterBox?(r=n[0],r.type="mi"):r=new at.MathNode("mi",n):(t.isCharacterBox?(r=n[0],r.type="mo"):r=new at.MathNode("mo",n),t.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):t.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):t.mclass==="mopen"||t.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):t.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}function d4e(t,e,r){var n=h4e[t];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[e[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},s=r.callFunction("\\Big",[a],[]),l=r.callFunction("\\\\cdright",[e[1]],[]),u={type:"ordgroup",mode:"math",body:[i,s,l]};return r.callFunction("\\\\cdparent",[u],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var h={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[h],[])}default:return{type:"textord",text:" ",mode:"math"}}}function p4e(t){var e=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){e.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();var r=t.fetch().text;if(r==="&"||r==="\\\\")t.consume();else if(r==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new lt("Expected \\\\ or \\cr or \\end",t.nextToken)}for(var n=[],i=[n],a=0;a-1))if("<>AV".indexOf(h)>-1)for(var d=0;d<2;d++){for(var p=!0,m=u+1;mAV=|." after @',s[u]);var g=d4e(h,f,t),y={type:"styling",body:[g],mode:"math",style:"display"};n.push(y),l=fG()}a%2===0?n.push(l):n.shift(),n=[],i.push(n)}t.gullet.endGroup(),t.gullet.endGroup();var v=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:v,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}function M4(t,e){var r=N4(t);if(r&&Jt.contains(A4e,r.text))return r;throw r?new lt("Invalid delimiter '"+r.text+"' after '"+e.funcName+"'",t):new lt("Invalid delimiter type '"+t.type+"'",t)}function mG(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}function uc(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},u=0;u1||!f)&&y.pop(),x.length{"use strict";Js=class t{static{o(this,"SourceLocation")}constructor(e,r,n){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=r,this.end=n}static range(e,r){return r?!e||!e.loc||!r.loc||e.loc.lexer!==r.loc.lexer?null:new t(e.loc.lexer,e.loc.start,r.loc.end):e&&e.loc}},Ro=class t{static{o(this,"Token")}constructor(e,r){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=r}range(e,r){return new t(r,Js.range(this,e))}},lt=class t{static{o(this,"ParseError")}constructor(e,r){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var n="KaTeX parse error: "+e,i,a,s=r&&r.loc;if(s&&s.start<=s.end){var l=s.lexer.input;i=s.start,a=s.end,i===l.length?n+=" at end of input: ":n+=" at position "+(i+1)+": ";var u=l.slice(i,a).replace(/[^]/g,"$&\u0332"),h;i>15?h="\u2026"+l.slice(i-15,i):h=l.slice(0,i);var f;a+15":">","<":"<",'"':""","'":"'"},ibe=/[&><"']/g;o(abe,"escape");MG=o(function t(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?t(e.body[0]):e:e.type==="font"?t(e.body):e},"getBaseElem"),sbe=o(function(e){var r=MG(e);return r.type==="mathord"||r.type==="textord"||r.type==="atom"},"isCharacterBox"),obe=o(function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},"assert"),lbe=o(function(e){var r=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return r?r[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(r[1])?null:r[1].toLowerCase():"_relative"},"protocolFromUrl"),Jt={contains:Jxe,deflt:ebe,escape:abe,hyphenate:rbe,getBaseElem:MG,isCharacterBox:sbe,protocolFromUrl:lbe},x4={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:o(t=>"#"+t,"cliProcessor")},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:o((t,e)=>(e.push(t),e),"cliProcessor")},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:o(t=>Math.max(0,t),"processor"),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:o(t=>Math.max(0,t),"processor"),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:o(t=>Math.max(0,t),"processor"),cli:"-e, --max-expand ",cliProcessor:o(t=>t==="Infinity"?1/0:parseInt(t),"cliProcessor")},globalGroup:{type:"boolean",cli:!1}};o(cbe,"getDefaultValue");dy=class{static{o(this,"Settings")}constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var r in x4)if(x4.hasOwnProperty(r)){var n=x4[r];this[r]=e[r]!==void 0?n.processor?n.processor(e[r]):e[r]:cbe(n)}}reportNonstrict(e,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(e,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new lt("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+e+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]"))}}useStrictBehavior(e,r,n){var i=this.strict;if(typeof i=="function")try{i=i(e,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var r=Jt.protocolFromUrl(e.url);if(r==null)return!1;e.protocol=r}var n=typeof this.trust=="function"?this.trust(e):this.trust;return!!n}},sc=class{static{o(this,"Style")}constructor(e,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=r,this.cramped=n}sup(){return oc[ube[this.id]]}sub(){return oc[hbe[this.id]]}fracNum(){return oc[fbe[this.id]]}fracDen(){return oc[dbe[this.id]]}cramp(){return oc[pbe[this.id]]}text(){return oc[mbe[this.id]]}isTight(){return this.size>=2}},MC=0,w4=1,kp=2,fu=3,py=4,No=5,Ep=6,Ja=7,oc=[new sc(MC,0,!1),new sc(w4,0,!0),new sc(kp,1,!1),new sc(fu,1,!0),new sc(py,2,!1),new sc(No,2,!0),new sc(Ep,3,!1),new sc(Ja,3,!0)],ube=[py,No,py,No,Ep,Ja,Ep,Ja],hbe=[No,No,No,No,Ja,Ja,Ja,Ja],fbe=[kp,fu,py,No,Ep,Ja,Ep,Ja],dbe=[fu,fu,No,No,Ja,Ja,Ja,Ja],pbe=[w4,w4,fu,fu,No,No,Ja,Ja],mbe=[MC,w4,kp,fu,kp,fu,kp,fu],rr={DISPLAY:oc[MC],TEXT:oc[kp],SCRIPT:oc[py],SCRIPTSCRIPT:oc[Ep]},wC=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];o(gbe,"scriptFromCodepoint");b4=[];wC.forEach(t=>t.blocks.forEach(e=>b4.push(...e)));o(IG,"supportedCodepoint");Tp=80,ybe=o(function(e,r){return"M95,"+(622+e+r)+` +c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 +c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 +c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 +s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 +c69,-144,104.5,-217.7,106.5,-221 +l`+e/2.075+" -"+e+` +c5.3,-9.3,12,-14,20,-14 +H400000v`+(40+e)+`H845.2724 +s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 +c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z +M`+(834+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtMain"),vbe=o(function(e,r){return"M263,"+(601+e+r)+`c0.7,0,18,39.7,52,119 +c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 +c340,-704.7,510.7,-1060.3,512,-1067 +l`+e/2.084+" -"+e+` +c4.7,-7.3,11,-11,19,-11 +H40000v`+(40+e)+`H1012.3 +s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 +c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 +s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 +c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize1"),xbe=o(function(e,r){return"M983 "+(10+e+r)+` +l`+e/3.13+" -"+e+` +c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` +H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 +s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 +c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 +c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 +c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 +c53.7,-170.3,84.5,-266.8,92.5,-289.5z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize2"),bbe=o(function(e,r){return"M424,"+(2398+e+r)+` +c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 +c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 +s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 +s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 +l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 +v`+(40+e)+`H1014.6 +s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 +c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+r+` +h400000v`+(40+e)+"h-400000z"},"sqrtSize3"),wbe=o(function(e,r){return"M473,"+(2713+e+r)+` +c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` +c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 +s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 +c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 +s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, +606zM`+(1001+e)+" "+r+"h400000v"+(40+e)+"H1017.7z"},"sqrtSize4"),Tbe=o(function(e){var r=e/2;return"M400000 "+e+" H0 L"+r+" 0 l65 45 L145 "+(e-80)+" H400000z"},"phasePath"),kbe=o(function(e,r,n){var i=n-54-r-e;return"M702 "+(e+r)+"H400000"+(40+e)+` +H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 +h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 +c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 +219 661 l218 661zM702 `+r+"H400000v"+(40+e)+"H742z"},"sqrtTall"),Ebe=o(function(e,r,n){r=1e3*r;var i="";switch(e){case"sqrtMain":i=ybe(r,Tp);break;case"sqrtSize1":i=vbe(r,Tp);break;case"sqrtSize2":i=xbe(r,Tp);break;case"sqrtSize3":i=bbe(r,Tp);break;case"sqrtSize4":i=wbe(r,Tp);break;case"sqrtTall":i=kbe(r,Tp,n)}return i},"sqrtPath"),Sbe=o(function(e,r){switch(e){case"\u239C":return"M291 0 H417 V"+r+" H291z M291 0 H417 V"+r+" H291z";case"\u2223":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z";case"\u2225":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z"+("M367 0 H410 V"+r+" H367z M367 0 H410 V"+r+" H367z");case"\u239F":return"M457 0 H583 V"+r+" H457z M457 0 H583 V"+r+" H457z";case"\u23A2":return"M319 0 H403 V"+r+" H319z M319 0 H403 V"+r+" H319z";case"\u23A5":return"M263 0 H347 V"+r+" H263z M263 0 H347 V"+r+" H263z";case"\u23AA":return"M384 0 H504 V"+r+" H384z M384 0 H504 V"+r+" H384z";case"\u23D0":return"M312 0 H355 V"+r+" H312z M312 0 H355 V"+r+" H312z";case"\u2016":return"M257 0 H300 V"+r+" H257z M257 0 H300 V"+r+" H257z"+("M478 0 H521 V"+r+" H478z M478 0 H521 V"+r+" H478z");default:return""}},"innerPath"),rG={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z +M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z +M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z +M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z +M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},Cbe=o(function(e,r){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 h347 v-84 +H403z M403 1759 V0 H319 V1759 v`+r+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z +M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z +M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z +M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z +M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 +c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, +-36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, +949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 +c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, +-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 +l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, +-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, +63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 +c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` +c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 +c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 +c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 +c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 +l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, +-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},"tallDelim"),rd=class{static{o(this,"DocumentFragment")}constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return Jt.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),r=0;rr.toText(),"toText");return this.children.map(e).join("")}},lc={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},l4={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},nG={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};o(Abe,"setFontMetrics");o(IC,"getCharacterMetrics");cC={};o(_be,"getGlobalMetrics");Lbe=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],iG=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],aG=o(function(e,r){return r.size<2?e:Lbe[e-1][r.size-1]},"sizeAtStyle"),T4=class t{static{o(this,"Options")}constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=iG[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return new t(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:aG(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:iG[e-1]})}havingBaseStyle(e){e=e||this.style.text();var r=aG(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=_be(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};T4.BASESIZE=6;TC={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},Dbe={ex:!0,em:!0,mu:!0},OG=o(function(e){return typeof e!="string"&&(e=e.unit),e in TC||e in Dbe||e==="ex"},"validUnit"),Jn=o(function(e,r){var n;if(e.unit in TC)n=TC[e.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(e.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,e.unit==="ex")n=i.fontMetrics().xHeight;else if(e.unit==="em")n=i.fontMetrics().quad;else throw new lt("Invalid unit: '"+e.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(e.number*n,r.maxSize)},"calculateSize"),gt=o(function(e){return+e.toFixed(4)+"em"},"makeEm"),yh=o(function(e){return e.filter(r=>r).join(" ")},"createClass"),PG=o(function(e,r,n){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},"initNode"),BG=o(function(e){var r=document.createElement(e);r.className=yh(this.classes);for(var n in this.style)this.style.hasOwnProperty(n)&&(r.style[n]=this.style[n]);for(var i in this.attributes)this.attributes.hasOwnProperty(i)&&r.setAttribute(i,this.attributes[i]);for(var a=0;a",r},"toMarkup"),nd=class{static{o(this,"Span")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,PG.call(this,e,n,i),this.children=r||[]}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return Jt.contains(this.classes,e)}toNode(){return BG.call(this,"span")}toMarkup(){return FG.call(this,"span")}},my=class{static{o(this,"Anchor")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,PG.call(this,r,i),this.children=n||[],this.setAttribute("href",e)}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return Jt.contains(this.classes,e)}toNode(){return BG.call(this,"a")}toMarkup(){return FG.call(this,"a")}},kC=class{static{o(this,"Img")}constructor(e,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=e,this.classes=["mord"],this.style=n}hasClass(e){return Jt.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var r in this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);return e}toMarkup(){var e=''+Jt.escape(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=gt(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=yh(this.classes));for(var n in this.style)this.style.hasOwnProperty(n)&&(r=r||document.createElement("span"),r.style[n]=this.style[n]);return r?(r.appendChild(e),r):e}toMarkup(){var e=!1,r="0&&(n+="margin-right:"+this.italic+"em;");for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=Jt.hyphenate(i)+":"+this.style[i]+";");n&&(e=!0,r+=' style="'+Jt.escape(n)+'"');var a=Jt.escape(this.text);return e?(r+=">",r+=a,r+="
    ",r):a}},vl=class{static{o(this,"SvgNode")}constructor(e,r){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=r||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}},gy=class{static{o(this,"LineNode")}constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"line");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var e="","\\gt",!0);$(V,re,we,"\u2208","\\in",!0);$(V,re,we,"\uE020","\\@not");$(V,re,we,"\u2282","\\subset",!0);$(V,re,we,"\u2283","\\supset",!0);$(V,re,we,"\u2286","\\subseteq",!0);$(V,re,we,"\u2287","\\supseteq",!0);$(V,be,we,"\u2288","\\nsubseteq",!0);$(V,be,we,"\u2289","\\nsupseteq",!0);$(V,re,we,"\u22A8","\\models");$(V,re,we,"\u2190","\\leftarrow",!0);$(V,re,we,"\u2264","\\le");$(V,re,we,"\u2264","\\leq",!0);$(V,re,we,"<","\\lt",!0);$(V,re,we,"\u2192","\\rightarrow",!0);$(V,re,we,"\u2192","\\to");$(V,be,we,"\u2271","\\ngeq",!0);$(V,be,we,"\u2270","\\nleq",!0);$(V,re,gu,"\xA0","\\ ");$(V,re,gu,"\xA0","\\space");$(V,re,gu,"\xA0","\\nobreakspace");$(it,re,gu,"\xA0","\\ ");$(it,re,gu,"\xA0"," ");$(it,re,gu,"\xA0","\\space");$(it,re,gu,"\xA0","\\nobreakspace");$(V,re,gu,null,"\\nobreak");$(V,re,gu,null,"\\allowbreak");$(V,re,L4,",",",");$(V,re,L4,";",";");$(V,be,Lt,"\u22BC","\\barwedge",!0);$(V,be,Lt,"\u22BB","\\veebar",!0);$(V,re,Lt,"\u2299","\\odot",!0);$(V,re,Lt,"\u2295","\\oplus",!0);$(V,re,Lt,"\u2297","\\otimes",!0);$(V,re,_e,"\u2202","\\partial",!0);$(V,re,Lt,"\u2298","\\oslash",!0);$(V,be,Lt,"\u229A","\\circledcirc",!0);$(V,be,Lt,"\u22A1","\\boxdot",!0);$(V,re,Lt,"\u25B3","\\bigtriangleup");$(V,re,Lt,"\u25BD","\\bigtriangledown");$(V,re,Lt,"\u2020","\\dagger");$(V,re,Lt,"\u22C4","\\diamond");$(V,re,Lt,"\u22C6","\\star");$(V,re,Lt,"\u25C3","\\triangleleft");$(V,re,Lt,"\u25B9","\\triangleright");$(V,re,eo,"{","\\{");$(it,re,_e,"{","\\{");$(it,re,_e,"{","\\textbraceleft");$(V,re,es,"}","\\}");$(it,re,_e,"}","\\}");$(it,re,_e,"}","\\textbraceright");$(V,re,eo,"{","\\lbrace");$(V,re,es,"}","\\rbrace");$(V,re,eo,"[","\\lbrack",!0);$(it,re,_e,"[","\\lbrack",!0);$(V,re,es,"]","\\rbrack",!0);$(it,re,_e,"]","\\rbrack",!0);$(V,re,eo,"(","\\lparen",!0);$(V,re,es,")","\\rparen",!0);$(it,re,_e,"<","\\textless",!0);$(it,re,_e,">","\\textgreater",!0);$(V,re,eo,"\u230A","\\lfloor",!0);$(V,re,es,"\u230B","\\rfloor",!0);$(V,re,eo,"\u2308","\\lceil",!0);$(V,re,es,"\u2309","\\rceil",!0);$(V,re,_e,"\\","\\backslash");$(V,re,_e,"\u2223","|");$(V,re,_e,"\u2223","\\vert");$(it,re,_e,"|","\\textbar",!0);$(V,re,_e,"\u2225","\\|");$(V,re,_e,"\u2225","\\Vert");$(it,re,_e,"\u2225","\\textbardbl");$(it,re,_e,"~","\\textasciitilde");$(it,re,_e,"\\","\\textbackslash");$(it,re,_e,"^","\\textasciicircum");$(V,re,we,"\u2191","\\uparrow",!0);$(V,re,we,"\u21D1","\\Uparrow",!0);$(V,re,we,"\u2193","\\downarrow",!0);$(V,re,we,"\u21D3","\\Downarrow",!0);$(V,re,we,"\u2195","\\updownarrow",!0);$(V,re,we,"\u21D5","\\Updownarrow",!0);$(V,re,Ci,"\u2210","\\coprod");$(V,re,Ci,"\u22C1","\\bigvee");$(V,re,Ci,"\u22C0","\\bigwedge");$(V,re,Ci,"\u2A04","\\biguplus");$(V,re,Ci,"\u22C2","\\bigcap");$(V,re,Ci,"\u22C3","\\bigcup");$(V,re,Ci,"\u222B","\\int");$(V,re,Ci,"\u222B","\\intop");$(V,re,Ci,"\u222C","\\iint");$(V,re,Ci,"\u222D","\\iiint");$(V,re,Ci,"\u220F","\\prod");$(V,re,Ci,"\u2211","\\sum");$(V,re,Ci,"\u2A02","\\bigotimes");$(V,re,Ci,"\u2A01","\\bigoplus");$(V,re,Ci,"\u2A00","\\bigodot");$(V,re,Ci,"\u222E","\\oint");$(V,re,Ci,"\u222F","\\oiint");$(V,re,Ci,"\u2230","\\oiiint");$(V,re,Ci,"\u2A06","\\bigsqcup");$(V,re,Ci,"\u222B","\\smallint");$(it,re,Sp,"\u2026","\\textellipsis");$(V,re,Sp,"\u2026","\\mathellipsis");$(it,re,Sp,"\u2026","\\ldots",!0);$(V,re,Sp,"\u2026","\\ldots",!0);$(V,re,Sp,"\u22EF","\\@cdots",!0);$(V,re,Sp,"\u22F1","\\ddots",!0);$(V,re,_e,"\u22EE","\\varvdots");$(V,re,Un,"\u02CA","\\acute");$(V,re,Un,"\u02CB","\\grave");$(V,re,Un,"\xA8","\\ddot");$(V,re,Un,"~","\\tilde");$(V,re,Un,"\u02C9","\\bar");$(V,re,Un,"\u02D8","\\breve");$(V,re,Un,"\u02C7","\\check");$(V,re,Un,"^","\\hat");$(V,re,Un,"\u20D7","\\vec");$(V,re,Un,"\u02D9","\\dot");$(V,re,Un,"\u02DA","\\mathring");$(V,re,tr,"\uE131","\\@imath");$(V,re,tr,"\uE237","\\@jmath");$(V,re,_e,"\u0131","\u0131");$(V,re,_e,"\u0237","\u0237");$(it,re,_e,"\u0131","\\i",!0);$(it,re,_e,"\u0237","\\j",!0);$(it,re,_e,"\xDF","\\ss",!0);$(it,re,_e,"\xE6","\\ae",!0);$(it,re,_e,"\u0153","\\oe",!0);$(it,re,_e,"\xF8","\\o",!0);$(it,re,_e,"\xC6","\\AE",!0);$(it,re,_e,"\u0152","\\OE",!0);$(it,re,_e,"\xD8","\\O",!0);$(it,re,Un,"\u02CA","\\'");$(it,re,Un,"\u02CB","\\`");$(it,re,Un,"\u02C6","\\^");$(it,re,Un,"\u02DC","\\~");$(it,re,Un,"\u02C9","\\=");$(it,re,Un,"\u02D8","\\u");$(it,re,Un,"\u02D9","\\.");$(it,re,Un,"\xB8","\\c");$(it,re,Un,"\u02DA","\\r");$(it,re,Un,"\u02C7","\\v");$(it,re,Un,"\xA8",'\\"');$(it,re,Un,"\u02DD","\\H");$(it,re,Un,"\u25EF","\\textcircled");zG={"--":!0,"---":!0,"``":!0,"''":!0};$(it,re,_e,"\u2013","--",!0);$(it,re,_e,"\u2013","\\textendash");$(it,re,_e,"\u2014","---",!0);$(it,re,_e,"\u2014","\\textemdash");$(it,re,_e,"\u2018","`",!0);$(it,re,_e,"\u2018","\\textquoteleft");$(it,re,_e,"\u2019","'",!0);$(it,re,_e,"\u2019","\\textquoteright");$(it,re,_e,"\u201C","``",!0);$(it,re,_e,"\u201C","\\textquotedblleft");$(it,re,_e,"\u201D","''",!0);$(it,re,_e,"\u201D","\\textquotedblright");$(V,re,_e,"\xB0","\\degree",!0);$(it,re,_e,"\xB0","\\degree");$(it,re,_e,"\xB0","\\textdegree",!0);$(V,re,_e,"\xA3","\\pounds");$(V,re,_e,"\xA3","\\mathsterling",!0);$(it,re,_e,"\xA3","\\pounds");$(it,re,_e,"\xA3","\\textsterling",!0);$(V,be,_e,"\u2720","\\maltese");$(it,be,_e,"\u2720","\\maltese");oG='0123456789/@."';for(c4=0;c40)return yl(a,h,i,r,s.concat(f));if(u){var d,p;if(u==="boldsymbol"){var m=Bbe(a,i,r,s,n);d=m.fontName,p=[m.fontClass]}else l?(d=VG[u].fontName,p=[u]):(d=p4(u,r.fontWeight,r.fontShape),p=[u,r.fontWeight,r.fontShape]);if(D4(a,d,i).metrics)return yl(a,d,i,r,s.concat(p));if(zG.hasOwnProperty(a)&&d.slice(0,10)==="Typewriter"){for(var g=[],y=0;y{if(yh(t.classes)!==yh(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;if(t.classes.length===1){var r=t.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n in t.style)if(t.style.hasOwnProperty(n)&&t.style[n]!==e.style[n])return!1;for(var i in e.style)if(e.style.hasOwnProperty(i)&&t.style[i]!==e.style[i])return!1;return!0},"canCombine"),Gbe=o(t=>{for(var e=0;er&&(r=s.height),s.depth>n&&(n=s.depth),s.maxFontSize>i&&(i=s.maxFontSize)}e.height=r,e.depth=n,e.maxFontSize=i},"sizeElementFromChildren"),Ts=o(function(e,r,n,i){var a=new nd(e,r,n,i);return OC(a),a},"makeSpan"),GG=o((t,e,r,n)=>new nd(t,e,r,n),"makeSvgSpan"),$be=o(function(e,r,n){var i=Ts([e],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=gt(i.height),i.maxFontSize=1,i},"makeLineSpan"),Vbe=o(function(e,r,n,i){var a=new my(e,r,n,i);return OC(a),a},"makeAnchor"),$G=o(function(e){var r=new rd(e);return OC(r),r},"makeFragment"),Ube=o(function(e,r){return e instanceof rd?Ts([],[e],r):e},"wrapFragment"),Hbe=o(function(e){if(e.positionType==="individualShift"){for(var r=e.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,s=1;s{var r=Ts(["mspace"],[],e),n=Jn(t,e);return r.style.marginRight=gt(n),r},"makeGlue"),p4=o(function(e,r,n){var i="";switch(e){case"amsrm":i="AMS";break;case"textrm":i="Main";break;case"textsf":i="SansSerif";break;case"texttt":i="Typewriter";break;default:i=e}var a;return r==="textbf"&&n==="textit"?a="BoldItalic":r==="textbf"?a="Bold":r==="textit"?a="Italic":a="Regular",i+"-"+a},"retrieveTextFontName"),VG={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},UG={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},qbe=o(function(e,r){var[n,i,a]=UG[e],s=new cc(n),l=new vl([s],{width:gt(i),height:gt(a),style:"width:"+gt(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),u=GG(["overlay"],[l],r);return u.height=a,u.style.height=gt(a),u.style.width=gt(i),u},"staticSvg"),Fe={fontMap:VG,makeSymbol:yl,mathsym:Pbe,makeSpan:Ts,makeSvgSpan:GG,makeLineSpan:$be,makeAnchor:Vbe,makeFragment:$G,wrapFragment:Ube,makeVList:Wbe,makeOrd:Fbe,makeGlue:Ybe,staticSvg:qbe,svgData:UG,tryCombineChars:Gbe},Zn={number:3,unit:"mu"},ed={number:4,unit:"mu"},hu={number:5,unit:"mu"},Xbe={mord:{mop:Zn,mbin:ed,mrel:hu,minner:Zn},mop:{mord:Zn,mop:Zn,mrel:hu,minner:Zn},mbin:{mord:ed,mop:ed,mopen:ed,minner:ed},mrel:{mord:hu,mop:hu,mopen:hu,minner:hu},mopen:{},mclose:{mop:Zn,mbin:ed,mrel:hu,minner:Zn},mpunct:{mord:Zn,mop:Zn,mrel:hu,mopen:Zn,mclose:Zn,mpunct:Zn,minner:Zn},minner:{mord:Zn,mop:Zn,mbin:ed,mrel:hu,mopen:Zn,mpunct:Zn,minner:Zn}},jbe={mord:{mop:Zn},mop:{mord:Zn,mop:Zn},mbin:{},mrel:{},mopen:{},mclose:{mop:Zn},mpunct:{},minner:{mop:Zn}},HG={},E4={},S4={};o(St,"defineFunction");o(id,"defineFunctionBuilders");C4=o(function(e){return e.type==="ordgroup"&&e.body.length===1?e.body[0]:e},"normalizeArgument"),gi=o(function(e){return e.type==="ordgroup"?e.body:[e]},"ordargument"),pu=Fe.makeSpan,Kbe=["leftmost","mbin","mopen","mrel","mop","mpunct"],Qbe=["rightmost","mrel","mclose","mpunct"],Zbe={display:rr.DISPLAY,text:rr.TEXT,script:rr.SCRIPT,scriptscript:rr.SCRIPTSCRIPT},Jbe={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},Fi=o(function(e,r,n,i){i===void 0&&(i=[null,null]);for(var a=[],s=0;s{var v=y.classes[0],x=g.classes[0];v==="mbin"&&Jt.contains(Qbe,x)?y.classes[0]="mord":x==="mbin"&&Jt.contains(Kbe,v)&&(g.classes[0]="mord")},{node:d},p,m),uG(a,(g,y)=>{var v=SC(y),x=SC(g),b=v&&x?g.hasClass("mtight")?jbe[v][x]:Xbe[v][x]:null;if(b)return Fe.makeGlue(b,h)},{node:d},p,m),a},"buildExpression"),uG=o(function t(e,r,n,i,a){i&&e.push(i);for(var s=0;sp=>{e.splice(d+1,0,p),s++})(s)}i&&e.pop()},"traverseNonSpaceNodes"),WG=o(function(e){return e instanceof rd||e instanceof my||e instanceof nd&&e.hasClass("enclosing")?e:null},"checkPartialGroup"),e4e=o(function t(e,r){var n=WG(e);if(n){var i=n.children;if(i.length){if(r==="right")return t(i[i.length-1],"right");if(r==="left")return t(i[0],"left")}}return e},"getOutermostNode"),SC=o(function(e,r){return e?(r&&(e=e4e(e,r)),Jbe[e.classes[0]]||null):null},"getTypeOfDomTree"),yy=o(function(e,r){var n=["nulldelimiter"].concat(e.baseSizingClasses());return pu(r.concat(n))},"makeNullDelimiter"),Pr=o(function(e,r,n){if(!e)return pu();if(E4[e.type]){var i=E4[e.type](e,r);if(n&&r.size!==n.size){i=pu(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new lt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(m4,"buildHTMLUnbreakable");o(CC,"buildHTML");o(YG,"newDocumentFragment");ks=class{static{o(this,"MathNode")}constructor(e,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(e,r){this.attributes[e]=r}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&e.setAttribute(r,this.attributes[r]);this.classes.length>0&&(e.className=yh(this.classes));for(var n=0;n0&&(e+=' class ="'+Jt.escape(yh(this.classes))+'"'),e+=">";for(var n=0;n",e}toText(){return this.children.map(e=>e.toText()).join("")}},td=class{static{o(this,"TextNode")}constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return Jt.escape(this.toText())}toText(){return this.text}},AC=class{static{o(this,"SpaceNode")}constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",gt(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},at={MathNode:ks,TextNode:td,SpaceNode:AC,newDocumentFragment:YG},Mo=o(function(e,r,n){return Cn[r][e]&&Cn[r][e].replace&&e.charCodeAt(0)!==55349&&!(zG.hasOwnProperty(e)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(e=Cn[r][e].replace),new at.TextNode(e)},"makeText"),PC=o(function(e){return e.length===1?e[0]:new at.MathNode("mrow",e)},"makeRow"),BC=o(function(e,r){if(r.fontFamily==="texttt")return"monospace";if(r.fontFamily==="textsf")return r.fontShape==="textit"&&r.fontWeight==="textbf"?"sans-serif-bold-italic":r.fontShape==="textit"?"sans-serif-italic":r.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(r.fontShape==="textit"&&r.fontWeight==="textbf")return"bold-italic";if(r.fontShape==="textit")return"italic";if(r.fontWeight==="textbf")return"bold";var n=r.font;if(!n||n==="mathnormal")return null;var i=e.mode;if(n==="mathit")return"italic";if(n==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(n==="mathbf")return"bold";if(n==="mathbb")return"double-struck";if(n==="mathfrak")return"fraktur";if(n==="mathscr"||n==="mathcal")return"script";if(n==="mathsf")return"sans-serif";if(n==="mathtt")return"monospace";var a=e.text;if(Jt.contains(["\\imath","\\jmath"],a))return null;Cn[i][a]&&Cn[i][a].replace&&(a=Cn[i][a].replace);var s=Fe.fontMap[n].fontName;return IC(a,s,i)?Fe.fontMap[n].variant:null},"getVariant"),Ss=o(function(e,r,n){if(e.length===1){var i=yn(e[0],r);return n&&i instanceof ks&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],s,l=0;l0&&(d.text=d.text.slice(0,1)+"\u0338"+d.text.slice(1),a.pop())}}}a.push(u),s=u}return a},"buildExpression"),vh=o(function(e,r,n){return PC(Ss(e,r,n))},"buildExpressionRow"),yn=o(function(e,r){if(!e)return new at.MathNode("mrow");if(S4[e.type]){var n=S4[e.type](e,r);return n}else throw new lt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(hG,"buildMathML");qG=o(function(e){return new T4({style:e.displayMode?rr.DISPLAY:rr.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},"optionsFromSettings"),XG=o(function(e,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),e=Fe.makeSpan(n,[e])}return e},"displayWrap"),t4e=o(function(e,r,n){var i=qG(n),a;if(n.output==="mathml")return hG(e,r,i,n.displayMode,!0);if(n.output==="html"){var s=CC(e,i);a=Fe.makeSpan(["katex"],[s])}else{var l=hG(e,r,i,n.displayMode,!1),u=CC(e,i);a=Fe.makeSpan(["katex"],[l,u])}return XG(a,n)},"buildTree"),r4e=o(function(e,r,n){var i=qG(n),a=CC(e,i),s=Fe.makeSpan(["katex"],[a]);return XG(s,n)},"buildHTMLTree"),n4e={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},i4e=o(function(e){var r=new at.MathNode("mo",[new at.TextNode(n4e[e.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},"mathMLnode"),a4e={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},s4e=o(function(e){return e.type==="ordgroup"?e.body.length:1},"groupLength"),o4e=o(function(e,r){function n(){var l=4e5,u=e.label.slice(1);if(Jt.contains(["widehat","widecheck","widetilde","utilde"],u)){var h=e,f=s4e(h.base),d,p,m;if(f>5)u==="widehat"||u==="widecheck"?(d=420,l=2364,m=.42,p=u+"4"):(d=312,l=2340,m=.34,p="tilde4");else{var g=[1,1,2,2,3,3][f];u==="widehat"||u==="widecheck"?(l=[0,1062,2364,2364,2364][g],d=[0,239,300,360,420][g],m=[0,.24,.3,.3,.36,.42][g],p=u+g):(l=[0,600,1033,2339,2340][g],d=[0,260,286,306,312][g],m=[0,.26,.286,.3,.306,.34][g],p="tilde"+g)}var y=new cc(p),v=new vl([y],{width:"100%",height:gt(m),viewBox:"0 0 "+l+" "+d,preserveAspectRatio:"none"});return{span:Fe.makeSvgSpan([],[v],r),minWidth:0,height:m}}else{var x=[],b=a4e[u],[w,_,T]=b,E=T/1e3,L=w.length,S,A;if(L===1){var I=b[3];S=["hide-tail"],A=[I]}else if(L===2)S=["halfarrow-left","halfarrow-right"],A=["xMinYMin","xMaxYMin"];else if(L===3)S=["brace-left","brace-center","brace-right"],A=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+L+" children.");for(var D=0;D0&&(i.style.minWidth=gt(a)),i},"svgSpan"),l4e=o(function(e,r,n,i,a){var s,l=e.height+e.depth+n+i;if(/fbox|color|angl/.test(r)){if(s=Fe.makeSpan(["stretchy",r],[],a),r==="fbox"){var u=a.color&&a.getColor();u&&(s.style.borderColor=u)}}else{var h=[];/^[bx]cancel$/.test(r)&&h.push(new gy({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&h.push(new gy({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var f=new vl(h,{width:"100%",height:gt(l)});s=Fe.makeSvgSpan([],[f],a)}return s.height=l,s.style.height=gt(l),s},"encloseSpan"),mu={encloseSpan:l4e,mathMLnode:i4e,svgSpan:o4e};o(gr,"assertNodeType");o(FC,"assertSymbolNodeType");o(N4,"checkSymbolNodeType");zC=o((t,e)=>{var r,n,i;t&&t.type==="supsub"?(n=gr(t.base,"accent"),r=n.base,t.base=r,i=Rbe(Pr(t,e)),t.base=n):(n=gr(t,"accent"),r=n.base);var a=Pr(r,e.havingCrampedStyle()),s=n.isShifty&&Jt.isCharacterBox(r),l=0;if(s){var u=Jt.getBaseElem(r),h=Pr(u,e.havingCrampedStyle());l=sG(h).skew}var f=n.label==="\\c",d=f?a.height+a.depth:Math.min(a.height,e.fontMetrics().xHeight),p;if(n.isStretchy)p=mu.svgSpan(n,e),p=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:p,wrapperClasses:["svg-align"],wrapperStyle:l>0?{width:"calc(100% - "+gt(2*l)+")",marginLeft:gt(2*l)}:void 0}]},e);else{var m,g;n.label==="\\vec"?(m=Fe.staticSvg("vec",e),g=Fe.svgData.vec[1]):(m=Fe.makeOrd({mode:n.mode,text:n.label},e,"textord"),m=sG(m),m.italic=0,g=m.width,f&&(d+=m.depth)),p=Fe.makeSpan(["accent-body"],[m]);var y=n.label==="\\textcircled";y&&(p.classes.push("accent-full"),d=a.height);var v=l;y||(v-=g/2),p.style.left=gt(v),n.label==="\\textcircled"&&(p.style.top=".2em"),p=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-d},{type:"elem",elem:p}]},e)}var x=Fe.makeSpan(["mord","accent"],[p],e);return i?(i.children[0]=x,i.height=Math.max(x.height,i.height),i.classes[0]="mord",i):x},"htmlBuilder$a"),jG=o((t,e)=>{var r=t.isStretchy?mu.mathMLnode(t.label):new at.MathNode("mo",[Mo(t.label,t.mode)]),n=new at.MathNode("mover",[yn(t.base,e),r]);return n.setAttribute("accent","true"),n},"mathmlBuilder$9"),c4e=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(t=>"\\"+t).join("|"));St({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:o((t,e)=>{var r=C4(e[0]),n=!c4e.test(t.funcName),i=!n||t.funcName==="\\widehat"||t.funcName==="\\widetilde"||t.funcName==="\\widecheck";return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:n,isShifty:i,base:r}},"handler"),htmlBuilder:zC,mathmlBuilder:jG});St({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:o((t,e)=>{var r=e[0],n=t.parser.mode;return n==="math"&&(t.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+t.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},"handler"),htmlBuilder:zC,mathmlBuilder:jG});St({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},"handler"),htmlBuilder:o((t,e)=>{var r=Pr(t.base,e),n=mu.svgSpan(t,e),i=t.label==="\\utilde"?.12:0,a=Fe.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},e);return Fe.makeSpan(["mord","accentunder"],[a],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=mu.mathMLnode(t.label),n=new at.MathNode("munder",[yn(t.base,e),r]);return n.setAttribute("accentunder","true"),n},"mathmlBuilder")});g4=o(t=>{var e=new at.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e},"paddedNode");St({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n,funcName:i}=t;return{type:"xArrow",mode:n.mode,label:i,body:e[0],below:r[0]}},htmlBuilder(t,e){var r=e.style,n=e.havingStyle(r.sup()),i=Fe.wrapFragment(Pr(t.body,n,e),e),a=t.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var s;t.below&&(n=e.havingStyle(r.sub()),s=Fe.wrapFragment(Pr(t.below,n,e),e),s.classes.push(a+"-arrow-pad"));var l=mu.svgSpan(t,e),u=-e.fontMetrics().axisHeight+.5*l.height,h=-e.fontMetrics().axisHeight-.5*l.height-.111;(i.depth>.25||t.label==="\\xleftequilibrium")&&(h-=i.depth);var f;if(s){var d=-e.fontMetrics().axisHeight+s.height+.5*l.height+.111;f=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u},{type:"elem",elem:s,shift:d}]},e)}else f=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u}]},e);return f.children[0].children[0].children[1].classes.push("svg-align"),Fe.makeSpan(["mrel","x-arrow"],[f],e)},mathmlBuilder(t,e){var r=mu.mathMLnode(t.label);r.setAttribute("minsize",t.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(t.body){var i=g4(yn(t.body,e));if(t.below){var a=g4(yn(t.below,e));n=new at.MathNode("munderover",[r,a,i])}else n=new at.MathNode("mover",[r,i])}else if(t.below){var s=g4(yn(t.below,e));n=new at.MathNode("munder",[r,s])}else n=g4(),n=new at.MathNode("mover",[r,n]);return n}});u4e=Fe.makeSpan;o(KG,"htmlBuilder$9");o(QG,"mathmlBuilder$8");St({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:gi(i),isCharacterBox:Jt.isCharacterBox(i)}},htmlBuilder:KG,mathmlBuilder:QG});R4=o(t=>{var e=t.type==="ordgroup"&&t.body.length?t.body[0]:t;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"},"binrelClass");St({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(t,e){var{parser:r}=t;return{type:"mclass",mode:r.mode,mclass:R4(e[0]),body:gi(e[1]),isCharacterBox:Jt.isCharacterBox(e[1])}}});St({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(t,e){var{parser:r,funcName:n}=t,i=e[1],a=e[0],s;n!=="\\stackrel"?s=R4(i):s="mrel";var l={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:gi(i)},u={type:"supsub",mode:a.mode,base:l,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:s,body:[u],isCharacterBox:Jt.isCharacterBox(u)}},htmlBuilder:KG,mathmlBuilder:QG});St({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"pmb",mode:r.mode,mclass:R4(e[0]),body:gi(e[0])}},htmlBuilder(t,e){var r=Fi(t.body,e,!0),n=Fe.makeSpan([t.mclass],r,e);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(t,e){var r=Ss(t.body,e),n=new at.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});h4e={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},fG=o(()=>({type:"styling",body:[],mode:"math",style:"display"}),"newCell"),dG=o(t=>t.type==="textord"&&t.text==="@","isStartOfArrow"),f4e=o((t,e)=>(t.type==="mathord"||t.type==="atom")&&t.text===e,"isLabelEnd");o(d4e,"cdArrow");o(p4e,"parseCD");St({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:e[0]}},htmlBuilder(t,e){var r=e.havingStyle(e.style.sup()),n=Fe.wrapFragment(Pr(t.label,r,e),e);return n.classes.push("cd-label-"+t.side),n.style.bottom=gt(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(t,e){var r=new at.MathNode("mrow",[yn(t.label,e)]);return r=new at.MathNode("mpadded",[r]),r.setAttribute("width","0"),t.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new at.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});St({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(t,e){var{parser:r}=t;return{type:"cdlabelparent",mode:r.mode,fragment:e[0]}},htmlBuilder(t,e){var r=Fe.wrapFragment(Pr(t.fragment,e),e);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(t,e){return new at.MathNode("mrow",[yn(t.fragment,e)])}});St({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(t,e){for(var{parser:r}=t,n=gr(e[0],"ordgroup"),i=n.body,a="",s=0;s=1114111)throw new lt("\\@char with invalid code point "+a);return u<=65535?h=String.fromCharCode(u):(u-=65536,h=String.fromCharCode((u>>10)+55296,(u&1023)+56320)),{type:"textord",mode:r.mode,text:h}}});ZG=o((t,e)=>{var r=Fi(t.body,e.withColor(t.color),!1);return Fe.makeFragment(r)},"htmlBuilder$8"),JG=o((t,e)=>{var r=Ss(t.body,e.withColor(t.color)),n=new at.MathNode("mstyle",r);return n.setAttribute("mathcolor",t.color),n},"mathmlBuilder$7");St({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(t,e){var{parser:r}=t,n=gr(e[0],"color-token").color,i=e[1];return{type:"color",mode:r.mode,color:n,body:gi(i)}},htmlBuilder:ZG,mathmlBuilder:JG});St({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(t,e){var{parser:r,breakOnTokenText:n}=t,i=gr(e[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:ZG,mathmlBuilder:JG});St({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(t,e,r){var{parser:n}=t,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&gr(i,"size").value}},htmlBuilder(t,e){var r=Fe.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=gt(Jn(t.size,e)))),r},mathmlBuilder(t,e){var r=new at.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",gt(Jn(t.size,e)))),r}});_C={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},e$=o(t=>{var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new lt("Expected a control sequence",t);return e},"checkControlSequence"),m4e=o(t=>{var e=t.gullet.popToken();return e.text==="="&&(e=t.gullet.popToken(),e.text===" "&&(e=t.gullet.popToken())),e},"getRHS"),t$=o((t,e,r,n)=>{var i=t.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,i,n)},"letCommand");St({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e,funcName:r}=t;e.consumeSpaces();var n=e.fetch();if(_C[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=_C[n.text]),gr(e.parseFunction(),"internal");throw new lt("Invalid token after macro prefix",n)}});St({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new lt("Expected a control sequence",n);for(var a=0,s,l=[[]];e.gullet.future().text!=="{";)if(n=e.gullet.popToken(),n.text==="#"){if(e.gullet.future().text==="{"){s=e.gullet.future(),l[a].push("{");break}if(n=e.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new lt('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new lt('Argument number "'+n.text+'" out of order');a++,l.push([])}else{if(n.text==="EOF")throw new lt("Expected a macro definition");l[a].push(n.text)}var{tokens:u}=e.gullet.consumeArg();return s&&u.unshift(s),(r==="\\edef"||r==="\\xdef")&&(u=e.gullet.expandTokens(u),u.reverse()),e.gullet.macros.set(i,{tokens:u,numArgs:a,delimiters:l},r===_C[r]),{type:"internal",mode:e.mode}}});St({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e$(e.gullet.popToken());e.gullet.consumeSpaces();var i=m4e(e);return t$(e,n,i,r==="\\\\globallet"),{type:"internal",mode:e.mode}}});St({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e$(e.gullet.popToken()),i=e.gullet.popToken(),a=e.gullet.popToken();return t$(e,n,a,r==="\\\\globalfuture"),e.gullet.pushToken(a),e.gullet.pushToken(i),{type:"internal",mode:e.mode}}});hy=o(function(e,r,n){var i=Cn.math[e]&&Cn.math[e].replace,a=IC(i||e,r,n);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+r+".");return a},"getMetrics"),GC=o(function(e,r,n,i){var a=n.havingBaseStyle(r),s=Fe.makeSpan(i.concat(a.sizingClasses(n)),[e],n),l=a.sizeMultiplier/n.sizeMultiplier;return s.height*=l,s.depth*=l,s.maxFontSize=a.sizeMultiplier,s},"styleWrap"),r$=o(function(e,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=gt(a),e.height-=a,e.depth+=a},"centerSpan"),g4e=o(function(e,r,n,i,a,s){var l=Fe.makeSymbol(e,"Main-Regular",a,i),u=GC(l,r,i,s);return n&&r$(u,i,r),u},"makeSmallDelim"),y4e=o(function(e,r,n,i){return Fe.makeSymbol(e,"Size"+r+"-Regular",n,i)},"mathrmSize"),n$=o(function(e,r,n,i,a,s){var l=y4e(e,r,a,i),u=GC(Fe.makeSpan(["delimsizing","size"+r],[l],i),rr.TEXT,i,s);return n&&r$(u,i,rr.TEXT),u},"makeLargeDelim"),fC=o(function(e,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=Fe.makeSpan(["delimsizinginner",i],[Fe.makeSpan([],[Fe.makeSymbol(e,r,n)])]);return{type:"elem",elem:a}},"makeGlyphSpan"),dC=o(function(e,r,n){var i=lc["Size4-Regular"][e.charCodeAt(0)]?lc["Size4-Regular"][e.charCodeAt(0)][4]:lc["Size1-Regular"][e.charCodeAt(0)][4],a=new cc("inner",Sbe(e,Math.round(1e3*r))),s=new vl([a],{width:gt(i),height:gt(r),style:"width:"+gt(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),l=Fe.makeSvgSpan([],[s],n);return l.height=r,l.style.height=gt(r),l.style.width=gt(i),{type:"elem",elem:l}},"makeInner"),LC=.008,y4={type:"kern",size:-1*LC},v4e=["|","\\lvert","\\rvert","\\vert"],x4e=["\\|","\\lVert","\\rVert","\\Vert"],i$=o(function(e,r,n,i,a,s){var l,u,h,f,d="",p=0;l=h=f=e,u=null;var m="Size1-Regular";e==="\\uparrow"?h=f="\u23D0":e==="\\Uparrow"?h=f="\u2016":e==="\\downarrow"?l=h="\u23D0":e==="\\Downarrow"?l=h="\u2016":e==="\\updownarrow"?(l="\\uparrow",h="\u23D0",f="\\downarrow"):e==="\\Updownarrow"?(l="\\Uparrow",h="\u2016",f="\\Downarrow"):Jt.contains(v4e,e)?(h="\u2223",d="vert",p=333):Jt.contains(x4e,e)?(h="\u2225",d="doublevert",p=556):e==="["||e==="\\lbrack"?(l="\u23A1",h="\u23A2",f="\u23A3",m="Size4-Regular",d="lbrack",p=667):e==="]"||e==="\\rbrack"?(l="\u23A4",h="\u23A5",f="\u23A6",m="Size4-Regular",d="rbrack",p=667):e==="\\lfloor"||e==="\u230A"?(h=l="\u23A2",f="\u23A3",m="Size4-Regular",d="lfloor",p=667):e==="\\lceil"||e==="\u2308"?(l="\u23A1",h=f="\u23A2",m="Size4-Regular",d="lceil",p=667):e==="\\rfloor"||e==="\u230B"?(h=l="\u23A5",f="\u23A6",m="Size4-Regular",d="rfloor",p=667):e==="\\rceil"||e==="\u2309"?(l="\u23A4",h=f="\u23A5",m="Size4-Regular",d="rceil",p=667):e==="("||e==="\\lparen"?(l="\u239B",h="\u239C",f="\u239D",m="Size4-Regular",d="lparen",p=875):e===")"||e==="\\rparen"?(l="\u239E",h="\u239F",f="\u23A0",m="Size4-Regular",d="rparen",p=875):e==="\\{"||e==="\\lbrace"?(l="\u23A7",u="\u23A8",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(l="\u23AB",u="\u23AC",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(l="\u23A7",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(l="\u23AB",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(l="\u23A7",f="\u23AD",h="\u23AA",m="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(l="\u23AB",f="\u23A9",h="\u23AA",m="Size4-Regular");var g=hy(l,m,a),y=g.height+g.depth,v=hy(h,m,a),x=v.height+v.depth,b=hy(f,m,a),w=b.height+b.depth,_=0,T=1;if(u!==null){var E=hy(u,m,a);_=E.height+E.depth,T=2}var L=y+w+_,S=Math.max(0,Math.ceil((r-L)/(T*x))),A=L+S*T*x,I=i.fontMetrics().axisHeight;n&&(I*=i.sizeMultiplier);var D=A/2-I,k=[];if(d.length>0){var R=A-y-w,C=Math.round(A*1e3),O=Cbe(d,Math.round(R*1e3)),N=new cc(d,O),P=(p/1e3).toFixed(3)+"em",F=(C/1e3).toFixed(3)+"em",B=new vl([N],{width:P,height:F,viewBox:"0 0 "+p+" "+C}),G=Fe.makeSvgSpan([],[B],i);G.height=C/1e3,G.style.width=P,G.style.height=F,k.push({type:"elem",elem:G})}else{if(k.push(fC(f,m,a)),k.push(y4),u===null){var z=A-y-w+2*LC;k.push(dC(h,z,i))}else{var W=(A-y-w-_)/2+2*LC;k.push(dC(h,W,i)),k.push(y4),k.push(fC(u,m,a)),k.push(y4),k.push(dC(h,W,i))}k.push(y4),k.push(fC(l,m,a))}var Z=i.havingBaseStyle(rr.TEXT),j=Fe.makeVList({positionType:"bottom",positionData:D,children:k},Z);return GC(Fe.makeSpan(["delimsizing","mult"],[j],Z),rr.TEXT,i,s)},"makeStackedDelim"),pC=80,mC=.08,gC=o(function(e,r,n,i,a){var s=Ebe(e,i,n),l=new cc(e,s),u=new vl([l],{width:"400em",height:gt(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return Fe.makeSvgSpan(["hide-tail"],[u],a)},"sqrtSvg"),b4e=o(function(e,r){var n=r.havingBaseSizing(),i=l$("\\surd",e*n.sizeMultiplier,o$,n),a=n.sizeMultiplier,s=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),l,u=0,h=0,f=0,d;return i.type==="small"?(f=1e3+1e3*s+pC,e<1?a=1:e<1.4&&(a=.7),u=(1+s+mC)/a,h=(1+s)/a,l=gC("sqrtMain",u,f,s,r),l.style.minWidth="0.853em",d=.833/a):i.type==="large"?(f=(1e3+pC)*fy[i.size],h=(fy[i.size]+s)/a,u=(fy[i.size]+s+mC)/a,l=gC("sqrtSize"+i.size,u,f,s,r),l.style.minWidth="1.02em",d=1/a):(u=e+s+mC,h=e+s,f=Math.floor(1e3*e+s)+pC,l=gC("sqrtTall",u,f,s,r),l.style.minWidth="0.742em",d=1.056),l.height=h,l.style.height=gt(u),{span:l,advanceWidth:d,ruleWidth:(r.fontMetrics().sqrtRuleThickness+s)*a}},"makeSqrtImage"),a$=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],w4e=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],s$=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],fy=[0,1.2,1.8,2.4,3],T4e=o(function(e,r,n,i,a){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),Jt.contains(a$,e)||Jt.contains(s$,e))return n$(e,r,!1,n,i,a);if(Jt.contains(w4e,e))return i$(e,fy[r],!1,n,i,a);throw new lt("Illegal delimiter: '"+e+"'")},"makeSizedDelim"),k4e=[{type:"small",style:rr.SCRIPTSCRIPT},{type:"small",style:rr.SCRIPT},{type:"small",style:rr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],E4e=[{type:"small",style:rr.SCRIPTSCRIPT},{type:"small",style:rr.SCRIPT},{type:"small",style:rr.TEXT},{type:"stack"}],o$=[{type:"small",style:rr.SCRIPTSCRIPT},{type:"small",style:rr.SCRIPT},{type:"small",style:rr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],S4e=o(function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},"delimTypeToFont"),l$=o(function(e,r,n,i){for(var a=Math.min(2,3-i.style.size),s=a;sr)return n[s]}return n[n.length-1]},"traverseSequence"),c$=o(function(e,r,n,i,a,s){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var l;Jt.contains(s$,e)?l=k4e:Jt.contains(a$,e)?l=o$:l=E4e;var u=l$(e,r,l,i);return u.type==="small"?g4e(e,u.style,n,i,a,s):u.type==="large"?n$(e,u.size,n,i,a,s):i$(e,r,n,i,a,s)},"makeCustomSizedDelim"),C4e=o(function(e,r,n,i,a,s){var l=i.fontMetrics().axisHeight*i.sizeMultiplier,u=901,h=5/i.fontMetrics().ptPerEm,f=Math.max(r-l,n+l),d=Math.max(f/500*u,2*f-h);return c$(e,d,!0,i,a,s)},"makeLeftRightDelim"),du={sqrtImage:b4e,sizedDelim:T4e,sizeToMaxHeight:fy,customSizedDelim:c$,leftRightDelim:C4e},pG={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},A4e=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];o(M4,"checkDelimiter");St({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:o((t,e)=>{var r=M4(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:pG[t.funcName].size,mclass:pG[t.funcName].mclass,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>t.delim==="."?Fe.makeSpan([t.mclass]):du.sizedDelim(t.delim,t.size,e,t.mode,[t.mclass]),"htmlBuilder"),mathmlBuilder:o(t=>{var e=[];t.delim!=="."&&e.push(Mo(t.delim,t.mode));var r=new at.MathNode("mo",e);t.mclass==="mopen"||t.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=gt(du.sizeToMaxHeight[t.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r},"mathmlBuilder")});o(mG,"assertParsed");St({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=t.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new lt("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:M4(e[0],t).text,color:r}},"handler")});St({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=M4(e[0],t),n=t.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=gr(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},"handler"),htmlBuilder:o((t,e)=>{mG(t);for(var r=Fi(t.body,e,!0,["mopen","mclose"]),n=0,i=0,a=!1,s=0;s{mG(t);var r=Ss(t.body,e);if(t.left!=="."){var n=new at.MathNode("mo",[Mo(t.left,t.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(t.right!=="."){var i=new at.MathNode("mo",[Mo(t.right,t.mode)]);i.setAttribute("fence","true"),t.rightColor&&i.setAttribute("mathcolor",t.rightColor),r.push(i)}return PC(r)},"mathmlBuilder")});St({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=M4(e[0],t);if(!t.parser.leftrightDepth)throw new lt("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>{var r;if(t.delim===".")r=yy(e,[]);else{r=du.sizedDelim(t.delim,1,e,t.mode,[]);var n={delim:t.delim,options:e};r.isMiddle=n}return r},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=t.delim==="\\vert"||t.delim==="|"?Mo("|","text"):Mo(t.delim,t.mode),n=new at.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n},"mathmlBuilder")});$C=o((t,e)=>{var r=Fe.wrapFragment(Pr(t.body,e),e),n=t.label.slice(1),i=e.sizeMultiplier,a,s=0,l=Jt.isCharacterBox(t.body);if(n==="sout")a=Fe.makeSpan(["stretchy","sout"]),a.height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else if(n==="phase"){var u=Jn({number:.6,unit:"pt"},e),h=Jn({number:.35,unit:"ex"},e),f=e.havingBaseSizing();i=i/f.sizeMultiplier;var d=r.height+r.depth+u+h;r.style.paddingLeft=gt(d/2+u);var p=Math.floor(1e3*d*i),m=Tbe(p),g=new vl([new cc("phase",m)],{width:"400em",height:gt(p/1e3),viewBox:"0 0 400000 "+p,preserveAspectRatio:"xMinYMin slice"});a=Fe.makeSvgSpan(["hide-tail"],[g],e),a.style.height=gt(d),s=r.depth+u+h}else{/cancel/.test(n)?l||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var y=0,v=0,x=0;/box/.test(n)?(x=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),y=e.fontMetrics().fboxsep+(n==="colorbox"?0:x),v=y):n==="angl"?(x=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),y=4*x,v=Math.max(0,.25-r.depth)):(y=l?.2:0,v=y),a=mu.encloseSpan(r,n,y,v,e),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=gt(x)):n==="angl"&&x!==.049&&(a.style.borderTopWidth=gt(x),a.style.borderRightWidth=gt(x)),s=r.depth+v,t.backgroundColor&&(a.style.backgroundColor=t.backgroundColor,t.borderColor&&(a.style.borderColor=t.borderColor))}var b;if(t.backgroundColor)b=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:s},{type:"elem",elem:r,shift:0}]},e);else{var w=/cancel|phase/.test(n)?["svg-align"]:[];b=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:s,wrapperClasses:w}]},e)}return/cancel/.test(n)&&(b.height=r.height,b.depth=r.depth),/cancel/.test(n)&&!l?Fe.makeSpan(["mord","cancel-lap"],[b],e):Fe.makeSpan(["mord"],[b],e)},"htmlBuilder$7"),VC=o((t,e)=>{var r=0,n=new at.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[yn(t.body,e)]);switch(t.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),t.label==="\\fcolorbox"){var i=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);n.setAttribute("style","border: "+i+"em solid "+String(t.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return t.backgroundColor&&n.setAttribute("mathbackground",t.backgroundColor),n},"mathmlBuilder$6");St({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=gr(e[0],"color-token").color,s=e[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:s}},htmlBuilder:$C,mathmlBuilder:VC});St({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=gr(e[0],"color-token").color,s=gr(e[1],"color-token").color,l=e[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:s,borderColor:a,body:l}},htmlBuilder:$C,mathmlBuilder:VC});St({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\fbox",body:e[0]}}});St({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:$C,mathmlBuilder:VC});St({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\angl",body:e[0]}}});u$={};o(uc,"defineEnvironment");h$={};o(le,"defineMacro");o(gG,"getHLines");I4=o(t=>{var e=t.parser.settings;if(!e.displayMode)throw new lt("{"+t.envName+"} can be used only in display mode.")},"validateAmsEnvironmentContext");o(UC,"getAutoTag");o(xh,"parseArray");o(HC,"dCellStyle");hc=o(function(e,r){var n,i,a=e.body.length,s=e.hLinesBeforeRow,l=0,u=new Array(a),h=[],f=Math.max(r.fontMetrics().arrayRuleWidth,r.minRuleThickness),d=1/r.fontMetrics().ptPerEm,p=5*d;if(e.colSeparationType&&e.colSeparationType==="small"){var m=r.havingStyle(rr.SCRIPT).sizeMultiplier;p=.2778*(m/r.sizeMultiplier)}var g=e.colSeparationType==="CD"?Jn({number:3,unit:"ex"},r):12*d,y=3*d,v=e.arraystretch*g,x=.7*v,b=.3*v,w=0;function _(ke){for(var Re=0;Re0&&(w+=.25),h.push({pos:w,isDashed:ke[Re]})}for(o(_,"setHLinePos"),_(s[0]),n=0;n0&&(D+=b,Lke))for(n=0;n=l)){var ee=void 0;(i>0||e.hskipBeforeAndAfter)&&(ee=Jt.deflt(W.pregap,p),ee!==0&&(O=Fe.makeSpan(["arraycolsep"],[]),O.style.width=gt(ee),C.push(O)));var J=[];for(n=0;n0){for(var ae=Fe.makeLineSpan("hline",r,f),ue=Fe.makeLineSpan("hdashline",r,f),ce=[{type:"elem",elem:u,shift:0}];h.length>0;){var te=h.pop(),Ne=te.pos-k;te.isDashed?ce.push({type:"elem",elem:ue,shift:Ne}):ce.push({type:"elem",elem:ae,shift:Ne})}u=Fe.makeVList({positionType:"individualShift",children:ce},r)}if(P.length===0)return Fe.makeSpan(["mord"],[u],r);var se=Fe.makeVList({positionType:"individualShift",children:P},r);return se=Fe.makeSpan(["tag"],[se],r),Fe.makeFragment([u,se])},"htmlBuilder"),_4e={c:"center ",l:"left ",r:"right "},fc=o(function(e,r){for(var n=[],i=new at.MathNode("mtd",[],["mtr-glue"]),a=new at.MathNode("mtd",[],["mml-eqn-num"]),s=0;s0){var g=e.cols,y="",v=!1,x=0,b=g.length;g[0].type==="separator"&&(p+="top ",x=1),g[g.length-1].type==="separator"&&(p+="bottom ",b-=1);for(var w=x;w0?"left ":"",p+=S[S.length-1].length>0?"right ":"";for(var A=1;A-1?"alignat":"align",a=e.envName==="split",s=xh(e.parser,{cols:n,addJot:!0,autoTag:a?void 0:UC(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),l,u=0,h={type:"ordgroup",mode:e.mode,body:[]};if(r[0]&&r[0].type==="ordgroup"){for(var f="",d=0;d0&&m&&(v=1),n[g]={type:"align",align:y,pregap:v,postgap:0}}return s.colSeparationType=m?"align":"alignat",s},"alignedHandler");uc({type:"array",names:["array","darray"],props:{numArgs:1},handler(t,e){var r=N4(e[0]),n=r?[e[0]]:gr(e[0],"ordgroup").body,i=n.map(function(s){var l=FC(s),u=l.text;if("lcr".indexOf(u)!==-1)return{type:"align",align:u};if(u==="|")return{type:"separator",separator:"|"};if(u===":")return{type:"separator",separator:":"};throw new lt("Unknown column alignment: "+u,s)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return xh(t.parser,a,HC(t.envName))},htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(t.envName.charAt(t.envName.length-1)==="*"){var i=t.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,"lcr".indexOf(r)===-1)throw new lt("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=xh(t.parser,n,HC(t.envName)),s=Math.max(0,...a.body.map(l=>l.length));return a.cols=new Array(s).fill({type:"align",align:r}),e?{type:"leftright",mode:t.mode,body:[a],left:e[0],right:e[1],rightColor:void 0}:a},htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(t){var e={arraystretch:.5},r=xh(t.parser,e,"script");return r.colSeparationType="small",r},htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["subarray"],props:{numArgs:1},handler(t,e){var r=N4(e[0]),n=r?[e[0]]:gr(e[0],"ordgroup").body,i=n.map(function(s){var l=FC(s),u=l.text;if("lc".indexOf(u)!==-1)return{type:"align",align:u};throw new lt("Unknown column alignment: "+u,s)});if(i.length>1)throw new lt("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5};if(a=xh(t.parser,a,"script"),a.body.length>0&&a.body[0].length>1)throw new lt("{subarray} can contain only one column");return a},htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(t){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=xh(t.parser,e,HC(t.envName));return{type:"leftright",mode:t.mode,body:[r],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:f$,htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(t){Jt.contains(["gather","gather*"],t.envName)&&I4(t);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:UC(t.envName),emptySingleRow:!0,leqno:t.parser.settings.leqno};return xh(t.parser,e,"display")},htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:f$,htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(t){I4(t);var e={autoTag:UC(t.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:t.parser.settings.leqno};return xh(t.parser,e,"display")},htmlBuilder:hc,mathmlBuilder:fc});uc({type:"array",names:["CD"],props:{numArgs:0},handler(t){return I4(t),p4e(t.parser)},htmlBuilder:hc,mathmlBuilder:fc});le("\\nonumber","\\gdef\\@eqnsw{0}");le("\\notag","\\nonumber");St({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(t,e){throw new lt(t.funcName+" valid only within array environment")}});yG=u$;St({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];if(i.type!=="ordgroup")throw new lt("Invalid environment name",i);for(var a="",s=0;s{var r=t.font,n=e.withFont(r);return Pr(t.body,n)},"htmlBuilder$5"),p$=o((t,e)=>{var r=t.font,n=e.withFont(r);return yn(t.body,n)},"mathmlBuilder$4"),vG={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};St({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=C4(e[0]),a=n;return a in vG&&(a=vG[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},"handler"),htmlBuilder:d$,mathmlBuilder:p$});St({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r}=t,n=e[0],i=Jt.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:R4(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:i}},"handler")});St({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n,breakOnTokenText:i}=t,{mode:a}=r,s=r.parseExpression(!0,i),l="math"+n.slice(1);return{type:"font",mode:a,font:l,body:{type:"ordgroup",mode:r.mode,body:s}}},"handler"),htmlBuilder:d$,mathmlBuilder:p$});m$=o((t,e)=>{var r=e;return t==="display"?r=r.id>=rr.SCRIPT.id?r.text():rr.DISPLAY:t==="text"&&r.size===rr.DISPLAY.size?r=rr.TEXT:t==="script"?r=rr.SCRIPT:t==="scriptscript"&&(r=rr.SCRIPTSCRIPT),r},"adjustStyle"),WC=o((t,e)=>{var r=m$(t.size,e.style),n=r.fracNum(),i=r.fracDen(),a;a=e.havingStyle(n);var s=Pr(t.numer,a,e);if(t.continued){var l=8.5/e.fontMetrics().ptPerEm,u=3.5/e.fontMetrics().ptPerEm;s.height=s.height0?g=3*p:g=7*p,y=e.fontMetrics().denom1):(d>0?(m=e.fontMetrics().num2,g=p):(m=e.fontMetrics().num3,g=3*p),y=e.fontMetrics().denom2);var v;if(f){var b=e.fontMetrics().axisHeight;m-s.depth-(b+.5*d){var r=new at.MathNode("mfrac",[yn(t.numer,e),yn(t.denom,e)]);if(!t.hasBarLine)r.setAttribute("linethickness","0px");else if(t.barSize){var n=Jn(t.barSize,e);r.setAttribute("linethickness",gt(n))}var i=m$(t.size,e.style);if(i.size!==e.style.size){r=new at.MathNode("mstyle",[r]);var a=i.size===rr.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",a),r.setAttribute("scriptlevel","0")}if(t.leftDelim!=null||t.rightDelim!=null){var s=[];if(t.leftDelim!=null){var l=new at.MathNode("mo",[new at.TextNode(t.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),s.push(l)}if(s.push(r),t.rightDelim!=null){var u=new at.MathNode("mo",[new at.TextNode(t.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),s.push(u)}return PC(s)}return r},"mathmlBuilder$3");St({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1],s,l=null,u=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":s=!1,l="(",u=")";break;case"\\\\bracefrac":s=!1,l="\\{",u="\\}";break;case"\\\\brackfrac":s=!1,l="[",u="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text";break}return{type:"genfrac",mode:r.mode,continued:!1,numer:i,denom:a,hasBarLine:s,leftDelim:l,rightDelim:u,size:h,barSize:null}},"handler"),htmlBuilder:WC,mathmlBuilder:YC});St({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:i,denom:a,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}},"handler")});St({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(t){var{parser:e,funcName:r,token:n}=t,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:i,token:n}}});xG=["display","text","script","scriptscript"],bG=o(function(e){var r=null;return e.length>0&&(r=e,r=r==="."?null:r),r},"delimFromValue");St({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(t,e){var{parser:r}=t,n=e[4],i=e[5],a=C4(e[0]),s=a.type==="atom"&&a.family==="open"?bG(a.text):null,l=C4(e[1]),u=l.type==="atom"&&l.family==="close"?bG(l.text):null,h=gr(e[2],"size"),f,d=null;h.isBlank?f=!0:(d=h.value,f=d.number>0);var p="auto",m=e[3];if(m.type==="ordgroup"){if(m.body.length>0){var g=gr(m.body[0],"textord");p=xG[Number(g.text)]}}else m=gr(m,"textord"),p=xG[Number(m.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:f,barSize:d,leftDelim:s,rightDelim:u,size:p}},htmlBuilder:WC,mathmlBuilder:YC});St({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(t,e){var{parser:r,funcName:n,token:i}=t;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:gr(e[0],"size").value,token:i}}});St({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=obe(gr(e[1],"infix").size),s=e[2],l=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:s,continued:!1,hasBarLine:l,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},"handler"),htmlBuilder:WC,mathmlBuilder:YC});g$=o((t,e)=>{var r=e.style,n,i;t.type==="supsub"?(n=t.sup?Pr(t.sup,e.havingStyle(r.sup()),e):Pr(t.sub,e.havingStyle(r.sub()),e),i=gr(t.base,"horizBrace")):i=gr(t,"horizBrace");var a=Pr(i.base,e.havingBaseStyle(rr.DISPLAY)),s=mu.svgSpan(i,e),l;if(i.isOver?(l=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:s}]},e),l.children[0].children[0].children[1].classes.push("svg-align")):(l=Fe.makeVList({positionType:"bottom",positionData:a.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:a}]},e),l.children[0].children[0].children[0].classes.push("svg-align")),n){var u=Fe.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e);i.isOver?l=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:u},{type:"kern",size:.2},{type:"elem",elem:n}]},e):l=Fe.makeVList({positionType:"bottom",positionData:u.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:u}]},e)}return Fe.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e)},"htmlBuilder$3"),L4e=o((t,e)=>{var r=mu.mathMLnode(t.label);return new at.MathNode(t.isOver?"mover":"munder",[yn(t.base,e),r])},"mathmlBuilder$2");St({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:e[0]}},htmlBuilder:g$,mathmlBuilder:L4e});St({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[1],i=gr(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:gi(n)}:r.formatUnsupportedCmd("\\href")},"handler"),htmlBuilder:o((t,e)=>{var r=Fi(t.body,e,!1);return Fe.makeAnchor(t.href,[],r,e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=vh(t.body,e);return r instanceof ks||(r=new ks("mrow",[r])),r.setAttribute("href",t.href),r},"mathmlBuilder")});St({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=gr(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=t,a=gr(e[0],"raw").string,s=e[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var l,u={};switch(n){case"\\htmlClass":u.class=a,l={command:"\\htmlClass",class:a};break;case"\\htmlId":u.id=a,l={command:"\\htmlId",id:a};break;case"\\htmlStyle":u.style=a,l={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var h=a.split(","),f=0;f{var r=Fi(t.body,e,!1),n=["enclosing"];t.attributes.class&&n.push(...t.attributes.class.trim().split(/\s+/));var i=Fe.makeSpan(n,r,e);for(var a in t.attributes)a!=="class"&&t.attributes.hasOwnProperty(a)&&i.setAttribute(a,t.attributes[a]);return i},"htmlBuilder"),mathmlBuilder:o((t,e)=>vh(t.body,e),"mathmlBuilder")});St({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"htmlmathml",mode:r.mode,html:gi(e[0]),mathml:gi(e[1])}},"handler"),htmlBuilder:o((t,e)=>{var r=Fi(t.html,e,!1);return Fe.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>vh(t.mathml,e),"mathmlBuilder")});yC=o(function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!r)throw new lt("Invalid size: '"+e+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!OG(n))throw new lt("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n},"sizeData");St({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:o((t,e,r)=>{var{parser:n}=t,i={number:0,unit:"em"},a={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var u=gr(r[0],"raw").string,h=u.split(","),f=0;f{var r=Jn(t.height,e),n=0;t.totalheight.number>0&&(n=Jn(t.totalheight,e)-r);var i=0;t.width.number>0&&(i=Jn(t.width,e));var a={height:gt(r+n)};i>0&&(a.width=gt(i)),n>0&&(a.verticalAlign=gt(-n));var s=new kC(t.src,t.alt,a);return s.height=r,s.depth=n,s},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new at.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var n=Jn(t.height,e),i=0;if(t.totalheight.number>0&&(i=Jn(t.totalheight,e)-n,r.setAttribute("valign",gt(-i))),r.setAttribute("height",gt(n+i)),t.width.number>0){var a=Jn(t.width,e);r.setAttribute("width",gt(a))}return r.setAttribute("src",t.src),r},"mathmlBuilder")});St({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=gr(e[0],"size");if(r.settings.strict){var a=n[1]==="m",s=i.value.unit==="mu";a?(s||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):s&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(t,e){return Fe.makeGlue(t.dimension,e)},mathmlBuilder(t,e){var r=Jn(t.dimension,e);return new at.SpaceNode(r)}});St({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},"handler"),htmlBuilder:o((t,e)=>{var r;t.alignment==="clap"?(r=Fe.makeSpan([],[Pr(t.body,e)]),r=Fe.makeSpan(["inner"],[r],e)):r=Fe.makeSpan(["inner"],[Pr(t.body,e)]);var n=Fe.makeSpan(["fix"],[]),i=Fe.makeSpan([t.alignment],[r,n],e),a=Fe.makeSpan(["strut"]);return a.style.height=gt(i.height+i.depth),i.depth&&(a.style.verticalAlign=gt(-i.depth)),i.children.unshift(a),i=Fe.makeSpan(["thinbox"],[i],e),Fe.makeSpan(["mord","vbox"],[i],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new at.MathNode("mpadded",[yn(t.body,e)]);if(t.alignment!=="rlap"){var n=t.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r},"mathmlBuilder")});St({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){var{funcName:r,parser:n}=t,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",s=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",body:s}}});St({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){throw new lt("Mismatched "+t.funcName)}});wG=o((t,e)=>{switch(e.style.size){case rr.DISPLAY.size:return t.display;case rr.TEXT.size:return t.text;case rr.SCRIPT.size:return t.script;case rr.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}},"chooseMathStyle");St({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"mathchoice",mode:r.mode,display:gi(e[0]),text:gi(e[1]),script:gi(e[2]),scriptscript:gi(e[3])}},"handler"),htmlBuilder:o((t,e)=>{var r=wG(t,e),n=Fi(r,e,!1);return Fe.makeFragment(n)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=wG(t,e);return vh(r,e)},"mathmlBuilder")});y$=o((t,e,r,n,i,a,s)=>{t=Fe.makeSpan([],[t]);var l=r&&Jt.isCharacterBox(r),u,h;if(e){var f=Pr(e,n.havingStyle(i.sup()),n);h={elem:f,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-f.depth)}}if(r){var d=Pr(r,n.havingStyle(i.sub()),n);u={elem:d,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-d.height)}}var p;if(h&&u){var m=n.fontMetrics().bigOpSpacing5+u.elem.height+u.elem.depth+u.kern+t.depth+s;p=Fe.makeVList({positionType:"bottom",positionData:m,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:gt(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:gt(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(u){var g=t.height-s;p=Fe.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:gt(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t}]},n)}else if(h){var y=t.depth+s;p=Fe.makeVList({positionType:"bottom",positionData:y,children:[{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:gt(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else return t;var v=[p];if(u&&a!==0&&!l){var x=Fe.makeSpan(["mspace"],[],n);x.style.marginRight=gt(a),v.unshift(x)}return Fe.makeSpan(["mop","op-limits"],v,n)},"assembleSupSub"),v$=["\\smallint"],Cp=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=gr(t.base,"op"),i=!0):a=gr(t,"op");var s=e.style,l=!1;s.size===rr.DISPLAY.size&&a.symbol&&!Jt.contains(v$,a.name)&&(l=!0);var u;if(a.symbol){var h=l?"Size2-Regular":"Size1-Regular",f="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(f=a.name.slice(1),a.name=f==="oiint"?"\\iint":"\\iiint"),u=Fe.makeSymbol(a.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),f.length>0){var d=u.italic,p=Fe.staticSvg(f+"Size"+(l?"2":"1"),e);u=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:u,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),a.name="\\"+f,u.classes.unshift("mop"),u.italic=d}}else if(a.body){var m=Fi(a.body,e,!0);m.length===1&&m[0]instanceof Es?(u=m[0],u.classes[0]="mop"):u=Fe.makeSpan(["mop"],m,e)}else{for(var g=[],y=1;y{var r;if(t.symbol)r=new ks("mo",[Mo(t.name,t.mode)]),Jt.contains(v$,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new ks("mo",Ss(t.body,e));else{r=new ks("mi",[new td(t.name.slice(1))]);var n=new ks("mo",[Mo("\u2061","text")]);t.parentIsSupSub?r=new ks("mrow",[r,n]):r=YG([r,n])}return r},"mathmlBuilder$1"),D4e={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};St({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=n;return i.length===1&&(i=D4e[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},"handler"),htmlBuilder:Cp,mathmlBuilder:vy});St({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:gi(n)}},"handler"),htmlBuilder:Cp,mathmlBuilder:vy});N4e={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};St({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Cp,mathmlBuilder:vy});St({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Cp,mathmlBuilder:vy});St({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t,n=r;return n.length===1&&(n=N4e[n]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:Cp,mathmlBuilder:vy});x$=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=gr(t.base,"operatorname"),i=!0):a=gr(t,"operatorname");var s;if(a.body.length>0){for(var l=a.body.map(d=>{var p=d.text;return typeof p=="string"?{type:"textord",mode:d.mode,text:p}:d}),u=Fi(l,e.withFont("mathrm"),!0),h=0;h{for(var r=Ss(t.body,e.withFont("mathrm")),n=!0,i=0;if.toText()).join("");r=[new at.TextNode(l)]}var u=new at.MathNode("mi",r);u.setAttribute("mathvariant","normal");var h=new at.MathNode("mo",[Mo("\u2061","text")]);return t.parentIsSupSub?new at.MathNode("mrow",[u,h]):at.newDocumentFragment([u,h])},"mathmlBuilder");St({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"operatorname",mode:r.mode,body:gi(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},"handler"),htmlBuilder:x$,mathmlBuilder:R4e});le("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");id({type:"ordgroup",htmlBuilder(t,e){return t.semisimple?Fe.makeFragment(Fi(t.body,e,!1)):Fe.makeSpan(["mord"],Fi(t.body,e,!0),e)},mathmlBuilder(t,e){return vh(t.body,e,!0)}});St({type:"overline",names:["\\overline"],props:{numArgs:1},handler(t,e){var{parser:r}=t,n=e[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(t,e){var r=Pr(t.body,e.havingCrampedStyle()),n=Fe.makeLineSpan("overline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]},e);return Fe.makeSpan(["mord","overline"],[a],e)},mathmlBuilder(t,e){var r=new at.MathNode("mo",[new at.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new at.MathNode("mover",[yn(t.body,e),r]);return n.setAttribute("accent","true"),n}});St({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"phantom",mode:r.mode,body:gi(n)}},"handler"),htmlBuilder:o((t,e)=>{var r=Fi(t.body,e.withPhantom(),!1);return Fe.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=Ss(t.body,e);return new at.MathNode("mphantom",r)},"mathmlBuilder")});St({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"hphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=Fe.makeSpan([],[Pr(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n{var r=Ss(gi(t.body),e),n=new at.MathNode("mphantom",r),i=new at.MathNode("mpadded",[n]);return i.setAttribute("height","0px"),i.setAttribute("depth","0px"),i},"mathmlBuilder")});St({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"vphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=Fe.makeSpan(["inner"],[Pr(t.body,e.withPhantom())]),n=Fe.makeSpan(["fix"],[]);return Fe.makeSpan(["mord","rlap"],[r,n],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=Ss(gi(t.body),e),n=new at.MathNode("mphantom",r),i=new at.MathNode("mpadded",[n]);return i.setAttribute("width","0px"),i},"mathmlBuilder")});St({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t,n=gr(e[0],"size").value,i=e[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(t,e){var r=Pr(t.body,e),n=Jn(t.dy,e);return Fe.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){var r=new at.MathNode("mpadded",[yn(t.body,e)]),n=t.dy.number+t.dy.unit;return r.setAttribute("voffset",n),r}});St({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e}=t;return{type:"internal",mode:e.mode}}});St({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler(t,e,r){var{parser:n}=t,i=r[0],a=gr(e[0],"size"),s=gr(e[1],"size");return{type:"rule",mode:n.mode,shift:i&&gr(i,"size").value,width:a.value,height:s.value}},htmlBuilder(t,e){var r=Fe.makeSpan(["mord","rule"],[],e),n=Jn(t.width,e),i=Jn(t.height,e),a=t.shift?Jn(t.shift,e):0;return r.style.borderRightWidth=gt(n),r.style.borderTopWidth=gt(i),r.style.bottom=gt(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*e.sizeMultiplier,r},mathmlBuilder(t,e){var r=Jn(t.width,e),n=Jn(t.height,e),i=t.shift?Jn(t.shift,e):0,a=e.color&&e.getColor()||"black",s=new at.MathNode("mspace");s.setAttribute("mathbackground",a),s.setAttribute("width",gt(r)),s.setAttribute("height",gt(n));var l=new at.MathNode("mpadded",[s]);return i>=0?l.setAttribute("height",gt(i)):(l.setAttribute("height",gt(i)),l.setAttribute("depth",gt(-i))),l.setAttribute("voffset",gt(i)),l}});o(b$,"sizingGroup");TG=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],M4e=o((t,e)=>{var r=e.havingSize(t.size);return b$(t.body,r,e)},"htmlBuilder");St({type:"sizing",names:TG,props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:TG.indexOf(n)+1,body:a}},"handler"),htmlBuilder:M4e,mathmlBuilder:o((t,e)=>{var r=e.havingSize(t.size),n=Ss(t.body,r),i=new at.MathNode("mstyle",n);return i.setAttribute("mathsize",gt(r.sizeMultiplier)),i},"mathmlBuilder")});St({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:o((t,e,r)=>{var{parser:n}=t,i=!1,a=!1,s=r[0]&&gr(r[0],"ordgroup");if(s)for(var l="",u=0;u{var r=Fe.makeSpan([],[Pr(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var n=0;n{var r=new at.MathNode("mpadded",[yn(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r},"mathmlBuilder")});St({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n}=t,i=r[0],a=e[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(t,e){var r=Pr(t.body,e.havingCrampedStyle());r.height===0&&(r.height=e.fontMetrics().xHeight),r=Fe.wrapFragment(r,e);var n=e.fontMetrics(),i=n.defaultRuleThickness,a=i;e.style.idr.height+r.depth+s&&(s=(s+d-r.height-r.depth)/2);var p=u.height-r.height-s-h;r.style.paddingLeft=gt(f);var m=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+p)},{type:"elem",elem:u},{type:"kern",size:h}]},e);if(t.index){var g=e.havingStyle(rr.SCRIPTSCRIPT),y=Pr(t.index,g,e),v=.6*(m.height-m.depth),x=Fe.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:y}]},e),b=Fe.makeSpan(["root"],[x]);return Fe.makeSpan(["mord","sqrt"],[b,m],e)}else return Fe.makeSpan(["mord","sqrt"],[m],e)},mathmlBuilder(t,e){var{body:r,index:n}=t;return n?new at.MathNode("mroot",[yn(r,e),yn(n,e)]):new at.MathNode("msqrt",[yn(r,e)])}});kG={display:rr.DISPLAY,text:rr.TEXT,script:rr.SCRIPT,scriptscript:rr.SCRIPTSCRIPT};St({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t,e){var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!0,r),s=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:s,body:a}},htmlBuilder(t,e){var r=kG[t.style],n=e.havingStyle(r).withFont("");return b$(t.body,n,e)},mathmlBuilder(t,e){var r=kG[t.style],n=e.havingStyle(r),i=Ss(t.body,n),a=new at.MathNode("mstyle",i),s={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},l=s[t.style];return a.setAttribute("scriptlevel",l[0]),a.setAttribute("displaystyle",l[1]),a}});I4e=o(function(e,r){var n=e.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===rr.DISPLAY.size||n.alwaysHandleSupSub);return i?Cp:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===rr.DISPLAY.size||n.limits);return a?x$:null}else{if(n.type==="accent")return Jt.isCharacterBox(n.base)?zC:null;if(n.type==="horizBrace"){var s=!e.sub;return s===n.isOver?g$:null}else return null}else return null},"htmlBuilderDelegate");id({type:"supsub",htmlBuilder(t,e){var r=I4e(t,e);if(r)return r(t,e);var{base:n,sup:i,sub:a}=t,s=Pr(n,e),l,u,h=e.fontMetrics(),f=0,d=0,p=n&&Jt.isCharacterBox(n);if(i){var m=e.havingStyle(e.style.sup());l=Pr(i,m,e),p||(f=s.height-m.fontMetrics().supDrop*m.sizeMultiplier/e.sizeMultiplier)}if(a){var g=e.havingStyle(e.style.sub());u=Pr(a,g,e),p||(d=s.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}var y;e.style===rr.DISPLAY?y=h.sup1:e.style.cramped?y=h.sup3:y=h.sup2;var v=e.sizeMultiplier,x=gt(.5/h.ptPerEm/v),b=null;if(u){var w=t.base&&t.base.type==="op"&&t.base.name&&(t.base.name==="\\oiint"||t.base.name==="\\oiiint");(s instanceof Es||w)&&(b=gt(-s.italic))}var _;if(l&&u){f=Math.max(f,y,l.depth+.25*h.xHeight),d=Math.max(d,h.sub2);var T=h.defaultRuleThickness,E=4*T;if(f-l.depth-(u.height-d)0&&(f+=L,d-=L)}var S=[{type:"elem",elem:u,shift:d,marginRight:x,marginLeft:b},{type:"elem",elem:l,shift:-f,marginRight:x}];_=Fe.makeVList({positionType:"individualShift",children:S},e)}else if(u){d=Math.max(d,h.sub1,u.height-.8*h.xHeight);var A=[{type:"elem",elem:u,marginLeft:b,marginRight:x}];_=Fe.makeVList({positionType:"shift",positionData:d,children:A},e)}else if(l)f=Math.max(f,y,l.depth+.25*h.xHeight),_=Fe.makeVList({positionType:"shift",positionData:-f,children:[{type:"elem",elem:l,marginRight:x}]},e);else throw new Error("supsub must have either sup or sub.");var I=SC(s,"right")||"mord";return Fe.makeSpan([I],[s,Fe.makeSpan(["msupsub"],[_])],e)},mathmlBuilder(t,e){var r=!1,n,i;t.base&&t.base.type==="horizBrace"&&(i=!!t.sup,i===t.base.isOver&&(r=!0,n=t.base.isOver)),t.base&&(t.base.type==="op"||t.base.type==="operatorname")&&(t.base.parentIsSupSub=!0);var a=[yn(t.base,e)];t.sub&&a.push(yn(t.sub,e)),t.sup&&a.push(yn(t.sup,e));var s;if(r)s=n?"mover":"munder";else if(t.sub)if(t.sup){var h=t.base;h&&h.type==="op"&&h.limits&&e.style===rr.DISPLAY||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(e.style===rr.DISPLAY||h.limits)?s="munderover":s="msubsup"}else{var u=t.base;u&&u.type==="op"&&u.limits&&(e.style===rr.DISPLAY||u.alwaysHandleSupSub)||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(u.limits||e.style===rr.DISPLAY)?s="munder":s="msub"}else{var l=t.base;l&&l.type==="op"&&l.limits&&(e.style===rr.DISPLAY||l.alwaysHandleSupSub)||l&&l.type==="operatorname"&&l.alwaysHandleSupSub&&(l.limits||e.style===rr.DISPLAY)?s="mover":s="msup"}return new at.MathNode(s,a)}});id({type:"atom",htmlBuilder(t,e){return Fe.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder(t,e){var r=new at.MathNode("mo",[Mo(t.text,t.mode)]);if(t.family==="bin"){var n=BC(t,e);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else t.family==="punct"?r.setAttribute("separator","true"):(t.family==="open"||t.family==="close")&&r.setAttribute("stretchy","false");return r}});w$={mi:"italic",mn:"normal",mtext:"normal"};id({type:"mathord",htmlBuilder(t,e){return Fe.makeOrd(t,e,"mathord")},mathmlBuilder(t,e){var r=new at.MathNode("mi",[Mo(t.text,t.mode,e)]),n=BC(t,e)||"italic";return n!==w$[r.type]&&r.setAttribute("mathvariant",n),r}});id({type:"textord",htmlBuilder(t,e){return Fe.makeOrd(t,e,"textord")},mathmlBuilder(t,e){var r=Mo(t.text,t.mode,e),n=BC(t,e)||"normal",i;return t.mode==="text"?i=new at.MathNode("mtext",[r]):/[0-9]/.test(t.text)?i=new at.MathNode("mn",[r]):t.text==="\\prime"?i=new at.MathNode("mo",[r]):i=new at.MathNode("mi",[r]),n!==w$[i.type]&&i.setAttribute("mathvariant",n),i}});vC={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},xC={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};id({type:"spacing",htmlBuilder(t,e){if(xC.hasOwnProperty(t.text)){var r=xC[t.text].className||"";if(t.mode==="text"){var n=Fe.makeOrd(t,e,"textord");return n.classes.push(r),n}else return Fe.makeSpan(["mspace",r],[Fe.mathsym(t.text,t.mode,e)],e)}else{if(vC.hasOwnProperty(t.text))return Fe.makeSpan(["mspace",vC[t.text]],[],e);throw new lt('Unknown type of space "'+t.text+'"')}},mathmlBuilder(t,e){var r;if(xC.hasOwnProperty(t.text))r=new at.MathNode("mtext",[new at.TextNode("\xA0")]);else{if(vC.hasOwnProperty(t.text))return new at.MathNode("mspace");throw new lt('Unknown type of space "'+t.text+'"')}return r}});EG=o(()=>{var t=new at.MathNode("mtd",[]);return t.setAttribute("width","50%"),t},"pad");id({type:"tag",mathmlBuilder(t,e){var r=new at.MathNode("mtable",[new at.MathNode("mtr",[EG(),new at.MathNode("mtd",[vh(t.body,e)]),EG(),new at.MathNode("mtd",[vh(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});SG={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},CG={"\\textbf":"textbf","\\textmd":"textmd"},O4e={"\\textit":"textit","\\textup":"textup"},AG=o((t,e)=>{var r=t.font;if(r){if(SG[r])return e.withTextFontFamily(SG[r]);if(CG[r])return e.withTextFontWeight(CG[r]);if(r==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(O4e[r])},"optionsWithFont");St({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"text",mode:r.mode,body:gi(i),font:n}},htmlBuilder(t,e){var r=AG(t,e),n=Fi(t.body,r,!0);return Fe.makeSpan(["mord","text"],n,r)},mathmlBuilder(t,e){var r=AG(t,e);return vh(t.body,r)}});St({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"underline",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Pr(t.body,e),n=Fe.makeLineSpan("underline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Fe.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]},e);return Fe.makeSpan(["mord","underline"],[a],e)},mathmlBuilder(t,e){var r=new at.MathNode("mo",[new at.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new at.MathNode("munder",[yn(t.body,e),r]);return n.setAttribute("accentunder","true"),n}});St({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"vcenter",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Pr(t.body,e),n=e.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return Fe.makeVList({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){return new at.MathNode("mpadded",[yn(t.body,e)],["vcenter"])}});St({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,e,r){throw new lt("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(t,e){for(var r=_G(t),n=[],i=e.havingStyle(e.style.text()),a=0;at.body.replace(/ /g,t.star?"\u2423":"\xA0"),"makeVerb"),gh=HG,T$=`[ \r + ]`,P4e="\\\\[a-zA-Z@]+",B4e="\\\\[^\uD800-\uDFFF]",F4e="("+P4e+")"+T$+"*",z4e=`\\\\( +|[ \r ]+ +?)[ \r ]*`,DC="[\u0300-\u036F]",G4e=new RegExp(DC+"+$"),$4e="("+T$+"+)|"+(z4e+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(DC+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(DC+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+F4e)+("|"+B4e+")"),A4=class{static{o(this,"Lexer")}constructor(e,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=r,this.tokenRegex=new RegExp($4e,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,r){this.catcodes[e]=r}lex(){var e=this.input,r=this.tokenRegex.lastIndex;if(r===e.length)return new Ro("EOF",new Js(this,r,r));var n=this.tokenRegex.exec(e);if(n===null||n.index!==r)throw new lt("Unexpected character: '"+e[r]+"'",new Ro(e[r],new Js(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=e.indexOf(` +`,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new Ro(i,new Js(this,r,this.tokenRegex.lastIndex))}},NC=class{static{o(this,"Namespace")}constructor(e,r){e===void 0&&(e={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new lt("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var r in e)e.hasOwnProperty(r)&&(e[r]==null?delete this.current[r]:this.current[r]=e[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}r==null?delete this.current[e]:this.current[e]=r}},V4e=h$;le("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});le("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}});le("\\@firstoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[0],numArgs:0}});le("\\@secondoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[1],numArgs:0}});le("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return e[0].length===1&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});le("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");le("\\TextOrMath",function(t){var e=t.consumeArgs(2);return t.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});LG={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};le("\\char",function(t){var e=t.popToken(),r,n="";if(e.text==="'")r=8,e=t.popToken();else if(e.text==='"')r=16,e=t.popToken();else if(e.text==="`")if(e=t.popToken(),e.text[0]==="\\")n=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new lt("\\char` missing argument");n=e.text.charCodeAt(0)}else r=10;if(r){if(n=LG[e.text],n==null||n>=r)throw new lt("Invalid base-"+r+" digit "+e.text);for(var i;(i=LG[t.future().text])!=null&&i{var n=t.consumeArg().tokens;if(n.length!==1)throw new lt("\\newcommand's first argument must be a macro name");var i=n[0].text,a=t.isDefined(i);if(a&&!e)throw new lt("\\newcommand{"+i+"} attempting to redefine "+(i+"; use \\renewcommand"));if(!a&&!r)throw new lt("\\renewcommand{"+i+"} when command "+i+" does not yet exist; use \\newcommand");var s=0;if(n=t.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var l="",u=t.expandNextToken();u.text!=="]"&&u.text!=="EOF";)l+=u.text,u=t.expandNextToken();if(!l.match(/^\s*[0-9]+\s*$/))throw new lt("Invalid number of arguments: "+l);s=parseInt(l),n=t.consumeArg().tokens}return t.macros.set(i,{tokens:n,numArgs:s}),""},"newcommand");le("\\newcommand",t=>qC(t,!1,!0));le("\\renewcommand",t=>qC(t,!0,!1));le("\\providecommand",t=>qC(t,!0,!0));le("\\message",t=>{var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(r=>r.text).join("")),""});le("\\errmessage",t=>{var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(r=>r.text).join("")),""});le("\\show",t=>{var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),gh[r],Cn.math[r],Cn.text[r]),""});le("\\bgroup","{");le("\\egroup","}");le("~","\\nobreakspace");le("\\lq","`");le("\\rq","'");le("\\aa","\\r a");le("\\AA","\\r A");le("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");le("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");le("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");le("\u212C","\\mathscr{B}");le("\u2130","\\mathscr{E}");le("\u2131","\\mathscr{F}");le("\u210B","\\mathscr{H}");le("\u2110","\\mathscr{I}");le("\u2112","\\mathscr{L}");le("\u2133","\\mathscr{M}");le("\u211B","\\mathscr{R}");le("\u212D","\\mathfrak{C}");le("\u210C","\\mathfrak{H}");le("\u2128","\\mathfrak{Z}");le("\\Bbbk","\\Bbb{k}");le("\xB7","\\cdotp");le("\\llap","\\mathllap{\\textrm{#1}}");le("\\rlap","\\mathrlap{\\textrm{#1}}");le("\\clap","\\mathclap{\\textrm{#1}}");le("\\mathstrut","\\vphantom{(}");le("\\underbar","\\underline{\\text{#1}}");le("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');le("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");le("\\ne","\\neq");le("\u2260","\\neq");le("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");le("\u2209","\\notin");le("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");le("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");le("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");le("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");le("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");le("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");le("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");le("\u27C2","\\perp");le("\u203C","\\mathclose{!\\mkern-0.8mu!}");le("\u220C","\\notni");le("\u231C","\\ulcorner");le("\u231D","\\urcorner");le("\u231E","\\llcorner");le("\u231F","\\lrcorner");le("\xA9","\\copyright");le("\xAE","\\textregistered");le("\uFE0F","\\textregistered");le("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');le("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');le("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');le("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');le("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}");le("\u22EE","\\vdots");le("\\varGamma","\\mathit{\\Gamma}");le("\\varDelta","\\mathit{\\Delta}");le("\\varTheta","\\mathit{\\Theta}");le("\\varLambda","\\mathit{\\Lambda}");le("\\varXi","\\mathit{\\Xi}");le("\\varPi","\\mathit{\\Pi}");le("\\varSigma","\\mathit{\\Sigma}");le("\\varUpsilon","\\mathit{\\Upsilon}");le("\\varPhi","\\mathit{\\Phi}");le("\\varPsi","\\mathit{\\Psi}");le("\\varOmega","\\mathit{\\Omega}");le("\\substack","\\begin{subarray}{c}#1\\end{subarray}");le("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");le("\\boxed","\\fbox{$\\displaystyle{#1}$}");le("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");le("\\implies","\\DOTSB\\;\\Longrightarrow\\;");le("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");DG={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};le("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in DG?e=DG[r]:(r.slice(0,4)==="\\not"||r in Cn.math&&Jt.contains(["bin","rel"],Cn.math[r].group))&&(e="\\dotsb"),e});XC={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};le("\\dotso",function(t){var e=t.future().text;return e in XC?"\\ldots\\,":"\\ldots"});le("\\dotsc",function(t){var e=t.future().text;return e in XC&&e!==","?"\\ldots\\,":"\\ldots"});le("\\cdots",function(t){var e=t.future().text;return e in XC?"\\@cdots\\,":"\\@cdots"});le("\\dotsb","\\cdots");le("\\dotsm","\\cdots");le("\\dotsi","\\!\\cdots");le("\\dotsx","\\ldots\\,");le("\\DOTSI","\\relax");le("\\DOTSB","\\relax");le("\\DOTSX","\\relax");le("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");le("\\,","\\tmspace+{3mu}{.1667em}");le("\\thinspace","\\,");le("\\>","\\mskip{4mu}");le("\\:","\\tmspace+{4mu}{.2222em}");le("\\medspace","\\:");le("\\;","\\tmspace+{5mu}{.2777em}");le("\\thickspace","\\;");le("\\!","\\tmspace-{3mu}{.1667em}");le("\\negthinspace","\\!");le("\\negmedspace","\\tmspace-{4mu}{.2222em}");le("\\negthickspace","\\tmspace-{5mu}{.277em}");le("\\enspace","\\kern.5em ");le("\\enskip","\\hskip.5em\\relax");le("\\quad","\\hskip1em\\relax");le("\\qquad","\\hskip2em\\relax");le("\\tag","\\@ifstar\\tag@literal\\tag@paren");le("\\tag@paren","\\tag@literal{({#1})}");le("\\tag@literal",t=>{if(t.macros.get("\\df@tag"))throw new lt("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});le("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");le("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");le("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");le("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");le("\\newline","\\\\\\relax");le("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");k$=gt(lc["Main-Regular"][84][1]-.7*lc["Main-Regular"][65][1]);le("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+k$+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");le("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+k$+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");le("\\hspace","\\@ifstar\\@hspacer\\@hspace");le("\\@hspace","\\hskip #1\\relax");le("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");le("\\ordinarycolon",":");le("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");le("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');le("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');le("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');le("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');le("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');le("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');le("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');le("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');le("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');le("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');le("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');le("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');le("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');le("\u2237","\\dblcolon");le("\u2239","\\eqcolon");le("\u2254","\\coloneqq");le("\u2255","\\eqqcolon");le("\u2A74","\\Coloneqq");le("\\ratio","\\vcentcolon");le("\\coloncolon","\\dblcolon");le("\\colonequals","\\coloneqq");le("\\coloncolonequals","\\Coloneqq");le("\\equalscolon","\\eqqcolon");le("\\equalscoloncolon","\\Eqqcolon");le("\\colonminus","\\coloneq");le("\\coloncolonminus","\\Coloneq");le("\\minuscolon","\\eqcolon");le("\\minuscoloncolon","\\Eqcolon");le("\\coloncolonapprox","\\Colonapprox");le("\\coloncolonsim","\\Colonsim");le("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");le("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");le("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");le("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");le("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");le("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");le("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");le("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");le("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");le("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");le("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");le("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");le("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");le("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");le("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");le("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");le("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");le("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");le("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");le("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");le("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");le("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");le("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");le("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");le("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");le("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");le("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");le("\\imath","\\html@mathml{\\@imath}{\u0131}");le("\\jmath","\\html@mathml{\\@jmath}{\u0237}");le("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");le("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");le("\u27E6","\\llbracket");le("\u27E7","\\rrbracket");le("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");le("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");le("\u2983","\\lBrace");le("\u2984","\\rBrace");le("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");le("\u29B5","\\minuso");le("\\darr","\\downarrow");le("\\dArr","\\Downarrow");le("\\Darr","\\Downarrow");le("\\lang","\\langle");le("\\rang","\\rangle");le("\\uarr","\\uparrow");le("\\uArr","\\Uparrow");le("\\Uarr","\\Uparrow");le("\\N","\\mathbb{N}");le("\\R","\\mathbb{R}");le("\\Z","\\mathbb{Z}");le("\\alef","\\aleph");le("\\alefsym","\\aleph");le("\\Alpha","\\mathrm{A}");le("\\Beta","\\mathrm{B}");le("\\bull","\\bullet");le("\\Chi","\\mathrm{X}");le("\\clubs","\\clubsuit");le("\\cnums","\\mathbb{C}");le("\\Complex","\\mathbb{C}");le("\\Dagger","\\ddagger");le("\\diamonds","\\diamondsuit");le("\\empty","\\emptyset");le("\\Epsilon","\\mathrm{E}");le("\\Eta","\\mathrm{H}");le("\\exist","\\exists");le("\\harr","\\leftrightarrow");le("\\hArr","\\Leftrightarrow");le("\\Harr","\\Leftrightarrow");le("\\hearts","\\heartsuit");le("\\image","\\Im");le("\\infin","\\infty");le("\\Iota","\\mathrm{I}");le("\\isin","\\in");le("\\Kappa","\\mathrm{K}");le("\\larr","\\leftarrow");le("\\lArr","\\Leftarrow");le("\\Larr","\\Leftarrow");le("\\lrarr","\\leftrightarrow");le("\\lrArr","\\Leftrightarrow");le("\\Lrarr","\\Leftrightarrow");le("\\Mu","\\mathrm{M}");le("\\natnums","\\mathbb{N}");le("\\Nu","\\mathrm{N}");le("\\Omicron","\\mathrm{O}");le("\\plusmn","\\pm");le("\\rarr","\\rightarrow");le("\\rArr","\\Rightarrow");le("\\Rarr","\\Rightarrow");le("\\real","\\Re");le("\\reals","\\mathbb{R}");le("\\Reals","\\mathbb{R}");le("\\Rho","\\mathrm{P}");le("\\sdot","\\cdot");le("\\sect","\\S");le("\\spades","\\spadesuit");le("\\sub","\\subset");le("\\sube","\\subseteq");le("\\supe","\\supseteq");le("\\Tau","\\mathrm{T}");le("\\thetasym","\\vartheta");le("\\weierp","\\wp");le("\\Zeta","\\mathrm{Z}");le("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");le("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");le("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");le("\\bra","\\mathinner{\\langle{#1}|}");le("\\ket","\\mathinner{|{#1}\\rangle}");le("\\braket","\\mathinner{\\langle{#1}\\rangle}");le("\\Bra","\\left\\langle#1\\right|");le("\\Ket","\\left|#1\\right\\rangle");E$=o(t=>e=>{var r=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,a=e.consumeArg().tokens,s=e.macros.get("|"),l=e.macros.get("\\|");e.macros.beginGroup();var u=o(d=>p=>{t&&(p.macros.set("|",s),i.length&&p.macros.set("\\|",l));var m=d;if(!d&&i.length){var g=p.future();g.text==="|"&&(p.popToken(),m=!0)}return{tokens:m?i:n,numArgs:0}},"midMacro");e.macros.set("|",u(!1)),i.length&&e.macros.set("\\|",u(!0));var h=e.consumeArg().tokens,f=e.expandTokens([...a,...h,...r]);return e.macros.endGroup(),{tokens:f.reverse(),numArgs:0}},"braketHelper");le("\\bra@ket",E$(!1));le("\\bra@set",E$(!0));le("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");le("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");le("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");le("\\angln","{\\angl n}");le("\\blue","\\textcolor{##6495ed}{#1}");le("\\orange","\\textcolor{##ffa500}{#1}");le("\\pink","\\textcolor{##ff00af}{#1}");le("\\red","\\textcolor{##df0030}{#1}");le("\\green","\\textcolor{##28ae7b}{#1}");le("\\gray","\\textcolor{gray}{#1}");le("\\purple","\\textcolor{##9d38bd}{#1}");le("\\blueA","\\textcolor{##ccfaff}{#1}");le("\\blueB","\\textcolor{##80f6ff}{#1}");le("\\blueC","\\textcolor{##63d9ea}{#1}");le("\\blueD","\\textcolor{##11accd}{#1}");le("\\blueE","\\textcolor{##0c7f99}{#1}");le("\\tealA","\\textcolor{##94fff5}{#1}");le("\\tealB","\\textcolor{##26edd5}{#1}");le("\\tealC","\\textcolor{##01d1c1}{#1}");le("\\tealD","\\textcolor{##01a995}{#1}");le("\\tealE","\\textcolor{##208170}{#1}");le("\\greenA","\\textcolor{##b6ffb0}{#1}");le("\\greenB","\\textcolor{##8af281}{#1}");le("\\greenC","\\textcolor{##74cf70}{#1}");le("\\greenD","\\textcolor{##1fab54}{#1}");le("\\greenE","\\textcolor{##0d923f}{#1}");le("\\goldA","\\textcolor{##ffd0a9}{#1}");le("\\goldB","\\textcolor{##ffbb71}{#1}");le("\\goldC","\\textcolor{##ff9c39}{#1}");le("\\goldD","\\textcolor{##e07d10}{#1}");le("\\goldE","\\textcolor{##a75a05}{#1}");le("\\redA","\\textcolor{##fca9a9}{#1}");le("\\redB","\\textcolor{##ff8482}{#1}");le("\\redC","\\textcolor{##f9685d}{#1}");le("\\redD","\\textcolor{##e84d39}{#1}");le("\\redE","\\textcolor{##bc2612}{#1}");le("\\maroonA","\\textcolor{##ffbde0}{#1}");le("\\maroonB","\\textcolor{##ff92c6}{#1}");le("\\maroonC","\\textcolor{##ed5fa6}{#1}");le("\\maroonD","\\textcolor{##ca337c}{#1}");le("\\maroonE","\\textcolor{##9e034e}{#1}");le("\\purpleA","\\textcolor{##ddd7ff}{#1}");le("\\purpleB","\\textcolor{##c6b9fc}{#1}");le("\\purpleC","\\textcolor{##aa87ff}{#1}");le("\\purpleD","\\textcolor{##7854ab}{#1}");le("\\purpleE","\\textcolor{##543b78}{#1}");le("\\mintA","\\textcolor{##f5f9e8}{#1}");le("\\mintB","\\textcolor{##edf2df}{#1}");le("\\mintC","\\textcolor{##e0e5cc}{#1}");le("\\grayA","\\textcolor{##f6f7f7}{#1}");le("\\grayB","\\textcolor{##f0f1f2}{#1}");le("\\grayC","\\textcolor{##e3e5e6}{#1}");le("\\grayD","\\textcolor{##d6d8da}{#1}");le("\\grayE","\\textcolor{##babec2}{#1}");le("\\grayF","\\textcolor{##888d93}{#1}");le("\\grayG","\\textcolor{##626569}{#1}");le("\\grayH","\\textcolor{##3b3e40}{#1}");le("\\grayI","\\textcolor{##21242c}{#1}");le("\\kaBlue","\\textcolor{##314453}{#1}");le("\\kaGreen","\\textcolor{##71B307}{#1}");S$={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},RC=class{static{o(this,"MacroExpander")}constructor(e,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(e),this.macros=new NC(V4e,r.macros),this.mode=n,this.stack=[]}feed(e){this.lexer=new A4(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var r,n,i;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new Ro("EOF",n.loc)),this.pushTokens(i),r.range(n,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var r=[],n=e&&e.length>0;n||this.consumeSpaces();var i=this.future(),a,s=0,l=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++s;else if(a.text==="}"){if(--s,s===-1)throw new lt("Extra }",a)}else if(a.text==="EOF")throw new lt("Unexpected end of input in a macro argument, expected '"+(e&&n?e[l]:"}")+"'",a);if(e&&n)if((s===0||s===1&&e[l]==="{")&&a.text===e[l]){if(++l,l===e.length){r.splice(-l,l);break}}else l=0}while(s!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(e,r){if(r){if(r.length!==e+1)throw new lt("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new lt("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||e&&i.unexpandable){if(e&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new lt("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,s=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var l=a.length-1;l>=0;--l){var u=a[l];if(u.text==="#"){if(l===0)throw new lt("Incomplete placeholder at end of macro body",u);if(u=a[--l],u.text==="#")a.splice(l+1,1);else if(/^[1-9]$/.test(u.text))a.splice(l,2,...s[+u.text-1]);else throw new lt("Not a valid argument number",u)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Ro(e)]):void 0}expandTokens(e){var r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(e){var r=this.expandMacro(e);return r&&r.map(n=>n.text).join("")}_getExpansion(e){var r=this.macros.get(e);if(r==null)return r;if(e.length===1){var n=this.lexer.catcodes[e];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.indexOf("#")!==-1)for(var s=i.replace(/##/g,"");s.indexOf("#"+(a+1))!==-1;)++a;for(var l=new A4(i,this.settings),u=[],h=l.lex();h.text!=="EOF";)u.push(h),h=l.lex();u.reverse();var f={tokens:u,numArgs:a};return f}return i}isDefined(e){return this.macros.has(e)||gh.hasOwnProperty(e)||Cn.math.hasOwnProperty(e)||Cn.text.hasOwnProperty(e)||S$.hasOwnProperty(e)}isExpandable(e){var r=this.macros.get(e);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:gh.hasOwnProperty(e)&&!gh[e].primitive}},NG=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,v4=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),bC={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},RG={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},_4=class t{static{o(this,"Parser")}constructor(e,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new RC(e,r,this.mode),this.settings=r,this.leftrightDepth=0}expect(e,r){if(r===void 0&&(r=!0),this.fetch().text!==e)throw new lt("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var r=this.nextToken;this.consume(),this.gullet.pushToken(new Ro("}")),this.gullet.pushTokens(e);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(e,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(t.endOfExpression.indexOf(i.text)!==-1||r&&i.text===r||e&&gh[i.text]&&gh[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(e){for(var r=-1,n,i=0;i=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+r[0]+'" used in math mode',e);var l=Cn[this.mode][r].group,u=Js.range(e),h;if(Mbe.hasOwnProperty(l)){var f=l;h={type:"atom",mode:this.mode,family:f,loc:u,text:r}}else h={type:l,mode:this.mode,loc:u,text:r};s=h}else if(r.charCodeAt(0)>=128)this.settings.strict&&(IG(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),e)),s={type:"textord",mode:"text",loc:Js.range(e),text:r};else return null;if(this.consume(),a)for(var d=0;d{e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),Ap.default.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}var Ap,ad,q4e,X4e,R$,D$,kr,K4e,Q4e,Z4e,J4e,M$,e3e,xr,t3e,r3e,yu,QC,n3e,i3e,N$,ZC,yi,sd,bh,qe,fr=M(()=>{"use strict";Ap=Ji(lC(),1),ad=//gi,q4e=o(t=>t?M$(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),X4e=(()=>{let t=!1;return()=>{t||(j4e(),t=!0)}})();o(j4e,"setupDompurifyHooks");R$=o(t=>(X4e(),Ap.default.sanitize(t)),"removeScript"),D$=o((t,e)=>{if(e.flowchart?.htmlLabels!==!1){let r=e.securityLevel;r==="antiscript"||r==="strict"?t=R$(t):r!=="loose"&&(t=M$(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=J4e(t))}return t},"sanitizeMore"),kr=o((t,e)=>t&&(e.dompurifyConfig?t=Ap.default.sanitize(D$(t,e),e.dompurifyConfig).toString():t=Ap.default.sanitize(D$(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),K4e=o((t,e)=>typeof t=="string"?kr(t,e):t.flat().map(r=>kr(r,e)),"sanitizeTextOrArray"),Q4e=o(t=>ad.test(t),"hasBreaks"),Z4e=o(t=>t.split(ad),"splitBreaks"),J4e=o(t=>t.replace(/#br#/g,"
    "),"placeholderToBreak"),M$=o(t=>t.replace(ad,"#br#"),"breakToPlaceholder"),e3e=o(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=e.replaceAll(/\(/g,"\\("),e=e.replaceAll(/\)/g,"\\)")),e},"getUrl"),xr=o(t=>!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),t3e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.max(...e)},"getMax"),r3e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.min(...e)},"getMin"),yu=o(function(t){let e=t.split(/(,)/),r=[];for(let n=0;n0&&n+1Math.max(0,t.split(e).length-1),"countOccurrence"),n3e=o((t,e)=>{let r=QC(t,"~"),n=QC(e,"~");return r===1&&n===1},"shouldCombineSets"),i3e=o(t=>{let e=QC(t,"~"),r=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),r=!0);let n=[...t],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;i!==-1&&a!==-1&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),N$=o(()=>window.MathMLElement!==void 0,"isMathMLSupported"),ZC=/\$\$(.*)\$\$/g,yi=o(t=>(t.match(ZC)?.length??0)>0,"hasKatex"),sd=o(async(t,e)=>{t=await bh(t,e);let r=document.createElement("div");r.innerHTML=t,r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r);let i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),bh=o(async(t,e)=>{if(!yi(t))return t;if(!(N$()||e.legacyMathML||e.forceLegacyMathML))return t.replace(ZC,"MathML is unsupported in this environment.");let{default:r}=await Promise.resolve().then(()=>(L$(),_$)),n=e.forceLegacyMathML||!N$()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(ad).map(i=>yi(i)?`
    ${i}
    `:`
    ${i}
    `).join("").replace(ZC,(i,a)=>r.renderToString(a,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))},"renderKatex"),qe={getRows:q4e,sanitizeText:kr,sanitizeTextOrArray:K4e,hasBreaks:Q4e,splitBreaks:Z4e,lineBreakRegex:ad,removeScript:R$,getUrl:e3e,evaluate:xr,getMax:t3e,getMin:r3e}});var a3e,s3e,Zr,Io,ai=M(()=>{"use strict";ut();a3e=o(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),s3e=o(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),Zr=o(function(t,e,r,n){let i=s3e(e,r,n);a3e(t,i)},"configureSvgSize"),Io=o(function(t,e,r,n){let i=e.node().getBBox(),a=i.width,s=i.height;Y.info(`SVG bounds: ${a}x${s}`,i);let l=0,u=0;Y.info(`Graph bounds: ${l}x${u}`,t),l=a+r*2,u=s+r*2,Y.info(`Calculated bounds: ${l}x${u}`),Zr(e,u,l,n);let h=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",h)},"setupGraphViewbox")});var O4,o3e,I$,O$,JC=M(()=>{"use strict";ut();O4={},o3e=o((t,e,r)=>{let n="";return t in O4&&O4[t]?n=O4[t](r):Y.warn(`No theme found for ${t}`),` & { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + fill: ${r.textColor} + } + + /* Classes common for multiple diagrams */ + + & .error-icon { + fill: ${r.errorBkgColor}; + } + & .error-text { + fill: ${r.errorTextColor}; + stroke: ${r.errorTextColor}; + } + + & .edge-thickness-normal { + stroke-width: 1px; + } + & .edge-thickness-thick { + stroke-width: 3.5px + } + & .edge-pattern-solid { + stroke-dasharray: 0; + } + & .edge-thickness-invisible { + stroke-width: 0; + fill: none; + } + & .edge-pattern-dashed{ + stroke-dasharray: 3; + } + .edge-pattern-dotted { + stroke-dasharray: 2; + } + + & .marker { + fill: ${r.lineColor}; + stroke: ${r.lineColor}; + } + & .marker.cross { + stroke: ${r.lineColor}; + } + + & svg { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + } + & p { + margin: 0 + } + + ${n} + + ${e} +`},"getStyles"),I$=o((t,e)=>{e!==void 0&&(O4[t]=e)},"addStylesForDiagram"),O$=o3e});var xy={};vr(xy,{clear:()=>Lr,getAccDescription:()=>zr,getAccTitle:()=>Br,getDiagramTitle:()=>Jr,setAccDescription:()=>Fr,setAccTitle:()=>Mr,setDiagramTitle:()=>cn});var e7,t7,r7,n7,Lr,Mr,Br,Fr,zr,cn,Jr,Ai=M(()=>{"use strict";fr();Za();e7="",t7="",r7="",n7=o(t=>kr(t,Cr()),"sanitizeText"),Lr=o(()=>{e7="",r7="",t7=""},"clear"),Mr=o(t=>{e7=n7(t).replace(/^\s+/g,"")},"setAccTitle"),Br=o(()=>e7,"getAccTitle"),Fr=o(t=>{r7=n7(t).replace(/\n\s+/g,` +`)},"setAccDescription"),zr=o(()=>r7,"getAccDescription"),cn=o(t=>{t7=n7(t)},"setDiagramTitle"),Jr=o(()=>t7,"getDiagramTitle")});var P$,l3e,pe,a7,B4,s7,o7,c3e,P4,od,by,i7,Vt=M(()=>{"use strict";Zf();ut();Za();fr();ai();JC();Ai();P$=Y,l3e=J1,pe=Cr,a7=o4,B4=ph,s7=o(t=>kr(t,pe()),"sanitizeText"),o7=Io,c3e=o(()=>xy,"getCommonDb"),P4={},od=o((t,e,r)=>{P4[t]&&P$.warn(`Diagram with id ${t} already registered. Overwriting.`),P4[t]=e,r&&VS(t,r),I$(t,e.styles),e.injectUtils?.(P$,l3e,pe,s7,o7,c3e(),()=>{})},"registerDiagram"),by=o(t=>{if(t in P4)return P4[t];throw new i7(t)},"getDiagram"),i7=class extends Error{static{o(this,"DiagramNotFoundError")}constructor(e){super(`Diagram ${e} not found.`)}}});var bl,wh,ts,xl,dc,wy,l7,c7,F4,z4,B$,u3e,h3e,f3e,d3e,p3e,m3e,g3e,y3e,v3e,x3e,b3e,w3e,T3e,k3e,E3e,S3e,C3e,F$,A3e,_3e,z$,L3e,D3e,N3e,R3e,Th,M3e,I3e,O3e,P3e,B3e,Ty,u7=M(()=>{"use strict";Vt();fr();Ai();bl=[],wh=[""],ts="global",xl="",dc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],wy=[],l7="",c7=!1,F4=4,z4=2,u3e=o(function(){return B$},"getC4Type"),h3e=o(function(t){B$=kr(t,pe())},"setC4Type"),f3e=o(function(t,e,r,n,i,a,s,l,u){if(t==null||e===void 0||e===null||r===void 0||r===null||n===void 0||n===null)return;let h={},f=wy.find(d=>d.from===e&&d.to===r);if(f?h=f:wy.push(h),h.type=t,h.from=e,h.to=r,h.label={text:n},i==null)h.techn={text:""};else if(typeof i=="object"){let[d,p]=Object.entries(i)[0];h[d]={text:p}}else h.techn={text:i};if(a==null)h.descr={text:""};else if(typeof a=="object"){let[d,p]=Object.entries(a)[0];h[d]={text:p}}else h.descr={text:a};if(typeof s=="object"){let[d,p]=Object.entries(s)[0];h[d]=p}else h.sprite=s;if(typeof l=="object"){let[d,p]=Object.entries(l)[0];h[d]=p}else h.tags=l;if(typeof u=="object"){let[d,p]=Object.entries(u)[0];h[d]=p}else h.link=u;h.wrap=Th()},"addRel"),d3e=o(function(t,e,r,n,i,a,s){if(e===null||r===null)return;let l={},u=bl.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,bl.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.descr={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.descr={text:n};if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]=f}else l.sprite=i;if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.tags=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.link=s;l.typeC4Shape={text:t},l.parentBoundary=ts,l.wrap=Th()},"addPersonOrSystem"),p3e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=bl.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,bl.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Th(),u.typeC4Shape={text:t},u.parentBoundary=ts},"addContainer"),m3e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=bl.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,bl.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Th(),u.typeC4Shape={text:t},u.parentBoundary=ts},"addComponent"),g3e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=dc.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,dc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"system"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=ts,a.wrap=Th(),xl=ts,ts=t,wh.push(xl)},"addPersonOrSystemBoundary"),y3e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=dc.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,dc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"container"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=ts,a.wrap=Th(),xl=ts,ts=t,wh.push(xl)},"addContainerBoundary"),v3e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=dc.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,dc.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.type={text:"node"};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.type={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.nodeType=t,u.parentBoundary=ts,u.wrap=Th(),xl=ts,ts=e,wh.push(xl)},"addDeploymentNode"),x3e=o(function(){ts=xl,wh.pop(),xl=wh.pop(),wh.push(xl)},"popBoundaryParseStack"),b3e=o(function(t,e,r,n,i,a,s,l,u,h,f){let d=bl.find(p=>p.alias===e);if(!(d===void 0&&(d=dc.find(p=>p.alias===e),d===void 0))){if(r!=null)if(typeof r=="object"){let[p,m]=Object.entries(r)[0];d[p]=m}else d.bgColor=r;if(n!=null)if(typeof n=="object"){let[p,m]=Object.entries(n)[0];d[p]=m}else d.fontColor=n;if(i!=null)if(typeof i=="object"){let[p,m]=Object.entries(i)[0];d[p]=m}else d.borderColor=i;if(a!=null)if(typeof a=="object"){let[p,m]=Object.entries(a)[0];d[p]=m}else d.shadowing=a;if(s!=null)if(typeof s=="object"){let[p,m]=Object.entries(s)[0];d[p]=m}else d.shape=s;if(l!=null)if(typeof l=="object"){let[p,m]=Object.entries(l)[0];d[p]=m}else d.sprite=l;if(u!=null)if(typeof u=="object"){let[p,m]=Object.entries(u)[0];d[p]=m}else d.techn=u;if(h!=null)if(typeof h=="object"){let[p,m]=Object.entries(h)[0];d[p]=m}else d.legendText=h;if(f!=null)if(typeof f=="object"){let[p,m]=Object.entries(f)[0];d[p]=m}else d.legendSprite=f}},"updateElStyle"),w3e=o(function(t,e,r,n,i,a,s){let l=wy.find(u=>u.from===e&&u.to===r);if(l!==void 0){if(n!=null)if(typeof n=="object"){let[u,h]=Object.entries(n)[0];l[u]=h}else l.textColor=n;if(i!=null)if(typeof i=="object"){let[u,h]=Object.entries(i)[0];l[u]=h}else l.lineColor=i;if(a!=null)if(typeof a=="object"){let[u,h]=Object.entries(a)[0];l[u]=parseInt(h)}else l.offsetX=parseInt(a);if(s!=null)if(typeof s=="object"){let[u,h]=Object.entries(s)[0];l[u]=parseInt(h)}else l.offsetY=parseInt(s)}},"updateRelStyle"),T3e=o(function(t,e,r){let n=F4,i=z4;if(typeof e=="object"){let a=Object.values(e)[0];n=parseInt(a)}else n=parseInt(e);if(typeof r=="object"){let a=Object.values(r)[0];i=parseInt(a)}else i=parseInt(r);n>=1&&(F4=n),i>=1&&(z4=i)},"updateLayoutConfig"),k3e=o(function(){return F4},"getC4ShapeInRow"),E3e=o(function(){return z4},"getC4BoundaryInRow"),S3e=o(function(){return ts},"getCurrentBoundaryParse"),C3e=o(function(){return xl},"getParentBoundaryParse"),F$=o(function(t){return t==null?bl:bl.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),A3e=o(function(t){return bl.find(e=>e.alias===t)},"getC4Shape"),_3e=o(function(t){return Object.keys(F$(t))},"getC4ShapeKeys"),z$=o(function(t){return t==null?dc:dc.filter(e=>e.parentBoundary===t)},"getBoundaries"),L3e=z$,D3e=o(function(){return wy},"getRels"),N3e=o(function(){return l7},"getTitle"),R3e=o(function(t){c7=t},"setWrap"),Th=o(function(){return c7},"autoWrap"),M3e=o(function(){bl=[],dc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],xl="",ts="global",wh=[""],wy=[],wh=[""],l7="",c7=!1,F4=4,z4=2},"clear"),I3e={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},O3e={FILLED:0,OPEN:1},P3e={LEFTOF:0,RIGHTOF:1,OVER:2},B3e=o(function(t){l7=kr(t,pe())},"setTitle"),Ty={addPersonOrSystem:d3e,addPersonOrSystemBoundary:g3e,addContainer:p3e,addContainerBoundary:y3e,addComponent:m3e,addDeploymentNode:v3e,popBoundaryParseStack:x3e,addRel:f3e,updateElStyle:b3e,updateRelStyle:w3e,updateLayoutConfig:T3e,autoWrap:Th,setWrap:R3e,getC4ShapeArray:F$,getC4Shape:A3e,getC4ShapeKeys:_3e,getBoundaries:z$,getBoundarys:L3e,getCurrentBoundaryParse:S3e,getParentBoundaryParse:C3e,getRels:D3e,getTitle:N3e,getC4Type:u3e,getC4ShapeInRow:k3e,getC4BoundaryInRow:E3e,setAccTitle:Mr,getAccTitle:Br,getAccDescription:zr,setAccDescription:Fr,getConfig:o(()=>pe().c4,"getConfig"),clear:M3e,LINETYPE:I3e,ARROWTYPE:O3e,PLACEMENT:P3e,setTitle:B3e,setC4Type:h3e}});function ld(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}var h7=M(()=>{"use strict";o(ld,"ascending")});function f7(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}var G$=M(()=>{"use strict";o(f7,"descending")});function cd(t){let e,r,n;t.length!==2?(e=ld,r=o((l,u)=>ld(t(l),u),"compare2"),n=o((l,u)=>t(l)-u,"delta")):(e=t===ld||t===f7?t:F3e,r=t,n=t);function i(l,u,h=0,f=l.length){if(h>>1;r(l[d],u)<0?h=d+1:f=d}while(h>>1;r(l[d],u)<=0?h=d+1:f=d}while(hh&&n(l[d-1],u)>-n(l[d],u)?d-1:d}return o(s,"center"),{left:i,center:s,right:a}}function F3e(){return 0}var d7=M(()=>{"use strict";h7();G$();o(cd,"bisector");o(F3e,"zero")});function p7(t){return t===null?NaN:+t}var $$=M(()=>{"use strict";o(p7,"number")});var V$,U$,z3e,G3e,m7,H$=M(()=>{"use strict";h7();d7();$$();V$=cd(ld),U$=V$.right,z3e=V$.left,G3e=cd(p7).center,m7=U$});function W$({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function $3e({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function V3e({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function U3e(t){return t!==null&&typeof t=="object"?t.valueOf():t}var _p,Y$=M(()=>{"use strict";_p=class extends Map{static{o(this,"InternMap")}constructor(e,r=U3e){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(W$(this,e))}has(e){return super.has(W$(this,e))}set(e,r){return super.set($3e(this,e),r)}delete(e){return super.delete(V3e(this,e))}};o(W$,"intern_get");o($3e,"intern_set");o(V3e,"intern_delete");o(U3e,"keyof")});function G4(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=a>=H3e?10:a>=W3e?5:a>=Y3e?2:1,l,u,h;return i<0?(h=Math.pow(10,-i)/s,l=Math.round(t*h),u=Math.round(e*h),l/he&&--u,h=-h):(h=Math.pow(10,i)*s,l=Math.round(t/h),u=Math.round(e/h),l*he&&--u),u0))return[];if(t===e)return[t];let n=e=i))return[];let l=a-i+1,u=new Array(l);if(n)if(s<0)for(let h=0;h{"use strict";H3e=Math.sqrt(50),W3e=Math.sqrt(10),Y3e=Math.sqrt(2);o(G4,"tickSpec");o($4,"ticks");o(ky,"tickIncrement");o(Lp,"tickStep")});function V4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var X$=M(()=>{"use strict";o(V4,"max")});function U4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var j$=M(()=>{"use strict";o(U4,"min")});function H4(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,a=new Array(i);++n{"use strict";o(H4,"range")});var kh=M(()=>{"use strict";H$();d7();X$();j$();K$();q$();Y$()});function g7(t){return t}var Q$=M(()=>{"use strict";o(g7,"default")});function q3e(t){return"translate("+t+",0)"}function X3e(t){return"translate(0,"+t+")"}function j3e(t){return e=>+t(e)}function K3e(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function Q3e(){return!this.__axis}function J$(t,e){var r=[],n=null,i=null,a=6,s=6,l=3,u=typeof window<"u"&&window.devicePixelRatio>1?0:.5,h=t===Y4||t===W4?-1:1,f=t===W4||t===y7?"x":"y",d=t===Y4||t===v7?q3e:X3e;function p(m){var g=n??(e.ticks?e.ticks.apply(e,r):e.domain()),y=i??(e.tickFormat?e.tickFormat.apply(e,r):g7),v=Math.max(a,0)+l,x=e.range(),b=+x[0]+u,w=+x[x.length-1]+u,_=(e.bandwidth?K3e:j3e)(e.copy(),u),T=m.selection?m.selection():m,E=T.selectAll(".domain").data([null]),L=T.selectAll(".tick").data(g,e).order(),S=L.exit(),A=L.enter().append("g").attr("class","tick"),I=L.select("line"),D=L.select("text");E=E.merge(E.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),L=L.merge(A),I=I.merge(A.append("line").attr("stroke","currentColor").attr(f+"2",h*a)),D=D.merge(A.append("text").attr("fill","currentColor").attr(f,h*v).attr("dy",t===Y4?"0em":t===v7?"0.71em":"0.32em")),m!==T&&(E=E.transition(m),L=L.transition(m),I=I.transition(m),D=D.transition(m),S=S.transition(m).attr("opacity",Z$).attr("transform",function(k){return isFinite(k=_(k))?d(k+u):this.getAttribute("transform")}),A.attr("opacity",Z$).attr("transform",function(k){var R=this.parentNode.__axis;return d((R&&isFinite(R=R(k))?R:_(k))+u)})),S.remove(),E.attr("d",t===W4||t===y7?s?"M"+h*s+","+b+"H"+u+"V"+w+"H"+h*s:"M"+u+","+b+"V"+w:s?"M"+b+","+h*s+"V"+u+"H"+w+"V"+h*s:"M"+b+","+u+"H"+w),L.attr("opacity",1).attr("transform",function(k){return d(_(k)+u)}),I.attr(f+"2",h*a),D.attr(f,h*v).text(y),T.filter(Q3e).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===y7?"start":t===W4?"end":"middle"),T.each(function(){this.__axis=_})}return o(p,"axis"),p.scale=function(m){return arguments.length?(e=m,p):e},p.ticks=function(){return r=Array.from(arguments),p},p.tickArguments=function(m){return arguments.length?(r=m==null?[]:Array.from(m),p):r.slice()},p.tickValues=function(m){return arguments.length?(n=m==null?null:Array.from(m),p):n&&n.slice()},p.tickFormat=function(m){return arguments.length?(i=m,p):i},p.tickSize=function(m){return arguments.length?(a=s=+m,p):a},p.tickSizeInner=function(m){return arguments.length?(a=+m,p):a},p.tickSizeOuter=function(m){return arguments.length?(s=+m,p):s},p.tickPadding=function(m){return arguments.length?(l=+m,p):l},p.offset=function(m){return arguments.length?(u=+m,p):u},p}function x7(t){return J$(Y4,t)}function b7(t){return J$(v7,t)}var Y4,y7,v7,W4,Z$,eV=M(()=>{"use strict";Q$();Y4=1,y7=2,v7=3,W4=4,Z$=1e-6;o(q3e,"translateX");o(X3e,"translateY");o(j3e,"number");o(K3e,"center");o(Q3e,"entering");o(J$,"axis");o(x7,"axisTop");o(b7,"axisBottom")});var tV=M(()=>{"use strict";eV()});function nV(){for(var t=0,e=arguments.length,r={},n;t=0&&(n=r.slice(i+1),r=r.slice(0,i)),r&&!e.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:n}})}function e5e(t,e){for(var r=0,n=t.length,i;r{"use strict";Z3e={value:o(()=>{},"value")};o(nV,"dispatch");o(q4,"Dispatch");o(J3e,"parseTypenames");q4.prototype=nV.prototype={constructor:q4,on:o(function(t,e){var r=this._,n=J3e(t+"",r),i,a=-1,s=n.length;if(arguments.length<2){for(;++a0)for(var r=new Array(i),n=0,i,a;n{"use strict";iV()});var X4,k7,E7=M(()=>{"use strict";X4="http://www.w3.org/1999/xhtml",k7={svg:"http://www.w3.org/2000/svg",xhtml:X4,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function pc(t){var e=t+="",r=e.indexOf(":");return r>=0&&(e=t.slice(0,r))!=="xmlns"&&(t=t.slice(r+1)),k7.hasOwnProperty(e)?{space:k7[e],local:t}:t}var j4=M(()=>{"use strict";E7();o(pc,"default")});function t5e(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===X4&&e.documentElement.namespaceURI===X4?e.createElement(t):e.createElementNS(r,t)}}function r5e(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Ey(t){var e=pc(t);return(e.local?r5e:t5e)(e)}var S7=M(()=>{"use strict";j4();E7();o(t5e,"creatorInherit");o(r5e,"creatorFixed");o(Ey,"default")});function n5e(){}function Eh(t){return t==null?n5e:function(){return this.querySelector(t)}}var K4=M(()=>{"use strict";o(n5e,"none");o(Eh,"default")});function C7(t){typeof t!="function"&&(t=Eh(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";wl();K4();o(C7,"default")});function A7(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}var sV=M(()=>{"use strict";o(A7,"array")});function i5e(){return[]}function Dp(t){return t==null?i5e:function(){return this.querySelectorAll(t)}}var _7=M(()=>{"use strict";o(i5e,"empty");o(Dp,"default")});function a5e(t){return function(){return A7(t.apply(this,arguments))}}function L7(t){typeof t=="function"?t=a5e(t):t=Dp(t);for(var e=this._groups,r=e.length,n=[],i=[],a=0;a{"use strict";wl();sV();_7();o(a5e,"arrayAll");o(L7,"default")});function Np(t){return function(){return this.matches(t)}}function Q4(t){return function(e){return e.matches(t)}}var Sy=M(()=>{"use strict";o(Np,"default");o(Q4,"childMatcher")});function o5e(t){return function(){return s5e.call(this.children,t)}}function l5e(){return this.firstElementChild}function D7(t){return this.select(t==null?l5e:o5e(typeof t=="function"?t:Q4(t)))}var s5e,lV=M(()=>{"use strict";Sy();s5e=Array.prototype.find;o(o5e,"childFind");o(l5e,"childFirst");o(D7,"default")});function u5e(){return Array.from(this.children)}function h5e(t){return function(){return c5e.call(this.children,t)}}function N7(t){return this.selectAll(t==null?u5e:h5e(typeof t=="function"?t:Q4(t)))}var c5e,cV=M(()=>{"use strict";Sy();c5e=Array.prototype.filter;o(u5e,"children");o(h5e,"childrenFilter");o(N7,"default")});function R7(t){typeof t!="function"&&(t=Np(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";wl();Sy();o(R7,"default")});function Cy(t){return new Array(t.length)}var M7=M(()=>{"use strict";o(Cy,"default")});function I7(){return new si(this._enter||this._groups.map(Cy),this._parents)}function Ay(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}var O7=M(()=>{"use strict";M7();wl();o(I7,"default");o(Ay,"EnterNode");Ay.prototype={constructor:Ay,appendChild:o(function(t){return this._parent.insertBefore(t,this._next)},"appendChild"),insertBefore:o(function(t,e){return this._parent.insertBefore(t,e)},"insertBefore"),querySelector:o(function(t){return this._parent.querySelector(t)},"querySelector"),querySelectorAll:o(function(t){return this._parent.querySelectorAll(t)},"querySelectorAll")}});function P7(t){return function(){return t}}var hV=M(()=>{"use strict";o(P7,"default")});function f5e(t,e,r,n,i,a){for(var s=0,l,u=e.length,h=a.length;s=w&&(w=b+1);!(T=v[w])&&++w{"use strict";wl();O7();hV();o(f5e,"bindIndex");o(d5e,"bindKey");o(p5e,"datum");o(B7,"default");o(m5e,"arraylike")});function F7(){return new si(this._exit||this._groups.map(Cy),this._parents)}var dV=M(()=>{"use strict";M7();wl();o(F7,"default")});function z7(t,e,r){var n=this.enter(),i=this,a=this.exit();return typeof t=="function"?(n=t(n),n&&(n=n.selection())):n=n.append(t+""),e!=null&&(i=e(i),i&&(i=i.selection())),r==null?a.remove():r(a),n&&i?n.merge(i).order():i}var pV=M(()=>{"use strict";o(z7,"default")});function G7(t){for(var e=t.selection?t.selection():t,r=this._groups,n=e._groups,i=r.length,a=n.length,s=Math.min(i,a),l=new Array(i),u=0;u{"use strict";wl();o(G7,"default")});function $7(){for(var t=this._groups,e=-1,r=t.length;++e=0;)(s=n[i])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}var gV=M(()=>{"use strict";o($7,"default")});function V7(t){t||(t=g5e);function e(d,p){return d&&p?t(d.__data__,p.__data__):!d-!p}o(e,"compareNode");for(var r=this._groups,n=r.length,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var yV=M(()=>{"use strict";wl();o(V7,"default");o(g5e,"ascending")});function U7(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}var vV=M(()=>{"use strict";o(U7,"default")});function H7(){return Array.from(this)}var xV=M(()=>{"use strict";o(H7,"default")});function W7(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(W7,"default")});function Y7(){let t=0;for(let e of this)++t;return t}var wV=M(()=>{"use strict";o(Y7,"default")});function q7(){return!this.node()}var TV=M(()=>{"use strict";o(q7,"default")});function X7(t){for(var e=this._groups,r=0,n=e.length;r{"use strict";o(X7,"default")});function y5e(t){return function(){this.removeAttribute(t)}}function v5e(t){return function(){this.removeAttributeNS(t.space,t.local)}}function x5e(t,e){return function(){this.setAttribute(t,e)}}function b5e(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function w5e(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttribute(t):this.setAttribute(t,r)}}function T5e(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function j7(t,e){var r=pc(t);if(arguments.length<2){var n=this.node();return r.local?n.getAttributeNS(r.space,r.local):n.getAttribute(r)}return this.each((e==null?r.local?v5e:y5e:typeof e=="function"?r.local?T5e:w5e:r.local?b5e:x5e)(r,e))}var EV=M(()=>{"use strict";j4();o(y5e,"attrRemove");o(v5e,"attrRemoveNS");o(x5e,"attrConstant");o(b5e,"attrConstantNS");o(w5e,"attrFunction");o(T5e,"attrFunctionNS");o(j7,"default")});function _y(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}var K7=M(()=>{"use strict";o(_y,"default")});function k5e(t){return function(){this.style.removeProperty(t)}}function E5e(t,e,r){return function(){this.style.setProperty(t,e,r)}}function S5e(t,e,r){return function(){var n=e.apply(this,arguments);n==null?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function Q7(t,e,r){return arguments.length>1?this.each((e==null?k5e:typeof e=="function"?S5e:E5e)(t,e,r??"")):Sh(this.node(),t)}function Sh(t,e){return t.style.getPropertyValue(e)||_y(t).getComputedStyle(t,null).getPropertyValue(e)}var Z7=M(()=>{"use strict";K7();o(k5e,"styleRemove");o(E5e,"styleConstant");o(S5e,"styleFunction");o(Q7,"default");o(Sh,"styleValue")});function C5e(t){return function(){delete this[t]}}function A5e(t,e){return function(){this[t]=e}}function _5e(t,e){return function(){var r=e.apply(this,arguments);r==null?delete this[t]:this[t]=r}}function J7(t,e){return arguments.length>1?this.each((e==null?C5e:typeof e=="function"?_5e:A5e)(t,e)):this.node()[t]}var SV=M(()=>{"use strict";o(C5e,"propertyRemove");o(A5e,"propertyConstant");o(_5e,"propertyFunction");o(J7,"default")});function CV(t){return t.trim().split(/^|\s+/)}function eA(t){return t.classList||new AV(t)}function AV(t){this._node=t,this._names=CV(t.getAttribute("class")||"")}function _V(t,e){for(var r=eA(t),n=-1,i=e.length;++n{"use strict";o(CV,"classArray");o(eA,"classList");o(AV,"ClassList");AV.prototype={add:o(function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:o(function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:o(function(t){return this._names.indexOf(t)>=0},"contains")};o(_V,"classedAdd");o(LV,"classedRemove");o(L5e,"classedTrue");o(D5e,"classedFalse");o(N5e,"classedFunction");o(tA,"default")});function R5e(){this.textContent=""}function M5e(t){return function(){this.textContent=t}}function I5e(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function rA(t){return arguments.length?this.each(t==null?R5e:(typeof t=="function"?I5e:M5e)(t)):this.node().textContent}var NV=M(()=>{"use strict";o(R5e,"textRemove");o(M5e,"textConstant");o(I5e,"textFunction");o(rA,"default")});function O5e(){this.innerHTML=""}function P5e(t){return function(){this.innerHTML=t}}function B5e(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function nA(t){return arguments.length?this.each(t==null?O5e:(typeof t=="function"?B5e:P5e)(t)):this.node().innerHTML}var RV=M(()=>{"use strict";o(O5e,"htmlRemove");o(P5e,"htmlConstant");o(B5e,"htmlFunction");o(nA,"default")});function F5e(){this.nextSibling&&this.parentNode.appendChild(this)}function iA(){return this.each(F5e)}var MV=M(()=>{"use strict";o(F5e,"raise");o(iA,"default")});function z5e(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function aA(){return this.each(z5e)}var IV=M(()=>{"use strict";o(z5e,"lower");o(aA,"default")});function sA(t){var e=typeof t=="function"?t:Ey(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}var OV=M(()=>{"use strict";S7();o(sA,"default")});function G5e(){return null}function oA(t,e){var r=typeof t=="function"?t:Ey(t),n=e==null?G5e:typeof e=="function"?e:Eh(e);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var PV=M(()=>{"use strict";S7();K4();o(G5e,"constantNull");o(oA,"default")});function $5e(){var t=this.parentNode;t&&t.removeChild(this)}function lA(){return this.each($5e)}var BV=M(()=>{"use strict";o($5e,"remove");o(lA,"default")});function V5e(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function U5e(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function cA(t){return this.select(t?U5e:V5e)}var FV=M(()=>{"use strict";o(V5e,"selection_cloneShallow");o(U5e,"selection_cloneDeep");o(cA,"default")});function uA(t){return arguments.length?this.property("__data__",t):this.node().__data__}var zV=M(()=>{"use strict";o(uA,"default")});function H5e(t){return function(e){t.call(this,e,this.__data__)}}function W5e(t){return t.trim().split(/^|\s+/).map(function(e){var r="",n=e.indexOf(".");return n>=0&&(r=e.slice(n+1),e=e.slice(0,n)),{type:e,name:r}})}function Y5e(t){return function(){var e=this.__on;if(e){for(var r=0,n=-1,i=e.length,a;r{"use strict";o(H5e,"contextListener");o(W5e,"parseTypenames");o(Y5e,"onRemove");o(q5e,"onAdd");o(hA,"default")});function $V(t,e,r){var n=_y(t),i=n.CustomEvent;typeof i=="function"?i=new i(e,r):(i=n.document.createEvent("Event"),r?(i.initEvent(e,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(e,!1,!1)),t.dispatchEvent(i)}function X5e(t,e){return function(){return $V(this,t,e)}}function j5e(t,e){return function(){return $V(this,t,e.apply(this,arguments))}}function fA(t,e){return this.each((typeof e=="function"?j5e:X5e)(t,e))}var VV=M(()=>{"use strict";K7();o($V,"dispatchEvent");o(X5e,"dispatchConstant");o(j5e,"dispatchFunction");o(fA,"default")});function*dA(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(dA,"default")});function si(t,e){this._groups=t,this._parents=e}function HV(){return new si([[document.documentElement]],pA)}function K5e(){return this}var pA,vu,wl=M(()=>{"use strict";aV();oV();lV();cV();uV();fV();O7();dV();pV();mV();gV();yV();vV();xV();bV();wV();TV();kV();EV();Z7();SV();DV();NV();RV();MV();IV();OV();PV();BV();FV();zV();GV();VV();UV();pA=[null];o(si,"Selection");o(HV,"selection");o(K5e,"selection_selection");si.prototype=HV.prototype={constructor:si,select:C7,selectAll:L7,selectChild:D7,selectChildren:N7,filter:R7,data:B7,enter:I7,exit:F7,join:z7,merge:G7,selection:K5e,order:$7,sort:V7,call:U7,nodes:H7,node:W7,size:Y7,empty:q7,each:X7,attr:j7,style:Q7,property:J7,classed:tA,text:rA,html:nA,raise:iA,lower:aA,append:sA,insert:oA,remove:lA,clone:cA,datum:uA,on:hA,dispatch:fA,[Symbol.iterator]:dA};vu=HV});function Ve(t){return typeof t=="string"?new si([[document.querySelector(t)]],[document.documentElement]):new si([[t]],pA)}var WV=M(()=>{"use strict";wl();o(Ve,"default")});var Tl=M(()=>{"use strict";Sy();j4();WV();wl();K4();_7();Z7()});var YV=M(()=>{"use strict"});function Ch(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function Rp(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}var mA=M(()=>{"use strict";o(Ch,"default");o(Rp,"extend")});function Ah(){}function XV(){return this.rgb().formatHex()}function iwe(){return this.rgb().formatHex8()}function awe(){return tU(this).formatHsl()}function jV(){return this.rgb().formatRgb()}function El(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=Q5e.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?KV(e):r===3?new da(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?Z4(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?Z4(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=Z5e.exec(t))?new da(e[1],e[2],e[3],1):(e=J5e.exec(t))?new da(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=ewe.exec(t))?Z4(e[1],e[2],e[3],e[4]):(e=twe.exec(t))?Z4(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=rwe.exec(t))?JV(e[1],e[2]/100,e[3]/100,1):(e=nwe.exec(t))?JV(e[1],e[2]/100,e[3]/100,e[4]):qV.hasOwnProperty(t)?KV(qV[t]):t==="transparent"?new da(NaN,NaN,NaN,0):null}function KV(t){return new da(t>>16&255,t>>8&255,t&255,1)}function Z4(t,e,r,n){return n<=0&&(t=e=r=NaN),new da(t,e,r,n)}function yA(t){return t instanceof Ah||(t=El(t)),t?(t=t.rgb(),new da(t.r,t.g,t.b,t.opacity)):new da}function Ip(t,e,r,n){return arguments.length===1?yA(t):new da(t,e,r,n??1)}function da(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function QV(){return`#${ud(this.r)}${ud(this.g)}${ud(this.b)}`}function swe(){return`#${ud(this.r)}${ud(this.g)}${ud(this.b)}${ud((isNaN(this.opacity)?1:this.opacity)*255)}`}function ZV(){let t=t3(this.opacity);return`${t===1?"rgb(":"rgba("}${hd(this.r)}, ${hd(this.g)}, ${hd(this.b)}${t===1?")":`, ${t})`}`}function t3(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function hd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function ud(t){return t=hd(t),(t<16?"0":"")+t.toString(16)}function JV(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new kl(t,e,r,n)}function tU(t){if(t instanceof kl)return new kl(t.h,t.s,t.l,t.opacity);if(t instanceof Ah||(t=El(t)),!t)return new kl;if(t instanceof kl)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),s=NaN,l=a-i,u=(a+i)/2;return l?(e===a?s=(r-n)/l+(r0&&u<1?0:s,new kl(s,l,u,t.opacity)}function rU(t,e,r,n){return arguments.length===1?tU(t):new kl(t,e,r,n??1)}function kl(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function eU(t){return t=(t||0)%360,t<0?t+360:t}function J4(t){return Math.max(0,Math.min(1,t||0))}function gA(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}var Ly,e3,Mp,Dy,mc,Q5e,Z5e,J5e,ewe,twe,rwe,nwe,qV,vA=M(()=>{"use strict";mA();o(Ah,"Color");Ly=.7,e3=1/Ly,Mp="\\s*([+-]?\\d+)\\s*",Dy="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",mc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Q5e=/^#([0-9a-f]{3,8})$/,Z5e=new RegExp(`^rgb\\(${Mp},${Mp},${Mp}\\)$`),J5e=new RegExp(`^rgb\\(${mc},${mc},${mc}\\)$`),ewe=new RegExp(`^rgba\\(${Mp},${Mp},${Mp},${Dy}\\)$`),twe=new RegExp(`^rgba\\(${mc},${mc},${mc},${Dy}\\)$`),rwe=new RegExp(`^hsl\\(${Dy},${mc},${mc}\\)$`),nwe=new RegExp(`^hsla\\(${Dy},${mc},${mc},${Dy}\\)$`),qV={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Ch(Ah,El,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:XV,formatHex:XV,formatHex8:iwe,formatHsl:awe,formatRgb:jV,toString:jV});o(XV,"color_formatHex");o(iwe,"color_formatHex8");o(awe,"color_formatHsl");o(jV,"color_formatRgb");o(El,"color");o(KV,"rgbn");o(Z4,"rgba");o(yA,"rgbConvert");o(Ip,"rgb");o(da,"Rgb");Ch(da,Ip,Rp(Ah,{brighter(t){return t=t==null?e3:Math.pow(e3,t),new da(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Ly:Math.pow(Ly,t),new da(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new da(hd(this.r),hd(this.g),hd(this.b),t3(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:QV,formatHex:QV,formatHex8:swe,formatRgb:ZV,toString:ZV}));o(QV,"rgb_formatHex");o(swe,"rgb_formatHex8");o(ZV,"rgb_formatRgb");o(t3,"clampa");o(hd,"clampi");o(ud,"hex");o(JV,"hsla");o(tU,"hslConvert");o(rU,"hsl");o(kl,"Hsl");Ch(kl,rU,Rp(Ah,{brighter(t){return t=t==null?e3:Math.pow(e3,t),new kl(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Ly:Math.pow(Ly,t),new kl(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new da(gA(t>=240?t-240:t+120,i,n),gA(t,i,n),gA(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new kl(eU(this.h),J4(this.s),J4(this.l),t3(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=t3(this.opacity);return`${t===1?"hsl(":"hsla("}${eU(this.h)}, ${J4(this.s)*100}%, ${J4(this.l)*100}%${t===1?")":`, ${t})`}`}}));o(eU,"clamph");o(J4,"clampt");o(gA,"hsl2rgb")});var nU,iU,aU=M(()=>{"use strict";nU=Math.PI/180,iU=180/Math.PI});function hU(t){if(t instanceof gc)return new gc(t.l,t.a,t.b,t.opacity);if(t instanceof xu)return fU(t);t instanceof da||(t=yA(t));var e=TA(t.r),r=TA(t.g),n=TA(t.b),i=xA((.2225045*e+.7168786*r+.0606169*n)/oU),a,s;return e===r&&r===n?a=s=i:(a=xA((.4360747*e+.3850649*r+.1430804*n)/sU),s=xA((.0139322*e+.0971045*r+.7141733*n)/lU)),new gc(116*i-16,500*(a-i),200*(i-s),t.opacity)}function kA(t,e,r,n){return arguments.length===1?hU(t):new gc(t,e,r,n??1)}function gc(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function xA(t){return t>owe?Math.pow(t,1/3):t/uU+cU}function bA(t){return t>Op?t*t*t:uU*(t-cU)}function wA(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function TA(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function lwe(t){if(t instanceof xu)return new xu(t.h,t.c,t.l,t.opacity);if(t instanceof gc||(t=hU(t)),t.a===0&&t.b===0)return new xu(NaN,0{"use strict";mA();vA();aU();r3=18,sU=.96422,oU=1,lU=.82521,cU=4/29,Op=6/29,uU=3*Op*Op,owe=Op*Op*Op;o(hU,"labConvert");o(kA,"lab");o(gc,"Lab");Ch(gc,kA,Rp(Ah,{brighter(t){return new gc(this.l+r3*(t??1),this.a,this.b,this.opacity)},darker(t){return new gc(this.l-r3*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return e=sU*bA(e),t=oU*bA(t),r=lU*bA(r),new da(wA(3.1338561*e-1.6168667*t-.4906146*r),wA(-.9787684*e+1.9161415*t+.033454*r),wA(.0719453*e-.2289914*t+1.4052427*r),this.opacity)}}));o(xA,"xyz2lab");o(bA,"lab2xyz");o(wA,"lrgb2rgb");o(TA,"rgb2lrgb");o(lwe,"hclConvert");o(Ny,"hcl");o(xu,"Hcl");o(fU,"hcl2lab");Ch(xu,Ny,Rp(Ah,{brighter(t){return new xu(this.h,this.c,this.l+r3*(t??1),this.opacity)},darker(t){return new xu(this.h,this.c,this.l-r3*(t??1),this.opacity)},rgb(){return fU(this).rgb()}}))});var Pp=M(()=>{"use strict";vA();dU()});function EA(t,e,r,n,i){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*r+(1+3*t+3*a-3*s)*n+s*i)/6}function SA(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],s=n>0?t[n-1]:2*i-a,l=n{"use strict";o(EA,"basis");o(SA,"default")});function AA(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],a=t[n%e],s=t[(n+1)%e],l=t[(n+2)%e];return EA((r-n/e)*e,i,a,s,l)}}var pU=M(()=>{"use strict";CA();o(AA,"default")});var Bp,_A=M(()=>{"use strict";Bp=o(t=>()=>t,"default")});function mU(t,e){return function(r){return t+r*e}}function cwe(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function gU(t,e){var r=e-t;return r?mU(t,r>180||r<-180?r-360*Math.round(r/360):r):Bp(isNaN(t)?e:t)}function yU(t){return(t=+t)==1?bu:function(e,r){return r-e?cwe(e,r,t):Bp(isNaN(e)?r:e)}}function bu(t,e){var r=e-t;return r?mU(t,r):Bp(isNaN(t)?e:t)}var LA=M(()=>{"use strict";_A();o(mU,"linear");o(cwe,"exponential");o(gU,"hue");o(yU,"gamma");o(bu,"nogamma")});function vU(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),a=new Array(r),s,l;for(s=0;s{"use strict";Pp();CA();pU();LA();fd=o(function t(e){var r=yU(e);function n(i,a){var s=r((i=Ip(i)).r,(a=Ip(a)).r),l=r(i.g,a.g),u=r(i.b,a.b),h=bu(i.opacity,a.opacity);return function(f){return i.r=s(f),i.g=l(f),i.b=u(f),i.opacity=h(f),i+""}}return o(n,"rgb"),n.gamma=t,n},"rgbGamma")(1);o(vU,"rgbSpline");uwe=vU(SA),hwe=vU(AA)});function NA(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(a){for(i=0;i{"use strict";o(NA,"default");o(xU,"isNumberArray")});function wU(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),a=new Array(r),s;for(s=0;s{"use strict";n3();o(wU,"genericArray")});function RA(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}var kU=M(()=>{"use strict";o(RA,"default")});function ea(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var Ry=M(()=>{"use strict";o(ea,"default")});function MA(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=_h(t[i],e[i]):n[i]=e[i];return function(a){for(i in r)n[i]=r[i](a);return n}}var EU=M(()=>{"use strict";n3();o(MA,"default")});function fwe(t){return function(){return t}}function dwe(t){return function(e){return t(e)+""}}function Fp(t,e){var r=OA.lastIndex=IA.lastIndex=0,n,i,a,s=-1,l=[],u=[];for(t=t+"",e=e+"";(n=OA.exec(t))&&(i=IA.exec(e));)(a=i.index)>r&&(a=e.slice(r,a),l[s]?l[s]+=a:l[++s]=a),(n=n[0])===(i=i[0])?l[s]?l[s]+=i:l[++s]=i:(l[++s]=null,u.push({i:s,x:ea(n,i)})),r=IA.lastIndex;return r{"use strict";Ry();OA=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,IA=new RegExp(OA.source,"g");o(fwe,"zero");o(dwe,"one");o(Fp,"default")});function _h(t,e){var r=typeof e,n;return e==null||r==="boolean"?Bp(e):(r==="number"?ea:r==="string"?(n=El(e))?(e=n,fd):Fp:e instanceof El?fd:e instanceof Date?RA:xU(e)?NA:Array.isArray(e)?wU:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?MA:ea)(t,e)}var n3=M(()=>{"use strict";Pp();DA();TU();kU();Ry();EU();PA();_A();bU();o(_h,"default")});function i3(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}var SU=M(()=>{"use strict";o(i3,"default")});function s3(t,e,r,n,i,a){var s,l,u;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(u=t*r+e*n)&&(r-=t*u,n-=e*u),(l=Math.sqrt(r*r+n*n))&&(r/=l,n/=l,u/=l),t*n{"use strict";CU=180/Math.PI,a3={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};o(s3,"default")});function _U(t){let e=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?a3:s3(e.a,e.b,e.c,e.d,e.e,e.f)}function LU(t){return t==null?a3:(o3||(o3=document.createElementNS("http://www.w3.org/2000/svg","g")),o3.setAttribute("transform",t),(t=o3.transform.baseVal.consolidate())?(t=t.matrix,s3(t.a,t.b,t.c,t.d,t.e,t.f)):a3)}var o3,DU=M(()=>{"use strict";AU();o(_U,"parseCss");o(LU,"parseSvg")});function NU(t,e,r,n){function i(h){return h.length?h.pop()+" ":""}o(i,"pop");function a(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push("translate(",null,e,null,r);g.push({i:y-4,x:ea(h,d)},{i:y-2,x:ea(f,p)})}else(d||p)&&m.push("translate("+d+e+p+r)}o(a,"translate");function s(h,f,d,p){h!==f?(h-f>180?f+=360:f-h>180&&(h+=360),p.push({i:d.push(i(d)+"rotate(",null,n)-2,x:ea(h,f)})):f&&d.push(i(d)+"rotate("+f+n)}o(s,"rotate");function l(h,f,d,p){h!==f?p.push({i:d.push(i(d)+"skewX(",null,n)-2,x:ea(h,f)}):f&&d.push(i(d)+"skewX("+f+n)}o(l,"skewX");function u(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push(i(m)+"scale(",null,",",null,")");g.push({i:y-4,x:ea(h,d)},{i:y-2,x:ea(f,p)})}else(d!==1||p!==1)&&m.push(i(m)+"scale("+d+","+p+")")}return o(u,"scale"),function(h,f){var d=[],p=[];return h=t(h),f=t(f),a(h.translateX,h.translateY,f.translateX,f.translateY,d,p),s(h.rotate,f.rotate,d,p),l(h.skewX,f.skewX,d,p),u(h.scaleX,h.scaleY,f.scaleX,f.scaleY,d,p),h=f=null,function(m){for(var g=-1,y=p.length,v;++g{"use strict";Ry();DU();o(NU,"interpolateTransform");BA=NU(_U,"px, ","px)","deg)"),FA=NU(LU,", ",")",")")});function MU(t){return function(e,r){var n=t((e=Ny(e)).h,(r=Ny(r)).h),i=bu(e.c,r.c),a=bu(e.l,r.l),s=bu(e.opacity,r.opacity);return function(l){return e.h=n(l),e.c=i(l),e.l=a(l),e.opacity=s(l),e+""}}}var zA,pwe,IU=M(()=>{"use strict";Pp();LA();o(MU,"hcl");zA=MU(gU),pwe=MU(bu)});var zp=M(()=>{"use strict";n3();Ry();SU();PA();RU();DA();IU()});function Fy(){return dd||(BU(mwe),dd=Py.now()+u3)}function mwe(){dd=0}function By(){this._call=this._time=this._next=null}function h3(t,e,r){var n=new By;return n.restart(t,e,r),n}function FU(){Fy(),++Gp;for(var t=l3,e;t;)(e=dd-t._time)>=0&&t._call.call(void 0,e),t=t._next;--Gp}function OU(){dd=(c3=Py.now())+u3,Gp=Iy=0;try{FU()}finally{Gp=0,ywe(),dd=0}}function gwe(){var t=Py.now(),e=t-c3;e>PU&&(u3-=e,c3=t)}function ywe(){for(var t,e=l3,r,n=1/0;e;)e._call?(n>e._time&&(n=e._time),t=e,e=e._next):(r=e._next,e._next=null,e=t?t._next=r:l3=r);Oy=t,GA(n)}function GA(t){if(!Gp){Iy&&(Iy=clearTimeout(Iy));var e=t-dd;e>24?(t<1/0&&(Iy=setTimeout(OU,t-Py.now()-u3)),My&&(My=clearInterval(My))):(My||(c3=Py.now(),My=setInterval(gwe,PU)),Gp=1,BU(OU))}}var Gp,Iy,My,PU,l3,Oy,c3,dd,u3,Py,BU,$A=M(()=>{"use strict";Gp=0,Iy=0,My=0,PU=1e3,c3=0,dd=0,u3=0,Py=typeof performance=="object"&&performance.now?performance:Date,BU=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};o(Fy,"now");o(mwe,"clearNow");o(By,"Timer");By.prototype=h3.prototype={constructor:By,restart:o(function(t,e,r){if(typeof t!="function")throw new TypeError("callback is not a function");r=(r==null?Fy():+r)+(e==null?0:+e),!this._next&&Oy!==this&&(Oy?Oy._next=this:l3=this,Oy=this),this._call=t,this._time=r,GA()},"restart"),stop:o(function(){this._call&&(this._call=null,this._time=1/0,GA())},"stop")};o(h3,"timer");o(FU,"timerFlush");o(OU,"wake");o(gwe,"poke");o(ywe,"nap");o(GA,"sleep")});function zy(t,e,r){var n=new By;return e=e==null?0:+e,n.restart(i=>{n.stop(),t(i+e)},e,r),n}var zU=M(()=>{"use strict";$A();o(zy,"default")});var f3=M(()=>{"use strict";$A();zU()});function wu(t,e,r,n,i,a){var s=t.__transition;if(!s)t.__transition={};else if(r in s)return;bwe(t,r,{name:e,index:n,group:i,on:vwe,tween:xwe,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:VU})}function $y(t,e){var r=zi(t,e);if(r.state>VU)throw new Error("too late; already scheduled");return r}function pa(t,e){var r=zi(t,e);if(r.state>d3)throw new Error("too late; already running");return r}function zi(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function bwe(t,e,r){var n=t.__transition,i;n[e]=r,r.timer=h3(a,0,r.time);function a(h){r.state=GU,r.timer.restart(s,r.delay,r.time),r.delay<=h&&s(h-r.delay)}o(a,"schedule");function s(h){var f,d,p,m;if(r.state!==GU)return u();for(f in n)if(m=n[f],m.name===r.name){if(m.state===d3)return zy(s);m.state===$U?(m.state=Gy,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete n[f]):+f{"use strict";T7();f3();vwe=w7("start","end","cancel","interrupt"),xwe=[],VU=0,GU=1,p3=2,d3=3,$U=4,m3=5,Gy=6;o(wu,"default");o($y,"init");o(pa,"set");o(zi,"get");o(bwe,"create")});function Vy(t,e){var r=t.__transition,n,i,a=!0,s;if(r){e=e==null?null:e+"";for(s in r){if((n=r[s]).name!==e){a=!1;continue}i=n.state>p3&&n.state{"use strict";Cs();o(Vy,"default")});function VA(t){return this.each(function(){Vy(this,t)})}var HU=M(()=>{"use strict";UU();o(VA,"default")});function wwe(t,e){var r,n;return function(){var i=pa(this,t),a=i.tween;if(a!==r){n=r=a;for(var s=0,l=n.length;s{"use strict";Cs();o(wwe,"tweenRemove");o(Twe,"tweenFunction");o(UA,"default");o($p,"tweenValue")});function Hy(t,e){var r;return(typeof e=="number"?ea:e instanceof El?fd:(r=El(e))?(e=r,fd):Fp)(t,e)}var HA=M(()=>{"use strict";Pp();zp();o(Hy,"default")});function kwe(t){return function(){this.removeAttribute(t)}}function Ewe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Swe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttribute(t);return s===i?null:s===n?a:a=e(n=s,r)}}function Cwe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttributeNS(t.space,t.local);return s===i?null:s===n?a:a=e(n=s,r)}}function Awe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttribute(t):(s=this.getAttribute(t),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function _we(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttributeNS(t.space,t.local):(s=this.getAttributeNS(t.space,t.local),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function WA(t,e){var r=pc(t),n=r==="transform"?FA:Hy;return this.attrTween(t,typeof e=="function"?(r.local?_we:Awe)(r,n,$p(this,"attr."+t,e)):e==null?(r.local?Ewe:kwe)(r):(r.local?Cwe:Swe)(r,n,e))}var WU=M(()=>{"use strict";zp();Tl();Uy();HA();o(kwe,"attrRemove");o(Ewe,"attrRemoveNS");o(Swe,"attrConstant");o(Cwe,"attrConstantNS");o(Awe,"attrFunction");o(_we,"attrFunctionNS");o(WA,"default")});function Lwe(t,e){return function(r){this.setAttribute(t,e.call(this,r))}}function Dwe(t,e){return function(r){this.setAttributeNS(t.space,t.local,e.call(this,r))}}function Nwe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&Dwe(t,a)),r}return o(i,"tween"),i._value=e,i}function Rwe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&Lwe(t,a)),r}return o(i,"tween"),i._value=e,i}function YA(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(e==null)return this.tween(r,null);if(typeof e!="function")throw new Error;var n=pc(t);return this.tween(r,(n.local?Nwe:Rwe)(n,e))}var YU=M(()=>{"use strict";Tl();o(Lwe,"attrInterpolate");o(Dwe,"attrInterpolateNS");o(Nwe,"attrTweenNS");o(Rwe,"attrTween");o(YA,"default")});function Mwe(t,e){return function(){$y(this,t).delay=+e.apply(this,arguments)}}function Iwe(t,e){return e=+e,function(){$y(this,t).delay=e}}function qA(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?Mwe:Iwe)(e,t)):zi(this.node(),e).delay}var qU=M(()=>{"use strict";Cs();o(Mwe,"delayFunction");o(Iwe,"delayConstant");o(qA,"default")});function Owe(t,e){return function(){pa(this,t).duration=+e.apply(this,arguments)}}function Pwe(t,e){return e=+e,function(){pa(this,t).duration=e}}function XA(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?Owe:Pwe)(e,t)):zi(this.node(),e).duration}var XU=M(()=>{"use strict";Cs();o(Owe,"durationFunction");o(Pwe,"durationConstant");o(XA,"default")});function Bwe(t,e){if(typeof e!="function")throw new Error;return function(){pa(this,t).ease=e}}function jA(t){var e=this._id;return arguments.length?this.each(Bwe(e,t)):zi(this.node(),e).ease}var jU=M(()=>{"use strict";Cs();o(Bwe,"easeConstant");o(jA,"default")});function Fwe(t,e){return function(){var r=e.apply(this,arguments);if(typeof r!="function")throw new Error;pa(this,t).ease=r}}function KA(t){if(typeof t!="function")throw new Error;return this.each(Fwe(this._id,t))}var KU=M(()=>{"use strict";Cs();o(Fwe,"easeVarying");o(KA,"default")});function QA(t){typeof t!="function"&&(t=Np(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";Tl();pd();o(QA,"default")});function ZA(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,r=t._groups,n=e.length,i=r.length,a=Math.min(n,i),s=new Array(n),l=0;l{"use strict";pd();o(ZA,"default")});function zwe(t){return(t+"").trim().split(/^|\s+/).every(function(e){var r=e.indexOf(".");return r>=0&&(e=e.slice(0,r)),!e||e==="start"})}function Gwe(t,e,r){var n,i,a=zwe(e)?$y:pa;return function(){var s=a(this,t),l=s.on;l!==n&&(i=(n=l).copy()).on(e,r),s.on=i}}function JA(t,e){var r=this._id;return arguments.length<2?zi(this.node(),r).on.on(t):this.each(Gwe(r,t,e))}var JU=M(()=>{"use strict";Cs();o(zwe,"start");o(Gwe,"onFunction");o(JA,"default")});function $we(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}function e8(){return this.on("end.remove",$we(this._id))}var eH=M(()=>{"use strict";o($we,"removeFunction");o(e8,"default")});function t8(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Eh(t));for(var n=this._groups,i=n.length,a=new Array(i),s=0;s{"use strict";Tl();pd();Cs();o(t8,"default")});function r8(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Dp(t));for(var n=this._groups,i=n.length,a=[],s=[],l=0;l{"use strict";Tl();pd();Cs();o(r8,"default")});function n8(){return new Vwe(this._groups,this._parents)}var Vwe,nH=M(()=>{"use strict";Tl();Vwe=vu.prototype.constructor;o(n8,"default")});function Uwe(t,e){var r,n,i;return function(){var a=Sh(this,t),s=(this.style.removeProperty(t),Sh(this,t));return a===s?null:a===r&&s===n?i:i=e(r=a,n=s)}}function iH(t){return function(){this.style.removeProperty(t)}}function Hwe(t,e,r){var n,i=r+"",a;return function(){var s=Sh(this,t);return s===i?null:s===n?a:a=e(n=s,r)}}function Wwe(t,e,r){var n,i,a;return function(){var s=Sh(this,t),l=r(this),u=l+"";return l==null&&(u=l=(this.style.removeProperty(t),Sh(this,t))),s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l))}}function Ywe(t,e){var r,n,i,a="style."+e,s="end."+a,l;return function(){var u=pa(this,t),h=u.on,f=u.value[a]==null?l||(l=iH(e)):void 0;(h!==r||i!==f)&&(n=(r=h).copy()).on(s,i=f),u.on=n}}function i8(t,e,r){var n=(t+="")=="transform"?BA:Hy;return e==null?this.styleTween(t,Uwe(t,n)).on("end.style."+t,iH(t)):typeof e=="function"?this.styleTween(t,Wwe(t,n,$p(this,"style."+t,e))).each(Ywe(this._id,t)):this.styleTween(t,Hwe(t,n,e),r).on("end.style."+t,null)}var aH=M(()=>{"use strict";zp();Tl();Cs();Uy();HA();o(Uwe,"styleNull");o(iH,"styleRemove");o(Hwe,"styleConstant");o(Wwe,"styleFunction");o(Ywe,"styleMaybeRemove");o(i8,"default")});function qwe(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}function Xwe(t,e,r){var n,i;function a(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&qwe(t,s,r)),n}return o(a,"tween"),a._value=e,a}function a8(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(e==null)return this.tween(n,null);if(typeof e!="function")throw new Error;return this.tween(n,Xwe(t,e,r??""))}var sH=M(()=>{"use strict";o(qwe,"styleInterpolate");o(Xwe,"styleTween");o(a8,"default")});function jwe(t){return function(){this.textContent=t}}function Kwe(t){return function(){var e=t(this);this.textContent=e??""}}function s8(t){return this.tween("text",typeof t=="function"?Kwe($p(this,"text",t)):jwe(t==null?"":t+""))}var oH=M(()=>{"use strict";Uy();o(jwe,"textConstant");o(Kwe,"textFunction");o(s8,"default")});function Qwe(t){return function(e){this.textContent=t.call(this,e)}}function Zwe(t){var e,r;function n(){var i=t.apply(this,arguments);return i!==r&&(e=(r=i)&&Qwe(i)),e}return o(n,"tween"),n._value=t,n}function o8(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!="function")throw new Error;return this.tween(e,Zwe(t))}var lH=M(()=>{"use strict";o(Qwe,"textInterpolate");o(Zwe,"textTween");o(o8,"default")});function l8(){for(var t=this._name,e=this._id,r=g3(),n=this._groups,i=n.length,a=0;a{"use strict";pd();Cs();o(l8,"default")});function c8(){var t,e,r=this,n=r._id,i=r.size();return new Promise(function(a,s){var l={value:s},u={value:o(function(){--i===0&&a()},"value")};r.each(function(){var h=pa(this,n),f=h.on;f!==t&&(e=(t=f).copy(),e._.cancel.push(l),e._.interrupt.push(l),e._.end.push(u)),h.on=e}),i===0&&a()})}var uH=M(()=>{"use strict";Cs();o(c8,"default")});function rs(t,e,r,n){this._groups=t,this._parents=e,this._name=r,this._id=n}function hH(t){return vu().transition(t)}function g3(){return++Jwe}var Jwe,Tu,pd=M(()=>{"use strict";Tl();WU();YU();qU();XU();jU();KU();QU();ZU();JU();eH();tH();rH();nH();aH();sH();oH();lH();cH();Uy();uH();Jwe=0;o(rs,"Transition");o(hH,"transition");o(g3,"newId");Tu=vu.prototype;rs.prototype=hH.prototype={constructor:rs,select:t8,selectAll:r8,selectChild:Tu.selectChild,selectChildren:Tu.selectChildren,filter:QA,merge:ZA,selection:n8,transition:l8,call:Tu.call,nodes:Tu.nodes,node:Tu.node,size:Tu.size,empty:Tu.empty,each:Tu.each,on:JA,attr:WA,attrTween:YA,style:i8,styleTween:a8,text:s8,textTween:o8,remove:e8,tween:UA,delay:qA,duration:XA,ease:jA,easeVarying:KA,end:c8,[Symbol.iterator]:Tu[Symbol.iterator]}});function y3(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var fH=M(()=>{"use strict";o(y3,"cubicInOut")});var u8=M(()=>{"use strict";fH()});function tTe(t,e){for(var r;!(r=t.__transition)||!(r=r[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return r}function h8(t){var e,r;t instanceof rs?(e=t._id,t=t._name):(e=g3(),(r=eTe).time=Fy(),t=t==null?null:t+"");for(var n=this._groups,i=n.length,a=0;a{"use strict";pd();Cs();u8();f3();eTe={time:null,delay:0,duration:250,ease:y3};o(tTe,"inherit");o(h8,"default")});var pH=M(()=>{"use strict";Tl();HU();dH();vu.prototype.interrupt=VA;vu.prototype.transition=h8});var v3=M(()=>{"use strict";pH()});var mH=M(()=>{"use strict"});var gH=M(()=>{"use strict"});var yH=M(()=>{"use strict"});function vH(t){return[+t[0],+t[1]]}function rTe(t){return[vH(t[0]),vH(t[1])]}function f8(t){return{type:t}}var Agt,_gt,Lgt,Dgt,Ngt,Rgt,xH=M(()=>{"use strict";v3();mH();gH();yH();({abs:Agt,max:_gt,min:Lgt}=Math);o(vH,"number1");o(rTe,"number2");Dgt={name:"x",handles:["w","e"].map(f8),input:o(function(t,e){return t==null?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},"input"),output:o(function(t){return t&&[t[0][0],t[1][0]]},"output")},Ngt={name:"y",handles:["n","s"].map(f8),input:o(function(t,e){return t==null?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},"input"),output:o(function(t){return t&&[t[0][1],t[1][1]]},"output")},Rgt={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(f8),input:o(function(t){return t==null?null:rTe(t)},"input"),output:o(function(t){return t},"output")};o(f8,"type")});var bH=M(()=>{"use strict";xH()});function wH(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return wH;let r=10**e;return function(n){this._+=n[0];for(let i=1,a=n.length;i{"use strict";d8=Math.PI,p8=2*d8,md=1e-6,nTe=p8-md;o(wH,"append");o(iTe,"appendRound");gd=class{static{o(this,"Path")}constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?wH:iTe(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,a,s){this._append`C${+e},${+r},${+n},${+i},${this._x1=+a},${this._y1=+s}`}arcTo(e,r,n,i,a){if(e=+e,r=+r,n=+n,i=+i,a=+a,a<0)throw new Error(`negative radius: ${a}`);let s=this._x1,l=this._y1,u=n-e,h=i-r,f=s-e,d=l-r,p=f*f+d*d;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(p>md)if(!(Math.abs(d*u-h*f)>md)||!a)this._append`L${this._x1=e},${this._y1=r}`;else{let m=n-s,g=i-l,y=u*u+h*h,v=m*m+g*g,x=Math.sqrt(y),b=Math.sqrt(p),w=a*Math.tan((d8-Math.acos((y+p-v)/(2*x*b)))/2),_=w/b,T=w/x;Math.abs(_-1)>md&&this._append`L${e+_*f},${r+_*d}`,this._append`A${a},${a},0,0,${+(d*m>f*g)},${this._x1=e+T*u},${this._y1=r+T*h}`}}arc(e,r,n,i,a,s){if(e=+e,r=+r,n=+n,s=!!s,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),u=n*Math.sin(i),h=e+l,f=r+u,d=1^s,p=s?i-a:a-i;this._x1===null?this._append`M${h},${f}`:(Math.abs(this._x1-h)>md||Math.abs(this._y1-f)>md)&&this._append`L${h},${f}`,n&&(p<0&&(p=p%p8+p8),p>nTe?this._append`A${n},${n},0,1,${d},${e-l},${r-u}A${n},${n},0,1,${d},${this._x1=h},${this._y1=f}`:p>md&&this._append`A${n},${n},0,${+(p>=d8)},${d},${this._x1=e+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};o(TH,"path");TH.prototype=gd.prototype});var m8=M(()=>{"use strict";kH()});var EH=M(()=>{"use strict"});var SH=M(()=>{"use strict"});var CH=M(()=>{"use strict"});var AH=M(()=>{"use strict"});var _H=M(()=>{"use strict"});var LH=M(()=>{"use strict"});var DH=M(()=>{"use strict"});function g8(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function yd(t,e){if((r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var r,n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}var Wy=M(()=>{"use strict";o(g8,"default");o(yd,"formatDecimalParts")});function Sl(t){return t=yd(Math.abs(t)),t?t[1]:NaN}var Yy=M(()=>{"use strict";Wy();o(Sl,"default")});function y8(t,e){return function(r,n){for(var i=r.length,a=[],s=0,l=t[0],u=0;i>0&&l>0&&(u+l+1>n&&(l=Math.max(1,n-u)),a.push(r.substring(i-=l,i+l)),!((u+=l+1)>n));)l=t[s=(s+1)%t.length];return a.reverse().join(e)}}var NH=M(()=>{"use strict";o(y8,"default")});function v8(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}var RH=M(()=>{"use strict";o(v8,"default")});function Lh(t){if(!(e=aTe.exec(t)))throw new Error("invalid format: "+t);var e;return new x3({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function x3(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}var aTe,x8=M(()=>{"use strict";aTe=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;o(Lh,"formatSpecifier");Lh.prototype=x3.prototype;o(x3,"FormatSpecifier");x3.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type}});function b8(t){e:for(var e=t.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}var MH=M(()=>{"use strict";o(b8,"default")});function T8(t,e){var r=yd(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(w8=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=n.length;return a===s?n:a>s?n+new Array(a-s+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+yd(t,Math.max(0,e+a-1))[0]}var w8,k8=M(()=>{"use strict";Wy();o(T8,"default")});function b3(t,e){var r=yd(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var IH=M(()=>{"use strict";Wy();o(b3,"default")});var E8,OH=M(()=>{"use strict";Wy();k8();IH();E8={"%":o((t,e)=>(t*100).toFixed(e),"%"),b:o(t=>Math.round(t).toString(2),"b"),c:o(t=>t+"","c"),d:g8,e:o((t,e)=>t.toExponential(e),"e"),f:o((t,e)=>t.toFixed(e),"f"),g:o((t,e)=>t.toPrecision(e),"g"),o:o(t=>Math.round(t).toString(8),"o"),p:o((t,e)=>b3(t*100,e),"p"),r:b3,s:T8,X:o(t=>Math.round(t).toString(16).toUpperCase(),"X"),x:o(t=>Math.round(t).toString(16),"x")}});function w3(t){return t}var PH=M(()=>{"use strict";o(w3,"default")});function S8(t){var e=t.grouping===void 0||t.thousands===void 0?w3:y8(BH.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?w3:v8(BH.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",l=t.minus===void 0?"\u2212":t.minus+"",u=t.nan===void 0?"NaN":t.nan+"";function h(d){d=Lh(d);var p=d.fill,m=d.align,g=d.sign,y=d.symbol,v=d.zero,x=d.width,b=d.comma,w=d.precision,_=d.trim,T=d.type;T==="n"?(b=!0,T="g"):E8[T]||(w===void 0&&(w=12),_=!0,T="g"),(v||p==="0"&&m==="=")&&(v=!0,p="0",m="=");var E=y==="$"?r:y==="#"&&/[boxX]/.test(T)?"0"+T.toLowerCase():"",L=y==="$"?n:/[%p]/.test(T)?s:"",S=E8[T],A=/[defgprs%]/.test(T);w=w===void 0?6:/[gprs]/.test(T)?Math.max(1,Math.min(21,w)):Math.max(0,Math.min(20,w));function I(D){var k=E,R=L,C,O,N;if(T==="c")R=S(D)+R,D="";else{D=+D;var P=D<0||1/D<0;if(D=isNaN(D)?u:S(Math.abs(D),w),_&&(D=b8(D)),P&&+D==0&&g!=="+"&&(P=!1),k=(P?g==="("?g:l:g==="-"||g==="("?"":g)+k,R=(T==="s"?FH[8+w8/3]:"")+R+(P&&g==="("?")":""),A){for(C=-1,O=D.length;++CN||N>57){R=(N===46?i+D.slice(C+1):D.slice(C))+R,D=D.slice(0,C);break}}}b&&!v&&(D=e(D,1/0));var F=k.length+D.length+R.length,B=F>1)+k+D+R+B.slice(F);break;default:D=B+k+D+R;break}return a(D)}return o(I,"format"),I.toString=function(){return d+""},I}o(h,"newFormat");function f(d,p){var m=h((d=Lh(d),d.type="f",d)),g=Math.max(-8,Math.min(8,Math.floor(Sl(p)/3)))*3,y=Math.pow(10,-g),v=FH[8+g/3];return function(x){return m(y*x)+v}}return o(f,"formatPrefix"),{format:h,formatPrefix:f}}var BH,FH,zH=M(()=>{"use strict";Yy();NH();RH();x8();MH();OH();k8();PH();BH=Array.prototype.map,FH=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];o(S8,"default")});function C8(t){return T3=S8(t),k3=T3.format,E3=T3.formatPrefix,T3}var T3,k3,E3,GH=M(()=>{"use strict";zH();C8({thousands:",",grouping:[3],currency:["$",""]});o(C8,"defaultLocale")});function S3(t){return Math.max(0,-Sl(Math.abs(t)))}var $H=M(()=>{"use strict";Yy();o(S3,"default")});function C3(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Sl(e)/3)))*3-Sl(Math.abs(t)))}var VH=M(()=>{"use strict";Yy();o(C3,"default")});function A3(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Sl(e)-Sl(t))+1}var UH=M(()=>{"use strict";Yy();o(A3,"default")});var A8=M(()=>{"use strict";GH();x8();$H();VH();UH()});var HH=M(()=>{"use strict"});var WH=M(()=>{"use strict"});var YH=M(()=>{"use strict"});var qH=M(()=>{"use strict"});function Dh(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}var qy=M(()=>{"use strict";o(Dh,"initRange")});function ku(){var t=new _p,e=[],r=[],n=_8;function i(a){let s=t.get(a);if(s===void 0){if(n!==_8)return n;t.set(a,s=e.push(a)-1)}return r[s%r.length]}return o(i,"scale"),i.domain=function(a){if(!arguments.length)return e.slice();e=[],t=new _p;for(let s of a)t.has(s)||t.set(s,e.push(s)-1);return i},i.range=function(a){return arguments.length?(r=Array.from(a),i):r.slice()},i.unknown=function(a){return arguments.length?(n=a,i):n},i.copy=function(){return ku(e,r).unknown(n)},Dh.apply(i,arguments),i}var _8,L8=M(()=>{"use strict";kh();qy();_8=Symbol("implicit");o(ku,"ordinal")});function Vp(){var t=ku().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,a,s,l=!1,u=0,h=0,f=.5;delete t.unknown;function d(){var p=e().length,m=i{"use strict";kh();qy();L8();o(Vp,"band")});function D8(t){return function(){return t}}var jH=M(()=>{"use strict";o(D8,"constants")});function N8(t){return+t}var KH=M(()=>{"use strict";o(N8,"number")});function Up(t){return t}function R8(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:D8(isNaN(e)?NaN:.5)}function sTe(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function oTe(t,e,r){var n=t[0],i=t[1],a=e[0],s=e[1];return i2?lTe:oTe,u=h=null,d}o(f,"rescale");function d(p){return p==null||isNaN(p=+p)?a:(u||(u=l(t.map(n),e,r)))(n(s(p)))}return o(d,"scale"),d.invert=function(p){return s(i((h||(h=l(e,t.map(n),ea)))(p)))},d.domain=function(p){return arguments.length?(t=Array.from(p,N8),f()):t.slice()},d.range=function(p){return arguments.length?(e=Array.from(p),f()):e.slice()},d.rangeRound=function(p){return e=Array.from(p),r=i3,f()},d.clamp=function(p){return arguments.length?(s=p?!0:Up,f()):s!==Up},d.interpolate=function(p){return arguments.length?(r=p,f()):r},d.unknown=function(p){return arguments.length?(a=p,d):a},function(p,m){return n=p,i=m,f()}}function Xy(){return cTe()(Up,Up)}var QH,M8=M(()=>{"use strict";kh();zp();jH();KH();QH=[0,1];o(Up,"identity");o(R8,"normalize");o(sTe,"clamper");o(oTe,"bimap");o(lTe,"polymap");o(_3,"copy");o(cTe,"transformer");o(Xy,"continuous")});function I8(t,e,r,n){var i=Lp(t,e,r),a;switch(n=Lh(n??",f"),n.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(a=C3(i,s))&&(n.precision=a),E3(n,s)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(a=A3(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=a-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(a=S3(i))&&(n.precision=a-(n.type==="%")*2);break}}return k3(n)}var ZH=M(()=>{"use strict";kh();A8();o(I8,"tickFormat")});function uTe(t){var e=t.domain;return t.ticks=function(r){var n=e();return $4(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return I8(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,a=n.length-1,s=n[i],l=n[a],u,h,f=10;for(l0;){if(h=ky(s,l,r),h===u)return n[i]=s,n[a]=l,e(n);if(h>0)s=Math.floor(s/h)*h,l=Math.ceil(l/h)*h;else if(h<0)s=Math.ceil(s*h)/h,l=Math.floor(l*h)/h;else break;u=h}return t},t}function Cl(){var t=Xy();return t.copy=function(){return _3(t,Cl())},Dh.apply(t,arguments),uTe(t)}var JH=M(()=>{"use strict";kh();M8();qy();ZH();o(uTe,"linearish");o(Cl,"linear")});function O8(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],a=t[n],s;return a{"use strict";o(O8,"nice")});function vn(t,e,r,n){function i(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return o(i,"interval"),i.floor=a=>(t(a=new Date(+a)),a),i.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),i.round=a=>{let s=i(a),l=i.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),i.range=(a,s,l)=>{let u=[];if(a=i.ceil(a),l=l==null?1:Math.floor(l),!(a0))return u;let h;do u.push(h=new Date(+a)),e(a,l),t(a);while(hvn(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,l)=>{if(s>=s)if(l<0)for(;++l<=0;)for(;e(s,-1),!a(s););else for(;--l>=0;)for(;e(s,1),!a(s););}),r&&(i.count=(a,s)=>(P8.setTime(+a),B8.setTime(+s),t(P8),t(B8),Math.floor(r(P8,B8))),i.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?i.filter(n?s=>n(s)%a===0:s=>i.count(0,s)%a===0):i)),i}var P8,B8,Eu=M(()=>{"use strict";P8=new Date,B8=new Date;o(vn,"timeInterval")});var yc,tW,F8=M(()=>{"use strict";Eu();yc=vn(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);yc.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?vn(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):yc);tW=yc.range});var to,rW,z8=M(()=>{"use strict";Eu();to=vn(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),rW=to.range});var Su,hTe,L3,fTe,G8=M(()=>{"use strict";Eu();Su=vn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),hTe=Su.range,L3=vn(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),fTe=L3.range});var Cu,dTe,D3,pTe,$8=M(()=>{"use strict";Eu();Cu=vn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),dTe=Cu.range,D3=vn(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),pTe=D3.range});var Oo,mTe,Ky,gTe,N3,yTe,V8=M(()=>{"use strict";Eu();Oo=vn(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),mTe=Oo.range,Ky=vn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),gTe=Ky.range,N3=vn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),yTe=N3.range});function bd(t){return vn(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}function wd(t){return vn(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var Al,Nh,R3,M3,xc,I3,O3,iW,vTe,xTe,bTe,wTe,TTe,kTe,Td,Hp,aW,sW,Rh,oW,lW,cW,ETe,STe,CTe,ATe,_Te,LTe,U8=M(()=>{"use strict";Eu();o(bd,"timeWeekday");Al=bd(0),Nh=bd(1),R3=bd(2),M3=bd(3),xc=bd(4),I3=bd(5),O3=bd(6),iW=Al.range,vTe=Nh.range,xTe=R3.range,bTe=M3.range,wTe=xc.range,TTe=I3.range,kTe=O3.range;o(wd,"utcWeekday");Td=wd(0),Hp=wd(1),aW=wd(2),sW=wd(3),Rh=wd(4),oW=wd(5),lW=wd(6),cW=Td.range,ETe=Hp.range,STe=aW.range,CTe=sW.range,ATe=Rh.range,_Te=oW.range,LTe=lW.range});var Au,DTe,P3,NTe,H8=M(()=>{"use strict";Eu();Au=vn(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),DTe=Au.range,P3=vn(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),NTe=P3.range});var ro,RTe,_l,MTe,W8=M(()=>{"use strict";Eu();ro=vn(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());ro.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:vn(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});RTe=ro.range,_l=vn(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());_l.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:vn(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});MTe=_l.range});function hW(t,e,r,n,i,a){let s=[[to,1,1e3],[to,5,5*1e3],[to,15,15*1e3],[to,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function l(h,f,d){let p=fv).right(s,p);if(m===s.length)return t.every(Lp(h/31536e6,f/31536e6,d));if(m===0)return yc.every(Math.max(Lp(h,f,d),1));let[g,y]=s[p/s[m-1][2]{"use strict";kh();F8();z8();G8();$8();V8();U8();H8();W8();o(hW,"ticker");[OTe,PTe]=hW(_l,P3,Td,N3,D3,L3),[Y8,q8]=hW(ro,Au,Al,Oo,Cu,Su)});var B3=M(()=>{"use strict";F8();z8();G8();$8();V8();U8();H8();W8();fW()});function X8(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function j8(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Qy(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function K8(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,a=t.days,s=t.shortDays,l=t.months,u=t.shortMonths,h=Zy(i),f=Jy(i),d=Zy(a),p=Jy(a),m=Zy(s),g=Jy(s),y=Zy(l),v=Jy(l),x=Zy(u),b=Jy(u),w={a:P,A:F,b:B,B:G,c:null,d:vW,e:vW,f:ake,g:mke,G:yke,H:rke,I:nke,j:ike,L:kW,m:ske,M:oke,p:z,q:W,Q:wW,s:TW,S:lke,u:cke,U:uke,V:hke,w:fke,W:dke,x:null,X:null,y:pke,Y:gke,Z:vke,"%":bW},_={a:Z,A:j,b:oe,B:K,c:null,d:xW,e:xW,f:Tke,g:Rke,G:Ike,H:xke,I:bke,j:wke,L:SW,m:kke,M:Eke,p:ee,q:J,Q:wW,s:TW,S:Ske,u:Cke,U:Ake,V:_ke,w:Lke,W:Dke,x:null,X:null,y:Nke,Y:Mke,Z:Oke,"%":bW},T={a:I,A:D,b:k,B:R,c:C,d:gW,e:gW,f:ZTe,g:mW,G:pW,H:yW,I:yW,j:XTe,L:QTe,m:qTe,M:jTe,p:A,q:YTe,Q:eke,s:tke,S:KTe,u:$Te,U:VTe,V:UTe,w:GTe,W:HTe,x:O,X:N,y:mW,Y:pW,Z:WTe,"%":JTe};w.x=E(r,w),w.X=E(n,w),w.c=E(e,w),_.x=E(r,_),_.X=E(n,_),_.c=E(e,_);function E(H,q){return function(Q){var ae=[],ue=-1,ce=0,te=H.length,Ne,se,ke;for(Q instanceof Date||(Q=new Date(+Q));++ue53)return null;"w"in ae||(ae.w=1),"Z"in ae?(ce=j8(Qy(ae.y,0,1)),te=ce.getUTCDay(),ce=te>4||te===0?Hp.ceil(ce):Hp(ce),ce=Ky.offset(ce,(ae.V-1)*7),ae.y=ce.getUTCFullYear(),ae.m=ce.getUTCMonth(),ae.d=ce.getUTCDate()+(ae.w+6)%7):(ce=X8(Qy(ae.y,0,1)),te=ce.getDay(),ce=te>4||te===0?Nh.ceil(ce):Nh(ce),ce=Oo.offset(ce,(ae.V-1)*7),ae.y=ce.getFullYear(),ae.m=ce.getMonth(),ae.d=ce.getDate()+(ae.w+6)%7)}else("W"in ae||"U"in ae)&&("w"in ae||(ae.w="u"in ae?ae.u%7:"W"in ae?1:0),te="Z"in ae?j8(Qy(ae.y,0,1)).getUTCDay():X8(Qy(ae.y,0,1)).getDay(),ae.m=0,ae.d="W"in ae?(ae.w+6)%7+ae.W*7-(te+5)%7:ae.w+ae.U*7-(te+6)%7);return"Z"in ae?(ae.H+=ae.Z/100|0,ae.M+=ae.Z%100,j8(ae)):X8(ae)}}o(L,"newParse");function S(H,q,Q,ae){for(var ue=0,ce=q.length,te=Q.length,Ne,se;ue=te)return-1;if(Ne=q.charCodeAt(ue++),Ne===37){if(Ne=q.charAt(ue++),se=T[Ne in dW?q.charAt(ue++):Ne],!se||(ae=se(H,Q,ae))<0)return-1}else if(Ne!=Q.charCodeAt(ae++))return-1}return ae}o(S,"parseSpecifier");function A(H,q,Q){var ae=h.exec(q.slice(Q));return ae?(H.p=f.get(ae[0].toLowerCase()),Q+ae[0].length):-1}o(A,"parsePeriod");function I(H,q,Q){var ae=m.exec(q.slice(Q));return ae?(H.w=g.get(ae[0].toLowerCase()),Q+ae[0].length):-1}o(I,"parseShortWeekday");function D(H,q,Q){var ae=d.exec(q.slice(Q));return ae?(H.w=p.get(ae[0].toLowerCase()),Q+ae[0].length):-1}o(D,"parseWeekday");function k(H,q,Q){var ae=x.exec(q.slice(Q));return ae?(H.m=b.get(ae[0].toLowerCase()),Q+ae[0].length):-1}o(k,"parseShortMonth");function R(H,q,Q){var ae=y.exec(q.slice(Q));return ae?(H.m=v.get(ae[0].toLowerCase()),Q+ae[0].length):-1}o(R,"parseMonth");function C(H,q,Q){return S(H,e,q,Q)}o(C,"parseLocaleDateTime");function O(H,q,Q){return S(H,r,q,Q)}o(O,"parseLocaleDate");function N(H,q,Q){return S(H,n,q,Q)}o(N,"parseLocaleTime");function P(H){return s[H.getDay()]}o(P,"formatShortWeekday");function F(H){return a[H.getDay()]}o(F,"formatWeekday");function B(H){return u[H.getMonth()]}o(B,"formatShortMonth");function G(H){return l[H.getMonth()]}o(G,"formatMonth");function z(H){return i[+(H.getHours()>=12)]}o(z,"formatPeriod");function W(H){return 1+~~(H.getMonth()/3)}o(W,"formatQuarter");function Z(H){return s[H.getUTCDay()]}o(Z,"formatUTCShortWeekday");function j(H){return a[H.getUTCDay()]}o(j,"formatUTCWeekday");function oe(H){return u[H.getUTCMonth()]}o(oe,"formatUTCShortMonth");function K(H){return l[H.getUTCMonth()]}o(K,"formatUTCMonth");function ee(H){return i[+(H.getUTCHours()>=12)]}o(ee,"formatUTCPeriod");function J(H){return 1+~~(H.getUTCMonth()/3)}return o(J,"formatUTCQuarter"),{format:o(function(H){var q=E(H+="",w);return q.toString=function(){return H},q},"format"),parse:o(function(H){var q=L(H+="",!1);return q.toString=function(){return H},q},"parse"),utcFormat:o(function(H){var q=E(H+="",_);return q.toString=function(){return H},q},"utcFormat"),utcParse:o(function(H){var q=L(H+="",!0);return q.toString=function(){return H},q},"utcParse")}}function Hr(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a[e.toLowerCase(),r]))}function GTe(t,e,r){var n=ta.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function $Te(t,e,r){var n=ta.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function VTe(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function UTe(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function HTe(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function pW(t,e,r){var n=ta.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function mW(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function WTe(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function YTe(t,e,r){var n=ta.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function qTe(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function gW(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function XTe(t,e,r){var n=ta.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function yW(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function jTe(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function KTe(t,e,r){var n=ta.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function QTe(t,e,r){var n=ta.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function ZTe(t,e,r){var n=ta.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function JTe(t,e,r){var n=BTe.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function eke(t,e,r){var n=ta.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function tke(t,e,r){var n=ta.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function vW(t,e){return Hr(t.getDate(),e,2)}function rke(t,e){return Hr(t.getHours(),e,2)}function nke(t,e){return Hr(t.getHours()%12||12,e,2)}function ike(t,e){return Hr(1+Oo.count(ro(t),t),e,3)}function kW(t,e){return Hr(t.getMilliseconds(),e,3)}function ake(t,e){return kW(t,e)+"000"}function ske(t,e){return Hr(t.getMonth()+1,e,2)}function oke(t,e){return Hr(t.getMinutes(),e,2)}function lke(t,e){return Hr(t.getSeconds(),e,2)}function cke(t){var e=t.getDay();return e===0?7:e}function uke(t,e){return Hr(Al.count(ro(t)-1,t),e,2)}function EW(t){var e=t.getDay();return e>=4||e===0?xc(t):xc.ceil(t)}function hke(t,e){return t=EW(t),Hr(xc.count(ro(t),t)+(ro(t).getDay()===4),e,2)}function fke(t){return t.getDay()}function dke(t,e){return Hr(Nh.count(ro(t)-1,t),e,2)}function pke(t,e){return Hr(t.getFullYear()%100,e,2)}function mke(t,e){return t=EW(t),Hr(t.getFullYear()%100,e,2)}function gke(t,e){return Hr(t.getFullYear()%1e4,e,4)}function yke(t,e){var r=t.getDay();return t=r>=4||r===0?xc(t):xc.ceil(t),Hr(t.getFullYear()%1e4,e,4)}function vke(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Hr(e/60|0,"0",2)+Hr(e%60,"0",2)}function xW(t,e){return Hr(t.getUTCDate(),e,2)}function xke(t,e){return Hr(t.getUTCHours(),e,2)}function bke(t,e){return Hr(t.getUTCHours()%12||12,e,2)}function wke(t,e){return Hr(1+Ky.count(_l(t),t),e,3)}function SW(t,e){return Hr(t.getUTCMilliseconds(),e,3)}function Tke(t,e){return SW(t,e)+"000"}function kke(t,e){return Hr(t.getUTCMonth()+1,e,2)}function Eke(t,e){return Hr(t.getUTCMinutes(),e,2)}function Ske(t,e){return Hr(t.getUTCSeconds(),e,2)}function Cke(t){var e=t.getUTCDay();return e===0?7:e}function Ake(t,e){return Hr(Td.count(_l(t)-1,t),e,2)}function CW(t){var e=t.getUTCDay();return e>=4||e===0?Rh(t):Rh.ceil(t)}function _ke(t,e){return t=CW(t),Hr(Rh.count(_l(t),t)+(_l(t).getUTCDay()===4),e,2)}function Lke(t){return t.getUTCDay()}function Dke(t,e){return Hr(Hp.count(_l(t)-1,t),e,2)}function Nke(t,e){return Hr(t.getUTCFullYear()%100,e,2)}function Rke(t,e){return t=CW(t),Hr(t.getUTCFullYear()%100,e,2)}function Mke(t,e){return Hr(t.getUTCFullYear()%1e4,e,4)}function Ike(t,e){var r=t.getUTCDay();return t=r>=4||r===0?Rh(t):Rh.ceil(t),Hr(t.getUTCFullYear()%1e4,e,4)}function Oke(){return"+0000"}function bW(){return"%"}function wW(t){return+t}function TW(t){return Math.floor(+t/1e3)}var dW,ta,BTe,FTe,AW=M(()=>{"use strict";B3();o(X8,"localDate");o(j8,"utcDate");o(Qy,"newDate");o(K8,"formatLocale");dW={"-":"",_:" ",0:"0"},ta=/^\s*\d+/,BTe=/^%/,FTe=/[\\^$*+?|[\]().{}]/g;o(Hr,"pad");o(zTe,"requote");o(Zy,"formatRe");o(Jy,"formatLookup");o(GTe,"parseWeekdayNumberSunday");o($Te,"parseWeekdayNumberMonday");o(VTe,"parseWeekNumberSunday");o(UTe,"parseWeekNumberISO");o(HTe,"parseWeekNumberMonday");o(pW,"parseFullYear");o(mW,"parseYear");o(WTe,"parseZone");o(YTe,"parseQuarter");o(qTe,"parseMonthNumber");o(gW,"parseDayOfMonth");o(XTe,"parseDayOfYear");o(yW,"parseHour24");o(jTe,"parseMinutes");o(KTe,"parseSeconds");o(QTe,"parseMilliseconds");o(ZTe,"parseMicroseconds");o(JTe,"parseLiteralPercent");o(eke,"parseUnixTimestamp");o(tke,"parseUnixTimestampSeconds");o(vW,"formatDayOfMonth");o(rke,"formatHour24");o(nke,"formatHour12");o(ike,"formatDayOfYear");o(kW,"formatMilliseconds");o(ake,"formatMicroseconds");o(ske,"formatMonthNumber");o(oke,"formatMinutes");o(lke,"formatSeconds");o(cke,"formatWeekdayNumberMonday");o(uke,"formatWeekNumberSunday");o(EW,"dISO");o(hke,"formatWeekNumberISO");o(fke,"formatWeekdayNumberSunday");o(dke,"formatWeekNumberMonday");o(pke,"formatYear");o(mke,"formatYearISO");o(gke,"formatFullYear");o(yke,"formatFullYearISO");o(vke,"formatZone");o(xW,"formatUTCDayOfMonth");o(xke,"formatUTCHour24");o(bke,"formatUTCHour12");o(wke,"formatUTCDayOfYear");o(SW,"formatUTCMilliseconds");o(Tke,"formatUTCMicroseconds");o(kke,"formatUTCMonthNumber");o(Eke,"formatUTCMinutes");o(Ske,"formatUTCSeconds");o(Cke,"formatUTCWeekdayNumberMonday");o(Ake,"formatUTCWeekNumberSunday");o(CW,"UTCdISO");o(_ke,"formatUTCWeekNumberISO");o(Lke,"formatUTCWeekdayNumberSunday");o(Dke,"formatUTCWeekNumberMonday");o(Nke,"formatUTCYear");o(Rke,"formatUTCYearISO");o(Mke,"formatUTCFullYear");o(Ike,"formatUTCFullYearISO");o(Oke,"formatUTCZone");o(bW,"formatLiteralPercent");o(wW,"formatUnixTimestamp");o(TW,"formatUnixTimestampSeconds")});function Q8(t){return Wp=K8(t),kd=Wp.format,_W=Wp.parse,LW=Wp.utcFormat,DW=Wp.utcParse,Wp}var Wp,kd,_W,LW,DW,NW=M(()=>{"use strict";AW();Q8({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});o(Q8,"defaultLocale")});var Z8=M(()=>{"use strict";NW()});function Pke(t){return new Date(t)}function Bke(t){return t instanceof Date?+t:+new Date(+t)}function RW(t,e,r,n,i,a,s,l,u,h){var f=Xy(),d=f.invert,p=f.domain,m=h(".%L"),g=h(":%S"),y=h("%I:%M"),v=h("%I %p"),x=h("%a %d"),b=h("%b %d"),w=h("%B"),_=h("%Y");function T(E){return(u(E){"use strict";B3();Z8();M8();qy();eW();o(Pke,"date");o(Bke,"number");o(RW,"calendar");o(F3,"time")});var IW=M(()=>{"use strict";XH();JH();L8();MW()});function J8(t){for(var e=t.length/6|0,r=new Array(e),n=0;n{"use strict";o(J8,"default")});var e_,PW=M(()=>{"use strict";OW();e_=J8("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab")});var BW=M(()=>{"use strict";PW()});function Fn(t){return o(function(){return t},"constant")}var z3=M(()=>{"use strict";o(Fn,"default")});function zW(t){return t>1?0:t<-1?Yp:Math.acos(t)}function r_(t){return t>=1?ev:t<=-1?-ev:Math.asin(t)}var t_,ma,Mh,FW,G3,Ll,Ed,ra,Yp,ev,qp,$3=M(()=>{"use strict";t_=Math.abs,ma=Math.atan2,Mh=Math.cos,FW=Math.max,G3=Math.min,Ll=Math.sin,Ed=Math.sqrt,ra=1e-12,Yp=Math.PI,ev=Yp/2,qp=2*Yp;o(zW,"acos");o(r_,"asin")});function V3(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new gd(e)}var n_=M(()=>{"use strict";m8();o(V3,"withPath")});function Fke(t){return t.innerRadius}function zke(t){return t.outerRadius}function Gke(t){return t.startAngle}function $ke(t){return t.endAngle}function Vke(t){return t&&t.padAngle}function Uke(t,e,r,n,i,a,s,l){var u=r-t,h=n-e,f=s-i,d=l-a,p=d*u-f*h;if(!(p*pC*C+O*O&&(S=I,A=D),{cx:S,cy:A,x01:-f,y01:-d,x11:S*(i/T-1),y11:A*(i/T-1)}}function Dl(){var t=Fke,e=zke,r=Fn(0),n=null,i=Gke,a=$ke,s=Vke,l=null,u=V3(h);function h(){var f,d,p=+t.apply(this,arguments),m=+e.apply(this,arguments),g=i.apply(this,arguments)-ev,y=a.apply(this,arguments)-ev,v=t_(y-g),x=y>g;if(l||(l=f=u()),mra))l.moveTo(0,0);else if(v>qp-ra)l.moveTo(m*Mh(g),m*Ll(g)),l.arc(0,0,m,g,y,!x),p>ra&&(l.moveTo(p*Mh(y),p*Ll(y)),l.arc(0,0,p,y,g,x));else{var b=g,w=y,_=g,T=y,E=v,L=v,S=s.apply(this,arguments)/2,A=S>ra&&(n?+n.apply(this,arguments):Ed(p*p+m*m)),I=G3(t_(m-p)/2,+r.apply(this,arguments)),D=I,k=I,R,C;if(A>ra){var O=r_(A/p*Ll(S)),N=r_(A/m*Ll(S));(E-=O*2)>ra?(O*=x?1:-1,_+=O,T-=O):(E=0,_=T=(g+y)/2),(L-=N*2)>ra?(N*=x?1:-1,b+=N,w-=N):(L=0,b=w=(g+y)/2)}var P=m*Mh(b),F=m*Ll(b),B=p*Mh(T),G=p*Ll(T);if(I>ra){var z=m*Mh(w),W=m*Ll(w),Z=p*Mh(_),j=p*Ll(_),oe;if(vra?k>ra?(R=U3(Z,j,P,F,m,k,x),C=U3(z,W,B,G,m,k,x),l.moveTo(R.cx+R.x01,R.cy+R.y01),kra)||!(E>ra)?l.lineTo(B,G):D>ra?(R=U3(B,G,z,W,p,-D,x),C=U3(P,F,Z,j,p,-D,x),l.lineTo(R.cx+R.x01,R.cy+R.y01),D{"use strict";z3();$3();n_();o(Fke,"arcInnerRadius");o(zke,"arcOuterRadius");o(Gke,"arcStartAngle");o($ke,"arcEndAngle");o(Vke,"arcPadAngle");o(Uke,"intersect");o(U3,"cornerTangents");o(Dl,"default")});function tv(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}var o2t,i_=M(()=>{"use strict";o2t=Array.prototype.slice;o(tv,"default")});function $W(t){this._context=t}function Xp(t){return new $W(t)}var a_=M(()=>{"use strict";o($W,"Linear");$W.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}},"point")};o(Xp,"default")});function VW(t){return t[0]}function UW(t){return t[1]}var HW=M(()=>{"use strict";o(VW,"x");o(UW,"y")});function ns(t,e){var r=Fn(!0),n=null,i=Xp,a=null,s=V3(l);t=typeof t=="function"?t:t===void 0?VW:Fn(t),e=typeof e=="function"?e:e===void 0?UW:Fn(e);function l(u){var h,f=(u=tv(u)).length,d,p=!1,m;for(n==null&&(a=i(m=s())),h=0;h<=f;++h)!(h{"use strict";i_();z3();a_();n_();HW();o(ns,"default")});function s_(t,e){return et?1:e>=t?0:NaN}var YW=M(()=>{"use strict";o(s_,"default")});function o_(t){return t}var qW=M(()=>{"use strict";o(o_,"default")});function H3(){var t=o_,e=s_,r=null,n=Fn(0),i=Fn(qp),a=Fn(0);function s(l){var u,h=(l=tv(l)).length,f,d,p=0,m=new Array(h),g=new Array(h),y=+n.apply(this,arguments),v=Math.min(qp,Math.max(-qp,i.apply(this,arguments)-y)),x,b=Math.min(Math.abs(v)/h,a.apply(this,arguments)),w=b*(v<0?-1:1),_;for(u=0;u0&&(p+=_);for(e!=null?m.sort(function(T,E){return e(g[T],g[E])}):r!=null&&m.sort(function(T,E){return r(l[T],l[E])}),u=0,d=p?(v-h*w)/p:0;u0?_*d:0)+w,g[f]={data:l[f],index:u,value:_,startAngle:y,endAngle:x,padAngle:b};return g}return o(s,"pie"),s.value=function(l){return arguments.length?(t=typeof l=="function"?l:Fn(+l),s):t},s.sortValues=function(l){return arguments.length?(e=l,r=null,s):e},s.sort=function(l){return arguments.length?(r=l,e=null,s):r},s.startAngle=function(l){return arguments.length?(n=typeof l=="function"?l:Fn(+l),s):n},s.endAngle=function(l){return arguments.length?(i=typeof l=="function"?l:Fn(+l),s):i},s.padAngle=function(l){return arguments.length?(a=typeof l=="function"?l:Fn(+l),s):a},s}var XW=M(()=>{"use strict";i_();z3();YW();qW();$3();o(H3,"default")});function l_(t){return new W3(t,!0)}function c_(t){return new W3(t,!1)}var W3,jW=M(()=>{"use strict";W3=class{static{o(this,"Bump")}constructor(e,r){this._context=e,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,r){switch(e=+e,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,r,e,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,e,this._y0,e,r);break}}this._x0=e,this._y0=r}};o(l_,"bumpX");o(c_,"bumpY")});function no(){}var rv=M(()=>{"use strict";o(no,"default")});function jp(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function nv(t){this._context=t}function Po(t){return new nv(t)}var iv=M(()=>{"use strict";o(jp,"point");o(nv,"Basis");nv.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 3:jp(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:jp(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(Po,"default")});function KW(t){this._context=t}function Y3(t){return new KW(t)}var QW=M(()=>{"use strict";rv();iv();o(KW,"BasisClosed");KW.prototype={areaStart:no,areaEnd:no,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:jp(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(Y3,"default")});function ZW(t){this._context=t}function q3(t){return new ZW(t)}var JW=M(()=>{"use strict";iv();o(ZW,"BasisOpen");ZW.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:jp(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(q3,"default")});function eY(t,e){this._basis=new nv(t),this._beta=e}var u_,tY=M(()=>{"use strict";iv();o(eY,"Bundle");eY.prototype={lineStart:o(function(){this._x=[],this._y=[],this._basis.lineStart()},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n=t[0],i=e[0],a=t[r]-n,s=e[r]-i,l=-1,u;++l<=r;)u=l/r,this._basis.point(this._beta*t[l]+(1-this._beta)*(n+u*a),this._beta*e[l]+(1-this._beta)*(i+u*s));this._x=this._y=null,this._basis.lineEnd()},"lineEnd"),point:o(function(t,e){this._x.push(+t),this._y.push(+e)},"point")};u_=o(function t(e){function r(n){return e===1?new nv(n):new eY(n,e)}return o(r,"bundle"),r.beta=function(n){return t(+n)},r},"custom")(.85)});function Kp(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function X3(t,e){this._context=t,this._k=(1-e)/6}var h_,av=M(()=>{"use strict";o(Kp,"point");o(X3,"Cardinal");X3.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Kp(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Kp(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};h_=o(function t(e){function r(n){return new X3(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function j3(t,e){this._context=t,this._k=(1-e)/6}var f_,d_=M(()=>{"use strict";rv();av();o(j3,"CardinalClosed");j3.prototype={areaStart:no,areaEnd:no,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Kp(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};f_=o(function t(e){function r(n){return new j3(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function K3(t,e){this._context=t,this._k=(1-e)/6}var p_,m_=M(()=>{"use strict";av();o(K3,"CardinalOpen");K3.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Kp(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};p_=o(function t(e){function r(n){return new K3(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function sv(t,e,r){var n=t._x1,i=t._y1,a=t._x2,s=t._y2;if(t._l01_a>ra){var l=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*l-t._x0*t._l12_2a+t._x2*t._l01_2a)/u,i=(i*l-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>ra){var h=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*h+t._x1*t._l23_2a-e*t._l12_2a)/f,s=(s*h+t._y1*t._l23_2a-r*t._l12_2a)/f}t._context.bezierCurveTo(n,i,a,s,t._x2,t._y2)}function rY(t,e){this._context=t,this._alpha=e}var g_,Q3=M(()=>{"use strict";$3();av();o(sv,"point");o(rY,"CatmullRom");rY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:sv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};g_=o(function t(e){function r(n){return e?new rY(n,e):new X3(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function nY(t,e){this._context=t,this._alpha=e}var y_,iY=M(()=>{"use strict";d_();rv();Q3();o(nY,"CatmullRomClosed");nY.prototype={areaStart:no,areaEnd:no,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:sv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};y_=o(function t(e){function r(n){return e?new nY(n,e):new j3(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function aY(t,e){this._context=t,this._alpha=e}var v_,sY=M(()=>{"use strict";m_();Q3();o(aY,"CatmullRomOpen");aY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:sv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};v_=o(function t(e){function r(n){return e?new aY(n,e):new K3(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function oY(t){this._context=t}function Z3(t){return new oY(t)}var lY=M(()=>{"use strict";rv();o(oY,"LinearClosed");oY.prototype={areaStart:no,areaEnd:no,lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){this._point&&this._context.closePath()},"lineEnd"),point:o(function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))},"point")};o(Z3,"default")});function cY(t){return t<0?-1:1}function uY(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),s=(r-t._y1)/(i||n<0&&-0),l=(a*i+s*n)/(n+i);return(cY(a)+cY(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(l))||0}function hY(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function x_(t,e,r){var n=t._x0,i=t._y0,a=t._x1,s=t._y1,l=(a-n)/3;t._context.bezierCurveTo(n+l,i+l*e,a-l,s-l*r,a,s)}function J3(t){this._context=t}function fY(t){this._context=new dY(t)}function dY(t){this._context=t}function b_(t){return new J3(t)}function w_(t){return new fY(t)}var pY=M(()=>{"use strict";o(cY,"sign");o(uY,"slope3");o(hY,"slope2");o(x_,"point");o(J3,"MonotoneX");J3.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:x_(this,this._t0,hY(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,x_(this,hY(this,r=uY(this,t,e)),r);break;default:x_(this,this._t0,r=uY(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}},"point")};o(fY,"MonotoneY");(fY.prototype=Object.create(J3.prototype)).point=function(t,e){J3.prototype.point.call(this,e,t)};o(dY,"ReflectContext");dY.prototype={moveTo:o(function(t,e){this._context.moveTo(e,t)},"moveTo"),closePath:o(function(){this._context.closePath()},"closePath"),lineTo:o(function(t,e){this._context.lineTo(e,t)},"lineTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._context.bezierCurveTo(e,t,n,r,a,i)},"bezierCurveTo")};o(b_,"monotoneX");o(w_,"monotoneY")});function gY(t){this._context=t}function mY(t){var e,r=t.length-1,n,i=new Array(r),a=new Array(r),s=new Array(r);for(i[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(s[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e{"use strict";o(gY,"Natural");gY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=[],this._y=[]},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length;if(r)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),r===2)this._context.lineTo(t[1],e[1]);else for(var n=mY(t),i=mY(e),a=0,s=1;s{"use strict";o(t5,"Step");t5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=this._y=NaN,this._point=0},"lineStart"),lineEnd:o(function(){0=0&&(this._t=1-this._t,this._line=1-this._line)},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e},"point")};o(r5,"default");o(T_,"stepBefore");o(k_,"stepAfter")});var xY=M(()=>{"use strict";GW();WW();XW();QW();JW();iv();jW();tY();d_();m_();av();iY();sY();Q3();lY();a_();pY();yY();vY()});var bY=M(()=>{"use strict"});var wY=M(()=>{"use strict"});function Ih(t,e,r){this.k=t,this.x=e,this.y=r}function S_(t){for(;!t.__zoom;)if(!(t=t.parentNode))return E_;return t.__zoom}var E_,C_=M(()=>{"use strict";o(Ih,"Transform");Ih.prototype={constructor:Ih,scale:o(function(t){return t===1?this:new Ih(this.k*t,this.x,this.y)},"scale"),translate:o(function(t,e){return t===0&e===0?this:new Ih(this.k,this.x+this.k*t,this.y+this.k*e)},"translate"),apply:o(function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},"apply"),applyX:o(function(t){return t*this.k+this.x},"applyX"),applyY:o(function(t){return t*this.k+this.y},"applyY"),invert:o(function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},"invert"),invertX:o(function(t){return(t-this.x)/this.k},"invertX"),invertY:o(function(t){return(t-this.y)/this.k},"invertY"),rescaleX:o(function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},"rescaleX"),rescaleY:o(function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},"rescaleY"),toString:o(function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"},"toString")};E_=new Ih(1,0,0);S_.prototype=Ih.prototype;o(S_,"transform")});var TY=M(()=>{"use strict"});var kY=M(()=>{"use strict";v3();bY();wY();C_();TY()});var EY=M(()=>{"use strict";kY();C_()});var pr=M(()=>{"use strict";kh();tV();bH();EH();Pp();SH();CH();T7();YV();AH();u8();_H();DH();A8();HH();WH();zp();m8();YH();LH();qH();IW();BW();Tl();xY();B3();Z8();f3();v3();EY()});var SY=Ei(na=>{"use strict";Object.defineProperty(na,"__esModule",{value:!0});na.BLANK_URL=na.relativeFirstCharacters=na.whitespaceEscapeCharsRegex=na.urlSchemeRegex=na.ctrlCharactersRegex=na.htmlCtrlEntityRegex=na.htmlEntitiesRegex=na.invalidProtocolRegex=void 0;na.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;na.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;na.htmlCtrlEntityRegex=/&(newline|tab);/gi;na.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;na.urlSchemeRegex=/^.+(:|:)/gim;na.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;na.relativeFirstCharacters=[".","/"];na.BLANK_URL="about:blank"});var Qp=Ei(n5=>{"use strict";Object.defineProperty(n5,"__esModule",{value:!0});n5.sanitizeUrl=void 0;var Ra=SY();function Hke(t){return Ra.relativeFirstCharacters.indexOf(t[0])>-1}o(Hke,"isRelativeUrlWithoutProtocol");function Wke(t){var e=t.replace(Ra.ctrlCharactersRegex,"");return e.replace(Ra.htmlEntitiesRegex,function(r,n){return String.fromCharCode(n)})}o(Wke,"decodeHtmlCharacters");function Yke(t){return URL.canParse(t)}o(Yke,"isValidUrl");function CY(t){try{return decodeURIComponent(t)}catch{return t}}o(CY,"decodeURI");function qke(t){if(!t)return Ra.BLANK_URL;var e,r=CY(t.trim());do r=Wke(r).replace(Ra.htmlCtrlEntityRegex,"").replace(Ra.ctrlCharactersRegex,"").replace(Ra.whitespaceEscapeCharsRegex,"").trim(),r=CY(r),e=r.match(Ra.ctrlCharactersRegex)||r.match(Ra.htmlEntitiesRegex)||r.match(Ra.htmlCtrlEntityRegex)||r.match(Ra.whitespaceEscapeCharsRegex);while(e&&e.length>0);var n=r;if(!n)return Ra.BLANK_URL;if(Hke(n))return n;var i=n.trimStart(),a=i.match(Ra.urlSchemeRegex);if(!a)return n;var s=a[0].toLowerCase().trim();if(Ra.invalidProtocolRegex.test(s))return Ra.BLANK_URL;var l=i.replace(/\\/g,"/");if(s==="mailto:"||s.includes("://"))return l;if(s==="http:"||s==="https:"){if(!Yke(l))return Ra.BLANK_URL;var u=new URL(l);return u.protocol=u.protocol.toLowerCase(),u.hostname=u.hostname.toLowerCase(),u.toString()}return l}o(qke,"sanitizeUrl");n5.sanitizeUrl=qke});var A_,Sd,i5,AY,_Y,LY,Nl,ov,lv=M(()=>{"use strict";A_=Ji(Qp(),1);fr();Sd=o((t,e)=>{let r=t.append("rect");if(r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),e.name&&r.attr("name",e.name),e.rx&&r.attr("rx",e.rx),e.ry&&r.attr("ry",e.ry),e.attrs!==void 0)for(let n in e.attrs)r.attr(n,e.attrs[n]);return e.class&&r.attr("class",e.class),r},"drawRect"),i5=o((t,e)=>{let r={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};Sd(t,r).lower()},"drawBackgroundRect"),AY=o((t,e)=>{let r=e.text.replace(ad," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),_Y=o((t,e,r,n)=>{let i=t.append("image");i.attr("x",e),i.attr("y",r);let a=(0,A_.sanitizeUrl)(n);i.attr("xlink:href",a)},"drawImage"),LY=o((t,e,r,n)=>{let i=t.append("use");i.attr("x",e),i.attr("y",r);let a=(0,A_.sanitizeUrl)(n);i.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),Nl=o(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),ov=o(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")});var DY,__,NY,Xke,jke,Kke,Qke,Zke,Jke,eEe,tEe,rEe,nEe,iEe,aEe,_u,Rl,RY=M(()=>{"use strict";fr();lv();DY=Ji(Qp(),1),__=o(function(t,e){return Sd(t,e)},"drawRect"),NY=o(function(t,e,r,n,i,a){let s=t.append("image");s.attr("width",e),s.attr("height",r),s.attr("x",n),s.attr("y",i);let l=a.startsWith("data:image/png;base64")?a:(0,DY.sanitizeUrl)(a);s.attr("xlink:href",l)},"drawImage"),Xke=o((t,e,r)=>{let n=t.append("g"),i=0;for(let a of e){let s=a.textColor?a.textColor:"#444444",l=a.lineColor?a.lineColor:"#444444",u=a.offsetX?parseInt(a.offsetX):0,h=a.offsetY?parseInt(a.offsetY):0,f="";if(i===0){let p=n.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",l),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)"),i=-1}else{let p=n.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",l).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)")}let d=r.messageFont();_u(r)(a.label.text,n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+h,a.label.width,a.label.height,{fill:s},d),a.techn&&a.techn.text!==""&&(d=r.messageFont(),_u(r)("["+a.techn.text+"]",n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+r.messageFontSize+5+h,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:s,"font-style":"italic"},d))}},"drawRels"),jke=o(function(t,e,r){let n=t.append("g"),i=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",l={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(l={"stroke-width":1});let u={x:e.x,y:e.y,fill:i,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:l};__(n,u);let h=r.boundaryFont();h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=s,_u(r)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},h),e.type&&e.type.text!==""&&(h=r.boundaryFont(),h.fontColor=s,_u(r)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},h)),e.descr&&e.descr.text!==""&&(h=r.boundaryFont(),h.fontSize=h.fontSize-2,h.fontColor=s,_u(r)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},h))},"drawBoundary"),Kke=o(function(t,e,r){let n=e.bgColor?e.bgColor:r[e.typeC4Shape.text+"_bg_color"],i=e.borderColor?e.borderColor:r[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let l=t.append("g");l.attr("class","person-man");let u=Nl();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":u.x=e.x,u.y=e.y,u.fill=n,u.width=e.width,u.height=e.height,u.stroke=i,u.rx=2.5,u.ry=2.5,u.attrs={"stroke-width":.5},__(l,u);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2));break}let h=aEe(r,e.typeC4Shape.text);switch(l.append("text").attr("fill",a).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":NY(l,48,48,e.x+e.width/2-24,e.y+e.image.Y,s);break}let f=r[e.typeC4Shape.text+"Font"]();return f.fontWeight="bold",f.fontSize=f.fontSize+2,f.fontColor=a,_u(r)(e.label.text,l,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},f),f=r[e.typeC4Shape.text+"Font"](),f.fontColor=a,e.techn&&e.techn?.text!==""?_u(r)(e.techn.text,l,e.x,e.y+e.techn.Y,e.width,e.height,{fill:a,"font-style":"italic"},f):e.type&&e.type.text!==""&&_u(r)(e.type.text,l,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},f),e.descr&&e.descr.text!==""&&(f=r.personFont(),f.fontColor=a,_u(r)(e.descr.text,l,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},f)),e.height},"drawC4Shape"),Qke=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),Zke=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),Jke=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),eEe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),tEe=o(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),rEe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),nEe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),iEe=o(function(t){let r=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);r.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),r.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),aEe=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),_u=function(){function t(i,a,s,l,u,h,f){let d=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("text-anchor","middle").text(i);n(d,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d){let{fontSize:p,fontFamily:m,fontWeight:g}=d,y=i.split(qe.lineBreakRegex);for(let v=0;v{"use strict";sEe=typeof global=="object"&&global&&global.Object===Object&&global,s5=sEe});var oEe,lEe,oi,Bo=M(()=>{"use strict";L_();oEe=typeof self=="object"&&self&&self.Object===Object&&self,lEe=s5||oEe||Function("return this")(),oi=lEe});var cEe,ia,Cd=M(()=>{"use strict";Bo();cEe=oi.Symbol,ia=cEe});function fEe(t){var e=uEe.call(t,cv),r=t[cv];try{t[cv]=void 0;var n=!0}catch{}var i=hEe.call(t);return n&&(e?t[cv]=r:delete t[cv]),i}var MY,uEe,hEe,cv,IY,OY=M(()=>{"use strict";Cd();MY=Object.prototype,uEe=MY.hasOwnProperty,hEe=MY.toString,cv=ia?ia.toStringTag:void 0;o(fEe,"getRawTag");IY=fEe});function mEe(t){return pEe.call(t)}var dEe,pEe,PY,BY=M(()=>{"use strict";dEe=Object.prototype,pEe=dEe.toString;o(mEe,"objectToString");PY=mEe});function vEe(t){return t==null?t===void 0?yEe:gEe:FY&&FY in Object(t)?IY(t):PY(t)}var gEe,yEe,FY,ga,Lu=M(()=>{"use strict";Cd();OY();BY();gEe="[object Null]",yEe="[object Undefined]",FY=ia?ia.toStringTag:void 0;o(vEe,"baseGetTag");ga=vEe});function xEe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var xn,io=M(()=>{"use strict";o(xEe,"isObject");xn=xEe});function EEe(t){if(!xn(t))return!1;var e=ga(t);return e==wEe||e==TEe||e==bEe||e==kEe}var bEe,wEe,TEe,kEe,_i,uv=M(()=>{"use strict";Lu();io();bEe="[object AsyncFunction]",wEe="[object Function]",TEe="[object GeneratorFunction]",kEe="[object Proxy]";o(EEe,"isFunction");_i=EEe});var SEe,o5,zY=M(()=>{"use strict";Bo();SEe=oi["__core-js_shared__"],o5=SEe});function CEe(t){return!!GY&&GY in t}var GY,$Y,VY=M(()=>{"use strict";zY();GY=function(){var t=/[^.]+$/.exec(o5&&o5.keys&&o5.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();o(CEe,"isMasked");$Y=CEe});function LEe(t){if(t!=null){try{return _Ee.call(t)}catch{}try{return t+""}catch{}}return""}var AEe,_Ee,Du,D_=M(()=>{"use strict";AEe=Function.prototype,_Ee=AEe.toString;o(LEe,"toSource");Du=LEe});function BEe(t){if(!xn(t)||$Y(t))return!1;var e=_i(t)?PEe:NEe;return e.test(Du(t))}var DEe,NEe,REe,MEe,IEe,OEe,PEe,UY,HY=M(()=>{"use strict";uv();VY();io();D_();DEe=/[\\^$.*+?()[\]{}|]/g,NEe=/^\[object .+?Constructor\]$/,REe=Function.prototype,MEe=Object.prototype,IEe=REe.toString,OEe=MEe.hasOwnProperty,PEe=RegExp("^"+IEe.call(OEe).replace(DEe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");o(BEe,"baseIsNative");UY=BEe});function FEe(t,e){return t?.[e]}var WY,YY=M(()=>{"use strict";o(FEe,"getValue");WY=FEe});function zEe(t,e){var r=WY(t,e);return UY(r)?r:void 0}var As,Oh=M(()=>{"use strict";HY();YY();o(zEe,"getNative");As=zEe});var GEe,Nu,hv=M(()=>{"use strict";Oh();GEe=As(Object,"create"),Nu=GEe});function $Ee(){this.__data__=Nu?Nu(null):{},this.size=0}var qY,XY=M(()=>{"use strict";hv();o($Ee,"hashClear");qY=$Ee});function VEe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var jY,KY=M(()=>{"use strict";o(VEe,"hashDelete");jY=VEe});function YEe(t){var e=this.__data__;if(Nu){var r=e[t];return r===UEe?void 0:r}return WEe.call(e,t)?e[t]:void 0}var UEe,HEe,WEe,QY,ZY=M(()=>{"use strict";hv();UEe="__lodash_hash_undefined__",HEe=Object.prototype,WEe=HEe.hasOwnProperty;o(YEe,"hashGet");QY=YEe});function jEe(t){var e=this.__data__;return Nu?e[t]!==void 0:XEe.call(e,t)}var qEe,XEe,JY,eq=M(()=>{"use strict";hv();qEe=Object.prototype,XEe=qEe.hasOwnProperty;o(jEe,"hashHas");JY=jEe});function QEe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Nu&&e===void 0?KEe:e,this}var KEe,tq,rq=M(()=>{"use strict";hv();KEe="__lodash_hash_undefined__";o(QEe,"hashSet");tq=QEe});function Zp(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";XY();KY();ZY();eq();rq();o(Zp,"Hash");Zp.prototype.clear=qY;Zp.prototype.delete=jY;Zp.prototype.get=QY;Zp.prototype.has=JY;Zp.prototype.set=tq;N_=Zp});function ZEe(){this.__data__=[],this.size=0}var iq,aq=M(()=>{"use strict";o(ZEe,"listCacheClear");iq=ZEe});function JEe(t,e){return t===e||t!==t&&e!==e}var Fo,Ad=M(()=>{"use strict";o(JEe,"eq");Fo=JEe});function e6e(t,e){for(var r=t.length;r--;)if(Fo(t[r][0],e))return r;return-1}var Ph,fv=M(()=>{"use strict";Ad();o(e6e,"assocIndexOf");Ph=e6e});function n6e(t){var e=this.__data__,r=Ph(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():r6e.call(e,r,1),--this.size,!0}var t6e,r6e,sq,oq=M(()=>{"use strict";fv();t6e=Array.prototype,r6e=t6e.splice;o(n6e,"listCacheDelete");sq=n6e});function i6e(t){var e=this.__data__,r=Ph(e,t);return r<0?void 0:e[r][1]}var lq,cq=M(()=>{"use strict";fv();o(i6e,"listCacheGet");lq=i6e});function a6e(t){return Ph(this.__data__,t)>-1}var uq,hq=M(()=>{"use strict";fv();o(a6e,"listCacheHas");uq=a6e});function s6e(t,e){var r=this.__data__,n=Ph(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}var fq,dq=M(()=>{"use strict";fv();o(s6e,"listCacheSet");fq=s6e});function Jp(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";aq();oq();cq();hq();dq();o(Jp,"ListCache");Jp.prototype.clear=iq;Jp.prototype.delete=sq;Jp.prototype.get=lq;Jp.prototype.has=uq;Jp.prototype.set=fq;Bh=Jp});var o6e,Fh,l5=M(()=>{"use strict";Oh();Bo();o6e=As(oi,"Map"),Fh=o6e});function l6e(){this.size=0,this.__data__={hash:new N_,map:new(Fh||Bh),string:new N_}}var pq,mq=M(()=>{"use strict";nq();dv();l5();o(l6e,"mapCacheClear");pq=l6e});function c6e(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var gq,yq=M(()=>{"use strict";o(c6e,"isKeyable");gq=c6e});function u6e(t,e){var r=t.__data__;return gq(e)?r[typeof e=="string"?"string":"hash"]:r.map}var zh,pv=M(()=>{"use strict";yq();o(u6e,"getMapData");zh=u6e});function h6e(t){var e=zh(this,t).delete(t);return this.size-=e?1:0,e}var vq,xq=M(()=>{"use strict";pv();o(h6e,"mapCacheDelete");vq=h6e});function f6e(t){return zh(this,t).get(t)}var bq,wq=M(()=>{"use strict";pv();o(f6e,"mapCacheGet");bq=f6e});function d6e(t){return zh(this,t).has(t)}var Tq,kq=M(()=>{"use strict";pv();o(d6e,"mapCacheHas");Tq=d6e});function p6e(t,e){var r=zh(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}var Eq,Sq=M(()=>{"use strict";pv();o(p6e,"mapCacheSet");Eq=p6e});function em(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";mq();xq();wq();kq();Sq();o(em,"MapCache");em.prototype.clear=pq;em.prototype.delete=vq;em.prototype.get=bq;em.prototype.has=Tq;em.prototype.set=Eq;_d=em});function R_(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(m6e);var r=o(function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=t.apply(this,n);return r.cache=a.set(i,s)||a,s},"memoized");return r.cache=new(R_.Cache||_d),r}var m6e,tm,M_=M(()=>{"use strict";c5();m6e="Expected a function";o(R_,"memoize");R_.Cache=_d;tm=R_});function g6e(){this.__data__=new Bh,this.size=0}var Cq,Aq=M(()=>{"use strict";dv();o(g6e,"stackClear");Cq=g6e});function y6e(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var _q,Lq=M(()=>{"use strict";o(y6e,"stackDelete");_q=y6e});function v6e(t){return this.__data__.get(t)}var Dq,Nq=M(()=>{"use strict";o(v6e,"stackGet");Dq=v6e});function x6e(t){return this.__data__.has(t)}var Rq,Mq=M(()=>{"use strict";o(x6e,"stackHas");Rq=x6e});function w6e(t,e){var r=this.__data__;if(r instanceof Bh){var n=r.__data__;if(!Fh||n.length{"use strict";dv();l5();c5();b6e=200;o(w6e,"stackSet");Iq=w6e});function rm(t){var e=this.__data__=new Bh(t);this.size=e.size}var bc,mv=M(()=>{"use strict";dv();Aq();Lq();Nq();Mq();Oq();o(rm,"Stack");rm.prototype.clear=Cq;rm.prototype.delete=_q;rm.prototype.get=Dq;rm.prototype.has=Rq;rm.prototype.set=Iq;bc=rm});var T6e,nm,I_=M(()=>{"use strict";Oh();T6e=function(){try{var t=As(Object,"defineProperty");return t({},"",{}),t}catch{}}(),nm=T6e});function k6e(t,e,r){e=="__proto__"&&nm?nm(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var wc,im=M(()=>{"use strict";I_();o(k6e,"baseAssignValue");wc=k6e});function E6e(t,e,r){(r!==void 0&&!Fo(t[e],r)||r===void 0&&!(e in t))&&wc(t,e,r)}var gv,O_=M(()=>{"use strict";im();Ad();o(E6e,"assignMergeValue");gv=E6e});function S6e(t){return function(e,r,n){for(var i=-1,a=Object(e),s=n(e),l=s.length;l--;){var u=s[t?l:++i];if(r(a[u],u,a)===!1)break}return e}}var Pq,Bq=M(()=>{"use strict";o(S6e,"createBaseFor");Pq=S6e});var C6e,am,u5=M(()=>{"use strict";Bq();C6e=Pq(),am=C6e});function _6e(t,e){if(e)return t.slice();var r=t.length,n=Gq?Gq(r):new t.constructor(r);return t.copy(n),n}var $q,Fq,A6e,zq,Gq,h5,P_=M(()=>{"use strict";Bo();$q=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Fq=$q&&typeof module=="object"&&module&&!module.nodeType&&module,A6e=Fq&&Fq.exports===$q,zq=A6e?oi.Buffer:void 0,Gq=zq?zq.allocUnsafe:void 0;o(_6e,"cloneBuffer");h5=_6e});var L6e,sm,B_=M(()=>{"use strict";Bo();L6e=oi.Uint8Array,sm=L6e});function D6e(t){var e=new t.constructor(t.byteLength);return new sm(e).set(new sm(t)),e}var om,f5=M(()=>{"use strict";B_();o(D6e,"cloneArrayBuffer");om=D6e});function N6e(t,e){var r=e?om(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}var d5,F_=M(()=>{"use strict";f5();o(N6e,"cloneTypedArray");d5=N6e});function R6e(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{"use strict";o(R6e,"copyArray");p5=R6e});var Vq,M6e,Uq,Hq=M(()=>{"use strict";io();Vq=Object.create,M6e=function(){function t(){}return o(t,"object"),function(e){if(!xn(e))return{};if(Vq)return Vq(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}(),Uq=M6e});function I6e(t,e){return function(r){return t(e(r))}}var m5,G_=M(()=>{"use strict";o(I6e,"overArg");m5=I6e});var O6e,lm,g5=M(()=>{"use strict";G_();O6e=m5(Object.getPrototypeOf,Object),lm=O6e});function B6e(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||P6e;return t===r}var P6e,Tc,cm=M(()=>{"use strict";P6e=Object.prototype;o(B6e,"isPrototype");Tc=B6e});function F6e(t){return typeof t.constructor=="function"&&!Tc(t)?Uq(lm(t)):{}}var y5,$_=M(()=>{"use strict";Hq();g5();cm();o(F6e,"initCloneObject");y5=F6e});function z6e(t){return t!=null&&typeof t=="object"}var ei,zo=M(()=>{"use strict";o(z6e,"isObjectLike");ei=z6e});function $6e(t){return ei(t)&&ga(t)==G6e}var G6e,V_,Wq=M(()=>{"use strict";Lu();zo();G6e="[object Arguments]";o($6e,"baseIsArguments");V_=$6e});var Yq,V6e,U6e,H6e,Ml,um=M(()=>{"use strict";Wq();zo();Yq=Object.prototype,V6e=Yq.hasOwnProperty,U6e=Yq.propertyIsEnumerable,H6e=V_(function(){return arguments}())?V_:function(t){return ei(t)&&V6e.call(t,"callee")&&!U6e.call(t,"callee")},Ml=H6e});var W6e,Dt,Hn=M(()=>{"use strict";W6e=Array.isArray,Dt=W6e});function q6e(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=Y6e}var Y6e,hm,v5=M(()=>{"use strict";Y6e=9007199254740991;o(q6e,"isLength");hm=q6e});function X6e(t){return t!=null&&hm(t.length)&&!_i(t)}var li,Go=M(()=>{"use strict";uv();v5();o(X6e,"isArrayLike");li=X6e});function j6e(t){return ei(t)&&li(t)}var Ld,x5=M(()=>{"use strict";Go();zo();o(j6e,"isArrayLikeObject");Ld=j6e});function K6e(){return!1}var qq,Xq=M(()=>{"use strict";o(K6e,"stubFalse");qq=K6e});var Qq,jq,Q6e,Kq,Z6e,J6e,Il,fm=M(()=>{"use strict";Bo();Xq();Qq=typeof exports=="object"&&exports&&!exports.nodeType&&exports,jq=Qq&&typeof module=="object"&&module&&!module.nodeType&&module,Q6e=jq&&jq.exports===Qq,Kq=Q6e?oi.Buffer:void 0,Z6e=Kq?Kq.isBuffer:void 0,J6e=Z6e||qq,Il=J6e});function aSe(t){if(!ei(t)||ga(t)!=eSe)return!1;var e=lm(t);if(e===null)return!0;var r=nSe.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&Zq.call(r)==iSe}var eSe,tSe,rSe,Zq,nSe,iSe,Jq,eX=M(()=>{"use strict";Lu();g5();zo();eSe="[object Object]",tSe=Function.prototype,rSe=Object.prototype,Zq=tSe.toString,nSe=rSe.hasOwnProperty,iSe=Zq.call(Object);o(aSe,"isPlainObject");Jq=aSe});function DSe(t){return ei(t)&&hm(t.length)&&!!zn[ga(t)]}var sSe,oSe,lSe,cSe,uSe,hSe,fSe,dSe,pSe,mSe,gSe,ySe,vSe,xSe,bSe,wSe,TSe,kSe,ESe,SSe,CSe,ASe,_Se,LSe,zn,tX,rX=M(()=>{"use strict";Lu();v5();zo();sSe="[object Arguments]",oSe="[object Array]",lSe="[object Boolean]",cSe="[object Date]",uSe="[object Error]",hSe="[object Function]",fSe="[object Map]",dSe="[object Number]",pSe="[object Object]",mSe="[object RegExp]",gSe="[object Set]",ySe="[object String]",vSe="[object WeakMap]",xSe="[object ArrayBuffer]",bSe="[object DataView]",wSe="[object Float32Array]",TSe="[object Float64Array]",kSe="[object Int8Array]",ESe="[object Int16Array]",SSe="[object Int32Array]",CSe="[object Uint8Array]",ASe="[object Uint8ClampedArray]",_Se="[object Uint16Array]",LSe="[object Uint32Array]",zn={};zn[wSe]=zn[TSe]=zn[kSe]=zn[ESe]=zn[SSe]=zn[CSe]=zn[ASe]=zn[_Se]=zn[LSe]=!0;zn[sSe]=zn[oSe]=zn[xSe]=zn[lSe]=zn[bSe]=zn[cSe]=zn[uSe]=zn[hSe]=zn[fSe]=zn[dSe]=zn[pSe]=zn[mSe]=zn[gSe]=zn[ySe]=zn[vSe]=!1;o(DSe,"baseIsTypedArray");tX=DSe});function NSe(t){return function(e){return t(e)}}var $o,Dd=M(()=>{"use strict";o(NSe,"baseUnary");$o=NSe});var nX,yv,RSe,U_,MSe,Vo,vv=M(()=>{"use strict";L_();nX=typeof exports=="object"&&exports&&!exports.nodeType&&exports,yv=nX&&typeof module=="object"&&module&&!module.nodeType&&module,RSe=yv&&yv.exports===nX,U_=RSe&&s5.process,MSe=function(){try{var t=yv&&yv.require&&yv.require("util").types;return t||U_&&U_.binding&&U_.binding("util")}catch{}}(),Vo=MSe});var iX,ISe,Gh,xv=M(()=>{"use strict";rX();Dd();vv();iX=Vo&&Vo.isTypedArray,ISe=iX?$o(iX):tX,Gh=ISe});function OSe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}var bv,H_=M(()=>{"use strict";o(OSe,"safeGet");bv=OSe});function FSe(t,e,r){var n=t[e];(!(BSe.call(t,e)&&Fo(n,r))||r===void 0&&!(e in t))&&wc(t,e,r)}var PSe,BSe,kc,dm=M(()=>{"use strict";im();Ad();PSe=Object.prototype,BSe=PSe.hasOwnProperty;o(FSe,"assignValue");kc=FSe});function zSe(t,e,r,n){var i=!r;r||(r={});for(var a=-1,s=e.length;++a{"use strict";dm();im();o(zSe,"copyObject");Uo=zSe});function GSe(t,e){for(var r=-1,n=Array(t);++r{"use strict";o(GSe,"baseTimes");aX=GSe});function USe(t,e){var r=typeof t;return e=e??$Se,!!e&&(r=="number"||r!="symbol"&&VSe.test(t))&&t>-1&&t%1==0&&t{"use strict";$Se=9007199254740991,VSe=/^(?:0|[1-9]\d*)$/;o(USe,"isIndex");$h=USe});function YSe(t,e){var r=Dt(t),n=!r&&Ml(t),i=!r&&!n&&Il(t),a=!r&&!n&&!i&&Gh(t),s=r||n||i||a,l=s?aX(t.length,String):[],u=l.length;for(var h in t)(e||WSe.call(t,h))&&!(s&&(h=="length"||i&&(h=="offset"||h=="parent")||a&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||$h(h,u)))&&l.push(h);return l}var HSe,WSe,b5,W_=M(()=>{"use strict";sX();um();Hn();fm();wv();xv();HSe=Object.prototype,WSe=HSe.hasOwnProperty;o(YSe,"arrayLikeKeys");b5=YSe});function qSe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}var oX,lX=M(()=>{"use strict";o(qSe,"nativeKeysIn");oX=qSe});function KSe(t){if(!xn(t))return oX(t);var e=Tc(t),r=[];for(var n in t)n=="constructor"&&(e||!jSe.call(t,n))||r.push(n);return r}var XSe,jSe,cX,uX=M(()=>{"use strict";io();cm();lX();XSe=Object.prototype,jSe=XSe.hasOwnProperty;o(KSe,"baseKeysIn");cX=KSe});function QSe(t){return li(t)?b5(t,!0):cX(t)}var _s,Vh=M(()=>{"use strict";W_();uX();Go();o(QSe,"keysIn");_s=QSe});function ZSe(t){return Uo(t,_s(t))}var hX,fX=M(()=>{"use strict";Nd();Vh();o(ZSe,"toPlainObject");hX=ZSe});function JSe(t,e,r,n,i,a,s){var l=bv(t,r),u=bv(e,r),h=s.get(u);if(h){gv(t,r,h);return}var f=a?a(l,u,r+"",t,e,s):void 0,d=f===void 0;if(d){var p=Dt(u),m=!p&&Il(u),g=!p&&!m&&Gh(u);f=u,p||m||g?Dt(l)?f=l:Ld(l)?f=p5(l):m?(d=!1,f=h5(u,!0)):g?(d=!1,f=d5(u,!0)):f=[]:Jq(u)||Ml(u)?(f=l,Ml(l)?f=hX(l):(!xn(l)||_i(l))&&(f=y5(u))):d=!1}d&&(s.set(u,f),i(f,u,n,a,s),s.delete(u)),gv(t,r,f)}var dX,pX=M(()=>{"use strict";O_();P_();F_();z_();$_();um();Hn();x5();fm();uv();io();eX();xv();H_();fX();o(JSe,"baseMergeDeep");dX=JSe});function mX(t,e,r,n,i){t!==e&&am(e,function(a,s){if(i||(i=new bc),xn(a))dX(t,e,s,r,mX,n,i);else{var l=n?n(bv(t,s),a,s+"",t,e,i):void 0;l===void 0&&(l=a),gv(t,s,l)}},_s)}var gX,yX=M(()=>{"use strict";mv();O_();u5();pX();io();Vh();H_();o(mX,"baseMerge");gX=mX});function eCe(t){return t}var aa,Ru=M(()=>{"use strict";o(eCe,"identity");aa=eCe});function tCe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var vX,xX=M(()=>{"use strict";o(tCe,"apply");vX=tCe});function rCe(t,e,r){return e=bX(e===void 0?t.length-1:e,0),function(){for(var n=arguments,i=-1,a=bX(n.length-e,0),s=Array(a);++i{"use strict";xX();bX=Math.max;o(rCe,"overRest");w5=rCe});function nCe(t){return function(){return t}}var Ls,q_=M(()=>{"use strict";o(nCe,"constant");Ls=nCe});var iCe,wX,TX=M(()=>{"use strict";q_();I_();Ru();iCe=nm?function(t,e){return nm(t,"toString",{configurable:!0,enumerable:!1,value:Ls(e),writable:!0})}:aa,wX=iCe});function lCe(t){var e=0,r=0;return function(){var n=oCe(),i=sCe-(n-r);if(r=n,i>0){if(++e>=aCe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var aCe,sCe,oCe,kX,EX=M(()=>{"use strict";aCe=800,sCe=16,oCe=Date.now;o(lCe,"shortOut");kX=lCe});var cCe,T5,X_=M(()=>{"use strict";TX();EX();cCe=kX(wX),T5=cCe});function uCe(t,e){return T5(w5(t,e,aa),t+"")}var Ec,pm=M(()=>{"use strict";Ru();Y_();X_();o(uCe,"baseRest");Ec=uCe});function hCe(t,e,r){if(!xn(r))return!1;var n=typeof e;return(n=="number"?li(r)&&$h(e,r.length):n=="string"&&e in r)?Fo(r[e],t):!1}var ao,Rd=M(()=>{"use strict";Ad();Go();wv();io();o(hCe,"isIterateeCall");ao=hCe});function fCe(t){return Ec(function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&typeof a=="function"?(i--,a):void 0,s&&ao(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{"use strict";pm();Rd();o(fCe,"createAssigner");k5=fCe});var dCe,Uh,K_=M(()=>{"use strict";yX();j_();dCe=k5(function(t,e,r){gX(t,e,r)}),Uh=dCe});function J_(t,e){if(!t)return e;let r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return pCe[r]??e}function vCe(t,e){let r=t.trim();if(r)return e.securityLevel!=="loose"?(0,AX.sanitizeUrl)(r):r}function DX(t,e){return!t||!e?0:Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function bCe(t){let e,r=0;t.forEach(i=>{r+=DX(i,e),e=i});let n=r/2;return e9(t,n)}function wCe(t){return t.length===1?t[0]:bCe(t)}function kCe(t,e,r){let n=structuredClone(r);Y.info("our points",n),e!=="start_left"&&e!=="start_right"&&n.reverse();let i=25+t,a=e9(n,i),s=10+t*.5,l=Math.atan2(n[0].y-a.y,n[0].x-a.x),u={x:0,y:0};return e==="start_left"?(u.x=Math.sin(l+Math.PI)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l+Math.PI)*s+(n[0].y+a.y)/2):e==="end_right"?(u.x=Math.sin(l-Math.PI)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l-Math.PI)*s+(n[0].y+a.y)/2-5):e==="end_left"?(u.x=Math.sin(l)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2-5):(u.x=Math.sin(l)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2),u}function t9(t){let e="",r="";for(let n of t)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}function ECe(t){let e="",r="0123456789abcdef",n=r.length;for(let i=0;i{"use strict";AX=Ji(Qp(),1);pr();fr();nC();ut();Zf();gp();M_();K_();Qb();Z_="\u200B",pCe={curveBasis:Po,curveBasisClosed:Y3,curveBasisOpen:q3,curveBumpX:l_,curveBumpY:c_,curveBundle:u_,curveCardinalClosed:f_,curveCardinalOpen:p_,curveCardinal:h_,curveCatmullRomClosed:y_,curveCatmullRomOpen:v_,curveCatmullRom:g_,curveLinear:Xp,curveLinearClosed:Z3,curveMonotoneX:b_,curveMonotoneY:w_,curveNatural:e5,curveStep:r5,curveStepAfter:k_,curveStepBefore:T_},mCe=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,gCe=o(function(t,e){let r=_X(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let s=r.map(l=>l.args);xp(s),n=Vn(n,[...s])}else n=r.args;if(!n)return;let i=mp(t,e),a="config";return n[a]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[a],delete n[a]),n},"detectInit"),_X=o(function(t,e=null){try{let r=new RegExp(`[%]{2}(?![{]${mCe.source})(?=[}][%]{2}).* +`,"ig");t=t.trim().replace(r,"").replace(/'/gm,'"'),Y.debug(`Detecting diagram directive${e!==null?" type:"+e:""} based on the text:${t}`);let n,i=[];for(;(n=Kf.exec(t))!==null;)if(n.index===Kf.lastIndex&&Kf.lastIndex++,n&&!e||e&&n[1]?.match(e)||e&&n[2]?.match(e)){let a=n[1]?n[1]:n[2],s=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:a,args:s})}return i.length===0?{type:t,args:null}:i.length===1?i[0]:i}catch(r){return Y.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),LX=o(function(t){return t.replace(Kf,"")},"removeDirectives"),yCe=o(function(t,e){for(let[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");o(J_,"interpolateToCurve");o(vCe,"formatUrl");xCe=o((t,...e)=>{let r=t.split("."),n=r.length-1,i=r[n],a=window;for(let s=0;s{let r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),e9=o((t,e)=>{let r,n=e;for(let i of t){if(r){let a=DX(i,r);if(a=1)return{x:i.x,y:i.y};if(s>0&&s<1)return{x:SX((1-s)*r.x+s*i.x,5),y:SX((1-s)*r.y+s*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),TCe=o((t,e,r)=>{Y.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());let i=e9(e,25),a=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(s)*a+(e[0].x+i.x)/2,l.y=-Math.cos(s)*a+(e[0].y+i.y)/2,l},"calcCardinalityPosition");o(kCe,"calcTerminalLabelPosition");o(t9,"getStylesFromArray");CX=0,r9=o(()=>(CX++,"id-"+Math.random().toString(36).substr(2,12)+"-"+CX),"generateId");o(ECe,"makeRandomHex");n9=o(t=>ECe(t.length),"random"),SCe=o(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),CCe=o(function(t,e){let r=e.text.replace(qe.lineBreakRegex," "),[,n]=Ho(e.fontSize),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",n),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),e.class!==void 0&&i.attr("class",e.class);let a=i.append("tspan");return a.attr("x",e.x+e.textMargin*2),a.attr("fill",e.fill),a.text(r),i},"drawSimpleText"),i9=tm((t,e,r)=>{if(!t||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
    "},r),qe.lineBreakRegex.test(t)))return t;let n=t.split(" ").filter(Boolean),i=[],a="";return n.forEach((s,l)=>{let u=so(`${s} `,r),h=so(a,r);if(u>e){let{hyphenatedStrings:p,remainingWord:m}=ACe(s,e,"-",r);i.push(a,...p),a=m}else h+u>=e?(i.push(a),a=s):a=[a,s].filter(Boolean).join(" ");l+1===n.length&&i.push(a)}),i.filter(s=>s!=="").join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),ACe=tm((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...t],a=[],s="";return i.forEach((l,u)=>{let h=`${s}${l}`;if(so(h,n)>=e){let d=u+1,p=i.length===d,m=`${h}${r}`;a.push(p?h:m),s=""}else s=h}),{hyphenatedStrings:a,remainingWord:s}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);o(S5,"calculateTextHeight");o(so,"calculateTextWidth");a9=tm((t,e)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=e;if(!t)return{width:0,height:0};let[,a]=Ho(r),s=["sans-serif",n],l=t.split(qe.lineBreakRegex),u=[],h=Ve("body");if(!h.remove)return{width:0,height:0,lineHeight:0};let f=h.append("svg");for(let p of s){let m=0,g={width:0,height:0,lineHeight:0};for(let y of l){let v=SCe();v.text=y||Z_;let x=CCe(f,v).style("font-size",a).style("font-weight",i).style("font-family",p),b=(x._groups||x)[0][0].getBBox();if(b.width===0&&b.height===0)throw new Error("svg element not in render tree");g.width=Math.round(Math.max(g.width,b.width)),m=Math.round(b.height),g.height+=m,g.lineHeight=Math.round(Math.max(g.lineHeight,m))}u.push(g)}f.remove();let d=isNaN(u[1].height)||isNaN(u[1].width)||isNaN(u[1].lineHeight)||u[0].height>u[1].height&&u[0].width>u[1].width&&u[0].lineHeight>u[1].lineHeight?0:1;return u[d]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),Q_=class{constructor(e=!1,r){this.count=0;this.count=r?r.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{o(this,"InitIDGenerator")}},_Ce=o(function(t){return E5=E5||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),E5.innerHTML=t,unescape(E5.textContent)},"entityDecode");o(s9,"isDetailedError");LCe=o((t,e,r,n)=>{if(!n)return;let i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),Ho=o(t=>{if(typeof t=="number")return[t,t+"px"];let e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");o(Ds,"cleanAndMerge");Ut={assignWithDepth:Vn,wrapLabel:i9,calculateTextHeight:S5,calculateTextWidth:so,calculateTextDimensions:a9,cleanAndMerge:Ds,detectInit:gCe,detectDirective:_X,isSubstringInArray:yCe,interpolateToCurve:J_,calcLabelPosition:wCe,calcCardinalityPosition:TCe,calcTerminalLabelPosition:kCe,formatUrl:vCe,getStylesFromArray:t9,generateId:r9,random:n9,runFunc:xCe,entityDecode:_Ce,insertTitle:LCe,parseFontSize:Ho,InitIDGenerator:Q_},NX=o(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),e},"encodeEntities"),Ma=o(function(t){return t.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),C5=o((t,e,{counter:r=0,prefix:n,suffix:i})=>`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");o(Gn,"handleUndefinedAttr")});function Ol(t,e,r,n,i){if(!e[t].width)if(r)e[t].text=i9(e[t].text,i,n),e[t].textLines=e[t].text.split(qe.lineBreakRegex).length,e[t].width=i,e[t].height=S5(e[t].text,n);else{let a=e[t].text.split(qe.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(let l of a)e[t].width=Math.max(so(l,n),e[t].width),s=S5(l,n),e[t].height=e[t].height+s}}function PX(t,e,r,n,i){let a=new D5(i);a.data.widthLimit=r.data.widthLimit/Math.min(o9,n.length);for(let[s,l]of n.entries()){let u=0;l.image={width:0,height:0,Y:0},l.sprite&&(l.image.width=48,l.image.height=48,l.image.Y=u,u=l.image.Y+l.image.height);let h=l.wrap&&Gt.wrap,f=A5(Gt);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Ol("label",l,h,f,a.data.widthLimit),l.label.Y=u+8,u=l.label.Y+l.label.height,l.type&&l.type.text!==""){l.type.text="["+l.type.text+"]";let g=A5(Gt);Ol("type",l,h,g,a.data.widthLimit),l.type.Y=u+5,u=l.type.Y+l.type.height}if(l.descr&&l.descr.text!==""){let g=A5(Gt);g.fontSize=g.fontSize-2,Ol("descr",l,h,g,a.data.widthLimit),l.descr.Y=u+20,u=l.descr.Y+l.descr.height}if(s==0||s%o9===0){let g=r.data.startx+Gt.diagramMarginX,y=r.data.stopy+Gt.diagramMarginY+u;a.setData(g,g,y,y)}else{let g=a.data.stopx!==a.data.startx?a.data.stopx+Gt.diagramMarginX:a.data.startx,y=a.data.starty;a.setData(g,g,y,y)}a.name=l.alias;let d=i.db.getC4ShapeArray(l.alias),p=i.db.getC4ShapeKeys(l.alias);p.length>0&&OX(a,t,d,p),e=l.alias;let m=i.db.getBoundarys(e);m.length>0&&PX(t,e,a,m,i),l.alias!=="global"&&IX(t,l,a),r.data.stopy=Math.max(a.data.stopy+Gt.c4ShapeMargin,r.data.stopy),r.data.stopx=Math.max(a.data.stopx+Gt.c4ShapeMargin,r.data.stopx),_5=Math.max(_5,r.data.stopx),L5=Math.max(L5,r.data.stopy)}}var _5,L5,MX,o9,Gt,D5,l9,Tv,A5,DCe,IX,OX,Ns,RX,NCe,RCe,MCe,c9,BX=M(()=>{"use strict";pr();RY();ut();US();fr();u7();Vt();gp();hr();ai();_5=0,L5=0,MX=4,o9=2;ey.yy=Ty;Gt={},D5=class{static{o(this,"Bounds")}constructor(e){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,l9(e.db.getConfig())}setData(e,r,n,i){this.nextData.startx=this.data.startx=e,this.nextData.stopx=this.data.stopx=r,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(e,r,n,i){e[r]===void 0?e[r]=n:e[r]=i(n,e[r])}insert(e){this.nextData.cnt=this.nextData.cnt+1;let r=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+e.margin:this.nextData.stopx+e.margin*2,n=r+e.width,i=this.nextData.starty+e.margin*2,a=i+e.height;(r>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>MX)&&(r=this.nextData.startx+e.margin+Gt.nextLinePaddingX,i=this.nextData.stopy+e.margin*2,this.nextData.stopx=n=r+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=a=i+e.height,this.nextData.cnt=1),e.x=r,e.y=i,this.updateVal(this.data,"startx",r,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",a,Math.max),this.updateVal(this.nextData,"startx",r,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",a,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},l9(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},l9=o(function(t){Vn(Gt,t),t.fontFamily&&(Gt.personFontFamily=Gt.systemFontFamily=Gt.messageFontFamily=t.fontFamily),t.fontSize&&(Gt.personFontSize=Gt.systemFontSize=Gt.messageFontSize=t.fontSize),t.fontWeight&&(Gt.personFontWeight=Gt.systemFontWeight=Gt.messageFontWeight=t.fontWeight)},"setConf"),Tv=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),A5=o(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),DCe=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");o(Ol,"calcC4ShapeTextWH");IX=o(function(t,e,r){e.x=r.data.startx,e.y=r.data.starty,e.width=r.data.stopx-r.data.startx,e.height=r.data.stopy-r.data.starty,e.label.y=Gt.c4ShapeMargin-35;let n=e.wrap&&Gt.wrap,i=A5(Gt);i.fontSize=i.fontSize+2,i.fontWeight="bold";let a=so(e.label.text,i);Ol("label",e,n,i,a),Rl.drawBoundary(t,e,Gt)},"drawBoundary"),OX=o(function(t,e,r,n){let i=0;for(let a of n){i=0;let s=r[a],l=Tv(Gt,s.typeC4Shape.text);switch(l.fontSize=l.fontSize-2,s.typeC4Shape.width=so("\xAB"+s.typeC4Shape.text+"\xBB",l),s.typeC4Shape.height=l.fontSize+2,s.typeC4Shape.Y=Gt.c4ShapePadding,i=s.typeC4Shape.Y+s.typeC4Shape.height-4,s.image={width:0,height:0,Y:0},s.typeC4Shape.text){case"person":case"external_person":s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height;break}s.sprite&&(s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height);let u=s.wrap&&Gt.wrap,h=Gt.width-Gt.c4ShapePadding*2,f=Tv(Gt,s.typeC4Shape.text);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Ol("label",s,u,f,h),s.label.Y=i+8,i=s.label.Y+s.label.height,s.type&&s.type.text!==""){s.type.text="["+s.type.text+"]";let m=Tv(Gt,s.typeC4Shape.text);Ol("type",s,u,m,h),s.type.Y=i+5,i=s.type.Y+s.type.height}else if(s.techn&&s.techn.text!==""){s.techn.text="["+s.techn.text+"]";let m=Tv(Gt,s.techn.text);Ol("techn",s,u,m,h),s.techn.Y=i+5,i=s.techn.Y+s.techn.height}let d=i,p=s.label.width;if(s.descr&&s.descr.text!==""){let m=Tv(Gt,s.typeC4Shape.text);Ol("descr",s,u,m,h),s.descr.Y=i+20,i=s.descr.Y+s.descr.height,p=Math.max(s.label.width,s.descr.width),d=i-s.descr.textLines*5}p=p+Gt.c4ShapePadding,s.width=Math.max(s.width||Gt.width,p,Gt.width),s.height=Math.max(s.height||Gt.height,d,Gt.height),s.margin=s.margin||Gt.c4ShapeMargin,t.insert(s),Rl.drawC4Shape(e,s,Gt)}t.bumpLastMargin(Gt.c4ShapeMargin)},"drawC4ShapeArray"),Ns=class{static{o(this,"Point")}constructor(e,r){this.x=e,this.y=r}},RX=o(function(t,e){let r=t.x,n=t.y,i=e.x,a=e.y,s=r+t.width/2,l=n+t.height/2,u=Math.abs(r-i),h=Math.abs(n-a),f=h/u,d=t.height/t.width,p=null;return n==a&&ri?p=new Ns(r,l):r==i&&na&&(p=new Ns(s,n)),r>i&&n=f?p=new Ns(r,l+f*t.width/2):p=new Ns(s-u/h*t.height/2,n+t.height):r=f?p=new Ns(r+t.width,l+f*t.width/2):p=new Ns(s+u/h*t.height/2,n+t.height):ra?d>=f?p=new Ns(r+t.width,l-f*t.width/2):p=new Ns(s+t.height/2*u/h,n):r>i&&n>a&&(d>=f?p=new Ns(r,l-t.width/2*f):p=new Ns(s-t.height/2*u/h,n)),p},"getIntersectPoint"),NCe=o(function(t,e){let r={x:0,y:0};r.x=e.x+e.width/2,r.y=e.y+e.height/2;let n=RX(t,r);r.x=t.x+t.width/2,r.y=t.y+t.height/2;let i=RX(e,r);return{startPoint:n,endPoint:i}},"getIntersectPoints"),RCe=o(function(t,e,r,n){let i=0;for(let a of e){i=i+1;let s=a.wrap&&Gt.wrap,l=DCe(Gt);n.db.getC4Type()==="C4Dynamic"&&(a.label.text=i+": "+a.label.text);let h=so(a.label.text,l);Ol("label",a,s,l,h),a.techn&&a.techn.text!==""&&(h=so(a.techn.text,l),Ol("techn",a,s,l,h)),a.descr&&a.descr.text!==""&&(h=so(a.descr.text,l),Ol("descr",a,s,l,h));let f=r(a.from),d=r(a.to),p=NCe(f,d);a.startPoint=p.startPoint,a.endPoint=p.endPoint}Rl.drawRels(t,e,Gt)},"drawRels");o(PX,"drawInsideBoundary");MCe=o(function(t,e,r,n){Gt=pe().c4;let i=pe().securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let s=i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body"),l=n.db;n.db.setWrap(Gt.wrap),MX=l.getC4ShapeInRow(),o9=l.getC4BoundaryInRow(),Y.debug(`C:${JSON.stringify(Gt,null,2)}`);let u=i==="sandbox"?s.select(`[id="${e}"]`):Ve(`[id="${e}"]`);Rl.insertComputerIcon(u),Rl.insertDatabaseIcon(u),Rl.insertClockIcon(u);let h=new D5(n);h.setData(Gt.diagramMarginX,Gt.diagramMarginX,Gt.diagramMarginY,Gt.diagramMarginY),h.data.widthLimit=screen.availWidth,_5=Gt.diagramMarginX,L5=Gt.diagramMarginY;let f=n.db.getTitle(),d=n.db.getBoundarys("");PX(u,"",h,d,n),Rl.insertArrowHead(u),Rl.insertArrowEnd(u),Rl.insertArrowCrossHead(u),Rl.insertArrowFilledHead(u),RCe(u,n.db.getRels(),n.db.getC4Shape,n),h.data.stopx=_5,h.data.stopy=L5;let p=h.data,g=p.stopy-p.starty+2*Gt.diagramMarginY,v=p.stopx-p.startx+2*Gt.diagramMarginX;f&&u.append("text").text(f).attr("x",(p.stopx-p.startx)/2-4*Gt.diagramMarginX).attr("y",p.starty+Gt.diagramMarginY),Zr(u,g,v,Gt.useMaxWidth);let x=f?60:0;u.attr("viewBox",p.startx-Gt.diagramMarginX+" -"+(Gt.diagramMarginY+x)+" "+v+" "+(g+x)),Y.debug("models:",p)},"draw"),c9={drawPersonOrSystemArray:OX,drawBoundary:IX,setConf:l9,draw:MCe}});var ICe,FX,zX=M(()=>{"use strict";ICe=o(t=>`.person { + stroke: ${t.personBorder}; + fill: ${t.personBkg}; + } +`,"getStyles"),FX=ICe});var GX={};vr(GX,{diagram:()=>OCe});var OCe,$X=M(()=>{"use strict";US();u7();BX();zX();OCe={parser:oz,db:Ty,renderer:c9,styles:FX,init:o(({c4:t,wrap:e})=>{c9.setConf(t),Ty.setWrap(e)},"init")}});function f9(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function jX(t){Id=t}function oo(t,e){if(e){if(KX.test(t))return t.replace(zCe,HX)}else if(QX.test(t))return t.replace(GCe,HX);return t}function UCe(t){return t.replace(VCe,(e,r)=>(r=r.toLowerCase(),r==="colon"?":":r.charAt(0)==="#"?r.charAt(1)==="x"?String.fromCharCode(parseInt(r.substring(2),16)):String.fromCharCode(+r.substring(1)):""))}function fn(t,e){let r=typeof t=="string"?t:t.source;e=e||"";let n={replace:o((i,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(HCe,"$1"),r=r.replace(i,s),n},"replace"),getRegex:o(()=>new RegExp(r,e),"getRegex")};return n}function WX(t){try{t=encodeURI(t).replace(/%25/g,"%")}catch{return null}return t}function YX(t,e){let r=t.replace(/\|/g,(a,s,l)=>{let u=!1,h=s;for(;--h>=0&&l[h]==="\\";)u=!u;return u?"|":" |"}),n=r.split(/ \|/),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length{let a=i.match(/^\s+/);if(a===null)return i;let[s]=a;return s.length>=n.length?i.slice(n.length):i}).join(` +`)}function en(t,e){return Md.parse(t,e)}var Id,KX,zCe,QX,GCe,$Ce,HX,VCe,HCe,Sv,gm,qCe,XCe,jCe,Av,KCe,ZX,JX,d9,QCe,p9,ZCe,JCe,M5,m9,e7e,ej,t7e,g9,XX,r7e,n7e,tj,i7e,rj,a7e,_v,s7e,o7e,l7e,c7e,u7e,h7e,f7e,d7e,p7e,R5,m7e,nj,ij,g7e,y9,y7e,u9,v7e,N5,Ev,Mu,ym,Cv,Iu,mm,h9,Md,PEt,BEt,FEt,zEt,GEt,$Et,VEt,aj=M(()=>{"use strict";o(f9,"_getDefaults");Id=f9();o(jX,"changeDefaults");KX=/[&<>"']/,zCe=new RegExp(KX.source,"g"),QX=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,GCe=new RegExp(QX.source,"g"),$Ce={"&":"&","<":"<",">":">",'"':""","'":"'"},HX=o(t=>$Ce[t],"getEscapeReplacement");o(oo,"escape$1");VCe=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;o(UCe,"unescape");HCe=/(^|[^\[])\^/g;o(fn,"edit");o(WX,"cleanUrl");Sv={exec:o(()=>null,"exec")};o(YX,"splitCells");o(kv,"rtrim");o(WCe,"findClosingBracket");o(qX,"outputLink");o(YCe,"indentCodeCompensation");gm=class{static{o(this,"_Tokenizer")}options;rules;lexer;constructor(e){this.options=e||Id}space(e){let r=this.rules.block.newline.exec(e);if(r&&r[0].length>0)return{type:"space",raw:r[0]}}code(e){let r=this.rules.block.code.exec(e);if(r){let n=r[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:r[0],codeBlockStyle:"indented",text:this.options.pedantic?n:kv(n,` +`)}}}fences(e){let r=this.rules.block.fences.exec(e);if(r){let n=r[0],i=YCe(n,r[3]||"");return{type:"code",raw:n,lang:r[2]?r[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):r[2],text:i}}}heading(e){let r=this.rules.block.heading.exec(e);if(r){let n=r[2].trim();if(/#$/.test(n)){let i=kv(n,"#");(this.options.pedantic||!i||/ $/.test(i))&&(n=i.trim())}return{type:"heading",raw:r[0],depth:r[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let r=this.rules.block.hr.exec(e);if(r)return{type:"hr",raw:kv(r[0],` +`)}}blockquote(e){let r=this.rules.block.blockquote.exec(e);if(r){let n=kv(r[0],` +`).split(` +`),i="",a="",s=[];for(;n.length>0;){let l=!1,u=[],h;for(h=0;h/.test(n[h]))u.push(n[h]),l=!0;else if(!l)u.push(n[h]);else break;n=n.slice(h);let f=u.join(` +`),d=f.replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,` + $1`).replace(/^ {0,3}>[ \t]?/gm,"");i=i?`${i} +${f}`:f,a=a?`${a} +${d}`:d;let p=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(d,s,!0),this.lexer.state.top=p,n.length===0)break;let m=s[s.length-1];if(m?.type==="code")break;if(m?.type==="blockquote"){let g=m,y=g.raw+` +`+n.join(` +`),v=this.blockquote(y);s[s.length-1]=v,i=i.substring(0,i.length-g.raw.length)+v.raw,a=a.substring(0,a.length-g.text.length)+v.text;break}else if(m?.type==="list"){let g=m,y=g.raw+` +`+n.join(` +`),v=this.list(y);s[s.length-1]=v,i=i.substring(0,i.length-m.raw.length)+v.raw,a=a.substring(0,a.length-g.raw.length)+v.raw,n=y.substring(s[s.length-1].raw.length).split(` +`);continue}}return{type:"blockquote",raw:i,tokens:s,text:a}}}list(e){let r=this.rules.block.list.exec(e);if(r){let n=r[1].trim(),i=n.length>1,a={type:"list",raw:"",ordered:i,start:i?+n.slice(0,-1):"",loose:!1,items:[]};n=i?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=i?n:"[*+-]");let s=new RegExp(`^( {0,3}${n})((?:[ ][^\\n]*)?(?:\\n|$))`),l=!1;for(;e;){let u=!1,h="",f="";if(!(r=s.exec(e))||this.rules.block.hr.test(e))break;h=r[0],e=e.substring(h.length);let d=r[2].split(` +`,1)[0].replace(/^\t+/,x=>" ".repeat(3*x.length)),p=e.split(` +`,1)[0],m=!d.trim(),g=0;if(this.options.pedantic?(g=2,f=d.trimStart()):m?g=r[1].length+1:(g=r[2].search(/[^ ]/),g=g>4?1:g,f=d.slice(g),g+=r[1].length),m&&/^ *$/.test(p)&&(h+=p+` +`,e=e.substring(p.length+1),u=!0),!u){let x=new RegExp(`^ {0,${Math.min(3,g-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),b=new RegExp(`^ {0,${Math.min(3,g-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),w=new RegExp(`^ {0,${Math.min(3,g-1)}}(?:\`\`\`|~~~)`),_=new RegExp(`^ {0,${Math.min(3,g-1)}}#`);for(;e;){let T=e.split(` +`,1)[0];if(p=T,this.options.pedantic&&(p=p.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),w.test(p)||_.test(p)||x.test(p)||b.test(e))break;if(p.search(/[^ ]/)>=g||!p.trim())f+=` +`+p.slice(g);else{if(m||d.search(/[^ ]/)>=4||w.test(d)||_.test(d)||b.test(d))break;f+=` +`+p}!m&&!p.trim()&&(m=!0),h+=T+` +`,e=e.substring(T.length+1),d=p.slice(g)}}a.loose||(l?a.loose=!0:/\n *\n *$/.test(h)&&(l=!0));let y=null,v;this.options.gfm&&(y=/^\[[ xX]\] /.exec(f),y&&(v=y[0]!=="[ ] ",f=f.replace(/^\[[ xX]\] +/,""))),a.items.push({type:"list_item",raw:h,task:!!y,checked:v,loose:!1,text:f,tokens:[]}),a.raw+=h}a.items[a.items.length-1].raw=a.items[a.items.length-1].raw.trimEnd(),a.items[a.items.length-1].text=a.items[a.items.length-1].text.trimEnd(),a.raw=a.raw.trimEnd();for(let u=0;ud.type==="space"),f=h.length>0&&h.some(d=>/\n.*\n/.test(d.raw));a.loose=f}if(a.loose)for(let u=0;u$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",a=r[3]?r[3].substring(1,r[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):r[3];return{type:"def",tag:n,raw:r[0],href:i,title:a}}}table(e){let r=this.rules.block.table.exec(e);if(!r||!/[:|]/.test(r[2]))return;let n=YX(r[1]),i=r[2].replace(/^\||\| *$/g,"").split("|"),a=r[3]&&r[3].trim()?r[3].replace(/\n[ \t]*$/,"").split(` +`):[],s={type:"table",raw:r[0],header:[],align:[],rows:[]};if(n.length===i.length){for(let l of i)/^ *-+: *$/.test(l)?s.align.push("right"):/^ *:-+: *$/.test(l)?s.align.push("center"):/^ *:-+ *$/.test(l)?s.align.push("left"):s.align.push(null);for(let l=0;l({text:u,tokens:this.lexer.inline(u),header:!1,align:s.align[h]})));return s}}lheading(e){let r=this.rules.block.lheading.exec(e);if(r)return{type:"heading",raw:r[0],depth:r[2].charAt(0)==="="?1:2,text:r[1],tokens:this.lexer.inline(r[1])}}paragraph(e){let r=this.rules.block.paragraph.exec(e);if(r){let n=r[1].charAt(r[1].length-1)===` +`?r[1].slice(0,-1):r[1];return{type:"paragraph",raw:r[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let r=this.rules.block.text.exec(e);if(r)return{type:"text",raw:r[0],text:r[0],tokens:this.lexer.inline(r[0])}}escape(e){let r=this.rules.inline.escape.exec(e);if(r)return{type:"escape",raw:r[0],text:oo(r[1])}}tag(e){let r=this.rules.inline.tag.exec(e);if(r)return!this.lexer.state.inLink&&/^
    /i.test(r[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(r[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(r[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:r[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:r[0]}}link(e){let r=this.rules.inline.link.exec(e);if(r){let n=r[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;let s=kv(n.slice(0,-1),"\\");if((n.length-s.length)%2===0)return}else{let s=WCe(r[2],"()");if(s>-1){let u=(r[0].indexOf("!")===0?5:4)+r[1].length+s;r[2]=r[2].substring(0,s),r[0]=r[0].substring(0,u).trim(),r[3]=""}}let i=r[2],a="";if(this.options.pedantic){let s=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i);s&&(i=s[1],a=s[3])}else a=r[3]?r[3].slice(1,-1):"";return i=i.trim(),/^$/.test(n)?i=i.slice(1):i=i.slice(1,-1)),qX(r,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:a&&a.replace(this.rules.inline.anyPunctuation,"$1")},r[0],this.lexer)}}reflink(e,r){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let i=(n[2]||n[1]).replace(/\s+/g," "),a=r[i.toLowerCase()];if(!a){let s=n[0].charAt(0);return{type:"text",raw:s,text:s}}return qX(n,a,n[0],this.lexer)}}emStrong(e,r,n=""){let i=this.rules.inline.emStrongLDelim.exec(e);if(!i||i[3]&&n.match(/[\p{L}\p{N}]/u))return;if(!(i[1]||i[2]||"")||!n||this.rules.inline.punctuation.exec(n)){let s=[...i[0]].length-1,l,u,h=s,f=0,d=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(d.lastIndex=0,r=r.slice(-1*e.length+s);(i=d.exec(r))!=null;){if(l=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!l)continue;if(u=[...l].length,i[3]||i[4]){h+=u;continue}else if((i[5]||i[6])&&s%3&&!((s+u)%3)){f+=u;continue}if(h-=u,h>0)continue;u=Math.min(u,u+h+f);let p=[...i[0]][0].length,m=e.slice(0,s+i.index+p+u);if(Math.min(s,u)%2){let y=m.slice(1,-1);return{type:"em",raw:m,text:y,tokens:this.lexer.inlineTokens(y)}}let g=m.slice(2,-2);return{type:"strong",raw:m,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let r=this.rules.inline.code.exec(e);if(r){let n=r[2].replace(/\n/g," "),i=/[^ ]/.test(n),a=/^ /.test(n)&&/ $/.test(n);return i&&a&&(n=n.substring(1,n.length-1)),n=oo(n,!0),{type:"codespan",raw:r[0],text:n}}}br(e){let r=this.rules.inline.br.exec(e);if(r)return{type:"br",raw:r[0]}}del(e){let r=this.rules.inline.del.exec(e);if(r)return{type:"del",raw:r[0],text:r[2],tokens:this.lexer.inlineTokens(r[2])}}autolink(e){let r=this.rules.inline.autolink.exec(e);if(r){let n,i;return r[2]==="@"?(n=oo(r[1]),i="mailto:"+n):(n=oo(r[1]),i=n),{type:"link",raw:r[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let r;if(r=this.rules.inline.url.exec(e)){let n,i;if(r[2]==="@")n=oo(r[0]),i="mailto:"+n;else{let a;do a=r[0],r[0]=this.rules.inline._backpedal.exec(r[0])?.[0]??"";while(a!==r[0]);n=oo(r[0]),r[1]==="www."?i="http://"+r[0]:i=r[0]}return{type:"link",raw:r[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let r=this.rules.inline.text.exec(e);if(r){let n;return this.lexer.state.inRawBlock?n=r[0]:n=oo(r[0]),{type:"text",raw:r[0],text:n}}}},qCe=/^(?: *(?:\n|$))+/,XCe=/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,jCe=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Av=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,KCe=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ZX=/(?:[*+-]|\d{1,9}[.)])/,JX=fn(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,ZX).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),d9=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,QCe=/^[^\n]+/,p9=/(?!\s*\])(?:\\.|[^\[\]\\])+/,ZCe=fn(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",p9).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),JCe=fn(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ZX).getRegex(),M5="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",m9=/|$))/,e7e=fn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",m9).replace("tag",M5).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),ej=fn(d9).replace("hr",Av).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",M5).getRegex(),t7e=fn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",ej).getRegex(),g9={blockquote:t7e,code:XCe,def:ZCe,fences:jCe,heading:KCe,hr:Av,html:e7e,lheading:JX,list:JCe,newline:qCe,paragraph:ej,table:Sv,text:QCe},XX=fn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Av).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",M5).getRegex(),r7e={...g9,table:XX,paragraph:fn(d9).replace("hr",Av).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",XX).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",M5).getRegex()},n7e={...g9,html:fn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",m9).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Sv,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:fn(d9).replace("hr",Av).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",JX).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},tj=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,i7e=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,rj=/^( {2,}|\\)\n(?!\s*$)/,a7e=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,l7e=fn(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,_v).getRegex(),c7e=fn("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,_v).getRegex(),u7e=fn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,_v).getRegex(),h7e=fn(/\\([punct])/,"gu").replace(/punct/g,_v).getRegex(),f7e=fn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),d7e=fn(m9).replace("(?:-->|$)","-->").getRegex(),p7e=fn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",d7e).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),R5=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,m7e=fn(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",R5).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),nj=fn(/^!?\[(label)\]\[(ref)\]/).replace("label",R5).replace("ref",p9).getRegex(),ij=fn(/^!?\[(ref)\](?:\[\])?/).replace("ref",p9).getRegex(),g7e=fn("reflink|nolink(?!\\()","g").replace("reflink",nj).replace("nolink",ij).getRegex(),y9={_backpedal:Sv,anyPunctuation:h7e,autolink:f7e,blockSkip:o7e,br:rj,code:i7e,del:Sv,emStrongLDelim:l7e,emStrongRDelimAst:c7e,emStrongRDelimUnd:u7e,escape:tj,link:m7e,nolink:ij,punctuation:s7e,reflink:nj,reflinkSearch:g7e,tag:p7e,text:a7e,url:Sv},y7e={...y9,link:fn(/^!?\[(label)\]\((.*?)\)/).replace("label",R5).getRegex(),reflink:fn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",R5).getRegex()},u9={...y9,escape:fn(tj).replace("])","~|])").getRegex(),url:fn(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\u+" ".repeat(h.length));let i,a,s;for(;e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(l=>(i=l.call({lexer:this},e,r))?(e=e.substring(i.raw.length),r.push(i),!0):!1))){if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length),i.raw.length===1&&r.length>0?r[r.length-1].raw+=` +`:r.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length),a=r[r.length-1],a&&(a.type==="paragraph"||a.type==="text")?(a.raw+=` +`+i.raw,a.text+=` +`+i.text,this.inlineQueue[this.inlineQueue.length-1].src=a.text):r.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length),a=r[r.length-1],a&&(a.type==="paragraph"||a.type==="text")?(a.raw+=` +`+i.raw,a.text+=` +`+i.raw,this.inlineQueue[this.inlineQueue.length-1].src=a.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title});continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(s=e,this.options.extensions&&this.options.extensions.startBlock){let l=1/0,u=e.slice(1),h;this.options.extensions.startBlock.forEach(f=>{h=f.call({lexer:this},u),typeof h=="number"&&h>=0&&(l=Math.min(l,h))}),l<1/0&&l>=0&&(s=e.substring(0,l+1))}if(this.state.top&&(i=this.tokenizer.paragraph(s))){a=r[r.length-1],n&&a?.type==="paragraph"?(a.raw+=` +`+i.raw,a.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=a.text):r.push(i),n=s.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length),a=r[r.length-1],a&&a.type==="text"?(a.raw+=` +`+i.raw,a.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=a.text):r.push(i);continue}if(e){let l="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(l);break}else throw new Error(l)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let n,i,a,s=e,l,u,h;if(this.tokens.links){let f=Object.keys(this.tokens.links);if(f.length>0)for(;(l=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)f.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(l=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)s=s.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(l=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,l.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(u||(h=""),u=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(f=>(n=f.call({lexer:this},e,r))?(e=e.substring(n.raw.length),r.push(n),!0):!1))){if(n=this.tokenizer.escape(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.tag(e)){e=e.substring(n.raw.length),i=r[r.length-1],i&&n.type==="text"&&i.type==="text"?(i.raw+=n.raw,i.text+=n.text):r.push(n);continue}if(n=this.tokenizer.link(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(n.raw.length),i=r[r.length-1],i&&n.type==="text"&&i.type==="text"?(i.raw+=n.raw,i.text+=n.text):r.push(n);continue}if(n=this.tokenizer.emStrong(e,s,h)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.codespan(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.br(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.del(e)){e=e.substring(n.raw.length),r.push(n);continue}if(n=this.tokenizer.autolink(e)){e=e.substring(n.raw.length),r.push(n);continue}if(!this.state.inLink&&(n=this.tokenizer.url(e))){e=e.substring(n.raw.length),r.push(n);continue}if(a=e,this.options.extensions&&this.options.extensions.startInline){let f=1/0,d=e.slice(1),p;this.options.extensions.startInline.forEach(m=>{p=m.call({lexer:this},d),typeof p=="number"&&p>=0&&(f=Math.min(f,p))}),f<1/0&&f>=0&&(a=e.substring(0,f+1))}if(n=this.tokenizer.inlineText(a)){e=e.substring(n.raw.length),n.raw.slice(-1)!=="_"&&(h=n.raw.slice(-1)),u=!0,i=r[r.length-1],i&&i.type==="text"?(i.raw+=n.raw,i.text+=n.text):r.push(n);continue}if(e){let f="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(f);break}else throw new Error(f)}}return r}},ym=class{static{o(this,"_Renderer")}options;parser;constructor(e){this.options=e||Id}space(e){return""}code({text:e,lang:r,escaped:n}){let i=(r||"").match(/^\S*/)?.[0],a=e.replace(/\n$/,"")+` +`;return i?'
    '+(n?a:oo(a,!0))+`
    +`:"
    "+(n?a:oo(a,!0))+`
    +`}blockquote({tokens:e}){return`
    +${this.parser.parse(e)}
    +`}html({text:e}){return e}heading({tokens:e,depth:r}){return`${this.parser.parseInline(e)} +`}hr(e){return`
    +`}list(e){let r=e.ordered,n=e.start,i="";for(let l=0;l +`+i+" +`}listitem(e){let r="";if(e.task){let n=this.checkbox({checked:!!e.checked});e.loose?e.tokens.length>0&&e.tokens[0].type==="paragraph"?(e.tokens[0].text=n+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=n+" "+e.tokens[0].tokens[0].text)):e.tokens.unshift({type:"text",raw:n+" ",text:n+" "}):r+=n+" "}return r+=this.parser.parse(e.tokens,!!e.loose),`
  • ${r}
  • +`}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    +`}table(e){let r="",n="";for(let a=0;a${i}`),` + +`+r+` +`+i+`
    +`}tablerow({text:e}){return` +${e} +`}tablecell(e){let r=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+r+` +`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${e}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:r,tokens:n}){let i=this.parser.parseInline(n),a=WX(e);if(a===null)return i;e=a;let s='
    ",s}image({href:e,title:r,text:n}){let i=WX(e);if(i===null)return n;e=i;let a=`${n}{let l=a[s].flat(1/0);n=n.concat(this.walkTokens(l,r))}):a.tokens&&(n=n.concat(this.walkTokens(a.tokens,r)))}}return n}use(...e){let r=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let i={...n};if(i.async=this.defaults.async||i.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let s=r.renderers[a.name];s?r.renderers[a.name]=function(...l){let u=a.renderer.apply(this,l);return u===!1&&(u=s.apply(this,l)),u}:r.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let s=r[a.level];s?s.unshift(a.tokenizer):r[a.level]=[a.tokenizer],a.start&&(a.level==="block"?r.startBlock?r.startBlock.push(a.start):r.startBlock=[a.start]:a.level==="inline"&&(r.startInline?r.startInline.push(a.start):r.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(r.childTokens[a.name]=a.childTokens)}),i.extensions=r),n.renderer){let a=this.defaults.renderer||new ym(this.defaults);for(let s in n.renderer){if(!(s in a))throw new Error(`renderer '${s}' does not exist`);if(["options","parser"].includes(s))continue;let l=s,u=n.renderer[l];n.useNewRenderer||(u=this.#t(u,l,a));let h=a[l];a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d||""}}i.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new gm(this.defaults);for(let s in n.tokenizer){if(!(s in a))throw new Error(`tokenizer '${s}' does not exist`);if(["options","rules","lexer"].includes(s))continue;let l=s,u=n.tokenizer[l],h=a[l];a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d}}i.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new mm;for(let s in n.hooks){if(!(s in a))throw new Error(`hook '${s}' does not exist`);if(s==="options")continue;let l=s,u=n.hooks[l],h=a[l];mm.passThroughHooks.has(s)?a[l]=f=>{if(this.defaults.async)return Promise.resolve(u.call(a,f)).then(p=>h.call(a,p));let d=u.call(a,f);return h.call(a,d)}:a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d}}i.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,s=n.walkTokens;i.walkTokens=function(l){let u=[];return u.push(s.call(this,l)),a&&(u=u.concat(a.call(this,l))),u}}this.defaults={...this.defaults,...i}}),this}#t(e,r,n){switch(r){case"heading":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,n.parser.parseInline(i.tokens),i.depth,UCe(n.parser.parseInline(i.tokens,n.parser.textRenderer)))};case"code":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text,i.lang,!!i.escaped)};case"table":return function(i){if(!i.type||i.type!==r)return e.apply(this,arguments);let a="",s="";for(let u=0;u0&&f.tokens[0].type==="paragraph"?(f.tokens[0].text=g+" "+f.tokens[0].text,f.tokens[0].tokens&&f.tokens[0].tokens.length>0&&f.tokens[0].tokens[0].type==="text"&&(f.tokens[0].tokens[0].text=g+" "+f.tokens[0].tokens[0].text)):f.tokens.unshift({type:"text",text:g+" "}):m+=g+" "}m+=this.parser.parse(f.tokens,l),u+=this.listitem({type:"list_item",raw:m,text:m,task:p,checked:!!d,loose:l,tokens:f.tokens})}return e.call(this,u,a,s)};case"html":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text,i.block)};case"paragraph":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"escape":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)};case"link":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.href,i.title,this.parser.parseInline(i.tokens))};case"image":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.href,i.title,i.text)};case"strong":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"em":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"codespan":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)};case"del":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"text":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)}}return e}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,r){return Mu.lex(e,r??this.defaults)}parser(e,r){return Iu.parse(e,r??this.defaults)}#e(e,r){return(n,i)=>{let a={...i},s={...this.defaults,...a};this.defaults.async===!0&&a.async===!1&&(s.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),s.async=!0);let l=this.#r(!!s.silent,!!s.async);if(typeof n>"u"||n===null)return l(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(s.hooks&&(s.hooks.options=s),s.async)return Promise.resolve(s.hooks?s.hooks.preprocess(n):n).then(u=>e(u,s)).then(u=>s.hooks?s.hooks.processAllTokens(u):u).then(u=>s.walkTokens?Promise.all(this.walkTokens(u,s.walkTokens)).then(()=>u):u).then(u=>r(u,s)).then(u=>s.hooks?s.hooks.postprocess(u):u).catch(l);try{s.hooks&&(n=s.hooks.preprocess(n));let u=e(n,s);s.hooks&&(u=s.hooks.processAllTokens(u)),s.walkTokens&&this.walkTokens(u,s.walkTokens);let h=r(u,s);return s.hooks&&(h=s.hooks.postprocess(h)),h}catch(u){return l(u)}}}#r(e,r){return n=>{if(n.message+=` +Please report this to https://github.com/markedjs/marked.`,e){let i="

    An error occurred:

    "+oo(n.message+"",!0)+"
    ";return r?Promise.resolve(i):i}if(r)return Promise.reject(n);throw n}}},Md=new h9;o(en,"marked");en.options=en.setOptions=function(t){return Md.setOptions(t),en.defaults=Md.defaults,jX(en.defaults),en};en.getDefaults=f9;en.defaults=Id;en.use=function(...t){return Md.use(...t),en.defaults=Md.defaults,jX(en.defaults),en};en.walkTokens=function(t,e){return Md.walkTokens(t,e)};en.parseInline=Md.parseInline;en.Parser=Iu;en.parser=Iu.parse;en.Renderer=ym;en.TextRenderer=Cv;en.Lexer=Mu;en.lexer=Mu.lex;en.Tokenizer=gm;en.Hooks=mm;en.parse=en;PEt=en.options,BEt=en.setOptions,FEt=en.use,zEt=en.walkTokens,GEt=en.parseInline,$Et=Iu.parse,VEt=Mu.lex});function x7e(t,{markdownAutoWrap:e}){let n=t.replace(//g,` +`).replace(/\n{2,}/g,` +`),i=jb(n);return e===!1?i.replace(/ /g," "):i}function sj(t,e={}){let r=x7e(t,e),n=en.lexer(r),i=[[]],a=0;function s(l,u="normal"){l.type==="text"?l.text.split(` +`).forEach((f,d)=>{d!==0&&(a++,i.push([])),f.split(" ").forEach(p=>{p=p.replace(/'/g,"'"),p&&i[a].push({content:p,type:u})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(h=>{s(h,l.type)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}return o(s,"processNode"),n.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(u=>{s(u)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}),i}function oj(t,{markdownAutoWrap:e}={}){let r=en.lexer(t);function n(i){return i.type==="text"?e===!1?i.text.replace(/\n */g,"
    ").replace(/ /g," "):i.text.replace(/\n */g,"
    "):i.type==="strong"?`${i.tokens?.map(n).join("")}`:i.type==="em"?`${i.tokens?.map(n).join("")}`:i.type==="paragraph"?`

    ${i.tokens?.map(n).join("")}

    `:i.type==="space"?"":i.type==="html"?`${i.text}`:i.type==="escape"?i.text:`Unsupported markdown: ${i.type}`}return o(n,"output"),r.map(n).join("")}var lj=M(()=>{"use strict";aj();GS();o(x7e,"preprocessMarkdown");o(sj,"markdownToLines");o(oj,"markdownToHTML")});function b7e(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(e=>e.segment):[...t]}function w7e(t,e){let r=b7e(e.content);return cj(t,[],r,e.type)}function cj(t,e,r,n){if(r.length===0)return[{content:e.join(""),type:n},{content:"",type:n}];let[i,...a]=r,s=[...e,i];return t([{content:s.join(""),type:n}])?cj(t,s,a,n):(e.length===0&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function uj(t,e){if(t.some(({content:r})=>r.includes(` +`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return v9(t,e)}function v9(t,e,r=[],n=[]){if(t.length===0)return n.length>0&&r.push(n),r.length>0?r:[];let i="";t[0].content===" "&&(i=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},s=[...n];if(i!==""&&s.push({content:i,type:"normal"}),s.push(a),e(s))return v9(t,e,r,s);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){let[l,u]=w7e(e,a);r.push([l]),u.content&&t.unshift(u)}return v9(t,e,r)}var hj=M(()=>{"use strict";o(b7e,"splitTextToChars");o(w7e,"splitWordToFitWidth");o(cj,"splitWordToFitWidthRecursion");o(uj,"splitLineToFitWidth");o(v9,"splitLineToFitWidthRecursion")});function fj(t,e){e&&t.attr("style",e)}async function T7e(t,e,r,n,i=!1){let a=t.append("foreignObject");a.attr("width",`${10*r}px`),a.attr("height",`${10*r}px`);let s=a.append("xhtml:div"),l=e.label;e.label&&yi(e.label)&&(l=await bh(e.label.replace(qe.lineBreakRegex,` +`),pe()));let u=e.isNode?"nodeLabel":"edgeLabel",h=s.append("span");h.html(l),fj(h,e.labelStyle),h.attr("class",`${u} ${n}`),fj(s,e.labelStyle),s.style("display","table-cell"),s.style("white-space","nowrap"),s.style("line-height","1.5"),s.style("max-width",r+"px"),s.style("text-align","center"),s.attr("xmlns","http://www.w3.org/1999/xhtml"),i&&s.attr("class","labelBkg");let f=s.node().getBoundingClientRect();return f.width===r&&(s.style("display","table"),s.style("white-space","break-spaces"),s.style("width",r+"px"),f=s.node().getBoundingClientRect()),a.node()}function x9(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function k7e(t,e,r){let n=t.append("text"),i=x9(n,1,e);b9(i,r);let a=i.node().getComputedTextLength();return n.remove(),a}function dj(t,e,r){let n=t.append("text"),i=x9(n,1,e);b9(i,[{content:r,type:"normal"}]);let a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function E7e(t,e,r,n=!1){let a=e.append("g"),s=a.insert("rect").attr("class","background").attr("style","stroke: none"),l=a.append("text").attr("y","-10.1"),u=0;for(let h of r){let f=o(p=>k7e(a,1.1,p)<=t,"checkWidth"),d=f(h)?[h]:uj(h,f);for(let p of d){let m=x9(l,u,1.1);b9(m,p),u++}}if(n){let h=l.node().getBBox(),f=2;return s.attr("x",h.x-f).attr("y",h.y-f).attr("width",h.width+2*f).attr("height",h.height+2*f),a.node()}else return l.node()}function b9(t,e){t.text(""),e.forEach((r,n)=>{let i=t.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");n===0?i.text(r.content):i.text(" "+r.content)})}function w9(t){return t.replace(/fa[bklrs]?:fa-[\w-]+/g,e=>``)}var Li,Pl=M(()=>{"use strict";Vt();fr();pr();ut();lj();hr();hj();o(fj,"applyStyle");o(T7e,"addHtmlSpan");o(x9,"createTspan");o(k7e,"computeWidthOfText");o(dj,"computeDimensionOfText");o(E7e,"createFormattedText");o(b9,"updateTextContentAndStyles");o(w9,"replaceIconSubstring");Li=o(async(t,e="",{style:r="",isTitle:n=!1,classes:i="",useHtmlLabels:a=!0,isNode:s=!0,width:l=200,addSvgBackground:u=!1}={},h)=>{if(Y.debug("XYZ createText",e,r,n,i,a,s,"addSvgBackground: ",u),a){let f=oj(e,h),d=w9(Ma(f)),p=e.replace(/\\\\/g,"\\"),m={isNode:s,label:yi(e)?p:d,labelStyle:r.replace("fill:","color:")};return await T7e(t,m,l,i,u)}else{let f=e.replace(//g,"
    "),d=sj(f.replace("
    ","
    "),h),p=E7e(l,t,d,e?u:!1);if(s){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ve(p).attr("style",m)}else{let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");Ve(p).select("rect").attr("style",m.replace(/background:/g,"fill:"));let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ve(p).select("text").attr("style",g)}return p}},"createText")});function Wt(t){let e=t.map((r,n)=>`${n===0?"M":"L"}${r.x},${r.y}`);return e.push("Z"),e.join(" ")}function Wo(t,e,r,n,i,a){let s=[],u=r-t,h=n-e,f=u/a,d=2*Math.PI/f,p=e+h/2;for(let m=0;m<=50;m++){let g=m/50,y=t+g*u,v=p+i*Math.sin(d*(y-t));s.push({x:y,y:v})}return s}function O5(t,e,r,n,i,a){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;d{"use strict";Pl();Vt();pr();bs();fr();hr();st=o(async(t,e,r)=>{let n,i=e.useHtmlLabels||xr(pe()?.htmlLabels);r?n=r:n="node default";let a=t.insert("g").attr("class",n).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",Gn(e.labelStyle)),l;e.label===void 0?l="":l=typeof e.label=="string"?e.label:e.label[0];let u=await Li(s,kr(Ma(l),pe()),{useHtmlLabels:i,width:e.width||pe().flowchart?.wrappingWidth,cssClasses:"markdown-node-label",style:e.labelStyle,addSvgBackground:!!e.icon||!!e.img}),h=u.getBBox(),f=(e?.padding??0)/2;if(i){let d=u.children[0],p=Ve(u),m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=pe().fontSize?pe().fontSize:window.getComputedStyle(document.body).fontSize,w=5,[_=ur.fontSize]=Ho(b),T=_*w+"px";y.style.minWidth=T,y.style.maxWidth=T}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return i?s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"):s.attr("transform","translate(0, "+-h.height/2+")"),e.centerLabel&&s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),s.insert("rect",":first-child"),{shapeSvg:a,bbox:h,halfPadding:f,label:s}},"labelHelper"),I5=o(async(t,e,r)=>{let n=r.useHtmlLabels||xr(pe()?.flowchart?.htmlLabels),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),a=await Li(i,kr(Ma(e),pe()),{useHtmlLabels:n,width:r.width||pe()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img}),s=a.getBBox(),l=r.padding/2;if(xr(pe()?.flowchart?.htmlLabels)){let u=a.children[0],h=Ve(a);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}return n?i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"):i.attr("transform","translate(0, "+-s.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:s,halfPadding:l,label:i}},"insertLabel"),je=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),ot=o((t,e)=>(t.look==="handDrawn"?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");o(Wt,"createPathFromPoints");o(Wo,"generateFullSineWavePoints");o(O5,"generateCirclePoints")});function S7e(t,e){return t.intersect(e)}var pj,mj=M(()=>{"use strict";o(S7e,"intersectNode");pj=S7e});function C7e(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(C7e,"intersectEllipse");P5=C7e});function A7e(t,e,r){return P5(t,e,e,r)}var gj,yj=M(()=>{"use strict";T9();o(A7e,"intersectCircle");gj=A7e});function _7e(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&vj(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&vj(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function vj(t,e){return t*e>0}var xj,bj=M(()=>{"use strict";o(_7e,"intersectLine");o(vj,"sameSign");xj=_7e});function L7e(t,e,r){let n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(f){s=Math.min(s,f.x),l=Math.min(l,f.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));let u=n-t.width/2-s,h=i-t.height/2-l;for(let f=0;f1&&a.sort(function(f,d){let p=f.x-r.x,m=f.y-r.y,g=Math.sqrt(p*p+m*m),y=d.x-r.x,v=d.y-r.y,x=Math.sqrt(y*y+v*v);return g{"use strict";bj();o(L7e,"intersectPolygon");wj=L7e});var D7e,Hh,k9=M(()=>{"use strict";D7e=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),Hh=D7e});var Ye,qt=M(()=>{"use strict";mj();yj();T9();Tj();k9();Ye={node:pj,circle:gj,ellipse:P5,polygon:wj,rect:Hh}});var kj,Sc,N7e,Ze,Ke,Xt=M(()=>{"use strict";Vt();kj=o(t=>{let{handDrawnSeed:e}=pe();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),Sc=o(t=>{let e=N7e([...t.cssCompiledStyles||[],...t.cssStyles||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),N7e=o(t=>{let e=new Map;return t.forEach(r=>{let[n,i]=r.split(":");e.set(n.trim(),i?.trim())}),e},"styles2Map"),Ze=o(t=>{let{stylesArray:e}=Sc(t),r=[],n=[],i=[],a=[];return e.forEach(s=>{let l=s[0];l==="color"||l==="font-size"||l==="font-family"||l==="font-weight"||l==="font-style"||l==="text-decoration"||l==="text-align"||l==="text-transform"||l==="line-height"||l==="letter-spacing"||l==="word-spacing"||l==="text-shadow"||l==="text-overflow"||l==="white-space"||l==="word-wrap"||l==="word-break"||l==="overflow-wrap"||l==="hyphens"?r.push(s.join(":")+" !important"):(n.push(s.join(":")+" !important"),l.includes("stroke")&&i.push(s.join(":")+" !important"),l==="fill"&&a.push(s.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:a}},"styles2String"),Ke=o((t,e)=>{let{themeVariables:r,handDrawnSeed:n}=pe(),{nodeBorder:i,mainBkg:a}=r,{stylesMap:s}=Sc(t);return Object.assign({roughness:.7,fill:s.get("fill")||a,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||i,seed:n,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0]},e)},"userNodeOverrides")});function E9(t,e,r){if(t&&t.length){let[n,i]=e,a=Math.PI/180*r,s=Math.cos(a),l=Math.sin(a);for(let u of t){let[h,f]=u;u[0]=(h-n)*s-(f-i)*l+n,u[1]=(h-n)*l+(f-i)*s+i}}}function R7e(t,e){return t[0]===e[0]&&t[1]===e[1]}function M7e(t,e,r,n=1){let i=r,a=Math.max(e,.1),s=t[0]&&t[0][0]&&typeof t[0][0]=="number"?[t]:t,l=[0,0];if(i)for(let h of s)E9(h,l,i);let u=function(h,f,d){let p=[];for(let b of h){let w=[...b];R7e(w[0],w[w.length-1])||w.push([w[0][0],w[0][1]]),w.length>2&&p.push(w)}let m=[];f=Math.max(f,.1);let g=[];for(let b of p)for(let w=0;wb.yminw.ymin?1:b.xw.x?1:b.ymax===w.ymax?0:(b.ymax-w.ymax)/Math.abs(b.ymax-w.ymax)),!g.length)return m;let y=[],v=g[0].ymin,x=0;for(;y.length||g.length;){if(g.length){let b=-1;for(let w=0;wv);w++)b=w;g.splice(0,b+1).forEach(w=>{y.push({s:v,edge:w})})}if(y=y.filter(b=>!(b.edge.ymax<=v)),y.sort((b,w)=>b.edge.x===w.edge.x?0:(b.edge.x-w.edge.x)/Math.abs(b.edge.x-w.edge.x)),(d!==1||x%f==0)&&y.length>1)for(let b=0;b=y.length)break;let _=y[b].edge,T=y[w].edge;m.push([[Math.round(_.x),v],[Math.round(T.x),v]])}v+=d,y.forEach(b=>{b.edge.x=b.edge.x+d*b.edge.islope}),x++}return m}(s,a,n);if(i){for(let h of s)E9(h,l,-i);(function(h,f,d){let p=[];h.forEach(m=>p.push(...m)),E9(p,f,d)})(u,l,-i)}return u}function Rv(t,e){var r;let n=e.hachureAngle+90,i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let a=1;return e.roughness>=1&&(((r=e.randomizer)===null||r===void 0?void 0:r.next())||Math.random())>.7&&(a=i),M7e(t,i,n,a||1)}function W5(t){let e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}function C9(t,e){return t.type===e}function G9(t){let e=[],r=function(s){let l=new Array;for(;s!=="";)if(s.match(/^([ \t\r\n,]+)/))s=s.substr(RegExp.$1.length);else if(s.match(/^([aAcChHlLmMqQsStTvVzZ])/))l[l.length]={type:I7e,text:RegExp.$1},s=s.substr(RegExp.$1.length);else{if(!s.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];l[l.length]={type:S9,text:`${parseFloat(RegExp.$1)}`},s=s.substr(RegExp.$1.length)}return l[l.length]={type:Ej,text:""},l}(t),n="BOD",i=0,a=r[i];for(;!C9(a,Ej);){let s=0,l=[];if(n==="BOD"){if(a.text!=="M"&&a.text!=="m")return G9("M0,0"+t);i++,s=B5[a.text],n=a.text}else C9(a,S9)?s=B5[n]:(i++,s=B5[a.text],n=a.text);if(!(i+sf%2?h+r:h+e);a.push({key:"C",data:u}),e=u[4],r=u[5];break}case"Q":a.push({key:"Q",data:[...l]}),e=l[2],r=l[3];break;case"q":{let u=l.map((h,f)=>f%2?h+r:h+e);a.push({key:"Q",data:u}),e=u[2],r=u[3];break}case"A":a.push({key:"A",data:[...l]}),e=l[5],r=l[6];break;case"a":e+=l[5],r+=l[6],a.push({key:"A",data:[l[0],l[1],l[2],l[3],l[4],e,r]});break;case"H":a.push({key:"H",data:[...l]}),e=l[0];break;case"h":e+=l[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...l]}),r=l[0];break;case"v":r+=l[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...l]}),e=l[2],r=l[3];break;case"s":{let u=l.map((h,f)=>f%2?h+r:h+e);a.push({key:"S",data:u}),e=u[2],r=u[3];break}case"T":a.push({key:"T",data:[...l]}),e=l[0],r=l[1];break;case"t":e+=l[0],r+=l[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function Mj(t){let e=[],r="",n=0,i=0,a=0,s=0,l=0,u=0;for(let{key:h,data:f}of t){switch(h){case"M":e.push({key:"M",data:[...f]}),[n,i]=f,[a,s]=f;break;case"C":e.push({key:"C",data:[...f]}),n=f[4],i=f[5],l=f[2],u=f[3];break;case"L":e.push({key:"L",data:[...f]}),[n,i]=f;break;case"H":n=f[0],e.push({key:"L",data:[n,i]});break;case"V":i=f[0],e.push({key:"L",data:[n,i]});break;case"S":{let d=0,p=0;r==="C"||r==="S"?(d=n+(n-l),p=i+(i-u)):(d=n,p=i),e.push({key:"C",data:[d,p,...f]}),l=f[0],u=f[1],n=f[2],i=f[3];break}case"T":{let[d,p]=f,m=0,g=0;r==="Q"||r==="T"?(m=n+(n-l),g=i+(i-u)):(m=n,g=i);let y=n+2*(m-n)/3,v=i+2*(g-i)/3,x=d+2*(m-d)/3,b=p+2*(g-p)/3;e.push({key:"C",data:[y,v,x,b,d,p]}),l=m,u=g,n=d,i=p;break}case"Q":{let[d,p,m,g]=f,y=n+2*(d-n)/3,v=i+2*(p-i)/3,x=m+2*(d-m)/3,b=g+2*(p-g)/3;e.push({key:"C",data:[y,v,x,b,m,g]}),l=d,u=p,n=m,i=g;break}case"A":{let d=Math.abs(f[0]),p=Math.abs(f[1]),m=f[2],g=f[3],y=f[4],v=f[5],x=f[6];d===0||p===0?(e.push({key:"C",data:[n,i,v,x,v,x]}),n=v,i=x):(n!==v||i!==x)&&(Ij(n,i,v,x,d,p,m,g,y).forEach(function(b){e.push({key:"C",data:b})}),n=v,i=x);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=s}r=h}return e}function Lv(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function Ij(t,e,r,n,i,a,s,l,u,h){let f=(d=s,Math.PI*d/180);var d;let p=[],m=0,g=0,y=0,v=0;if(h)[m,g,y,v]=h;else{[t,e]=Lv(t,e,-f),[r,n]=Lv(r,n,-f);let R=(t-r)/2,C=(e-n)/2,O=R*R/(i*i)+C*C/(a*a);O>1&&(O=Math.sqrt(O),i*=O,a*=O);let N=i*i,P=a*a,F=N*P-N*C*C-P*R*R,B=N*C*C+P*R*R,G=(l===u?-1:1)*Math.sqrt(Math.abs(F/B));y=G*i*C/a+(t+r)/2,v=G*-a*R/i+(e+n)/2,m=Math.asin(parseFloat(((e-v)/a).toFixed(9))),g=Math.asin(parseFloat(((n-v)/a).toFixed(9))),tg&&(m-=2*Math.PI),!u&&g>m&&(g-=2*Math.PI)}let x=g-m;if(Math.abs(x)>120*Math.PI/180){let R=g,C=r,O=n;g=u&&g>m?m+120*Math.PI/180*1:m+120*Math.PI/180*-1,p=Ij(r=y+i*Math.cos(g),n=v+a*Math.sin(g),C,O,i,a,s,0,u,[g,R,y,v])}x=g-m;let b=Math.cos(m),w=Math.sin(m),_=Math.cos(g),T=Math.sin(g),E=Math.tan(x/4),L=4/3*i*E,S=4/3*a*E,A=[t,e],I=[t+L*w,e-S*b],D=[r+L*T,n-S*_],k=[r,n];if(I[0]=2*A[0]-I[0],I[1]=2*A[1]-I[1],h)return[I,D,k].concat(p);{p=[I,D,k].concat(p);let R=[];for(let C=0;C2){let i=[];for(let a=0;a2*Math.PI&&(m=0,g=2*Math.PI);let y=2*Math.PI/u.curveStepCount,v=Math.min(y/2,(g-m)/2),x=Dj(v,h,f,d,p,m,g,1,u);if(!u.disableMultiStroke){let b=Dj(v,h,f,d,p,m,g,1.5,u);x.push(...b)}return s&&(l?x.push(...Wh(h,f,h+d*Math.cos(m),f+p*Math.sin(m),u),...Wh(h,f,h+d*Math.cos(g),f+p*Math.sin(g),u)):x.push({op:"lineTo",data:[h,f]},{op:"lineTo",data:[h+d*Math.cos(m),f+p*Math.sin(m)]})),{type:"path",ops:x}}function Aj(t,e){let r=Mj(Rj(G9(t))),n=[],i=[0,0],a=[0,0];for(let{key:s,data:l}of r)switch(s){case"M":a=[l[0],l[1]],i=[l[0],l[1]];break;case"L":n.push(...Wh(a[0],a[1],l[0],l[1],e)),a=[l[0],l[1]];break;case"C":{let[u,h,f,d,p,m]=l;n.push(...B7e(u,h,f,d,p,m,a,e)),a=[p,m];break}case"Z":n.push(...Wh(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function A9(t,e){let r=[];for(let n of t)if(n.length){let i=e.maxRandomnessOffset||0,a=n.length;if(a>2){r.push({op:"move",data:[n[0][0]+nr(i,e),n[0][1]+nr(i,e)]});for(let s=1;s500?.4:-.0016668*u+1.233334;let f=i.maxRandomnessOffset||0;f*f*100>l&&(f=u/10);let d=f/2,p=.2+.2*Bj(i),m=i.bowing*i.maxRandomnessOffset*(n-e)/200,g=i.bowing*i.maxRandomnessOffset*(t-r)/200;m=nr(m,i,h),g=nr(g,i,h);let y=[],v=o(()=>nr(d,i,h),"M"),x=o(()=>nr(f,i,h),"k"),b=i.preserveVertices;return a&&(s?y.push({op:"move",data:[t+(b?0:v()),e+(b?0:v())]}):y.push({op:"move",data:[t+(b?0:nr(f,i,h)),e+(b?0:nr(f,i,h))]})),s?y.push({op:"bcurveTo",data:[m+t+(r-t)*p+v(),g+e+(n-e)*p+v(),m+t+2*(r-t)*p+v(),g+e+2*(n-e)*p+v(),r+(b?0:v()),n+(b?0:v())]}):y.push({op:"bcurveTo",data:[m+t+(r-t)*p+x(),g+e+(n-e)*p+x(),m+t+2*(r-t)*p+x(),g+e+2*(n-e)*p+x(),r+(b?0:x()),n+(b?0:x())]}),y}function F5(t,e,r){if(!t.length)return[];let n=[];n.push([t[0][0]+nr(e,r),t[0][1]+nr(e,r)]),n.push([t[0][0]+nr(e,r),t[0][1]+nr(e,r)]);for(let i=1;i3){let a=[],s=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let l=1;l+21&&i.push(l)):i.push(l),i.push(t[e+3])}else{let u=t[e+0],h=t[e+1],f=t[e+2],d=t[e+3],p=Od(u,h,.5),m=Od(h,f,.5),g=Od(f,d,.5),y=Od(p,m,.5),v=Od(m,g,.5),x=Od(y,v,.5);B9([u,p,y,x],0,r,i),B9([x,v,g,d],0,r,i)}var a,s;return i}function z7e(t,e){return H5(t,0,t.length,e)}function H5(t,e,r,n,i){let a=i||[],s=t[e],l=t[r-1],u=0,h=1;for(let f=e+1;fu&&(u=d,h=f)}return Math.sqrt(u)>n?(H5(t,e,h+1,n,a),H5(t,h,r,n,a)):(a.length||a.push(s),a.push(l)),a}function _9(t,e=.15,r){let n=[],i=(t.length-1)/3;for(let a=0;a0?H5(n,0,n.length,r):n}var Nv,L9,D9,N9,R9,M9,Rs,I9,I7e,S9,Ej,B5,O7e,lo,xm,F9,z5,z9,Xe,jt=M(()=>{"use strict";o(E9,"t");o(R7e,"e");o(M7e,"s");o(Rv,"n");Nv=class{static{o(this,"o")}constructor(e){this.helper=e}fillPolygons(e,r){return this._fillPolygons(e,r)}_fillPolygons(e,r){let n=Rv(e,r);return{type:"fillSketch",ops:this.renderLines(n,r)}}renderLines(e,r){let n=[];for(let i of e)n.push(...this.helper.doubleLineOps(i[0][0],i[0][1],i[1][0],i[1][1],r));return n}};o(W5,"a");L9=class extends Nv{static{o(this,"h")}fillPolygons(e,r){let n=r.hachureGap;n<0&&(n=4*r.strokeWidth),n=Math.max(n,.1);let i=Rv(e,Object.assign({},r,{hachureGap:n})),a=Math.PI/180*r.hachureAngle,s=[],l=.5*n*Math.cos(a),u=.5*n*Math.sin(a);for(let[h,f]of i)W5([h,f])&&s.push([[h[0]-l,h[1]+u],[...f]],[[h[0]+l,h[1]-u],[...f]]);return{type:"fillSketch",ops:this.renderLines(s,r)}}},D9=class extends Nv{static{o(this,"r")}fillPolygons(e,r){let n=this._fillPolygons(e,r),i=Object.assign({},r,{hachureAngle:r.hachureAngle+90}),a=this._fillPolygons(e,i);return n.ops=n.ops.concat(a.ops),n}},N9=class{static{o(this,"i")}constructor(e){this.helper=e}fillPolygons(e,r){let n=Rv(e,r=Object.assign({},r,{hachureAngle:0}));return this.dotsOnLines(n,r)}dotsOnLines(e,r){let n=[],i=r.hachureGap;i<0&&(i=4*r.strokeWidth),i=Math.max(i,.1);let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=i/4;for(let l of e){let u=W5(l),h=u/i,f=Math.ceil(h)-1,d=u-f*i,p=(l[0][0]+l[1][0])/2-i/4,m=Math.min(l[0][1],l[1][1]);for(let g=0;g{let l=W5(s),u=Math.floor(l/(n+i)),h=(l+i-u*(n+i))/2,f=s[0],d=s[1];f[0]>d[0]&&(f=s[1],d=s[0]);let p=Math.atan((d[1]-f[1])/(d[0]-f[0]));for(let m=0;m{let s=W5(a),l=Math.round(s/(2*r)),u=a[0],h=a[1];u[0]>h[0]&&(u=a[1],h=a[0]);let f=Math.atan((h[1]-u[1])/(h[0]-u[0]));for(let d=0;d2*Math.PI&&(L=0,S=2*Math.PI);let A=(S-L)/b.curveStepCount,I=[];for(let D=L;D<=S;D+=A)I.push([w+T*Math.cos(D),_+E*Math.sin(D)]);return I.push([w+T*Math.cos(S),_+E*Math.sin(S)]),I.push([w,_]),vm([I],b)}(e,r,n,i,a,s,h));return h.stroke!==lo&&f.push(d),this._d("arc",f,h)}curve(e,r){let n=this._o(r),i=[],a=Sj(e,n);if(n.fill&&n.fill!==lo)if(n.fillStyle==="solid"){let s=Sj(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(s.ops)})}else{let s=[],l=e;if(l.length){let u=typeof l[0][0]=="number"?[l]:l;for(let h of u)h.length<3?s.push(...h):h.length===3?s.push(..._9(Nj([h[0],h[0],h[1],h[2]]),10,(1+n.roughness)/2)):s.push(..._9(Nj(h),10,(1+n.roughness)/2))}s.length&&i.push(vm([s],n))}return n.stroke!==lo&&i.push(a),this._d("curve",i,n)}polygon(e,r){let n=this._o(r),i=[],a=G5(e,!0,n);return n.fill&&(n.fillStyle==="solid"?i.push(A9([e],n)):i.push(vm([e],n))),n.stroke!==lo&&i.push(a),this._d("polygon",i,n)}path(e,r){let n=this._o(r),i=[];if(!e)return this._d("path",i,n);e=(e||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let a=n.fill&&n.fill!=="transparent"&&n.fill!==lo,s=n.stroke!==lo,l=!!(n.simplification&&n.simplification<1),u=function(f,d,p){let m=Mj(Rj(G9(f))),g=[],y=[],v=[0,0],x=[],b=o(()=>{x.length>=4&&y.push(..._9(x,d)),x=[]},"i"),w=o(()=>{b(),y.length&&(g.push(y),y=[])},"c");for(let{key:T,data:E}of m)switch(T){case"M":w(),v=[E[0],E[1]],y.push(v);break;case"L":b(),y.push([E[0],E[1]]);break;case"C":if(!x.length){let L=y.length?y[y.length-1]:v;x.push([L[0],L[1]])}x.push([E[0],E[1]]),x.push([E[2],E[3]]),x.push([E[4],E[5]]);break;case"Z":b(),y.push([v[0],v[1]])}if(w(),!p)return g;let _=[];for(let T of g){let E=z7e(T,p);E.length&&_.push(E)}return _}(e,1,l?4-4*(n.simplification||1):(1+n.roughness)/2),h=Aj(e,n);if(a)if(n.fillStyle==="solid")if(u.length===1){let f=Aj(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(f.ops)})}else i.push(A9(u,n));else i.push(vm(u,n));return s&&(l?u.forEach(f=>{i.push(G5(f,!1,n))}):i.push(h)),this._d("path",i,n)}opsToPath(e,r){let n="";for(let i of e.ops){let a=typeof r=="number"&&r>=0?i.data.map(s=>+s.toFixed(r)):i.data;switch(i.op){case"move":n+=`M${a[0]} ${a[1]} `;break;case"bcurveTo":n+=`C${a[0]} ${a[1]}, ${a[2]} ${a[3]}, ${a[4]} ${a[5]} `;break;case"lineTo":n+=`L${a[0]} ${a[1]} `}}return n.trim()}toPaths(e){let r=e.sets||[],n=e.options||this.defaultOptions,i=[];for(let a of r){let s=null;switch(a.type){case"path":s={d:this.opsToPath(a),stroke:n.stroke,strokeWidth:n.strokeWidth,fill:lo};break;case"fillPath":s={d:this.opsToPath(a),stroke:lo,strokeWidth:0,fill:n.fill||lo};break;case"fillSketch":s=this.fillSketch(a,n)}s&&i.push(s)}return i}fillSketch(e,r){let n=r.fillWeight;return n<0&&(n=r.strokeWidth/2),{d:this.opsToPath(e),stroke:r.fill||lo,strokeWidth:n,fill:lo}}_mergedShape(e){return e.filter((r,n)=>n===0||r.op!=="move")}},F9=class{static{o(this,"st")}constructor(e,r){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.gen=new xm(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.ctx,a=e.options.fixedDecimalPlaceDigits;for(let s of r)switch(s.type){case"path":i.save(),i.strokeStyle=n.stroke==="none"?"transparent":n.stroke,i.lineWidth=n.strokeWidth,n.strokeLineDash&&i.setLineDash(n.strokeLineDash),n.strokeLineDashOffset&&(i.lineDashOffset=n.strokeLineDashOffset),this._drawToContext(i,s,a),i.restore();break;case"fillPath":{i.save(),i.fillStyle=n.fill||"";let l=e.shape==="curve"||e.shape==="polygon"||e.shape==="path"?"evenodd":"nonzero";this._drawToContext(i,s,a,l),i.restore();break}case"fillSketch":this.fillSketch(i,s,n)}}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2),e.save(),n.fillLineDash&&e.setLineDash(n.fillLineDash),n.fillLineDashOffset&&(e.lineDashOffset=n.fillLineDashOffset),e.strokeStyle=n.fill||"",e.lineWidth=i,this._drawToContext(e,r,n.fixedDecimalPlaceDigits),e.restore()}_drawToContext(e,r,n,i="nonzero"){e.beginPath();for(let a of r.ops){let s=typeof n=="number"&&n>=0?a.data.map(l=>+l.toFixed(n)):a.data;switch(a.op){case"move":e.moveTo(s[0],s[1]);break;case"bcurveTo":e.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":e.lineTo(s[0],s[1])}}r.type==="fillPath"?e.fill(i):e.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s),s}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s),s}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s),s}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a),a}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n),n}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n),n}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h),h}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n),n}path(e,r){let n=this.gen.path(e,r);return this.draw(n),n}},z5="http://www.w3.org/2000/svg",z9=class{static{o(this,"ot")}constructor(e,r){this.svg=e,this.gen=new xm(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.svg.ownerDocument||window.document,a=i.createElementNS(z5,"g"),s=e.options.fixedDecimalPlaceDigits;for(let l of r){let u=null;switch(l.type){case"path":u=i.createElementNS(z5,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke",n.stroke),u.setAttribute("stroke-width",n.strokeWidth+""),u.setAttribute("fill","none"),n.strokeLineDash&&u.setAttribute("stroke-dasharray",n.strokeLineDash.join(" ").trim()),n.strokeLineDashOffset&&u.setAttribute("stroke-dashoffset",`${n.strokeLineDashOffset}`);break;case"fillPath":u=i.createElementNS(z5,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke","none"),u.setAttribute("stroke-width","0"),u.setAttribute("fill",n.fill||""),e.shape!=="curve"&&e.shape!=="polygon"||u.setAttribute("fill-rule","evenodd");break;case"fillSketch":u=this.fillSketch(i,l,n)}u&&a.appendChild(u)}return a}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2);let a=e.createElementNS(z5,"path");return a.setAttribute("d",this.opsToPath(r,n.fixedDecimalPlaceDigits)),a.setAttribute("stroke",n.fill||""),a.setAttribute("stroke-width",i+""),a.setAttribute("fill","none"),n.fillLineDash&&a.setAttribute("stroke-dasharray",n.fillLineDash.join(" ").trim()),n.fillLineDashOffset&&a.setAttribute("stroke-dashoffset",`${n.fillLineDashOffset}`),a}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(e,r){return this.gen.opsToPath(e,r)}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s)}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s)}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s)}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a)}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n)}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n)}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h)}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n)}path(e,r){let n=this.gen.path(e,r);return this.draw(n)}},Xe={canvas:o((t,e)=>new F9(t,e),"canvas"),svg:o((t,e)=>new z9(t,e),"svg"),generator:o(t=>new xm(t),"generator"),newSeed:o(()=>xm.newSeed(),"newSeed")}});function Fj(t,e){let{labelStyles:r}=Ze(e);e.labelStyle=r;let n=ot(e),i=n;n||(i="anchor");let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=1,{cssStyles:l}=e,u=Xe.svg(a),h=Ke(e,{fill:"black",stroke:"none",fillStyle:"solid"});e.look!=="handDrawn"&&(h.roughness=0);let f=u.circle(0,0,s*2,h),d=a.insert(()=>f,":first-child");return d.attr("class","anchor").attr("style",Gn(l)),je(e,d),e.intersect=function(p){return Y.info("Circle intersect",e,s,p),Ye.circle(e,s,p)},a}var zj=M(()=>{"use strict";ut();Ot();qt();Xt();jt();hr();o(Fj,"anchor")});function Gj(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),w=Math.atan2((e-b)/a,(t-x)/i),T=Math.atan2((n-b)/a,(r-x)/i)-w;s&&T<0&&(T+=2*Math.PI),!s&&T>0&&(T-=2*Math.PI);let E=[];for(let L=0;L<20;L++){let S=L/19,A=w+S*T,I=x+i*Math.cos(A),D=b+a*Math.sin(A);E.push({x:I,y:D})}return E}async function $j(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=a.width+e.padding+20,l=a.height+e.padding,u=l/2,h=u/(2.5+l/50),{cssStyles:f}=e,d=[{x:s/2,y:-l/2},{x:-s/2,y:-l/2},...Gj(-s/2,-l/2,-s/2,l/2,h,u,!1),{x:s/2,y:l/2},...Gj(s/2,l/2,s/2,-l/2,h,u,!0)],p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Wt(d),y=p.path(g,m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(${h/2}, 0)`),je(e,v),e.intersect=function(x){return Ye.polygon(e,d,x)},i}var Vj=M(()=>{"use strict";Ot();qt();Xt();jt();o(Gj,"generateArcPoints");o($j,"bowTieRect")});function Ia(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Ou=M(()=>{"use strict";o(Ia,"insertPolygonShape")});async function Uj(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=a.height+e.padding,l=12,u=a.width+e.padding+l,h=0,f=u,d=-s,p=0,m=[{x:h+l,y:d},{x:f,y:d},{x:f,y:p},{x:h,y:p},{x:h,y:d+l},{x:h+l,y:d}],g,{cssStyles:y}=e;if(e.look==="handDrawn"){let v=Xe.svg(i),x=Ke(e,{}),b=Wt(m),w=v.path(b,x);g=i.insert(()=>w,":first-child").attr("transform",`translate(${-u/2}, ${s/2})`),y&&g.attr("style",y)}else g=Ia(i,u,s,m);return n&&g.attr("style",n),je(e,g),e.intersect=function(v){return Ye.polygon(e,m,v)},i}var Hj=M(()=>{"use strict";Ot();qt();Xt();jt();Ou();Ot();o(Uj,"card")});function Wj(t,e){let{nodeStyles:r}=Ze(e);e.label="";let n=t.insert("g").attr("class",ot(e)).attr("id",e.domId??e.id),{cssStyles:i}=e,a=Math.max(28,e.width??0),s=[{x:0,y:a/2},{x:a/2,y:0},{x:0,y:-a/2},{x:-a/2,y:0}],l=Xe.svg(n),u=Ke(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=Wt(s),f=l.path(h,u),d=n.insert(()=>f,":first-child");return i&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",i),r&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(p){return Ye.polygon(e,s,p)},n}var Yj=M(()=>{"use strict";qt();jt();Xt();Ot();o(Wj,"choice")});async function qj(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await st(t,e,ot(e)),l=a.width/2+s,u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Xe.svg(i),d=Ke(e,{}),p=f.circle(0,0,l*2,d);u=i.insert(()=>p,":first-child"),u.attr("class","basic label-container").attr("style",Gn(h))}else u=i.insert("circle",":first-child").attr("class","basic label-container").attr("style",n).attr("r",l).attr("cx",0).attr("cy",0);return je(e,u),e.intersect=function(f){return Y.info("Circle intersect",e,l,f),Ye.circle(e,l,f)},i}var Xj=M(()=>{"use strict";ut();Ot();qt();Xt();jt();hr();o(qj,"circle")});function G7e(t){let e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=t*2,i={x:n/2*e,y:n/2*r},a={x:-(n/2)*e,y:n/2*r},s={x:-(n/2)*e,y:-(n/2)*r},l={x:n/2*e,y:-(n/2)*r};return`M ${a.x},${a.y} L ${l.x},${l.y} + M ${i.x},${i.y} L ${s.x},${s.y}`}function jj(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r,e.label="";let i=t.insert("g").attr("class",ot(e)).attr("id",e.domId??e.id),a=Math.max(30,e?.width??0),{cssStyles:s}=e,l=Xe.svg(i),u=Ke(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=l.circle(0,0,a*2,u),f=G7e(a),d=l.path(f,u),p=i.insert(()=>h,":first-child");return p.insert(()=>d),s&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",s),n&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",n),je(e,p),e.intersect=function(m){return Y.info("crossedCircle intersect",e,{radius:a,point:m}),Ye.circle(e,a,m)},i}var Kj=M(()=>{"use strict";ut();Ot();Xt();jt();qt();o(G7e,"createLine");o(jj,"crossedCircle")});function Yh(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dw,":first-child").attr("stroke-opacity",0),_.insert(()=>x,":first-child"),_.attr("class","text"),f&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",n),_.attr("transform",`translate(${h}, 0)`),s.attr("transform",`translate(${-l/2+h-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,_),e.intersect=function(T){return Ye.polygon(e,p,T)},i}var Zj=M(()=>{"use strict";Ot();qt();Xt();jt();o(Yh,"generateCirclePoints");o(Qj,"curlyBraceLeft")});function qh(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dw,":first-child").attr("stroke-opacity",0),_.insert(()=>x,":first-child"),_.attr("class","text"),f&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",n),_.attr("transform",`translate(${-h}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,_),e.intersect=function(T){return Ye.polygon(e,p,T)},i}var eK=M(()=>{"use strict";Ot();qt();Xt();jt();o(qh,"generateCirclePoints");o(Jj,"curlyBraceRight")});function Oa(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dL,":first-child").attr("stroke-opacity",0),S.insert(()=>b,":first-child"),S.insert(()=>T,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${h-h/4}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,S),e.intersect=function(A){return Ye.polygon(e,m,A)},i}var rK=M(()=>{"use strict";Ot();qt();Xt();jt();o(Oa,"generateCirclePoints");o(tK,"curlyBraces")});async function nK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=80,l=20,u=Math.max(s,(a.width+(e.padding??0)*2)*1.25,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=u,y=h,v=g-f,x=y/4,b=[{x:v,y:0},{x,y:0},{x:0,y:y/2},{x,y},{x:v,y},...O5(-v,-y/2,f,50,270,90)],w=Wt(b),_=p.path(w,m),T=i.insert(()=>_,":first-child");return T.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",n),T.attr("transform",`translate(${-u/2}, ${-h/2})`),je(e,T),e.intersect=function(E){return Ye.polygon(e,b,E)},i}var iK=M(()=>{"use strict";Ot();qt();Xt();jt();o(nK,"curvedTrapezoid")});async function aK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+e.padding,e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+e.padding,e.height??0),d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Xe.svg(i),g=V7e(0,0,l,f,u,h),y=U7e(0,h,l,f,u,h),v=m.path(g,Ke(e,{})),x=m.path(y,Ke(e,{fill:"none"}));d=i.insert(()=>x,":first-child"),d=i.insert(()=>v,":first-child"),d.attr("class","basic label-container"),p&&d.attr("style",p)}else{let m=$7e(0,0,l,f,u,h);d=i.insert("path",":first-child").attr("d",m).attr("class","basic label-container").attr("style",Gn(p)).attr("style",n)}return d.attr("label-offset-y",h),d.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),je(e,d),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+(e.padding??0)/1.5-(a.y-(a.top??0))})`),e.intersect=function(m){let g=Ye.rect(e,m),y=g.x-(e.x??0);if(u!=0&&(Math.abs(y)<(e.width??0)/2||Math.abs(y)==(e.width??0)/2&&Math.abs(g.y-(e.y??0))>(e.height??0)/2-h)){let v=h*h*(1-y*y/(u*u));v>0&&(v=Math.sqrt(v)),v=h-v,m.y-(e.y??0)>0&&(v=-v),g.y+=v}return g},i}var $7e,V7e,U7e,sK=M(()=>{"use strict";Ot();qt();Xt();jt();hr();$7e=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createCylinderPathD"),V7e=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createOuterCylinderPathD"),U7e=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(aK,"cylinder")});async function oK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=a.width+e.padding,u=a.height+e.padding,h=u*.2,f=-l/2,d=-u/2-h/2,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d+h},{x:-f,y:d+h},{x:-f,y:-d},{x:f,y:-d},{x:f,y:d},{x:-f,y:d},{x:-f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${f+(e.padding??0)/2-(a.x-(a.left??0))}, ${d+h+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,x),e.intersect=function(b){return Ye.rect(e,b)},i}var lK=M(()=>{"use strict";Ot();qt();Xt();jt();o(oK,"dividedRectangle")});async function cK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await st(t,e,ot(e)),u=a.width/2+s+5,h=a.width/2+s,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Xe.svg(i),m=Ke(e,{roughness:.2,strokeWidth:2.5}),g=Ke(e,{roughness:.2,strokeWidth:1.5}),y=p.circle(0,0,u*2,m),v=p.circle(0,0,h*2,g);f=i.insert("g",":first-child"),f.attr("class",Gn(e.cssClasses)).attr("style",Gn(d)),f.node()?.appendChild(y),f.node()?.appendChild(v)}else{f=i.insert("g",":first-child");let p=f.insert("circle",":first-child"),m=f.insert("circle");f.attr("class","basic label-container").attr("style",n),p.attr("class","outer-circle").attr("style",n).attr("r",u).attr("cx",0).attr("cy",0),m.attr("class","inner-circle").attr("style",n).attr("r",h).attr("cx",0).attr("cy",0)}return je(e,f),e.intersect=function(p){return Y.info("DoubleCircle intersect",e,u,p),Ye.circle(e,u,p)},i}var uK=M(()=>{"use strict";ut();Ot();qt();Xt();jt();hr();o(cK,"doublecircle")});function hK(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.label="",e.labelStyle=n;let a=t.insert("g").attr("class",ot(e)).attr("id",e.domId??e.id),s=7,{cssStyles:l}=e,u=Xe.svg(a),{nodeBorder:h}=r,f=Ke(e,{fillStyle:"solid"});e.look!=="handDrawn"&&(f.roughness=0);let d=u.circle(0,0,s*2,f),p=a.insert(()=>d,":first-child");return p.selectAll("path").attr("style",`fill: ${h} !important;`),l&&l.length>0&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",l),i&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",i),je(e,p),e.intersect=function(m){return Y.info("filledCircle intersect",e,{radius:s,point:m}),Ye.circle(e,s,m)},a}var fK=M(()=>{"use strict";jt();ut();qt();Xt();Ot();o(hK,"filledCircle")});async function dK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=a.width+(e.padding??0),u=l+a.height,h=l+a.height,f=[{x:0,y:-u},{x:h,y:-u},{x:h/2,y:0}],{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Wt(f),y=p.path(g,m),v=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`);return d&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),e.width=l,e.height=u,je(e,v),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${-u/2+(e.padding??0)/2+(a.y-(a.top??0))})`),e.intersect=function(x){return Y.info("Triangle intersect",e,f,x),Ye.polygon(e,f,x)},i}var pK=M(()=>{"use strict";ut();Ot();qt();Xt();jt();Ot();o(dK,"flippedTriangle")});function mK(t,e,{dir:r,config:{state:n,themeVariables:i}}){let{nodeStyles:a}=Ze(e);e.label="";let s=t.insert("g").attr("class",ot(e)).attr("id",e.domId??e.id),{cssStyles:l}=e,u=Math.max(70,e?.width??0),h=Math.max(10,e?.height??0);r==="LR"&&(u=Math.max(10,e?.width??0),h=Math.max(70,e?.height??0));let f=-1*u/2,d=-1*h/2,p=Xe.svg(s),m=Ke(e,{stroke:i.lineColor,fill:i.lineColor});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=p.rectangle(f,d,u,h,m),y=s.insert(()=>g,":first-child");l&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",l),a&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",a),je(e,y);let v=n?.padding??0;return e.width&&e.height&&(e.width+=v/2||0,e.height+=v/2||0),e.intersect=function(x){return Ye.rect(e,x)},s}var gK=M(()=>{"use strict";jt();qt();Xt();Ot();o(mK,"forkJoin")});async function yK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let i=80,a=50,{shapeSvg:s,bbox:l}=await st(t,e,ot(e)),u=Math.max(i,l.width+(e.padding??0)*2,e?.width??0),h=Math.max(a,l.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Xe.svg(s),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-u/2,y:-h/2},{x:u/2-f,y:-h/2},...O5(-u/2+f,0,f,50,90,270),{x:u/2-f,y:h/2},{x:-u/2,y:h/2}],y=Wt(g),v=p.path(y,m),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),je(e,x),e.intersect=function(b){return Y.info("Pill intersect",e,{radius:f,point:b}),Ye.polygon(e,g,b)},s}var vK=M(()=>{"use strict";ut();Ot();qt();Xt();jt();o(yK,"halfRoundedRectangle")});async function xK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=4,l=a.height+e.padding,u=l/s,h=a.width+2*u+e.padding,f=[{x:u,y:0},{x:h-u,y:0},{x:h,y:-l/2},{x:h-u,y:-l},{x:u,y:-l},{x:0,y:-l/2}],d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Xe.svg(i),g=Ke(e,{}),y=H7e(0,0,h,l,u),v=m.path(y,g);d=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${l/2})`),p&&d.attr("style",p)}else d=Ia(i,h,l,f);return n&&d.attr("style",n),e.width=h,e.height=l,je(e,d),e.intersect=function(m){return Ye.polygon(e,f,m)},i}var H7e,bK=M(()=>{"use strict";Ot();qt();Xt();jt();Ou();H7e=o((t,e,r,n,i)=>[`M${t+i},${e}`,`L${t+r-i},${e}`,`L${t+r},${e-n/2}`,`L${t+r-i},${e-n}`,`L${t+i},${e-n}`,`L${t},${e-n/2}`,"Z"].join(" "),"createHexagonPathD");o(xK,"hexagon")});async function wK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.label="",e.labelStyle=r;let{shapeSvg:i}=await st(t,e,ot(e)),a=Math.max(30,e?.width??0),s=Math.max(30,e?.height??0),{cssStyles:l}=e,u=Xe.svg(i),h=Ke(e,{});e.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let f=[{x:0,y:0},{x:a,y:0},{x:0,y:s},{x:a,y:s}],d=Wt(f),p=u.path(d,h),m=i.insert(()=>p,":first-child");return m.attr("class","basic label-container"),l&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",l),n&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",n),m.attr("transform",`translate(${-a/2}, ${-s/2})`),je(e,m),e.intersect=function(g){return Y.info("Pill intersect",e,{points:f}),Ye.polygon(e,f,g)},i}var TK=M(()=>{"use strict";ut();Ot();qt();Xt();jt();o(wK,"hourglass")});async function kK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await st(t,e,"icon-shape default"),p=e.pos==="t",m=l,g=l,{nodeBorder:y}=r,{stylesMap:v}=Sc(e),x=-g/2,b=-m/2,w=e.label?8:0,_=Xe.svg(h),T=Ke(e,{stroke:"none",fill:"none"});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let E=_.rectangle(x,b,g,m,T),L=Math.max(g,f.width),S=m+f.height+w,A=_.rectangle(-L/2,-S/2,L,S,{...T,fill:"transparent",stroke:"none"}),I=h.insert(()=>E,":first-child"),D=h.insert(()=>A);if(e.icon){let k=h.append("g");k.html(`${await _o(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let R=k.node().getBBox(),C=R.width,O=R.height,N=R.x,P=R.y;k.attr("transform",`translate(${-C/2-N},${p?f.height/2+w/2-O/2-P:-f.height/2-w/2-O/2-P})`),k.attr("style",`color: ${v.get("stroke")??y};`)}return d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${p?-S/2:S/2-f.height})`),I.attr("transform",`translate(0,${p?f.height/2+w/2:-f.height/2-w/2})`),je(e,D),e.intersect=function(k){if(Y.info("iconSquare intersect",e,k),!e.label)return Ye.rect(e,k);let R=e.x??0,C=e.y??0,O=e.height??0,N=[];return p?N=[{x:R-f.width/2,y:C-O/2},{x:R+f.width/2,y:C-O/2},{x:R+f.width/2,y:C-O/2+f.height+w},{x:R+g/2,y:C-O/2+f.height+w},{x:R+g/2,y:C+O/2},{x:R-g/2,y:C+O/2},{x:R-g/2,y:C-O/2+f.height+w},{x:R-f.width/2,y:C-O/2+f.height+w}]:N=[{x:R-g/2,y:C-O/2},{x:R+g/2,y:C-O/2},{x:R+g/2,y:C-O/2+m},{x:R+f.width/2,y:C-O/2+m},{x:R+f.width/2/2,y:C+O/2},{x:R-f.width/2,y:C+O/2},{x:R-f.width/2,y:C-O/2+m},{x:R-g/2,y:C-O/2+m}],Ye.polygon(e,N,k)},h}var EK=M(()=>{"use strict";jt();ut();su();qt();Xt();Ot();o(kK,"icon")});async function SK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await st(t,e,"icon-shape default"),p=20,m=e.label?8:0,g=e.pos==="t",{nodeBorder:y,mainBkg:v}=r,{stylesMap:x}=Sc(e),b=Xe.svg(h),w=Ke(e,{});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let _=x.get("fill");w.stroke=_??v;let T=h.append("g");e.icon&&T.html(`${await _o(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let E=T.node().getBBox(),L=E.width,S=E.height,A=E.x,I=E.y,D=Math.max(L,S)*Math.SQRT2+p*2,k=b.circle(0,0,D,w),R=Math.max(D,f.width),C=D+f.height+m,O=b.rectangle(-R/2,-C/2,R,C,{...w,fill:"transparent",stroke:"none"}),N=h.insert(()=>k,":first-child"),P=h.insert(()=>O);return T.attr("transform",`translate(${-L/2-A},${g?f.height/2+m/2-S/2-I:-f.height/2-m/2-S/2-I})`),T.attr("style",`color: ${x.get("stroke")??y};`),d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${g?-C/2:C/2-f.height})`),N.attr("transform",`translate(0,${g?f.height/2+m/2:-f.height/2-m/2})`),je(e,P),e.intersect=function(F){return Y.info("iconSquare intersect",e,F),Ye.rect(e,F)},h}var CK=M(()=>{"use strict";jt();ut();su();qt();Xt();Ot();o(SK,"iconCircle")});var Pa,Xh=M(()=>{"use strict";Pa=o((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD")});async function AK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await st(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=Sc(e),w=-y/2,_=-g/2,T=e.label?8:0,E=Xe.svg(h),L=Ke(e,{});e.look!=="handDrawn"&&(L.roughness=0,L.fillStyle="solid");let S=b.get("fill");L.stroke=S??x;let A=E.path(Pa(w,_,y,g,5),L),I=Math.max(y,f.width),D=g+f.height+T,k=E.rectangle(-I/2,-D/2,I,D,{...L,fill:"transparent",stroke:"none"}),R=h.insert(()=>A,":first-child").attr("class","icon-shape2"),C=h.insert(()=>k);if(e.icon){let O=h.append("g");O.html(`${await _o(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let N=O.node().getBBox(),P=N.width,F=N.height,B=N.x,G=N.y;O.attr("transform",`translate(${-P/2-B},${m?f.height/2+T/2-F/2-G:-f.height/2-T/2-F/2-G})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-D/2:D/2-f.height})`),R.attr("transform",`translate(0,${m?f.height/2+T/2:-f.height/2-T/2})`),je(e,C),e.intersect=function(O){if(Y.info("iconSquare intersect",e,O),!e.label)return Ye.rect(e,O);let N=e.x??0,P=e.y??0,F=e.height??0,B=[];return m?B=[{x:N-f.width/2,y:P-F/2},{x:N+f.width/2,y:P-F/2},{x:N+f.width/2,y:P-F/2+f.height+T},{x:N+y/2,y:P-F/2+f.height+T},{x:N+y/2,y:P+F/2},{x:N-y/2,y:P+F/2},{x:N-y/2,y:P-F/2+f.height+T},{x:N-f.width/2,y:P-F/2+f.height+T}]:B=[{x:N-y/2,y:P-F/2},{x:N+y/2,y:P-F/2},{x:N+y/2,y:P-F/2+g},{x:N+f.width/2,y:P-F/2+g},{x:N+f.width/2/2,y:P+F/2},{x:N-f.width/2,y:P+F/2},{x:N-f.width/2,y:P-F/2+g},{x:N-y/2,y:P-F/2+g}],Ye.polygon(e,B,O)},h}var _K=M(()=>{"use strict";jt();ut();su();qt();Xt();Xh();Ot();o(AK,"iconRounded")});async function LK(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await st(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=Sc(e),w=-y/2,_=-g/2,T=e.label?8:0,E=Xe.svg(h),L=Ke(e,{});e.look!=="handDrawn"&&(L.roughness=0,L.fillStyle="solid");let S=b.get("fill");L.stroke=S??x;let A=E.path(Pa(w,_,y,g,.1),L),I=Math.max(y,f.width),D=g+f.height+T,k=E.rectangle(-I/2,-D/2,I,D,{...L,fill:"transparent",stroke:"none"}),R=h.insert(()=>A,":first-child"),C=h.insert(()=>k);if(e.icon){let O=h.append("g");O.html(`${await _o(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let N=O.node().getBBox(),P=N.width,F=N.height,B=N.x,G=N.y;O.attr("transform",`translate(${-P/2-B},${m?f.height/2+T/2-F/2-G:-f.height/2-T/2-F/2-G})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-D/2:D/2-f.height})`),R.attr("transform",`translate(0,${m?f.height/2+T/2:-f.height/2-T/2})`),je(e,C),e.intersect=function(O){if(Y.info("iconSquare intersect",e,O),!e.label)return Ye.rect(e,O);let N=e.x??0,P=e.y??0,F=e.height??0,B=[];return m?B=[{x:N-f.width/2,y:P-F/2},{x:N+f.width/2,y:P-F/2},{x:N+f.width/2,y:P-F/2+f.height+T},{x:N+y/2,y:P-F/2+f.height+T},{x:N+y/2,y:P+F/2},{x:N-y/2,y:P+F/2},{x:N-y/2,y:P-F/2+f.height+T},{x:N-f.width/2,y:P-F/2+f.height+T}]:B=[{x:N-y/2,y:P-F/2},{x:N+y/2,y:P-F/2},{x:N+y/2,y:P-F/2+g},{x:N+f.width/2,y:P-F/2+g},{x:N+f.width/2/2,y:P+F/2},{x:N-f.width/2,y:P+F/2},{x:N-f.width/2,y:P-F/2+g},{x:N-y/2,y:P-F/2+g}],Ye.polygon(e,B,O)},h}var DK=M(()=>{"use strict";jt();ut();su();qt();Xh();Xt();Ot();o(LK,"iconSquare")});async function NK(t,e,{config:{flowchart:r}}){let n=new Image;n.src=e?.img??"",await n.decode();let i=Number(n.naturalWidth.toString().replace("px","")),a=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=i/a;let{labelStyles:s}=Ze(e);e.labelStyle=s;let l=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;let u=Math.max(e.label?l??0:0,e?.assetWidth??i),h=e.constraint==="on"&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:u,f=e.constraint==="on"?h/e.imageAspectRatio:e?.assetHeight??a;e.width=Math.max(h,l??0);let{shapeSvg:d,bbox:p,label:m}=await st(t,e,"image-shape default"),g=e.pos==="t",y=-h/2,v=-f/2,x=e.label?8:0,b=Xe.svg(d),w=Ke(e,{});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let _=b.rectangle(y,v,h,f,w),T=Math.max(h,p.width),E=f+p.height+x,L=b.rectangle(-T/2,-E/2,T,E,{...w,fill:"none",stroke:"none"}),S=d.insert(()=>_,":first-child"),A=d.insert(()=>L);if(e.img){let I=d.append("image");I.attr("href",e.img),I.attr("width",h),I.attr("height",f),I.attr("preserveAspectRatio","none"),I.attr("transform",`translate(${-h/2},${g?E/2-f:-E/2})`)}return m.attr("transform",`translate(${-p.width/2-(p.x-(p.left??0))},${g?-f/2-p.height/2-x/2:f/2-p.height/2+x/2})`),S.attr("transform",`translate(0,${g?p.height/2+x/2:-p.height/2-x/2})`),je(e,A),e.intersect=function(I){if(Y.info("iconSquare intersect",e,I),!e.label)return Ye.rect(e,I);let D=e.x??0,k=e.y??0,R=e.height??0,C=[];return g?C=[{x:D-p.width/2,y:k-R/2},{x:D+p.width/2,y:k-R/2},{x:D+p.width/2,y:k-R/2+p.height+x},{x:D+h/2,y:k-R/2+p.height+x},{x:D+h/2,y:k+R/2},{x:D-h/2,y:k+R/2},{x:D-h/2,y:k-R/2+p.height+x},{x:D-p.width/2,y:k-R/2+p.height+x}]:C=[{x:D-h/2,y:k-R/2},{x:D+h/2,y:k-R/2},{x:D+h/2,y:k-R/2+f},{x:D+p.width/2,y:k-R/2+f},{x:D+p.width/2/2,y:k+R/2},{x:D-p.width/2,y:k+R/2},{x:D-p.width/2,y:k-R/2+f},{x:D-h/2,y:k-R/2+f}],Ye.polygon(e,C,I)},d}var RK=M(()=>{"use strict";jt();ut();qt();Xt();Ot();o(NK,"imageSquare")});async function MK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=[{x:0,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:-3*l/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Wt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ia(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var IK=M(()=>{"use strict";Ot();qt();Xt();jt();Ou();o(MK,"inv_trapezoid")});async function Pd(t,e,r){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n;let{shapeSvg:a,bbox:s}=await st(t,e,ot(e)),l=Math.max(s.width+r.labelPaddingX*2,e?.width||0),u=Math.max(s.height+r.labelPaddingY*2,e?.height||0),h=-l/2,f=-u/2,d,{rx:p,ry:m}=e,{cssStyles:g}=e;if(r?.rx&&r.ry&&(p=r.rx,m=r.ry),e.look==="handDrawn"){let y=Xe.svg(a),v=Ke(e,{}),x=p||m?y.path(Pa(h,f,l,u,p||0),v):y.rectangle(h,f,l,u,v);d=a.insert(()=>x,":first-child"),d.attr("class","basic label-container").attr("style",Gn(g))}else d=a.insert("rect",":first-child"),d.attr("class","basic label-container").attr("style",i).attr("rx",Gn(p)).attr("ry",Gn(m)).attr("x",h).attr("y",f).attr("width",l).attr("height",u);return je(e,d),e.intersect=function(y){return Ye.rect(e,y)},a}var Mv=M(()=>{"use strict";Ot();qt();Xh();Xt();jt();hr();o(Pd,"drawRect")});async function OK(t,e){let{shapeSvg:r,bbox:n,label:i}=await st(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-(n.width/2)-(n.x-(n.left??0))}, ${-(n.height/2)-(n.y-(n.top??0))})`),je(e,a),e.intersect=function(u){return Ye.rect(e,u)},r}var PK=M(()=>{"use strict";Mv();Ot();qt();o(OK,"labelRect")});async function BK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:-(3*l)/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Wt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ia(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var FK=M(()=>{"use strict";Ot();qt();Xt();jt();Ou();o(BK,"lean_left")});async function zK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:-3*l/6,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Wt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ia(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var GK=M(()=>{"use strict";Ot();qt();Xt();jt();Ou();o(zK,"lean_right")});function $K(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.label="",e.labelStyle=r;let i=t.insert("g").attr("class",ot(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,s=Math.max(35,e?.width??0),l=Math.max(35,e?.height??0),u=7,h=[{x:s,y:0},{x:0,y:l+u/2},{x:s-2*u,y:l+u/2},{x:0,y:2*l},{x:s,y:l-u/2},{x:2*u,y:l-u/2}],f=Xe.svg(i),d=Ke(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=Wt(h),m=f.path(p,d),g=i.insert(()=>m,":first-child");return a&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",a),n&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",n),g.attr("transform",`translate(-${s/2},${-l})`),je(e,g),e.intersect=function(y){return Y.info("lightningBolt intersect",e,y),Ye.polygon(e,h,y)},i}var VK=M(()=>{"use strict";ut();Ot();Xt();jt();qt();Ot();o($K,"lightningBolt")});async function UK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0),e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+(e.padding??0),e.height??0),d=f*.1,p,{cssStyles:m}=e;if(e.look==="handDrawn"){let g=Xe.svg(i),y=Y7e(0,0,l,f,u,h,d),v=q7e(0,h,l,f,u,h),x=Ke(e,{}),b=g.path(y,x),w=g.path(v,x);i.insert(()=>w,":first-child").attr("class","line"),p=i.insert(()=>b,":first-child"),p.attr("class","basic label-container"),m&&p.attr("style",m)}else{let g=W7e(0,0,l,f,u,h,d);p=i.insert("path",":first-child").attr("d",g).attr("class","basic label-container").attr("style",Gn(m)).attr("style",n)}return p.attr("label-offset-y",h),p.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),je(e,p),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),e.intersect=function(g){let y=Ye.rect(e,g),v=y.x-(e.x??0);if(u!=0&&(Math.abs(v)<(e.width??0)/2||Math.abs(v)==(e.width??0)/2&&Math.abs(y.y-(e.y??0))>(e.height??0)/2-h)){let x=h*h*(1-v*v/(u*u));x>0&&(x=Math.sqrt(x)),x=h-x,g.y-(e.y??0)>0&&(x=-x),y.y+=x}return y},i}var W7e,Y7e,q7e,HK=M(()=>{"use strict";Ot();qt();Xt();jt();hr();W7e=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),Y7e=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),q7e=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(UK,"linedCylinder")});async function WK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-l/2-l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:f/2},...Wo(-l/2-l/2*.1,f/2,l/2+l/2*.1,f/2,h,.8),{x:l/2+l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:-f/2},{x:-l/2,y:-f/2},{x:-l/2,y:f/2*1.1},{x:-l/2,y:-f/2}],y=p.polygon(g.map(x=>[x.x,x.y]),m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)+l/2*.1/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),je(e,v),e.intersect=function(x){return Ye.polygon(e,g,x)},i}var YK=M(()=>{"use strict";Ot();qt();jt();Xt();o(WK,"linedWaveEdgedRect")});async function qK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{}),y=[{x:f-h,y:d+h},{x:f-h,y:d+u+h},{x:f+l-h,y:d+u+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d+u-h},{x:f+l+h,y:d+u-h},{x:f+l+h,y:d-h},{x:f+h,y:d-h},{x:f+h,y:d},{x:f,y:d},{x:f,y:d+h}],v=[{x:f,y:d+h},{x:f+l-h,y:d+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d},{x:f,y:d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Wt(y),b=m.path(x,g),w=Wt(v),_=m.path(w,{...g,fill:"none"}),T=i.insert(()=>_,":first-child");return T.insert(()=>b,":first-child"),T.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)-h-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),je(e,T),e.intersect=function(E){return Ye.polygon(e,y,E)},i}var XK=M(()=>{"use strict";Ot();Xt();jt();qt();o(qK,"multiRect")});async function jK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,d=-l/2,p=-f/2,m=5,{cssStyles:g}=e,y=Wo(d-m,p+f+m,d+l-m,p+f+m,h,.8),v=y?.[y.length-1],x=[{x:d-m,y:p+m},{x:d-m,y:p+f+m},...y,{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:v.y-2*m},{x:d+l+m,y:v.y-2*m},{x:d+l+m,y:p-m},{x:d+m,y:p-m},{x:d+m,y:p},{x:d,y:p},{x:d,y:p+m}],b=[{x:d,y:p+m},{x:d+l-m,y:p+m},{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:p},{x:d,y:p}],w=Xe.svg(i),_=Ke(e,{});e.look!=="handDrawn"&&(_.roughness=0,_.fillStyle="solid");let T=Wt(x),E=w.path(T,_),L=Wt(b),S=w.path(L,_),A=i.insert(()=>E,":first-child");return A.insert(()=>S),A.attr("class","basic label-container"),g&&e.look!=="handDrawn"&&A.selectAll("path").attr("style",g),n&&e.look!=="handDrawn"&&A.selectAll("path").attr("style",n),A.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-(a.width/2)-m-(a.x-(a.left??0))}, ${-(a.height/2)+m-h/2-(a.y-(a.top??0))})`),je(e,A),e.intersect=function(I){return Ye.polygon(e,x,I)},i}var KK=M(()=>{"use strict";Ot();qt();jt();Xt();o(jK,"multiWaveEdgedRectangle")});async function QK(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n,e.useHtmlLabels||Cr().flowchart?.htmlLabels!==!1||(e.centerLabel=!0);let{shapeSvg:s,bbox:l}=await st(t,e,ot(e)),u=Math.max(l.width+(e.padding??0)*2,e?.width??0),h=Math.max(l.height+(e.padding??0)*2,e?.height??0),f=-u/2,d=-h/2,{cssStyles:p}=e,m=Xe.svg(s),g=Ke(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=m.rectangle(f,d,u,h,g),v=s.insert(()=>y,":first-child");return v.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",p),i&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",i),je(e,v),e.intersect=function(x){return Ye.rect(e,x)},s}var ZK=M(()=>{"use strict";jt();qt();Xt();Ot();Za();o(QK,"note")});async function JK(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=a.width+e.padding,l=a.height+e.padding,u=s+l,h=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Xe.svg(i),m=Ke(e,{}),g=X7e(0,0,u),y=p.path(g,m);f=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`),d&&f.attr("style",d)}else f=Ia(i,u,u,h);return n&&f.attr("style",n),je(e,f),e.intersect=function(p){return Y.debug(`APA12 Intersect called SPLIT +point:`,p,` +node: +`,e,` +res:`,Ye.polygon(e,h,p)),Ye.polygon(e,h,p)},i}var X7e,eQ=M(()=>{"use strict";ut();Ot();qt();Xt();jt();Ou();X7e=o((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");o(JK,"question")});async function tQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0),e?.width??0),u=Math.max(a.height+(e.padding??0),e?.height??0),h=-l/2,f=-u/2,d=f/2,p=[{x:h+d,y:f},{x:h,y:0},{x:h+d,y:-f},{x:-h,y:-f},{x:-h,y:f}],{cssStyles:m}=e,g=Xe.svg(i),y=Ke(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=Wt(p),x=g.path(v,y),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(${-d/2},0)`),s.attr("transform",`translate(${-d/2-a.width/2-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),je(e,b),e.intersect=function(w){return Ye.polygon(e,p,w)},i}var rQ=M(()=>{"use strict";Ot();qt();Xt();jt();o(tQ,"rect_left_inv_arrow")});function j7e(t,e){e&&t.attr("style",e)}async function K7e(t){let e=Ve(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=t.label;t.label&&yi(t.label)&&(n=await bh(t.label.replace(qe.lineBreakRegex,` +`),pe()));let i=t.isNode?"nodeLabel":"edgeLabel";return r.html('"+n+""),j7e(r,t.labelStyle),r.style("display","inline-block"),r.style("padding-right","1px"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var Q7e,Cc,Y5=M(()=>{"use strict";pr();ut();Vt();fr();hr();o(j7e,"applyStyle");o(K7e,"addHtmlLabel");Q7e=o(async(t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),xr(pe().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),Y.info("vertexText"+i);let a={isNode:n,label:Ma(i).replace(/fa[blrs]?:fa-[\w-]+/g,l=>``),labelStyle:e&&e.replace("fill:","color:")};return await K7e(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),Cc=Q7e});async function nQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let i;e.cssClasses?i="node "+e.cssClasses:i="node default";let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=a.insert("g"),l=a.insert("g").attr("class","label").attr("style",n),u=e.description,h=e.label,f=l.node().appendChild(await Cc(h,e.labelStyle,!0,!0)),d={width:0,height:0};if(xr(pe()?.flowchart?.htmlLabels)){let S=f.children[0],A=Ve(f);d=S.getBoundingClientRect(),A.attr("width",d.width),A.attr("height",d.height)}Y.info("Text 2",u);let p=u||[],m=f.getBBox(),g=l.node().appendChild(await Cc(p.join?p.join("
    "):p,e.labelStyle,!0,!0)),y=g.children[0],v=Ve(g);d=y.getBoundingClientRect(),v.attr("width",d.width),v.attr("height",d.height);let x=(e.padding||0)/2;Ve(g).attr("transform","translate( "+(d.width>m.width?0:(m.width-d.width)/2)+", "+(m.height+x+5)+")"),Ve(f).attr("transform","translate( "+(d.width(Y.debug("Rough node insert CXC",I),D),":first-child"),E=a.insert(()=>(Y.debug("Rough node insert CXC",I),I),":first-child")}else E=s.insert("rect",":first-child"),L=s.insert("line"),E.attr("class","outer title-state").attr("style",n).attr("x",-d.width/2-x).attr("y",-d.height/2-x).attr("width",d.width+(e.padding||0)).attr("height",d.height+(e.padding||0)),L.attr("class","divider").attr("x1",-d.width/2-x).attr("x2",d.width/2+x).attr("y1",-d.height/2-x+m.height+x).attr("y2",-d.height/2-x+m.height+x);return je(e,E),e.intersect=function(S){return Ye.rect(e,S)},a}var iQ=M(()=>{"use strict";pr();fr();Ot();Y5();qt();Xt();jt();Vt();Xh();ut();o(nQ,"rectWithTitle")});async function aQ(t,e){let r={rx:5,ry:5,classes:"",labelPaddingX:(e?.padding||0)*1,labelPaddingY:(e?.padding||0)*1};return Pd(t,e,r)}var sQ=M(()=>{"use strict";Mv();o(aQ,"roundedRect")});async function oQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=e?.padding??0,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=-a.width/2-l,d=-a.height/2-l,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d},{x:f+u+8,y:d},{x:f+u+8,y:d+h},{x:f-8,y:d+h},{x:f-8,y:d},{x:f,y:d},{x:f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container").attr("style",Gn(p)),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${-u/2+4+(e.padding??0)-(a.x-(a.left??0))},${-h/2+(e.padding??0)-(a.y-(a.top??0))})`),je(e,x),e.intersect=function(b){return Ye.rect(e,b)},i}var lQ=M(()=>{"use strict";Ot();qt();Xt();jt();hr();o(oQ,"shadedProcess")});async function cQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=-l/2,f=-u/2,{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:h,y:f},{x:h,y:f+u},{x:h+l,y:f+u},{x:h+l,y:f-u/2}],y=Wt(g),v=p.path(y,m),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),x.attr("transform",`translate(0, ${u/4})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))}, ${-u/4+(e.padding??0)-(a.y-(a.top??0))})`),je(e,x),e.intersect=function(b){return Ye.polygon(e,g,b)},i}var uQ=M(()=>{"use strict";Ot();qt();Xt();jt();o(cQ,"slopedRect")});async function hQ(t,e){let r={rx:0,ry:0,classes:"",labelPaddingX:(e?.padding||0)*2,labelPaddingY:(e?.padding||0)*1};return Pd(t,e,r)}var fQ=M(()=>{"use strict";Mv();o(hQ,"squareRect")});async function dQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=a.height+e.padding,l=a.width+s/4+e.padding,u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Xe.svg(i),d=Ke(e,{}),p=Pa(-l/2,-s/2,l,s,s/2),m=f.path(p,d);u=i.insert(()=>m,":first-child"),u.attr("class","basic label-container").attr("style",Gn(h))}else u=i.insert("rect",":first-child"),u.attr("class","basic label-container").attr("style",n).attr("rx",s/2).attr("ry",s/2).attr("x",-l/2).attr("y",-s/2).attr("width",l).attr("height",s);return je(e,u),e.intersect=function(f){return Ye.rect(e,f)},i}var pQ=M(()=>{"use strict";Ot();qt();Xt();jt();Xh();hr();o(dQ,"stadium")});async function mQ(t,e){return Pd(t,e,{rx:5,ry:5,classes:"flowchart-node"})}var gQ=M(()=>{"use strict";Mv();o(mQ,"state")});function yQ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n;let{cssStyles:a}=e,{lineColor:s,stateBorder:l,nodeBorder:u}=r,h=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),f=Xe.svg(h),d=Ke(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=f.circle(0,0,14,{...d,stroke:s,strokeWidth:2}),m=l??u,g=f.circle(0,0,5,{...d,fill:m,stroke:m,strokeWidth:2,fillStyle:"solid"}),y=h.insert(()=>p,":first-child");return y.insert(()=>g),a&&y.selectAll("path").attr("style",a),i&&y.selectAll("path").attr("style",i),je(e,y),e.intersect=function(v){return Ye.circle(e,7,v)},h}var vQ=M(()=>{"use strict";jt();qt();Xt();Ot();o(yQ,"stateEnd")});function xQ(t,e,{config:{themeVariables:r}}){let{lineColor:n}=r,i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a;if(e.look==="handDrawn"){let l=Xe.svg(i).circle(0,0,14,kj(n));a=i.insert(()=>l),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else a=i.insert("circle",":first-child"),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return je(e,a),e.intersect=function(s){return Ye.circle(e,7,s)},i}var bQ=M(()=>{"use strict";jt();qt();Xt();Ot();o(xQ,"stateStart")});async function wQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=(e?.padding||0)/2,l=a.width+e.padding,u=a.height+e.padding,h=-a.width/2-s,f=-a.height/2-s,d=[{x:0,y:0},{x:l,y:0},{x:l,y:-u},{x:0,y:-u},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-u},{x:-8,y:-u},{x:-8,y:0}];if(e.look==="handDrawn"){let p=Xe.svg(i),m=Ke(e,{}),g=p.rectangle(h-8,f,l+16,u,m),y=p.line(h,f,h,f+u,m),v=p.line(h+l,f,h+l,f+u,m);i.insert(()=>y,":first-child"),i.insert(()=>v,":first-child");let x=i.insert(()=>g,":first-child"),{cssStyles:b}=e;x.attr("class","basic label-container").attr("style",Gn(b)),je(e,x)}else{let p=Ia(i,l,u,d);n&&p.attr("style",n),je(e,p)}return e.intersect=function(p){return Ye.polygon(e,d,p)},i}var TQ=M(()=>{"use strict";Ot();qt();Xt();jt();Ou();hr();o(wQ,"subroutine")});async function kQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=-s/2,h=-l/2,f=.2*l,d=.2*l,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{}),y=[{x:u-f/2,y:h},{x:u+s+f/2,y:h},{x:u+s+f/2,y:h+l},{x:u-f/2,y:h+l}],v=[{x:u+s-f/2,y:h+l},{x:u+s+f/2,y:h+l},{x:u+s+f/2,y:h+l-d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Wt(y),b=m.path(x,g),w=Wt(v),_=m.path(w,{...g,fillStyle:"solid"}),T=i.insert(()=>_,":first-child");return T.insert(()=>b,":first-child"),T.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",n),je(e,T),e.intersect=function(E){return Ye.polygon(e,y,E)},i}var EQ=M(()=>{"use strict";Ot();Xt();jt();qt();o(kQ,"taggedRect")});async function SQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=.2*l,d=.2*u,p=u+h,{cssStyles:m}=e,g=Xe.svg(i),y=Ke(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=[{x:-l/2-l/2*.1,y:p/2},...Wo(-l/2-l/2*.1,p/2,l/2+l/2*.1,p/2,h,.8),{x:l/2+l/2*.1,y:-p/2},{x:-l/2-l/2*.1,y:-p/2}],x=-l/2+l/2*.1,b=-p/2-d*.4,w=[{x:x+l-f,y:(b+u)*1.4},{x:x+l,y:b+u-d},{x:x+l,y:(b+u)*.9},...Wo(x+l,(b+u)*1.3,x+l-f,(b+u)*1.5,-u*.03,.5)],_=Wt(v),T=g.path(_,y),E=Wt(w),L=g.path(E,{...y,fillStyle:"solid"}),S=i.insert(()=>L,":first-child");return S.insert(()=>T,":first-child"),S.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),je(e,S),e.intersect=function(A){return Ye.polygon(e,v,A)},i}var CQ=M(()=>{"use strict";Ot();qt();jt();Xt();o(SQ,"taggedWaveEdgedRectangle")});async function AQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=Math.max(a.width+e.padding,e?.width||0),l=Math.max(a.height+e.padding,e?.height||0),u=-s/2,h=-l/2,f=i.insert("rect",":first-child");return f.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",u).attr("y",h).attr("width",s).attr("height",l),je(e,f),e.intersect=function(d){return Ye.rect(e,d)},i}var _Q=M(()=>{"use strict";Ot();qt();Xt();o(AQ,"text")});async function LQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s,halfPadding:l}=await st(t,e,ot(e)),u=e.look==="neo"?l*2:l,h=a.height+u,f=h/2,d=f/(2.5+h/50),p=a.width+d+u,{cssStyles:m}=e,g;if(e.look==="handDrawn"){let y=Xe.svg(i),v=J7e(0,0,p,h,d,f),x=eAe(0,0,p,h,d,f),b=y.path(v,Ke(e,{})),w=y.path(x,Ke(e,{fill:"none"}));g=i.insert(()=>w,":first-child"),g=i.insert(()=>b,":first-child"),g.attr("class","basic label-container"),m&&g.attr("style",m)}else{let y=Z7e(0,0,p,h,d,f);g=i.insert("path",":first-child").attr("d",y).attr("class","basic label-container").attr("style",Gn(m)).attr("style",n),g.attr("class","basic label-container"),m&&g.selectAll("path").attr("style",m),n&&g.selectAll("path").attr("style",n)}return g.attr("label-offset-x",d),g.attr("transform",`translate(${-p/2}, ${h/2} )`),s.attr("transform",`translate(${-(a.width/2)-d-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),je(e,g),e.intersect=function(y){let v=Ye.rect(e,y),x=v.y-(e.y??0);if(f!=0&&(Math.abs(x)<(e.height??0)/2||Math.abs(x)==(e.height??0)/2&&Math.abs(v.x-(e.x??0))>(e.width??0)/2-d)){let b=d*d*(1-x*x/(f*f));b!=0&&(b=Math.sqrt(b)),b=d-b,y.x-(e.x??0)>0&&(b=-b),v.x+=b}return v},i}var Z7e,J7e,eAe,DQ=M(()=>{"use strict";Ot();Xt();jt();qt();hr();Z7e=o((t,e,r,n,i,a)=>`M${t},${e} + a${i},${a} 0,0,1 0,${-n} + l${r},0 + a${i},${a} 0,0,1 0,${n} + M${r},${-n} + a${i},${a} 0,0,0 0,${n} + l${-r},0`,"createCylinderPathD"),J7e=o((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),eAe=o((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");o(LQ,"tiltedCylinder")});async function NQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=a.width+e.padding,l=a.height+e.padding,u=[{x:-3*l/6,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Wt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ia(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var RQ=M(()=>{"use strict";Ot();qt();Xt();jt();Ou();o(NQ,"trapezoid")});async function MQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=60,l=20,u=Math.max(s,a.width+(e.padding??0)*2,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),{cssStyles:f}=e,d=Xe.svg(i),p=Ke(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let m=[{x:-u/2*.8,y:-h/2},{x:u/2*.8,y:-h/2},{x:u/2,y:-h/2*.6},{x:u/2,y:h/2},{x:-u/2,y:h/2},{x:-u/2,y:-h/2*.6}],g=Wt(m),y=d.path(g,p),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),je(e,v),e.intersect=function(x){return Ye.polygon(e,m,x)},i}var IQ=M(()=>{"use strict";Ot();qt();Xt();jt();o(MQ,"trapezoidalPentagon")});async function OQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=xr(pe().flowchart?.htmlLabels),u=a.width+(e.padding??0),h=u+a.height,f=u+a.height,d=[{x:0,y:0},{x:f,y:0},{x:f/2,y:-h}],{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=Wt(d),v=m.path(y,g),x=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${h/2})`);return p&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),e.width=u,e.height=h,je(e,x),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${h/2-(a.height+(e.padding??0)/(l?2:1)-(a.y-(a.top??0)))})`),e.intersect=function(b){return Y.info("Triangle intersect",e,d,b),Ye.polygon(e,d,b)},i}var PQ=M(()=>{"use strict";ut();Ot();qt();Xt();jt();Ot();fr();Vt();o(OQ,"triangle")});async function BQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/8,f=u+h,{cssStyles:d}=e,m=70-l,g=m>0?m/2:0,y=Xe.svg(i),v=Ke(e,{});e.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let x=[{x:-l/2-g,y:f/2},...Wo(-l/2-g,f/2,l/2+g,f/2,h,.8),{x:l/2+g,y:-f/2},{x:-l/2-g,y:-f/2}],b=Wt(x),w=y.path(b,v),_=i.insert(()=>w,":first-child");return _.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",n),_.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h-(a.y-(a.top??0))})`),je(e,_),e.intersect=function(T){return Ye.polygon(e,x,T)},i}var FQ=M(()=>{"use strict";Ot();qt();jt();Xt();o(BQ,"waveEdgedRectangle")});async function zQ(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await st(t,e,ot(e)),s=100,l=50,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=u/h,d=u,p=h;d>p*f?p=d/f:d=p*f,d=Math.max(d,s),p=Math.max(p,l);let m=Math.min(p*.2,p/4),g=p+m*2,{cssStyles:y}=e,v=Xe.svg(i),x=Ke(e,{});e.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let b=[{x:-d/2,y:g/2},...Wo(-d/2,g/2,d/2,g/2,m,1),{x:d/2,y:-g/2},...Wo(d/2,-g/2,-d/2,-g/2,m,-1)],w=Wt(b),_=v.path(w,x),T=i.insert(()=>_,":first-child");return T.attr("class","basic label-container"),y&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",y),n&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",n),je(e,T),e.intersect=function(E){return Ye.polygon(e,b,E)},i}var GQ=M(()=>{"use strict";Ot();qt();Xt();jt();o(zQ,"waveRectangle")});async function $Q(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await st(t,e,ot(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{}),y=[{x:f-h,y:d-h},{x:f-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d-h}],v=`M${f-h},${d-h} L${f+l},${d-h} L${f+l},${d+u} L${f-h},${d+u} L${f-h},${d-h} + M${f-h},${d} L${f+l},${d} + M${f},${d-h} L${f},${d+u}`;e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("transform",`translate(${h/2}, ${h/2})`),b.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)+h/2-(a.x-(a.left??0))}, ${-(a.height/2)+h/2-(a.y-(a.top??0))})`),je(e,b),e.intersect=function(w){return Ye.polygon(e,y,w)},i}var VQ=M(()=>{"use strict";Ot();Xt();jt();qt();o($Q,"windowPane")});async function UQ(t,e,r,n,i=r.class.padding??12){let a=n?0:3,s=t.insert("g").attr("class",ot(e)).attr("id",e.domId||e.id),l=null,u=null,h=null,f=null,d=0,p=0,m=0;if(l=s.insert("g").attr("class","annotation-group text"),e.annotations.length>0){let b=e.annotations[0];await q5(l,{text:`\xAB${b}\xBB`},0),d=l.node().getBBox().height}u=s.insert("g").attr("class","label-group text"),await q5(u,e,0,["font-weight: bolder"]);let g=u.node().getBBox();p=g.height,h=s.insert("g").attr("class","members-group text");let y=0;for(let b of e.members){let w=await q5(h,b,y,[b.parseClassifier()]);y+=w+a}m=h.node().getBBox().height,m<=0&&(m=i/2),f=s.insert("g").attr("class","methods-group text");let v=0;for(let b of e.methods){let w=await q5(f,b,v,[b.parseClassifier()]);v+=w+a}let x=s.node().getBBox();if(l!==null){let b=l.node().getBBox();l.attr("transform",`translate(${-b.width/2})`)}return u.attr("transform",`translate(${-g.width/2}, ${d})`),x=s.node().getBBox(),h.attr("transform",`translate(0, ${d+p+i*2})`),x=s.node().getBBox(),f.attr("transform",`translate(0, ${d+p+(m?m+i*4:i*2)})`),x=s.node().getBBox(),{shapeSvg:s,bbox:x}}async function q5(t,e,r,n=[]){let i=t.insert("g").attr("class","label").attr("style",n.join("; ")),a=Cr(),s="useHtmlLabels"in e?e.useHtmlLabels:xr(a.htmlLabels)??!0,l="";"text"in e?l=e.text:l=e.label,!s&&l.startsWith("\\")&&(l=l.substring(1)),yi(l)&&(s=!0);let u=await Li(i,s7(Ma(l)),{width:so(l,a)+50,classes:"markdown-node-label",useHtmlLabels:s},a),h,f=1;if(s){let d=u.children[0],p=Ve(u);f=d.innerHTML.split("
    ").length,d.innerHTML.includes("")&&(f+=d.innerHTML.split("").length-1);let m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=a.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,_=parseInt(b,10)*5+"px";y.style.minWidth=_,y.style.maxWidth=_}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}else{n.includes("font-weight: bolder")&&Ve(u).selectAll("tspan").attr("font-weight",""),f=u.children.length;let d=u.children[0];(u.textContent===""||u.textContent.includes(">"))&&(d.textContent=l[0]+l.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),l[1]===" "&&(d.textContent=d.textContent[0]+" "+d.textContent.substring(1))),d.textContent==="undefined"&&(d.textContent=""),h=u.getBBox()}return i.attr("transform","translate(0,"+(-h.height/(2*f)+r)+")"),h.height}var HQ=M(()=>{"use strict";pr();Za();Ot();hr();Vt();Pl();fr();o(UQ,"textHelper");o(q5,"addText")});async function WQ(t,e){let r=pe(),n=r.class.padding??12,i=n,a=e.useHtmlLabels??xr(r.htmlLabels)??!0,s=e;s.annotations=s.annotations??[],s.members=s.members??[],s.methods=s.methods??[];let{shapeSvg:l,bbox:u}=await UQ(t,e,r,a,i),{labelStyles:h,nodeStyles:f}=Ze(e);e.labelStyle=h,e.cssStyles=s.styles||"";let d=s.styles?.join(";")||f||"";e.cssStyles||(e.cssStyles=d.replaceAll("!important","").split(";"));let p=s.members.length===0&&s.methods.length===0&&!r.class?.hideEmptyMembersBox,m=Xe.svg(l),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=u.width,v=u.height;s.members.length===0&&s.methods.length===0?v+=i:s.members.length>0&&s.methods.length===0&&(v+=i*2);let x=-y/2,b=-v/2,w=m.rectangle(x-n,b-n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0),y+2*n,v+2*n+(p?n*2:s.members.length===0&&s.methods.length===0?-n:0),g),_=l.insert(()=>w,":first-child");_.attr("class","basic label-container");let T=_.node().getBBox();l.selectAll(".text").each((A,I,D)=>{let k=Ve(D[I]),R=k.attr("transform"),C=0;if(R){let F=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(R);F&&(C=parseFloat(F[2]))}let O=C+b+n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0);a||(O-=4);let N=x;(k.attr("class").includes("label-group")||k.attr("class").includes("annotation-group"))&&(N=-k.node()?.getBBox().width/2||0,l.selectAll("text").each(function(P,F,B){window.getComputedStyle(B[F]).textAnchor==="middle"&&(N=0)})),k.attr("transform",`translate(${N}, ${O})`)});let E=l.select(".annotation-group").node().getBBox().height-(p?n/2:0)||0,L=l.select(".label-group").node().getBBox().height-(p?n/2:0)||0,S=l.select(".members-group").node().getBBox().height-(p?n/2:0)||0;if(s.members.length>0||s.methods.length>0||p){let A=m.line(T.x,E+L+b+n,T.x+T.width,E+L+b+n,g);l.insert(()=>A).attr("class","divider").attr("style",d)}if(p||s.members.length>0||s.methods.length>0){let A=m.line(T.x,E+L+S+b+i*2+n,T.x+T.width,E+L+S+b+n+i*2,g);l.insert(()=>A).attr("class","divider").attr("style",d)}if(s.look!=="handDrawn"&&l.selectAll("path").attr("style",d),_.select(":nth-child(2)").attr("style",d),l.selectAll(".divider").select("path").attr("style",d),e.labelStyle?l.selectAll("span").attr("style",e.labelStyle):l.selectAll("span").attr("style",d),!a){let A=RegExp(/color\s*:\s*([^;]*)/),I=A.exec(d);if(I){let D=I[0].replace("color","fill");l.selectAll("tspan").attr("style",D)}else if(h){let D=A.exec(h);if(D){let k=D[0].replace("color","fill");l.selectAll("tspan").attr("style",k)}}}return je(e,_),e.intersect=function(A){return Ye.rect(e,A)},l}var YQ=M(()=>{"use strict";Ot();Vt();pr();jt();Xt();qt();HQ();fr();o(WQ,"classBox")});async function qQ(t,e,{config:r}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n||"";let a=10,s=e.width;e.width=(e.width??200)-10;let{shapeSvg:l,bbox:u,label:h}=await st(t,e,ot(e)),f=e.padding||10,d="",p;"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(d=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),p=l.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",d).attr("target","_blank"));let m={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1},g,y;p?{label:g,bbox:y}=await I5(p,"ticket"in e&&e.ticket||"",m):{label:g,bbox:y}=await I5(l,"ticket"in e&&e.ticket||"",m);let{label:v,bbox:x}=await I5(l,"assigned"in e&&e.assigned||"",m);e.width=s;let b=10,w=e?.width||0,_=Math.max(y.height,x.height)/2,T=Math.max(u.height+b*2,e?.height||0)+_,E=-w/2,L=-T/2;h.attr("transform","translate("+(f-w/2)+", "+(-_-u.height/2)+")"),g.attr("transform","translate("+(f-w/2)+", "+(-_+u.height/2)+")"),v.attr("transform","translate("+(f+w/2-x.width-2*a)+", "+(-_+u.height/2)+")");let S,{rx:A,ry:I}=e,{cssStyles:D}=e;if(e.look==="handDrawn"){let k=Xe.svg(l),R=Ke(e,{}),C=A||I?k.path(Pa(E,L,w,T,A||0),R):k.rectangle(E,L,w,T,R);S=l.insert(()=>C,":first-child"),S.attr("class","basic label-container").attr("style",D||null)}else{S=l.insert("rect",":first-child"),S.attr("class","basic label-container __APA__").attr("style",i).attr("rx",A??5).attr("ry",I??5).attr("x",E).attr("y",L).attr("width",w).attr("height",T);let k="priority"in e&&e.priority;if(k){let R=l.append("line"),C=E+2,O=L+Math.floor((A??0)/2),N=L+T-Math.floor((A??0)/2);R.attr("x1",C).attr("y1",O).attr("x2",C).attr("y2",N).attr("stroke-width","4").attr("stroke",tAe(k))}}return je(e,S),e.height=T,e.intersect=function(k){return Ye.rect(e,k)},l}var tAe,XQ=M(()=>{"use strict";Ot();qt();Xh();Xt();jt();tAe=o(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");o(qQ,"kanbanItem")});function jQ(t){return t in $9}var rAe,nAe,$9,V9=M(()=>{"use strict";zj();Vj();Hj();Yj();Xj();Kj();Zj();eK();rK();iK();sK();lK();uK();fK();pK();gK();vK();bK();TK();EK();CK();_K();DK();RK();IK();PK();FK();GK();VK();HK();YK();XK();KK();ZK();eQ();rQ();iQ();sQ();lQ();uQ();fQ();pQ();gQ();vQ();bQ();TQ();EQ();CQ();_Q();DQ();RQ();IQ();PQ();FQ();GQ();VQ();YQ();XQ();rAe=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:hQ},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:aQ},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:dQ},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:wQ},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:aK},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:qj},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:JK},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:xK},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:zK},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:BK},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:NQ},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:MK},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:cK},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:AQ},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:Uj},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:oQ},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:xQ},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:yQ},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:mK},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:wK},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:Qj},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:Jj},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:tK},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:$K},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:BQ},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:yK},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:LQ},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:UK},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:nK},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:oK},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:OQ},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:$Q},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:hK},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:MQ},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:dK},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:cQ},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:jK},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:qK},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:$j},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:jj},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:SQ},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:kQ},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:zQ},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:tQ},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:WK}],nAe=o(()=>{let e=[...Object.entries({state:mQ,choice:Wj,note:QK,rectWithTitle:nQ,labelRect:OK,iconSquare:LK,iconCircle:SK,icon:kK,iconRounded:AK,imageSquare:NK,anchor:Fj,kanbanItem:qQ,classBox:WQ}),...rAe.flatMap(r=>[r.shortName,..."aliases"in r?r.aliases:[],..."internalAliases"in r?r.internalAliases:[]].map(i=>[i,r.handler]))];return Object.fromEntries(e)},"generateShapeMap"),$9=nAe();o(jQ,"isValidShape")});function hZ(t){return typeof t>"u"||t===null}function iAe(t){return typeof t=="object"&&t!==null}function aAe(t){return Array.isArray(t)?t:hZ(t)?[]:[t]}function sAe(t,e){var r,n,i,a;if(e)for(a=Object.keys(e),r=0,n=a.length;rl&&(a=" ... ",e=n-l+a.length),r-n>l&&(s=" ...",r=n+l-s.length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+a.length}}function H9(t,e){return Gi.repeat(" ",e-t.length)+t}function mAe(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],i=[],a,s=-1;a=r.exec(t.buffer);)i.push(a.index),n.push(a.index+a[0].length),t.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var l="",u,h,f=Math.min(t.line+e.linesAfter,i.length).toString().length,d=e.maxLength-(e.indent+f+3);for(u=1;u<=e.linesBefore&&!(s-u<0);u++)h=U9(t.buffer,n[s-u],i[s-u],t.position-(n[s]-n[s-u]),d),l=Gi.repeat(" ",e.indent)+H9((t.line-u+1).toString(),f)+" | "+h.str+` +`+l;for(h=U9(t.buffer,n[s],i[s],t.position,d),l+=Gi.repeat(" ",e.indent)+H9((t.line+1).toString(),f)+" | "+h.str+` +`,l+=Gi.repeat("-",e.indent+f+3+h.pos)+`^ +`,u=1;u<=e.linesAfter&&!(s+u>=i.length);u++)h=U9(t.buffer,n[s+u],i[s+u],t.position-(n[s]-n[s+u]),d),l+=Gi.repeat(" ",e.indent)+H9((t.line+u+1).toString(),f)+" | "+h.str+` +`;return l.replace(/\n$/,"")}function xAe(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function bAe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(yAe.indexOf(r)===-1)throw new Ms('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=xAe(e.styleAliases||null),vAe.indexOf(this.kind)===-1)throw new Ms('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function KQ(t,e){var r=[];return t[e].forEach(function(n){var i=r.length;r.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(i=s)}),r[i]=n}),r}function wAe(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(i){i.multi?(t.multi[i.kind].push(i),t.multi.fallback.push(i)):t[i.kind][i.tag]=t.fallback[i.tag]=i}for(o(n,"collectType"),e=0,r=arguments.length;e=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function YAe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Gi.isNegativeZero(t))return"-0.0";return r=t.toString(10),WAe.test(r)?r.replace("e",".e"):r}function qAe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Gi.isNegativeZero(t))}function KAe(t){return t===null?!1:pZ.exec(t)!==null||mZ.exec(t)!==null}function QAe(t){var e,r,n,i,a,s,l,u=0,h=null,f,d,p;if(e=pZ.exec(t),e===null&&(e=mZ.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],s=+e[5],l=+e[6],e[7]){for(u=e[7].slice(0,3);u.length<3;)u+="0";u=+u}return e[9]&&(f=+e[10],d=+(e[11]||0),h=(f*60+d)*6e4,e[9]==="-"&&(h=-h)),p=new Date(Date.UTC(r,n,i,a,s,l,u)),h&&p.setTime(p.getTime()-h),p}function ZAe(t){return t.toISOString()}function e8e(t){return t==="<<"||t===null}function r8e(t){if(t===null)return!1;var e,r,n=0,i=t.length,a=Q9;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8===0}function n8e(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=Q9,s=0,l=[];for(e=0;e>16&255),l.push(s>>8&255),l.push(s&255)),s=s<<6|a.indexOf(n.charAt(e));return r=i%4*6,r===0?(l.push(s>>16&255),l.push(s>>8&255),l.push(s&255)):r===18?(l.push(s>>10&255),l.push(s>>2&255)):r===12&&l.push(s>>4&255),new Uint8Array(l)}function i8e(t){var e="",r=0,n,i,a=t.length,s=Q9;for(n=0;n>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return i=a%3,i===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):i===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):i===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function a8e(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function c8e(t){if(t===null)return!0;var e=[],r,n,i,a,s,l=t;for(r=0,n=l.length;r>10)+55296,(t-65536&1023)+56320)}function _8e(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||gZ,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function kZ(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=gAe(r),new Ms(e,r)}function Qt(t,e){throw kZ(t,e)}function K5(t,e){t.onWarning&&t.onWarning.call(null,kZ(t,e))}function jh(t,e,r,n){var i,a,s,l;if(e1&&(t.result+=Gi.repeat(` +`,e-1))}function L8e(t,e,r){var n,i,a,s,l,u,h,f,d=t.kind,p=t.result,m;if(m=t.input.charCodeAt(t.position),Is(m)||wm(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(i=t.input.charCodeAt(t.position+1),Is(i)||r&&wm(i)))return!1;for(t.kind="scalar",t.result="",a=s=t.position,l=!1;m!==0;){if(m===58){if(i=t.input.charCodeAt(t.position+1),Is(i)||r&&wm(i))break}else if(m===35){if(n=t.input.charCodeAt(t.position-1),Is(n))break}else{if(t.position===t.lineStart&&J5(t)||r&&wm(m))break;if(Ac(m))if(u=t.line,h=t.lineStart,f=t.lineIndent,Di(t,!1,-1),t.lineIndent>=e){l=!0,m=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=u,t.lineStart=h,t.lineIndent=f;break}}l&&(jh(t,a,s,!1),J9(t,t.line-u),a=s=t.position,l=!1),Fd(m)||(s=t.position+1),m=t.input.charCodeAt(++t.position)}return jh(t,a,s,!1),t.result?!0:(t.kind=d,t.result=p,!1)}function D8e(t,e){var r,n,i;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(jh(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,i=t.position;else return!0;else Ac(r)?(jh(t,n,i,!0),J9(t,Di(t,!1,e)),n=i=t.position):t.position===t.lineStart&&J5(t)?Qt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);Qt(t,"unexpected end of the stream within a single quoted scalar")}function N8e(t,e){var r,n,i,a,s,l;if(l=t.input.charCodeAt(t.position),l!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(l=t.input.charCodeAt(t.position))!==0;){if(l===34)return jh(t,r,t.position,!0),t.position++,!0;if(l===92){if(jh(t,r,t.position,!0),l=t.input.charCodeAt(++t.position),Ac(l))Di(t,!1,e);else if(l<256&&wZ[l])t.result+=TZ[l],t.position++;else if((s=S8e(l))>0){for(i=s,a=0;i>0;i--)l=t.input.charCodeAt(++t.position),(s=E8e(l))>=0?a=(a<<4)+s:Qt(t,"expected hexadecimal character");t.result+=A8e(a),t.position++}else Qt(t,"unknown escape sequence");r=n=t.position}else Ac(l)?(jh(t,r,n,!0),J9(t,Di(t,!1,e)),r=n=t.position):t.position===t.lineStart&&J5(t)?Qt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}Qt(t,"unexpected end of the stream within a double quoted scalar")}function R8e(t,e){var r=!0,n,i,a,s=t.tag,l,u=t.anchor,h,f,d,p,m,g=Object.create(null),y,v,x,b;if(b=t.input.charCodeAt(t.position),b===91)f=93,m=!1,l=[];else if(b===123)f=125,m=!0,l={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=l),b=t.input.charCodeAt(++t.position);b!==0;){if(Di(t,!0,e),b=t.input.charCodeAt(t.position),b===f)return t.position++,t.tag=s,t.anchor=u,t.kind=m?"mapping":"sequence",t.result=l,!0;r?b===44&&Qt(t,"expected the node content, but found ','"):Qt(t,"missed comma between flow collection entries"),v=y=x=null,d=p=!1,b===63&&(h=t.input.charCodeAt(t.position+1),Is(h)&&(d=p=!0,t.position++,Di(t,!0,e))),n=t.line,i=t.lineStart,a=t.position,km(t,e,X5,!1,!0),v=t.tag,y=t.result,Di(t,!0,e),b=t.input.charCodeAt(t.position),(p||t.line===n)&&b===58&&(d=!0,b=t.input.charCodeAt(++t.position),Di(t,!0,e),km(t,e,X5,!1,!0),x=t.result),m?Tm(t,l,g,v,y,x,n,i,a):d?l.push(Tm(t,null,g,v,y,x,n,i,a)):l.push(y),Di(t,!0,e),b=t.input.charCodeAt(t.position),b===44?(r=!0,b=t.input.charCodeAt(++t.position)):r=!1}Qt(t,"unexpected end of the stream within a flow collection")}function M8e(t,e){var r,n,i=W9,a=!1,s=!1,l=e,u=0,h=!1,f,d;if(d=t.input.charCodeAt(t.position),d===124)n=!1;else if(d===62)n=!0;else return!1;for(t.kind="scalar",t.result="";d!==0;)if(d=t.input.charCodeAt(++t.position),d===43||d===45)W9===i?i=d===43?QQ:b8e:Qt(t,"repeat of a chomping mode identifier");else if((f=C8e(d))>=0)f===0?Qt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?Qt(t,"repeat of an indentation width identifier"):(l=e+f-1,s=!0);else break;if(Fd(d)){do d=t.input.charCodeAt(++t.position);while(Fd(d));if(d===35)do d=t.input.charCodeAt(++t.position);while(!Ac(d)&&d!==0)}for(;d!==0;){for(Z9(t),t.lineIndent=0,d=t.input.charCodeAt(t.position);(!s||t.lineIndentl&&(l=t.lineIndent),Ac(d)){u++;continue}if(t.lineIndente)&&u!==0)Qt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(v&&(s=t.line,l=t.lineStart,u=t.position),km(t,e,j5,!0,i)&&(v?g=t.result:y=t.result),v||(Tm(t,d,p,m,g,y,s,l,u),m=g=y=null),Di(t,!0,-1),b=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&b!==0)Qt(t,"bad indentation of a mapping entry");else if(t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),d=0,p=t.implicitTypes.length;d"),t.result!==null&&g.kind!==t.kind&&Qt(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+g.kind+'", not "'+t.kind+'"'),g.resolve(t.result,t.tag)?(t.result=g.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Qt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||f}function F8e(t){var e=t.position,r,n,i,a=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(Di(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(a=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!Is(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),i=[],n.length<1&&Qt(t,"directive name must not be less than one character in length");s!==0;){for(;Fd(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!Ac(s));break}if(Ac(s))break;for(r=t.position;s!==0&&!Is(s);)s=t.input.charCodeAt(++t.position);i.push(t.input.slice(r,t.position))}s!==0&&Z9(t),Kh.call(eZ,n)?eZ[n](t,n,i):K5(t,'unknown document directive "'+n+'"')}if(Di(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Di(t,!0,-1)):a&&Qt(t,"directives end mark is expected"),km(t,t.lineIndent-1,j5,!1,!0),Di(t,!0,-1),t.checkLineBreaks&&T8e.test(t.input.slice(e,t.position))&&K5(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&J5(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Di(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var n=EZ(t,r);if(typeof e!="function")return n;for(var i=0,a=n.length;i=55296&&r<=56319&&e+1=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function MZ(t){var e=/^\n* /;return e.test(t)}function p_e(t,e,r,n,i,a,s,l){var u,h=0,f=null,d=!1,p=!1,m=n!==-1,g=-1,y=f_e(Iv(t,0))&&d_e(Iv(t,t.length-1));if(e||s)for(u=0;u=65536?u+=2:u++){if(h=Iv(t,u),!Fv(h))return bm;y=y&&aZ(h,f,l),f=h}else{for(u=0;u=65536?u+=2:u++){if(h=Iv(t,u),h===Pv)d=!0,m&&(p=p||u-g-1>n&&t[g+1]!==" ",g=u);else if(!Fv(h))return bm;y=y&&aZ(h,f,l),f=h}p=p||m&&u-g-1>n&&t[g+1]!==" "}return!d&&!p?y&&!s&&!i(t)?IZ:a===Bv?bm:j9:r>9&&MZ(t)?bm:s?a===Bv?bm:j9:p?PZ:OZ}function m_e(t,e,r,n,i){t.dump=function(){if(e.length===0)return t.quotingType===Bv?'""':"''";if(!t.noCompatMode&&(a_e.indexOf(e)!==-1||s_e.test(e)))return t.quotingType===Bv?'"'+e+'"':"'"+e+"'";var a=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),l=n||t.flowLevel>-1&&r>=t.flowLevel;function u(h){return h_e(t,h)}switch(o(u,"testAmbiguity"),p_e(e,l,t.indent,s,u,t.quotingType,t.forceQuotes&&!n,i)){case IZ:return e;case j9:return"'"+e.replace(/'/g,"''")+"'";case OZ:return"|"+sZ(e,t.indent)+oZ(nZ(e,a));case PZ:return">"+sZ(e,t.indent)+oZ(nZ(g_e(e,s),a));case bm:return'"'+y_e(e)+'"';default:throw new Ms("impossible error: invalid scalar style")}}()}function sZ(t,e){var r=MZ(t)?String(e):"",n=t[t.length-1]===` +`,i=n&&(t[t.length-2]===` +`||t===` +`),a=i?"+":n?"":"-";return r+a+` +`}function oZ(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function g_e(t,e){for(var r=/(\n+)([^\n]*)/g,n=function(){var h=t.indexOf(` +`);return h=h!==-1?h:t.length,r.lastIndex=h,lZ(t.slice(0,h),e)}(),i=t[0]===` +`||t[0]===" ",a,s;s=r.exec(t);){var l=s[1],u=s[2];a=u[0]===" ",n+=l+(!i&&!a&&u!==""?` +`:"")+lZ(u,e),i=a}return n}function lZ(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,i=0,a,s=0,l=0,u="";n=r.exec(t);)l=n.index,l-i>e&&(a=s>i?s:l,u+=` +`+t.slice(i,a),i=a+1),s=l;return u+=` +`,t.length-i>e&&s>i?u+=t.slice(i,s)+` +`+t.slice(s+1):u+=t.slice(i),u.slice(1)}function y_e(t){for(var e="",r=0,n,i=0;i=65536?i+=2:i++)r=Iv(t,i),n=Fa[r],!n&&Fv(r)?(e+=t[i],r>=65536&&(e+=t[i+1])):e+=n||l_e(r);return e}function v_e(t,e,r){var n="",i=t.tag,a,s,l;for(a=0,s=r.length;a"u"&&Pu(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=i,t.dump="["+n+"]"}function cZ(t,e,r,n){var i="",a=t.tag,s,l,u;for(s=0,l=r.length;s"u"&&Pu(t,e+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=X9(t,e)),t.dump&&Pv===t.dump.charCodeAt(0)?i+="-":i+="- ",i+=t.dump);t.tag=a,t.dump=i||"[]"}function x_e(t,e,r){var n="",i=t.tag,a=Object.keys(r),s,l,u,h,f;for(s=0,l=a.length;s1024&&(f+="? "),f+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Pu(t,e,h,!1,!1)&&(f+=t.dump,n+=f));t.tag=i,t.dump="{"+n+"}"}function b_e(t,e,r,n){var i="",a=t.tag,s=Object.keys(r),l,u,h,f,d,p;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new Ms("sortKeys must be a boolean or a function");for(l=0,u=s.length;l1024,d&&(t.dump&&Pv===t.dump.charCodeAt(0)?p+="?":p+="? "),p+=t.dump,d&&(p+=X9(t,e)),Pu(t,e+1,f,!0,d)&&(t.dump&&Pv===t.dump.charCodeAt(0)?p+=":":p+=": ",p+=t.dump,i+=p));t.tag=a,t.dump=i||"{}"}function uZ(t,e,r){var n,i,a,s,l,u;for(i=r?t.explicitTypes:t.implicitTypes,a=0,s=i.length;a tag resolver accepts not "'+u+'" style');t.dump=n}return!0}return!1}function Pu(t,e,r,n,i,a,s){t.tag=null,t.dump=r,uZ(t,r,!1)||uZ(t,r,!0);var l=CZ.call(t.dump),u=n,h;n&&(n=t.flowLevel<0||t.flowLevel>e);var f=l==="[object Object]"||l==="[object Array]",d,p;if(f&&(d=t.duplicates.indexOf(r),p=d!==-1),(t.tag!==null&&t.tag!=="?"||p||t.indent!==2&&e>0)&&(i=!1),p&&t.usedDuplicates[d])t.dump="*ref_"+d;else{if(f&&p&&!t.usedDuplicates[d]&&(t.usedDuplicates[d]=!0),l==="[object Object]")n&&Object.keys(t.dump).length!==0?(b_e(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(x_e(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?cZ(t,e-1,t.dump,i):cZ(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(v_e(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object String]")t.tag!=="?"&&m_e(t,t.dump,e,a,u);else{if(l==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new Ms("unacceptable kind of an object to dump "+l)}t.tag!==null&&t.tag!=="?"&&(h=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?h="!"+h:h.slice(0,18)==="tag:yaml.org,2002:"?h="!!"+h.slice(18):h="!<"+h+">",t.dump=h+" "+t.dump)}return!0}function w_e(t,e){var r=[],n=[],i,a;for(K9(t,r,n),i=0,a=n.length;i{"use strict";o(hZ,"isNothing");o(iAe,"isObject");o(aAe,"toArray");o(sAe,"extend");o(oAe,"repeat");o(lAe,"isNegativeZero");cAe=hZ,uAe=iAe,hAe=aAe,fAe=oAe,dAe=lAe,pAe=sAe,Gi={isNothing:cAe,isObject:uAe,toArray:hAe,repeat:fAe,isNegativeZero:dAe,extend:pAe};o(fZ,"formatError");o(Ov,"YAMLException$1");Ov.prototype=Object.create(Error.prototype);Ov.prototype.constructor=Ov;Ov.prototype.toString=o(function(e){return this.name+": "+fZ(this,e)},"toString");Ms=Ov;o(U9,"getLine");o(H9,"padStart");o(mAe,"makeSnippet");gAe=mAe,yAe=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],vAe=["scalar","sequence","mapping"];o(xAe,"compileStyleAliases");o(bAe,"Type$1");Ba=bAe;o(KQ,"compileList");o(wAe,"compileMap");o(Y9,"Schema$1");Y9.prototype.extend=o(function(e){var r=[],n=[];if(e instanceof Ba)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new Ms("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(a){if(!(a instanceof Ba))throw new Ms("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(a.loadKind&&a.loadKind!=="scalar")throw new Ms("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(a.multi)throw new Ms("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(a){if(!(a instanceof Ba))throw new Ms("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var i=Object.create(Y9.prototype);return i.implicit=(this.implicit||[]).concat(r),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=KQ(i,"implicit"),i.compiledExplicit=KQ(i,"explicit"),i.compiledTypeMap=wAe(i.compiledImplicit,i.compiledExplicit),i},"extend");TAe=Y9,kAe=new Ba("tag:yaml.org,2002:str",{kind:"scalar",construct:o(function(t){return t!==null?t:""},"construct")}),EAe=new Ba("tag:yaml.org,2002:seq",{kind:"sequence",construct:o(function(t){return t!==null?t:[]},"construct")}),SAe=new Ba("tag:yaml.org,2002:map",{kind:"mapping",construct:o(function(t){return t!==null?t:{}},"construct")}),CAe=new TAe({explicit:[kAe,EAe,SAe]});o(AAe,"resolveYamlNull");o(_Ae,"constructYamlNull");o(LAe,"isNull");DAe=new Ba("tag:yaml.org,2002:null",{kind:"scalar",resolve:AAe,construct:_Ae,predicate:LAe,represent:{canonical:o(function(){return"~"},"canonical"),lowercase:o(function(){return"null"},"lowercase"),uppercase:o(function(){return"NULL"},"uppercase"),camelcase:o(function(){return"Null"},"camelcase"),empty:o(function(){return""},"empty")},defaultStyle:"lowercase"});o(NAe,"resolveYamlBoolean");o(RAe,"constructYamlBoolean");o(MAe,"isBoolean");IAe=new Ba("tag:yaml.org,2002:bool",{kind:"scalar",resolve:NAe,construct:RAe,predicate:MAe,represent:{lowercase:o(function(t){return t?"true":"false"},"lowercase"),uppercase:o(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:o(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});o(OAe,"isHexCode");o(PAe,"isOctCode");o(BAe,"isDecCode");o(FAe,"resolveYamlInteger");o(zAe,"constructYamlInteger");o(GAe,"isInteger");$Ae=new Ba("tag:yaml.org,2002:int",{kind:"scalar",resolve:FAe,construct:zAe,predicate:GAe,represent:{binary:o(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:o(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:o(function(t){return t.toString(10)},"decimal"),hexadecimal:o(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),VAe=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");o(UAe,"resolveYamlFloat");o(HAe,"constructYamlFloat");WAe=/^[-+]?[0-9]+e/;o(YAe,"representYamlFloat");o(qAe,"isFloat");XAe=new Ba("tag:yaml.org,2002:float",{kind:"scalar",resolve:UAe,construct:HAe,predicate:qAe,represent:YAe,defaultStyle:"lowercase"}),dZ=CAe.extend({implicit:[DAe,IAe,$Ae,XAe]}),jAe=dZ,pZ=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),mZ=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");o(KAe,"resolveYamlTimestamp");o(QAe,"constructYamlTimestamp");o(ZAe,"representYamlTimestamp");JAe=new Ba("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:KAe,construct:QAe,instanceOf:Date,represent:ZAe});o(e8e,"resolveYamlMerge");t8e=new Ba("tag:yaml.org,2002:merge",{kind:"scalar",resolve:e8e}),Q9=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;o(r8e,"resolveYamlBinary");o(n8e,"constructYamlBinary");o(i8e,"representYamlBinary");o(a8e,"isBinary");s8e=new Ba("tag:yaml.org,2002:binary",{kind:"scalar",resolve:r8e,construct:n8e,predicate:a8e,represent:i8e}),o8e=Object.prototype.hasOwnProperty,l8e=Object.prototype.toString;o(c8e,"resolveYamlOmap");o(u8e,"constructYamlOmap");h8e=new Ba("tag:yaml.org,2002:omap",{kind:"sequence",resolve:c8e,construct:u8e}),f8e=Object.prototype.toString;o(d8e,"resolveYamlPairs");o(p8e,"constructYamlPairs");m8e=new Ba("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:d8e,construct:p8e}),g8e=Object.prototype.hasOwnProperty;o(y8e,"resolveYamlSet");o(v8e,"constructYamlSet");x8e=new Ba("tag:yaml.org,2002:set",{kind:"mapping",resolve:y8e,construct:v8e}),gZ=jAe.extend({implicit:[JAe,t8e],explicit:[s8e,h8e,m8e,x8e]}),Kh=Object.prototype.hasOwnProperty,X5=1,yZ=2,vZ=3,j5=4,W9=1,b8e=2,QQ=3,w8e=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,T8e=/[\x85\u2028\u2029]/,k8e=/[,\[\]\{\}]/,xZ=/^(?:!|!!|![a-z\-]+!)$/i,bZ=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;o(ZQ,"_class");o(Ac,"is_EOL");o(Fd,"is_WHITE_SPACE");o(Is,"is_WS_OR_EOL");o(wm,"is_FLOW_INDICATOR");o(E8e,"fromHexCode");o(S8e,"escapedHexLen");o(C8e,"fromDecimalCode");o(JQ,"simpleEscapeSequence");o(A8e,"charFromCodepoint");wZ=new Array(256),TZ=new Array(256);for(Bd=0;Bd<256;Bd++)wZ[Bd]=JQ(Bd)?1:0,TZ[Bd]=JQ(Bd);o(_8e,"State$1");o(kZ,"generateError");o(Qt,"throwError");o(K5,"throwWarning");eZ={YAML:o(function(e,r,n){var i,a,s;e.version!==null&&Qt(e,"duplication of %YAML directive"),n.length!==1&&Qt(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),i===null&&Qt(e,"ill-formed argument of the YAML directive"),a=parseInt(i[1],10),s=parseInt(i[2],10),a!==1&&Qt(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&K5(e,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:o(function(e,r,n){var i,a;n.length!==2&&Qt(e,"TAG directive accepts exactly two arguments"),i=n[0],a=n[1],xZ.test(i)||Qt(e,"ill-formed tag handle (first argument) of the TAG directive"),Kh.call(e.tagMap,i)&&Qt(e,'there is a previously declared suffix for "'+i+'" tag handle'),bZ.test(a)||Qt(e,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{Qt(e,"tag prefix is malformed: "+a)}e.tagMap[i]=a},"handleTagDirective")};o(jh,"captureSegment");o(tZ,"mergeMappings");o(Tm,"storeMappingPair");o(Z9,"readLineBreak");o(Di,"skipSeparationSpace");o(J5,"testDocumentSeparator");o(J9,"writeFoldedLines");o(L8e,"readPlainScalar");o(D8e,"readSingleQuotedScalar");o(N8e,"readDoubleQuotedScalar");o(R8e,"readFlowCollection");o(M8e,"readBlockScalar");o(rZ,"readBlockSequence");o(I8e,"readBlockMapping");o(O8e,"readTagProperty");o(P8e,"readAnchorProperty");o(B8e,"readAlias");o(km,"composeNode");o(F8e,"readDocument");o(EZ,"loadDocuments");o(z8e,"loadAll$1");o(G8e,"load$1");$8e=z8e,V8e=G8e,SZ={loadAll:$8e,load:V8e},CZ=Object.prototype.toString,AZ=Object.prototype.hasOwnProperty,eL=65279,U8e=9,Pv=10,H8e=13,W8e=32,Y8e=33,q8e=34,q9=35,X8e=37,j8e=38,K8e=39,Q8e=42,_Z=44,Z8e=45,Q5=58,J8e=61,e_e=62,t_e=63,r_e=64,LZ=91,DZ=93,n_e=96,NZ=123,i_e=124,RZ=125,Fa={};Fa[0]="\\0";Fa[7]="\\a";Fa[8]="\\b";Fa[9]="\\t";Fa[10]="\\n";Fa[11]="\\v";Fa[12]="\\f";Fa[13]="\\r";Fa[27]="\\e";Fa[34]='\\"';Fa[92]="\\\\";Fa[133]="\\N";Fa[160]="\\_";Fa[8232]="\\L";Fa[8233]="\\P";a_e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],s_e=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;o(o_e,"compileStyleMap");o(l_e,"encodeHex");c_e=1,Bv=2;o(u_e,"State");o(nZ,"indentString");o(X9,"generateNextLine");o(h_e,"testImplicitResolving");o(Z5,"isWhitespace");o(Fv,"isPrintable");o(iZ,"isNsCharOrWhitespace");o(aZ,"isPlainSafe");o(f_e,"isPlainSafeFirst");o(d_e,"isPlainSafeLast");o(Iv,"codePointAt");o(MZ,"needIndentIndicator");IZ=1,j9=2,OZ=3,PZ=4,bm=5;o(p_e,"chooseScalarStyle");o(m_e,"writeScalar");o(sZ,"blockHeader");o(oZ,"dropEndingNewline");o(g_e,"foldString");o(lZ,"foldLine");o(y_e,"escapeString");o(v_e,"writeFlowSequence");o(cZ,"writeBlockSequence");o(x_e,"writeFlowMapping");o(b_e,"writeBlockMapping");o(uZ,"detectType");o(Pu,"writeNode");o(w_e,"getDuplicateReferences");o(K9,"inspectNode");o(T_e,"dump$1");k_e=T_e,E_e={dump:k_e};o(tL,"renamed");Em=dZ,Sm=SZ.load,PDt=SZ.loadAll,BDt=E_e.dump,FDt=tL("safeLoad","load"),zDt=tL("safeLoadAll","loadAll"),GDt=tL("safeDump","dump")});function iL(t){let e=[];for(let r of t){let n=Gv.get(r);n?.styles&&(e=[...e,...n.styles??[]].map(i=>i.trim())),n?.textStyles&&(e=[...e,...n.textStyles??[]].map(i=>i.trim()))}return e}var S_e,BZ,Cm,Qh,Os,Gv,Bu,aL,sL,tw,nL,Yo,rw,nw,iw,aw,C_e,A_e,__e,L_e,D_e,N_e,R_e,oL,M_e,I_e,O_e,FZ,P_e,B_e,lL,zZ,GZ,F_e,$Z,z_e,G_e,$_e,V_e,U_e,zv,VZ,UZ,H_e,W_e,HZ,Y_e,q_e,X_e,j_e,K_e,WZ,YZ,Q_e,Z_e,J_e,e9e,t9e,r9e,sw,cL=M(()=>{"use strict";pr();hr();Vt();fr();V9();ut();ew();Ai();S_e="flowchart-",BZ=0,Cm=pe(),Qh=new Map,Os=[],Gv=new Map,Bu=[],aL=new Map,sL=new Map,tw=0,nL=!0,nw=[],iw=o(t=>qe.sanitizeText(t,Cm),"sanitizeText"),aw=o(function(t){for(let e of Qh.values())if(e.id===t)return e.domId;return t},"lookUpDomId"),C_e=o(function(t,e,r,n,i,a,s={},l){if(!t||t.trim().length===0)return;let u,h=Qh.get(t);if(h===void 0&&(h={id:t,labelType:"text",domId:S_e+t+"-"+BZ,styles:[],classes:[]},Qh.set(t,h)),BZ++,e!==void 0?(Cm=pe(),u=iw(e.text.trim()),h.labelType=e.type,u.startsWith('"')&&u.endsWith('"')&&(u=u.substring(1,u.length-1)),h.text=u):h.text===void 0&&(h.text=t),r!==void 0&&(h.type=r),n?.forEach(function(f){h.styles.push(f)}),i?.forEach(function(f){h.classes.push(f)}),a!==void 0&&(h.dir=a),h.props===void 0?h.props=s:s!==void 0&&Object.assign(h.props,s),l!==void 0){let f;l.includes(` +`)?f=l+` +`:f=`{ +`+l+` +}`;let d=Sm(f,{schema:Em});if(d.shape){if(d.shape!==d.shape.toLowerCase()||d.shape.includes("_"))throw new Error(`No such shape: ${d.shape}. Shape names should be lowercase.`);if(!jQ(d.shape))throw new Error(`No such shape: ${d.shape}.`);h.type=d?.shape}d?.label&&(h.text=d?.label),d?.icon&&(h.icon=d?.icon,!d.label?.trim()&&h.text===t&&(h.text="")),d?.form&&(h.form=d?.form),d?.pos&&(h.pos=d?.pos),d?.img&&(h.img=d?.img,!d.label?.trim()&&h.text===t&&(h.text="")),d?.constraint&&(h.constraint=d.constraint),d.w&&(h.assetWidth=Number(d.w)),d.h&&(h.assetHeight=Number(d.h))}},"addVertex"),A_e=o(function(t,e,r){let a={start:t,end:e,type:void 0,text:"",labelType:"text"};Y.info("abc78 Got edge...",a);let s=r.text;if(s!==void 0&&(a.text=iw(s.text.trim()),a.text.startsWith('"')&&a.text.endsWith('"')&&(a.text=a.text.substring(1,a.text.length-1)),a.labelType=s.type),r!==void 0&&(a.type=r.type,a.stroke=r.stroke,a.length=r.length>10?10:r.length),Os.length<(Cm.maxEdges??500))Y.info("Pushing edge..."),Os.push(a);else throw new Error(`Edge limit exceeded. ${Os.length} edges found, but the limit is ${Cm.maxEdges}. + +Initialize mermaid with maxEdges set to a higher number to allow more edges. +You cannot set this config via configuration inside the diagram as it is a secure config. +You have to call mermaid.initialize.`)},"addSingleLink"),__e=o(function(t,e,r){Y.info("addLink",t,e,r);for(let n of t)for(let i of e)A_e(n,i,r)},"addLink"),L_e=o(function(t,e){t.forEach(function(r){r==="default"?Os.defaultInterpolate=e:Os[r].interpolate=e})},"updateLinkInterpolate"),D_e=o(function(t,e){t.forEach(function(r){if(typeof r=="number"&&r>=Os.length)throw new Error(`The index ${r} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${Os.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);r==="default"?Os.defaultStyle=e:(Os[r].style=e,(Os[r]?.style?.length??0)>0&&!Os[r]?.style?.some(n=>n?.startsWith("fill"))&&Os[r]?.style?.push("fill:none"))})},"updateLink"),N_e=o(function(t,e){t.split(",").forEach(function(r){let n=Gv.get(r);n===void 0&&(n={id:r,styles:[],textStyles:[]},Gv.set(r,n)),e?.forEach(function(i){if(/color/.exec(i)){let a=i.replace("fill","bgFill");n.textStyles.push(a)}n.styles.push(i)})})},"addClass"),R_e=o(function(t){Yo=t,/.*/.exec(Yo)&&(Yo="LR"),/.*v/.exec(Yo)&&(Yo="TB"),Yo==="TD"&&(Yo="TB")},"setDirection"),oL=o(function(t,e){for(let r of t.split(",")){let n=Qh.get(r);n&&n.classes.push(e);let i=aL.get(r);i&&i.classes.push(e)}},"setClass"),M_e=o(function(t,e){if(e!==void 0){e=iw(e);for(let r of t.split(","))sL.set(rw==="gen-1"?aw(r):r,e)}},"setTooltip"),I_e=o(function(t,e,r){let n=aw(t);if(pe().securityLevel!=="loose"||e===void 0)return;let i=[];if(typeof r=="string"){i=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let s=0;s")),i.classed("hover",!0)}).on("mouseout",function(){e.transition().duration(500).style("opacity",0),Ve(this).classed("hover",!1)})},"setupToolTips");nw.push($Z);z_e=o(function(t="gen-1"){Qh=new Map,Gv=new Map,Os=[],nw=[$Z],Bu=[],aL=new Map,tw=0,sL=new Map,nL=!0,rw=t,Cm=pe(),Lr()},"clear"),G_e=o(t=>{rw=t||"gen-2"},"setGen"),$_e=o(function(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"},"defaultStyle"),V_e=o(function(t,e,r){let n=t.text.trim(),i=r.text;t===r&&/\s/.exec(r.text)&&(n=void 0);function a(h){let f={boolean:{},number:{},string:{}},d=[],p;return{nodeList:h.filter(function(g){let y=typeof g;return g.stmt&&g.stmt==="dir"?(p=g.value,!1):g.trim()===""?!1:y in f?f[y].hasOwnProperty(g)?!1:f[y][g]=!0:d.includes(g)?!1:d.push(g)}),dir:p}}o(a,"uniq");let{nodeList:s,dir:l}=a(e.flat());if(rw==="gen-1")for(let h=0;h2e3)return{result:!1,count:0};if(VZ[zv]=e,Bu[e].id===t)return{result:!0,count:0};let n=0,i=1;for(;n=0){let s=UZ(t,a);if(s.result)return{result:!0,count:i+s.count};i=i+s.count}n=n+1}return{result:!1,count:i}},"indexNodes2"),H_e=o(function(t){return VZ[t]},"getDepthFirstPos"),W_e=o(function(){zv=-1,Bu.length>0&&UZ("none",Bu.length-1)},"indexNodes"),HZ=o(function(){return Bu},"getSubGraphs"),Y_e=o(()=>nL?(nL=!1,!0):!1,"firstGraph"),q_e=o(t=>{let e=t.trim(),r="arrow_open";switch(e[0]){case"<":r="arrow_point",e=e.slice(1);break;case"x":r="arrow_cross",e=e.slice(1);break;case"o":r="arrow_circle",e=e.slice(1);break}let n="normal";return e.includes("=")&&(n="thick"),e.includes(".")&&(n="dotted"),{type:r,stroke:n}},"destructStartLink"),X_e=o((t,e)=>{let r=e.length,n=0;for(let i=0;i{let e=t.trim(),r=e.slice(0,-1),n="arrow_open";switch(e.slice(-1)){case"x":n="arrow_cross",e.startsWith("x")&&(n="double_"+n,r=r.slice(1));break;case">":n="arrow_point",e.startsWith("<")&&(n="double_"+n,r=r.slice(1));break;case"o":n="arrow_circle",e.startsWith("o")&&(n="double_"+n,r=r.slice(1));break}let i="normal",a=r.length-1;r.startsWith("=")&&(i="thick"),r.startsWith("~")&&(i="invisible");let s=X_e(".",r);return s&&(i="dotted",a=s),{type:n,stroke:i,length:a}},"destructEndLink"),K_e=o((t,e)=>{let r=j_e(t),n;if(e){if(n=q_e(e),n.stroke!==r.stroke)return{type:"INVALID",stroke:"INVALID"};if(n.type==="arrow_open")n.type=r.type;else{if(n.type!==r.type)return{type:"INVALID",stroke:"INVALID"};n.type="double_"+n.type}return n.type==="double_arrow"&&(n.type="double_arrow_point"),n.length=r.length,n}return r},"destructLink"),WZ=o((t,e)=>{for(let r of t)if(r.nodes.includes(e))return!0;return!1},"exists"),YZ=o((t,e)=>{let r=[];return t.nodes.forEach((n,i)=>{WZ(e,n)||r.push(t.nodes[i])}),{nodes:r}},"makeUniq"),Q_e={firstGraph:Y_e},Z_e=o(t=>{if(t.img)return"imageSquare";if(t.icon)return t.form==="circle"?"iconCircle":t.form==="square"?"iconSquare":t.form==="rounded"?"iconRounded":"icon";switch(t.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return t.type}},"getTypeFromVertex"),J_e=o((t,e)=>t.find(r=>r.id===e),"findNode"),e9e=o(t=>{let e="none",r="arrow_point";switch(t){case"arrow_point":case"arrow_circle":case"arrow_cross":r=t;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":e=t.replace("double_",""),r=e;break}return{arrowTypeStart:e,arrowTypeEnd:r}},"destructEdgeType"),t9e=o((t,e,r,n,i,a)=>{let s=r.get(t.id),l=n.get(t.id)??!1,u=J_e(e,t.id);if(u)u.cssStyles=t.styles,u.cssCompiledStyles=iL(t.classes),u.cssClasses=t.classes.join(" ");else{let h={id:t.id,label:t.text,labelStyle:"",parentId:s,padding:i.flowchart?.padding||8,cssStyles:t.styles,cssCompiledStyles:iL(["default","node",...t.classes]),cssClasses:"default "+t.classes.join(" "),dir:t.dir,domId:t.domId,look:a,link:t.link,linkTarget:t.linkTarget,tooltip:FZ(t.id),icon:t.icon,pos:t.pos,img:t.img,assetWidth:t.assetWidth,assetHeight:t.assetHeight,constraint:t.constraint};l?e.push({...h,isGroup:!0,shape:"rect"}):e.push({...h,isGroup:!1,shape:Z_e(t)})}},"addNodeFromVertex");o(iL,"getCompiledStyles");r9e=o(()=>{let t=pe(),e=[],r=[],n=HZ(),i=new Map,a=new Map;for(let u=n.length-1;u>=0;u--){let h=n[u];h.nodes.length>0&&a.set(h.id,!0);for(let f of h.nodes)i.set(f,h.id)}for(let u=n.length-1;u>=0;u--){let h=n[u];e.push({id:h.id,label:h.title,labelStyle:"",parentId:i.get(h.id),padding:8,cssCompiledStyles:iL(h.classes),cssClasses:h.classes.join(" "),shape:"rect",dir:h.dir,isGroup:!0,look:t.look})}zZ().forEach(u=>{t9e(u,e,i,a,t,t.look||"classic")});let l=GZ();return l.forEach((u,h)=>{let{arrowTypeStart:f,arrowTypeEnd:d}=e9e(u.type),p=[...l.defaultStyle??[]];u.style&&p.push(...u.style);let m={id:C5(u.start,u.end,{counter:h,prefix:"L"}),start:u.start,end:u.end,type:u.type??"normal",label:u.text,labelpos:"c",thickness:u.stroke,minlen:u.length,classes:u?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:u?.stroke==="invisible"?"none":f,arrowTypeEnd:u?.stroke==="invisible"?"none":d,arrowheadStyle:"fill: #333",labelStyle:p,style:p,pattern:u.stroke,look:t.look};r.push(m)}),{nodes:e,edges:r,other:{},config:t}},"getData"),sw={defaultConfig:o(()=>B4.flowchart,"defaultConfig"),setAccTitle:Mr,getAccTitle:Br,getAccDescription:zr,getData:r9e,setAccDescription:Fr,addVertex:C_e,lookUpDomId:aw,addLink:__e,updateLinkInterpolate:L_e,updateLink:D_e,addClass:N_e,setDirection:R_e,setClass:oL,setTooltip:M_e,getTooltip:FZ,setClickEvent:P_e,setLink:O_e,bindFunctions:B_e,getDirection:lL,getVertices:zZ,getEdges:GZ,getClasses:F_e,clear:z_e,setGen:G_e,defaultStyle:$_e,addSubGraph:V_e,getDepthFirstPos:H_e,indexNodes:W_e,getSubGraphs:HZ,destructLink:K_e,lex:Q_e,exists:WZ,makeUniq:YZ,setDiagramTitle:cn,getDiagramTitle:Jr}});var Am,ow=M(()=>{"use strict";pr();Am=o((t,e)=>{let r;return e==="sandbox"&&(r=Ve("#i"+t)),(e==="sandbox"?Ve(r.nodes()[0].contentDocument.body):Ve("body")).select(`[id="${t}"]`)},"getDiagramElement")});var Fu,$v=M(()=>{"use strict";Fu=o(({flowchart:t})=>{let e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0,n=e+r;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:n}},"getSubGraphTitleMargins")});var qZ,n9e,i9e,a9e,s9e,o9e,l9e,XZ,_m,jZ,lw=M(()=>{"use strict";Vt();fr();ut();$v();pr();jt();Pl();k9();Y5();Xh();Xt();qZ=o(async(t,e)=>{Y.info("Creating subgraph rect for ",e.id,e);let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Ze(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=xr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await Li(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0}),y=g.getBBox();if(xr(r.flowchart.htmlLabels)){let L=g.children[0],S=Ve(g);y=L.getBoundingClientRect(),S.attr("width",y.width),S.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,w=e.y-x/2;Y.trace("Data ",e,JSON.stringify(e));let _;if(e.look==="handDrawn"){let L=Xe.svg(d),S=Ke(e,{roughness:.7,fill:a,stroke:s,fillWeight:3,seed:i}),A=L.path(Pa(b,w,v,x,0),S);_=d.insert(()=>(Y.debug("Rough node insert CXC",A),A),":first-child"),_.select("path:nth-child(2)").attr("style",h.join(";")),_.select("path").attr("style",f.join(";").replace("fill","stroke"))}else _=d.insert("rect",":first-child"),_.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",w).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:T}=Fu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+T})`),l){let L=m.select("span");L&&L.attr("style",l)}let E=_.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=y.height-e.padding/2,e.intersect=function(L){return Hh(e,L)},{cluster:d,labelBBox:y}},"rect"),n9e=o((t,e)=>{let r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");let s=n.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(l){return Hh(e,l)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),i9e=o(async(t,e)=>{let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:s,compositeTitleBackground:l,nodeBorder:u}=n,h=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),f=h.insert("g",":first-child"),d=h.insert("g").attr("class","cluster-label"),p=h.append("rect"),m=d.node().appendChild(await Cc(e.label,e.labelStyle,void 0,!0)),g=m.getBBox();if(xr(r.flowchart.htmlLabels)){let A=m.children[0],I=Ve(m);g=A.getBoundingClientRect(),I.attr("width",g.width),I.attr("height",g.height)}let y=0*e.padding,v=y/2,x=(e.width<=g.width+e.padding?g.width+e.padding:e.width)+y;e.width<=g.width+e.padding?e.diff=(x-e.width)/2-e.padding:e.diff=-e.padding;let b=e.height+y,w=e.height+y-g.height-6,_=e.x-x/2,T=e.y-b/2;e.width=x;let E=e.y-e.height/2-v+g.height+2,L;if(e.look==="handDrawn"){let A=e.cssClasses.includes("statediagram-cluster-alt"),I=Xe.svg(h),D=e.rx||e.ry?I.path(Pa(_,T,x,b,10),{roughness:.7,fill:l,fillStyle:"solid",stroke:u,seed:i}):I.rectangle(_,T,x,b,{seed:i});L=h.insert(()=>D,":first-child");let k=I.rectangle(_,E,x,w,{fill:A?a:s,fillStyle:A?"hachure":"solid",stroke:u,seed:i});L=h.insert(()=>D,":first-child"),p=h.insert(()=>k)}else L=f.insert("rect",":first-child"),L.attr("class","outer").attr("x",_).attr("y",T).attr("width",x).attr("height",b).attr("data-look",e.look),p.attr("class","inner").attr("x",_).attr("y",E).attr("width",x).attr("height",w);d.attr("transform",`translate(${e.x-g.width/2}, ${T+1-(xr(r.flowchart.htmlLabels)?0:3)})`);let S=L.node().getBBox();return e.height=S.height,e.offsetX=0,e.offsetY=g.height-e.padding/2,e.labelBBox=g,e.intersect=function(A){return Hh(e,A)},{cluster:h,labelBBox:g}},"roundedWithTitle"),a9e=o(async(t,e)=>{Y.info("Creating subgraph rect for ",e.id,e);let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Ze(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=xr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await Li(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0,width:e.width}),y=g.getBBox();if(xr(r.flowchart.htmlLabels)){let L=g.children[0],S=Ve(g);y=L.getBoundingClientRect(),S.attr("width",y.width),S.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,w=e.y-x/2;Y.trace("Data ",e,JSON.stringify(e));let _;if(e.look==="handDrawn"){let L=Xe.svg(d),S=Ke(e,{roughness:.7,fill:a,stroke:s,fillWeight:4,seed:i}),A=L.path(Pa(b,w,v,x,e.rx),S);_=d.insert(()=>(Y.debug("Rough node insert CXC",A),A),":first-child"),_.select("path:nth-child(2)").attr("style",h.join(";")),_.select("path").attr("style",f.join(";").replace("fill","stroke"))}else _=d.insert("rect",":first-child"),_.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",w).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:T}=Fu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+T})`),l){let L=m.select("span");L&&L.attr("style",l)}let E=_.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=y.height-e.padding/2,e.intersect=function(L){return Hh(e,L)},{cluster:d,labelBBox:y}},"kanbanSection"),s9e=o((t,e)=>{let r=pe(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,s=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),l=s.insert("g",":first-child"),u=0*e.padding,h=e.width+u;e.diff=-e.padding;let f=e.height+u,d=e.x-h/2,p=e.y-f/2;e.width=h;let m;if(e.look==="handDrawn"){let v=Xe.svg(s).rectangle(d,p,h,f,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});m=s.insert(()=>v,":first-child")}else m=l.insert("rect",":first-child"),m.attr("class","divider").attr("x",d).attr("y",p).attr("width",h).attr("height",f).attr("data-look",e.look);let g=m.node().getBBox();return e.height=g.height,e.offsetX=0,e.offsetY=0,e.intersect=function(y){return Hh(e,y)},{cluster:s,labelBBox:{}}},"divider"),o9e=qZ,l9e={rect:qZ,squareRect:o9e,roundedWithTitle:i9e,noteGroup:n9e,divider:s9e,kanbanSection:a9e},XZ=new Map,_m=o(async(t,e)=>{let r=e.shape||"rect",n=await l9e[r](t,e);return XZ.set(e.id,n),n},"insertCluster"),jZ=o(()=>{XZ=new Map},"clear")});function cw(t,e){if(t===void 0||e===void 0)return{angle:0,deltaX:0,deltaY:0};t=Wn(t),e=Wn(e);let[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,l=a-n;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}var qo,Wn,uw,uL=M(()=>{"use strict";qo={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:4};o(cw,"calculateDeltaAndAngle");Wn=o(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),uw=o(t=>({x:o(function(e,r,n){let i=0,a=Wn(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(qo,t.arrowTypeEnd)){let{angle:m,deltaX:g}=cw(n[n.length-1],n[n.length-2]);i=qo[t.arrowTypeEnd]*Math.cos(m)*(g>=0?1:-1)}let s=Math.abs(Wn(e).x-Wn(n[n.length-1]).x),l=Math.abs(Wn(e).y-Wn(n[n.length-1]).y),u=Math.abs(Wn(e).x-Wn(n[0]).x),h=Math.abs(Wn(e).y-Wn(n[0]).y),f=qo[t.arrowTypeStart],d=qo[t.arrowTypeEnd],p=1;if(s0&&l0&&h=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(qo,t.arrowTypeEnd)){let{angle:m,deltaY:g}=cw(n[n.length-1],n[n.length-2]);i=qo[t.arrowTypeEnd]*Math.abs(Math.sin(m))*(g>=0?1:-1)}let s=Math.abs(Wn(e).y-Wn(n[n.length-1]).y),l=Math.abs(Wn(e).x-Wn(n[n.length-1]).x),u=Math.abs(Wn(e).y-Wn(n[0]).y),h=Math.abs(Wn(e).x-Wn(n[0]).x),f=qo[t.arrowTypeStart],d=qo[t.arrowTypeEnd],p=1;if(s0&&l0&&h{"use strict";ut();QZ=o((t,e,r,n,i)=>{e.arrowTypeStart&&KZ(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&KZ(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),c9e={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},KZ=o((t,e,r,n,i,a)=>{let s=c9e[r];if(!s){Y.warn(`Unknown arrow type: ${r}`);return}let l=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${l})`)},"addEdgeMarker")});function hw(t,e){pe().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}function f9e(t){let e=[],r=[];for(let n=1;n5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===s.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-s.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}var fw,ya,tJ,Vv,dw,pw,u9e,h9e,JZ,eJ,d9e,mw,hL=M(()=>{"use strict";Vt();fr();ut();Pl();hr();uL();$v();pr();jt();Y5();ZZ();fw=new Map,ya=new Map,tJ=o(()=>{fw.clear(),ya.clear()},"clear"),Vv=o(t=>t?t.reduce((r,n)=>r+";"+n,""):"","getLabelStyles"),dw=o(async(t,e)=>{let r=xr(pe().flowchart.htmlLabels),n=await Li(t,e.label,{style:Vv(e.labelStyle),useHtmlLabels:r,addSvgBackground:!0,isNode:!1});Y.info("abc82",e,e.labelType);let i=t.insert("g").attr("class","edgeLabel"),a=i.insert("g").attr("class","label");a.node().appendChild(n);let s=n.getBBox();if(r){let u=n.children[0],h=Ve(n);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}a.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),fw.set(e.id,i),e.width=s.width,e.height=s.height;let l;if(e.startLabelLeft){let u=await Cc(e.startLabelLeft,Vv(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),ya.get(e.id)||ya.set(e.id,{}),ya.get(e.id).startLeft=h,hw(l,e.startLabelLeft)}if(e.startLabelRight){let u=await Cc(e.startLabelRight,Vv(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=h.node().appendChild(u),f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),ya.get(e.id)||ya.set(e.id,{}),ya.get(e.id).startRight=h,hw(l,e.startLabelRight)}if(e.endLabelLeft){let u=await Cc(e.endLabelLeft,Vv(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),ya.get(e.id)||ya.set(e.id,{}),ya.get(e.id).endLeft=h,hw(l,e.endLabelLeft)}if(e.endLabelRight){let u=await Cc(e.endLabelRight,Vv(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),ya.get(e.id)||ya.set(e.id,{}),ya.get(e.id).endRight=h,hw(l,e.endLabelRight)}return n},"insertEdgeLabel");o(hw,"setTerminalWidth");pw=o((t,e)=>{Y.debug("Moving label abc88 ",t.id,t.label,fw.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=pe(),{subGraphTitleTotalMargin:i}=Fu(n);if(t.label){let a=fw.get(t.id),s=t.x,l=t.y;if(r){let u=Ut.calcLabelPosition(r);Y.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=ya.get(t.id).startLeft,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=ya.get(t.id).startRight,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=ya.get(t.id).endLeft,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=ya.get(t.id).endRight,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),u9e=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),h9e=o((t,e,r)=>{Y.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{Y.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(Y.info("abc88 checking point",a,e),!u9e(e,a)&&!i){let s=h9e(e,n,a);Y.debug("abc88 inside",a,n,s),Y.debug("abc88 intersection",s,e);let l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)?Y.warn("abc88 no intersect",s,r):r.push(s),i=!0}else Y.warn("abc88 outside",a,n),n=a,i||r.push(a)}),Y.debug("returning points",r),r},"cutPathAtIntersect");o(f9e,"extractCornerPoints");eJ=o(function(t,e,r){let n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),s=r/a;return{x:e.x-s*n,y:e.y-s*i}},"findAdjacentPoint"),d9e=o(function(t){let{cornerPointPositions:e}=f9e(t),r=[];for(let n=0;n10&&Math.abs(a.y-i.y)>=10){Y.debug("Corner point fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));let m=5;s.x===l.x?p={x:h<0?l.x-m+d:l.x+m-d,y:f<0?l.y-d:l.y+d}:p={x:h<0?l.x-d:l.x+d,y:f<0?l.y-m+d:l.y+m-d}}else Y.debug("Corner point skipping fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));r.push(p,u)}else r.push(t[n]);return r},"fixCorners"),mw=o(function(t,e,r,n,i,a,s){let{handDrawnSeed:l}=pe(),u=e.points,h=!1,f=i;var d=a;d.intersect&&f.intersect&&(u=u.slice(1,e.points.length-1),u.unshift(f.intersect(u[0])),Y.debug("Last point APA12",e.start,"-->",e.end,u[u.length-1],d,d.intersect(u[u.length-1])),u.push(d.intersect(u[u.length-1]))),e.toCluster&&(Y.info("to cluster abc88",r.get(e.toCluster)),u=JZ(e.points,r.get(e.toCluster).node),h=!0),e.fromCluster&&(Y.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(u,null,2)),u=JZ(u.reverse(),r.get(e.fromCluster).node).reverse(),h=!0);let p=u.filter(L=>!Number.isNaN(L.y));p=d9e(p);let m=Po;e.curve&&(m=e.curve);let{x:g,y}=uw(e),v=ns().x(g).y(y).curve(m),x;switch(e.thickness){case"normal":x="edge-thickness-normal";break;case"thick":x="edge-thickness-thick";break;case"invisible":x="edge-thickness-invisible";break;default:x="edge-thickness-normal"}switch(e.pattern){case"solid":x+=" edge-pattern-solid";break;case"dotted":x+=" edge-pattern-dotted";break;case"dashed":x+=" edge-pattern-dashed";break;default:x+=" edge-pattern-solid"}let b,w=v(p),_=Array.isArray(e.style)?e.style:[e.style];if(e.look==="handDrawn"){let L=Xe.svg(t);Object.assign([],p);let S=L.path(w,{roughness:.3,seed:l});x+=" transition",b=Ve(S).select("path").attr("id",e.id).attr("class"," "+x+(e.classes?" "+e.classes:"")).attr("style",_?_.reduce((I,D)=>I+";"+D,""):"");let A=b.attr("d");b.attr("d",A),t.node().appendChild(b.node())}else b=t.append("path").attr("d",w).attr("id",e.id).attr("class"," "+x+(e.classes?" "+e.classes:"")).attr("style",_?_.reduce((L,S)=>L+";"+S,""):"");let T="";(pe().flowchart.arrowMarkerAbsolute||pe().state.arrowMarkerAbsolute)&&(T=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,T=T.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),Y.info("arrowTypeStart",e.arrowTypeStart),Y.info("arrowTypeEnd",e.arrowTypeEnd),QZ(b,e,T,s,n);let E={};return h&&(E.updatedPath=u),E.originalPath=e.points,E},"insertEdge")});var p9e,m9e,g9e,y9e,v9e,x9e,b9e,w9e,T9e,k9e,E9e,gw,fL=M(()=>{"use strict";ut();p9e=o((t,e,r,n)=>{e.forEach(i=>{E9e[i](t,r,n)})},"insertMarkers"),m9e=o((t,e,r)=>{Y.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),g9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),y9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),v9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),x9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),b9e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),w9e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),T9e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),k9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),E9e={extension:m9e,composition:g9e,aggregation:y9e,dependency:v9e,lollipop:x9e,point:b9e,circle:w9e,cross:T9e,barb:k9e},gw=p9e});async function Lm(t,e,r){let n,i;e.shape==="rect"&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");let a=e.shape?$9[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let s;r.config.securityLevel==="sandbox"?s="_top":e.linkTarget&&(s=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",s??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),yw.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}var yw,rJ,nJ,Uv,vw=M(()=>{"use strict";ut();V9();yw=new Map;o(Lm,"insertNode");rJ=o((t,e)=>{yw.set(e.id,t)},"setNodeElem"),nJ=o(()=>{yw.clear()},"clear"),Uv=o(t=>{let e=yw.get(t.id);Y.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});var iJ,aJ=M(()=>{"use strict";Za();fr();ut();lw();hL();fL();vw();Ot();hr();iJ={common:qe,getConfig:Cr,insertCluster:_m,insertEdge:mw,insertEdgeLabel:dw,insertMarkers:gw,insertNode:Lm,interpolateToCurve:J_,labelHelper:st,log:Y,positionEdgeLabel:pw}});function C9e(t){return typeof t=="symbol"||ei(t)&&ga(t)==S9e}var S9e,co,zd=M(()=>{"use strict";Lu();zo();S9e="[object Symbol]";o(C9e,"isSymbol");co=C9e});function A9e(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r{"use strict";o(A9e,"arrayMap");Ps=A9e});function lJ(t){if(typeof t=="string")return t;if(Dt(t))return Ps(t,lJ)+"";if(co(t))return oJ?oJ.call(t):"";var e=t+"";return e=="0"&&1/t==-_9e?"-0":e}var _9e,sJ,oJ,cJ,uJ=M(()=>{"use strict";Cd();Gd();Hn();zd();_9e=1/0,sJ=ia?ia.prototype:void 0,oJ=sJ?sJ.toString:void 0;o(lJ,"baseToString");cJ=lJ});function D9e(t){for(var e=t.length;e--&&L9e.test(t.charAt(e)););return e}var L9e,hJ,fJ=M(()=>{"use strict";L9e=/\s/;o(D9e,"trimmedEndIndex");hJ=D9e});function R9e(t){return t&&t.slice(0,hJ(t)+1).replace(N9e,"")}var N9e,dJ,pJ=M(()=>{"use strict";fJ();N9e=/^\s+/;o(R9e,"baseTrim");dJ=R9e});function B9e(t){if(typeof t=="number")return t;if(co(t))return mJ;if(xn(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=xn(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=dJ(t);var r=I9e.test(t);return r||O9e.test(t)?P9e(t.slice(2),r?2:8):M9e.test(t)?mJ:+t}var mJ,M9e,I9e,O9e,P9e,gJ,yJ=M(()=>{"use strict";pJ();io();zd();mJ=NaN,M9e=/^[-+]0x[0-9a-f]+$/i,I9e=/^0b[01]+$/i,O9e=/^0o[0-7]+$/i,P9e=parseInt;o(B9e,"toNumber");gJ=B9e});function z9e(t){if(!t)return t===0?t:0;if(t=gJ(t),t===vJ||t===-vJ){var e=t<0?-1:1;return e*F9e}return t===t?t:0}var vJ,F9e,Dm,dL=M(()=>{"use strict";yJ();vJ=1/0,F9e=17976931348623157e292;o(z9e,"toFinite");Dm=z9e});function G9e(t){var e=Dm(t),r=e%1;return e===e?r?e-r:e:0}var _c,Nm=M(()=>{"use strict";dL();o(G9e,"toInteger");_c=G9e});var $9e,xw,xJ=M(()=>{"use strict";Oh();Bo();$9e=As(oi,"WeakMap"),xw=$9e});function V9e(){}var ti,pL=M(()=>{"use strict";o(V9e,"noop");ti=V9e});function U9e(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(U9e,"arrayEach");bw=U9e});function H9e(t,e,r,n){for(var i=t.length,a=r+(n?1:-1);n?a--:++a{"use strict";o(H9e,"baseFindIndex");ww=H9e});function W9e(t){return t!==t}var bJ,wJ=M(()=>{"use strict";o(W9e,"baseIsNaN");bJ=W9e});function Y9e(t,e,r){for(var n=r-1,i=t.length;++n{"use strict";o(Y9e,"strictIndexOf");TJ=Y9e});function q9e(t,e,r){return e===e?TJ(t,e,r):ww(t,bJ,r)}var Rm,Tw=M(()=>{"use strict";gL();wJ();kJ();o(q9e,"baseIndexOf");Rm=q9e});function X9e(t,e){var r=t==null?0:t.length;return!!r&&Rm(t,e,0)>-1}var kw,yL=M(()=>{"use strict";Tw();o(X9e,"arrayIncludes");kw=X9e});var j9e,EJ,SJ=M(()=>{"use strict";G_();j9e=m5(Object.keys,Object),EJ=j9e});function Z9e(t){if(!Tc(t))return EJ(t);var e=[];for(var r in Object(t))Q9e.call(t,r)&&r!="constructor"&&e.push(r);return e}var K9e,Q9e,Mm,Ew=M(()=>{"use strict";cm();SJ();K9e=Object.prototype,Q9e=K9e.hasOwnProperty;o(Z9e,"baseKeys");Mm=Z9e});function J9e(t){return li(t)?b5(t):Mm(t)}var Gr,Lc=M(()=>{"use strict";W_();Ew();Go();o(J9e,"keys");Gr=J9e});var eLe,tLe,rLe,va,CJ=M(()=>{"use strict";dm();Nd();j_();Go();cm();Lc();eLe=Object.prototype,tLe=eLe.hasOwnProperty,rLe=k5(function(t,e){if(Tc(e)||li(e)){Uo(e,Gr(e),t);return}for(var r in e)tLe.call(e,r)&&kc(t,r,e[r])}),va=rLe});function aLe(t,e){if(Dt(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||co(t)?!0:iLe.test(t)||!nLe.test(t)||e!=null&&t in Object(e)}var nLe,iLe,Im,Sw=M(()=>{"use strict";Hn();zd();nLe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,iLe=/^\w*$/;o(aLe,"isKey");Im=aLe});function oLe(t){var e=tm(t,function(n){return r.size===sLe&&r.clear(),n}),r=e.cache;return e}var sLe,AJ,_J=M(()=>{"use strict";M_();sLe=500;o(oLe,"memoizeCapped");AJ=oLe});var lLe,cLe,uLe,LJ,DJ=M(()=>{"use strict";_J();lLe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,cLe=/\\(\\)?/g,uLe=AJ(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(lLe,function(r,n,i,a){e.push(i?a.replace(cLe,"$1"):n||r)}),e}),LJ=uLe});function hLe(t){return t==null?"":cJ(t)}var Cw,vL=M(()=>{"use strict";uJ();o(hLe,"toString");Cw=hLe});function fLe(t,e){return Dt(t)?t:Im(t,e)?[t]:LJ(Cw(t))}var Zh,Hv=M(()=>{"use strict";Hn();Sw();DJ();vL();o(fLe,"castPath");Zh=fLe});function pLe(t){if(typeof t=="string"||co(t))return t;var e=t+"";return e=="0"&&1/t==-dLe?"-0":e}var dLe,Dc,Om=M(()=>{"use strict";zd();dLe=1/0;o(pLe,"toKey");Dc=pLe});function mLe(t,e){e=Zh(e,t);for(var r=0,n=e.length;t!=null&&r{"use strict";Hv();Om();o(mLe,"baseGet");Jh=mLe});function gLe(t,e,r){var n=t==null?void 0:Jh(t,e);return n===void 0?r:n}var NJ,RJ=M(()=>{"use strict";Wv();o(gLe,"get");NJ=gLe});function yLe(t,e){for(var r=-1,n=e.length,i=t.length;++r{"use strict";o(yLe,"arrayPush");Pm=yLe});function vLe(t){return Dt(t)||Ml(t)||!!(MJ&&t&&t[MJ])}var MJ,IJ,OJ=M(()=>{"use strict";Cd();um();Hn();MJ=ia?ia.isConcatSpreadable:void 0;o(vLe,"isFlattenable");IJ=vLe});function PJ(t,e,r,n,i){var a=-1,s=t.length;for(r||(r=IJ),i||(i=[]);++a0&&r(l)?e>1?PJ(l,e-1,r,n,i):Pm(i,l):n||(i[i.length]=l)}return i}var Nc,Bm=M(()=>{"use strict";Aw();OJ();o(PJ,"baseFlatten");Nc=PJ});function xLe(t){var e=t==null?0:t.length;return e?Nc(t,1):[]}var Wr,_w=M(()=>{"use strict";Bm();o(xLe,"flatten");Wr=xLe});function bLe(t){return T5(w5(t,void 0,Wr),t+"")}var BJ,FJ=M(()=>{"use strict";_w();Y_();X_();o(bLe,"flatRest");BJ=bLe});function wLe(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),r=r>i?i:r,r<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(i);++n{"use strict";o(wLe,"baseSlice");Lw=wLe});function DLe(t){return LLe.test(t)}var TLe,kLe,ELe,SLe,CLe,ALe,_Le,LLe,zJ,GJ=M(()=>{"use strict";TLe="\\ud800-\\udfff",kLe="\\u0300-\\u036f",ELe="\\ufe20-\\ufe2f",SLe="\\u20d0-\\u20ff",CLe=kLe+ELe+SLe,ALe="\\ufe0e\\ufe0f",_Le="\\u200d",LLe=RegExp("["+_Le+TLe+CLe+ALe+"]");o(DLe,"hasUnicode");zJ=DLe});function NLe(t,e,r,n){var i=-1,a=t==null?0:t.length;for(n&&a&&(r=t[++i]);++i{"use strict";o(NLe,"arrayReduce");$J=NLe});function RLe(t,e){return t&&Uo(e,Gr(e),t)}var UJ,HJ=M(()=>{"use strict";Nd();Lc();o(RLe,"baseAssign");UJ=RLe});function MLe(t,e){return t&&Uo(e,_s(e),t)}var WJ,YJ=M(()=>{"use strict";Nd();Vh();o(MLe,"baseAssignIn");WJ=MLe});function ILe(t,e){for(var r=-1,n=t==null?0:t.length,i=0,a=[];++r{"use strict";o(ILe,"arrayFilter");Fm=ILe});function OLe(){return[]}var Nw,bL=M(()=>{"use strict";o(OLe,"stubArray");Nw=OLe});var PLe,BLe,qJ,FLe,zm,Rw=M(()=>{"use strict";Dw();bL();PLe=Object.prototype,BLe=PLe.propertyIsEnumerable,qJ=Object.getOwnPropertySymbols,FLe=qJ?function(t){return t==null?[]:(t=Object(t),Fm(qJ(t),function(e){return BLe.call(t,e)}))}:Nw,zm=FLe});function zLe(t,e){return Uo(t,zm(t),e)}var XJ,jJ=M(()=>{"use strict";Nd();Rw();o(zLe,"copySymbols");XJ=zLe});var GLe,$Le,Mw,wL=M(()=>{"use strict";Aw();g5();Rw();bL();GLe=Object.getOwnPropertySymbols,$Le=GLe?function(t){for(var e=[];t;)Pm(e,zm(t)),t=lm(t);return e}:Nw,Mw=$Le});function VLe(t,e){return Uo(t,Mw(t),e)}var KJ,QJ=M(()=>{"use strict";Nd();wL();o(VLe,"copySymbolsIn");KJ=VLe});function ULe(t,e,r){var n=e(t);return Dt(t)?n:Pm(n,r(t))}var Iw,TL=M(()=>{"use strict";Aw();Hn();o(ULe,"baseGetAllKeys");Iw=ULe});function HLe(t){return Iw(t,Gr,zm)}var Yv,kL=M(()=>{"use strict";TL();Rw();Lc();o(HLe,"getAllKeys");Yv=HLe});function WLe(t){return Iw(t,_s,Mw)}var Ow,EL=M(()=>{"use strict";TL();wL();Vh();o(WLe,"getAllKeysIn");Ow=WLe});var YLe,Pw,ZJ=M(()=>{"use strict";Oh();Bo();YLe=As(oi,"DataView"),Pw=YLe});var qLe,Bw,JJ=M(()=>{"use strict";Oh();Bo();qLe=As(oi,"Promise"),Bw=qLe});var XLe,ef,SL=M(()=>{"use strict";Oh();Bo();XLe=As(oi,"Set"),ef=XLe});var eee,jLe,tee,ree,nee,iee,KLe,QLe,ZLe,JLe,eDe,$d,uo,Vd=M(()=>{"use strict";ZJ();l5();JJ();SL();xJ();Lu();D_();eee="[object Map]",jLe="[object Object]",tee="[object Promise]",ree="[object Set]",nee="[object WeakMap]",iee="[object DataView]",KLe=Du(Pw),QLe=Du(Fh),ZLe=Du(Bw),JLe=Du(ef),eDe=Du(xw),$d=ga;(Pw&&$d(new Pw(new ArrayBuffer(1)))!=iee||Fh&&$d(new Fh)!=eee||Bw&&$d(Bw.resolve())!=tee||ef&&$d(new ef)!=ree||xw&&$d(new xw)!=nee)&&($d=o(function(t){var e=ga(t),r=e==jLe?t.constructor:void 0,n=r?Du(r):"";if(n)switch(n){case KLe:return iee;case QLe:return eee;case ZLe:return tee;case JLe:return ree;case eDe:return nee}return e},"getTag"));uo=$d});function nDe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&rDe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}var tDe,rDe,aee,see=M(()=>{"use strict";tDe=Object.prototype,rDe=tDe.hasOwnProperty;o(nDe,"initCloneArray");aee=nDe});function iDe(t,e){var r=e?om(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}var oee,lee=M(()=>{"use strict";f5();o(iDe,"cloneDataView");oee=iDe});function sDe(t){var e=new t.constructor(t.source,aDe.exec(t));return e.lastIndex=t.lastIndex,e}var aDe,cee,uee=M(()=>{"use strict";aDe=/\w*$/;o(sDe,"cloneRegExp");cee=sDe});function oDe(t){return fee?Object(fee.call(t)):{}}var hee,fee,dee,pee=M(()=>{"use strict";Cd();hee=ia?ia.prototype:void 0,fee=hee?hee.valueOf:void 0;o(oDe,"cloneSymbol");dee=oDe});function ADe(t,e,r){var n=t.constructor;switch(e){case gDe:return om(t);case lDe:case cDe:return new n(+t);case yDe:return oee(t,r);case vDe:case xDe:case bDe:case wDe:case TDe:case kDe:case EDe:case SDe:case CDe:return d5(t,r);case uDe:return new n;case hDe:case pDe:return new n(t);case fDe:return cee(t);case dDe:return new n;case mDe:return dee(t)}}var lDe,cDe,uDe,hDe,fDe,dDe,pDe,mDe,gDe,yDe,vDe,xDe,bDe,wDe,TDe,kDe,EDe,SDe,CDe,mee,gee=M(()=>{"use strict";f5();lee();uee();pee();F_();lDe="[object Boolean]",cDe="[object Date]",uDe="[object Map]",hDe="[object Number]",fDe="[object RegExp]",dDe="[object Set]",pDe="[object String]",mDe="[object Symbol]",gDe="[object ArrayBuffer]",yDe="[object DataView]",vDe="[object Float32Array]",xDe="[object Float64Array]",bDe="[object Int8Array]",wDe="[object Int16Array]",TDe="[object Int32Array]",kDe="[object Uint8Array]",EDe="[object Uint8ClampedArray]",SDe="[object Uint16Array]",CDe="[object Uint32Array]";o(ADe,"initCloneByTag");mee=ADe});function LDe(t){return ei(t)&&uo(t)==_De}var _De,yee,vee=M(()=>{"use strict";Vd();zo();_De="[object Map]";o(LDe,"baseIsMap");yee=LDe});var xee,DDe,bee,wee=M(()=>{"use strict";vee();Dd();vv();xee=Vo&&Vo.isMap,DDe=xee?$o(xee):yee,bee=DDe});function RDe(t){return ei(t)&&uo(t)==NDe}var NDe,Tee,kee=M(()=>{"use strict";Vd();zo();NDe="[object Set]";o(RDe,"baseIsSet");Tee=RDe});var Eee,MDe,See,Cee=M(()=>{"use strict";kee();Dd();vv();Eee=Vo&&Vo.isSet,MDe=Eee?$o(Eee):Tee,See=MDe});function Fw(t,e,r,n,i,a){var s,l=e&IDe,u=e&ODe,h=e&PDe;if(r&&(s=i?r(t,n,i,a):r(t)),s!==void 0)return s;if(!xn(t))return t;var f=Dt(t);if(f){if(s=aee(t),!l)return p5(t,s)}else{var d=uo(t),p=d==_ee||d==$De;if(Il(t))return h5(t,l);if(d==Lee||d==Aee||p&&!i){if(s=u||p?{}:y5(t),!l)return u?KJ(t,WJ(s,t)):XJ(t,UJ(s,t))}else{if(!An[d])return i?t:{};s=mee(t,d,l)}}a||(a=new bc);var m=a.get(t);if(m)return m;a.set(t,s),See(t)?t.forEach(function(v){s.add(Fw(v,e,r,v,t,a))}):bee(t)&&t.forEach(function(v,x){s.set(x,Fw(v,e,r,x,t,a))});var g=h?u?Ow:Yv:u?_s:Gr,y=f?void 0:g(t);return bw(y||t,function(v,x){y&&(x=v,v=t[x]),kc(s,x,Fw(v,e,r,x,t,a))}),s}var IDe,ODe,PDe,Aee,BDe,FDe,zDe,GDe,_ee,$De,VDe,UDe,Lee,HDe,WDe,YDe,qDe,XDe,jDe,KDe,QDe,ZDe,JDe,eNe,tNe,rNe,nNe,iNe,aNe,An,zw,CL=M(()=>{"use strict";mv();mL();dm();HJ();YJ();P_();z_();jJ();QJ();kL();EL();Vd();see();gee();$_();Hn();fm();wee();io();Cee();Lc();Vh();IDe=1,ODe=2,PDe=4,Aee="[object Arguments]",BDe="[object Array]",FDe="[object Boolean]",zDe="[object Date]",GDe="[object Error]",_ee="[object Function]",$De="[object GeneratorFunction]",VDe="[object Map]",UDe="[object Number]",Lee="[object Object]",HDe="[object RegExp]",WDe="[object Set]",YDe="[object String]",qDe="[object Symbol]",XDe="[object WeakMap]",jDe="[object ArrayBuffer]",KDe="[object DataView]",QDe="[object Float32Array]",ZDe="[object Float64Array]",JDe="[object Int8Array]",eNe="[object Int16Array]",tNe="[object Int32Array]",rNe="[object Uint8Array]",nNe="[object Uint8ClampedArray]",iNe="[object Uint16Array]",aNe="[object Uint32Array]",An={};An[Aee]=An[BDe]=An[jDe]=An[KDe]=An[FDe]=An[zDe]=An[QDe]=An[ZDe]=An[JDe]=An[eNe]=An[tNe]=An[VDe]=An[UDe]=An[Lee]=An[HDe]=An[WDe]=An[YDe]=An[qDe]=An[rNe]=An[nNe]=An[iNe]=An[aNe]=!0;An[GDe]=An[_ee]=An[XDe]=!1;o(Fw,"baseClone");zw=Fw});function oNe(t){return zw(t,sNe)}var sNe,rn,AL=M(()=>{"use strict";CL();sNe=4;o(oNe,"clone");rn=oNe});function uNe(t){return zw(t,lNe|cNe)}var lNe,cNe,_L,Dee=M(()=>{"use strict";CL();lNe=1,cNe=4;o(uNe,"cloneDeep");_L=uNe});function hNe(t){for(var e=-1,r=t==null?0:t.length,n=0,i=[];++e{"use strict";o(hNe,"compact");Rc=hNe});function dNe(t){return this.__data__.set(t,fNe),this}var fNe,Ree,Mee=M(()=>{"use strict";fNe="__lodash_hash_undefined__";o(dNe,"setCacheAdd");Ree=dNe});function pNe(t){return this.__data__.has(t)}var Iee,Oee=M(()=>{"use strict";o(pNe,"setCacheHas");Iee=pNe});function Gw(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new _d;++e{"use strict";c5();Mee();Oee();o(Gw,"SetCache");Gw.prototype.add=Gw.prototype.push=Ree;Gw.prototype.has=Iee;Gm=Gw});function mNe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(mNe,"arraySome");Vw=mNe});function gNe(t,e){return t.has(e)}var $m,Uw=M(()=>{"use strict";o(gNe,"cacheHas");$m=gNe});function xNe(t,e,r,n,i,a){var s=r&yNe,l=t.length,u=e.length;if(l!=u&&!(s&&u>l))return!1;var h=a.get(t),f=a.get(e);if(h&&f)return h==e&&f==t;var d=-1,p=!0,m=r&vNe?new Gm:void 0;for(a.set(t,e),a.set(e,t);++d{"use strict";$w();LL();Uw();yNe=1,vNe=2;o(xNe,"equalArrays");Hw=xNe});function bNe(t){var e=-1,r=Array(t.size);return t.forEach(function(n,i){r[++e]=[i,n]}),r}var Pee,Bee=M(()=>{"use strict";o(bNe,"mapToArray");Pee=bNe});function wNe(t){var e=-1,r=Array(t.size);return t.forEach(function(n){r[++e]=n}),r}var Vm,Ww=M(()=>{"use strict";o(wNe,"setToArray");Vm=wNe});function ONe(t,e,r,n,i,a,s){switch(r){case INe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case MNe:return!(t.byteLength!=e.byteLength||!a(new sm(t),new sm(e)));case ENe:case SNe:case _Ne:return Fo(+t,+e);case CNe:return t.name==e.name&&t.message==e.message;case LNe:case NNe:return t==e+"";case ANe:var l=Pee;case DNe:var u=n&TNe;if(l||(l=Vm),t.size!=e.size&&!u)return!1;var h=s.get(t);if(h)return h==e;n|=kNe,s.set(t,e);var f=Hw(l(t),l(e),n,i,a,s);return s.delete(t),f;case RNe:if(NL)return NL.call(t)==NL.call(e)}return!1}var TNe,kNe,ENe,SNe,CNe,ANe,_Ne,LNe,DNe,NNe,RNe,MNe,INe,Fee,NL,zee,Gee=M(()=>{"use strict";Cd();B_();Ad();DL();Bee();Ww();TNe=1,kNe=2,ENe="[object Boolean]",SNe="[object Date]",CNe="[object Error]",ANe="[object Map]",_Ne="[object Number]",LNe="[object RegExp]",DNe="[object Set]",NNe="[object String]",RNe="[object Symbol]",MNe="[object ArrayBuffer]",INe="[object DataView]",Fee=ia?ia.prototype:void 0,NL=Fee?Fee.valueOf:void 0;o(ONe,"equalByTag");zee=ONe});function zNe(t,e,r,n,i,a){var s=r&PNe,l=Yv(t),u=l.length,h=Yv(e),f=h.length;if(u!=f&&!s)return!1;for(var d=u;d--;){var p=l[d];if(!(s?p in e:FNe.call(e,p)))return!1}var m=a.get(t),g=a.get(e);if(m&&g)return m==e&&g==t;var y=!0;a.set(t,e),a.set(e,t);for(var v=s;++d{"use strict";kL();PNe=1,BNe=Object.prototype,FNe=BNe.hasOwnProperty;o(zNe,"equalObjects");$ee=zNe});function VNe(t,e,r,n,i,a){var s=Dt(t),l=Dt(e),u=s?Hee:uo(t),h=l?Hee:uo(e);u=u==Uee?Yw:u,h=h==Uee?Yw:h;var f=u==Yw,d=h==Yw,p=u==h;if(p&&Il(t)){if(!Il(e))return!1;s=!0,f=!1}if(p&&!f)return a||(a=new bc),s||Gh(t)?Hw(t,e,r,n,i,a):zee(t,e,u,r,n,i,a);if(!(r&GNe)){var m=f&&Wee.call(t,"__wrapped__"),g=d&&Wee.call(e,"__wrapped__");if(m||g){var y=m?t.value():t,v=g?e.value():e;return a||(a=new bc),i(y,v,r,n,a)}}return p?(a||(a=new bc),$ee(t,e,r,n,i,a)):!1}var GNe,Uee,Hee,Yw,$Ne,Wee,Yee,qee=M(()=>{"use strict";mv();DL();Gee();Vee();Vd();Hn();fm();xv();GNe=1,Uee="[object Arguments]",Hee="[object Array]",Yw="[object Object]",$Ne=Object.prototype,Wee=$Ne.hasOwnProperty;o(VNe,"baseIsEqualDeep");Yee=VNe});function Xee(t,e,r,n,i){return t===e?!0:t==null||e==null||!ei(t)&&!ei(e)?t!==t&&e!==e:Yee(t,e,r,n,Xee,i)}var qw,RL=M(()=>{"use strict";qee();zo();o(Xee,"baseIsEqual");qw=Xee});function WNe(t,e,r,n){var i=r.length,a=i,s=!n;if(t==null)return!a;for(t=Object(t);i--;){var l=r[i];if(s&&l[2]?l[1]!==t[l[0]]:!(l[0]in t))return!1}for(;++i{"use strict";mv();RL();UNe=1,HNe=2;o(WNe,"baseIsMatch");jee=WNe});function YNe(t){return t===t&&!xn(t)}var Xw,ML=M(()=>{"use strict";io();o(YNe,"isStrictComparable");Xw=YNe});function qNe(t){for(var e=Gr(t),r=e.length;r--;){var n=e[r],i=t[n];e[r]=[n,i,Xw(i)]}return e}var Qee,Zee=M(()=>{"use strict";ML();Lc();o(qNe,"getMatchData");Qee=qNe});function XNe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var jw,IL=M(()=>{"use strict";o(XNe,"matchesStrictComparable");jw=XNe});function jNe(t){var e=Qee(t);return e.length==1&&e[0][2]?jw(e[0][0],e[0][1]):function(r){return r===t||jee(r,t,e)}}var Jee,ete=M(()=>{"use strict";Kee();Zee();IL();o(jNe,"baseMatches");Jee=jNe});function KNe(t,e){return t!=null&&e in Object(t)}var tte,rte=M(()=>{"use strict";o(KNe,"baseHasIn");tte=KNe});function QNe(t,e,r){e=Zh(e,t);for(var n=-1,i=e.length,a=!1;++n{"use strict";Hv();um();Hn();wv();v5();Om();o(QNe,"hasPath");Kw=QNe});function ZNe(t,e){return t!=null&&Kw(t,e,tte)}var Qw,PL=M(()=>{"use strict";rte();OL();o(ZNe,"hasIn");Qw=ZNe});function tRe(t,e){return Im(t)&&Xw(e)?jw(Dc(t),e):function(r){var n=NJ(r,t);return n===void 0&&n===e?Qw(r,t):qw(e,n,JNe|eRe)}}var JNe,eRe,nte,ite=M(()=>{"use strict";RL();RJ();PL();Sw();ML();IL();Om();JNe=1,eRe=2;o(tRe,"baseMatchesProperty");nte=tRe});function rRe(t){return function(e){return e?.[t]}}var Zw,BL=M(()=>{"use strict";o(rRe,"baseProperty");Zw=rRe});function nRe(t){return function(e){return Jh(e,t)}}var ate,ste=M(()=>{"use strict";Wv();o(nRe,"basePropertyDeep");ate=nRe});function iRe(t){return Im(t)?Zw(Dc(t)):ate(t)}var ote,lte=M(()=>{"use strict";BL();ste();Sw();Om();o(iRe,"property");ote=iRe});function aRe(t){return typeof t=="function"?t:t==null?aa:typeof t=="object"?Dt(t)?nte(t[0],t[1]):Jee(t):ote(t)}var dn,is=M(()=>{"use strict";ete();ite();Ru();Hn();lte();o(aRe,"baseIteratee");dn=aRe});function sRe(t,e,r,n){for(var i=-1,a=t==null?0:t.length;++i{"use strict";o(sRe,"arrayAggregator");cte=sRe});function oRe(t,e){return t&&am(t,e,Gr)}var Um,Jw=M(()=>{"use strict";u5();Lc();o(oRe,"baseForOwn");Um=oRe});function lRe(t,e){return function(r,n){if(r==null)return r;if(!li(r))return t(r,n);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{"use strict";Go();o(lRe,"createBaseEach");hte=lRe});var cRe,Bs,tf=M(()=>{"use strict";Jw();fte();cRe=hte(Um),Bs=cRe});function uRe(t,e,r,n){return Bs(t,function(i,a,s){e(n,i,r(i),s)}),n}var dte,pte=M(()=>{"use strict";tf();o(uRe,"baseAggregator");dte=uRe});function hRe(t,e){return function(r,n){var i=Dt(r)?cte:dte,a=e?e():{};return i(r,t,dn(n,2),a)}}var mte,gte=M(()=>{"use strict";ute();pte();is();Hn();o(hRe,"createAggregator");mte=hRe});var fRe,eT,yte=M(()=>{"use strict";Bo();fRe=o(function(){return oi.Date.now()},"now"),eT=fRe});var vte,dRe,pRe,rf,xte=M(()=>{"use strict";pm();Ad();Rd();Vh();vte=Object.prototype,dRe=vte.hasOwnProperty,pRe=Ec(function(t,e){t=Object(t);var r=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&ao(e[0],e[1],i)&&(n=1);++r{"use strict";o(mRe,"arrayIncludesWith");tT=mRe});function yRe(t,e,r,n){var i=-1,a=kw,s=!0,l=t.length,u=[],h=e.length;if(!l)return u;r&&(e=Ps(e,$o(r))),n?(a=tT,s=!1):e.length>=gRe&&(a=$m,s=!1,e=new Gm(e));e:for(;++i{"use strict";$w();yL();FL();Gd();Dd();Uw();gRe=200;o(yRe,"baseDifference");bte=yRe});var vRe,nf,Tte=M(()=>{"use strict";wte();Bm();pm();x5();vRe=Ec(function(t,e){return Ld(t)?bte(t,Nc(e,1,Ld,!0)):[]}),nf=vRe});function xRe(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var xa,kte=M(()=>{"use strict";o(xRe,"last");xa=xRe});function bRe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:_c(e),Lw(t,e<0?0:e,n)):[]}var xi,Ete=M(()=>{"use strict";xL();Nm();o(bRe,"drop");xi=bRe});function wRe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:_c(e),e=n-e,Lw(t,0,e<0?0:e)):[]}var zu,Ste=M(()=>{"use strict";xL();Nm();o(wRe,"dropRight");zu=wRe});function TRe(t){return typeof t=="function"?t:aa}var Hm,rT=M(()=>{"use strict";Ru();o(TRe,"castFunction");Hm=TRe});function kRe(t,e){var r=Dt(t)?bw:Bs;return r(t,Hm(e))}var Se,nT=M(()=>{"use strict";mL();tf();rT();Hn();o(kRe,"forEach");Se=kRe});var Cte=M(()=>{"use strict";nT()});function ERe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(ERe,"arrayEvery");Ate=ERe});function SRe(t,e){var r=!0;return Bs(t,function(n,i,a){return r=!!e(n,i,a),r}),r}var Lte,Dte=M(()=>{"use strict";tf();o(SRe,"baseEvery");Lte=SRe});function CRe(t,e,r){var n=Dt(t)?Ate:Lte;return r&&ao(t,e,r)&&(e=void 0),n(t,dn(e,3))}var za,Nte=M(()=>{"use strict";_te();Dte();is();Hn();Rd();o(CRe,"every");za=CRe});function ARe(t,e){var r=[];return Bs(t,function(n,i,a){e(n,i,a)&&r.push(n)}),r}var iT,zL=M(()=>{"use strict";tf();o(ARe,"baseFilter");iT=ARe});function _Re(t,e){var r=Dt(t)?Fm:iT;return r(t,dn(e,3))}var Yr,GL=M(()=>{"use strict";Dw();zL();is();Hn();o(_Re,"filter");Yr=_Re});function LRe(t){return function(e,r,n){var i=Object(e);if(!li(e)){var a=dn(r,3);e=Gr(e),r=o(function(l){return a(i[l],l,i)},"predicate")}var s=t(e,r,n);return s>-1?i[a?e[s]:s]:void 0}}var Rte,Mte=M(()=>{"use strict";is();Go();Lc();o(LRe,"createFind");Rte=LRe});function NRe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:_c(r);return i<0&&(i=DRe(n+i,0)),ww(t,dn(e,3),i)}var DRe,Ite,Ote=M(()=>{"use strict";gL();is();Nm();DRe=Math.max;o(NRe,"findIndex");Ite=NRe});var RRe,as,Pte=M(()=>{"use strict";Mte();Ote();RRe=Rte(Ite),as=RRe});function MRe(t){return t&&t.length?t[0]:void 0}var sa,Bte=M(()=>{"use strict";o(MRe,"head");sa=MRe});var Fte=M(()=>{"use strict";Bte()});function IRe(t,e){var r=-1,n=li(t)?Array(t.length):[];return Bs(t,function(i,a,s){n[++r]=e(i,a,s)}),n}var aT,$L=M(()=>{"use strict";tf();Go();o(IRe,"baseMap");aT=IRe});function ORe(t,e){var r=Dt(t)?Ps:aT;return r(t,dn(e,3))}var Qe,Wm=M(()=>{"use strict";Gd();is();$L();Hn();o(ORe,"map");Qe=ORe});function PRe(t,e){return Nc(Qe(t,e),1)}var ba,VL=M(()=>{"use strict";Bm();Wm();o(PRe,"flatMap");ba=PRe});function BRe(t,e){return t==null?t:am(t,Hm(e),_s)}var UL,zte=M(()=>{"use strict";u5();rT();Vh();o(BRe,"forIn");UL=BRe});function FRe(t,e){return t&&Um(t,Hm(e))}var HL,Gte=M(()=>{"use strict";Jw();rT();o(FRe,"forOwn");HL=FRe});var zRe,GRe,$Re,WL,$te=M(()=>{"use strict";im();gte();zRe=Object.prototype,GRe=zRe.hasOwnProperty,$Re=mte(function(t,e,r){GRe.call(t,r)?t[r].push(e):wc(t,r,[e])}),WL=$Re});function VRe(t,e){return t>e}var Vte,Ute=M(()=>{"use strict";o(VRe,"baseGt");Vte=VRe});function WRe(t,e){return t!=null&&HRe.call(t,e)}var URe,HRe,Hte,Wte=M(()=>{"use strict";URe=Object.prototype,HRe=URe.hasOwnProperty;o(WRe,"baseHas");Hte=WRe});function YRe(t,e){return t!=null&&Kw(t,e,Hte)}var Nt,Yte=M(()=>{"use strict";Wte();OL();o(YRe,"has");Nt=YRe});function XRe(t){return typeof t=="string"||!Dt(t)&&ei(t)&&ga(t)==qRe}var qRe,bi,sT=M(()=>{"use strict";Lu();Hn();zo();qRe="[object String]";o(XRe,"isString");bi=XRe});function jRe(t,e){return Ps(e,function(r){return t[r]})}var qte,Xte=M(()=>{"use strict";Gd();o(jRe,"baseValues");qte=jRe});function KRe(t){return t==null?[]:qte(t,Gr(t))}var br,YL=M(()=>{"use strict";Xte();Lc();o(KRe,"values");br=KRe});function ZRe(t,e,r,n){t=li(t)?t:br(t),r=r&&!n?_c(r):0;var i=t.length;return r<0&&(r=QRe(i+r,0)),bi(t)?r<=i&&t.indexOf(e,r)>-1:!!i&&Rm(t,e,r)>-1}var QRe,Yn,jte=M(()=>{"use strict";Tw();Go();sT();Nm();YL();QRe=Math.max;o(ZRe,"includes");Yn=ZRe});function eMe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:_c(r);return i<0&&(i=JRe(n+i,0)),Rm(t,e,i)}var JRe,oT,Kte=M(()=>{"use strict";Tw();Nm();JRe=Math.max;o(eMe,"indexOf");oT=eMe});function aMe(t){if(t==null)return!0;if(li(t)&&(Dt(t)||typeof t=="string"||typeof t.splice=="function"||Il(t)||Gh(t)||Ml(t)))return!t.length;var e=uo(t);if(e==tMe||e==rMe)return!t.size;if(Tc(t))return!Mm(t).length;for(var r in t)if(iMe.call(t,r))return!1;return!0}var tMe,rMe,nMe,iMe,cr,lT=M(()=>{"use strict";Ew();Vd();um();Hn();Go();fm();cm();xv();tMe="[object Map]",rMe="[object Set]",nMe=Object.prototype,iMe=nMe.hasOwnProperty;o(aMe,"isEmpty");cr=aMe});function oMe(t){return ei(t)&&ga(t)==sMe}var sMe,Qte,Zte=M(()=>{"use strict";Lu();zo();sMe="[object RegExp]";o(oMe,"baseIsRegExp");Qte=oMe});var Jte,lMe,Xo,ere=M(()=>{"use strict";Zte();Dd();vv();Jte=Vo&&Vo.isRegExp,lMe=Jte?$o(Jte):Qte,Xo=lMe});function cMe(t){return t===void 0}var dr,tre=M(()=>{"use strict";o(cMe,"isUndefined");dr=cMe});function uMe(t,e){return t{"use strict";o(uMe,"baseLt");cT=uMe});function hMe(t,e){var r={};return e=dn(e,3),Um(t,function(n,i,a){wc(r,i,e(n,i,a))}),r}var Ud,rre=M(()=>{"use strict";im();Jw();is();o(hMe,"mapValues");Ud=hMe});function fMe(t,e,r){for(var n=-1,i=t.length;++n{"use strict";zd();o(fMe,"baseExtremum");Ym=fMe});function dMe(t){return t&&t.length?Ym(t,aa,Vte):void 0}var Fs,nre=M(()=>{"use strict";uT();Ute();Ru();o(dMe,"max");Fs=dMe});function pMe(t){return t&&t.length?Ym(t,aa,cT):void 0}var Bl,XL=M(()=>{"use strict";uT();qL();Ru();o(pMe,"min");Bl=pMe});function mMe(t,e){return t&&t.length?Ym(t,dn(e,2),cT):void 0}var Hd,ire=M(()=>{"use strict";uT();is();qL();o(mMe,"minBy");Hd=mMe});function yMe(t){if(typeof t!="function")throw new TypeError(gMe);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}var gMe,are,sre=M(()=>{"use strict";gMe="Expected a function";o(yMe,"negate");are=yMe});function vMe(t,e,r,n){if(!xn(t))return t;e=Zh(e,t);for(var i=-1,a=e.length,s=a-1,l=t;l!=null&&++i{"use strict";dm();Hv();wv();io();Om();o(vMe,"baseSet");ore=vMe});function xMe(t,e,r){for(var n=-1,i=e.length,a={};++n{"use strict";Wv();lre();Hv();o(xMe,"basePickBy");hT=xMe});function bMe(t,e){if(t==null)return{};var r=Ps(Ow(t),function(n){return[n]});return e=dn(e),hT(t,r,function(n,i){return e(n,i[0])})}var zs,cre=M(()=>{"use strict";Gd();is();jL();EL();o(bMe,"pickBy");zs=bMe});function wMe(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var ure,hre=M(()=>{"use strict";o(wMe,"baseSortBy");ure=wMe});function TMe(t,e){if(t!==e){var r=t!==void 0,n=t===null,i=t===t,a=co(t),s=e!==void 0,l=e===null,u=e===e,h=co(e);if(!l&&!h&&!a&&t>e||a&&s&&u&&!l&&!h||n&&s&&u||!r&&u||!i)return 1;if(!n&&!a&&!h&&t{"use strict";zd();o(TMe,"compareAscending");fre=TMe});function kMe(t,e,r){for(var n=-1,i=t.criteria,a=e.criteria,s=i.length,l=r.length;++n=l)return u;var h=r[n];return u*(h=="desc"?-1:1)}}return t.index-e.index}var pre,mre=M(()=>{"use strict";dre();o(kMe,"compareMultiple");pre=kMe});function EMe(t,e,r){e.length?e=Ps(e,function(a){return Dt(a)?function(s){return Jh(s,a.length===1?a[0]:a)}:a}):e=[aa];var n=-1;e=Ps(e,$o(dn));var i=aT(t,function(a,s,l){var u=Ps(e,function(h){return h(a)});return{criteria:u,index:++n,value:a}});return ure(i,function(a,s){return pre(a,s,r)})}var gre,yre=M(()=>{"use strict";Gd();Wv();is();$L();hre();Dd();mre();Ru();Hn();o(EMe,"baseOrderBy");gre=EMe});var SMe,vre,xre=M(()=>{"use strict";BL();SMe=Zw("length"),vre=SMe});function BMe(t){for(var e=bre.lastIndex=0;bre.test(t);)++e;return e}var wre,CMe,AMe,_Me,LMe,DMe,NMe,KL,QL,RMe,Tre,kre,Ere,MMe,Sre,Cre,IMe,OMe,PMe,bre,Are,_re=M(()=>{"use strict";wre="\\ud800-\\udfff",CMe="\\u0300-\\u036f",AMe="\\ufe20-\\ufe2f",_Me="\\u20d0-\\u20ff",LMe=CMe+AMe+_Me,DMe="\\ufe0e\\ufe0f",NMe="["+wre+"]",KL="["+LMe+"]",QL="\\ud83c[\\udffb-\\udfff]",RMe="(?:"+KL+"|"+QL+")",Tre="[^"+wre+"]",kre="(?:\\ud83c[\\udde6-\\uddff]){2}",Ere="[\\ud800-\\udbff][\\udc00-\\udfff]",MMe="\\u200d",Sre=RMe+"?",Cre="["+DMe+"]?",IMe="(?:"+MMe+"(?:"+[Tre,kre,Ere].join("|")+")"+Cre+Sre+")*",OMe=Cre+Sre+IMe,PMe="(?:"+[Tre+KL+"?",KL,kre,Ere,NMe].join("|")+")",bre=RegExp(QL+"(?="+QL+")|"+PMe+OMe,"g");o(BMe,"unicodeSize");Are=BMe});function FMe(t){return zJ(t)?Are(t):vre(t)}var Lre,Dre=M(()=>{"use strict";xre();GJ();_re();o(FMe,"stringSize");Lre=FMe});function zMe(t,e){return hT(t,e,function(r,n){return Qw(t,n)})}var Nre,Rre=M(()=>{"use strict";jL();PL();o(zMe,"basePick");Nre=zMe});var GMe,Wd,Mre=M(()=>{"use strict";Rre();FJ();GMe=BJ(function(t,e){return t==null?{}:Nre(t,e)}),Wd=GMe});function UMe(t,e,r,n){for(var i=-1,a=VMe($Me((e-t)/(r||1)),0),s=Array(a);a--;)s[n?a:++i]=t,t+=r;return s}var $Me,VMe,Ire,Ore=M(()=>{"use strict";$Me=Math.ceil,VMe=Math.max;o(UMe,"baseRange");Ire=UMe});function HMe(t){return function(e,r,n){return n&&typeof n!="number"&&ao(e,r,n)&&(r=n=void 0),e=Dm(e),r===void 0?(r=e,e=0):r=Dm(r),n=n===void 0?e{"use strict";Ore();Rd();dL();o(HMe,"createRange");Pre=HMe});var WMe,jo,Fre=M(()=>{"use strict";Bre();WMe=Pre(),jo=WMe});function YMe(t,e,r,n,i){return i(t,function(a,s,l){r=n?(n=!1,a):e(r,a,s,l)}),r}var zre,Gre=M(()=>{"use strict";o(YMe,"baseReduce");zre=YMe});function qMe(t,e,r){var n=Dt(t)?$J:zre,i=arguments.length<3;return n(t,dn(e,4),r,i,Bs)}var qr,ZL=M(()=>{"use strict";VJ();tf();is();Gre();Hn();o(qMe,"reduce");qr=qMe});function XMe(t,e){var r=Dt(t)?Fm:iT;return r(t,are(dn(e,3)))}var af,$re=M(()=>{"use strict";Dw();zL();is();Hn();sre();o(XMe,"reject");af=XMe});function QMe(t){if(t==null)return 0;if(li(t))return bi(t)?Lre(t):t.length;var e=uo(t);return e==jMe||e==KMe?t.size:Mm(t).length}var jMe,KMe,JL,Vre=M(()=>{"use strict";Ew();Vd();Go();sT();Dre();jMe="[object Map]",KMe="[object Set]";o(QMe,"size");JL=QMe});function ZMe(t,e){var r;return Bs(t,function(n,i,a){return r=e(n,i,a),!r}),!!r}var Ure,Hre=M(()=>{"use strict";tf();o(ZMe,"baseSome");Ure=ZMe});function JMe(t,e,r){var n=Dt(t)?Vw:Ure;return r&&ao(t,e,r)&&(e=void 0),n(t,dn(e,3))}var qv,Wre=M(()=>{"use strict";LL();is();Hre();Hn();Rd();o(JMe,"some");qv=JMe});var eIe,Mc,Yre=M(()=>{"use strict";Bm();yre();pm();Rd();eIe=Ec(function(t,e){if(t==null)return[];var r=e.length;return r>1&&ao(t,e[0],e[1])?e=[]:r>2&&ao(e[0],e[1],e[2])&&(e=[e[0]]),gre(t,Nc(e,1),[])}),Mc=eIe});var tIe,rIe,qre,Xre=M(()=>{"use strict";SL();pL();Ww();tIe=1/0,rIe=ef&&1/Vm(new ef([,-0]))[1]==tIe?function(t){return new ef(t)}:ti,qre=rIe});function iIe(t,e,r){var n=-1,i=kw,a=t.length,s=!0,l=[],u=l;if(r)s=!1,i=tT;else if(a>=nIe){var h=e?null:qre(t);if(h)return Vm(h);s=!1,i=$m,u=new Gm}else u=e?[]:l;e:for(;++n{"use strict";$w();yL();FL();Uw();Xre();Ww();nIe=200;o(iIe,"baseUniq");qm=iIe});var aIe,eD,jre=M(()=>{"use strict";Bm();pm();fT();x5();aIe=Ec(function(t){return qm(Nc(t,1,Ld,!0))}),eD=aIe});function sIe(t){return t&&t.length?qm(t):[]}var Xm,Kre=M(()=>{"use strict";fT();o(sIe,"uniq");Xm=sIe});function oIe(t,e){return t&&t.length?qm(t,dn(e,2)):[]}var Qre,Zre=M(()=>{"use strict";is();fT();o(oIe,"uniqBy");Qre=oIe});function cIe(t){var e=++lIe;return Cw(t)+e}var lIe,Yd,Jre=M(()=>{"use strict";vL();lIe=0;o(cIe,"uniqueId");Yd=cIe});function uIe(t,e,r){for(var n=-1,i=t.length,a=e.length,s={};++n{"use strict";o(uIe,"baseZipObject");ene=uIe});function hIe(t,e){return ene(t||[],e||[],kc)}var dT,rne=M(()=>{"use strict";dm();tne();o(hIe,"zipObject");dT=hIe});var Ht=M(()=>{"use strict";CJ();AL();Dee();Nee();q_();xte();Tte();Ete();Ste();Cte();Nte();GL();Pte();Fte();VL();_w();nT();zte();Gte();$te();Yte();Ru();jte();Kte();Hn();lT();uv();io();ere();sT();tre();Lc();kte();Wm();rre();nre();K_();XL();ire();pL();yte();Mre();cre();Fre();ZL();$re();Vre();Wre();Yre();jre();Kre();Jre();YL();rne();});function ine(t,e){t[e]?t[e]++:t[e]=1}function ane(t,e){--t[e]||delete t[e]}function Xv(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}return i+nne+a+nne+(dr(n)?fIe:n)}function dIe(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}var l={v:i,w:a};return n&&(l.name=n),l}function tD(t,e){return Xv(t,e.v,e.w,e.name)}var fIe,qd,nne,Ir,pT=M(()=>{"use strict";Ht();fIe="\0",qd="\0",nne="",Ir=class{static{o(this,"Graph")}constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=Ls(void 0),this._defaultEdgeLabelFn=Ls(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[qd]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return _i(e)||(e=Ls(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return Gr(this._nodes)}sources(){var e=this;return Yr(this.nodes(),function(r){return cr(e._in[r])})}sinks(){var e=this;return Yr(this.nodes(),function(r){return cr(e._out[r])})}setNodes(e,r){var n=arguments,i=this;return Se(e,function(a){n.length>1?i.setNode(a,r):i.setNode(a)}),this}setNode(e,r){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=r),this):(this._nodes[e]=arguments.length>1?r:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=qd,this._children[e]={},this._children[qd][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var r=o(n=>this.removeEdge(this._edgeObjs[n]),"removeEdge");delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],Se(this.children(e),n=>{this.setParent(n)}),delete this._children[e]),Se(Gr(this._in[e]),r),delete this._in[e],delete this._preds[e],Se(Gr(this._out[e]),r),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,r){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(dr(r))r=qd;else{r+="";for(var n=r;!dr(n);n=this.parent(n))if(n===e)throw new Error("Setting "+r+" as parent of "+e+" would create a cycle");this.setNode(r)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=r,this._children[r][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var r=this._parent[e];if(r!==qd)return r}}children(e){if(dr(e)&&(e=qd),this._isCompound){var r=this._children[e];if(r)return Gr(r)}else{if(e===qd)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var r=this._preds[e];if(r)return Gr(r)}successors(e){var r=this._sucs[e];if(r)return Gr(r)}neighbors(e){var r=this.predecessors(e);if(r)return eD(r,this.successors(e))}isLeaf(e){var r;return this.isDirected()?r=this.successors(e):r=this.neighbors(e),r.length===0}filterNodes(e){var r=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});r.setGraph(this.graph());var n=this;Se(this._nodes,function(s,l){e(l)&&r.setNode(l,s)}),Se(this._edgeObjs,function(s){r.hasNode(s.v)&&r.hasNode(s.w)&&r.setEdge(s,n.edge(s))});var i={};function a(s){var l=n.parent(s);return l===void 0||r.hasNode(l)?(i[s]=l,l):l in i?i[l]:a(l)}return o(a,"findParent"),this._isCompound&&Se(r.nodes(),function(s){r.setParent(s,a(s))}),r}setDefaultEdgeLabel(e){return _i(e)||(e=Ls(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return br(this._edgeObjs)}setPath(e,r){var n=this,i=arguments;return qr(e,function(a,s){return i.length>1?n.setEdge(a,s,r):n.setEdge(a,s),s}),this}setEdge(){var e,r,n,i,a=!1,s=arguments[0];typeof s=="object"&&s!==null&&"v"in s?(e=s.v,r=s.w,n=s.name,arguments.length===2&&(i=arguments[1],a=!0)):(e=s,r=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),e=""+e,r=""+r,dr(n)||(n=""+n);var l=Xv(this._isDirected,e,r,n);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,l))return a&&(this._edgeLabels[l]=i),this;if(!dr(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(r),this._edgeLabels[l]=a?i:this._defaultEdgeLabelFn(e,r,n);var u=dIe(this._isDirected,e,r,n);return e=u.v,r=u.w,Object.freeze(u),this._edgeObjs[l]=u,ine(this._preds[r],e),ine(this._sucs[e],r),this._in[r][l]=u,this._out[e][l]=u,this._edgeCount++,this}edge(e,r,n){var i=arguments.length===1?tD(this._isDirected,arguments[0]):Xv(this._isDirected,e,r,n);return this._edgeLabels[i]}hasEdge(e,r,n){var i=arguments.length===1?tD(this._isDirected,arguments[0]):Xv(this._isDirected,e,r,n);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,r,n){var i=arguments.length===1?tD(this._isDirected,arguments[0]):Xv(this._isDirected,e,r,n),a=this._edgeObjs[i];return a&&(e=a.v,r=a.w,delete this._edgeLabels[i],delete this._edgeObjs[i],ane(this._preds[r],e),ane(this._sucs[e],r),delete this._in[r][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,r){var n=this._in[e];if(n){var i=br(n);return r?Yr(i,function(a){return a.v===r}):i}}outEdges(e,r){var n=this._out[e];if(n){var i=br(n);return r?Yr(i,function(a){return a.w===r}):i}}nodeEdges(e,r){var n=this.inEdges(e,r);if(n)return n.concat(this.outEdges(e,r))}};Ir.prototype._nodeCount=0;Ir.prototype._edgeCount=0;o(ine,"incrementOrInitEntry");o(ane,"decrementOrRemoveEntry");o(Xv,"edgeArgsToId");o(dIe,"edgeArgsToObj");o(tD,"edgeObjToId")});var Gs=M(()=>{"use strict";pT()});function sne(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function pIe(t,e){if(t!=="_next"&&t!=="_prev")return e}var mT,one=M(()=>{"use strict";mT=class{static{o(this,"List")}constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,r=e._prev;if(r!==e)return sne(r),r}enqueue(e){var r=this._sentinel;e._prev&&e._next&&sne(e),e._next=r._next,r._next._prev=e,r._next=e,e._prev=r}toString(){for(var e=[],r=this._sentinel,n=r._prev;n!==r;)e.push(JSON.stringify(n,pIe)),n=n._prev;return"["+e.join(", ")+"]"}};o(sne,"unlink");o(pIe,"filterOutLinks")});function lne(t,e){if(t.nodeCount()<=1)return[];var r=yIe(t,e||mIe),n=gIe(r.graph,r.buckets,r.zeroIdx);return Wr(Qe(n,function(i){return t.outEdges(i.v,i.w)}))}function gIe(t,e,r){for(var n=[],i=e[e.length-1],a=e[0],s;t.nodeCount();){for(;s=a.dequeue();)rD(t,e,r,s);for(;s=i.dequeue();)rD(t,e,r,s);if(t.nodeCount()){for(var l=e.length-2;l>0;--l)if(s=e[l].dequeue(),s){n=n.concat(rD(t,e,r,s,!0));break}}}return n}function rD(t,e,r,n,i){var a=i?[]:void 0;return Se(t.inEdges(n.v),function(s){var l=t.edge(s),u=t.node(s.v);i&&a.push({v:s.v,w:s.w}),u.out-=l,nD(e,r,u)}),Se(t.outEdges(n.v),function(s){var l=t.edge(s),u=s.w,h=t.node(u);h.in-=l,nD(e,r,h)}),t.removeNode(n.v),a}function yIe(t,e){var r=new Ir,n=0,i=0;Se(t.nodes(),function(l){r.setNode(l,{v:l,in:0,out:0})}),Se(t.edges(),function(l){var u=r.edge(l.v,l.w)||0,h=e(l),f=u+h;r.setEdge(l.v,l.w,f),i=Math.max(i,r.node(l.v).out+=h),n=Math.max(n,r.node(l.w).in+=h)});var a=jo(i+n+3).map(function(){return new mT}),s=n+1;return Se(r.nodes(),function(l){nD(a,s,r.node(l))}),{graph:r,buckets:a,zeroIdx:s}}function nD(t,e,r){r.out?r.in?t[r.out-r.in+e].enqueue(r):t[t.length-1].enqueue(r):t[0].enqueue(r)}var mIe,cne=M(()=>{"use strict";Ht();Gs();one();mIe=Ls(1);o(lne,"greedyFAS");o(gIe,"doGreedyFAS");o(rD,"removeNode");o(yIe,"buildState");o(nD,"assignBucket")});function une(t){var e=t.graph().acyclicer==="greedy"?lne(t,r(t)):vIe(t);Se(e,function(n){var i=t.edge(n);t.removeEdge(n),i.forwardName=n.name,i.reversed=!0,t.setEdge(n.w,n.v,i,Yd("rev"))});function r(n){return function(i){return n.edge(i).weight}}o(r,"weightFn")}function vIe(t){var e=[],r={},n={};function i(a){Object.prototype.hasOwnProperty.call(n,a)||(n[a]=!0,r[a]=!0,Se(t.outEdges(a),function(s){Object.prototype.hasOwnProperty.call(r,s.w)?e.push(s):i(s.w)}),delete r[a])}return o(i,"dfs"),Se(t.nodes(),i),e}function hne(t){Se(t.edges(),function(e){var r=t.edge(e);if(r.reversed){t.removeEdge(e);var n=r.forwardName;delete r.reversed,delete r.forwardName,t.setEdge(e.w,e.v,r,n)}})}var iD=M(()=>{"use strict";Ht();cne();o(une,"run");o(vIe,"dfsFAS");o(hne,"undo")});function Ic(t,e,r,n){var i;do i=Yd(n);while(t.hasNode(i));return r.dummy=e,t.setNode(i,r),i}function dne(t){var e=new Ir().setGraph(t.graph());return Se(t.nodes(),function(r){e.setNode(r,t.node(r))}),Se(t.edges(),function(r){var n=e.edge(r.v,r.w)||{weight:0,minlen:1},i=t.edge(r);e.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),e}function gT(t){var e=new Ir({multigraph:t.isMultigraph()}).setGraph(t.graph());return Se(t.nodes(),function(r){t.children(r).length||e.setNode(r,t.node(r))}),Se(t.edges(),function(r){e.setEdge(r,t.edge(r))}),e}function aD(t,e){var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=l*i/a,h=l):(i<0&&(s=-s),u=s,h=s*a/i),{x:r+u,y:n+h}}function sf(t){var e=Qe(jo(oD(t)+1),function(){return[]});return Se(t.nodes(),function(r){var n=t.node(r),i=n.rank;dr(i)||(e[i][n.order]=r)}),e}function pne(t){var e=Bl(Qe(t.nodes(),function(r){return t.node(r).rank}));Se(t.nodes(),function(r){var n=t.node(r);Nt(n,"rank")&&(n.rank-=e)})}function mne(t){var e=Bl(Qe(t.nodes(),function(a){return t.node(a).rank})),r=[];Se(t.nodes(),function(a){var s=t.node(a).rank-e;r[s]||(r[s]=[]),r[s].push(a)});var n=0,i=t.graph().nodeRankFactor;Se(r,function(a,s){dr(a)&&s%i!==0?--n:n&&Se(a,function(l){t.node(l).rank+=n})})}function sD(t,e,r,n){var i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),Ic(t,"border",i,e)}function oD(t){return Fs(Qe(t.nodes(),function(e){var r=t.node(e).rank;if(!dr(r))return r}))}function gne(t,e){var r={lhs:[],rhs:[]};return Se(t,function(n){e(n)?r.lhs.push(n):r.rhs.push(n)}),r}function yne(t,e){var r=eT();try{return e()}finally{console.log(t+" time: "+(eT()-r)+"ms")}}function vne(t,e){return e()}var Oc=M(()=>{"use strict";Ht();Gs();o(Ic,"addDummyNode");o(dne,"simplify");o(gT,"asNonCompoundGraph");o(aD,"intersectRect");o(sf,"buildLayerMatrix");o(pne,"normalizeRanks");o(mne,"removeEmptyRanks");o(sD,"addBorderNode");o(oD,"maxRank");o(gne,"partition");o(yne,"time");o(vne,"notime")});function bne(t){function e(r){var n=t.children(r),i=t.node(r);if(n.length&&Se(n,e),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var a=i.minRank,s=i.maxRank+1;a{"use strict";Ht();Oc();o(bne,"addBorderSegments");o(xne,"addBorderNode")});function kne(t){var e=t.graph().rankdir.toLowerCase();(e==="lr"||e==="rl")&&Sne(t)}function Ene(t){var e=t.graph().rankdir.toLowerCase();(e==="bt"||e==="rl")&&xIe(t),(e==="lr"||e==="rl")&&(bIe(t),Sne(t))}function Sne(t){Se(t.nodes(),function(e){Tne(t.node(e))}),Se(t.edges(),function(e){Tne(t.edge(e))})}function Tne(t){var e=t.width;t.width=t.height,t.height=e}function xIe(t){Se(t.nodes(),function(e){lD(t.node(e))}),Se(t.edges(),function(e){var r=t.edge(e);Se(r.points,lD),Object.prototype.hasOwnProperty.call(r,"y")&&lD(r)})}function lD(t){t.y=-t.y}function bIe(t){Se(t.nodes(),function(e){cD(t.node(e))}),Se(t.edges(),function(e){var r=t.edge(e);Se(r.points,cD),Object.prototype.hasOwnProperty.call(r,"x")&&cD(r)})}function cD(t){var e=t.x;t.x=t.y,t.y=e}var Cne=M(()=>{"use strict";Ht();o(kne,"adjust");o(Ene,"undo");o(Sne,"swapWidthHeight");o(Tne,"swapWidthHeightOne");o(xIe,"reverseY");o(lD,"reverseYOne");o(bIe,"swapXY");o(cD,"swapXYOne")});function Ane(t){t.graph().dummyChains=[],Se(t.edges(),function(e){TIe(t,e)})}function TIe(t,e){var r=e.v,n=t.node(r).rank,i=e.w,a=t.node(i).rank,s=e.name,l=t.edge(e),u=l.labelRank;if(a!==n+1){t.removeEdge(e);var h=void 0,f,d;for(d=0,++n;n{"use strict";Ht();Oc();o(Ane,"run");o(TIe,"normalizeEdge");o(_ne,"undo")});function jv(t){var e={};function r(n){var i=t.node(n);if(Object.prototype.hasOwnProperty.call(e,n))return i.rank;e[n]=!0;var a=Bl(Qe(t.outEdges(n),function(s){return r(s.w)-t.edge(s).minlen}));return(a===Number.POSITIVE_INFINITY||a===void 0||a===null)&&(a=0),i.rank=a}o(r,"dfs"),Se(t.sources(),r)}function Xd(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}var yT=M(()=>{"use strict";Ht();o(jv,"longestPath");o(Xd,"slack")});function vT(t){var e=new Ir({directed:!1}),r=t.nodes()[0],n=t.nodeCount();e.setNode(r,{});for(var i,a;kIe(e,t){"use strict";Ht();Gs();yT();o(vT,"feasibleTree");o(kIe,"tightTree");o(EIe,"findMinSlackEdge");o(SIe,"shiftRanks")});var Dne=M(()=>{"use strict"});var fD=M(()=>{"use strict"});var dYt,dD=M(()=>{"use strict";Ht();fD();dYt=Ls(1)});var Nne=M(()=>{"use strict";dD()});var pD=M(()=>{"use strict"});var Rne=M(()=>{"use strict";pD()});var EYt,Mne=M(()=>{"use strict";Ht();EYt=Ls(1)});function mD(t){var e={},r={},n=[];function i(a){if(Object.prototype.hasOwnProperty.call(r,a))throw new Kv;Object.prototype.hasOwnProperty.call(e,a)||(r[a]=!0,e[a]=!0,Se(t.predecessors(a),i),delete r[a],n.push(a))}if(o(i,"visit"),Se(t.sinks(),i),JL(e)!==t.nodeCount())throw new Kv;return n}function Kv(){}var gD=M(()=>{"use strict";Ht();mD.CycleException=Kv;o(mD,"topsort");o(Kv,"CycleException");Kv.prototype=new Error});var Ine=M(()=>{"use strict";gD()});function xT(t,e,r){Dt(e)||(e=[e]);var n=(t.isDirected()?t.successors:t.neighbors).bind(t),i=[],a={};return Se(e,function(s){if(!t.hasNode(s))throw new Error("Graph does not have node: "+s);One(t,s,r==="post",a,n,i)}),i}function One(t,e,r,n,i,a){Object.prototype.hasOwnProperty.call(n,e)||(n[e]=!0,r||a.push(e),Se(i(e),function(s){One(t,s,r,n,i,a)}),r&&a.push(e))}var yD=M(()=>{"use strict";Ht();o(xT,"dfs");o(One,"doDfs")});function vD(t,e){return xT(t,e,"post")}var Pne=M(()=>{"use strict";yD();o(vD,"postorder")});function xD(t,e){return xT(t,e,"pre")}var Bne=M(()=>{"use strict";yD();o(xD,"preorder")});var Fne=M(()=>{"use strict";fD();pT()});var zne=M(()=>{"use strict";Dne();dD();Nne();Rne();Mne();Ine();Pne();Bne();Fne();pD();gD()});function lf(t){t=dne(t),jv(t);var e=vT(t);wD(e),bD(e,t);for(var r,n;r=Une(e);)n=Hne(e,t,r),Wne(e,t,r,n)}function bD(t,e){var r=vD(t,t.nodes());r=r.slice(0,r.length-1),Se(r,function(n){DIe(t,e,n)})}function DIe(t,e,r){var n=t.node(r),i=n.parent;t.edge(r,i).cutvalue=$ne(t,e,r)}function $ne(t,e,r){var n=t.node(r),i=n.parent,a=!0,s=e.edge(r,i),l=0;return s||(a=!1,s=e.edge(i,r)),l=s.weight,Se(e.nodeEdges(r),function(u){var h=u.v===r,f=h?u.w:u.v;if(f!==i){var d=h===a,p=e.edge(u).weight;if(l+=d?p:-p,RIe(t,r,f)){var m=t.edge(r,f).cutvalue;l+=d?-m:m}}}),l}function wD(t,e){arguments.length<2&&(e=t.nodes()[0]),Vne(t,{},1,e)}function Vne(t,e,r,n,i){var a=r,s=t.node(n);return e[n]=!0,Se(t.neighbors(n),function(l){Object.prototype.hasOwnProperty.call(e,l)||(r=Vne(t,e,r,l,n))}),s.low=a,s.lim=r++,i?s.parent=i:delete s.parent,r}function Une(t){return as(t.edges(),function(e){return t.edge(e).cutvalue<0})}function Hne(t,e,r){var n=r.v,i=r.w;e.hasEdge(n,i)||(n=r.w,i=r.v);var a=t.node(n),s=t.node(i),l=a,u=!1;a.lim>s.lim&&(l=s,u=!0);var h=Yr(e.edges(),function(f){return u===Gne(t,t.node(f.v),l)&&u!==Gne(t,t.node(f.w),l)});return Hd(h,function(f){return Xd(e,f)})}function Wne(t,e,r,n){var i=r.v,a=r.w;t.removeEdge(i,a),t.setEdge(n.v,n.w,{}),wD(t),bD(t,e),NIe(t,e)}function NIe(t,e){var r=as(t.nodes(),function(i){return!e.node(i).parent}),n=xD(t,r);n=n.slice(1),Se(n,function(i){var a=t.node(i).parent,s=e.edge(i,a),l=!1;s||(s=e.edge(a,i),l=!0),e.node(i).rank=e.node(a).rank+(l?s.minlen:-s.minlen)})}function RIe(t,e,r){return t.hasEdge(e,r)}function Gne(t,e,r){return r.low<=e.lim&&e.lim<=r.lim}var Yne=M(()=>{"use strict";Ht();zne();Oc();hD();yT();lf.initLowLimValues=wD;lf.initCutValues=bD;lf.calcCutValue=$ne;lf.leaveEdge=Une;lf.enterEdge=Hne;lf.exchangeEdges=Wne;o(lf,"networkSimplex");o(bD,"initCutValues");o(DIe,"assignCutValue");o($ne,"calcCutValue");o(wD,"initLowLimValues");o(Vne,"dfsAssignLowLim");o(Une,"leaveEdge");o(Hne,"enterEdge");o(Wne,"exchangeEdges");o(NIe,"updateRanks");o(RIe,"isTreeEdge");o(Gne,"isDescendant")});function TD(t){switch(t.graph().ranker){case"network-simplex":qne(t);break;case"tight-tree":IIe(t);break;case"longest-path":MIe(t);break;default:qne(t)}}function IIe(t){jv(t),vT(t)}function qne(t){lf(t)}var MIe,kD=M(()=>{"use strict";hD();Yne();yT();o(TD,"rank");MIe=jv;o(IIe,"tightTreeRanker");o(qne,"networkSimplexRanker")});function Xne(t){var e=Ic(t,"root",{},"_root"),r=OIe(t),n=Fs(br(r))-1,i=2*n+1;t.graph().nestingRoot=e,Se(t.edges(),function(s){t.edge(s).minlen*=i});var a=PIe(t)+1;Se(t.children(),function(s){jne(t,e,i,a,n,r,s)}),t.graph().nodeRankFactor=i}function jne(t,e,r,n,i,a,s){var l=t.children(s);if(!l.length){s!==e&&t.setEdge(e,s,{weight:0,minlen:r});return}var u=sD(t,"_bt"),h=sD(t,"_bb"),f=t.node(s);t.setParent(u,s),f.borderTop=u,t.setParent(h,s),f.borderBottom=h,Se(l,function(d){jne(t,e,r,n,i,a,d);var p=t.node(d),m=p.borderTop?p.borderTop:d,g=p.borderBottom?p.borderBottom:d,y=p.borderTop?n:2*n,v=m!==g?1:i-a[s]+1;t.setEdge(u,m,{weight:y,minlen:v,nestingEdge:!0}),t.setEdge(g,h,{weight:y,minlen:v,nestingEdge:!0})}),t.parent(s)||t.setEdge(e,u,{weight:0,minlen:i+a[s]})}function OIe(t){var e={};function r(n,i){var a=t.children(n);a&&a.length&&Se(a,function(s){r(s,i+1)}),e[n]=i}return o(r,"dfs"),Se(t.children(),function(n){r(n,1)}),e}function PIe(t){return qr(t.edges(),function(e,r){return e+t.edge(r).weight},0)}function Kne(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,Se(t.edges(),function(r){var n=t.edge(r);n.nestingEdge&&t.removeEdge(r)})}var Qne=M(()=>{"use strict";Ht();Oc();o(Xne,"run");o(jne,"dfs");o(OIe,"treeDepths");o(PIe,"sumWeights");o(Kne,"cleanup")});function Zne(t,e,r){var n={},i;Se(r,function(a){for(var s=t.parent(a),l,u;s;){if(l=t.parent(s),l?(u=n[l],n[l]=s):(u=i,i=s),u&&u!==s){e.setEdge(u,s);return}s=l}})}var Jne=M(()=>{"use strict";Ht();o(Zne,"addSubgraphConstraints")});function eie(t,e,r){var n=FIe(t),i=new Ir({compound:!0}).setGraph({root:n}).setDefaultNodeLabel(function(a){return t.node(a)});return Se(t.nodes(),function(a){var s=t.node(a),l=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(i.setNode(a),i.setParent(a,l||n),Se(t[r](a),function(u){var h=u.v===a?u.w:u.v,f=i.edge(h,a),d=dr(f)?0:f.weight;i.setEdge(h,a,{weight:t.edge(u).weight+d})}),Object.prototype.hasOwnProperty.call(s,"minRank")&&i.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))}),i}function FIe(t){for(var e;t.hasNode(e=Yd("_root")););return e}var tie=M(()=>{"use strict";Ht();Gs();o(eie,"buildLayerGraph");o(FIe,"createRootNode")});function rie(t,e){for(var r=0,n=1;n0;)f%2&&(d+=l[f+1]),f=f-1>>1,l[f]+=h.weight;u+=h.weight*d})),u}var nie=M(()=>{"use strict";Ht();o(rie,"crossCount");o(zIe,"twoLayerCrossCount")});function iie(t){var e={},r=Yr(t.nodes(),function(l){return!t.children(l).length}),n=Fs(Qe(r,function(l){return t.node(l).rank})),i=Qe(jo(n+1),function(){return[]});function a(l){if(!Nt(e,l)){e[l]=!0;var u=t.node(l);i[u.rank].push(l),Se(t.successors(l),a)}}o(a,"dfs");var s=Mc(r,function(l){return t.node(l).rank});return Se(s,a),i}var aie=M(()=>{"use strict";Ht();o(iie,"initOrder")});function sie(t,e){return Qe(e,function(r){var n=t.inEdges(r);if(n.length){var i=qr(n,function(a,s){var l=t.edge(s),u=t.node(s.v);return{sum:a.sum+l.weight*u.order,weight:a.weight+l.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}var oie=M(()=>{"use strict";Ht();o(sie,"barycenter")});function lie(t,e){var r={};Se(t,function(i,a){var s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};dr(i.barycenter)||(s.barycenter=i.barycenter,s.weight=i.weight)}),Se(e.edges(),function(i){var a=r[i.v],s=r[i.w];!dr(a)&&!dr(s)&&(s.indegree++,a.out.push(r[i.w]))});var n=Yr(r,function(i){return!i.indegree});return GIe(n)}function GIe(t){var e=[];function r(a){return function(s){s.merged||(dr(s.barycenter)||dr(a.barycenter)||s.barycenter>=a.barycenter)&&$Ie(a,s)}}o(r,"handleIn");function n(a){return function(s){s.in.push(a),--s.indegree===0&&t.push(s)}}for(o(n,"handleOut");t.length;){var i=t.pop();e.push(i),Se(i.in.reverse(),r(i)),Se(i.out,n(i))}return Qe(Yr(e,function(a){return!a.merged}),function(a){return Wd(a,["vs","i","barycenter","weight"])})}function $Ie(t,e){var r=0,n=0;t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.vs=e.vs.concat(t.vs),t.barycenter=r/n,t.weight=n,t.i=Math.min(e.i,t.i),e.merged=!0}var cie=M(()=>{"use strict";Ht();o(lie,"resolveConflicts");o(GIe,"doResolveConflicts");o($Ie,"mergeEntries")});function hie(t,e){var r=gne(t,function(f){return Object.prototype.hasOwnProperty.call(f,"barycenter")}),n=r.lhs,i=Mc(r.rhs,function(f){return-f.i}),a=[],s=0,l=0,u=0;n.sort(VIe(!!e)),u=uie(a,i,u),Se(n,function(f){u+=f.vs.length,a.push(f.vs),s+=f.barycenter*f.weight,l+=f.weight,u=uie(a,i,u)});var h={vs:Wr(a)};return l&&(h.barycenter=s/l,h.weight=l),h}function uie(t,e,r){for(var n;e.length&&(n=xa(e)).i<=r;)e.pop(),t.push(n.vs),r++;return r}function VIe(t){return function(e,r){return e.barycenterr.barycenter?1:t?r.i-e.i:e.i-r.i}}var fie=M(()=>{"use strict";Ht();Oc();o(hie,"sort");o(uie,"consumeUnsortable");o(VIe,"compareWithBias")});function ED(t,e,r,n){var i=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,l=a?a.borderRight:void 0,u={};s&&(i=Yr(i,function(g){return g!==s&&g!==l}));var h=sie(t,i);Se(h,function(g){if(t.children(g.v).length){var y=ED(t,g.v,r,n);u[g.v]=y,Object.prototype.hasOwnProperty.call(y,"barycenter")&&HIe(g,y)}});var f=lie(h,r);UIe(f,u);var d=hie(f,n);if(s&&(d.vs=Wr([s,d.vs,l]),t.predecessors(s).length)){var p=t.node(t.predecessors(s)[0]),m=t.node(t.predecessors(l)[0]);Object.prototype.hasOwnProperty.call(d,"barycenter")||(d.barycenter=0,d.weight=0),d.barycenter=(d.barycenter*d.weight+p.order+m.order)/(d.weight+2),d.weight+=2}return d}function UIe(t,e){Se(t,function(r){r.vs=Wr(r.vs.map(function(n){return e[n]?e[n].vs:n}))})}function HIe(t,e){dr(t.barycenter)?(t.barycenter=e.barycenter,t.weight=e.weight):(t.barycenter=(t.barycenter*t.weight+e.barycenter*e.weight)/(t.weight+e.weight),t.weight+=e.weight)}var die=M(()=>{"use strict";Ht();oie();cie();fie();o(ED,"sortSubgraph");o(UIe,"expandSubgraphs");o(HIe,"mergeBarycenters")});function gie(t){var e=oD(t),r=pie(t,jo(1,e+1),"inEdges"),n=pie(t,jo(e-1,-1,-1),"outEdges"),i=iie(t);mie(t,i);for(var a=Number.POSITIVE_INFINITY,s,l=0,u=0;u<4;++l,++u){WIe(l%2?r:n,l%4>=2),i=sf(t);var h=rie(t,i);h{"use strict";Ht();Gs();Oc();Jne();tie();nie();aie();die();o(gie,"order");o(pie,"buildLayerGraphs");o(WIe,"sweepLayerGraphs");o(mie,"assignOrder")});function vie(t){var e=qIe(t);Se(t.graph().dummyChains,function(r){for(var n=t.node(r),i=n.edgeObj,a=YIe(t,e,i.v,i.w),s=a.path,l=a.lca,u=0,h=s[u],f=!0;r!==i.w;){if(n=t.node(r),f){for(;(h=s[u])!==l&&t.node(h).maxRanks||l>e[u].lim));for(h=u,u=n;(u=t.parent(u))!==h;)a.push(u);return{path:i.concat(a.reverse()),lca:h}}function qIe(t){var e={},r=0;function n(i){var a=r;Se(t.children(i),n),e[i]={low:a,lim:r++}}return o(n,"dfs"),Se(t.children(),n),e}var xie=M(()=>{"use strict";Ht();o(vie,"parentDummyChains");o(YIe,"findPath");o(qIe,"postorder")});function XIe(t,e){var r={};function n(i,a){var s=0,l=0,u=i.length,h=xa(a);return Se(a,function(f,d){var p=KIe(t,f),m=p?t.node(p).order:u;(p||f===h)&&(Se(a.slice(l,d+1),function(g){Se(t.predecessors(g),function(y){var v=t.node(y),x=v.order;(xh)&&bie(r,p,f)})})}o(n,"scan");function i(a,s){var l=-1,u,h=0;return Se(s,function(f,d){if(t.node(f).dummy==="border"){var p=t.predecessors(f);p.length&&(u=t.node(p[0]).order,n(s,h,d,l,u),h=d,l=u)}n(s,h,s.length,u,a.length)}),s}return o(i,"visitLayer"),qr(e,i),r}function KIe(t,e){if(t.node(e).dummy)return as(t.predecessors(e),function(r){return t.node(r).dummy})}function bie(t,e,r){if(e>r){var n=e;e=r,r=n}var i=t[e];i||(t[e]=i={}),i[r]=!0}function QIe(t,e,r){if(e>r){var n=e;e=r,r=n}return!!t[e]&&Object.prototype.hasOwnProperty.call(t[e],r)}function ZIe(t,e,r,n){var i={},a={},s={};return Se(e,function(l){Se(l,function(u,h){i[u]=u,a[u]=u,s[u]=h})}),Se(e,function(l){var u=-1;Se(l,function(h){var f=n(h);if(f.length){f=Mc(f,function(y){return s[y]});for(var d=(f.length-1)/2,p=Math.floor(d),m=Math.ceil(d);p<=m;++p){var g=f[p];a[h]===h&&u{"use strict";Ht();Gs();Oc();o(XIe,"findType1Conflicts");o(jIe,"findType2Conflicts");o(KIe,"findOtherInnerSegmentNode");o(bie,"addConflict");o(QIe,"hasConflict");o(ZIe,"verticalAlignment");o(JIe,"horizontalCompaction");o(eOe,"buildBlockGraph");o(tOe,"findSmallestWidthAlignment");o(rOe,"alignCoordinates");o(nOe,"balance");o(wie,"positionX");o(iOe,"sep");o(aOe,"width")});function kie(t){t=gT(t),sOe(t),HL(wie(t),function(e,r){t.node(r).x=e})}function sOe(t){var e=sf(t),r=t.graph().ranksep,n=0;Se(e,function(i){var a=Fs(Qe(i,function(s){return t.node(s).height}));Se(i,function(s){t.node(s).y=n+a/2}),n+=a+r})}var Eie=M(()=>{"use strict";Ht();Oc();Tie();o(kie,"position");o(sOe,"positionY")});function Gu(t,e){var r=e&&e.debugTiming?yne:vne;r("layout",()=>{var n=r(" buildLayoutGraph",()=>yOe(t));r(" runLayout",()=>oOe(n,r)),r(" updateInputGraph",()=>lOe(t,n))})}function oOe(t,e){e(" makeSpaceForEdgeLabels",()=>vOe(t)),e(" removeSelfEdges",()=>AOe(t)),e(" acyclic",()=>une(t)),e(" nestingGraph.run",()=>Xne(t)),e(" rank",()=>TD(gT(t))),e(" injectEdgeLabelProxies",()=>xOe(t)),e(" removeEmptyRanks",()=>mne(t)),e(" nestingGraph.cleanup",()=>Kne(t)),e(" normalizeRanks",()=>pne(t)),e(" assignRankMinMax",()=>bOe(t)),e(" removeEdgeLabelProxies",()=>wOe(t)),e(" normalize.run",()=>Ane(t)),e(" parentDummyChains",()=>vie(t)),e(" addBorderSegments",()=>bne(t)),e(" order",()=>gie(t)),e(" insertSelfEdges",()=>_Oe(t)),e(" adjustCoordinateSystem",()=>kne(t)),e(" position",()=>kie(t)),e(" positionSelfEdges",()=>LOe(t)),e(" removeBorderNodes",()=>COe(t)),e(" normalize.undo",()=>_ne(t)),e(" fixupEdgeLabelCoords",()=>EOe(t)),e(" undoCoordinateSystem",()=>Ene(t)),e(" translateGraph",()=>TOe(t)),e(" assignNodeIntersects",()=>kOe(t)),e(" reversePoints",()=>SOe(t)),e(" acyclic.undo",()=>hne(t))}function lOe(t,e){Se(t.nodes(),function(r){var n=t.node(r),i=e.node(r);n&&(n.x=i.x,n.y=i.y,e.children(r).length&&(n.width=i.width,n.height=i.height))}),Se(t.edges(),function(r){var n=t.edge(r),i=e.edge(r);n.points=i.points,Object.prototype.hasOwnProperty.call(i,"x")&&(n.x=i.x,n.y=i.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}function yOe(t){var e=new Ir({multigraph:!0,compound:!0}),r=CD(t.graph());return e.setGraph(Uh({},uOe,SD(r,cOe),Wd(r,hOe))),Se(t.nodes(),function(n){var i=CD(t.node(n));e.setNode(n,rf(SD(i,fOe),dOe)),e.setParent(n,t.parent(n))}),Se(t.edges(),function(n){var i=CD(t.edge(n));e.setEdge(n,Uh({},mOe,SD(i,pOe),Wd(i,gOe)))}),e}function vOe(t){var e=t.graph();e.ranksep/=2,Se(t.edges(),function(r){var n=t.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function xOe(t){Se(t.edges(),function(e){var r=t.edge(e);if(r.width&&r.height){var n=t.node(e.v),i=t.node(e.w),a={rank:(i.rank-n.rank)/2+n.rank,e};Ic(t,"edge-proxy",a,"_ep")}})}function bOe(t){var e=0;Se(t.nodes(),function(r){var n=t.node(r);n.borderTop&&(n.minRank=t.node(n.borderTop).rank,n.maxRank=t.node(n.borderBottom).rank,e=Fs(e,n.maxRank))}),t.graph().maxRank=e}function wOe(t){Se(t.nodes(),function(e){var r=t.node(e);r.dummy==="edge-proxy"&&(t.edge(r.e).labelRank=r.rank,t.removeNode(e))})}function TOe(t){var e=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,a=t.graph(),s=a.marginx||0,l=a.marginy||0;function u(h){var f=h.x,d=h.y,p=h.width,m=h.height;e=Math.min(e,f-p/2),r=Math.max(r,f+p/2),n=Math.min(n,d-m/2),i=Math.max(i,d+m/2)}o(u,"getExtremes"),Se(t.nodes(),function(h){u(t.node(h))}),Se(t.edges(),function(h){var f=t.edge(h);Object.prototype.hasOwnProperty.call(f,"x")&&u(f)}),e-=s,n-=l,Se(t.nodes(),function(h){var f=t.node(h);f.x-=e,f.y-=n}),Se(t.edges(),function(h){var f=t.edge(h);Se(f.points,function(d){d.x-=e,d.y-=n}),Object.prototype.hasOwnProperty.call(f,"x")&&(f.x-=e),Object.prototype.hasOwnProperty.call(f,"y")&&(f.y-=n)}),a.width=r-e+s,a.height=i-n+l}function kOe(t){Se(t.edges(),function(e){var r=t.edge(e),n=t.node(e.v),i=t.node(e.w),a,s;r.points?(a=r.points[0],s=r.points[r.points.length-1]):(r.points=[],a=i,s=n),r.points.unshift(aD(n,a)),r.points.push(aD(i,s))})}function EOe(t){Se(t.edges(),function(e){var r=t.edge(e);if(Object.prototype.hasOwnProperty.call(r,"x"))switch((r.labelpos==="l"||r.labelpos==="r")&&(r.width-=r.labeloffset),r.labelpos){case"l":r.x-=r.width/2+r.labeloffset;break;case"r":r.x+=r.width/2+r.labeloffset;break}})}function SOe(t){Se(t.edges(),function(e){var r=t.edge(e);r.reversed&&r.points.reverse()})}function COe(t){Se(t.nodes(),function(e){if(t.children(e).length){var r=t.node(e),n=t.node(r.borderTop),i=t.node(r.borderBottom),a=t.node(xa(r.borderLeft)),s=t.node(xa(r.borderRight));r.width=Math.abs(s.x-a.x),r.height=Math.abs(i.y-n.y),r.x=a.x+r.width/2,r.y=n.y+r.height/2}}),Se(t.nodes(),function(e){t.node(e).dummy==="border"&&t.removeNode(e)})}function AOe(t){Se(t.edges(),function(e){if(e.v===e.w){var r=t.node(e.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}})}function _Oe(t){var e=sf(t);Se(e,function(r){var n=0;Se(r,function(i,a){var s=t.node(i);s.order=a+n,Se(s.selfEdges,function(l){Ic(t,"selfedge",{width:l.label.width,height:l.label.height,rank:s.rank,order:a+ ++n,e:l.e,label:l.label},"_se")}),delete s.selfEdges})})}function LOe(t){Se(t.nodes(),function(e){var r=t.node(e);if(r.dummy==="selfedge"){var n=t.node(r.e.v),i=n.x+n.width/2,a=n.y,s=r.x-i,l=n.height/2;t.setEdge(r.e,r.label),t.removeNode(e),r.label.points=[{x:i+2*s/3,y:a-l},{x:i+5*s/6,y:a-l},{x:i+s,y:a},{x:i+5*s/6,y:a+l},{x:i+2*s/3,y:a+l}],r.label.x=r.x,r.label.y=r.y}})}function SD(t,e){return Ud(Wd(t,e),Number)}function CD(t){var e={};return Se(t,function(r,n){e[n.toLowerCase()]=r}),e}var cOe,uOe,hOe,fOe,dOe,pOe,mOe,gOe,Sie=M(()=>{"use strict";Ht();Gs();wne();Cne();iD();uD();kD();Qne();yie();xie();Eie();Oc();o(Gu,"layout");o(oOe,"runLayout");o(lOe,"updateInputGraph");cOe=["nodesep","edgesep","ranksep","marginx","marginy"],uOe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},hOe=["acyclicer","ranker","rankdir","align"],fOe=["width","height"],dOe={width:0,height:0},pOe=["minlen","weight","width","height","labeloffset"],mOe={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},gOe=["labelpos"];o(yOe,"buildLayoutGraph");o(vOe,"makeSpaceForEdgeLabels");o(xOe,"injectEdgeLabelProxies");o(bOe,"assignRankMinMax");o(wOe,"removeEdgeLabelProxies");o(TOe,"translateGraph");o(kOe,"assignNodeIntersects");o(EOe,"fixupEdgeLabelCoords");o(SOe,"reversePointsForReversedEdges");o(COe,"removeBorderNodes");o(AOe,"removeSelfEdges");o(_Oe,"insertSelfEdges");o(LOe,"positionSelfEdges");o(SD,"selectNumberAttrs");o(CD,"canonicalize")});var Qv=M(()=>{"use strict";iD();Sie();uD();kD()});function Ko(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:DOe(t),edges:NOe(t)};return dr(t.graph())||(e.value=rn(t.graph())),e}function DOe(t){return Qe(t.nodes(),function(e){var r=t.node(e),n=t.parent(e),i={v:e};return dr(r)||(i.value=r),dr(n)||(i.parent=n),i})}function NOe(t){return Qe(t.edges(),function(e){var r=t.edge(e),n={v:e.v,w:e.w};return dr(e.name)||(n.name=e.name),dr(r)||(n.value=r),n})}var AD=M(()=>{"use strict";Ht();pT();o(Ko,"write");o(DOe,"writeNodes");o(NOe,"writeEdges")});var wr,jd,_ie,Lie,bT,ROe,Die,Nie,MOe,Km,Aie,Rie,Mie,Iie,Oie,Pie=M(()=>{"use strict";ut();Gs();AD();wr=new Map,jd=new Map,_ie=new Map,Lie=o(()=>{jd.clear(),_ie.clear(),wr.clear()},"clear"),bT=o((t,e)=>{let r=jd.get(e)||[];return Y.trace("In isDescendant",e," ",t," = ",r.includes(t)),r.includes(t)},"isDescendant"),ROe=o((t,e)=>{let r=jd.get(e)||[];return Y.info("Descendants of ",e," is ",r),Y.info("Edge is ",t),t.v===e||t.w===e?!1:r?r.includes(t.v)||bT(t.v,e)||bT(t.w,e)||r.includes(t.w):(Y.debug("Tilt, ",e,",not in descendants"),!1)},"edgeInCluster"),Die=o((t,e,r,n)=>{Y.warn("Copying children of ",t,"root",n,"data",e.node(t),n);let i=e.children(t)||[];t!==n&&i.push(t),Y.warn("Copying (nodes) clusterId",t,"nodes",i),i.forEach(a=>{if(e.children(a).length>0)Die(a,e,r,n);else{let s=e.node(a);Y.info("cp ",a," to ",n," with parent ",t),r.setNode(a,s),n!==e.parent(a)&&(Y.warn("Setting parent",a,e.parent(a)),r.setParent(a,e.parent(a))),t!==n&&a!==t?(Y.debug("Setting parent",a,t),r.setParent(a,t)):(Y.info("In copy ",t,"root",n,"data",e.node(t),n),Y.debug("Not Setting parent for node=",a,"cluster!==rootId",t!==n,"node!==clusterId",a!==t));let l=e.edges(a);Y.debug("Copying Edges",l),l.forEach(u=>{Y.info("Edge",u);let h=e.edge(u.v,u.w,u.name);Y.info("Edge data",h,n);try{ROe(u,n)?(Y.info("Copying as ",u.v,u.w,h,u.name),r.setEdge(u.v,u.w,h,u.name),Y.info("newGraph edges ",r.edges(),r.edge(r.edges()[0]))):Y.info("Skipping copy of edge ",u.v,"-->",u.w," rootId: ",n," clusterId:",t)}catch(f){Y.error(f)}})}Y.debug("Removing node",a),e.removeNode(a)})},"copy"),Nie=o((t,e)=>{let r=e.children(t),n=[...r];for(let i of r)_ie.set(i,t),n=[...n,...Nie(i,e)];return n},"extractDescendants"),MOe=o((t,e,r)=>{let n=t.edges().filter(u=>u.v===e||u.w===e),i=t.edges().filter(u=>u.v===r||u.w===r),a=n.map(u=>({v:u.v===e?r:u.v,w:u.w===e?e:u.w})),s=i.map(u=>({v:u.v,w:u.w}));return a.filter(u=>s.some(h=>u.v===h.v&&u.w===h.w))},"findCommonEdges"),Km=o((t,e,r)=>{let n=e.children(t);if(Y.trace("Searching children of id ",t,n),n.length<1)return t;let i;for(let a of n){let s=Km(a,e,r),l=MOe(e,r,s);if(s)if(l.length>0)i=s;else return s}return i},"findNonClusterChild"),Aie=o(t=>!wr.has(t)||!wr.get(t).externalConnections?t:wr.has(t)?wr.get(t).id:t,"getAnchorId"),Rie=o((t,e)=>{if(!t||e>10){Y.debug("Opting out, no graph ");return}else Y.debug("Opting in, graph ");t.nodes().forEach(function(r){t.children(r).length>0&&(Y.warn("Cluster identified",r," Replacement id in edges: ",Km(r,t,r)),jd.set(r,Nie(r,t)),wr.set(r,{id:Km(r,t,r),clusterData:t.node(r)}))}),t.nodes().forEach(function(r){let n=t.children(r),i=t.edges();n.length>0?(Y.debug("Cluster identified",r,jd),i.forEach(a=>{let s=bT(a.v,r),l=bT(a.w,r);s^l&&(Y.warn("Edge: ",a," leaves cluster ",r),Y.warn("Descendants of XXX ",r,": ",jd.get(r)),wr.get(r).externalConnections=!0)})):Y.debug("Not a cluster ",r,jd)});for(let r of wr.keys()){let n=wr.get(r).id,i=t.parent(n);i!==r&&wr.has(i)&&!wr.get(i).externalConnections&&(wr.get(r).id=i)}t.edges().forEach(function(r){let n=t.edge(r);Y.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),Y.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(t.edge(r)));let i=r.v,a=r.w;if(Y.warn("Fix XXX",wr,"ids:",r.v,r.w,"Translating: ",wr.get(r.v)," --- ",wr.get(r.w)),wr.get(r.v)||wr.get(r.w)){if(Y.warn("Fixing and trying - removing XXX",r.v,r.w,r.name),i=Aie(r.v),a=Aie(r.w),t.removeEdge(r.v,r.w,r.name),i!==r.v){let s=t.parent(i);wr.get(s).externalConnections=!0,n.fromCluster=r.v}if(a!==r.w){let s=t.parent(a);wr.get(s).externalConnections=!0,n.toCluster=r.w}Y.warn("Fix Replacing with XXX",i,a,r.name),t.setEdge(i,a,n,r.name)}}),Y.warn("Adjusted Graph",Ko(t)),Mie(t,0),Y.trace(wr)},"adjustClustersAndEdges"),Mie=o((t,e)=>{if(Y.warn("extractor - ",e,Ko(t),t.children("D")),e>10){Y.error("Bailing out");return}let r=t.nodes(),n=!1;for(let i of r){let a=t.children(i);n=n||a.length>0}if(!n){Y.debug("Done, no node has children",t.nodes());return}Y.debug("Nodes = ",r,e);for(let i of r)if(Y.debug("Extracting node",i,wr,wr.has(i)&&!wr.get(i).externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),!wr.has(i))Y.debug("Not a cluster",i,e);else if(!wr.get(i).externalConnections&&t.children(i)&&t.children(i).length>0){Y.warn("Cluster without external connections, without a parent and with children",i,e);let s=t.graph().rankdir==="TB"?"LR":"TB";wr.get(i)?.clusterData?.dir&&(s=wr.get(i).clusterData.dir,Y.warn("Fixing dir",wr.get(i).clusterData.dir,s));let l=new Ir({multigraph:!0,compound:!0}).setGraph({rankdir:s,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});Y.warn("Old graph before copy",Ko(t)),Die(i,t,l,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:wr.get(i).clusterData,label:wr.get(i).label,graph:l}),Y.warn("New graph after copy node: (",i,")",Ko(l)),Y.debug("Old graph after copy",Ko(t))}else Y.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!wr.get(i).externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),Y.debug(wr);r=t.nodes(),Y.warn("New list of nodes",r);for(let i of r){let a=t.node(i);Y.warn(" Now next level",i,a),a?.clusterNode&&Mie(a.graph,e+1)}},"extractor"),Iie=o((t,e)=>{if(e.length===0)return[];let r=Object.assign([],e);return e.forEach(n=>{let i=t.children(n),a=Iie(t,i);r=[...r,...a]}),r},"sorter"),Oie=o(t=>Iie(t,t.children()),"sortNodesByHierarchy")});var Fie={};vr(Fie,{render:()=>IOe});var Bie,IOe,zie=M(()=>{"use strict";Qv();AD();Gs();fL();Ot();Pie();vw();lw();hL();ut();$v();Vt();Bie=o(async(t,e,r,n,i,a)=>{Y.warn("Graph in recursive render:XAX",Ko(e),i);let s=e.graph().rankdir;Y.trace("Dir in recursive render - dir:",s);let l=t.insert("g").attr("class","root");e.nodes()?Y.info("Recursive render XXX",e.nodes()):Y.info("No nodes found for",e),e.edges().length>0&&Y.info("Recursive edges",e.edge(e.edges()[0]));let u=l.insert("g").attr("class","clusters"),h=l.insert("g").attr("class","edgePaths"),f=l.insert("g").attr("class","edgeLabels"),d=l.insert("g").attr("class","nodes");await Promise.all(e.nodes().map(async function(y){let v=e.node(y);if(i!==void 0){let x=JSON.parse(JSON.stringify(i.clusterData));Y.trace(`Setting data for parent cluster XXX + Node.id = `,y,` + data=`,x.height,` +Parent cluster`,i.height),e.setNode(i.id,x),e.parent(y)||(Y.trace("Setting parent",y,i.id),e.setParent(y,i.id,x))}if(Y.info("(Insert) Node XXX"+y+": "+JSON.stringify(e.node(y))),v?.clusterNode){Y.info("Cluster identified XBX",y,v.width,e.node(y));let{ranksep:x,nodesep:b}=e.graph();v.graph.setGraph({...v.graph.graph(),ranksep:x+25,nodesep:b});let w=await Bie(d,v.graph,r,n,e.node(y),a),_=w.elem;je(v,_),v.diff=w.diff||0,Y.info("New compound node after recursive render XAX",y,"width",v.width,"height",v.height),rJ(_,v)}else e.children(y).length>0?(Y.trace("Cluster - the non recursive path XBX",y,v.id,v,v.width,"Graph:",e),Y.trace(Km(v.id,e)),wr.set(v.id,{id:Km(v.id,e),node:v})):(Y.trace("Node - the non recursive path XAX",y,d,e.node(y),s),await Lm(d,e.node(y),{config:a,dir:s}))})),await o(async()=>{let y=e.edges().map(async function(v){let x=e.edge(v.v,v.w,v.name);Y.info("Edge "+v.v+" -> "+v.w+": "+JSON.stringify(v)),Y.info("Edge "+v.v+" -> "+v.w+": ",v," ",JSON.stringify(e.edge(v))),Y.info("Fix",wr,"ids:",v.v,v.w,"Translating: ",wr.get(v.v),wr.get(v.w)),await dw(f,x)});await Promise.all(y)},"processEdges")(),Y.info("Graph before layout:",JSON.stringify(Ko(e))),Y.info("############################################# XXX"),Y.info("### Layout ### XXX"),Y.info("############################################# XXX"),Gu(e),Y.info("Graph after layout:",JSON.stringify(Ko(e)));let m=0,{subGraphTitleTotalMargin:g}=Fu(a);return await Promise.all(Oie(e).map(async function(y){let v=e.node(y);if(Y.info("Position XBX => "+y+": ("+v.x,","+v.y,") width: ",v.width," height: ",v.height),v?.clusterNode)v.y+=g,Y.info("A tainted cluster node XBX1",y,v.id,v.width,v.height,v.x,v.y,e.parent(y)),wr.get(v.id).node=v,Uv(v);else if(e.children(y).length>0){Y.info("A pure cluster node XBX1",y,v.id,v.x,v.y,v.width,v.height,e.parent(y)),v.height+=g,e.node(v.parentId);let x=v?.padding/2||0,b=v?.labelBBox?.height||0,w=b-x||0;Y.debug("OffsetY",w,"labelHeight",b,"halfPadding",x),await _m(u,v),wr.get(v.id).node=v}else{let x=e.node(v.parentId);v.y+=g/2,Y.info("A regular node XBX1 - using the padding",v.id,"parent",v.parentId,v.width,v.height,v.x,v.y,"offsetY",v.offsetY,"parent",x,x?.offsetY,v),Uv(v)}})),e.edges().forEach(function(y){let v=e.edge(y);Y.info("Edge "+y.v+" -> "+y.w+": "+JSON.stringify(v),v),v.points.forEach(_=>_.y+=g/2);let x=e.node(y.v);var b=e.node(y.w);let w=mw(h,v,wr,r,x,b,n);pw(v,w)}),e.nodes().forEach(function(y){let v=e.node(y);Y.info(y,v.type,v.diff),v.isGroup&&(m=v.diff)}),Y.warn("Returning from recursive render XAX",l,m),{elem:l,diff:m}},"recursiveRender"),IOe=o(async(t,e)=>{let r=new Ir({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.config?.flowchart?.nodeSpacing||t.nodeSpacing,ranksep:t.config?.rankSpacing||t.config?.flowchart?.rankSpacing||t.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=e.select("g");gw(n,t.markers,t.type,t.diagramId),nJ(),tJ(),jZ(),Lie(),t.nodes.forEach(a=>{r.setNode(a.id,{...a}),a.parentId&&r.setParent(a.id,a.parentId)}),Y.debug("Edges:",t.edges),t.edges.forEach(a=>{if(a.start===a.end){let s=a.start,l=s+"---"+s+"---1",u=s+"---"+s+"---2",h=r.node(s);r.setNode(l,{domId:l,id:l,parentId:h.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),r.setParent(l,h.parentId),r.setNode(u,{domId:u,id:u,parentId:h.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),r.setParent(u,h.parentId);let f=structuredClone(a),d=structuredClone(a),p=structuredClone(a);f.label="",f.arrowTypeEnd="none",f.id=s+"-cyclic-special-1",d.arrowTypeEnd="none",d.id=s+"-cyclic-special-mid",p.label="",h.isGroup&&(f.fromCluster=s,p.toCluster=s),p.id=s+"-cyclic-special-2",r.setEdge(s,l,f,s+"-cyclic-special-0"),r.setEdge(l,u,d,s+"-cyclic-special-1"),r.setEdge(u,s,p,s+"-cyc{"use strict";aJ();ut();Zv={},_D=o(t=>{for(let e of t)Zv[e.name]=e},"registerLayoutLoaders"),OOe=o(()=>{_D([{name:"dagre",loader:o(async()=>await Promise.resolve().then(()=>(zie(),Fie)),"loader")}])},"registerDefaultLayoutLoaders");OOe();Qm=o(async(t,e)=>{if(!(t.layoutAlgorithm in Zv))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);let r=Zv[t.layoutAlgorithm];return(await r.loader()).render(t,e,iJ,{algorithm:r.algorithm})},"render"),wT=o((t="",{fallback:e="dagre"}={})=>{if(t in Zv)return t;if(e in Zv)return Y.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")});var Zm,POe,BOe,TT=M(()=>{"use strict";ai();ut();Zm=o((t,e,r,n)=>{t.attr("class",r);let{width:i,height:a,x:s,y:l}=POe(t,e);Zr(t,a,i,n);let u=BOe(s,l,i,a,e);t.attr("viewBox",u),Y.debug(`viewBox configured: ${u} with padding: ${e}`)},"setupViewPortForSVG"),POe=o((t,e)=>{let r=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:r.width+e*2,height:r.height+e*2,x:r.x,y:r.y}},"calculateDimensionsWithPadding"),BOe=o((t,e,r,n,i)=>`${t-i} ${e-i} ${r} ${n}`,"createViewBox")});var FOe,zOe,Gie,$ie=M(()=>{"use strict";pr();Vt();ut();ow();Jv();TT();hr();cL();FOe=o(function(t,e){return e.db.getClasses()},"getClasses"),zOe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing state diagram (v2)",e);let{securityLevel:i,flowchart:a,layout:s}=pe(),l;i==="sandbox"&&(l=Ve("#i"+e));let u=i==="sandbox"?l.nodes()[0].contentDocument:document;Y.debug("Before getData: ");let h=n.db.getData();Y.debug("Data: ",h);let f=Am(e,i),d=lL();h.type=n.type,h.layoutAlgorithm=wT(s),h.layoutAlgorithm==="dagre"&&s==="elk"&&Y.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),h.direction=d,h.nodeSpacing=a?.nodeSpacing||50,h.rankSpacing=a?.rankSpacing||50,h.markers=["point","circle","cross"],h.diagramId=e,Y.debug("REF1:",h),await Qm(h,f);let p=h.config.flowchart?.diagramPadding??8;Ut.insertTitle(f,"flowchartTitleText",a?.titleTopMargin||0,n.db.getDiagramTitle()),Zm(f,p,"flowchart",a?.useMaxWidth||!1);for(let m of h.nodes){let g=Ve(`#${e} [id="${m.id}"]`);if(!g||!m.link)continue;let y=u.createElementNS("http://www.w3.org/2000/svg","a");y.setAttributeNS("http://www.w3.org/2000/svg","class",m.cssClasses),y.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),i==="sandbox"?y.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):m.linkTarget&&y.setAttributeNS("http://www.w3.org/2000/svg","target",m.linkTarget);let v=g.insert(function(){return y},":first-child"),x=g.select(".label-container");x&&v.append(function(){return x.node()});let b=g.select(".label");b&&v.append(function(){return b.node()})}},"draw"),Gie={getClasses:FOe,draw:zOe}});var LD,Vie,Uie=M(()=>{"use strict";LD=function(){var t=o(function(ki,At,Pt,wt){for(Pt=Pt||{},wt=ki.length;wt--;Pt[ki[wt]]=At);return Pt},"o"),e=[1,4],r=[1,3],n=[1,5],i=[1,8,9,10,11,27,34,36,38,44,60,83,84,85,86,87,88,101,104,105,108,110,113,114,115,120,121,122,123],a=[2,2],s=[1,13],l=[1,14],u=[1,15],h=[1,16],f=[1,23],d=[1,25],p=[1,26],m=[1,27],g=[1,49],y=[1,48],v=[1,29],x=[1,30],b=[1,31],w=[1,32],_=[1,33],T=[1,44],E=[1,46],L=[1,42],S=[1,47],A=[1,43],I=[1,50],D=[1,45],k=[1,51],R=[1,52],C=[1,34],O=[1,35],N=[1,36],P=[1,37],F=[1,57],B=[1,8,9,10,11,27,32,34,36,38,44,60,83,84,85,86,87,88,101,104,105,108,110,113,114,115,120,121,122,123],G=[1,61],z=[1,60],W=[1,62],Z=[8,9,11,75,77],j=[1,77],oe=[1,90],K=[1,95],ee=[1,94],J=[1,91],H=[1,87],q=[1,93],Q=[1,89],ae=[1,96],ue=[1,92],ce=[1,97],te=[1,88],Ne=[8,9,10,11,40,75,77],se=[8,9,10,11,40,46,75,77],ke=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,88,101,104,105,108,110,113,114,115],Re=[8,9,11,44,60,75,77,88,101,104,105,108,110,113,114,115],Ce=[44,60,88,101,104,105,108,110,113,114,115],Pe=[1,123],Ie=[1,122],$e=[1,130],ye=[1,144],X=[1,145],fe=[1,146],he=[1,147],ge=[1,132],ne=[1,134],ve=[1,138],U=[1,139],Te=[1,140],ie=[1,141],Ee=[1,142],Ae=[1,143],Ge=[1,148],Be=[1,149],me=[1,128],He=[1,129],Oe=[1,136],et=[1,131],bt=[1,135],kt=[1,133],vt=[8,9,10,11,27,32,34,36,38,44,60,83,84,85,86,87,88,101,104,105,108,110,113,114,115,120,121,122,123],rt=[1,151],yt=[1,153],Ue=[8,9,11],tt=[8,9,10,11,14,44,60,88,104,105,108,110,113,114,115],ht=[1,173],Et=[1,169],er=[1,170],dt=[1,174],Je=[1,171],ct=[1,172],Ct=[77,115,118],pt=[8,9,10,11,12,14,27,29,32,44,60,75,83,84,85,86,87,88,89,104,108,110,113,114,115],Bt=[10,105],Tr=[31,49,51,53,55,57,62,64,66,67,69,71,115,116,117],yr=[1,242],or=[1,240],ln=[1,244],Or=[1,238],ii=[1,239],mn=[1,241],On=[1,243],_r=[1,245],mi=[1,263],vs=[8,9,11,105],Pn=[8,9,10,11,60,83,104,105,108,109,110,111],So={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,edgeTextToken:78,STR:79,MD_STR:80,textToken:81,keywords:82,STYLE:83,LINKSTYLE:84,CLASSDEF:85,CLASS:86,CLICK:87,DOWN:88,UP:89,textNoTagsToken:90,stylesOpt:91,"idString[vertex]":92,"idString[class]":93,CALLBACKNAME:94,CALLBACKARGS:95,HREF:96,LINK_TARGET:97,"STR[link]":98,"STR[tooltip]":99,alphaNum:100,DEFAULT:101,numList:102,INTERPOLATE:103,NUM:104,COMMA:105,style:106,styleComponent:107,NODE_STRING:108,UNIT:109,BRKT:110,PCT:111,idStringToken:112,MINUS:113,MULT:114,UNICODE_TEXT:115,TEXT:116,TAGSTART:117,EDGE_TEXT:118,alphaNumToken:119,direction_tb:120,direction_bt:121,direction_rl:122,direction_lr:123,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",79:"STR",80:"MD_STR",83:"STYLE",84:"LINKSTYLE",85:"CLASSDEF",86:"CLASS",87:"CLICK",88:"DOWN",89:"UP",92:"idString[vertex]",93:"idString[class]",94:"CALLBACKNAME",95:"CALLBACKARGS",96:"HREF",97:"LINK_TARGET",98:"STR[link]",99:"STR[tooltip]",101:"DEFAULT",103:"INTERPOLATE",104:"NUM",105:"COMMA",108:"NODE_STRING",109:"UNIT",110:"BRKT",111:"PCT",113:"MINUS",114:"MULT",115:"UNICODE_TEXT",116:"TEXT",117:"TAGSTART",118:"EDGE_TEXT",120:"direction_tb",121:"direction_bt",122:"direction_rl",123:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[76,1],[76,2],[76,1],[76,1],[72,1],[73,3],[30,1],[30,2],[30,1],[30,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[82,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[102,1],[102,3],[91,1],[91,3],[106,1],[106,2],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[81,1],[81,1],[81,1],[81,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[90,1],[78,1],[78,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[119,1],[47,1],[47,2],[100,1],[100,2],[33,1],[33,1],[33,1],[33,1]],performAction:o(function(At,Pt,wt,We,Ft,de,gn){var xe=de.length-1;switch(Ft){case 2:this.$=[];break;case 3:(!Array.isArray(de[xe])||de[xe].length>0)&&de[xe-1].push(de[xe]),this.$=de[xe-1];break;case 4:case 181:this.$=de[xe];break;case 11:We.setDirection("TB"),this.$="TB";break;case 12:We.setDirection(de[xe-1]),this.$=de[xe-1];break;case 27:this.$=de[xe-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=We.addSubGraph(de[xe-6],de[xe-1],de[xe-4]);break;case 34:this.$=We.addSubGraph(de[xe-3],de[xe-1],de[xe-3]);break;case 35:this.$=We.addSubGraph(void 0,de[xe-1],void 0);break;case 37:this.$=de[xe].trim(),We.setAccTitle(this.$);break;case 38:case 39:this.$=de[xe].trim(),We.setAccDescription(this.$);break;case 43:this.$=de[xe-1]+de[xe];break;case 44:this.$=de[xe];break;case 45:We.addVertex(de[xe-1][0],void 0,void 0,void 0,void 0,void 0,void 0,de[xe]),We.addLink(de[xe-3].stmt,de[xe-1],de[xe-2]),this.$={stmt:de[xe-1],nodes:de[xe-1].concat(de[xe-3].nodes)};break;case 46:We.addLink(de[xe-2].stmt,de[xe],de[xe-1]),this.$={stmt:de[xe],nodes:de[xe].concat(de[xe-2].nodes)};break;case 47:We.addLink(de[xe-3].stmt,de[xe-1],de[xe-2]),this.$={stmt:de[xe-1],nodes:de[xe-1].concat(de[xe-3].nodes)};break;case 48:this.$={stmt:de[xe-1],nodes:de[xe-1]};break;case 49:We.addVertex(de[xe-1][0],void 0,void 0,void 0,void 0,void 0,void 0,de[xe]),this.$={stmt:de[xe-1],nodes:de[xe-1],shapeData:de[xe]};break;case 50:this.$={stmt:de[xe],nodes:de[xe]};break;case 51:this.$=[de[xe]];break;case 52:We.addVertex(de[xe-5][0],void 0,void 0,void 0,void 0,void 0,void 0,de[xe-4]),this.$=de[xe-5].concat(de[xe]);break;case 53:this.$=de[xe-4].concat(de[xe]);break;case 54:this.$=de[xe];break;case 55:this.$=de[xe-2],We.setClass(de[xe-2],de[xe]);break;case 56:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"square");break;case 57:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"doublecircle");break;case 58:this.$=de[xe-5],We.addVertex(de[xe-5],de[xe-2],"circle");break;case 59:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"ellipse");break;case 60:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"stadium");break;case 61:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"subroutine");break;case 62:this.$=de[xe-7],We.addVertex(de[xe-7],de[xe-1],"rect",void 0,void 0,void 0,Object.fromEntries([[de[xe-5],de[xe-3]]]));break;case 63:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"cylinder");break;case 64:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"round");break;case 65:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"diamond");break;case 66:this.$=de[xe-5],We.addVertex(de[xe-5],de[xe-2],"hexagon");break;case 67:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"odd");break;case 68:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"trapezoid");break;case 69:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"inv_trapezoid");break;case 70:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"lean_right");break;case 71:this.$=de[xe-3],We.addVertex(de[xe-3],de[xe-1],"lean_left");break;case 72:this.$=de[xe],We.addVertex(de[xe]);break;case 73:de[xe-1].text=de[xe],this.$=de[xe-1];break;case 74:case 75:de[xe-2].text=de[xe-1],this.$=de[xe-2];break;case 76:this.$=de[xe];break;case 77:var ja=We.destructLink(de[xe],de[xe-2]);this.$={type:ja.type,stroke:ja.stroke,length:ja.length,text:de[xe-1]};break;case 78:this.$={text:de[xe],type:"text"};break;case 79:this.$={text:de[xe-1].text+""+de[xe],type:de[xe-1].type};break;case 80:this.$={text:de[xe],type:"string"};break;case 81:this.$={text:de[xe],type:"markdown"};break;case 82:var ja=We.destructLink(de[xe]);this.$={type:ja.type,stroke:ja.stroke,length:ja.length};break;case 83:this.$=de[xe-1];break;case 84:this.$={text:de[xe],type:"text"};break;case 85:this.$={text:de[xe-1].text+""+de[xe],type:de[xe-1].type};break;case 86:this.$={text:de[xe],type:"string"};break;case 87:case 102:this.$={text:de[xe],type:"markdown"};break;case 99:this.$={text:de[xe],type:"text"};break;case 100:this.$={text:de[xe-1].text+""+de[xe],type:de[xe-1].type};break;case 101:this.$={text:de[xe],type:"text"};break;case 103:this.$=de[xe-4],We.addClass(de[xe-2],de[xe]);break;case 104:this.$=de[xe-4],We.setClass(de[xe-2],de[xe]);break;case 105:case 113:this.$=de[xe-1],We.setClickEvent(de[xe-1],de[xe]);break;case 106:case 114:this.$=de[xe-3],We.setClickEvent(de[xe-3],de[xe-2]),We.setTooltip(de[xe-3],de[xe]);break;case 107:this.$=de[xe-2],We.setClickEvent(de[xe-2],de[xe-1],de[xe]);break;case 108:this.$=de[xe-4],We.setClickEvent(de[xe-4],de[xe-3],de[xe-2]),We.setTooltip(de[xe-4],de[xe]);break;case 109:this.$=de[xe-2],We.setLink(de[xe-2],de[xe]);break;case 110:this.$=de[xe-4],We.setLink(de[xe-4],de[xe-2]),We.setTooltip(de[xe-4],de[xe]);break;case 111:this.$=de[xe-4],We.setLink(de[xe-4],de[xe-2],de[xe]);break;case 112:this.$=de[xe-6],We.setLink(de[xe-6],de[xe-4],de[xe]),We.setTooltip(de[xe-6],de[xe-2]);break;case 115:this.$=de[xe-1],We.setLink(de[xe-1],de[xe]);break;case 116:this.$=de[xe-3],We.setLink(de[xe-3],de[xe-2]),We.setTooltip(de[xe-3],de[xe]);break;case 117:this.$=de[xe-3],We.setLink(de[xe-3],de[xe-2],de[xe]);break;case 118:this.$=de[xe-5],We.setLink(de[xe-5],de[xe-4],de[xe]),We.setTooltip(de[xe-5],de[xe-2]);break;case 119:this.$=de[xe-4],We.addVertex(de[xe-2],void 0,void 0,de[xe]);break;case 120:this.$=de[xe-4],We.updateLink([de[xe-2]],de[xe]);break;case 121:this.$=de[xe-4],We.updateLink(de[xe-2],de[xe]);break;case 122:this.$=de[xe-8],We.updateLinkInterpolate([de[xe-6]],de[xe-2]),We.updateLink([de[xe-6]],de[xe]);break;case 123:this.$=de[xe-8],We.updateLinkInterpolate(de[xe-6],de[xe-2]),We.updateLink(de[xe-6],de[xe]);break;case 124:this.$=de[xe-6],We.updateLinkInterpolate([de[xe-4]],de[xe]);break;case 125:this.$=de[xe-6],We.updateLinkInterpolate(de[xe-4],de[xe]);break;case 126:case 128:this.$=[de[xe]];break;case 127:case 129:de[xe-2].push(de[xe]),this.$=de[xe-2];break;case 131:this.$=de[xe-1]+de[xe];break;case 179:this.$=de[xe];break;case 180:this.$=de[xe-1]+""+de[xe];break;case 182:this.$=de[xe-1]+""+de[xe];break;case 183:this.$={stmt:"dir",value:"TB"};break;case 184:this.$={stmt:"dir",value:"BT"};break;case 185:this.$={stmt:"dir",value:"RL"};break;case 186:this.$={stmt:"dir",value:"LR"};break}},"anonymous"),table:[{3:1,4:2,9:e,10:r,12:n},{1:[3]},t(i,a,{5:6}),{4:7,9:e,10:r,12:n},{4:8,9:e,10:r,12:n},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,83:v,84:x,85:b,86:w,87:_,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R,120:C,121:O,122:N,123:P},t(i,[2,9]),t(i,[2,10]),t(i,[2,11]),{8:[1,54],9:[1,55],10:F,15:53,18:56},t(B,[2,3]),t(B,[2,4]),t(B,[2,5]),t(B,[2,6]),t(B,[2,7]),t(B,[2,8]),{8:G,9:z,11:W,21:58,41:59,72:63,75:[1,64],77:[1,65]},{8:G,9:z,11:W,21:66},{8:G,9:z,11:W,21:67},{8:G,9:z,11:W,21:68},{8:G,9:z,11:W,21:69},{8:G,9:z,11:W,21:70},{8:G,9:z,10:[1,71],11:W,21:72},t(B,[2,36]),{35:[1,73]},{37:[1,74]},t(B,[2,39]),t(Z,[2,50],{18:75,39:76,10:F,40:j}),{10:[1,78]},{10:[1,79]},{10:[1,80]},{10:[1,81]},{14:oe,44:K,60:ee,79:[1,85],88:J,94:[1,82],96:[1,83],100:84,104:H,105:q,108:Q,110:ae,113:ue,114:ce,115:te,119:86},t(B,[2,183]),t(B,[2,184]),t(B,[2,185]),t(B,[2,186]),t(Ne,[2,51]),t(Ne,[2,54],{46:[1,98]}),t(se,[2,72],{112:111,29:[1,99],44:g,48:[1,100],50:[1,101],52:[1,102],54:[1,103],56:[1,104],58:[1,105],60:y,63:[1,106],65:[1,107],67:[1,108],68:[1,109],70:[1,110],88:T,101:E,104:L,105:S,108:A,110:I,113:D,114:k,115:R}),t(ke,[2,179]),t(ke,[2,140]),t(ke,[2,141]),t(ke,[2,142]),t(ke,[2,143]),t(ke,[2,144]),t(ke,[2,145]),t(ke,[2,146]),t(ke,[2,147]),t(ke,[2,148]),t(ke,[2,149]),t(ke,[2,150]),t(i,[2,12]),t(i,[2,18]),t(i,[2,19]),{9:[1,112]},t(Re,[2,26],{18:113,10:F}),t(B,[2,27]),{42:114,43:38,44:g,45:39,47:40,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},t(B,[2,40]),t(B,[2,41]),t(B,[2,42]),t(Ce,[2,76],{73:115,62:[1,117],74:[1,116]}),{76:118,78:119,79:[1,120],80:[1,121],115:Pe,118:Ie},t([44,60,62,74,88,101,104,105,108,110,113,114,115],[2,82]),t(B,[2,28]),t(B,[2,29]),t(B,[2,30]),t(B,[2,31]),t(B,[2,32]),{10:$e,12:ye,14:X,27:fe,28:124,32:he,44:ge,60:ne,75:ve,79:[1,126],80:[1,127],82:137,83:U,84:Te,85:ie,86:Ee,87:Ae,88:Ge,89:Be,90:125,104:me,108:He,110:Oe,113:et,114:bt,115:kt},t(vt,a,{5:150}),t(B,[2,37]),t(B,[2,38]),t(Z,[2,48],{44:rt}),t(Z,[2,49],{18:152,10:F,40:yt}),t(Ne,[2,44]),{44:g,47:154,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},{101:[1,155],102:156,104:[1,157]},{44:g,47:158,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},{44:g,47:159,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},t(Ue,[2,105],{10:[1,160],95:[1,161]}),{79:[1,162]},t(Ue,[2,113],{119:164,10:[1,163],14:oe,44:K,60:ee,88:J,104:H,105:q,108:Q,110:ae,113:ue,114:ce,115:te}),t(Ue,[2,115],{10:[1,165]}),t(tt,[2,181]),t(tt,[2,168]),t(tt,[2,169]),t(tt,[2,170]),t(tt,[2,171]),t(tt,[2,172]),t(tt,[2,173]),t(tt,[2,174]),t(tt,[2,175]),t(tt,[2,176]),t(tt,[2,177]),t(tt,[2,178]),{44:g,47:166,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},{30:167,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:175,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:177,50:[1,176],67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:178,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:179,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:180,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{108:[1,181]},{30:182,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:183,65:[1,184],67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:185,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:186,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{30:187,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},t(ke,[2,180]),t(i,[2,20]),t(Re,[2,25]),t(Z,[2,46],{39:188,18:189,10:F,40:j}),t(Ce,[2,73],{10:[1,190]}),{10:[1,191]},{30:192,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{77:[1,193],78:194,115:Pe,118:Ie},t(Ct,[2,78]),t(Ct,[2,80]),t(Ct,[2,81]),t(Ct,[2,166]),t(Ct,[2,167]),{8:G,9:z,10:$e,11:W,12:ye,14:X,21:196,27:fe,29:[1,195],32:he,44:ge,60:ne,75:ve,82:137,83:U,84:Te,85:ie,86:Ee,87:Ae,88:Ge,89:Be,90:197,104:me,108:He,110:Oe,113:et,114:bt,115:kt},t(pt,[2,99]),t(pt,[2,101]),t(pt,[2,102]),t(pt,[2,155]),t(pt,[2,156]),t(pt,[2,157]),t(pt,[2,158]),t(pt,[2,159]),t(pt,[2,160]),t(pt,[2,161]),t(pt,[2,162]),t(pt,[2,163]),t(pt,[2,164]),t(pt,[2,165]),t(pt,[2,88]),t(pt,[2,89]),t(pt,[2,90]),t(pt,[2,91]),t(pt,[2,92]),t(pt,[2,93]),t(pt,[2,94]),t(pt,[2,95]),t(pt,[2,96]),t(pt,[2,97]),t(pt,[2,98]),{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,198],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,83:v,84:x,85:b,86:w,87:_,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R,120:C,121:O,122:N,123:P},{10:F,18:199},{44:[1,200]},t(Ne,[2,43]),{10:[1,201],44:g,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:111,113:D,114:k,115:R},{10:[1,202]},{10:[1,203],105:[1,204]},t(Bt,[2,126]),{10:[1,205],44:g,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:111,113:D,114:k,115:R},{10:[1,206],44:g,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:111,113:D,114:k,115:R},{79:[1,207]},t(Ue,[2,107],{10:[1,208]}),t(Ue,[2,109],{10:[1,209]}),{79:[1,210]},t(tt,[2,182]),{79:[1,211],97:[1,212]},t(Ne,[2,55],{112:111,44:g,60:y,88:T,101:E,104:L,105:S,108:A,110:I,113:D,114:k,115:R}),{31:[1,213],67:ht,81:214,115:dt,116:Je,117:ct},t(Tr,[2,84]),t(Tr,[2,86]),t(Tr,[2,87]),t(Tr,[2,151]),t(Tr,[2,152]),t(Tr,[2,153]),t(Tr,[2,154]),{49:[1,215],67:ht,81:214,115:dt,116:Je,117:ct},{30:216,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{51:[1,217],67:ht,81:214,115:dt,116:Je,117:ct},{53:[1,218],67:ht,81:214,115:dt,116:Je,117:ct},{55:[1,219],67:ht,81:214,115:dt,116:Je,117:ct},{57:[1,220],67:ht,81:214,115:dt,116:Je,117:ct},{60:[1,221]},{64:[1,222],67:ht,81:214,115:dt,116:Je,117:ct},{66:[1,223],67:ht,81:214,115:dt,116:Je,117:ct},{30:224,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},{31:[1,225],67:ht,81:214,115:dt,116:Je,117:ct},{67:ht,69:[1,226],71:[1,227],81:214,115:dt,116:Je,117:ct},{67:ht,69:[1,229],71:[1,228],81:214,115:dt,116:Je,117:ct},t(Z,[2,45],{18:152,10:F,40:yt}),t(Z,[2,47],{44:rt}),t(Ce,[2,75]),t(Ce,[2,74]),{62:[1,230],67:ht,81:214,115:dt,116:Je,117:ct},t(Ce,[2,77]),t(Ct,[2,79]),{30:231,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},t(vt,a,{5:232}),t(pt,[2,100]),t(B,[2,35]),{43:233,44:g,45:39,47:40,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},{10:F,18:234},{10:yr,60:or,83:ln,91:235,104:Or,106:236,107:237,108:ii,109:mn,110:On,111:_r},{10:yr,60:or,83:ln,91:246,103:[1,247],104:Or,106:236,107:237,108:ii,109:mn,110:On,111:_r},{10:yr,60:or,83:ln,91:248,103:[1,249],104:Or,106:236,107:237,108:ii,109:mn,110:On,111:_r},{104:[1,250]},{10:yr,60:or,83:ln,91:251,104:Or,106:236,107:237,108:ii,109:mn,110:On,111:_r},{44:g,47:252,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},t(Ue,[2,106]),{79:[1,253]},{79:[1,254],97:[1,255]},t(Ue,[2,114]),t(Ue,[2,116],{10:[1,256]}),t(Ue,[2,117]),t(se,[2,56]),t(Tr,[2,85]),t(se,[2,57]),{51:[1,257],67:ht,81:214,115:dt,116:Je,117:ct},t(se,[2,64]),t(se,[2,59]),t(se,[2,60]),t(se,[2,61]),{108:[1,258]},t(se,[2,63]),t(se,[2,65]),{66:[1,259],67:ht,81:214,115:dt,116:Je,117:ct},t(se,[2,67]),t(se,[2,68]),t(se,[2,70]),t(se,[2,69]),t(se,[2,71]),t([10,44,60,88,101,104,105,108,110,113,114,115],[2,83]),{31:[1,260],67:ht,81:214,115:dt,116:Je,117:ct},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,261],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,83:v,84:x,85:b,86:w,87:_,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R,120:C,121:O,122:N,123:P},t(Ne,[2,53]),{43:262,44:g,45:39,47:40,60:y,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R},t(Ue,[2,119],{105:mi}),t(vs,[2,128],{107:264,10:yr,60:or,83:ln,104:Or,108:ii,109:mn,110:On,111:_r}),t(Pn,[2,130]),t(Pn,[2,132]),t(Pn,[2,133]),t(Pn,[2,134]),t(Pn,[2,135]),t(Pn,[2,136]),t(Pn,[2,137]),t(Pn,[2,138]),t(Pn,[2,139]),t(Ue,[2,120],{105:mi}),{10:[1,265]},t(Ue,[2,121],{105:mi}),{10:[1,266]},t(Bt,[2,127]),t(Ue,[2,103],{105:mi}),t(Ue,[2,104],{112:111,44:g,60:y,88:T,101:E,104:L,105:S,108:A,110:I,113:D,114:k,115:R}),t(Ue,[2,108]),t(Ue,[2,110],{10:[1,267]}),t(Ue,[2,111]),{97:[1,268]},{51:[1,269]},{62:[1,270]},{66:[1,271]},{8:G,9:z,11:W,21:272},t(B,[2,34]),t(Ne,[2,52]),{10:yr,60:or,83:ln,104:Or,106:273,107:237,108:ii,109:mn,110:On,111:_r},t(Pn,[2,131]),{14:oe,44:K,60:ee,88:J,100:274,104:H,105:q,108:Q,110:ae,113:ue,114:ce,115:te,119:86},{14:oe,44:K,60:ee,88:J,100:275,104:H,105:q,108:Q,110:ae,113:ue,114:ce,115:te,119:86},{97:[1,276]},t(Ue,[2,118]),t(se,[2,58]),{30:277,67:ht,79:Et,80:er,81:168,115:dt,116:Je,117:ct},t(se,[2,66]),t(vt,a,{5:278}),t(vs,[2,129],{107:264,10:yr,60:or,83:ln,104:Or,108:ii,109:mn,110:On,111:_r}),t(Ue,[2,124],{119:164,10:[1,279],14:oe,44:K,60:ee,88:J,104:H,105:q,108:Q,110:ae,113:ue,114:ce,115:te}),t(Ue,[2,125],{119:164,10:[1,280],14:oe,44:K,60:ee,88:J,104:H,105:q,108:Q,110:ae,113:ue,114:ce,115:te}),t(Ue,[2,112]),{31:[1,281],67:ht,81:214,115:dt,116:Je,117:ct},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,282],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,83:v,84:x,85:b,86:w,87:_,88:T,101:E,104:L,105:S,108:A,110:I,112:41,113:D,114:k,115:R,120:C,121:O,122:N,123:P},{10:yr,60:or,83:ln,91:283,104:Or,106:236,107:237,108:ii,109:mn,110:On,111:_r},{10:yr,60:or,83:ln,91:284,104:Or,106:236,107:237,108:ii,109:mn,110:On,111:_r},t(se,[2,62]),t(B,[2,33]),t(Ue,[2,122],{105:mi}),t(Ue,[2,123],{105:mi})],defaultActions:{},parseError:o(function(At,Pt){if(Pt.recoverable)this.trace(At);else{var wt=new Error(At);throw wt.hash=Pt,wt}},"parseError"),parse:o(function(At){var Pt=this,wt=[0],We=[],Ft=[null],de=[],gn=this.table,xe="",ja=0,W1=0,Y1=0,q1=2,X1=1,op=de.slice.call(arguments,1),Kn=Object.create(this.lexer),ca={yy:{}};for(var tc in this.yy)Object.prototype.hasOwnProperty.call(this.yy,tc)&&(ca.yy[tc]=this.yy[tc]);Kn.setInput(At,ca.yy),ca.yy.lexer=Kn,ca.yy.parser=this,typeof Kn.yylloc>"u"&&(Kn.yylloc={});var Wf=Kn.yylloc;de.push(Wf);var j1=Kn.options&&Kn.options.ranges;typeof ca.yy.parseError=="function"?this.parseError=ca.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function TF(Ka){wt.length=wt.length-2*Ka,Ft.length=Ft.length-Ka,de.length=de.length-Ka}o(TF,"popStack");function Yf(){var Ka;return Ka=We.pop()||Kn.lex()||X1,typeof Ka!="number"&&(Ka instanceof Array&&(We=Ka,Ka=We.pop()),Ka=Pt.symbols_[Ka]||Ka),Ka}o(Yf,"lex");for(var ua,K1,En,Oi,kF,lp,rc={},qf,Co,zb,Xf;;){if(En=wt[wt.length-1],this.defaultActions[En]?Oi=this.defaultActions[En]:((ua===null||typeof ua>"u")&&(ua=Yf()),Oi=gn[En]&&gn[En][ua]),typeof Oi>"u"||!Oi.length||!Oi[0]){var cp="";Xf=[];for(qf in gn[En])this.terminals_[qf]&&qf>q1&&Xf.push("'"+this.terminals_[qf]+"'");Kn.showPosition?cp="Parse error on line "+(ja+1)+`: +`+Kn.showPosition()+` +Expecting `+Xf.join(", ")+", got '"+(this.terminals_[ua]||ua)+"'":cp="Parse error on line "+(ja+1)+": Unexpected "+(ua==X1?"end of input":"'"+(this.terminals_[ua]||ua)+"'"),this.parseError(cp,{text:Kn.match,token:this.terminals_[ua]||ua,line:Kn.yylineno,loc:Wf,expected:Xf})}if(Oi[0]instanceof Array&&Oi.length>1)throw new Error("Parse Error: multiple actions possible at state: "+En+", token: "+ua);switch(Oi[0]){case 1:wt.push(ua),Ft.push(Kn.yytext),de.push(Kn.yylloc),wt.push(Oi[1]),ua=null,K1?(ua=K1,K1=null):(W1=Kn.yyleng,xe=Kn.yytext,ja=Kn.yylineno,Wf=Kn.yylloc,Y1>0&&Y1--);break;case 2:if(Co=this.productions_[Oi[1]][1],rc.$=Ft[Ft.length-Co],rc._$={first_line:de[de.length-(Co||1)].first_line,last_line:de[de.length-1].last_line,first_column:de[de.length-(Co||1)].first_column,last_column:de[de.length-1].last_column},j1&&(rc._$.range=[de[de.length-(Co||1)].range[0],de[de.length-1].range[1]]),lp=this.performAction.apply(rc,[xe,W1,ja,ca.yy,Oi[1],Ft,de].concat(op)),typeof lp<"u")return lp;Co&&(wt=wt.slice(0,-1*Co*2),Ft=Ft.slice(0,-1*Co),de=de.slice(0,-1*Co)),wt.push(this.productions_[Oi[1]][0]),Ft.push(rc.$),de.push(rc._$),zb=gn[wt[wt.length-2]][wt[wt.length-1]],wt.push(zb);break;case 3:return!0}}return!0},"parse")},gl=function(){var ki={EOF:1,parseError:o(function(Pt,wt){if(this.yy.parser)this.yy.parser.parseError(Pt,wt);else throw new Error(Pt)},"parseError"),setInput:o(function(At,Pt){return this.yy=Pt||this.yy||{},this._input=At,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var At=this._input[0];this.yytext+=At,this.yyleng++,this.offset++,this.match+=At,this.matched+=At;var Pt=At.match(/(?:\r\n?|\n).*/g);return Pt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),At},"input"),unput:o(function(At){var Pt=At.length,wt=At.split(/(?:\r\n?|\n)/g);this._input=At+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Pt),this.offset-=Pt;var We=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),wt.length-1&&(this.yylineno-=wt.length-1);var Ft=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:wt?(wt.length===We.length?this.yylloc.first_column:0)+We[We.length-wt.length].length-wt[0].length:this.yylloc.first_column-Pt},this.options.ranges&&(this.yylloc.range=[Ft[0],Ft[0]+this.yyleng-Pt]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(At){this.unput(this.match.slice(At))},"less"),pastInput:o(function(){var At=this.matched.substr(0,this.matched.length-this.match.length);return(At.length>20?"...":"")+At.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var At=this.match;return At.length<20&&(At+=this._input.substr(0,20-At.length)),(At.substr(0,20)+(At.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var At=this.pastInput(),Pt=new Array(At.length+1).join("-");return At+this.upcomingInput()+` +`+Pt+"^"},"showPosition"),test_match:o(function(At,Pt){var wt,We,Ft;if(this.options.backtrack_lexer&&(Ft={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Ft.yylloc.range=this.yylloc.range.slice(0))),We=At[0].match(/(?:\r\n?|\n).*/g),We&&(this.yylineno+=We.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:We?We[We.length-1].length-We[We.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+At[0].length},this.yytext+=At[0],this.match+=At[0],this.matches=At,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(At[0].length),this.matched+=At[0],wt=this.performAction.call(this,this.yy,this,Pt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),wt)return wt;if(this._backtrack){for(var de in Ft)this[de]=Ft[de];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var At,Pt,wt,We;this._more||(this.yytext="",this.match="");for(var Ft=this._currentRules(),de=0;dePt[0].length)){if(Pt=wt,We=de,this.options.backtrack_lexer){if(At=this.test_match(wt,Ft[de]),At!==!1)return At;if(this._backtrack){Pt=!1;continue}else return!1}else if(!this.options.flex)break}return Pt?(At=this.test_match(Pt,Ft[We]),At!==!1?At:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Pt=this.next();return Pt||this.lex()},"lex"),begin:o(function(Pt){this.conditionStack.push(Pt)},"begin"),popState:o(function(){var Pt=this.conditionStack.length-1;return Pt>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Pt){return Pt=this.conditionStack.length-1-Math.abs(Pt||0),Pt>=0?this.conditionStack[Pt]:"INITIAL"},"topState"),pushState:o(function(Pt){this.begin(Pt)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Pt,wt,We,Ft){var de=Ft;switch(We){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),wt.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let gn=/\n\s*/g;return wt.yytext=wt.yytext.replace(gn,"
    "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 94;case 17:this.popState();break;case 18:return 95;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 83;case 26:return 101;case 27:return 84;case 28:return 103;case 29:return 85;case 30:return 86;case 31:return 96;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 87;case 35:return Pt.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return Pt.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return Pt.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 97;case 41:return 97;case 42:return 97;case 43:return 97;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 120;case 56:return 121;case 57:return 122;case 58:return 123;case 59:return 104;case 60:return 110;case 61:return 46;case 62:return 60;case 63:return 44;case 64:return 8;case 65:return 105;case 66:return 114;case 67:return this.popState(),77;break;case 68:return this.pushState("edgeText"),75;break;case 69:return 118;case 70:return this.popState(),77;break;case 71:return this.pushState("thickEdgeText"),75;break;case 72:return 118;case 73:return this.popState(),77;break;case 74:return this.pushState("dottedEdgeText"),75;break;case 75:return 118;case 76:return 77;case 77:return this.popState(),53;break;case 78:return"TEXT";case 79:return this.pushState("ellipseText"),52;break;case 80:return this.popState(),55;break;case 81:return this.pushState("text"),54;break;case 82:return this.popState(),57;break;case 83:return this.pushState("text"),56;break;case 84:return 58;case 85:return this.pushState("text"),67;break;case 86:return this.popState(),64;break;case 87:return this.pushState("text"),63;break;case 88:return this.popState(),49;break;case 89:return this.pushState("text"),48;break;case 90:return this.popState(),69;break;case 91:return this.popState(),71;break;case 92:return 116;case 93:return this.pushState("trapText"),68;break;case 94:return this.pushState("trapText"),70;break;case 95:return 117;case 96:return 67;case 97:return 89;case 98:return"SEP";case 99:return 88;case 100:return 114;case 101:return 110;case 102:return 44;case 103:return 108;case 104:return 113;case 105:return 115;case 106:return this.popState(),62;break;case 107:return this.pushState("text"),62;break;case 108:return this.popState(),51;break;case 109:return this.pushState("text"),50;break;case 110:return this.popState(),31;break;case 111:return this.pushState("text"),29;break;case 112:return this.popState(),66;break;case 113:return this.pushState("text"),65;break;case 114:return"TEXT";case 115:return"QUOTE";case 116:return 9;case 117:return 10;case 118:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},shapeData:{rules:[8,11,12,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},callbackargs:{rules:[17,18,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},callbackname:{rules:[14,15,16,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},href:{rules:[21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},click:{rules:[21,24,33,34,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},dottedEdgeText:{rules:[21,24,73,75,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},thickEdgeText:{rules:[21,24,70,72,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},edgeText:{rules:[21,24,67,69,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},trapText:{rules:[21,24,76,79,81,83,87,89,90,91,92,93,94,107,109,111,113],inclusive:!1},ellipseText:{rules:[21,24,76,77,78,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},text:{rules:[21,24,76,79,80,81,82,83,86,87,88,89,93,94,106,107,108,109,110,111,112,113,114],inclusive:!1},vertex:{rules:[21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},acc_descr:{rules:[3,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},acc_title:{rules:[1,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},md_string:{rules:[19,20,21,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},string:{rules:[21,22,23,24,76,79,81,83,87,89,93,94,107,109,111,113],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,73,74,76,79,81,83,84,85,87,89,93,94,95,96,97,98,99,100,101,102,103,104,105,107,109,111,113,115,116,117,118],inclusive:!0}}};return ki}();So.lexer=gl;function Bn(){this.yy={}}return o(Bn,"Parser"),Bn.prototype=So,So.Parser=Bn,new Bn}();LD.parser=LD;Vie=LD});var GOe,$Oe,Hie,Wie=M(()=>{"use strict";Lo();GOe=o((t,e)=>{let r=ay,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Zs(n,i,a,e)},"fade"),$Oe=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span { + color: ${t.titleColor}; + } + .cluster-label span p { + background-color: transparent; + } + + .label text,span { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .katex path { + fill: #000; + stroke: #000; + stroke-width: 1px; + } + + .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + + .root .anchor path { + fill: ${t.lineColor} !important; + stroke-width: 0; + stroke: ${t.lineColor}; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${GOe(t.edgeLabelBackground,.5)}; + // background-color: + } + + .cluster rect { + fill: ${t.clusterBkg}; + stroke: ${t.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } + + rect.text { + fill: none; + stroke-width: 0; + } + + .icon-shape, .image-shape { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + padding: 2px; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } +`,"getStyles"),Hie=$Oe});var kT={};vr(kT,{diagram:()=>VOe});var VOe,ET=M(()=>{"use strict";Vt();cL();$ie();Uie();Wie();VOe={parser:Vie,db:sw,renderer:Gie,styles:Hie,init:o(t=>{t.flowchart||(t.flowchart={}),t.layout&&a7({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,a7({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}}),sw.clear(),sw.setGen("gen-2")},"init")}});var DD,Kie,Qie=M(()=>{"use strict";DD=function(){var t=o(function(S,A,I,D){for(I=I||{},D=S.length;D--;I[S[D]]=A);return I},"o"),e=[6,8,10,20,22,24,26,27,28],r=[1,10],n=[1,11],i=[1,12],a=[1,13],s=[1,14],l=[1,15],u=[1,21],h=[1,22],f=[1,23],d=[1,24],p=[1,25],m=[6,8,10,13,15,18,19,20,22,24,26,27,28,41,42,43,44,45],g=[1,34],y=[27,28,46,47],v=[41,42,43,44,45],x=[17,34],b=[1,54],w=[1,53],_=[17,34,36,38],T={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,":":13,role:14,BLOCK_START:15,attributes:16,BLOCK_STOP:17,SQS:18,SQE:19,title:20,title_value:21,acc_title:22,acc_title_value:23,acc_descr:24,acc_descr_value:25,acc_descr_multiline_value:26,ALPHANUM:27,ENTITY_NAME:28,attribute:29,attributeType:30,attributeName:31,attributeKeyTypeList:32,attributeComment:33,ATTRIBUTE_WORD:34,attributeKeyType:35,COMMA:36,ATTRIBUTE_KEY:37,COMMENT:38,cardinality:39,relType:40,ZERO_OR_ONE:41,ZERO_OR_MORE:42,ONE_OR_MORE:43,ONLY_ONE:44,MD_PARENT:45,NON_IDENTIFYING:46,IDENTIFYING:47,WORD:48,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:":",15:"BLOCK_START",17:"BLOCK_STOP",18:"SQS",19:"SQE",20:"title",21:"title_value",22:"acc_title",23:"acc_title_value",24:"acc_descr",25:"acc_descr_value",26:"acc_descr_multiline_value",27:"ALPHANUM",28:"ENTITY_NAME",34:"ATTRIBUTE_WORD",36:"COMMA",37:"ATTRIBUTE_KEY",38:"COMMENT",41:"ZERO_OR_ONE",42:"ZERO_OR_MORE",43:"ONE_OR_MORE",44:"ONLY_ONE",45:"MD_PARENT",46:"NON_IDENTIFYING",47:"IDENTIFYING",48:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,4],[9,3],[9,1],[9,7],[9,6],[9,4],[9,2],[9,2],[9,2],[9,1],[11,1],[11,1],[16,1],[16,2],[29,2],[29,3],[29,3],[29,4],[30,1],[31,1],[32,1],[32,3],[35,1],[33,1],[12,3],[39,1],[39,1],[39,1],[39,1],[39,1],[40,1],[40,1],[14,1],[14,1],[14,1]],performAction:o(function(A,I,D,k,R,C,O){var N=C.length-1;switch(R){case 1:break;case 2:this.$=[];break;case 3:C[N-1].push(C[N]),this.$=C[N-1];break;case 4:case 5:this.$=C[N];break;case 6:case 7:this.$=[];break;case 8:k.addEntity(C[N-4]),k.addEntity(C[N-2]),k.addRelationship(C[N-4],C[N],C[N-2],C[N-3]);break;case 9:k.addEntity(C[N-3]),k.addAttributes(C[N-3],C[N-1]);break;case 10:k.addEntity(C[N-2]);break;case 11:k.addEntity(C[N]);break;case 12:k.addEntity(C[N-6],C[N-4]),k.addAttributes(C[N-6],C[N-1]);break;case 13:k.addEntity(C[N-5],C[N-3]);break;case 14:k.addEntity(C[N-3],C[N-1]);break;case 15:case 16:this.$=C[N].trim(),k.setAccTitle(this.$);break;case 17:case 18:this.$=C[N].trim(),k.setAccDescription(this.$);break;case 19:case 43:this.$=C[N];break;case 20:case 41:case 42:this.$=C[N].replace(/"/g,"");break;case 21:case 29:this.$=[C[N]];break;case 22:C[N].push(C[N-1]),this.$=C[N];break;case 23:this.$={attributeType:C[N-1],attributeName:C[N]};break;case 24:this.$={attributeType:C[N-2],attributeName:C[N-1],attributeKeyTypeList:C[N]};break;case 25:this.$={attributeType:C[N-2],attributeName:C[N-1],attributeComment:C[N]};break;case 26:this.$={attributeType:C[N-3],attributeName:C[N-2],attributeKeyTypeList:C[N-1],attributeComment:C[N]};break;case 27:case 28:case 31:this.$=C[N];break;case 30:C[N-2].push(C[N]),this.$=C[N-2];break;case 32:this.$=C[N].replace(/"/g,"");break;case 33:this.$={cardA:C[N],relType:C[N-1],cardB:C[N-2]};break;case 34:this.$=k.Cardinality.ZERO_OR_ONE;break;case 35:this.$=k.Cardinality.ZERO_OR_MORE;break;case 36:this.$=k.Cardinality.ONE_OR_MORE;break;case 37:this.$=k.Cardinality.ONLY_ONE;break;case 38:this.$=k.Cardinality.MD_PARENT;break;case 39:this.$=k.Identification.NON_IDENTIFYING;break;case 40:this.$=k.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,20:r,22:n,24:i,26:a,27:s,28:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:16,11:9,20:r,22:n,24:i,26:a,27:s,28:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,11],{12:17,39:20,15:[1,18],18:[1,19],41:u,42:h,43:f,44:d,45:p}),{21:[1,26]},{23:[1,27]},{25:[1,28]},t(e,[2,18]),t(m,[2,19]),t(m,[2,20]),t(e,[2,4]),{11:29,27:s,28:l},{16:30,17:[1,31],29:32,30:33,34:g},{11:35,27:s,28:l},{40:36,46:[1,37],47:[1,38]},t(y,[2,34]),t(y,[2,35]),t(y,[2,36]),t(y,[2,37]),t(y,[2,38]),t(e,[2,15]),t(e,[2,16]),t(e,[2,17]),{13:[1,39]},{17:[1,40]},t(e,[2,10]),{16:41,17:[2,21],29:32,30:33,34:g},{31:42,34:[1,43]},{34:[2,27]},{19:[1,44]},{39:45,41:u,42:h,43:f,44:d,45:p},t(v,[2,39]),t(v,[2,40]),{14:46,27:[1,49],28:[1,48],48:[1,47]},t(e,[2,9]),{17:[2,22]},t(x,[2,23],{32:50,33:51,35:52,37:b,38:w}),t([17,34,37,38],[2,28]),t(e,[2,14],{15:[1,55]}),t([27,28],[2,33]),t(e,[2,8]),t(e,[2,41]),t(e,[2,42]),t(e,[2,43]),t(x,[2,24],{33:56,36:[1,57],38:w}),t(x,[2,25]),t(_,[2,29]),t(x,[2,32]),t(_,[2,31]),{16:58,17:[1,59],29:32,30:33,34:g},t(x,[2,26]),{35:60,37:b},{17:[1,61]},t(e,[2,13]),t(_,[2,30]),t(e,[2,12])],defaultActions:{34:[2,27],41:[2,22]},parseError:o(function(A,I){if(I.recoverable)this.trace(A);else{var D=new Error(A);throw D.hash=I,D}},"parseError"),parse:o(function(A){var I=this,D=[0],k=[],R=[null],C=[],O=this.table,N="",P=0,F=0,B=0,G=2,z=1,W=C.slice.call(arguments,1),Z=Object.create(this.lexer),j={yy:{}};for(var oe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,oe)&&(j.yy[oe]=this.yy[oe]);Z.setInput(A,j.yy),j.yy.lexer=Z,j.yy.parser=this,typeof Z.yylloc>"u"&&(Z.yylloc={});var K=Z.yylloc;C.push(K);var ee=Z.options&&Z.options.ranges;typeof j.yy.parseError=="function"?this.parseError=j.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function J(Ie){D.length=D.length-2*Ie,R.length=R.length-Ie,C.length=C.length-Ie}o(J,"popStack");function H(){var Ie;return Ie=k.pop()||Z.lex()||z,typeof Ie!="number"&&(Ie instanceof Array&&(k=Ie,Ie=k.pop()),Ie=I.symbols_[Ie]||Ie),Ie}o(H,"lex");for(var q,Q,ae,ue,ce,te,Ne={},se,ke,Re,Ce;;){if(ae=D[D.length-1],this.defaultActions[ae]?ue=this.defaultActions[ae]:((q===null||typeof q>"u")&&(q=H()),ue=O[ae]&&O[ae][q]),typeof ue>"u"||!ue.length||!ue[0]){var Pe="";Ce=[];for(se in O[ae])this.terminals_[se]&&se>G&&Ce.push("'"+this.terminals_[se]+"'");Z.showPosition?Pe="Parse error on line "+(P+1)+`: +`+Z.showPosition()+` +Expecting `+Ce.join(", ")+", got '"+(this.terminals_[q]||q)+"'":Pe="Parse error on line "+(P+1)+": Unexpected "+(q==z?"end of input":"'"+(this.terminals_[q]||q)+"'"),this.parseError(Pe,{text:Z.match,token:this.terminals_[q]||q,line:Z.yylineno,loc:K,expected:Ce})}if(ue[0]instanceof Array&&ue.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ae+", token: "+q);switch(ue[0]){case 1:D.push(q),R.push(Z.yytext),C.push(Z.yylloc),D.push(ue[1]),q=null,Q?(q=Q,Q=null):(F=Z.yyleng,N=Z.yytext,P=Z.yylineno,K=Z.yylloc,B>0&&B--);break;case 2:if(ke=this.productions_[ue[1]][1],Ne.$=R[R.length-ke],Ne._$={first_line:C[C.length-(ke||1)].first_line,last_line:C[C.length-1].last_line,first_column:C[C.length-(ke||1)].first_column,last_column:C[C.length-1].last_column},ee&&(Ne._$.range=[C[C.length-(ke||1)].range[0],C[C.length-1].range[1]]),te=this.performAction.apply(Ne,[N,F,P,j.yy,ue[1],R,C].concat(W)),typeof te<"u")return te;ke&&(D=D.slice(0,-1*ke*2),R=R.slice(0,-1*ke),C=C.slice(0,-1*ke)),D.push(this.productions_[ue[1]][0]),R.push(Ne.$),C.push(Ne._$),Re=O[D[D.length-2]][D[D.length-1]],D.push(Re);break;case 3:return!0}}return!0},"parse")},E=function(){var S={EOF:1,parseError:o(function(I,D){if(this.yy.parser)this.yy.parser.parseError(I,D);else throw new Error(I)},"parseError"),setInput:o(function(A,I){return this.yy=I||this.yy||{},this._input=A,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var A=this._input[0];this.yytext+=A,this.yyleng++,this.offset++,this.match+=A,this.matched+=A;var I=A.match(/(?:\r\n?|\n).*/g);return I?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),A},"input"),unput:o(function(A){var I=A.length,D=A.split(/(?:\r\n?|\n)/g);this._input=A+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-I),this.offset-=I;var k=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),D.length-1&&(this.yylineno-=D.length-1);var R=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:D?(D.length===k.length?this.yylloc.first_column:0)+k[k.length-D.length].length-D[0].length:this.yylloc.first_column-I},this.options.ranges&&(this.yylloc.range=[R[0],R[0]+this.yyleng-I]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(A){this.unput(this.match.slice(A))},"less"),pastInput:o(function(){var A=this.matched.substr(0,this.matched.length-this.match.length);return(A.length>20?"...":"")+A.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var A=this.match;return A.length<20&&(A+=this._input.substr(0,20-A.length)),(A.substr(0,20)+(A.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var A=this.pastInput(),I=new Array(A.length+1).join("-");return A+this.upcomingInput()+` +`+I+"^"},"showPosition"),test_match:o(function(A,I){var D,k,R;if(this.options.backtrack_lexer&&(R={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(R.yylloc.range=this.yylloc.range.slice(0))),k=A[0].match(/(?:\r\n?|\n).*/g),k&&(this.yylineno+=k.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:k?k[k.length-1].length-k[k.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+A[0].length},this.yytext+=A[0],this.match+=A[0],this.matches=A,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(A[0].length),this.matched+=A[0],D=this.performAction.call(this,this.yy,this,I,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),D)return D;if(this._backtrack){for(var C in R)this[C]=R[C];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var A,I,D,k;this._more||(this.yytext="",this.match="");for(var R=this._currentRules(),C=0;CI[0].length)){if(I=D,k=C,this.options.backtrack_lexer){if(A=this.test_match(D,R[C]),A!==!1)return A;if(this._backtrack){I=!1;continue}else return!1}else if(!this.options.flex)break}return I?(A=this.test_match(I,R[k]),A!==!1?A:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var I=this.next();return I||this.lex()},"lex"),begin:o(function(I){this.conditionStack.push(I)},"begin"),popState:o(function(){var I=this.conditionStack.length-1;return I>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(I){return I=this.conditionStack.length-1-Math.abs(I||0),I>=0?this.conditionStack[I]:"INITIAL"},"topState"),pushState:o(function(I){this.begin(I)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(I,D,k,R){var C=R;switch(k){case 0:return this.begin("acc_title"),22;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),24;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 10;case 8:break;case 9:return 8;case 10:return 28;case 11:return 48;case 12:return 4;case 13:return this.begin("block"),15;break;case 14:return 36;case 15:break;case 16:return 37;case 17:return 34;case 18:return 34;case 19:return 38;case 20:break;case 21:return this.popState(),17;break;case 22:return D.yytext[0];case 23:return 18;case 24:return 19;case 25:return 41;case 26:return 43;case 27:return 43;case 28:return 43;case 29:return 41;case 30:return 41;case 31:return 42;case 32:return 42;case 33:return 42;case 34:return 42;case 35:return 42;case 36:return 43;case 37:return 42;case 38:return 43;case 39:return 44;case 40:return 44;case 41:return 44;case 42:return 44;case 43:return 41;case 44:return 42;case 45:return 43;case 46:return 45;case 47:return 46;case 48:return 47;case 49:return 47;case 50:return 46;case 51:return 46;case 52:return 46;case 53:return 27;case 54:return D.yytext[0];case 55:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:,)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:(.*?)[~](.*?)*[~])/i,/^(?:[\*A-Za-z_][A-Za-z0-9\-_\[\]\(\)]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[14,15,16,17,18,19,20,21,22],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55],inclusive:!0}}};return S}();T.lexer=E;function L(){this.yy={}}return o(L,"Parser"),L.prototype=T,T.Parser=L,new L}();DD.parser=DD;Kie=DD});var Kd,ND,jOe,KOe,Zie,QOe,ZOe,JOe,ePe,tPe,Jie,eae=M(()=>{"use strict";ut();Vt();Ai();Kd=new Map,ND=[],jOe={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"},KOe={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},Zie=o(function(t,e=void 0){return Kd.has(t)?!Kd.get(t).alias&&e&&(Kd.get(t).alias=e,Y.info(`Add alias '${e}' to entity '${t}'`)):(Kd.set(t,{attributes:[],alias:e}),Y.info("Added new entity :",t)),Kd.get(t)},"addEntity"),QOe=o(()=>Kd,"getEntities"),ZOe=o(function(t,e){let r=Zie(t),n;for(n=e.length-1;n>=0;n--)r.attributes.push(e[n]),Y.debug("Added attribute ",e[n].attributeName)},"addAttributes"),JOe=o(function(t,e,r,n){let i={entityA:t,roleA:e,entityB:r,relSpec:n};ND.push(i),Y.debug("Added new relationship :",i)},"addRelationship"),ePe=o(()=>ND,"getRelationships"),tPe=o(function(){Kd=new Map,ND=[],Lr()},"clear"),Jie={Cardinality:jOe,Identification:KOe,getConfig:o(()=>pe().er,"getConfig"),addEntity:Zie,addAttributes:ZOe,getEntities:QOe,addRelationship:JOe,getRelationships:ePe,clear:tPe,setAccTitle:Mr,getAccTitle:Br,setAccDescription:Fr,getAccDescription:zr,setDiagramTitle:cn,getDiagramTitle:Jr}});var Fl,rPe,Qo,tae=M(()=>{"use strict";Fl={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END",MD_PARENT_END:"MD_PARENT_END",MD_PARENT_START:"MD_PARENT_START"},rPe=o(function(t,e){let r;t.append("defs").append("marker").attr("id",Fl.MD_PARENT_START).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",Fl.MD_PARENT_END).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",Fl.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",Fl.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),r=t.append("defs").append("marker").attr("id",Fl.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18"),r=t.append("defs").append("marker").attr("id",Fl.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,0 L21,18"),t.append("defs").append("marker").attr("id",Fl.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",Fl.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),r=t.append("defs").append("marker").attr("id",Fl.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),r=t.append("defs").append("marker").attr("id",Fl.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),r.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),r.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"insertMarkers"),Qo={ERMarkers:Fl,insertMarkers:rPe}});var rae,nae=M(()=>{"use strict";rae=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i});function nPe(t){return typeof t=="string"&&rae.test(t)}var iae,aae=M(()=>{"use strict";nae();o(nPe,"validate");iae=nPe});function sae(t,e=0){return wa[t[e+0]]+wa[t[e+1]]+wa[t[e+2]]+wa[t[e+3]]+"-"+wa[t[e+4]]+wa[t[e+5]]+"-"+wa[t[e+6]]+wa[t[e+7]]+"-"+wa[t[e+8]]+wa[t[e+9]]+"-"+wa[t[e+10]]+wa[t[e+11]]+wa[t[e+12]]+wa[t[e+13]]+wa[t[e+14]]+wa[t[e+15]]}var wa,oae=M(()=>{"use strict";wa=[];for(let t=0;t<256;++t)wa.push((t+256).toString(16).slice(1));o(sae,"unsafeStringify")});function iPe(t){if(!iae(t))throw TypeError("Invalid UUID");let e,r=new Uint8Array(16);return r[0]=(e=parseInt(t.slice(0,8),16))>>>24,r[1]=e>>>16&255,r[2]=e>>>8&255,r[3]=e&255,r[4]=(e=parseInt(t.slice(9,13),16))>>>8,r[5]=e&255,r[6]=(e=parseInt(t.slice(14,18),16))>>>8,r[7]=e&255,r[8]=(e=parseInt(t.slice(19,23),16))>>>8,r[9]=e&255,r[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,r[11]=e/4294967296&255,r[12]=e>>>24&255,r[13]=e>>>16&255,r[14]=e>>>8&255,r[15]=e&255,r}var lae,cae=M(()=>{"use strict";aae();o(iPe,"parse");lae=iPe});function aPe(t){t=unescape(encodeURIComponent(t));let e=[];for(let r=0;r{"use strict";oae();cae();o(aPe,"stringToBytes");sPe="6ba7b810-9dad-11d1-80b4-00c04fd430c8",oPe="6ba7b811-9dad-11d1-80b4-00c04fd430c8";o(RD,"v35")});function lPe(t,e,r,n){switch(t){case 0:return e&r^~e&n;case 1:return e^r^n;case 2:return e&r^e&n^r&n;case 3:return e^r^n}}function MD(t,e){return t<>>32-e}function cPe(t){let e=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if(typeof t=="string"){let s=unescape(encodeURIComponent(t));t=[];for(let l=0;l>>0;p=d,d=f,f=MD(h,30)>>>0,h=u,u=y}r[0]=r[0]+u>>>0,r[1]=r[1]+h>>>0,r[2]=r[2]+f>>>0,r[3]=r[3]+d>>>0,r[4]=r[4]+p>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,r[0]&255,r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,r[1]&255,r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,r[2]&255,r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,r[3]&255,r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,r[4]&255]}var hae,fae=M(()=>{"use strict";o(lPe,"f");o(MD,"ROTL");o(cPe,"sha1");hae=cPe});var uPe,ID,dae=M(()=>{"use strict";uae();fae();uPe=RD("v5",80,hae),ID=uPe});var pae=M(()=>{"use strict";dae()});function bPe(t="",e=""){let r=t.replace(hPe,"");return`${gae(e)}${gae(r)}${ID(t,xPe)}`}function gae(t=""){return t.length>0?`${t}-`:""}var hPe,$i,e2,fPe,dPe,pPe,mPe,yae,gPe,mae,yPe,vPe,xPe,vae,xae=M(()=>{"use strict";Gs();pr();Qv();Vt();ut();hr();tae();ai();fr();pae();hPe=/[^\dA-Za-z](\W)*/g,$i={},e2=new Map,fPe=o(function(t){let e=Object.keys(t);for(let r of e)$i[r]=t[r]},"setConf"),dPe=o((t,e,r)=>{let n=$i.entityPadding/3,i=$i.entityPadding/3,a=$i.fontSize*.85,s=e.node().getBBox(),l=[],u=!1,h=!1,f=0,d=0,p=0,m=0,g=s.height+n*2,y=1;r.forEach(w=>{w.attributeKeyTypeList!==void 0&&w.attributeKeyTypeList.length>0&&(u=!0),w.attributeComment!==void 0&&(h=!0)}),r.forEach(w=>{let _=`${e.node().id}-attr-${y}`,T=0,E=yu(w.attributeType),L=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-type`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(E),S=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-name`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(w.attributeName),A={};A.tn=L,A.nn=S;let I=L.node().getBBox(),D=S.node().getBBox();if(f=Math.max(f,I.width),d=Math.max(d,D.width),T=Math.max(I.height,D.height),u){let k=w.attributeKeyTypeList!==void 0?w.attributeKeyTypeList.join(","):"",R=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-key`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(k);A.kn=R;let C=R.node().getBBox();p=Math.max(p,C.width),T=Math.max(T,C.height)}if(h){let k=t.append("text").classed("er entityLabel",!0).attr("id",`${_}-comment`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",pe().fontFamily).style("font-size",a+"px").text(w.attributeComment||"");A.cn=k;let R=k.node().getBBox();m=Math.max(m,R.width),T=Math.max(T,R.height)}A.height=T,l.push(A),g+=T+n*2,y+=1});let v=4;u&&(v+=2),h&&(v+=2);let x=f+d+p+m,b={width:Math.max($i.minEntityWidth,Math.max(s.width+$i.entityPadding*2,x+i*v)),height:r.length>0?g:Math.max($i.minEntityHeight,s.height+$i.entityPadding*2)};if(r.length>0){let w=Math.max(0,(b.width-x-i*v)/(v/2));e.attr("transform","translate("+b.width/2+","+(n+s.height/2)+")");let _=s.height+n*2,T="attributeBoxOdd";l.forEach(E=>{let L=_+n+E.height/2;E.tn.attr("transform","translate("+i+","+L+")");let S=t.insert("rect","#"+E.tn.node().id).classed(`er ${T}`,!0).attr("x",0).attr("y",_).attr("width",f+i*2+w).attr("height",E.height+n*2),A=parseFloat(S.attr("x"))+parseFloat(S.attr("width"));E.nn.attr("transform","translate("+(A+i)+","+L+")");let I=t.insert("rect","#"+E.nn.node().id).classed(`er ${T}`,!0).attr("x",A).attr("y",_).attr("width",d+i*2+w).attr("height",E.height+n*2),D=parseFloat(I.attr("x"))+parseFloat(I.attr("width"));if(u){E.kn.attr("transform","translate("+(D+i)+","+L+")");let k=t.insert("rect","#"+E.kn.node().id).classed(`er ${T}`,!0).attr("x",D).attr("y",_).attr("width",p+i*2+w).attr("height",E.height+n*2);D=parseFloat(k.attr("x"))+parseFloat(k.attr("width"))}h&&(E.cn.attr("transform","translate("+(D+i)+","+L+")"),t.insert("rect","#"+E.cn.node().id).classed(`er ${T}`,"true").attr("x",D).attr("y",_).attr("width",m+i*2+w).attr("height",E.height+n*2)),_+=E.height+n*2,T=T==="attributeBoxOdd"?"attributeBoxEven":"attributeBoxOdd"})}else b.height=Math.max($i.minEntityHeight,g),e.attr("transform","translate("+b.width/2+","+b.height/2+")");return b},"drawAttributes"),pPe=o(function(t,e,r){let n=[...e.keys()],i;return n.forEach(function(a){let s=bPe(a,"entity");e2.set(a,s);let l=t.append("g").attr("id",s);i=i===void 0?s:i;let u="text-"+s,h=l.append("text").classed("er entityLabel",!0).attr("id",u).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","middle").style("font-family",pe().fontFamily).style("font-size",$i.fontSize+"px").text(e.get(a).alias??a),{width:f,height:d}=dPe(l,h,e.get(a).attributes),m=l.insert("rect","#"+u).classed("er entityBox",!0).attr("x",0).attr("y",0).attr("width",f).attr("height",d).node().getBBox();r.setNode(s,{width:m.width,height:m.height,shape:"rect",id:s})}),i},"drawEntities"),mPe=o(function(t,e){e.nodes().forEach(function(r){r!==void 0&&e.node(r)!==void 0&&t.select("#"+r).attr("transform","translate("+(e.node(r).x-e.node(r).width/2)+","+(e.node(r).y-e.node(r).height/2)+" )")})},"adjustEntities"),yae=o(function(t){return(t.entityA+t.roleA+t.entityB).replace(/\s/g,"")},"getEdgeName"),gPe=o(function(t,e){return t.forEach(function(r){e.setEdge(e2.get(r.entityA),e2.get(r.entityB),{relationship:r},yae(r))}),t},"addRelationships"),mae=0,yPe=o(function(t,e,r,n,i){mae++;let a=r.edge(e2.get(e.entityA),e2.get(e.entityB),yae(e)),s=ns().x(function(y){return y.x}).y(function(y){return y.y}).curve(Po),l=t.insert("path","#"+n).classed("er relationshipLine",!0).attr("d",s(a.points)).style("stroke",$i.stroke).style("fill","none");e.relSpec.relType===i.db.Identification.NON_IDENTIFYING&&l.attr("stroke-dasharray","8,8");let u="";switch($i.arrowMarkerAbsolute&&(u=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,u=u.replace(/\(/g,"\\("),u=u.replace(/\)/g,"\\)")),e.relSpec.cardA){case i.db.Cardinality.ZERO_OR_ONE:l.attr("marker-end","url("+u+"#"+Qo.ERMarkers.ZERO_OR_ONE_END+")");break;case i.db.Cardinality.ZERO_OR_MORE:l.attr("marker-end","url("+u+"#"+Qo.ERMarkers.ZERO_OR_MORE_END+")");break;case i.db.Cardinality.ONE_OR_MORE:l.attr("marker-end","url("+u+"#"+Qo.ERMarkers.ONE_OR_MORE_END+")");break;case i.db.Cardinality.ONLY_ONE:l.attr("marker-end","url("+u+"#"+Qo.ERMarkers.ONLY_ONE_END+")");break;case i.db.Cardinality.MD_PARENT:l.attr("marker-end","url("+u+"#"+Qo.ERMarkers.MD_PARENT_END+")");break}switch(e.relSpec.cardB){case i.db.Cardinality.ZERO_OR_ONE:l.attr("marker-start","url("+u+"#"+Qo.ERMarkers.ZERO_OR_ONE_START+")");break;case i.db.Cardinality.ZERO_OR_MORE:l.attr("marker-start","url("+u+"#"+Qo.ERMarkers.ZERO_OR_MORE_START+")");break;case i.db.Cardinality.ONE_OR_MORE:l.attr("marker-start","url("+u+"#"+Qo.ERMarkers.ONE_OR_MORE_START+")");break;case i.db.Cardinality.ONLY_ONE:l.attr("marker-start","url("+u+"#"+Qo.ERMarkers.ONLY_ONE_START+")");break;case i.db.Cardinality.MD_PARENT:l.attr("marker-start","url("+u+"#"+Qo.ERMarkers.MD_PARENT_START+")");break}let h=l.node().getTotalLength(),f=l.node().getPointAtLength(h*.5),d="rel"+mae,p=e.roleA.split(/
    /g),m=t.append("text").classed("er relationshipLabel",!0).attr("id",d).attr("x",f.x).attr("y",f.y).style("text-anchor","middle").style("dominant-baseline","middle").style("font-family",pe().fontFamily).style("font-size",$i.fontSize+"px");if(p.length==1)m.text(e.roleA);else{let y=-(p.length-1)*.5;p.forEach((v,x)=>{m.append("tspan").attr("x",f.x).attr("dy",`${x===0?y:1}em`).text(v)})}let g=m.node().getBBox();t.insert("rect","#"+d).classed("er relationshipLabelBox",!0).attr("x",f.x-g.width/2).attr("y",f.y-g.height/2).attr("width",g.width).attr("height",g.height)},"drawRelationshipFromLayout"),vPe=o(function(t,e,r,n){$i=pe().er,Y.info("Drawing ER diagram");let i=pe().securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let l=(i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body")).select(`[id='${e}']`);Qo.insertMarkers(l,$i);let u;u=new Ir({multigraph:!0,directed:!0,compound:!1}).setGraph({rankdir:$i.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel(function(){return{}});let h=pPe(l,n.db.getEntities(),u),f=gPe(n.db.getRelationships(),u);Gu(u),mPe(l,u),f.forEach(function(y){yPe(l,y,u,h,n)});let d=$i.diagramPadding;Ut.insertTitle(l,"entityTitleText",$i.titleTopMargin,n.db.getDiagramTitle());let p=l.node().getBBox(),m=p.width+d*2,g=p.height+d*2;Zr(l,g,m,$i.useMaxWidth),l.attr("viewBox",`${p.x-d} ${p.y-d} ${m} ${g}`)},"draw"),xPe="28e9f9db-3c8d-5aa5-9faf-44286ae5937c";o(bPe,"generateId");o(gae,"strWithHyphen");vae={setConf:fPe,draw:vPe}});var wPe,bae,wae=M(()=>{"use strict";wPe=o(t=>` + .entityBox { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + } + + .attributeBoxOdd { + fill: ${t.attributeBackgroundColorOdd}; + stroke: ${t.nodeBorder}; + } + + .attributeBoxEven { + fill: ${t.attributeBackgroundColorEven}; + stroke: ${t.nodeBorder}; + } + + .relationshipLabelBox { + fill: ${t.tertiaryColor}; + opacity: 0.7; + background-color: ${t.tertiaryColor}; + rect { + opacity: 0.5; + } + } + + .relationshipLine { + stroke: ${t.lineColor}; + } + + .entityTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } + #MD_PARENT_START { + fill: #f5f5f5 !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; + } + #MD_PARENT_END { + fill: #f5f5f5 !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; + } + +`,"getStyles"),bae=wPe});var Tae={};vr(Tae,{diagram:()=>TPe});var TPe,kae=M(()=>{"use strict";Qie();eae();xae();wae();TPe={parser:Kie,db:Jie,renderer:vae,styles:bae}});function ri(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function Ta(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"}function OD(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function Zd(t){return typeof t=="object"&&t!==null&&ri(t.container)&&Ta(t.reference)&&typeof t.message=="string"}function ho(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function cf(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function t2(t){return ho(t)&&typeof t.fullText=="string"}var Qd,Zo=M(()=>{"use strict";o(ri,"isAstNode");o(Ta,"isReference");o(OD,"isAstNodeDescription");o(Zd,"isLinkingError");Qd=class{static{o(this,"AbstractAstReflection")}constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,r){return ri(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let a=this.computeIsSubtype(e,r);return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let a of n)this.isSubtype(a,e)&&i.push(a);return this.allSubtypes[e]=i,i}}};o(ho,"isCompositeCstNode");o(cf,"isLeafCstNode");o(t2,"isRootCstNode")});function CPe(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function ST(t){return!!t&&typeof t[Symbol.iterator]=="function"}function tn(...t){if(t.length===1){let e=t[0];if(e instanceof fo)return e;if(ST(e))return new fo(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new fo(()=>({index:0}),r=>r.index1?new fo(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex{"use strict";fo=class t{static{o(this,"StreamImpl")}constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){let r=e[Symbol.iterator]();return new t(()=>({first:this.startFn(),firstDone:!1}),n=>{let i;if(!n.firstDone){do if(i=this.nextFn(n.first),!i.done)return i;while(!i.done);n.firstDone=!0}do if(i=r.next(),!i.done)return i;while(!i.done);return ss})}join(e=","){let r=this.iterator(),n="",i,a=!1;do i=r.next(),i.done||(a&&(n+=e),n+=CPe(i.value)),a=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,a=n.next();for(;!a.done;){if(i>=r&&a.value===e)return i;a=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?ss:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return ss})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,a=n.next();for(;!a.done;)i===void 0?i=a.value:i=e(i,a.value),a=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let a=this.recursiveReduce(e,r,n);return a===void 0?i.value:r(a,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let a=r.iterator.next();if(a.done)r.iterator=void 0;else return a}let{done:n,value:i}=this.nextFn(r.this);if(!n){let a=e(i);if(ST(a))r.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}}while(r.iterator);return ss})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let s=n.iterator.next();if(s.done)n.iterator=void 0;else return s}let{done:i,value:a}=r.nextFn(n.this);if(!i)if(ST(a))n.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}while(n.iterator);return ss})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?ss:this.nextFn(r.state)))}distinct(e){let r=new Set;return this.filter(n=>{let i=e?e(n):n;return r.has(i)?!1:(r.add(i),!0)})}exclude(e,r){let n=new Set;for(let i of e){let a=r?r(i):i;n.add(a)}return this.filter(i=>{let a=r?r(i):i;return!n.has(a)})}};o(CPe,"toString");o(ST,"isIterable");r2=new fo(()=>{},()=>ss),ss=Object.freeze({done:!0,value:void 0});o(tn,"stream");Pc=class extends fo{static{o(this,"TreeStreamImpl")}constructor(e,r,n){super(()=>({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let s=i.iterators[i.iterators.length-1].next();if(s.done)i.iterators.pop();else return i.iterators.push(r(s.value)[Symbol.iterator]()),s}return ss})}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),prune:o(()=>{e.state.pruned=!0},"prune"),[Symbol.iterator]:()=>e};return e}};(function(t){function e(a){return a.reduce((s,l)=>s+l,0)}o(e,"sum"),t.sum=e;function r(a){return a.reduce((s,l)=>s*l,0)}o(r,"product"),t.product=r;function n(a){return a.reduce((s,l)=>Math.min(s,l))}o(n,"min"),t.min=n;function i(a){return a.reduce((s,l)=>Math.max(s,l))}o(i,"max"),t.max=i})(Jm||(Jm={}))});var AT={};vr(AT,{DefaultNameRegexp:()=>CT,RangeComparison:()=>$u,compareRange:()=>Aae,findCommentNode:()=>zD,findDeclarationNodeAtOffset:()=>_Pe,findLeafNodeAtOffset:()=>GD,findLeafNodeBeforeOffset:()=>_ae,flattenCst:()=>APe,getInteriorNodes:()=>NPe,getNextNode:()=>LPe,getPreviousNode:()=>Dae,getStartlineNode:()=>DPe,inRange:()=>FD,isChildNode:()=>BD,isCommentNode:()=>PD,streamCst:()=>Jd,toDocumentSegment:()=>e0,tokenToRange:()=>eg});function Jd(t){return new Pc(t,e=>ho(e)?e.content:[],{includeRoot:!0})}function APe(t){return Jd(t).filter(cf)}function BD(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function eg(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function e0(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}function Aae(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>e.end.character)return $u.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.line$u.After}function _Pe(t,e,r=CT){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return GD(t,e)}}function zD(t,e){if(t){let r=Dae(t,!0);if(r&&PD(r,e))return r;if(t2(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let a=t.content[i];if(PD(a,e))return a}}}}function PD(t,e){return cf(t)&&e.includes(t.tokenType.name)}function GD(t,e){if(cf(t))return t;if(ho(t)){let r=Lae(t,e,!1);if(r)return GD(r,e)}}function _ae(t,e){if(cf(t))return t;if(ho(t)){let r=Lae(t,e,!0);if(r)return _ae(r,e)}}function Lae(t,e,r){let n=0,i=t.content.length-1,a;for(;n<=i;){let s=Math.floor((n+i)/2),l=t.content[s];if(l.offset<=e&&l.end>e)return l;l.end<=e?(a=r?l:void 0,n=s+1):i=s-1}return a}function Dae(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function LPe(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;n{"use strict";Zo();$s();o(Jd,"streamCst");o(APe,"flattenCst");o(BD,"isChildNode");o(eg,"tokenToRange");o(e0,"toDocumentSegment");(function(t){t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside"})($u||($u={}));o(Aae,"compareRange");o(FD,"inRange");CT=/^[\w\p{L}]$/u;o(_Pe,"findDeclarationNodeAtOffset");o(zD,"findCommentNode");o(PD,"isCommentNode");o(GD,"findLeafNodeAtOffset");o(_ae,"findLeafNodeBeforeOffset");o(Lae,"binarySearch");o(Dae,"getPreviousNode");o(LPe,"getNextNode");o(DPe,"getStartlineNode");o(NPe,"getInteriorNodes");o(RPe,"getCommonParent");o(Cae,"getParentChain")});function uf(t){throw new Error("Error! The input value was not handled.")}var t0,_T=M(()=>{"use strict";t0=class extends Error{static{o(this,"ErrorWithLocation")}constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};o(uf,"assertUnreachable")});var o2={};vr(o2,{AbstractElement:()=>VD,AbstractRule:()=>n2,AbstractType:()=>i2,Action:()=>gN,Alternatives:()=>yN,ArrayLiteral:()=>UD,ArrayType:()=>HD,Assignment:()=>vN,BooleanLiteral:()=>YD,CharacterRange:()=>xN,Condition:()=>LT,Conjunction:()=>XD,CrossReference:()=>wN,Disjunction:()=>KD,EndOfFile:()=>TN,Grammar:()=>ZD,GrammarImport:()=>Rae,Group:()=>EN,InferredType:()=>JD,Interface:()=>eN,Keyword:()=>SN,LangiumGrammarAstReflection:()=>tg,LangiumGrammarTerminals:()=>MPe,NamedArgument:()=>Mae,NegatedToken:()=>CN,Negation:()=>tN,NumberLiteral:()=>nN,Parameter:()=>iN,ParameterReference:()=>aN,ParserRule:()=>oN,ReferenceType:()=>lN,RegexToken:()=>_N,ReturnType:()=>Iae,RuleCall:()=>DN,SimpleType:()=>hN,StringLiteral:()=>fN,TerminalAlternatives:()=>NN,TerminalGroup:()=>MN,TerminalRule:()=>NT,TerminalRuleCall:()=>ON,Type:()=>dN,TypeAttribute:()=>Oae,TypeDefinition:()=>$D,UnionType:()=>pN,UnorderedGroup:()=>PN,UntilToken:()=>BN,ValueLiteral:()=>DT,Wildcard:()=>zN,isAbstractElement:()=>a2,isAbstractRule:()=>IPe,isAbstractType:()=>OPe,isAction:()=>Vu,isAlternatives:()=>OT,isArrayLiteral:()=>GPe,isArrayType:()=>WD,isAssignment:()=>Gl,isBooleanLiteral:()=>qD,isCharacterRange:()=>bN,isCondition:()=>PPe,isConjunction:()=>jD,isCrossReference:()=>r0,isDisjunction:()=>QD,isEndOfFile:()=>kN,isFeatureName:()=>BPe,isGrammar:()=>$Pe,isGrammarImport:()=>VPe,isGroup:()=>hf,isInferredType:()=>RT,isInterface:()=>MT,isKeyword:()=>el,isNamedArgument:()=>UPe,isNegatedToken:()=>AN,isNegation:()=>rN,isNumberLiteral:()=>HPe,isParameter:()=>WPe,isParameterReference:()=>sN,isParserRule:()=>Ga,isPrimitiveType:()=>Nae,isReferenceType:()=>cN,isRegexToken:()=>LN,isReturnType:()=>uN,isRuleCall:()=>$l,isSimpleType:()=>IT,isStringLiteral:()=>YPe,isTerminalAlternatives:()=>RN,isTerminalGroup:()=>IN,isTerminalRule:()=>Jo,isTerminalRuleCall:()=>PT,isType:()=>s2,isTypeAttribute:()=>qPe,isTypeDefinition:()=>FPe,isUnionType:()=>mN,isUnorderedGroup:()=>BT,isUntilToken:()=>FN,isValueLiteral:()=>zPe,isWildcard:()=>GN,reflection:()=>lr});function IPe(t){return lr.isInstance(t,n2)}function OPe(t){return lr.isInstance(t,i2)}function PPe(t){return lr.isInstance(t,LT)}function BPe(t){return Nae(t)||t==="current"||t==="entry"||t==="extends"||t==="false"||t==="fragment"||t==="grammar"||t==="hidden"||t==="import"||t==="interface"||t==="returns"||t==="terminal"||t==="true"||t==="type"||t==="infer"||t==="infers"||t==="with"||typeof t=="string"&&/\^?[_a-zA-Z][\w_]*/.test(t)}function Nae(t){return t==="string"||t==="number"||t==="boolean"||t==="Date"||t==="bigint"}function FPe(t){return lr.isInstance(t,$D)}function zPe(t){return lr.isInstance(t,DT)}function a2(t){return lr.isInstance(t,VD)}function GPe(t){return lr.isInstance(t,UD)}function WD(t){return lr.isInstance(t,HD)}function qD(t){return lr.isInstance(t,YD)}function jD(t){return lr.isInstance(t,XD)}function QD(t){return lr.isInstance(t,KD)}function $Pe(t){return lr.isInstance(t,ZD)}function VPe(t){return lr.isInstance(t,Rae)}function RT(t){return lr.isInstance(t,JD)}function MT(t){return lr.isInstance(t,eN)}function UPe(t){return lr.isInstance(t,Mae)}function rN(t){return lr.isInstance(t,tN)}function HPe(t){return lr.isInstance(t,nN)}function WPe(t){return lr.isInstance(t,iN)}function sN(t){return lr.isInstance(t,aN)}function Ga(t){return lr.isInstance(t,oN)}function cN(t){return lr.isInstance(t,lN)}function uN(t){return lr.isInstance(t,Iae)}function IT(t){return lr.isInstance(t,hN)}function YPe(t){return lr.isInstance(t,fN)}function Jo(t){return lr.isInstance(t,NT)}function s2(t){return lr.isInstance(t,dN)}function qPe(t){return lr.isInstance(t,Oae)}function mN(t){return lr.isInstance(t,pN)}function Vu(t){return lr.isInstance(t,gN)}function OT(t){return lr.isInstance(t,yN)}function Gl(t){return lr.isInstance(t,vN)}function bN(t){return lr.isInstance(t,xN)}function r0(t){return lr.isInstance(t,wN)}function kN(t){return lr.isInstance(t,TN)}function hf(t){return lr.isInstance(t,EN)}function el(t){return lr.isInstance(t,SN)}function AN(t){return lr.isInstance(t,CN)}function LN(t){return lr.isInstance(t,_N)}function $l(t){return lr.isInstance(t,DN)}function RN(t){return lr.isInstance(t,NN)}function IN(t){return lr.isInstance(t,MN)}function PT(t){return lr.isInstance(t,ON)}function BT(t){return lr.isInstance(t,PN)}function FN(t){return lr.isInstance(t,BN)}function GN(t){return lr.isInstance(t,zN)}var MPe,n2,i2,LT,$D,DT,VD,UD,HD,YD,XD,KD,ZD,Rae,JD,eN,Mae,tN,nN,iN,aN,oN,lN,Iae,hN,fN,NT,dN,Oae,pN,gN,yN,vN,xN,wN,TN,EN,SN,CN,_N,DN,NN,MN,ON,PN,BN,zN,tg,lr,Bc=M(()=>{"use strict";Zo();MPe={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},n2="AbstractRule";o(IPe,"isAbstractRule");i2="AbstractType";o(OPe,"isAbstractType");LT="Condition";o(PPe,"isCondition");o(BPe,"isFeatureName");o(Nae,"isPrimitiveType");$D="TypeDefinition";o(FPe,"isTypeDefinition");DT="ValueLiteral";o(zPe,"isValueLiteral");VD="AbstractElement";o(a2,"isAbstractElement");UD="ArrayLiteral";o(GPe,"isArrayLiteral");HD="ArrayType";o(WD,"isArrayType");YD="BooleanLiteral";o(qD,"isBooleanLiteral");XD="Conjunction";o(jD,"isConjunction");KD="Disjunction";o(QD,"isDisjunction");ZD="Grammar";o($Pe,"isGrammar");Rae="GrammarImport";o(VPe,"isGrammarImport");JD="InferredType";o(RT,"isInferredType");eN="Interface";o(MT,"isInterface");Mae="NamedArgument";o(UPe,"isNamedArgument");tN="Negation";o(rN,"isNegation");nN="NumberLiteral";o(HPe,"isNumberLiteral");iN="Parameter";o(WPe,"isParameter");aN="ParameterReference";o(sN,"isParameterReference");oN="ParserRule";o(Ga,"isParserRule");lN="ReferenceType";o(cN,"isReferenceType");Iae="ReturnType";o(uN,"isReturnType");hN="SimpleType";o(IT,"isSimpleType");fN="StringLiteral";o(YPe,"isStringLiteral");NT="TerminalRule";o(Jo,"isTerminalRule");dN="Type";o(s2,"isType");Oae="TypeAttribute";o(qPe,"isTypeAttribute");pN="UnionType";o(mN,"isUnionType");gN="Action";o(Vu,"isAction");yN="Alternatives";o(OT,"isAlternatives");vN="Assignment";o(Gl,"isAssignment");xN="CharacterRange";o(bN,"isCharacterRange");wN="CrossReference";o(r0,"isCrossReference");TN="EndOfFile";o(kN,"isEndOfFile");EN="Group";o(hf,"isGroup");SN="Keyword";o(el,"isKeyword");CN="NegatedToken";o(AN,"isNegatedToken");_N="RegexToken";o(LN,"isRegexToken");DN="RuleCall";o($l,"isRuleCall");NN="TerminalAlternatives";o(RN,"isTerminalAlternatives");MN="TerminalGroup";o(IN,"isTerminalGroup");ON="TerminalRuleCall";o(PT,"isTerminalRuleCall");PN="UnorderedGroup";o(BT,"isUnorderedGroup");BN="UntilToken";o(FN,"isUntilToken");zN="Wildcard";o(GN,"isWildcard");tg=class extends Qd{static{o(this,"LangiumGrammarAstReflection")}getAllTypes(){return["AbstractElement","AbstractRule","AbstractType","Action","Alternatives","ArrayLiteral","ArrayType","Assignment","BooleanLiteral","CharacterRange","Condition","Conjunction","CrossReference","Disjunction","EndOfFile","Grammar","GrammarImport","Group","InferredType","Interface","Keyword","NamedArgument","NegatedToken","Negation","NumberLiteral","Parameter","ParameterReference","ParserRule","ReferenceType","RegexToken","ReturnType","RuleCall","SimpleType","StringLiteral","TerminalAlternatives","TerminalGroup","TerminalRule","TerminalRuleCall","Type","TypeAttribute","TypeDefinition","UnionType","UnorderedGroup","UntilToken","ValueLiteral","Wildcard"]}computeIsSubtype(e,r){switch(e){case gN:case yN:case vN:case xN:case wN:case TN:case EN:case SN:case CN:case _N:case DN:case NN:case MN:case ON:case PN:case BN:case zN:return this.isSubtype(VD,r);case UD:case nN:case fN:return this.isSubtype(DT,r);case HD:case lN:case hN:case pN:return this.isSubtype($D,r);case YD:return this.isSubtype(LT,r)||this.isSubtype(DT,r);case XD:case KD:case tN:case aN:return this.isSubtype(LT,r);case JD:case eN:case dN:return this.isSubtype(i2,r);case oN:return this.isSubtype(n2,r)||this.isSubtype(i2,r);case NT:return this.isSubtype(n2,r);default:return!1}}getReferenceType(e){let r=`${e.container.$type}:${e.property}`;switch(r){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return i2;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return n2;case"Grammar:usedGrammars":return ZD;case"NamedArgument:parameter":case"ParameterReference:parameter":return iN;case"TerminalRuleCall:rule":return NT;default:throw new Error(`${r} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case"AbstractElement":return{name:"AbstractElement",properties:[{name:"cardinality"},{name:"lookahead"}]};case"ArrayLiteral":return{name:"ArrayLiteral",properties:[{name:"elements",defaultValue:[]}]};case"ArrayType":return{name:"ArrayType",properties:[{name:"elementType"}]};case"BooleanLiteral":return{name:"BooleanLiteral",properties:[{name:"true",defaultValue:!1}]};case"Conjunction":return{name:"Conjunction",properties:[{name:"left"},{name:"right"}]};case"Disjunction":return{name:"Disjunction",properties:[{name:"left"},{name:"right"}]};case"Grammar":return{name:"Grammar",properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case"GrammarImport":return{name:"GrammarImport",properties:[{name:"path"}]};case"InferredType":return{name:"InferredType",properties:[{name:"name"}]};case"Interface":return{name:"Interface",properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case"NamedArgument":return{name:"NamedArgument",properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case"Negation":return{name:"Negation",properties:[{name:"value"}]};case"NumberLiteral":return{name:"NumberLiteral",properties:[{name:"value"}]};case"Parameter":return{name:"Parameter",properties:[{name:"name"}]};case"ParameterReference":return{name:"ParameterReference",properties:[{name:"parameter"}]};case"ParserRule":return{name:"ParserRule",properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case"ReferenceType":return{name:"ReferenceType",properties:[{name:"referenceType"}]};case"ReturnType":return{name:"ReturnType",properties:[{name:"name"}]};case"SimpleType":return{name:"SimpleType",properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case"StringLiteral":return{name:"StringLiteral",properties:[{name:"value"}]};case"TerminalRule":return{name:"TerminalRule",properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case"Type":return{name:"Type",properties:[{name:"name"},{name:"type"}]};case"TypeAttribute":return{name:"TypeAttribute",properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case"UnionType":return{name:"UnionType",properties:[{name:"types",defaultValue:[]}]};case"Action":return{name:"Action",properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case"Alternatives":return{name:"Alternatives",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"Assignment":return{name:"Assignment",properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case"CharacterRange":return{name:"CharacterRange",properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case"CrossReference":return{name:"CrossReference",properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case"EndOfFile":return{name:"EndOfFile",properties:[{name:"cardinality"},{name:"lookahead"}]};case"Group":return{name:"Group",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case"Keyword":return{name:"Keyword",properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case"NegatedToken":return{name:"NegatedToken",properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case"RegexToken":return{name:"RegexToken",properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case"RuleCall":return{name:"RuleCall",properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case"TerminalAlternatives":return{name:"TerminalAlternatives",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"TerminalGroup":return{name:"TerminalGroup",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"TerminalRuleCall":return{name:"TerminalRuleCall",properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case"UnorderedGroup":return{name:"UnorderedGroup",properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case"UntilToken":return{name:"UntilToken",properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case"Wildcard":return{name:"Wildcard",properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}},lr=new tg});var zT={};vr(zT,{assignMandatoryProperties:()=>UN,copyAstNode:()=>VN,findLocalReferences:()=>jPe,findRootNode:()=>Pae,getContainerOfType:()=>n0,getDocument:()=>Vi,hasContainerOfType:()=>XPe,linkContentToContainer:()=>FT,streamAllContents:()=>Fc,streamAst:()=>tl,streamContents:()=>l2,streamReferences:()=>rg});function FT(t){for(let[e,r]of Object.entries(t))e.startsWith("$")||(Array.isArray(r)?r.forEach((n,i)=>{ri(n)&&(n.$container=t,n.$containerProperty=e,n.$containerIndex=i)}):ri(r)&&(r.$container=t,r.$containerProperty=e))}function n0(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function XPe(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function Vi(t){let r=Pae(t).$document;if(!r)throw new Error("AST node has no document.");return r}function Pae(t){for(;t.$container;)t=t.$container;return t}function l2(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new fo(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexl2(r,e))}function tl(t,e){if(t){if(e?.range&&!$N(t,e.range))return new Pc(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new Pc(t,r=>l2(r,e),{includeRoot:!0})}function $N(t,e){var r;if(!e)return!0;let n=(r=t.$cstNode)===null||r===void 0?void 0:r.range;return n?FD(n,e):!1}function rg(t){return new fo(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{rg(n).forEach(i=>{i.reference.ref===t&&r.push(i.reference)})}),tn(r)}function UN(t,e){let r=t.getTypeMetaData(e.$type),n=e;for(let i of r.properties)i.defaultValue!==void 0&&n[i.name]===void 0&&(n[i.name]=Bae(i.defaultValue))}function Bae(t){return Array.isArray(t)?[...t.map(Bae)]:t}function VN(t,e){let r={$type:t.$type};for(let[n,i]of Object.entries(t))if(!n.startsWith("$"))if(ri(i))r[n]=VN(i,e);else if(Ta(i))r[n]=e(r,n,i.$refNode,i.$refText);else if(Array.isArray(i)){let a=[];for(let s of i)ri(s)?a.push(VN(s,e)):Ta(s)?a.push(e(r,n,s.$refNode,s.$refText)):a.push(s);r[n]=a}else r[n]=i;return FT(r),r}var os=M(()=>{"use strict";Zo();$s();zl();o(FT,"linkContentToContainer");o(n0,"getContainerOfType");o(XPe,"hasContainerOfType");o(Vi,"getDocument");o(Pae,"findRootNode");o(l2,"streamContents");o(Fc,"streamAllContents");o(tl,"streamAst");o($N,"isAstNodeInRange");o(rg,"streamReferences");o(jPe,"findLocalReferences");o(UN,"assignMandatoryProperties");o(Bae,"copyDefaultValue");o(VN,"copyAstNode")});function ar(t){return t.charCodeAt(0)}function GT(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function ng(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function i0(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function c2(){throw Error("Internal Error - Should never get here!")}function HN(t){return t.type==="Character"}var WN=M(()=>{"use strict";o(ar,"cc");o(GT,"insertToSet");o(ng,"addFlag");o(i0,"ASSERT_EXISTS");o(c2,"ASSERT_NEVER_REACH_HERE");o(HN,"isCharacter")});var u2,h2,YN,Fae=M(()=>{"use strict";WN();u2=[];for(let t=ar("0");t<=ar("9");t++)u2.push(t);h2=[ar("_")].concat(u2);for(let t=ar("a");t<=ar("z");t++)h2.push(t);for(let t=ar("A");t<=ar("Z");t++)h2.push(t);YN=[ar(" "),ar("\f"),ar(` +`),ar("\r"),ar(" "),ar("\v"),ar(" "),ar("\xA0"),ar("\u1680"),ar("\u2000"),ar("\u2001"),ar("\u2002"),ar("\u2003"),ar("\u2004"),ar("\u2005"),ar("\u2006"),ar("\u2007"),ar("\u2008"),ar("\u2009"),ar("\u200A"),ar("\u2028"),ar("\u2029"),ar("\u202F"),ar("\u205F"),ar("\u3000"),ar("\uFEFF")]});var KPe,$T,QPe,a0,zae=M(()=>{"use strict";WN();Fae();KPe=/[0-9a-fA-F]/,$T=/[0-9]/,QPe=/[1-9]/,a0=class{static{o(this,"RegExpParser")}constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":ng(n,"global");break;case"i":ng(n,"ignoreCase");break;case"m":ng(n,"multiLine");break;case"u":ng(n,"unicode");break;case"y":ng(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break}i0(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return c2()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let a;this.isDigit()?(a=this.integerIncludingZero(),r={atLeast:i,atMost:a}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;i0(r);break}if(!(e===!0&&r===void 0)&&i0(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),i0(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):c2()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[ar(` +`),ar("\r"),ar("\u2028"),ar("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=u2;break;case"D":e=u2,r=!0;break;case"s":e=YN;break;case"S":e=YN,r=!0;break;case"w":e=h2;break;case"W":e=h2,r=!0;break}return i0(e)?{type:"Set",value:e,complement:r}:c2()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=ar("\f");break;case"n":e=ar(` +`);break;case"r":e=ar("\r");break;case"t":e=ar(" ");break;case"v":e=ar("\v");break}return i0(e)?{type:"Character",value:e}:c2()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:ar("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:ar(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:ar(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(HN(n)&&this.isRangeDash()){this.consumeChar("-");let a=this.classAtom(),s=a.type==="Character";if(HN(a)){if(a.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}});var zc,Gae=M(()=>{"use strict";zc=class{static{o(this,"BaseRegExpVisitor")}visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}});var f2=M(()=>{"use strict";zae();Gae()});var UT={};vr(UT,{NEWLINE_REGEXP:()=>XN,escapeRegExp:()=>o0,getCaseInsensitivePattern:()=>KN,getTerminalParts:()=>ZPe,isMultilineComment:()=>jN,isWhitespace:()=>VT,partialMatches:()=>QN,partialRegExp:()=>Vae});function ZPe(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=$ae.pattern(t),r=[];for(let n of e.value.value)s0.reset(t),s0.visit(n),r.push({start:s0.startRegexp,end:s0.endRegex});return r}catch{return[]}}function jN(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),s0.reset(t),s0.visit($ae.pattern(t)),s0.multiline}catch{return!1}}function VT(t){return(typeof t=="string"?new RegExp(t):t).test(" ")}function o0(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function KN(t){return Array.prototype.map.call(t,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:o0(e)).join("")}function QN(t,e){let r=Vae(t),n=e.match(r);return!!n&&n[0].length>0}function Vae(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let a="",s;function l(h){a+=r.substr(n,h),n+=h}o(l,"appendRaw");function u(h){a+="(?:"+r.substr(n,h)+"|$)",n+=h}for(o(u,"appendOptional");n",n)-n+1);break;default:u(2);break}break;case"[":s=/\[(?:\\.|.)*?\]/g,s.lastIndex=n,s=s.exec(r)||[],u(s[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":l(1);break;case"{":s=/\{\d+,?\d*\}/g,s.lastIndex=n,s=s.exec(r),s?l(s[0].length):u(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":a+="(?:",n+=3,a+=i()+"|$)";break;case"=":a+="(?=",n+=3,a+=i()+")";break;case"!":s=n,n+=3,i(),a+=r.substr(s,n-s);break;case"<":switch(r[n+3]){case"=":case"!":s=n,n+=4,i(),a+=r.substr(s,n-s);break;default:l(r.indexOf(">",n)-n+1),a+=i()+"|$)";break}break}else l(1),a+=i()+"|$)";break;case")":return++n,a;default:u(1);break}return a}return o(i,"process"),new RegExp(i(),t.flags)}var XN,$ae,qN,s0,ig=M(()=>{"use strict";f2();XN=/\r?\n/gm,$ae=new a0,qN=class extends zc{static{o(this,"TerminalRegExpVisitor")}constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` +`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=o0(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` +`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},s0=new qN;o(ZPe,"getTerminalParts");o(jN,"isMultilineComment");o(VT,"isWhitespace");o(o0,"escapeRegExp");o(KN,"getCaseInsensitivePattern");o(QN,"partialMatches");o(Vae,"partialRegExp")});var WT={};vr(WT,{findAssignment:()=>sR,findNameAssignment:()=>HT,findNodeForKeyword:()=>iR,findNodeForProperty:()=>p2,findNodesForKeyword:()=>JPe,findNodesForKeywordInternal:()=>aR,findNodesForProperty:()=>rR,getActionAtElement:()=>qae,getActionType:()=>jae,getAllReachableRules:()=>d2,getCrossReferenceTerminal:()=>eR,getEntryRule:()=>Uae,getExplicitRuleType:()=>oR,getHiddenRules:()=>Hae,getRuleType:()=>lR,getTypeName:()=>l0,isArrayCardinality:()=>tBe,isArrayOperator:()=>rBe,isCommentTerminal:()=>tR,isDataType:()=>nBe,isDataTypeRule:()=>m2,isOptionalCardinality:()=>eBe,terminalRegex:()=>ag});function Uae(t){return t.rules.find(e=>Ga(e)&&e.entry)}function Hae(t){return t.rules.filter(e=>Jo(e)&&e.hidden)}function d2(t,e){let r=new Set,n=Uae(t);if(!n)return new Set(t.rules);let i=[n].concat(Hae(t));for(let s of i)Wae(s,r,e);let a=new Set;for(let s of t.rules)(r.has(s.name)||Jo(s)&&s.hidden)&&a.add(s);return a}function Wae(t,e,r){e.add(t.name),Fc(t).forEach(n=>{if($l(n)||r&&PT(n)){let i=n.rule.ref;i&&!e.has(i.name)&&Wae(i,e,r)}})}function eR(t){if(t.terminal)return t.terminal;if(t.type.ref){let e=HT(t.type.ref);return e?.terminal}}function tR(t){return t.hidden&&!ag(t).test(" ")}function rR(t,e){return!t||!e?[]:nR(t,e,t.astNode,!0)}function p2(t,e,r){if(!t||!e)return;let n=nR(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function nR(t,e,r,n){if(!n){let i=n0(t.grammarSource,Gl);if(i&&i.feature===e)return[t]}return ho(t)&&t.astNode===r?t.content.flatMap(i=>nR(i,e,r,!1)):[]}function JPe(t,e){return t?aR(t,e,t?.astNode):[]}function iR(t,e,r){if(!t)return;let n=aR(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function aR(t,e,r){if(t.astNode!==r)return[];if(el(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=Jd(t).iterator(),i,a=[];do if(i=n.next(),!i.done){let s=i.value;s.astNode===r?el(s.grammarSource)&&s.grammarSource.value===e&&a.push(s):n.prune()}while(!i.done);return a}function sR(t){var e;let r=t.astNode;for(;r===((e=t.container)===null||e===void 0?void 0:e.astNode);){let n=n0(t.grammarSource,Gl);if(n)return n;t=t.container}}function HT(t){let e=t;return RT(e)&&(Vu(e.$container)?e=e.$container.$container:Ga(e.$container)?e=e.$container:uf(e.$container)),Yae(t,e,new Map)}function Yae(t,e,r){var n;function i(a,s){let l;return n0(a,Gl)||(l=Yae(s,s,r)),r.set(t,l),l}if(o(i,"go"),r.has(t))return r.get(t);r.set(t,void 0);for(let a of Fc(e)){if(Gl(a)&&a.feature.toLowerCase()==="name")return r.set(t,a),a;if($l(a)&&Ga(a.rule.ref))return i(a,a.rule.ref);if(IT(a)&&(!((n=a.typeRef)===null||n===void 0)&&n.ref))return i(a,a.typeRef.ref)}}function qae(t){let e=t.$container;if(hf(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let a=r[i];if(Vu(a))return a;{let s=Fc(r[i]).find(Vu);if(s)return s}}}if(a2(e))return qae(e)}function eBe(t,e){return t==="?"||t==="*"||hf(e)&&!!e.guardCondition}function tBe(t){return t==="*"||t==="+"}function rBe(t){return t==="+="}function m2(t){return Xae(t,new Set)}function Xae(t,e){if(e.has(t))return!0;e.add(t);for(let r of Fc(t))if($l(r)){if(!r.rule.ref||Ga(r.rule.ref)&&!Xae(r.rule.ref,e))return!1}else{if(Gl(r))return!1;if(Vu(r))return!1}return!!t.definition}function nBe(t){return JN(t.type,new Set)}function JN(t,e){if(e.has(t))return!0;if(e.add(t),WD(t))return!1;if(cN(t))return!1;if(mN(t))return t.types.every(r=>JN(r,e));if(IT(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return s2(r)?JN(r.type,e):!1}else return!1}else return!1}function oR(t){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e){if(Ga(e))return e.name;if(MT(e)||s2(e))return e.name}}}function l0(t){var e;if(Ga(t))return m2(t)?t.name:(e=oR(t))!==null&&e!==void 0?e:t.name;if(MT(t)||s2(t)||uN(t))return t.name;if(Vu(t)){let r=jae(t);if(r)return r}else if(RT(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function jae(t){var e;if(t.inferredType)return t.inferredType.name;if(!((e=t.type)===null||e===void 0)&&e.ref)return l0(t.type.ref)}function lR(t){var e,r,n;return Jo(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":m2(t)?t.name:(n=oR(t))!==null&&n!==void 0?n:t.name}function ag(t){let e={s:!1,i:!1,u:!1},r=sg(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}function sg(t,e){if(RN(t))return iBe(t);if(IN(t))return aBe(t);if(bN(t))return lBe(t);if(PT(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return Uu(sg(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead})}else{if(AN(t))return oBe(t);if(FN(t))return sBe(t);if(LN(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),Uu(n,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}else{if(GN(t))return Uu(cR,{cardinality:t.cardinality,lookahead:t.lookahead});throw new Error(`Invalid terminal element: ${t?.$type}`)}}}function iBe(t){return Uu(t.elements.map(e=>sg(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead})}function aBe(t){return Uu(t.elements.map(e=>sg(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead})}function sBe(t){return Uu(`${cR}*?${sg(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead})}function oBe(t){return Uu(`(?!${sg(t.terminal)})${cR}*?`,{cardinality:t.cardinality,lookahead:t.lookahead})}function lBe(t){return t.right?Uu(`[${ZN(t.left)}-${ZN(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1}):Uu(ZN(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}function ZN(t){return o0(t.value)}function Uu(t,e){var r;return(e.wrap!==!1||e.lookahead)&&(t=`(${(r=e.lookahead)!==null&&r!==void 0?r:""}${t})`),e.cardinality?`${t}${e.cardinality}`:t}var cR,Vl=M(()=>{"use strict";_T();Bc();Zo();os();zl();ig();o(Uae,"getEntryRule");o(Hae,"getHiddenRules");o(d2,"getAllReachableRules");o(Wae,"ruleDfs");o(eR,"getCrossReferenceTerminal");o(tR,"isCommentTerminal");o(rR,"findNodesForProperty");o(p2,"findNodeForProperty");o(nR,"findNodesForPropertyInternal");o(JPe,"findNodesForKeyword");o(iR,"findNodeForKeyword");o(aR,"findNodesForKeywordInternal");o(sR,"findAssignment");o(HT,"findNameAssignment");o(Yae,"findNameAssignmentInternal");o(qae,"getActionAtElement");o(eBe,"isOptionalCardinality");o(tBe,"isArrayCardinality");o(rBe,"isArrayOperator");o(m2,"isDataTypeRule");o(Xae,"isDataTypeRuleInternal");o(nBe,"isDataType");o(JN,"isDataTypeInternal");o(oR,"getExplicitRuleType");o(l0,"getTypeName");o(jae,"getActionType");o(lR,"getRuleType");o(ag,"terminalRegex");cR=/[\s\S]/.source;o(sg,"abstractElementToRegex");o(iBe,"terminalAlternativesToRegex");o(aBe,"terminalGroupToRegex");o(sBe,"untilTokenToRegex");o(oBe,"negateTokenToRegex");o(lBe,"characterRangeToRegex");o(ZN,"keywordToRegex");o(Uu,"withCardinality")});function uR(t){let e=[],r=t.Grammar;for(let n of r.rules)Jo(n)&&tR(n)&&jN(ag(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:CT}}var hR=M(()=>{"use strict";zl();Vl();ig();Bc();o(uR,"createGrammarConfig")});var fR=M(()=>{"use strict"});function og(t){console&&console.error&&console.error(`Error: ${t}`)}function g2(t){console&&console.warn&&console.warn(`Warning: ${t}`)}var Kae=M(()=>{"use strict";o(og,"PRINT_ERROR");o(g2,"PRINT_WARNING")});function y2(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}var Qae=M(()=>{"use strict";o(y2,"timer")});function v2(t){function e(){}o(e,"FakeConstructor"),e.prototype=t;let r=new e;function n(){return typeof r.bar}return o(n,"fakeAccess"),n(),n(),t;(0,eval)(t)}var Zae=M(()=>{"use strict";o(v2,"toFastProperties")});var lg=M(()=>{"use strict";Kae();Qae();Zae()});function cBe(t){return uBe(t)?t.LABEL:t.name}function uBe(t){return bi(t.LABEL)&&t.LABEL!==""}function YT(t){return Qe(t,cg)}function cg(t){function e(r){return Qe(r,cg)}if(o(e,"convertDefinition"),t instanceof nn){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return bi(t.label)&&(r.label=t.label),r}else{if(t instanceof _n)return{type:"Alternative",definition:e(t.definition)};if(t instanceof an)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Ln)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof Dn)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:cg(new Er({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof bn)return{type:"RepetitionWithSeparator",idx:t.idx,separator:cg(new Er({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Dr)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof wn)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof Er){let r={type:"Terminal",name:t.terminalType.name,label:cBe(t.terminalType),idx:t.idx};bi(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=Xo(n)?n.source:n),r}else{if(t instanceof ls)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var po,nn,ls,_n,an,Ln,Dn,Dr,bn,wn,Er,qT=M(()=>{"use strict";Ht();o(cBe,"tokenLabel");o(uBe,"hasTokenLabel");po=class{static{o(this,"AbstractProduction")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),Se(this.definition,r=>{r.accept(e)})}},nn=class extends po{static{o(this,"NonTerminal")}constructor(e){super([]),this.idx=1,va(this,zs(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},ls=class extends po{static{o(this,"Rule")}constructor(e){super(e.definition),this.orgText="",va(this,zs(e,r=>r!==void 0))}},_n=class extends po{static{o(this,"Alternative")}constructor(e){super(e.definition),this.ignoreAmbiguities=!1,va(this,zs(e,r=>r!==void 0))}},an=class extends po{static{o(this,"Option")}constructor(e){super(e.definition),this.idx=1,va(this,zs(e,r=>r!==void 0))}},Ln=class extends po{static{o(this,"RepetitionMandatory")}constructor(e){super(e.definition),this.idx=1,va(this,zs(e,r=>r!==void 0))}},Dn=class extends po{static{o(this,"RepetitionMandatoryWithSeparator")}constructor(e){super(e.definition),this.idx=1,va(this,zs(e,r=>r!==void 0))}},Dr=class extends po{static{o(this,"Repetition")}constructor(e){super(e.definition),this.idx=1,va(this,zs(e,r=>r!==void 0))}},bn=class extends po{static{o(this,"RepetitionWithSeparator")}constructor(e){super(e.definition),this.idx=1,va(this,zs(e,r=>r!==void 0))}},wn=class extends po{static{o(this,"Alternation")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,va(this,zs(e,r=>r!==void 0))}},Er=class{static{o(this,"Terminal")}constructor(e){this.idx=1,va(this,zs(e,r=>r!==void 0))}accept(e){e.visit(this)}};o(YT,"serializeGrammar");o(cg,"serializeProduction")});var cs,Jae=M(()=>{"use strict";qT();cs=class{static{o(this,"GAstVisitor")}visit(e){let r=e;switch(r.constructor){case nn:return this.visitNonTerminal(r);case _n:return this.visitAlternative(r);case an:return this.visitOption(r);case Ln:return this.visitRepetitionMandatory(r);case Dn:return this.visitRepetitionMandatoryWithSeparator(r);case bn:return this.visitRepetitionWithSeparator(r);case Dr:return this.visitRepetition(r);case wn:return this.visitAlternation(r);case Er:return this.visitTerminal(r);case ls:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}});function dR(t){return t instanceof _n||t instanceof an||t instanceof Dr||t instanceof Ln||t instanceof Dn||t instanceof bn||t instanceof Er||t instanceof ls}function c0(t,e=[]){return t instanceof an||t instanceof Dr||t instanceof bn?!0:t instanceof wn?qv(t.definition,n=>c0(n,e)):t instanceof nn&&Yn(e,t)?!1:t instanceof po?(t instanceof nn&&e.push(t),za(t.definition,n=>c0(n,e))):!1}function pR(t){return t instanceof wn}function Vs(t){if(t instanceof nn)return"SUBRULE";if(t instanceof an)return"OPTION";if(t instanceof wn)return"OR";if(t instanceof Ln)return"AT_LEAST_ONE";if(t instanceof Dn)return"AT_LEAST_ONE_SEP";if(t instanceof bn)return"MANY_SEP";if(t instanceof Dr)return"MANY";if(t instanceof Er)return"CONSUME";throw Error("non exhaustive match")}var ese=M(()=>{"use strict";Ht();qT();o(dR,"isSequenceProd");o(c0,"isOptionalProd");o(pR,"isBranchingProd");o(Vs,"getProductionDslName")});var us=M(()=>{"use strict";qT();Jae();ese()});function tse(t,e,r){return[new an({definition:[new Er({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}var Hu,XT=M(()=>{"use strict";Ht();us();Hu=class{static{o(this,"RestWalker")}walk(e,r=[]){Se(e.definition,(n,i)=>{let a=xi(e.definition,i+1);if(n instanceof nn)this.walkProdRef(n,a,r);else if(n instanceof Er)this.walkTerminal(n,a,r);else if(n instanceof _n)this.walkFlat(n,a,r);else if(n instanceof an)this.walkOption(n,a,r);else if(n instanceof Ln)this.walkAtLeastOne(n,a,r);else if(n instanceof Dn)this.walkAtLeastOneSep(n,a,r);else if(n instanceof bn)this.walkManySep(n,a,r);else if(n instanceof Dr)this.walkMany(n,a,r);else if(n instanceof wn)this.walkOr(n,a,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new an({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=tse(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new an({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=tse(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);Se(e.definition,a=>{let s=new _n({definition:[a]});this.walk(s,i)})}};o(tse,"restForRepetitionWithSeparator")});function u0(t){if(t instanceof nn)return u0(t.referencedRule);if(t instanceof Er)return dBe(t);if(dR(t))return hBe(t);if(pR(t))return fBe(t);throw Error("non exhaustive match")}function hBe(t){let e=[],r=t.definition,n=0,i=r.length>n,a,s=!0;for(;i&&s;)a=r[n],s=c0(a),e=e.concat(u0(a)),n=n+1,i=r.length>n;return Xm(e)}function fBe(t){let e=Qe(t.definition,r=>u0(r));return Xm(Wr(e))}function dBe(t){return[t.terminalType]}var mR=M(()=>{"use strict";Ht();us();o(u0,"first");o(hBe,"firstForSequence");o(fBe,"firstForBranching");o(dBe,"firstForTerminal")});var jT,gR=M(()=>{"use strict";jT="_~IN~_"});function rse(t){let e={};return Se(t,r=>{let n=new yR(r).startWalking();va(e,n)}),e}function pBe(t,e){return t.name+e+jT}var yR,nse=M(()=>{"use strict";XT();mR();Ht();gR();us();yR=class extends Hu{static{o(this,"ResyncFollowsWalker")}constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=pBe(e.referencedRule,e.idx)+this.topProd.name,a=r.concat(n),s=new _n({definition:a}),l=u0(s);this.follows[i]=l}};o(rse,"computeAllProdsFollows");o(pBe,"buildBetweenProdsFollowPrefix")});function ug(t){let e=t.toString();if(KT.hasOwnProperty(e))return KT[e];{let r=mBe.pattern(e);return KT[e]=r,r}}function ise(){KT={}}var KT,mBe,QT=M(()=>{"use strict";f2();KT={},mBe=new a0;o(ug,"getRegExpAst");o(ise,"clearRegExpParserCache")});function ose(t,e=!1){try{let r=ug(t);return vR(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===sse)e&&g2(`${x2} Unable to optimize: < ${t.toString()} > + Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),og(`${x2} + Failed parsing: < ${t.toString()} > + Using the @chevrotain/regexp-to-ast library + Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function vR(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof u=="number")ZT(u,e,r);else{let h=u;if(r===!0)for(let f=h.from;f<=h.to;f++)ZT(f,e,r);else{for(let f=h.from;f<=h.to&&f=hg){let f=h.from>=hg?h.from:hg,d=h.to,p=Gc(f),m=Gc(d);for(let g=p;g<=m;g++)e[g]=g}}}});break;case"Group":vR(s.value,e,r);break;default:throw Error("Non Exhaustive Match")}let l=s.quantifier!==void 0&&s.quantifier.atLeast===0;if(s.type==="Group"&&xR(s)===!1||s.type!=="Group"&&l===!1)break}break;default:throw Error("non exhaustive match!")}return br(e)}function ZT(t,e,r){let n=Gc(t);e[n]=n,r===!0&&gBe(t,e)}function gBe(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=Gc(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let a=Gc(i.charCodeAt(0));e[a]=a}}}function ase(t,e){return as(t.value,r=>{if(typeof r=="number")return Yn(e,r);{let n=r;return as(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function xR(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Dt(t.value)?za(t.value,xR):xR(t.value):!1}function JT(t,e){if(e instanceof RegExp){let r=ug(e),n=new bR(t);return n.visit(r),n.found}else return as(e,r=>Yn(t,r.charCodeAt(0)))!==void 0}var sse,x2,bR,lse=M(()=>{"use strict";f2();Ht();lg();QT();wR();sse="Complement Sets are not supported for first char optimization",x2=`Unable to use "first char" lexer optimizations: +`;o(ose,"getOptimizedStartCodesIndices");o(vR,"firstCharOptimizedIndices");o(ZT,"addOptimizedIdxToResult");o(gBe,"handleIgnoreCase");o(ase,"findCode");o(xR,"isWholeOptional");bR=class extends zc{static{o(this,"CharCodeFinder")}constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return}super.visitChildren(e)}}visitCharacter(e){Yn(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?ase(e,this.targetCharCodes)===void 0&&(this.found=!0):ase(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};o(JT,"canMatchCharCode")});function hse(t,e){e=rf(e,{useSticky:kR,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:o((b,w)=>w(),"tracer")});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{IBe()});let n;r("Reject Lexer.NA",()=>{n=af(t,b=>b[h0]===ci.NA)});let i=!1,a;r("Transform Patterns",()=>{i=!1,a=Qe(n,b=>{let w=b[h0];if(Xo(w)){let _=w.source;return _.length===1&&_!=="^"&&_!=="$"&&_!=="."&&!w.ignoreCase?_:_.length===2&&_[0]==="\\"&&!Yn(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],_[1])?_[1]:e.useSticky?use(w):cse(w)}else{if(_i(w))return i=!0,{exec:w};if(typeof w=="object")return i=!0,w;if(typeof w=="string"){if(w.length===1)return w;{let _=w.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),T=new RegExp(_);return e.useSticky?use(T):cse(T)}}else throw Error("non exhaustive match")}})});let s,l,u,h,f;r("misc mapping",()=>{s=Qe(n,b=>b.tokenTypeIdx),l=Qe(n,b=>{let w=b.GROUP;if(w!==ci.SKIPPED){if(bi(w))return w;if(dr(w))return!1;throw Error("non exhaustive match")}}),u=Qe(n,b=>{let w=b.LONGER_ALT;if(w)return Dt(w)?Qe(w,T=>oT(n,T)):[oT(n,w)]}),h=Qe(n,b=>b.PUSH_MODE),f=Qe(n,b=>Nt(b,"POP_MODE"))});let d;r("Line Terminator Handling",()=>{let b=xse(e.lineTerminatorCharacters);d=Qe(n,w=>!1),e.positionTracking!=="onlyOffset"&&(d=Qe(n,w=>Nt(w,"LINE_BREAKS")?!!w.LINE_BREAKS:vse(w,b)===!1&&JT(b,w.PATTERN)))});let p,m,g,y;r("Misc Mapping #2",()=>{p=Qe(n,gse),m=Qe(a,RBe),g=qr(n,(b,w)=>{let _=w.GROUP;return bi(_)&&_!==ci.SKIPPED&&(b[_]=[]),b},{}),y=Qe(a,(b,w)=>({pattern:a[w],longerAlt:u[w],canLineTerminator:d[w],isCustom:p[w],short:m[w],group:l[w],push:h[w],pop:f[w],tokenTypeIdx:s[w],tokenType:n[w]}))});let v=!0,x=[];return e.safeMode||r("First Char Optimization",()=>{x=qr(n,(b,w,_)=>{if(typeof w.PATTERN=="string"){let T=w.PATTERN.charCodeAt(0),E=Gc(T);TR(b,E,y[_])}else if(Dt(w.START_CHARS_HINT)){let T;Se(w.START_CHARS_HINT,E=>{let L=typeof E=="string"?E.charCodeAt(0):E,S=Gc(L);T!==S&&(T=S,TR(b,S,y[_]))})}else if(Xo(w.PATTERN))if(w.PATTERN.unicode)v=!1,e.ensureOptimizations&&og(`${x2} Unable to analyze < ${w.PATTERN.toString()} > pattern. + The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let T=ose(w.PATTERN,e.ensureOptimizations);cr(T)&&(v=!1),Se(T,E=>{TR(b,E,y[_])})}else e.ensureOptimizations&&og(`${x2} TokenType: <${w.name}> is using a custom token pattern without providing parameter. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),v=!1;return b},[])}),{emptyGroups:g,patternIdxToConfig:y,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:v}}function fse(t,e){let r=[],n=vBe(t);r=r.concat(n.errors);let i=xBe(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(yBe(a)),r=r.concat(ABe(a)),r=r.concat(_Be(a,e)),r=r.concat(LBe(a)),r}function yBe(t){let e=[],r=Yr(t,n=>Xo(n[h0]));return e=e.concat(wBe(r)),e=e.concat(EBe(r)),e=e.concat(SBe(r)),e=e.concat(CBe(r)),e=e.concat(TBe(r)),e}function vBe(t){let e=Yr(t,i=>!Nt(i,h0)),r=Qe(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:qn.MISSING_PATTERN,tokenTypes:[i]})),n=nf(t,e);return{errors:r,valid:n}}function xBe(t){let e=Yr(t,i=>{let a=i[h0];return!Xo(a)&&!_i(a)&&!Nt(a,"exec")&&!bi(a)}),r=Qe(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:qn.INVALID_PATTERN,tokenTypes:[i]})),n=nf(t,e);return{errors:r,valid:n}}function wBe(t){class e extends zc{static{o(this,"EndAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitEndAnchor(a){this.found=!0}}let r=Yr(t,i=>{let a=i.PATTERN;try{let s=ug(a),l=new e;return l.visit(s),l.found}catch{return bBe.test(a.source)}});return Qe(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:qn.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function TBe(t){let e=Yr(t,n=>n.PATTERN.test(""));return Qe(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:qn.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}function EBe(t){class e extends zc{static{o(this,"StartAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitStartAnchor(a){this.found=!0}}let r=Yr(t,i=>{let a=i.PATTERN;try{let s=ug(a),l=new e;return l.visit(s),l.found}catch{return kBe.test(a.source)}});return Qe(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:qn.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function SBe(t){let e=Yr(t,n=>{let i=n[h0];return i instanceof RegExp&&(i.multiline||i.global)});return Qe(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:qn.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function CBe(t){let e=[],r=Qe(t,a=>qr(t,(s,l)=>(a.PATTERN.source===l.PATTERN.source&&!Yn(e,l)&&l.PATTERN!==ci.NA&&(e.push(l),s.push(l)),s),[]));r=Rc(r);let n=Yr(r,a=>a.length>1);return Qe(n,a=>{let s=Qe(a,u=>u.name);return{message:`The same RegExp pattern ->${sa(a).PATTERN}<-has been used in all of the following Token Types: ${s.join(", ")} <-`,type:qn.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}})}function ABe(t){let e=Yr(t,n=>{if(!Nt(n,"GROUP"))return!1;let i=n.GROUP;return i!==ci.SKIPPED&&i!==ci.NA&&!bi(i)});return Qe(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:qn.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function _Be(t,e){let r=Yr(t,i=>i.PUSH_MODE!==void 0&&!Yn(e,i.PUSH_MODE));return Qe(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:qn.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function LBe(t){let e=[],r=qr(t,(n,i,a)=>{let s=i.PATTERN;return s===ci.NA||(bi(s)?n.push({str:s,idx:a,tokenType:i}):Xo(s)&&NBe(s)&&n.push({str:s.source,idx:a,tokenType:i})),n},[]);return Se(t,(n,i)=>{Se(r,({str:a,idx:s,tokenType:l})=>{if(i${l.name}<- can never be matched. +Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:u,type:qn.UNREACHABLE_PATTERN,tokenTypes:[n,l]})}})}),e}function DBe(t,e){if(Xo(e)){let r=e.exec(t);return r!==null&&r.index===0}else{if(_i(e))return e(t,0,[],{});if(Nt(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function NBe(t){return as([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function cse(t){let e=t.ignoreCase?"i":"";return new RegExp(`^(?:${t.source})`,e)}function use(t){let e=t.ignoreCase?"iy":"y";return new RegExp(`${t.source}`,e)}function dse(t,e,r){let n=[];return Nt(t,fg)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+fg+`> property in its definition +`,type:qn.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),Nt(t,ek)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+ek+`> property in its definition +`,type:qn.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),Nt(t,ek)&&Nt(t,fg)&&!Nt(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${fg}: <${t.defaultMode}>which does not exist +`,type:qn.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),Nt(t,ek)&&Se(t.modes,(i,a)=>{Se(i,(s,l)=>{if(dr(s))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${a}> at index: <${l}> +`,type:qn.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(Nt(s,"LONGER_ALT")){let u=Dt(s.LONGER_ALT)?s.LONGER_ALT:[s.LONGER_ALT];Se(u,h=>{!dr(h)&&!Yn(i,h)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${h.name}> on token <${s.name}> outside of mode <${a}> +`,type:qn.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function pse(t,e,r){let n=[],i=!1,a=Rc(Wr(br(t.modes))),s=af(a,u=>u[h0]===ci.NA),l=xse(r);return e&&Se(s,u=>{let h=vse(u,l);if(h!==!1){let d={message:MBe(u,h),type:h.issue,tokenType:u};n.push(d)}else Nt(u,"LINE_BREAKS")?u.LINE_BREAKS===!0&&(i=!0):JT(l,u.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:qn.NO_LINE_BREAKS_FLAGS}),n}function mse(t){let e={},r=Gr(t);return Se(r,n=>{let i=t[n];if(Dt(i))e[n]=[];else throw Error("non exhaustive match")}),e}function gse(t){let e=t.PATTERN;if(Xo(e))return!1;if(_i(e))return!0;if(Nt(e,"exec"))return!0;if(bi(e))return!1;throw Error("non exhaustive match")}function RBe(t){return bi(t)&&t.length===1?t.charCodeAt(0):!1}function vse(t,e){if(Nt(t,"LINE_BREAKS"))return!1;if(Xo(t.PATTERN)){try{JT(e,t.PATTERN)}catch(r){return{issue:qn.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(bi(t.PATTERN))return!1;if(gse(t))return{issue:qn.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}}function MBe(t,e){if(e.issue===qn.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern. + The problem is in the <${t.name}> Token Type + Root cause: ${e.errMsg}. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===qn.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. + The problem is in the <${t.name}> Token Type + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function xse(t){return Qe(t,r=>bi(r)?r.charCodeAt(0):r)}function TR(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}function Gc(t){return t255?255+~~(t/255):t}}var h0,fg,ek,kR,bBe,kBe,yse,hg,tk,wR=M(()=>{"use strict";f2();b2();Ht();lg();lse();QT();h0="PATTERN",fg="defaultMode",ek="modes",kR=typeof new RegExp("(?:)").sticky=="boolean";o(hse,"analyzeTokenTypes");o(fse,"validatePatterns");o(yBe,"validateRegExpPattern");o(vBe,"findMissingPatterns");o(xBe,"findInvalidPatterns");bBe=/[^\\][$]/;o(wBe,"findEndOfInputAnchor");o(TBe,"findEmptyMatchRegExps");kBe=/[^\\[][\^]|^\^/;o(EBe,"findStartOfInputAnchor");o(SBe,"findUnsupportedFlags");o(CBe,"findDuplicatePatterns");o(ABe,"findInvalidGroupType");o(_Be,"findModesThatDoNotExist");o(LBe,"findUnreachablePatterns");o(DBe,"testTokenType");o(NBe,"noMetaChar");o(cse,"addStartOfInput");o(use,"addStickyFlag");o(dse,"performRuntimeChecks");o(pse,"performWarningRuntimeChecks");o(mse,"cloneEmptyGroups");o(gse,"isCustomPattern");o(RBe,"isShortPattern");yse={test:o(function(t){let e=t.length;for(let r=this.lastIndex;r{r.isParent=r.categoryMatches.length>0})}function OBe(t){let e=rn(t),r=t,n=!0;for(;n;){r=Rc(Wr(Qe(r,a=>a.CATEGORIES)));let i=nf(r,e);e=e.concat(i),cr(i)?n=!1:r=i}return e}function PBe(t){Se(t,e=>{ER(e)||(Tse[bse]=e,e.tokenTypeIdx=bse++),wse(e)&&!Dt(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),wse(e)||(e.CATEGORIES=[]),zBe(e)||(e.categoryMatches=[]),GBe(e)||(e.categoryMatchesMap={})})}function BBe(t){Se(t,e=>{e.categoryMatches=[],Se(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push(Tse[n].tokenTypeIdx)})})}function FBe(t){Se(t,e=>{kse([],e)})}function kse(t,e){Se(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),Se(e.CATEGORIES,r=>{let n=t.concat(e);Yn(n,r)||kse(n,r)})}function ER(t){return Nt(t,"tokenTypeIdx")}function wse(t){return Nt(t,"CATEGORIES")}function zBe(t){return Nt(t,"categoryMatches")}function GBe(t){return Nt(t,"categoryMatchesMap")}function Ese(t){return Nt(t,"tokenTypeIdx")}var bse,Tse,f0=M(()=>{"use strict";Ht();o(Wu,"tokenStructuredMatcher");o(dg,"tokenStructuredMatcherNoCategories");bse=1,Tse={};o(Yu,"augmentTokenTypes");o(OBe,"expandCategories");o(PBe,"assignTokenDefaultProps");o(BBe,"assignCategoriesTokensProp");o(FBe,"assignCategoriesMapProp");o(kse,"singleAssignCategoriesToksMap");o(ER,"hasShortKeyProperty");o(wse,"hasCategoriesProperty");o(zBe,"hasExtendingTokensTypesProperty");o(GBe,"hasExtendingTokensTypesMapProperty");o(Ese,"isTokenType")});var SR,CR=M(()=>{"use strict";SR={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}}});var qn,w2,ci,b2=M(()=>{"use strict";wR();Ht();lg();f0();CR();QT();(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(qn||(qn={}));w2={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:SR,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(w2);ci=class{static{o(this,"Lexer")}constructor(e,r=w2){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let s=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:l,value:u}=y2(a),h=l>10?console.warn:console.log;return this.traceInitIndent time: ${l}ms`),this.traceInitIndent--,u}else return a()},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=va({},w2,r);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===w2.lineTerminatorsPattern)this.config.lineTerminatorsPattern=yse;else if(this.config.lineTerminatorCharacters===w2.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Dt(e)?i={modes:{defaultMode:rn(e)},defaultMode:fg}:(a=!1,i=rn(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(dse(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(pse(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},Se(i.modes,(l,u)=>{i.modes[u]=af(l,h=>dr(h))});let s=Gr(i.modes);if(Se(i.modes,(l,u)=>{this.TRACE_INIT(`Mode: <${u}> processing`,()=>{if(this.modes.push(u),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(fse(l,s))}),cr(this.lexerDefinitionErrors)){Yu(l);let h;this.TRACE_INIT("analyzeTokenTypes",()=>{h=hse(l,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[u]=h.patternIdxToConfig,this.charCodeToPatternIdxToConfig[u]=h.charCodeToPatternIdxToConfig,this.emptyGroups=va({},this.emptyGroups,h.emptyGroups),this.hasCustom=h.hasCustom||this.hasCustom,this.canModeBeOptimized[u]=h.canBeOptimized}})}),this.defaultMode=i.defaultMode,!cr(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let u=Qe(this.lexerDefinitionErrors,h=>h.message).join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+u)}Se(this.lexerDefinitionWarning,l=>{g2(l.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(kR?(this.chopInput=aa,this.match=this.matchWithTest):(this.updateLastIndex=ti,this.match=this.matchWithExec),a&&(this.handleModes=ti),this.trackStartLines===!1&&(this.computeNewColumn=aa),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=ti),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let l=qr(this.canModeBeOptimized,(u,h,f)=>(h===!1&&u.push(f),u),[]);if(r.ensureOptimizations&&!cr(l))throw Error(`Lexer Modes: < ${l.join(", ")} > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{ise()}),this.TRACE_INIT("toFastProperties",()=>{v2(this)})})}tokenize(e,r=this.defaultMode){if(!cr(this.lexerDefinitionErrors)){let i=Qe(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+i)}return this.tokenizeInternal(e,r)}tokenizeInternal(e,r){let n,i,a,s,l,u,h,f,d,p,m,g,y,v,x,b,w=e,_=w.length,T=0,E=0,L=this.hasCustom?0:Math.floor(e.length/10),S=new Array(L),A=[],I=this.trackStartLines?1:void 0,D=this.trackStartLines?1:void 0,k=mse(this.emptyGroups),R=this.trackStartLines,C=this.config.lineTerminatorsPattern,O=0,N=[],P=[],F=[],B=[];Object.freeze(B);let G;function z(){return N}o(z,"getPossiblePatternsSlow");function W(ee){let J=Gc(ee),H=P[J];return H===void 0?B:H}o(W,"getPossiblePatternsOptimized");let Z=o(ee=>{if(F.length===1&&ee.tokenType.PUSH_MODE===void 0){let J=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(ee);A.push({offset:ee.startOffset,line:ee.startLine,column:ee.startColumn,length:ee.image.length,message:J})}else{F.pop();let J=xa(F);N=this.patternIdxToConfig[J],P=this.charCodeToPatternIdxToConfig[J],O=N.length;let H=this.canModeBeOptimized[J]&&this.config.safeMode===!1;P&&H?G=W:G=z}},"pop_mode");function j(ee){F.push(ee),P=this.charCodeToPatternIdxToConfig[ee],N=this.patternIdxToConfig[ee],O=N.length,O=N.length;let J=this.canModeBeOptimized[ee]&&this.config.safeMode===!1;P&&J?G=W:G=z}o(j,"push_mode"),j.call(this,r);let oe,K=this.config.recoveryEnabled;for(;T<_;){u=null;let ee=w.charCodeAt(T),J=G(ee),H=J.length;for(n=0;nu.length){u=s,h=f,oe=ue;break}}}break}}if(u!==null){if(d=u.length,p=oe.group,p!==void 0&&(m=oe.tokenTypeIdx,g=this.createTokenInstance(u,T,m,oe.tokenType,I,D,d),this.handlePayload(g,h),p===!1?E=this.addToken(S,E,g):k[p].push(g)),e=this.chopInput(e,d),T=T+d,D=this.computeNewColumn(D,d),R===!0&&oe.canLineTerminator===!0){let q=0,Q,ae;C.lastIndex=0;do Q=C.test(u),Q===!0&&(ae=C.lastIndex-1,q++);while(Q===!0);q!==0&&(I=I+q,D=d-ae,this.updateTokenEndLineColumnLocation(g,p,ae,q,I,D,d))}this.handleModes(oe,Z,j,g)}else{let q=T,Q=I,ae=D,ue=K===!1;for(;ue===!1&&T<_;)for(e=this.chopInput(e,1),T++,i=0;i{"use strict";Ht();b2();f0();o(qu,"tokenLabel");o(AR,"hasTokenLabel");$Be="parent",Sse="categories",Cse="label",Ase="group",_se="push_mode",Lse="pop_mode",Dse="longer_alt",Nse="line_breaks",Rse="start_chars_hint";o(rk,"createToken");o(VBe,"createTokenInternal");mo=rk({name:"EOF",pattern:ci.NA});Yu([mo]);o(d0,"createTokenInstance");o(T2,"tokenMatcher")});var Xu,Mse,Ul,pg=M(()=>{"use strict";p0();Ht();us();Xu={buildMismatchTokenMessage({expected:t,actual:e,previous:r,ruleName:n}){return`Expecting ${AR(t)?`--> ${qu(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let a="Expecting: ",l=` +but found: '`+sa(e).image+"'";if(n)return a+n+l;{let u=qr(t,(p,m)=>p.concat(m),[]),h=Qe(u,p=>`[${Qe(p,m=>qu(m)).join(", ")}]`),d=`one of these possible Token sequences: +${Qe(h,(p,m)=>` ${m+1}. ${p}`).join(` +`)}`;return a+d+l}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",s=` +but found: '`+sa(e).image+"'";if(r)return i+r+s;{let u=`expecting at least one iteration which starts with one of these possible Token sequences:: + <${Qe(t,h=>`[${Qe(h,f=>qu(f)).join(",")}]`).join(" ,")}>`;return i+u+s}}};Object.freeze(Xu);Mse={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+t.name+"<-"}},Ul={buildDuplicateFoundError(t,e){function r(f){return f instanceof Er?f.terminalType.name:f instanceof nn?f.nonTerminalName:""}o(r,"getExtraProductionArgument");let n=t.name,i=sa(e),a=i.idx,s=Vs(i),l=r(i),u=a>0,h=`->${s}${u?a:""}<- ${l?`with argument: ->${l}<-`:""} + appears more than once (${e.length} times) in the top level rule: ->${n}<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return h=h.replace(/[ \t]+/g," "),h=h.replace(/\s\s+/g,` +`),h},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. +The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. +To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=Qe(t.prefixPath,i=>qu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix +in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`},buildAlternationAmbiguityError(t){let e=Qe(t.prefixPath,i=>qu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n},buildEmptyRepetitionError(t){let e=Vs(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. +This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. +Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: + inside <${t.topLevelRule.name}> Rule. + has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=Qe(t.leftRecursionPath,a=>a.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. +rule: <${e}> can be invoked from itself (directly or indirectly) +without consuming any Tokens. The grammar path that causes this is: + ${n} + To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof ls?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}}});function Ise(t,e){let r=new _R(t,e);return r.resolveRefs(),r.errors}var _R,Ose=M(()=>{"use strict";Us();Ht();us();o(Ise,"resolveGrammar");_R=class extends cs{static{o(this,"GastRefResolverVisitor")}constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){Se(br(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:Ui.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}});function sk(t,e,r=[]){r=rn(r);let n=[],i=0;function a(l){return l.concat(xi(t,i+1))}o(a,"remainingPathWith");function s(l){let u=sk(a(l),e,r);return n.concat(u)}for(o(s,"getAlternativesForProd");r.length{cr(u.definition)===!1&&(n=s(u.definition))}),n;if(l instanceof Er)r.push(l.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:xi(t,i)}),n}function ok(t,e,r,n){let i="EXIT_NONE_TERMINAL",a=[i],s="EXIT_ALTERNATIVE",l=!1,u=e.length,h=u-n-1,f=[],d=[];for(d.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!cr(d);){let p=d.pop();if(p===s){l&&xa(d).idx<=h&&d.pop();continue}let m=p.def,g=p.idx,y=p.ruleStack,v=p.occurrenceStack;if(cr(m))continue;let x=m[0];if(x===i){let b={idx:g,def:xi(m),ruleStack:zu(y),occurrenceStack:zu(v)};d.push(b)}else if(x instanceof Er)if(g=0;b--){let w=x.definition[b],_={idx:g,def:w.definition.concat(xi(m)),ruleStack:y,occurrenceStack:v};d.push(_),d.push(s)}else if(x instanceof _n)d.push({idx:g,def:x.definition.concat(xi(m)),ruleStack:y,occurrenceStack:v});else if(x instanceof ls)d.push(UBe(x,g,y,v));else throw Error("non exhaustive match")}return f}function UBe(t,e,r,n){let i=rn(r);i.push(t.name);let a=rn(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}var LR,nk,mg,ik,k2,ak,E2,S2=M(()=>{"use strict";Ht();mR();XT();us();LR=class extends Hu{static{o(this,"AbstractNextPossibleTokensWalker")}constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=rn(this.path.ruleStack).reverse(),this.occurrenceStack=rn(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){cr(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},nk=class extends LR{static{o(this,"NextAfterTokenWalker")}constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),a=new _n({definition:i});this.possibleTokTypes=u0(a),this.found=!0}}},mg=class extends Hu{static{o(this,"AbstractNextTerminalAfterProductionWalker")}constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},ik=class extends mg{static{o(this,"NextTerminalAfterManyWalker")}walkMany(e,r,n){if(e.idx===this.occurrence){let i=sa(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},k2=class extends mg{static{o(this,"NextTerminalAfterManySepWalker")}walkManySep(e,r,n){if(e.idx===this.occurrence){let i=sa(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},ak=class extends mg{static{o(this,"NextTerminalAfterAtLeastOneWalker")}walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=sa(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},E2=class extends mg{static{o(this,"NextTerminalAfterAtLeastOneSepWalker")}walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=sa(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};o(sk,"possiblePathsFrom");o(ok,"nextPossibleTokensAfter");o(UBe,"expandTopLevelRule")});function C2(t){if(t instanceof an||t==="Option")return Xn.OPTION;if(t instanceof Dr||t==="Repetition")return Xn.REPETITION;if(t instanceof Ln||t==="RepetitionMandatory")return Xn.REPETITION_MANDATORY;if(t instanceof Dn||t==="RepetitionMandatoryWithSeparator")return Xn.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof bn||t==="RepetitionWithSeparator")return Xn.REPETITION_WITH_SEPARATOR;if(t instanceof wn||t==="Alternation")return Xn.ALTERNATION;throw Error("non exhaustive match")}function ck(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,a=C2(n);return a===Xn.ALTERNATION?gg(e,r,i):yg(e,r,a,i)}function Bse(t,e,r,n,i,a){let s=gg(t,e,r),l=Use(s)?dg:Wu;return a(s,n,l,i)}function Fse(t,e,r,n,i,a){let s=yg(t,e,i,r),l=Use(s)?dg:Wu;return a(s[0],l,n)}function zse(t,e,r,n){let i=t.length,a=za(t,s=>za(s,l=>l.length===1));if(e)return function(s){let l=Qe(s,u=>u.GATE);for(let u=0;uWr(u)),l=qr(s,(u,h,f)=>(Se(h,d=>{Nt(u,d.tokenTypeIdx)||(u[d.tokenTypeIdx]=f),Se(d.categoryMatches,p=>{Nt(u,p)||(u[p]=f)})}),u),{});return function(){let u=this.LA(1);return l[u.tokenTypeIdx]}}else return function(){for(let s=0;sa.length===1),i=t.length;if(n&&!r){let a=Wr(t);if(a.length===1&&cr(a[0].categoryMatches)){let l=a[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===l}}else{let s=qr(a,(l,u,h)=>(l[u.tokenTypeIdx]=!0,Se(u.categoryMatches,f=>{l[f]=!0}),l),[]);return function(){let l=this.LA(1);return s[l.tokenTypeIdx]===!0}}}else return function(){e:for(let a=0;ask([s],1)),n=Pse(r.length),i=Qe(r,s=>{let l={};return Se(s,u=>{let h=DR(u.partialPath);Se(h,f=>{l[f]=!0})}),l}),a=r;for(let s=1;s<=e;s++){let l=a;a=Pse(l.length);for(let u=0;u{let x=DR(v.partialPath);Se(x,b=>{i[u][b]=!0})})}}}}return n}function gg(t,e,r,n){let i=new lk(t,Xn.ALTERNATION,n);return e.accept(i),$se(i.result,r)}function yg(t,e,r,n){let i=new lk(t,r);e.accept(i);let a=i.result,l=new NR(e,t,r).startWalking(),u=new _n({definition:a}),h=new _n({definition:l});return $se([u,h],n)}function uk(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function Use(t){return za(t,e=>za(e,r=>za(r,n=>cr(n.categoryMatches))))}var Xn,NR,lk,vg=M(()=>{"use strict";Ht();S2();XT();f0();us();(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(Xn||(Xn={}));o(C2,"getProdType");o(ck,"getLookaheadPaths");o(Bse,"buildLookaheadFuncForOr");o(Fse,"buildLookaheadFuncForOptionalProd");o(zse,"buildAlternativesLookAheadFunc");o(Gse,"buildSingleAlternativeLookaheadFunction");NR=class extends Hu{static{o(this,"RestDefinitionFinderWalker")}constructor(e,r,n){super(),this.topProd=e,this.targetOccurrence=r,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,r,n,i){return e.idx===this.targetOccurrence&&this.targetProdType===r?(this.restDef=n.concat(i),!0):!1}walkOption(e,r,n){this.checkIsTarget(e,Xn.OPTION,r,n)||super.walkOption(e,r,n)}walkAtLeastOne(e,r,n){this.checkIsTarget(e,Xn.REPETITION_MANDATORY,r,n)||super.walkOption(e,r,n)}walkAtLeastOneSep(e,r,n){this.checkIsTarget(e,Xn.REPETITION_MANDATORY_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}walkMany(e,r,n){this.checkIsTarget(e,Xn.REPETITION,r,n)||super.walkOption(e,r,n)}walkManySep(e,r,n){this.checkIsTarget(e,Xn.REPETITION_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}},lk=class extends cs{static{o(this,"InsideDefinitionFinderVisitor")}constructor(e,r,n){super(),this.targetOccurrence=e,this.targetProdType=r,this.targetRef=n,this.result=[]}checkIsTarget(e,r){e.idx===this.targetOccurrence&&this.targetProdType===r&&(this.targetRef===void 0||e===this.targetRef)&&(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,Xn.OPTION)}visitRepetition(e){this.checkIsTarget(e,Xn.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,Xn.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,Xn.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,Xn.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,Xn.ALTERNATION)}};o(Pse,"initializeArrayOfArrays");o(DR,"pathToHashKeys");o(HBe,"isUniquePrefixHash");o($se,"lookAheadSequenceFromAlternatives");o(gg,"getLookaheadPathsForOr");o(yg,"getLookaheadPathsForOptionalProd");o(uk,"containsPath");o(Vse,"isStrictPrefixOfPath");o(Use,"areTokenCategoriesNotUsed")});function Hse(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return Qe(e,r=>Object.assign({type:Ui.CUSTOM_LOOKAHEAD_VALIDATION},r))}function Wse(t,e,r,n){let i=ba(t,u=>WBe(u,r)),a=QBe(t,e,r),s=ba(t,u=>XBe(u,r)),l=ba(t,u=>qBe(u,t,n,r));return i.concat(a,s,l)}function WBe(t,e){let r=new RR;t.accept(r);let n=r.allProductions,i=WL(n,YBe),a=zs(i,l=>l.length>1);return Qe(br(a),l=>{let u=sa(l),h=e.buildDuplicateFoundError(t,l),f=Vs(u),d={message:h,type:Ui.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:f,occurrence:u.idx},p=Yse(u);return p&&(d.parameter=p),d})}function YBe(t){return`${Vs(t)}_#_${t.idx}_#_${Yse(t)}`}function Yse(t){return t instanceof Er?t.terminalType.name:t instanceof nn?t.nonTerminalName:""}function qBe(t,e,r,n){let i=[];if(qr(e,(s,l)=>l.name===t.name?s+1:s,0)>1){let s=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:s,type:Ui.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function qse(t,e,r){let n=[],i;return Yn(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:Ui.INVALID_RULE_OVERRIDE,ruleName:t})),n}function IR(t,e,r,n=[]){let i=[],a=hk(e.definition);if(cr(a))return[];{let s=t.name;Yn(a,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:Ui.LEFT_RECURSION,ruleName:s});let u=nf(a,n.concat([t])),h=ba(u,f=>{let d=rn(n);return d.push(f),IR(t,f,r,d)});return i.concat(h)}}function hk(t){let e=[];if(cr(t))return e;let r=sa(t);if(r instanceof nn)e.push(r.referencedRule);else if(r instanceof _n||r instanceof an||r instanceof Ln||r instanceof Dn||r instanceof bn||r instanceof Dr)e=e.concat(hk(r.definition));else if(r instanceof wn)e=Wr(Qe(r.definition,a=>hk(a.definition)));else if(!(r instanceof Er))throw Error("non exhaustive match");let n=c0(r),i=t.length>1;if(n&&i){let a=xi(t);return e.concat(hk(a))}else return e}function Xse(t,e){let r=new A2;t.accept(r);let n=r.alternations;return ba(n,a=>{let s=zu(a.definition);return ba(s,(l,u)=>{let h=ok([l],[],Wu,1);return cr(h)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:a,emptyChoiceIdx:u}),type:Ui.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:a.idx,alternative:u+1}]:[]})})}function jse(t,e,r){let n=new A2;t.accept(n);let i=n.alternations;return i=af(i,s=>s.ignoreAmbiguities===!0),ba(i,s=>{let l=s.idx,u=s.maxLookahead||e,h=gg(l,t,u,s),f=jBe(h,s,t,r),d=KBe(h,s,t,r);return f.concat(d)})}function XBe(t,e){let r=new A2;t.accept(r);let n=r.alternations;return ba(n,a=>a.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:a}),type:Ui.TOO_MANY_ALTS,ruleName:t.name,occurrence:a.idx}]:[])}function Kse(t,e,r){let n=[];return Se(t,i=>{let a=new MR;i.accept(a);let s=a.allProductions;Se(s,l=>{let u=C2(l),h=l.maxLookahead||e,f=l.idx,p=yg(f,i,u,h)[0];if(cr(Wr(p))){let m=r.buildEmptyRepetitionError({topLevelRule:i,repetition:l});n.push({message:m,type:Ui.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function jBe(t,e,r,n){let i=[],a=qr(t,(l,u,h)=>(e.definition[h].ignoreAmbiguities===!0||Se(u,f=>{let d=[h];Se(t,(p,m)=>{h!==m&&uk(p,f)&&e.definition[m].ignoreAmbiguities!==!0&&d.push(m)}),d.length>1&&!uk(i,f)&&(i.push(f),l.push({alts:d,path:f}))}),l),[]);return Qe(a,l=>{let u=Qe(l.alts,f=>f+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:u,prefixPath:l.path}),type:Ui.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:l.alts}})}function KBe(t,e,r,n){let i=qr(t,(s,l,u)=>{let h=Qe(l,f=>({idx:u,path:f}));return s.concat(h)},[]);return Rc(ba(i,s=>{if(e.definition[s.idx].ignoreAmbiguities===!0)return[];let u=s.idx,h=s.path,f=Yr(i,p=>e.definition[p.idx].ignoreAmbiguities!==!0&&p.idx{let m=[p.idx+1,u+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:m,prefixPath:p.path}),type:Ui.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:g,alternatives:m}})}))}function QBe(t,e,r){let n=[],i=Qe(e,a=>a.name);return Se(t,a=>{let s=a.name;if(Yn(i,s)){let l=r.buildNamespaceConflictError(a);n.push({message:l,type:Ui.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:s})}}),n}var RR,A2,MR,_2=M(()=>{"use strict";Ht();Us();us();vg();S2();f0();o(Hse,"validateLookahead");o(Wse,"validateGrammar");o(WBe,"validateDuplicateProductions");o(YBe,"identifyProductionForDuplicates");o(Yse,"getExtraProductionArgument");RR=class extends cs{static{o(this,"OccurrenceValidationCollector")}constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};o(qBe,"validateRuleDoesNotAlreadyExist");o(qse,"validateRuleIsOverridden");o(IR,"validateNoLeftRecursion");o(hk,"getFirstNoneTerminal");A2=class extends cs{static{o(this,"OrCollector")}constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};o(Xse,"validateEmptyOrAlternative");o(jse,"validateAmbiguousAlternationAlternatives");MR=class extends cs{static{o(this,"RepetitionCollector")}constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};o(XBe,"validateTooManyAlts");o(Kse,"validateSomeNonEmptyLookaheadPath");o(jBe,"checkAlternativesAmbiguities");o(KBe,"checkPrefixAlternativesAmbiguities");o(QBe,"checkTerminalAndNoneTerminalsNameSpace")});function Qse(t){let e=rf(t,{errMsgProvider:Mse}),r={};return Se(t.rules,n=>{r[n.name]=n}),Ise(r,e.errMsgProvider)}function Zse(t){return t=rf(t,{errMsgProvider:Ul}),Wse(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var Jse=M(()=>{"use strict";Ht();Ose();_2();pg();o(Qse,"resolveGrammar");o(Zse,"validateGrammar")});function ff(t){return Yn(ioe,t.name)}var eoe,toe,roe,noe,ioe,xg,m0,L2,D2,N2,bg=M(()=>{"use strict";Ht();eoe="MismatchedTokenException",toe="NoViableAltException",roe="EarlyExitException",noe="NotAllInputParsedException",ioe=[eoe,toe,roe,noe];Object.freeze(ioe);o(ff,"isRecognitionException");xg=class extends Error{static{o(this,"RecognitionException")}constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},m0=class extends xg{static{o(this,"MismatchedTokenException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=eoe}},L2=class extends xg{static{o(this,"NoViableAltException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=toe}},D2=class extends xg{static{o(this,"NotAllInputParsedException")}constructor(e,r){super(e,r),this.name=noe}},N2=class extends xg{static{o(this,"EarlyExitException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=roe}}});function ZBe(t,e,r,n,i,a,s){let l=this.getKeyForAutomaticLookahead(n,i),u=this.firstAfterRepMap[l];if(u===void 0){let p=this.getCurrRuleFullName(),m=this.getGAstProductions()[p];u=new a(m,i).startWalking(),this.firstAfterRepMap[l]=u}let h=u.token,f=u.occurrence,d=u.isEndOfRule;this.RULE_STACK.length===1&&d&&h===void 0&&(h=mo,f=1),!(h===void 0||f===void 0)&&this.shouldInRepetitionRecoveryBeTried(h,f,s)&&this.tryInRepetitionRecovery(t,e,r,h)}var OR,BR,PR,fk,FR=M(()=>{"use strict";p0();Ht();bg();gR();Us();OR={},BR="InRuleRecoveryException",PR=class extends Error{static{o(this,"InRuleRecoveryException")}constructor(e){super(e),this.name=BR}},fk=class{static{o(this,"Recoverable")}initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=Nt(e,"recoveryEnabled")?e.recoveryEnabled:hs.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=ZBe)}getTokenToInsert(e){let r=d0(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let a=this.findReSyncTokenType(),s=this.exportLexerState(),l=[],u=!1,h=this.LA(1),f=this.LA(1),d=o(()=>{let p=this.LA(0),m=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:h,previous:p,ruleName:this.getCurrRuleFullName()}),g=new m0(m,h,this.LA(0));g.resyncedTokens=zu(l),this.SAVE_ERROR(g)},"generateErrorMessage");for(;!u;)if(this.tokenMatcher(f,i)){d();return}else if(n.call(this)){d(),e.apply(this,r);return}else this.tokenMatcher(f,a)?u=!0:(f=this.SKIP_TOKEN(),this.addToResyncTokens(f,l));this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new PR("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||cr(r))return!1;let n=this.LA(1);return as(r,a=>this.tokenMatcher(n,a))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return Yn(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=as(e,a=>T2(r,a));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return OR;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return Qe(e,(n,i)=>i===0?OR:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=Qe(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return Wr(e)}getFollowSetFromFollowKey(e){if(e===OR)return[mo];let r=e.ruleName+e.idxInCallingRule+jT+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,mo)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return zu(r)}attemptInRepetitionRecovery(e,r,n,i,a,s,l){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=rn(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return Qe(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};o(ZBe,"attemptInRepetitionRecovery")});function dk(t,e,r){return r|e|t}var pk=M(()=>{"use strict";o(dk,"getKeyForAutomaticLookahead")});var ju,zR=M(()=>{"use strict";Ht();pg();Us();_2();vg();ju=class{static{o(this,"LLkLookaheadStrategy")}constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:hs.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(cr(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),a=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...a]}return r}validateNoLeftRecursion(e){return ba(e,r=>IR(r,r,Ul))}validateEmptyOrAlternatives(e){return ba(e,r=>Xse(r,Ul))}validateAmbiguousAlternationAlternatives(e,r){return ba(e,n=>jse(n,r,Ul))}validateSomeNonEmptyLookaheadPath(e,r){return Kse(e,r,Ul)}buildLookaheadForAlternation(e){return Bse(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,zse)}buildLookaheadForOptional(e){return Fse(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,C2(e.prodType),Gse)}}});function JBe(t){mk.reset(),t.accept(mk);let e=mk.dslMethods;return mk.reset(),e}var gk,GR,mk,aoe=M(()=>{"use strict";Ht();Us();pk();us();zR();gk=class{static{o(this,"LooksAhead")}initLooksAhead(e){this.dynamicTokensEnabled=Nt(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:hs.dynamicTokensEnabled,this.maxLookahead=Nt(e,"maxLookahead")?e.maxLookahead:hs.maxLookahead,this.lookaheadStrategy=Nt(e,"lookaheadStrategy")?e.lookaheadStrategy:new ju({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){Se(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:a,repetitionMandatory:s,repetitionMandatoryWithSeparator:l,repetitionWithSeparator:u}=JBe(r);Se(n,h=>{let f=h.idx===0?"":h.idx;this.TRACE_INIT(`${Vs(h)}${f}`,()=>{let d=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:h.idx,rule:r,maxLookahead:h.maxLookahead||this.maxLookahead,hasPredicates:h.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),p=dk(this.fullRuleNameToShort[r.name],256,h.idx);this.setLaFuncCache(p,d)})}),Se(i,h=>{this.computeLookaheadFunc(r,h.idx,768,"Repetition",h.maxLookahead,Vs(h))}),Se(a,h=>{this.computeLookaheadFunc(r,h.idx,512,"Option",h.maxLookahead,Vs(h))}),Se(s,h=>{this.computeLookaheadFunc(r,h.idx,1024,"RepetitionMandatory",h.maxLookahead,Vs(h))}),Se(l,h=>{this.computeLookaheadFunc(r,h.idx,1536,"RepetitionMandatoryWithSeparator",h.maxLookahead,Vs(h))}),Se(u,h=>{this.computeLookaheadFunc(r,h.idx,1280,"RepetitionWithSeparator",h.maxLookahead,Vs(h))})})})}computeLookaheadFunc(e,r,n,i,a,s){this.TRACE_INIT(`${s}${r===0?"":r}`,()=>{let l=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:a||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),u=dk(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(u,l)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return dk(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},GR=class extends cs{static{o(this,"DslMethodsCollectorVisitor")}constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},mk=new GR;o(JBe,"collectMethods")});function UR(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";o(UR,"setNodeLocationOnlyOffset");o(HR,"setNodeLocationFull");o(soe,"addTerminalToCst");o(ooe,"addNoneTerminalToCst")});function WR(t,e){Object.defineProperty(t,eFe,{enumerable:!1,configurable:!0,writable:!1,value:e})}var eFe,coe=M(()=>{"use strict";eFe="name";o(WR,"defineNameProp")});function tFe(t,e){let r=Gr(t),n=r.length;for(let i=0;is.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: + ${a.join(` + +`).replace(/\n/g,` + `)}`)}},"validateVisitor")};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function hoe(t,e,r){let n=o(function(){},"derivedConstructor");WR(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return Se(e,a=>{i[a]=tFe}),n.prototype=i,n.prototype.constructor=n,n}function rFe(t,e){return nFe(t,e)}function nFe(t,e){let r=Yr(e,i=>_i(t[i])===!1),n=Qe(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:YR.MISSING_METHOD,methodName:i}));return Rc(n)}var YR,foe=M(()=>{"use strict";Ht();coe();o(tFe,"defaultVisit");o(uoe,"createBaseSemanticVisitorConstructor");o(hoe,"createBaseVisitorConstructorWithDefaults");(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(YR||(YR={}));o(rFe,"validateVisitor");o(nFe,"validateMissingCstMethods")});var bk,doe=M(()=>{"use strict";loe();Ht();foe();Us();bk=class{static{o(this,"TreeBuilder")}initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=Nt(e,"nodeLocationTracking")?e.nodeLocationTracking:hs.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ti,this.cstFinallyStateUpdate=ti,this.cstPostTerminal=ti,this.cstPostNonTerminal=ti,this.cstPostRule=ti;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=HR,this.setNodeLocationFromNode=HR,this.cstPostRule=ti,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ti,this.setNodeLocationFromNode=ti,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=UR,this.setNodeLocationFromNode=UR,this.cstPostRule=ti,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ti,this.setNodeLocationFromNode=ti,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ti,this.setNodeLocationFromNode=ti,this.cstPostRule=ti,this.setInitialNodeLocation=ti;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];soe(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];ooe(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(dr(this.baseCstVisitorConstructor)){let e=uoe(this.className,Gr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(dr(this.baseCstVisitorWithDefaultsConstructor)){let e=hoe(this.className,Gr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}}});var wk,poe=M(()=>{"use strict";Us();wk=class{static{o(this,"LexerAdapter")}initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):wg}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?wg:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}}});var Tk,moe=M(()=>{"use strict";Ht();bg();Us();pg();_2();us();Tk=class{static{o(this,"RecognizerApi")}ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=Tg){if(Yn(this.definedRulesNames,e)){let s={message:Ul.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:Ui.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=Tg){let i=qse(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let a=this.defineRule(e,r,n);return this[e]=a,a}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(ff(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return YT(br(this.gastProductionsCache))}}});var kk,goe=M(()=>{"use strict";Ht();pk();bg();vg();S2();Us();FR();p0();f0();kk=class{static{o(this,"RecognizerEngine")}initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=dg,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},Nt(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if(Dt(e)){if(cr(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if(Dt(e))this.tokensMap=qr(e,(a,s)=>(a[s.name]=s,a),{});else if(Nt(e,"modes")&&za(Wr(br(e.modes)),Ese)){let a=Wr(br(e.modes)),s=Xm(a);this.tokensMap=qr(s,(l,u)=>(l[u.name]=u,l),{})}else if(xn(e))this.tokensMap=rn(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=mo;let n=Nt(e,"modes")?Wr(br(e.modes)):br(e),i=za(n,a=>cr(a.categoryMatches));this.tokenMatcher=i?dg:Wu,Yu(br(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=Nt(n,"resyncEnabled")?n.resyncEnabled:Tg.resyncEnabled,a=Nt(n,"recoveryValueFunc")?n.recoveryValueFunc:Tg.recoveryValueFunc,s=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s;let l;return this.outputCst===!0?l=o(function(...f){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f);let d=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(d),d}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTry"):l=o(function(...f){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f)}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTryCst"),Object.assign(l,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(ff(e)){let s=e;if(a){let l=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(l))if(s.resyncedTokens=this.reSyncTo(l),this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];return u.recoveredNode=!0,u}else return n(e);else{if(this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];u.recoveredNode=!0,s.partialCstResult=u}throw s}}else{if(i)return this.moveToTerminatedState(),n(e);throw s}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof e!="function"){a=e.DEF;let s=e.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=e;if(i.call(this)===!0)return a.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let s=r.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=r;if(i.call(this)===!0){let s=this.doSingleRepetition(a);for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a)}else throw this.raiseEarlyExitException(e,Xn.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,ak)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,E2],l,1536,e,E2)}else throw this.raiseEarlyExitException(e,Xn.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let l=r.GATE;if(l!==void 0){let u=i;i=o(()=>l.call(this)&&u.call(this),"lookaheadFunction")}}else a=r;let s=!0;for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,ik,s)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,k2],l,1280,e,k2)}}repetitionSepSecondInternal(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,1536,e,a)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Dt(e)?e:e.DEF,s=this.getLaFuncFromCache(n).call(this,i);if(s!==void 0)return i[s].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new D2(r,e))}}subruleInternal(e,r,n){let i;try{let a=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(a){throw this.subruleInternalError(a,n,e.ruleName)}}subruleInternalError(e,r,n){throw ff(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(a){i=this.consumeInternalRecovery(e,r,a)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new m0(i,r,a))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===BR?n:a}}else throw n}saveRecogState(){let e=this.errors,r=rn(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),mo)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}}});var Ek,yoe=M(()=>{"use strict";bg();Ht();vg();Us();Ek=class{static{o(this,"ErrorHandler")}initErrorHandler(e){this._errors=[],this.errorMessageProvider=Nt(e,"errorMessageProvider")?e.errorMessageProvider:hs.errorMessageProvider}SAVE_ERROR(e){if(ff(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:rn(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return rn(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],l=yg(e,a,r,this.maxLookahead)[0],u=[];for(let f=1;f<=this.maxLookahead;f++)u.push(this.LA(f));let h=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:l,actual:u,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new N2(h,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=gg(e,i,this.maxLookahead),s=[];for(let h=1;h<=this.maxLookahead;h++)s.push(this.LA(h));let l=this.LA(0),u=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new L2(u,this.LA(1),l))}}});var Sk,voe=M(()=>{"use strict";S2();Ht();Sk=class{static{o(this,"ContentAssist")}initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if(dr(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return ok([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=sa(e.ruleStack),i=this.getGAstProductions()[r];return new nk(i,e).startWalking()}}});function M2(t,e,r,n=!1){Ak(r);let i=xa(this.recordingProdStack),a=_i(e)?e:e.DEF,s=new t({definition:[],idx:r});return n&&(s.separator=e.SEP),Nt(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),_k}function sFe(t,e){Ak(e);let r=xa(this.recordingProdStack),n=Dt(t)===!1,i=n===!1?t:t.DEF,a=new wn({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});Nt(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD);let s=qv(i,l=>_i(l.GATE));return a.hasPredicates=s,r.definition.push(a),Se(i,l=>{let u=new _n({definition:[]});a.definition.push(u),Nt(l,"IGNORE_AMBIGUITIES")?u.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:Nt(l,"GATE")&&(u.ignoreAmbiguities=!0),this.recordingProdStack.push(u),l.ALT.call(this),this.recordingProdStack.pop()}),_k}function woe(t){return t===0?"":`${t}`}function Ak(t){if(t<0||t>boe){let e=new Error(`Invalid DSL Method idx value: <${t}> + Idx value must be a none negative value smaller than ${boe+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var _k,xoe,boe,Toe,koe,aFe,Ck,Eoe=M(()=>{"use strict";Ht();us();b2();f0();p0();Us();pk();_k={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(_k);xoe=!0,boe=Math.pow(2,8)-1,Toe=rk({name:"RECORDING_PHASE_TOKEN",pattern:ci.NA});Yu([Toe]);koe=d0(Toe,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(koe);aFe={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Ck=class{static{o(this,"GastRecorder")}initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return wg}topLevelRuleRecord(e,r){try{let n=new ls({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,r){return M2.call(this,an,e,r)}atLeastOneInternalRecord(e,r){M2.call(this,Ln,r,e)}atLeastOneSepFirstInternalRecord(e,r){M2.call(this,Dn,r,e,xoe)}manyInternalRecord(e,r){M2.call(this,Dr,r,e)}manySepFirstInternalRecord(e,r){M2.call(this,bn,r,e,xoe)}orInternalRecord(e,r){return sFe.call(this,e,r)}subruleInternalRecord(e,r,n){if(Ak(r),!e||Nt(e,"ruleName")===!1){let l=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw l.KNOWN_RECORDER_ERROR=!0,l}let i=xa(this.recordingProdStack),a=e.ruleName,s=new nn({idx:r,nonTerminalName:a,label:n?.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?aFe:_k}consumeInternalRecord(e,r,n){if(Ak(r),!ER(e)){let s=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw s.KNOWN_RECORDER_ERROR=!0,s}let i=xa(this.recordingProdStack),a=new Er({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(a),koe}};o(M2,"recordProd");o(sFe,"recordOrProd");o(woe,"getIdxSuffix");o(Ak,"assertMethodIdxIsValid")});var Lk,Soe=M(()=>{"use strict";Ht();lg();Us();Lk=class{static{o(this,"PerformanceTracer")}initPerformanceTracer(e){if(Nt(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=hs.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:a}=y2(r),s=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,a}else return r()}}});function Coe(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]})})}var Aoe=M(()=>{"use strict";o(Coe,"applyMixins")});function Dk(t=void 0){return function(){return t}}var wg,hs,Tg,Ui,I2,O2,Us=M(()=>{"use strict";Ht();lg();nse();p0();pg();Jse();FR();aoe();doe();poe();moe();goe();yoe();voe();Eoe();Soe();Aoe();_2();wg=d0(mo,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(wg);hs=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Xu,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),Tg=Object.freeze({recoveryValueFunc:o(()=>{},"recoveryValueFunc"),resyncEnabled:!0});(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(Ui||(Ui={}));o(Dk,"EMPTY_ALT");I2=class t{static{o(this,"Parser")}static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let r=this.className;this.TRACE_INIT("toFastProps",()=>{v2(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),Se(this.definedRulesNames,i=>{let s=this[i].originalGrammarAction,l;this.TRACE_INIT(`${i} Rule`,()=>{l=this.topLevelRuleRecord(i,s)}),this.gastProductionsCache[i]=l})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=Qse({rules:br(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(cr(n)&&this.skipValidations===!1){let i=Zse({rules:br(this.gastProductionsCache),tokenTypes:br(this.tokensMap),errMsgProvider:Ul,grammarName:r}),a=Hse({lookaheadStrategy:this.lookaheadStrategy,rules:br(this.gastProductionsCache),tokenTypes:br(this.tokensMap),grammarName:r});this.definitionErrors=this.definitionErrors.concat(i,a)}}),cr(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=rse(br(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,a;(a=(i=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(i,{rules:br(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(br(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!cr(this.definitionErrors))throw e=Qe(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: + ${e.join(` +------------------------------- +`)}`)})}constructor(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),Nt(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=Nt(r,"skipValidations")?r.skipValidations:hs.skipValidations}};I2.DEFER_DEFINITION_ERRORS_HANDLING=!1;Coe(I2,[fk,gk,bk,wk,kk,Tk,Ek,Sk,Ck,Lk]);O2=class extends I2{static{o(this,"EmbeddedActionsParser")}constructor(e,r=hs){let n=rn(r);n.outputCst=!1,super(e,n)}}});var _oe=M(()=>{"use strict";us()});var Loe=M(()=>{"use strict"});var Doe=M(()=>{"use strict";_oe();Loe()});var Noe=M(()=>{"use strict";fR()});var g0=M(()=>{"use strict";fR();Us();b2();p0();vg();zR();pg();bg();CR();us();us();Doe();Noe()});function y0(t,e,r){return`${t.name}_${e}_${r}`}function Ooe(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};dFe(e,t);let r=t.length;for(let n=0;nPoe(t,e,s));return Cg(t,e,n,r,...i)}function xFe(t,e,r){let n=oa(t,e,r,{type:df});pf(t,n);let i=Cg(t,e,n,r,v0(t,e,r));return bFe(t,e,r,i)}function v0(t,e,r){let n=Yr(Qe(r.definition,i=>Poe(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:TFe(t,n)}function Boe(t,e,r,n,i){let a=n.left,s=n.right,l=oa(t,e,r,{type:fFe});pf(t,l);let u=oa(t,e,r,{type:Ioe});return a.loopback=l,u.loopback=l,t.decisionMap[y0(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=l,Ni(s,l),i===void 0?(Ni(l,a),Ni(l,u)):(Ni(l,u),Ni(l,i.left),Ni(i.right,a)),{left:a,right:u}}function Foe(t,e,r,n,i){let a=n.left,s=n.right,l=oa(t,e,r,{type:hFe});pf(t,l);let u=oa(t,e,r,{type:Ioe}),h=oa(t,e,r,{type:uFe});return l.loopback=h,u.loopback=h,Ni(l,a),Ni(l,u),Ni(s,h),i!==void 0?(Ni(h,u),Ni(h,i.left),Ni(i.right,a)):Ni(h,l),t.decisionMap[y0(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=l,{left:l,right:u}}function bFe(t,e,r,n){let i=n.left,a=n.right;return Ni(i,a),t.decisionMap[y0(e,"Option",r.idx)]=i,n}function pf(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function Cg(t,e,r,n,...i){let a=oa(t,e,n,{type:cFe,start:r});r.end=a;for(let l of i)l!==void 0?(Ni(r,l.left),Ni(l.right,a)):Ni(r,a);let s={left:r,right:a};return t.decisionMap[y0(e,wFe(n),n.idx)]=r,s}function wFe(t){if(t instanceof wn)return"Alternation";if(t instanceof an)return"Option";if(t instanceof Dr)return"Repetition";if(t instanceof bn)return"RepetitionWithSeparator";if(t instanceof Ln)return"RepetitionMandatory";if(t instanceof Dn)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function TFe(t,e){let r=e.length;for(let a=0;a{"use strict";Wm();GL();g0();o(y0,"buildATNKey");df=1,lFe=2,Roe=4,Moe=5,Sg=7,cFe=8,uFe=9,hFe=10,fFe=11,Ioe=12,P2=class{static{o(this,"AbstractTransition")}constructor(e){this.target=e}isEpsilon(){return!1}},kg=class extends P2{static{o(this,"AtomTransition")}constructor(e,r){super(e),this.tokenType=r}},B2=class extends P2{static{o(this,"EpsilonTransition")}constructor(e){super(e)}isEpsilon(){return!0}},Eg=class extends P2{static{o(this,"RuleTransition")}constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};o(Ooe,"createATN");o(dFe,"createRuleStartAndStopATNStates");o(Poe,"atom");o(pFe,"repetition");o(mFe,"repetitionSep");o(gFe,"repetitionMandatory");o(yFe,"repetitionMandatorySep");o(vFe,"alternation");o(xFe,"option");o(v0,"block");o(Boe,"plus");o(Foe,"star");o(bFe,"optional");o(pf,"defineDecisionState");o(Cg,"makeAlts");o(wFe,"getProdType");o(TFe,"makeBlock");o(XR,"tokenRef");o(kFe,"ruleRef");o(EFe,"buildRuleHandle");o(Ni,"epsilon");o(oa,"newState");o(jR,"addTransition");o(SFe,"removeState")});function KR(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}var F2,Ag,Goe=M(()=>{"use strict";Wm();F2={},Ag=class{static{o(this,"ATNConfigSet")}constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){let r=KR(e);r in this.map||(this.map[r]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return Qe(this.configs,e=>e.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};o(KR,"getATNConfigKey")});function CFe(t,e){let r={};return n=>{let i=n.toString(),a=r[i];return a!==void 0||(a={atnStartState:t,decision:e,states:{}},r[i]=a),a}}function Voe(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let a of n){if(a===void 0){if(e)break;return!1}let s=[a.tokenTypeIdx].concat(a.categoryMatches);for(let l of s)if(r.has(l)){if(!i.has(l))return!1}else r.add(l),i.add(l)}}return!0}function AFe(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nqu(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${RFe(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n}function RFe(t){if(t instanceof nn)return"SUBRULE";if(t instanceof an)return"OPTION";if(t instanceof wn)return"OR";if(t instanceof Ln)return"AT_LEAST_ONE";if(t instanceof Dn)return"AT_LEAST_ONE_SEP";if(t instanceof bn)return"MANY_SEP";if(t instanceof Dr)return"MANY";if(t instanceof Er)return"CONSUME";throw Error("non exhaustive match")}function MFe(t,e,r){let n=ba(e.configs.elements,a=>a.state.transitions),i=Qre(n.filter(a=>a instanceof kg).map(a=>a.tokenType),a=>a.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function IFe(t,e){return t.edges[e.tokenTypeIdx]}function OFe(t,e,r){let n=new Ag,i=[];for(let s of t.elements){if(r.is(s.alt)===!1)continue;if(s.state.type===Sg){i.push(s);continue}let l=s.state.transitions.length;for(let u=0;u0&&!GFe(a))for(let s of i)a.add(s);return a}function PFe(t,e){if(t instanceof kg&&T2(e,t.tokenType))return t.target}function BFe(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function Hoe(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function Uoe(t,e,r,n){return n=Woe(t,n),e.edges[r.tokenTypeIdx]=n,n}function Woe(t,e){if(e===F2)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function FFe(t){let e=new Ag,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],s={state:i.pop(),alt:t.alt,stack:i};Rk(s,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function WFe(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}var Nk,$oe,z2,Yoe=M(()=>{"use strict";g0();zoe();Goe();XL();VL();Zre();Wm();_w();nT();lT();ZL();o(CFe,"createDFACache");Nk=class{static{o(this,"PredicateSet")}constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n)}initialize(e){this.atn=Ooe(e.rules),this.dfas=AFe(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:a}=e,s=this.dfas,l=this.logging,u=y0(n,"Alternation",r),f=this.atn.decisionMap[u].decision,d=Qe(ck({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),p=>Qe(p,m=>m[0]));if(Voe(d,!1)&&!a){let p=qr(d,(m,g,y)=>(Se(g,v=>{v&&(m[v.tokenTypeIdx]=y,Se(v.categoryMatches,x=>{m[x]=y}))}),m),{});return i?function(m){var g;let y=this.LA(1),v=p[y.tokenTypeIdx];if(m!==void 0&&v!==void 0){let x=(g=m[v])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return v}:function(){let m=this.LA(1);return p[m.tokenTypeIdx]}}else return i?function(p){let m=new Nk,g=p===void 0?0:p.length;for(let v=0;vQe(p,m=>m[0]));if(Voe(d)&&d[0][0]&&!a){let p=d[0],m=Wr(p);if(m.length===1&&cr(m[0].categoryMatches)){let y=m[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===y}}else{let g=qr(m,(y,v)=>(v!==void 0&&(y[v.tokenTypeIdx]=!0,Se(v.categoryMatches,x=>{y[x]=!0})),y),{});return function(){let y=this.LA(1);return g[y.tokenTypeIdx]===!0}}}return function(){let p=QR.call(this,s,f,$oe,l);return typeof p=="object"?!1:p===0}}};o(Voe,"isLL1Sequence");o(AFe,"initATNSimulator");o(QR,"adaptivePredict");o(_Fe,"performLookahead");o(LFe,"computeLookaheadTarget");o(DFe,"reportLookaheadAmbiguity");o(NFe,"buildAmbiguityError");o(RFe,"getProductionDslName");o(MFe,"buildAdaptivePredictError");o(IFe,"getExistingTargetState");o(OFe,"computeReachSet");o(PFe,"getReachableTarget");o(BFe,"getUniqueAlt");o(Hoe,"newDFAState");o(Uoe,"addDFAEdge");o(Woe,"addDFAState");o(FFe,"computeStartState");o(Rk,"closure");o(zFe,"getEpsilonTarget");o(GFe,"hasConfigInRuleStopState");o($Fe,"allConfigsInRuleStopStates");o(VFe,"hasConflictTerminatingPrediction");o(UFe,"getConflictingAltSets");o(HFe,"hasConflictingAltSet");o(WFe,"hasStateAssociatedWithOneAlt")});var qoe=M(()=>{"use strict";Yoe()});var Xoe,ZR,joe,Mk,Xr,Nr,Ik,Koe,JR,Qoe,Zoe,Joe,ele,eM,tle,rle,nle,Ok,_g,Lg,tM,Dg,ile,rM,nM,iM,aM,sM,ale,sle,oM,ole,lM,G2,lle,cle,ule,hle,fle,dle,ple,mle,Pk,gle,yle,vle,xle,ble,wle,Tle,kle,Ele,Sle,Cle,Bk,Ale,_le,Lle,Dle,Nle,Rle,Mle,Ile,Ole,Ple,Ble,Fle,zle,cM,uM,Gle,$le,Vle,Ule,Hle,Wle,Yle,qle,Xle,hM,ze,fM=M(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(Xoe||(Xoe={}));(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(ZR||(ZR={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(joe||(joe={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(Mk||(Mk={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=Mk.MAX_VALUE),i===Number.MAX_VALUE&&(i=Mk.MAX_VALUE),{line:n,character:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.uinteger(i.line)&&ze.uinteger(i.character)}o(r,"is"),t.is=r})(Xr||(Xr={}));(function(t){function e(n,i,a,s){if(ze.uinteger(n)&&ze.uinteger(i)&&ze.uinteger(a)&&ze.uinteger(s))return{start:Xr.create(n,i),end:Xr.create(a,s)};if(Xr.is(n)&&Xr.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${a}, ${s}]`)}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&Xr.is(i.start)&&Xr.is(i.end)}o(r,"is"),t.is=r})(Nr||(Nr={}));(function(t){function e(n,i){return{uri:n,range:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&Nr.is(i.range)&&(ze.string(i.uri)||ze.undefined(i.uri))}o(r,"is"),t.is=r})(Ik||(Ik={}));(function(t){function e(n,i,a,s){return{targetUri:n,targetRange:i,targetSelectionRange:a,originSelectionRange:s}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&Nr.is(i.targetRange)&&ze.string(i.targetUri)&&Nr.is(i.targetSelectionRange)&&(Nr.is(i.originSelectionRange)||ze.undefined(i.originSelectionRange))}o(r,"is"),t.is=r})(Koe||(Koe={}));(function(t){function e(n,i,a,s){return{red:n,green:i,blue:a,alpha:s}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.numberRange(i.red,0,1)&&ze.numberRange(i.green,0,1)&&ze.numberRange(i.blue,0,1)&&ze.numberRange(i.alpha,0,1)}o(r,"is"),t.is=r})(JR||(JR={}));(function(t){function e(n,i){return{range:n,color:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&Nr.is(i.range)&&JR.is(i.color)}o(r,"is"),t.is=r})(Qoe||(Qoe={}));(function(t){function e(n,i,a){return{label:n,textEdit:i,additionalTextEdits:a}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.string(i.label)&&(ze.undefined(i.textEdit)||Lg.is(i))&&(ze.undefined(i.additionalTextEdits)||ze.typedArray(i.additionalTextEdits,Lg.is))}o(r,"is"),t.is=r})(Zoe||(Zoe={}));(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(Joe||(Joe={}));(function(t){function e(n,i,a,s,l,u){let h={startLine:n,endLine:i};return ze.defined(a)&&(h.startCharacter=a),ze.defined(s)&&(h.endCharacter=s),ze.defined(l)&&(h.kind=l),ze.defined(u)&&(h.collapsedText=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.uinteger(i.startLine)&&ze.uinteger(i.startLine)&&(ze.undefined(i.startCharacter)||ze.uinteger(i.startCharacter))&&(ze.undefined(i.endCharacter)||ze.uinteger(i.endCharacter))&&(ze.undefined(i.kind)||ze.string(i.kind))}o(r,"is"),t.is=r})(ele||(ele={}));(function(t){function e(n,i){return{location:n,message:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&Ik.is(i.location)&&ze.string(i.message)}o(r,"is"),t.is=r})(eM||(eM={}));(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(tle||(tle={}));(function(t){t.Unnecessary=1,t.Deprecated=2})(rle||(rle={}));(function(t){function e(r){let n=r;return ze.objectLiteral(n)&&ze.string(n.href)}o(e,"is"),t.is=e})(nle||(nle={}));(function(t){function e(n,i,a,s,l,u){let h={range:n,message:i};return ze.defined(a)&&(h.severity=a),ze.defined(s)&&(h.code=s),ze.defined(l)&&(h.source=l),ze.defined(u)&&(h.relatedInformation=u),h}o(e,"create"),t.create=e;function r(n){var i;let a=n;return ze.defined(a)&&Nr.is(a.range)&&ze.string(a.message)&&(ze.number(a.severity)||ze.undefined(a.severity))&&(ze.integer(a.code)||ze.string(a.code)||ze.undefined(a.code))&&(ze.undefined(a.codeDescription)||ze.string((i=a.codeDescription)===null||i===void 0?void 0:i.href))&&(ze.string(a.source)||ze.undefined(a.source))&&(ze.undefined(a.relatedInformation)||ze.typedArray(a.relatedInformation,eM.is))}o(r,"is"),t.is=r})(Ok||(Ok={}));(function(t){function e(n,i,...a){let s={title:n,command:i};return ze.defined(a)&&a.length>0&&(s.arguments=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.title)&&ze.string(i.command)}o(r,"is"),t.is=r})(_g||(_g={}));(function(t){function e(a,s){return{range:a,newText:s}}o(e,"replace"),t.replace=e;function r(a,s){return{range:{start:a,end:a},newText:s}}o(r,"insert"),t.insert=r;function n(a){return{range:a,newText:""}}o(n,"del"),t.del=n;function i(a){let s=a;return ze.objectLiteral(s)&&ze.string(s.newText)&&Nr.is(s.range)}o(i,"is"),t.is=i})(Lg||(Lg={}));(function(t){function e(n,i,a){let s={label:n};return i!==void 0&&(s.needsConfirmation=i),a!==void 0&&(s.description=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&ze.string(i.label)&&(ze.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(ze.string(i.description)||i.description===void 0)}o(r,"is"),t.is=r})(tM||(tM={}));(function(t){function e(r){let n=r;return ze.string(n)}o(e,"is"),t.is=e})(Dg||(Dg={}));(function(t){function e(a,s,l){return{range:a,newText:s,annotationId:l}}o(e,"replace"),t.replace=e;function r(a,s,l){return{range:{start:a,end:a},newText:s,annotationId:l}}o(r,"insert"),t.insert=r;function n(a,s){return{range:a,newText:"",annotationId:s}}o(n,"del"),t.del=n;function i(a){let s=a;return Lg.is(s)&&(tM.is(s.annotationId)||Dg.is(s.annotationId))}o(i,"is"),t.is=i})(ile||(ile={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&oM.is(i.textDocument)&&Array.isArray(i.edits)}o(r,"is"),t.is=r})(rM||(rM={}));(function(t){function e(n,i,a){let s={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&ze.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||ze.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||ze.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||Dg.is(i.annotationId))}o(r,"is"),t.is=r})(nM||(nM={}));(function(t){function e(n,i,a,s){let l={kind:"rename",oldUri:n,newUri:i};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(l.options=a),s!==void 0&&(l.annotationId=s),l}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&ze.string(i.oldUri)&&ze.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||ze.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||ze.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||Dg.is(i.annotationId))}o(r,"is"),t.is=r})(iM||(iM={}));(function(t){function e(n,i,a){let s={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&ze.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||ze.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||ze.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||Dg.is(i.annotationId))}o(r,"is"),t.is=r})(aM||(aM={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>ze.string(i.kind)?nM.is(i)||iM.is(i)||aM.is(i):rM.is(i)))}o(e,"is"),t.is=e})(sM||(sM={}));(function(t){function e(n){return{uri:n}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)}o(r,"is"),t.is=r})(ale||(ale={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)&&ze.integer(i.version)}o(r,"is"),t.is=r})(sle||(sle={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)&&(i.version===null||ze.integer(i.version))}o(r,"is"),t.is=r})(oM||(oM={}));(function(t){function e(n,i,a,s){return{uri:n,languageId:i,version:a,text:s}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.string(i.uri)&&ze.string(i.languageId)&&ze.integer(i.version)&&ze.string(i.text)}o(r,"is"),t.is=r})(ole||(ole={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}o(e,"is"),t.is=e})(lM||(lM={}));(function(t){function e(r){let n=r;return ze.objectLiteral(r)&&lM.is(n.kind)&&ze.string(n.value)}o(e,"is"),t.is=e})(G2||(G2={}));(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(lle||(lle={}));(function(t){t.PlainText=1,t.Snippet=2})(cle||(cle={}));(function(t){t.Deprecated=1})(ule||(ule={}));(function(t){function e(n,i,a){return{newText:n,insert:i,replace:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i&&ze.string(i.newText)&&Nr.is(i.insert)&&Nr.is(i.replace)}o(r,"is"),t.is=r})(hle||(hle={}));(function(t){t.asIs=1,t.adjustIndentation=2})(fle||(fle={}));(function(t){function e(r){let n=r;return n&&(ze.string(n.detail)||n.detail===void 0)&&(ze.string(n.description)||n.description===void 0)}o(e,"is"),t.is=e})(dle||(dle={}));(function(t){function e(r){return{label:r}}o(e,"create"),t.create=e})(ple||(ple={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}o(e,"create"),t.create=e})(mle||(mle={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}o(e,"fromPlainText"),t.fromPlainText=e;function r(n){let i=n;return ze.string(i)||ze.objectLiteral(i)&&ze.string(i.language)&&ze.string(i.value)}o(r,"is"),t.is=r})(Pk||(Pk={}));(function(t){function e(r){let n=r;return!!n&&ze.objectLiteral(n)&&(G2.is(n.contents)||Pk.is(n.contents)||ze.typedArray(n.contents,Pk.is))&&(r.range===void 0||Nr.is(r.range))}o(e,"is"),t.is=e})(gle||(gle={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}o(e,"create"),t.create=e})(yle||(yle={}));(function(t){function e(r,n,...i){let a={label:r};return ze.defined(n)&&(a.documentation=n),ze.defined(i)?a.parameters=i:a.parameters=[],a}o(e,"create"),t.create=e})(vle||(vle={}));(function(t){t.Text=1,t.Read=2,t.Write=3})(xle||(xle={}));(function(t){function e(r,n){let i={range:r};return ze.number(n)&&(i.kind=n),i}o(e,"create"),t.create=e})(ble||(ble={}));(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(wle||(wle={}));(function(t){t.Deprecated=1})(Tle||(Tle={}));(function(t){function e(r,n,i,a,s){let l={name:r,kind:n,location:{uri:a,range:i}};return s&&(l.containerName=s),l}o(e,"create"),t.create=e})(kle||(kle={}));(function(t){function e(r,n,i,a){return a!==void 0?{name:r,kind:n,location:{uri:i,range:a}}:{name:r,kind:n,location:{uri:i}}}o(e,"create"),t.create=e})(Ele||(Ele={}));(function(t){function e(n,i,a,s,l,u){let h={name:n,detail:i,kind:a,range:s,selectionRange:l};return u!==void 0&&(h.children=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return i&&ze.string(i.name)&&ze.number(i.kind)&&Nr.is(i.range)&&Nr.is(i.selectionRange)&&(i.detail===void 0||ze.string(i.detail))&&(i.deprecated===void 0||ze.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}o(r,"is"),t.is=r})(Sle||(Sle={}));(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(Cle||(Cle={}));(function(t){t.Invoked=1,t.Automatic=2})(Bk||(Bk={}));(function(t){function e(n,i,a){let s={diagnostics:n};return i!=null&&(s.only=i),a!=null&&(s.triggerKind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.typedArray(i.diagnostics,Ok.is)&&(i.only===void 0||ze.typedArray(i.only,ze.string))&&(i.triggerKind===void 0||i.triggerKind===Bk.Invoked||i.triggerKind===Bk.Automatic)}o(r,"is"),t.is=r})(Ale||(Ale={}));(function(t){function e(n,i,a){let s={title:n},l=!0;return typeof i=="string"?(l=!1,s.kind=i):_g.is(i)?s.command=i:s.edit=i,l&&a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&ze.string(i.title)&&(i.diagnostics===void 0||ze.typedArray(i.diagnostics,Ok.is))&&(i.kind===void 0||ze.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||_g.is(i.command))&&(i.isPreferred===void 0||ze.boolean(i.isPreferred))&&(i.edit===void 0||sM.is(i.edit))}o(r,"is"),t.is=r})(_le||(_le={}));(function(t){function e(n,i){let a={range:n};return ze.defined(i)&&(a.data=i),a}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&Nr.is(i.range)&&(ze.undefined(i.command)||_g.is(i.command))}o(r,"is"),t.is=r})(Lle||(Lle={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&ze.uinteger(i.tabSize)&&ze.boolean(i.insertSpaces)}o(r,"is"),t.is=r})(Dle||(Dle={}));(function(t){function e(n,i,a){return{range:n,target:i,data:a}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&Nr.is(i.range)&&(ze.undefined(i.target)||ze.string(i.target))}o(r,"is"),t.is=r})(Nle||(Nle={}));(function(t){function e(n,i){return{range:n,parent:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&Nr.is(i.range)&&(i.parent===void 0||t.is(i.parent))}o(r,"is"),t.is=r})(Rle||(Rle={}));(function(t){t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator"})(Mle||(Mle={}));(function(t){t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary"})(Ile||(Ile={}));(function(t){function e(r){let n=r;return ze.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}o(e,"is"),t.is=e})(Ole||(Ole={}));(function(t){function e(n,i){return{range:n,text:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Nr.is(i.range)&&ze.string(i.text)}o(r,"is"),t.is=r})(Ple||(Ple={}));(function(t){function e(n,i,a){return{range:n,variableName:i,caseSensitiveLookup:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Nr.is(i.range)&&ze.boolean(i.caseSensitiveLookup)&&(ze.string(i.variableName)||i.variableName===void 0)}o(r,"is"),t.is=r})(Ble||(Ble={}));(function(t){function e(n,i){return{range:n,expression:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Nr.is(i.range)&&(ze.string(i.expression)||i.expression===void 0)}o(r,"is"),t.is=r})(Fle||(Fle={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.defined(i)&&Nr.is(n.stoppedLocation)}o(r,"is"),t.is=r})(zle||(zle={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}o(e,"is"),t.is=e})(cM||(cM={}));(function(t){function e(n){return{value:n}}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&(i.tooltip===void 0||ze.string(i.tooltip)||G2.is(i.tooltip))&&(i.location===void 0||Ik.is(i.location))&&(i.command===void 0||_g.is(i.command))}o(r,"is"),t.is=r})(uM||(uM={}));(function(t){function e(n,i,a){let s={position:n,label:i};return a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return ze.objectLiteral(i)&&Xr.is(i.position)&&(ze.string(i.label)||ze.typedArray(i.label,uM.is))&&(i.kind===void 0||cM.is(i.kind))&&i.textEdits===void 0||ze.typedArray(i.textEdits,Lg.is)&&(i.tooltip===void 0||ze.string(i.tooltip)||G2.is(i.tooltip))&&(i.paddingLeft===void 0||ze.boolean(i.paddingLeft))&&(i.paddingRight===void 0||ze.boolean(i.paddingRight))}o(r,"is"),t.is=r})(Gle||(Gle={}));(function(t){function e(r){return{kind:"snippet",value:r}}o(e,"createSnippet"),t.createSnippet=e})($le||($le={}));(function(t){function e(r,n,i,a){return{insertText:r,filterText:n,range:i,command:a}}o(e,"create"),t.create=e})(Vle||(Vle={}));(function(t){function e(r){return{items:r}}o(e,"create"),t.create=e})(Ule||(Ule={}));(function(t){t.Invoked=0,t.Automatic=1})(Hle||(Hle={}));(function(t){function e(r,n){return{range:r,text:n}}o(e,"create"),t.create=e})(Wle||(Wle={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}o(e,"create"),t.create=e})(Yle||(Yle={}));(function(t){function e(r){let n=r;return ze.objectLiteral(n)&&ZR.is(n.uri)&&ze.string(n.name)}o(e,"is"),t.is=e})(qle||(qle={}));(function(t){function e(a,s,l,u){return new hM(a,s,l,u)}o(e,"create"),t.create=e;function r(a){let s=a;return!!(ze.defined(s)&&ze.string(s.uri)&&(ze.undefined(s.languageId)||ze.string(s.languageId))&&ze.uinteger(s.lineCount)&&ze.func(s.getText)&&ze.func(s.positionAt)&&ze.func(s.offsetAt))}o(r,"is"),t.is=r;function n(a,s){let l=a.getText(),u=i(s,(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),h=l.length;for(let f=u.length-1;f>=0;f--){let d=u[f],p=a.offsetAt(d.range.start),m=a.offsetAt(d.range.end);if(m<=h)l=l.substring(0,p)+d.newText+l.substring(m,l.length);else throw new Error("Overlapping edit");h=p}return l}o(n,"applyEdits"),t.applyEdits=n;function i(a,s){if(a.length<=1)return a;let l=a.length/2|0,u=a.slice(0,l),h=a.slice(l);i(u,s),i(h,s);let f=0,d=0,p=0;for(;f0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return Xr.create(0,e);for(;ne?i=s:n=s+1}let a=n-1;return Xr.create(a,e-r[a])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}o(n,"undefined"),t.undefined=n;function i(m){return m===!0||m===!1}o(i,"boolean"),t.boolean=i;function a(m){return e.call(m)==="[object String]"}o(a,"string"),t.string=a;function s(m){return e.call(m)==="[object Number]"}o(s,"number"),t.number=s;function l(m,g,y){return e.call(m)==="[object Number]"&&g<=m&&m<=y}o(l,"numberRange"),t.numberRange=l;function u(m){return e.call(m)==="[object Number]"&&-2147483648<=m&&m<=2147483647}o(u,"integer"),t.integer=u;function h(m){return e.call(m)==="[object Number]"&&0<=m&&m<=2147483647}o(h,"uinteger"),t.uinteger=h;function f(m){return e.call(m)==="[object Function]"}o(f,"func"),t.func=f;function d(m){return m!==null&&typeof m=="object"}o(d,"objectLiteral"),t.objectLiteral=d;function p(m,g){return Array.isArray(m)&&m.every(g)}o(p,"typedArray"),t.typedArray=p})(ze||(ze={}))});var $2,V2,x0,b0,dM,Ng,Fk=M(()=>{"use strict";fM();Zo();zl();$2=class{static{o(this,"CstNodeBuilder")}constructor(){this.nodeStack=[]}get current(){return this.nodeStack[this.nodeStack.length-1]}buildRootNode(e){return this.rootNode=new Ng(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new b0;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new x0(e.startOffset,e.image.length,eg(e),e.tokenType,!1);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}construct(e){let r=this.current;typeof e.$type=="string"&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}addHiddenTokens(e){for(let r of e){let n=new x0(r.startOffset,r.image.length,eg(r),r.tokenType,!0);n.root=this.rootNode,this.addHiddenToken(this.rootNode,n)}}addHiddenToken(e,r){let{offset:n,end:i}=r;for(let a=0;al&&i=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},dM=class t extends Array{static{o(this,"CstNodeContainer")}constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},Ng=class extends b0{static{o(this,"RootCstNodeImpl")}get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}}});function pM(t){return t.$type===zk}var zk,jle,Kle,U2,H2,Gk,Rg,W2,YFe,mM,Y2=M(()=>{"use strict";g0();qoe();Bc();Vl();os();Fk();zk=Symbol("Datatype");o(pM,"isDataTypeNode");jle="\u200B",Kle=o(t=>t.endsWith(jle)?t:t+jle,"withRuleSuffix"),U2=class{static{o(this,"AbstractLangiumParser")}constructor(e){this._unorderedGroups=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition;this.wrapper=new mM(r,Object.assign(Object.assign({},e.parser.ParserConfig),{errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},H2=class extends U2{static{o(this,"LangiumParser")}get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new $2,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=e.fragment?void 0:m2(e)?zk:l0(e),i=this.wrapper.DEFINE_RULE(Kle(e.name),this.startImplementation(n,r).bind(this));return e.entry&&(this.mainRule=i),i}parse(e){this.nodeBuilder.buildRootNode(e);let r=this.lexer.tokenize(e);this.wrapper.input=r.tokens;let n=this.mainRule.call(this.wrapper,{});return this.nodeBuilder.addHiddenTokens(r.hidden),this.unorderedGroups.clear(),{value:n,lexerErrors:r.errors,parserErrors:this.wrapper.errors}}startImplementation(e,r){return n=>{if(!this.isRecording()){let a={$type:e};this.stack.push(a),e===zk&&(a.value="")}let i;try{i=r(n)}catch{i=void 0}return!this.isRecording()&&i===void 0&&(i=this.construct()),i}}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let a=this.nodeBuilder.buildLeafNode(i,n),{assignment:s,isCrossRef:l}=this.getAssignment(n),u=this.current;if(s){let h=el(n)?i.image:this.converter.convert(i.image,a);this.assign(s.operator,s.feature,h,a,l)}else if(pM(u)){let h=i.image;el(n)||(h=this.converter.convert(h,a).toString()),u.value+=h}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i){let a;this.isRecording()||(a=this.nodeBuilder.buildCompositeNode(n));let s=this.wrapper.wrapSubrule(e,r,i);!this.isRecording()&&a&&a.length>0&&this.performSubruleAssignment(s,n,a)}performSubruleAssignment(e,r,n){let{assignment:i,isCrossRef:a}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,a);else if(!i){let s=this.current;if(pM(s))s.value+=e.toString();else if(typeof e=="object"&&e){let l=e.$type,u=this.assignWithoutOverride(e,s);l&&(u.$type=l);let h=u;this.stack.pop(),this.stack.push(h)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(!n.$cstNode&&r.feature&&r.operator){n=this.construct(!1);let a=n.$cstNode.feature;this.nodeBuilder.buildCompositeNode(a)}let i={$type:e};this.stack.pop(),this.stack.push(i),r.feature&&r.operator&&this.assign(r.operator,r.feature,n,n.$cstNode,!1)}}construct(e=!0){if(this.isRecording())return;let r=this.current;return FT(r),this.nodeBuilder.construct(r),e&&this.stack.pop(),pM(r)?this.converter.convert(r.value,r.$cstNode):(UN(this.astReflection,r),r)}getAssignment(e){if(!this.assignmentMap.has(e)){let r=n0(e,Gl);this.assignmentMap.set(e,{assignment:r,isCrossRef:r?r0(r.terminal):!1})}return this.assignmentMap.get(e)}assign(e,r,n,i,a){let s=this.current,l;switch(a&&typeof n=="string"?l=this.linker.buildReference(s,r,i,n):l=n,e){case"=":{s[r]=l;break}case"?=":{s[r]=!0;break}case"+=":Array.isArray(s[r])||(s[r]=[]),s[r].push(l)}}assignWithoutOverride(e,r){for(let[n,i]of Object.entries(r)){let a=e[n];a===void 0?e[n]=i:Array.isArray(a)&&Array.isArray(i)&&(i.push(...a),e[n]=i)}return e}get definitionErrors(){return this.wrapper.definitionErrors}},Gk=class{static{o(this,"AbstractParserErrorMessageProvider")}buildMismatchTokenMessage(e){return Xu.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Xu.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Xu.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Xu.buildEarlyExitMessage(e)}},Rg=class extends Gk{static{o(this,"LangiumParserErrorMessageProvider")}buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},W2=class extends U2{static{o(this,"LangiumCompletionParser")}constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e);return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(Kle(e.name),this.startImplementation(r).bind(this));return e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i){this.before(n),this.wrapper.wrapSubrule(e,r,i),this.after(n)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},YFe={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new Rg},mM=class extends O2{static{o(this,"ChevrotainWrapper")}constructor(e,r){let n=r&&"maxLookahead"in r;super(e,Object.assign(Object.assign(Object.assign({},YFe),{lookaheadStrategy:n?new ju({maxLookahead:r.maxLookahead}):new z2}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r){return this.RULE(e,r)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}}});function Vk(t,e,r){return qFe({parser:e,tokens:r,rules:new Map,ruleNames:new Map},t),e}function qFe(t,e){let r=d2(e,!1),n=tn(e.rules).filter(Ga).filter(i=>r.has(i));for(let i of n){let a=Object.assign(Object.assign({},t),{consume:1,optional:1,subrule:1,many:1,or:1});a.rules.set(i.name,t.parser.rule(i,w0(a,i.definition)))}}function w0(t,e,r=!1){let n;if(el(e))n=eze(t,e);else if(Vu(e))n=XFe(t,e);else if(Gl(e))n=w0(t,e.terminal);else if(r0(e))n=Qle(t,e);else if($l(e))n=jFe(t,e);else if(OT(e))n=QFe(t,e);else if(BT(e))n=ZFe(t,e);else if(hf(e))n=JFe(t,e);else if(kN(e)){let i=t.consume++;n=o(()=>t.parser.consume(i,mo,e),"method")}else throw new t0(e.$cstNode,`Unexpected element type: ${e.$type}`);return Zle(t,r?void 0:$k(e),n,e.cardinality)}function XFe(t,e){let r=l0(e);return()=>t.parser.action(r,e)}function jFe(t,e){let r=e.rule.ref;if(Ga(r)){let n=t.subrule++,i=e.arguments.length>0?KFe(r,e.arguments):()=>({});return a=>t.parser.subrule(n,Jle(t,r),e,i(a))}else if(Jo(r)){let n=t.consume++,i=gM(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)uf(r);else throw new t0(e.$cstNode,`Undefined rule type: ${e.$type}`)}function KFe(t,e){let r=e.map(n=>Ku(n.value));return n=>{let i={};for(let a=0;ae(n)||r(n)}else if(jD(t)){let e=Ku(t.left),r=Ku(t.right);return n=>e(n)&&r(n)}else if(rN(t)){let e=Ku(t.value);return r=>!e(r)}else if(sN(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(qD(t)){let e=!!t.true;return()=>e}uf(t)}function QFe(t,e){if(e.elements.length===1)return w0(t,e.elements[0]);{let r=[];for(let i of e.elements){let a={ALT:w0(t,i,!0)},s=$k(i);s&&(a.GATE=Ku(s)),r.push(a)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(a=>{let s={ALT:o(()=>a.ALT(i),"ALT")},l=a.GATE;return l&&(s.GATE=()=>l(i)),s}))}}function ZFe(t,e){if(e.elements.length===1)return w0(t,e.elements[0]);let r=[];for(let l of e.elements){let u={ALT:w0(t,l,!0)},h=$k(l);h&&(u.GATE=Ku(h)),r.push(u)}let n=t.or++,i=o((l,u)=>{let h=u.getRuleStack().join("-");return`uGroup_${l}_${h}`},"idFunc"),a=o(l=>t.parser.alternatives(n,r.map((u,h)=>{let f={ALT:o(()=>!0,"ALT")},d=t.parser;f.ALT=()=>{if(u.ALT(l),!d.isRecording()){let m=i(n,d);d.unorderedGroups.get(m)||d.unorderedGroups.set(m,[]);let g=d.unorderedGroups.get(m);typeof g?.[h]>"u"&&(g[h]=!0)}};let p=u.GATE;return p?f.GATE=()=>p(l):f.GATE=()=>{let m=d.unorderedGroups.get(i(n,d));return!m?.[h]},f})),"alternatives"),s=Zle(t,$k(e),a,"*");return l=>{s(l),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function JFe(t,e){let r=e.elements.map(n=>w0(t,n));return n=>r.forEach(i=>i(n))}function $k(t){if(hf(t))return t.guardCondition}function Qle(t,e,r=e.terminal){if(r)if($l(r)&&Ga(r.rule.ref)){let n=t.subrule++;return i=>t.parser.subrule(n,Jle(t,r.rule.ref),e,i)}else if($l(r)&&Jo(r.rule.ref)){let n=t.consume++,i=gM(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(el(r)){let n=t.consume++,i=gM(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let n=HT(e.type.ref),i=n?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+l0(e.type.ref));return Qle(t,e,i)}}function eze(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function Zle(t,e,r,n){let i=e&&Ku(e);if(!n)if(i){let a=t.or++;return s=>t.parser.alternatives(a,[{ALT:o(()=>r(s),"ALT"),GATE:o(()=>i(s),"GATE")},{ALT:Dk(),GATE:o(()=>!i(s),"GATE")}])}else return r;if(n==="*"){let a=t.many++;return s=>t.parser.many(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else if(n==="+"){let a=t.many++;if(i){let s=t.or++;return l=>t.parser.alternatives(s,[{ALT:o(()=>t.parser.atLeastOne(a,{DEF:o(()=>r(l),"DEF")}),"ALT"),GATE:o(()=>i(l),"GATE")},{ALT:Dk(),GATE:o(()=>!i(l),"GATE")}])}else return s=>t.parser.atLeastOne(a,{DEF:o(()=>r(s),"DEF")})}else if(n==="?"){let a=t.optional++;return s=>t.parser.optional(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else uf(n)}function Jle(t,e){let r=tze(t,e),n=t.rules.get(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function tze(t,e){if(Ga(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!Ga(n);)(hf(n)||OT(n)||BT(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function gM(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}var yM=M(()=>{"use strict";g0();Bc();_T();$s();Vl();o(Vk,"createParser");o(qFe,"buildRules");o(w0,"buildElement");o(XFe,"buildAction");o(jFe,"buildRuleCall");o(KFe,"buildRuleCallPredicate");o(Ku,"buildPredicate");o(QFe,"buildAlternatives");o(ZFe,"buildUnorderedGroup");o(JFe,"buildGroup");o($k,"getGuardCondition");o(Qle,"buildCrossReference");o(eze,"buildKeyword");o(Zle,"wrap");o(Jle,"getRule");o(tze,"getRuleName");o(gM,"getToken")});function vM(t){let e=t.Grammar,r=t.parser.Lexer,n=new W2(t);return Vk(e,n,r.definition),n.finalize(),n}var xM=M(()=>{"use strict";Y2();yM();o(vM,"createCompletionParser")});function bM(t){let e=ece(t);return e.finalize(),e}function ece(t){let e=t.Grammar,r=t.parser.Lexer,n=new H2(t);return Vk(e,n,r.definition)}var wM=M(()=>{"use strict";Y2();yM();o(bM,"createLangiumParser");o(ece,"prepareLangiumParser")});var T0,TM=M(()=>{"use strict";g0();Bc();os();Vl();ig();$s();T0=class{static{o(this,"DefaultTokenBuilder")}buildTokens(e,r){let n=tn(d2(e,!1)),i=this.buildTerminalTokens(n),a=this.buildKeywordTokens(n,i,r);return i.forEach(s=>{let l=s.PATTERN;typeof l=="object"&&l&&"test"in l&&VT(l)?a.unshift(s):a.push(s)}),a}buildTerminalTokens(e){return e.filter(Jo).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=ag(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n,LINE_BREAKS:!0};return e.hidden&&(i.GROUP=VT(r)?ci.SKIPPED:"hidden"),i}requiresCustomPattern(e){return e.flags.includes("u")?!0:!!(e.source.includes("?<=")||e.source.includes("?(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Ga).flatMap(i=>Fc(i).filter(el)).distinct(i=>i.value).toArray().sort((i,a)=>a.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){return{name:e.value,PATTERN:this.buildKeywordPattern(e,n),LONGER_ALT:this.findLongerAlt(e,r)}}buildKeywordPattern(e,r){return r?new RegExp(KN(e.value)):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let a=i?.PATTERN;return a?.source&&QN("^"+a.source+"$",e.value)&&n.push(i),n},[])}}});var k0,$c,kM=M(()=>{"use strict";Bc();Vl();k0=class{static{o(this,"DefaultValueConverter")}convert(e,r){let n=r.grammarSource;if(r0(n)&&(n=eR(n)),$l(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){var i;switch(e.name.toUpperCase()){case"INT":return $c.convertInt(r);case"STRING":return $c.convertString(r);case"ID":return $c.convertID(r)}switch((i=lR(e))===null||i===void 0?void 0:i.toLowerCase()){case"number":return $c.convertNumber(r);case"boolean":return $c.convertBoolean(r);case"bigint":return $c.convertBigint(r);case"date":return $c.convertDate(r);default:return r}}};(function(t){function e(h){let f="";for(let d=1;d{"use strict";Object.defineProperty(CM,"__esModule",{value:!0});var EM;function SM(){if(EM===void 0)throw new Error("No runtime abstraction layer installed");return EM}o(SM,"RAL");(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");EM=r}o(e,"install"),t.install=e})(SM||(SM={}));CM.default=SM});var nce=Ei($a=>{"use strict";Object.defineProperty($a,"__esModule",{value:!0});$a.stringArray=$a.array=$a.func=$a.error=$a.number=$a.string=$a.boolean=void 0;function rze(t){return t===!0||t===!1}o(rze,"boolean");$a.boolean=rze;function tce(t){return typeof t=="string"||t instanceof String}o(tce,"string");$a.string=tce;function nze(t){return typeof t=="number"||t instanceof Number}o(nze,"number");$a.number=nze;function ize(t){return t instanceof Error}o(ize,"error");$a.error=ize;function aze(t){return typeof t=="function"}o(aze,"func");$a.func=aze;function rce(t){return Array.isArray(t)}o(rce,"array");$a.array=rce;function sze(t){return rce(t)&&t.every(e=>tce(e))}o(sze,"stringArray");$a.stringArray=sze});var LM=Ei(Mg=>{"use strict";Object.defineProperty(Mg,"__esModule",{value:!0});Mg.Emitter=Mg.Event=void 0;var oze=AM(),ice;(function(t){let e={dispose(){}};t.None=function(){return e}})(ice||(Mg.Event=ice={}));var _M=class{static{o(this,"CallbackList")}add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:o(()=>this.remove(e,r),"dispose")})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,a=this._callbacks.length;i{this._callbacks||(this._callbacks=new _M),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:o(()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))},"dispose")};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};Mg.Emitter=Uk;Uk._noop=function(){}});var ace=Ei(Ig=>{"use strict";Object.defineProperty(Ig,"__esModule",{value:!0});Ig.CancellationTokenSource=Ig.CancellationToken=void 0;var lze=AM(),cze=nce(),DM=LM(),Hk;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:DM.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:DM.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||cze.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}o(e,"is"),t.is=e})(Hk||(Ig.CancellationToken=Hk={}));var uze=Object.freeze(function(t,e){let r=(0,lze.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),Wk=class{static{o(this,"MutableToken")}constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?uze:(this._emitter||(this._emitter=new DM.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},NM=class{static{o(this,"CancellationTokenSource")}get token(){return this._token||(this._token=new Wk),this._token}cancel(){this._token?this._token.cancel():this._token=Hk.Cancelled}dispose(){this._token?this._token instanceof Wk&&this._token.dispose():this._token=Hk.None}};Ig.CancellationTokenSource=NM});var Ar={};var rl=M(()=>{"use strict";Sr(Ar,Ji(ace(),1))});function MM(){return new Promise(t=>{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}function oce(){return RM=Date.now(),new Ar.CancellationTokenSource}function lce(t){sce=t}function mf(t){return t===Vc}async function Hi(t){if(t===Ar.CancellationToken.None)return;let e=Date.now();if(e-RM>=sce&&(RM=e,await MM()),t.isCancellationRequested)throw Vc}var RM,sce,Vc,fs,nl=M(()=>{"use strict";rl();o(MM,"delayNextTick");RM=0,sce=10;o(oce,"startCancelableOperation");o(lce,"setInterruptionPeriod");Vc=Symbol("OperationCancelled");o(mf,"isOperationCancelled");o(Hi,"interruptAndCheck");fs=class{static{o(this,"Deferred")}constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}}});function IM(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);IM(n,e),IM(i,e);let a=0,s=0,l=0;for(;ar.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function hze(t){let e=hce(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var Yk,Og,fce=M(()=>{"use strict";Yk=class t{static{o(this,"FullTextDocument")}constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=hce(n.range),a=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(s,this._content.length);let l=Math.max(i.start.line,0),u=Math.max(i.end.line,0),h=this._lineOffsets,f=cce(n.text,!1,a);if(u-l===f.length)for(let p=0,m=f.length;pe?i=s:n=s+1}let a=n-1;return e=this.ensureBeforeEOL(e,r[a]),{line:a,character:e-r[a]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&uce(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}};(function(t){function e(i,a,s,l){return new Yk(i,a,s,l)}o(e,"create"),t.create=e;function r(i,a,s){if(i instanceof Yk)return i.update(a,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}o(r,"update"),t.update=r;function n(i,a){let s=i.getText(),l=IM(a.map(hze),(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),u=0,h=[];for(let f of l){let d=i.offsetAt(f.range.start);if(du&&h.push(s.substring(u,d)),f.newText.length&&h.push(f.newText),u=i.offsetAt(f.range.end)}return h.push(s.substr(u)),h.join("")}o(n,"applyEdits"),t.applyEdits=n})(Og||(Og={}));o(IM,"mergeSort");o(cce,"computeLineOffsets");o(uce,"isEOL");o(hce,"getWellformedRange");o(hze,"getWellformedEdit")});var dce,Hs,Pg,OM=M(()=>{"use strict";(()=>{"use strict";var t={470:i=>{function a(u){if(typeof u!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(u))}o(a,"e");function s(u,h){for(var f,d="",p=0,m=-1,g=0,y=0;y<=u.length;++y){if(y2){var v=d.lastIndexOf("/");if(v!==d.length-1){v===-1?(d="",p=0):p=(d=d.slice(0,v)).length-1-d.lastIndexOf("/"),m=y,g=0;continue}}else if(d.length===2||d.length===1){d="",p=0,m=y,g=0;continue}}h&&(d.length>0?d+="/..":d="..",p=2)}else d.length>0?d+="/"+u.slice(m+1,y):d=u.slice(m+1,y),p=y-m-1;m=y,g=0}else f===46&&g!==-1?++g:g=-1}return d}o(s,"r");var l={resolve:o(function(){for(var u,h="",f=!1,d=arguments.length-1;d>=-1&&!f;d--){var p;d>=0?p=arguments[d]:(u===void 0&&(u=process.cwd()),p=u),a(p),p.length!==0&&(h=p+"/"+h,f=p.charCodeAt(0)===47)}return h=s(h,!f),f?h.length>0?"/"+h:"/":h.length>0?h:"."},"resolve"),normalize:o(function(u){if(a(u),u.length===0)return".";var h=u.charCodeAt(0)===47,f=u.charCodeAt(u.length-1)===47;return(u=s(u,!h)).length!==0||h||(u="."),u.length>0&&f&&(u+="/"),h?"/"+u:u},"normalize"),isAbsolute:o(function(u){return a(u),u.length>0&&u.charCodeAt(0)===47},"isAbsolute"),join:o(function(){if(arguments.length===0)return".";for(var u,h=0;h0&&(u===void 0?u=f:u+="/"+f)}return u===void 0?".":l.normalize(u)},"join"),relative:o(function(u,h){if(a(u),a(h),u===h||(u=l.resolve(u))===(h=l.resolve(h)))return"";for(var f=1;fy){if(h.charCodeAt(m+x)===47)return h.slice(m+x+1);if(x===0)return h.slice(m+x)}else p>y&&(u.charCodeAt(f+x)===47?v=x:x===0&&(v=0));break}var b=u.charCodeAt(f+x);if(b!==h.charCodeAt(m+x))break;b===47&&(v=x)}var w="";for(x=f+v+1;x<=d;++x)x!==d&&u.charCodeAt(x)!==47||(w.length===0?w+="..":w+="/..");return w.length>0?w+h.slice(m+v):(m+=v,h.charCodeAt(m)===47&&++m,h.slice(m))},"relative"),_makeLong:o(function(u){return u},"_makeLong"),dirname:o(function(u){if(a(u),u.length===0)return".";for(var h=u.charCodeAt(0),f=h===47,d=-1,p=!0,m=u.length-1;m>=1;--m)if((h=u.charCodeAt(m))===47){if(!p){d=m;break}}else p=!1;return d===-1?f?"/":".":f&&d===1?"//":u.slice(0,d)},"dirname"),basename:o(function(u,h){if(h!==void 0&&typeof h!="string")throw new TypeError('"ext" argument must be a string');a(u);var f,d=0,p=-1,m=!0;if(h!==void 0&&h.length>0&&h.length<=u.length){if(h.length===u.length&&h===u)return"";var g=h.length-1,y=-1;for(f=u.length-1;f>=0;--f){var v=u.charCodeAt(f);if(v===47){if(!m){d=f+1;break}}else y===-1&&(m=!1,y=f+1),g>=0&&(v===h.charCodeAt(g)?--g==-1&&(p=f):(g=-1,p=y))}return d===p?p=y:p===-1&&(p=u.length),u.slice(d,p)}for(f=u.length-1;f>=0;--f)if(u.charCodeAt(f)===47){if(!m){d=f+1;break}}else p===-1&&(m=!1,p=f+1);return p===-1?"":u.slice(d,p)},"basename"),extname:o(function(u){a(u);for(var h=-1,f=0,d=-1,p=!0,m=0,g=u.length-1;g>=0;--g){var y=u.charCodeAt(g);if(y!==47)d===-1&&(p=!1,d=g+1),y===46?h===-1?h=g:m!==1&&(m=1):h!==-1&&(m=-1);else if(!p){f=g+1;break}}return h===-1||d===-1||m===0||m===1&&h===d-1&&h===f+1?"":u.slice(h,d)},"extname"),format:o(function(u){if(u===null||typeof u!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof u);return function(h,f){var d=f.dir||f.root,p=f.base||(f.name||"")+(f.ext||"");return d?d===f.root?d+p:d+"/"+p:p}(0,u)},"format"),parse:o(function(u){a(u);var h={root:"",dir:"",base:"",ext:"",name:""};if(u.length===0)return h;var f,d=u.charCodeAt(0),p=d===47;p?(h.root="/",f=1):f=0;for(var m=-1,g=0,y=-1,v=!0,x=u.length-1,b=0;x>=f;--x)if((d=u.charCodeAt(x))!==47)y===-1&&(v=!1,y=x+1),d===46?m===-1?m=x:b!==1&&(b=1):m!==-1&&(b=-1);else if(!v){g=x+1;break}return m===-1||y===-1||b===0||b===1&&m===y-1&&m===g+1?y!==-1&&(h.base=h.name=g===0&&p?u.slice(1,y):u.slice(g,y)):(g===0&&p?(h.name=u.slice(1,m),h.base=u.slice(1,y)):(h.name=u.slice(g,m),h.base=u.slice(g,y)),h.ext=u.slice(m,y)),g>0?h.dir=u.slice(0,g-1):p&&(h.dir="/"),h},"parse"),sep:"/",delimiter:":",win32:null,posix:null};l.posix=l,i.exports=l}},e={};function r(i){var a=e[i];if(a!==void 0)return a.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}o(r,"r"),r.d=(i,a)=>{for(var s in a)r.o(a,s)&&!r.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:a[s]})},r.o=(i,a)=>Object.prototype.hasOwnProperty.call(i,a),r.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var n={};(()=>{let i;r.r(n),r.d(n,{URI:o(()=>p,"URI"),Utils:o(()=>I,"Utils")}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let a=/^\w[\w\d+.-]*$/,s=/^\//,l=/^\/\//;function u(D,k){if(!D.scheme&&k)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${D.authority}", path: "${D.path}", query: "${D.query}", fragment: "${D.fragment}"}`);if(D.scheme&&!a.test(D.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(D.path){if(D.authority){if(!s.test(D.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(D.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}o(u,"s");let h="",f="/",d=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class p{static{o(this,"f")}static isUri(k){return k instanceof p||!!k&&typeof k.authority=="string"&&typeof k.fragment=="string"&&typeof k.path=="string"&&typeof k.query=="string"&&typeof k.scheme=="string"&&typeof k.fsPath=="string"&&typeof k.with=="function"&&typeof k.toString=="function"}scheme;authority;path;query;fragment;constructor(k,R,C,O,N,P=!1){typeof k=="object"?(this.scheme=k.scheme||h,this.authority=k.authority||h,this.path=k.path||h,this.query=k.query||h,this.fragment=k.fragment||h):(this.scheme=function(F,B){return F||B?F:"file"}(k,P),this.authority=R||h,this.path=function(F,B){switch(F){case"https":case"http":case"file":B?B[0]!==f&&(B=f+B):B=f}return B}(this.scheme,C||h),this.query=O||h,this.fragment=N||h,u(this,P))}get fsPath(){return b(this,!1)}with(k){if(!k)return this;let{scheme:R,authority:C,path:O,query:N,fragment:P}=k;return R===void 0?R=this.scheme:R===null&&(R=h),C===void 0?C=this.authority:C===null&&(C=h),O===void 0?O=this.path:O===null&&(O=h),N===void 0?N=this.query:N===null&&(N=h),P===void 0?P=this.fragment:P===null&&(P=h),R===this.scheme&&C===this.authority&&O===this.path&&N===this.query&&P===this.fragment?this:new g(R,C,O,N,P)}static parse(k,R=!1){let C=d.exec(k);return C?new g(C[2]||h,E(C[4]||h),E(C[5]||h),E(C[7]||h),E(C[9]||h),R):new g(h,h,h,h,h)}static file(k){let R=h;if(i&&(k=k.replace(/\\/g,f)),k[0]===f&&k[1]===f){let C=k.indexOf(f,2);C===-1?(R=k.substring(2),k=f):(R=k.substring(2,C),k=k.substring(C)||f)}return new g("file",R,k,h,h)}static from(k){let R=new g(k.scheme,k.authority,k.path,k.query,k.fragment);return u(R,!0),R}toString(k=!1){return w(this,k)}toJSON(){return this}static revive(k){if(k){if(k instanceof p)return k;{let R=new g(k);return R._formatted=k.external,R._fsPath=k._sep===m?k.fsPath:null,R}}return k}}let m=i?1:void 0;class g extends p{static{o(this,"l")}_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(k=!1){return k?w(this,!0):(this._formatted||(this._formatted=w(this,!1)),this._formatted)}toJSON(){let k={$mid:1};return this._fsPath&&(k.fsPath=this._fsPath,k._sep=m),this._formatted&&(k.external=this._formatted),this.path&&(k.path=this.path),this.scheme&&(k.scheme=this.scheme),this.authority&&(k.authority=this.authority),this.query&&(k.query=this.query),this.fragment&&(k.fragment=this.fragment),k}}let y={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function v(D,k,R){let C,O=-1;for(let N=0;N=97&&P<=122||P>=65&&P<=90||P>=48&&P<=57||P===45||P===46||P===95||P===126||k&&P===47||R&&P===91||R&&P===93||R&&P===58)O!==-1&&(C+=encodeURIComponent(D.substring(O,N)),O=-1),C!==void 0&&(C+=D.charAt(N));else{C===void 0&&(C=D.substr(0,N));let F=y[P];F!==void 0?(O!==-1&&(C+=encodeURIComponent(D.substring(O,N)),O=-1),C+=F):O===-1&&(O=N)}}return O!==-1&&(C+=encodeURIComponent(D.substring(O))),C!==void 0?C:D}o(v,"d");function x(D){let k;for(let R=0;R1&&D.scheme==="file"?`//${D.authority}${D.path}`:D.path.charCodeAt(0)===47&&(D.path.charCodeAt(1)>=65&&D.path.charCodeAt(1)<=90||D.path.charCodeAt(1)>=97&&D.path.charCodeAt(1)<=122)&&D.path.charCodeAt(2)===58?k?D.path.substr(1):D.path[1].toLowerCase()+D.path.substr(2):D.path,i&&(R=R.replace(/\//g,"\\")),R}o(b,"m");function w(D,k){let R=k?x:v,C="",{scheme:O,authority:N,path:P,query:F,fragment:B}=D;if(O&&(C+=O,C+=":"),(N||O==="file")&&(C+=f,C+=f),N){let G=N.indexOf("@");if(G!==-1){let z=N.substr(0,G);N=N.substr(G+1),G=z.lastIndexOf(":"),G===-1?C+=R(z,!1,!1):(C+=R(z.substr(0,G),!1,!1),C+=":",C+=R(z.substr(G+1),!1,!0)),C+="@"}N=N.toLowerCase(),G=N.lastIndexOf(":"),G===-1?C+=R(N,!1,!0):(C+=R(N.substr(0,G),!1,!0),C+=N.substr(G))}if(P){if(P.length>=3&&P.charCodeAt(0)===47&&P.charCodeAt(2)===58){let G=P.charCodeAt(1);G>=65&&G<=90&&(P=`/${String.fromCharCode(G+32)}:${P.substr(3)}`)}else if(P.length>=2&&P.charCodeAt(1)===58){let G=P.charCodeAt(0);G>=65&&G<=90&&(P=`${String.fromCharCode(G+32)}:${P.substr(2)}`)}C+=R(P,!0,!1)}return F&&(C+="?",C+=R(F,!1,!1)),B&&(C+="#",C+=k?B:v(B,!1,!1)),C}o(w,"y");function _(D){try{return decodeURIComponent(D)}catch{return D.length>3?D.substr(0,3)+_(D.substr(3)):D}}o(_,"v");let T=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function E(D){return D.match(T)?D.replace(T,k=>_(k)):D}o(E,"C");var L=r(470);let S=L.posix||L,A="/";var I;(function(D){D.joinPath=function(k,...R){return k.with({path:S.join(k.path,...R)})},D.resolvePath=function(k,...R){let C=k.path,O=!1;C[0]!==A&&(C=A+C,O=!0);let N=S.resolve(C,...R);return O&&N[0]===A&&!k.authority&&(N=N.substring(1)),k.with({path:N})},D.dirname=function(k){if(k.path.length===0||k.path===A)return k;let R=S.dirname(k.path);return R.length===1&&R.charCodeAt(0)===46&&(R=""),k.with({path:R})},D.basename=function(k){return S.basename(k.path)},D.extname=function(k){return S.extname(k.path)}})(I||(I={}))})(),dce=n})();({URI:Hs,Utils:Pg}=dce)});var ds,Uc=M(()=>{"use strict";OM();(function(t){t.basename=Pg.basename,t.dirname=Pg.dirname,t.extname=Pg.extname,t.joinPath=Pg.joinPath,t.resolvePath=Pg.resolvePath;function e(n,i){return n?.toString()===i?.toString()}o(e,"equals"),t.equals=e;function r(n,i){let a=typeof n=="string"?n:n.path,s=typeof i=="string"?i:i.path,l=a.split("/").filter(p=>p.length>0),u=s.split("/").filter(p=>p.length>0),h=0;for(;h{"use strict";fce();Bg();rl();$s();Uc();(function(t){t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated"})(Tn||(Tn={}));q2=class{static{o(this,"DefaultLangiumDocumentFactory")}constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,r=Ar.CancellationToken.None){let n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,r)}fromTextDocument(e,r,n){return r=r??Hs.parse(e.uri),n?this.createAsync(r,e,n):this.create(r,e)}fromString(e,r,n){return n?this.createAsync(r,e,n):this.create(r,e)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r){if(typeof r=="string"){let n=this.parse(e,r);return this.createLangiumDocument(n,e,void 0,r)}else if("$model"in r){let n={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(n,e)}else{let n=this.parse(e,r.getText());return this.createLangiumDocument(n,e,r)}}async createAsync(e,r,n){if(typeof r=="string"){let i=await this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=await this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createLangiumDocument(e,r,n,i){let a;if(n)a={parseResult:e,uri:r,state:Tn.Parsed,references:[],textDocument:n};else{let s=this.createTextDocumentGetter(r,i);a={parseResult:e,uri:r,state:Tn.Parsed,references:[],get textDocument(){return s()}}}return e.value.$document=a,a}async update(e,r){var n,i;let a=(n=e.parseResult.value.$cstNode)===null||n===void 0?void 0:n.root.fullText,s=(i=this.textDocuments)===null||i===void 0?void 0:i.get(e.uri.toString()),l=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{let u=this.createTextDocumentGetter(e.uri,l);Object.defineProperty(e,"textDocument",{get:u})}return a!==l&&(e.parseResult=await this.parseAsync(e.uri,l,r),e.parseResult.value.$document=e),e.state=Tn.Parsed,e}parse(e,r){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=Og.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},X2=class{static{o(this,"DefaultLangiumDocuments")}constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory}get all(){return tn(this.documentMap.values())}addDocument(e){let r=e.uri.toString();if(this.documentMap.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentMap.set(r,e)}getDocument(e){let r=e.toString();return this.documentMap.get(r)}async getOrCreateDocument(e,r){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=Tn.Changed,n.precomputedScopes=void 0,n.references=[],n.diagnostics=void 0),n}deleteDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=Tn.Changed,this.documentMap.delete(r)),n}}});var j2,PM=M(()=>{"use strict";rl();Zo();os();nl();Bg();j2=class{static{o(this,"DefaultLinker")}constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,r=Ar.CancellationToken.None){for(let n of tl(e.parseResult.value))await Hi(r),rg(n).forEach(i=>this.doLink(i,e))}doLink(e,r){let n=e.reference;if(n._ref===void 0)try{let i=this.getCandidate(e);if(Zd(i))n._ref=i;else if(n._nodeDescription=i,this.langiumDocuments().hasDocument(i.documentUri)){let a=this.loadAstNode(i);n._ref=a??this.createLinkingError(e,i)}}catch(i){n._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${n.$refText}': ${i}`})}r.references.push(n)}unlink(e){for(let r of e.references)delete r._ref,delete r._nodeDescription;e.references=[]}getCandidate(e){let n=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return n??this.createLinkingError(e)}buildReference(e,r,n,i){let a=this,s={$refNode:n,$refText:i,get ref(){var l;if(ri(this._ref))return this._ref;if(OD(this._nodeDescription)){let u=a.loadAstNode(this._nodeDescription);this._ref=u??a.createLinkingError({reference:s,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){let u=a.getLinkedNode({reference:s,container:e,property:r});if(u.error&&Vi(e).state{"use strict";Vl();o(pce,"isNamed");K2=class{static{o(this,"DefaultNameProvider")}getName(e){if(pce(e))return e.name}getNameNode(e){return p2(e.$cstNode,"name")}}});var Q2,FM=M(()=>{"use strict";Vl();Zo();os();zl();$s();Uc();Q2=class{static{o(this,"DefaultReferences")}constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator}findDeclaration(e){if(e){let r=sR(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(Ta(i))return i.ref;if(Array.isArray(i)){for(let a of i)if(Ta(a)&&a.$refNode&&a.$refNode.offset<=e.offset&&a.$refNode.end>=e.end)return a.ref}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||BD(e,i)))return n}}}findDeclarationNode(e){let r=this.findDeclaration(e);if(r?.$cstNode){let n=this.nameProvider.getNameNode(r);return n??r.$cstNode}}findReferences(e,r){let n=[];if(r.includeDeclaration){let a=this.getReferenceToSelf(e);a&&n.push(a)}let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(a=>ds.equals(a.sourceUri,r.documentUri))),n.push(...i),tn(n)}getReferenceToSelf(e){let r=this.nameProvider.getNameNode(e);if(r){let n=Vi(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:e0(r),local:!0}}}}});var Hc,E0,Fg=M(()=>{"use strict";$s();Hc=class{static{o(this,"MultiMap")}constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return Jm.sum(tn(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){var r;return(r=this.map.get(e))!==null&&r!==void 0?r:[]}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return tn(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return tn(this.map.keys())}values(){return tn(this.map.values()).flat()}entriesGroupedByKey(){return tn(this.map.entries())}},E0=class{static{o(this,"BiMap")}get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}}});var Z2,zM=M(()=>{"use strict";rl();os();Fg();nl();Z2=class{static{o(this,"DefaultScopeComputation")}constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,r=Ar.CancellationToken.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,r)}async computeExportsForNode(e,r,n=l2,i=Ar.CancellationToken.None){let a=[];this.exportNode(e,a,r);for(let s of n(e))await Hi(i),this.exportNode(s,a,r);return a}exportNode(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}async computeLocalScopes(e,r=Ar.CancellationToken.None){let n=e.parseResult.value,i=new Hc;for(let a of Fc(n))await Hi(r),this.processNode(a,e,i);return i}processNode(e,r,n){let i=e.$container;if(i){let a=this.nameProvider.getName(e);a&&n.add(i,this.descriptions.createDescription(e,a,r))}}}});var zg,J2,fze,GM=M(()=>{"use strict";$s();zg=class{static{o(this,"StreamScope")}constructor(e,r,n){var i;this.elements=e,this.outerScope=r,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?this.elements.find(n=>n.name.toLowerCase()===e.toLowerCase()):this.elements.find(n=>n.name===e);if(r)return r;if(this.outerScope)return this.outerScope.getElement(e)}},J2=class{static{o(this,"MapScope")}constructor(e,r,n){var i;this.elements=new Map,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1;for(let a of e){let s=this.caseInsensitive?a.name.toLowerCase():a.name;this.elements.set(s,a)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getAllElements(){let e=tn(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},fze={getElement(){},getAllElements(){return r2}}});var Gg,ex,S0,qk,$g,Xk=M(()=>{"use strict";Gg=class{static{o(this,"DisposableCache")}constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},ex=class extends Gg{static{o(this,"SimpleCache")}constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},S0=class extends Gg{static{o(this,"ContextCache")}constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let a=n();return i.set(r,a),a}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},qk=class extends S0{static{o(this,"DocumentCache")}constructor(e){super(r=>r.toString()),this.onDispose(e.workspace.DocumentBuilder.onUpdate((r,n)=>{let i=r.concat(n);for(let a of i)this.clear(a)}))}},$g=class extends ex{static{o(this,"WorkspaceCache")}constructor(e){super(),this.onDispose(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}});var tx,$M=M(()=>{"use strict";GM();os();$s();Xk();tx=class{static{o(this,"DefaultScopeProvider")}constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new $g(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=Vi(e.container).precomputedScopes;if(i){let s=e.container;do{let l=i.get(s);l.length>0&&r.push(tn(l).filter(u=>this.reflection.isSubtype(u.type,n))),s=s.$container}while(s)}let a=this.getGlobalScope(n,e);for(let s=r.length-1;s>=0;s--)a=this.createScope(r[s],a);return a}createScope(e,r,n){return new zg(tn(e),r,n)}createScopeForNodes(e,r,n){let i=tn(e).map(a=>{let s=this.nameProvider.getName(a);if(s)return this.descriptions.createDescription(a,s)}).nonNullable();return new zg(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new J2(this.indexManager.allElements(e)))}}});function VM(t){return typeof t.$comment=="string"}function mce(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var rx,jk=M(()=>{"use strict";OM();Zo();os();Vl();o(VM,"isAstNodeWithComment");o(mce,"isIntermediateReference");rx=class{static{o(this,"DefaultJsonSerializer")}constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r={}){let n=r?.replacer,i=o((s,l)=>this.replacer(s,l,r),"defaultReplacer"),a=n?(s,l)=>n(s,l,i):i;try{return this.currentDocument=Vi(e),JSON.stringify(e,a,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r={}){let n=JSON.parse(e);return this.linkNode(n,n,r),n}replacer(e,r,{refText:n,sourceText:i,textRegions:a,comments:s,uriConverter:l}){var u,h,f,d;if(!this.ignoreProperties.has(e))if(Ta(r)){let p=r.ref,m=n?r.$refText:void 0;if(p){let g=Vi(p),y="";this.currentDocument&&this.currentDocument!==g&&(l?y=l(g.uri,r):y=g.uri.toString());let v=this.astNodeLocator.getAstNodePath(p);return{$ref:`${y}#${v}`,$refText:m}}else return{$error:(h=(u=r.error)===null||u===void 0?void 0:u.message)!==null&&h!==void 0?h:"Could not resolve reference",$refText:m}}else if(ri(r)){let p;if(a&&(p=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},r)),(!e||r.$document)&&p?.$textRegion&&(p.$textRegion.documentURI=(f=this.currentDocument)===null||f===void 0?void 0:f.uri.toString())),i&&!e&&(p??(p=Object.assign({},r)),p.$sourceText=(d=r.$cstNode)===null||d===void 0?void 0:d.text),s){p??(p=Object.assign({},r));let m=this.commentProvider.getComment(r);m&&(p.$comment=m.replace(/\r/g,""))}return p??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=o(n=>({offset:n.offset,end:n.end,length:n.length,range:n.range}),"createDocumentSegment");if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(a=>!a.startsWith("$")).forEach(a=>{let s=rR(e.$cstNode,a).map(r);s.length!==0&&(i[a]=s)}),e}}linkNode(e,r,n,i,a,s){for(let[u,h]of Object.entries(e))if(Array.isArray(h))for(let f=0;f{"use strict";Uc();nx=class{static{o(this,"DefaultServiceRegistry")}register(e){if(!this.singleton&&!this.map){this.singleton=e;return}if(!this.map&&(this.map={},this.singleton)){for(let r of this.singleton.LanguageMetaData.fileExtensions)this.map[r]=this.singleton;this.singleton=void 0}for(let r of e.LanguageMetaData.fileExtensions)this.map[r]!==void 0&&this.map[r]!==e&&console.warn(`The file extension ${r} is used by multiple languages. It is now assigned to '${e.LanguageMetaData.languageId}'.`),this.map[r]=e}getServices(e){if(this.singleton!==void 0)return this.singleton;if(this.map===void 0)throw new Error("The service registry is empty. Use `register` to register the services of a language.");let r=ds.extname(e),n=this.map[r];if(!n)throw new Error(`The service registry contains no services for the extension '${r}'.`);return n}get all(){return this.singleton!==void 0?[this.singleton]:this.map!==void 0?Object.values(this.map):[]}}});function Kk(t){return{code:t}}var Vg,ix,ax=M(()=>{"use strict";Fg();nl();$s();o(Kk,"diagnosticData");(function(t){t.all=["fast","slow","built-in"]})(Vg||(Vg={}));ix=class{static{o(this,"ValidationRegistry")}constructor(e){this.entries=new Hc,this.reflection=e.shared.AstReflection}register(e,r=this,n="fast"){if(n==="built-in")throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(let[i,a]of Object.entries(e)){let s=a;if(Array.isArray(s))for(let l of s){let u={check:this.wrapValidationException(l,r),category:n};this.addEntry(i,u)}else if(typeof s=="function"){let l={check:this.wrapValidationException(s,r),category:n};this.addEntry(i,l)}}}wrapValidationException(e,r){return async(n,i,a)=>{try{await e.call(r,n,i,a)}catch(s){if(mf(s))throw s;console.error("An error occurred during validation:",s);let l=s instanceof Error?s.message:String(s);s instanceof Error&&s.stack&&console.error(s.stack),i("error","An error occurred during validation: "+l,{node:n})}}}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=tn(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}}});function gce(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=p2(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=iR(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function Qk(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}var sx,Qu,HM=M(()=>{"use strict";rl();Vl();os();zl();nl();ax();sx=class{static{o(this,"DefaultDocumentValidator")}constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,r={},n=Ar.CancellationToken.None){let i=e.parseResult,a=[];if(await Hi(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(i,a,r),r.stopAfterLexingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===Qu.LexingError})||(this.processParsingErrors(i,a,r),r.stopAfterParsingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===Qu.ParsingError}))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===Qu.LinkingError}))))return a;try{a.push(...await this.validateAst(i.value,r,n))}catch(s){if(mf(s))throw s;console.error("An error occurred during validation:",s)}return await Hi(n),a}processLexingErrors(e,r,n){for(let i of e.lexerErrors){let a={severity:Qk("error"),range:{start:{line:i.line-1,character:i.column-1},end:{line:i.line-1,character:i.column+i.length-1}},message:i.message,data:Kk(Qu.LexingError),source:this.getSource()};r.push(a)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let a;if(isNaN(i.token.startOffset)){if("previousToken"in i){let s=i.previousToken;if(isNaN(s.startOffset)){let l={line:0,character:0};a={start:l,end:l}}else{let l={line:s.endLine-1,character:s.endColumn};a={start:l,end:l}}}}else a=eg(i.token);if(a){let s={severity:Qk("error"),range:a,message:i.message,data:Kk(Qu.ParsingError),source:this.getSource()};r.push(s)}}}processLinkingErrors(e,r,n){for(let i of e.references){let a=i.error;if(a){let s={node:a.container,property:a.property,index:a.index,data:{code:Qu.LinkingError,containerType:a.container.$type,property:a.property,refText:a.reference.$refText}};r.push(this.toDiagnostic("error",a.message,s))}}}async validateAst(e,r,n=Ar.CancellationToken.None){let i=[],a=o((s,l,u)=>{i.push(this.toDiagnostic(s,l,u))},"acceptor");return await Promise.all(tl(e).map(async s=>{await Hi(n);let l=this.validationRegistry.getChecks(s.$type,r.categories);for(let u of l)await u(s,a,n)})),i}toDiagnostic(e,r,n){return{message:r,range:gce(n),severity:Qk(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};o(gce,"getDiagnosticRange");o(Qk,"toDiagnosticSeverity");(function(t){t.LexingError="lexing-error",t.ParsingError="parsing-error",t.LinkingError="linking-error"})(Qu||(Qu={}))});var ox,lx,WM=M(()=>{"use strict";rl();Zo();os();zl();nl();Uc();ox=class{static{o(this,"DefaultAstNodeDescriptionProvider")}constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n=Vi(e)){r??(r=this.nameProvider.getName(e));let i=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${i} has no name.`);let a,s=o(()=>{var l;return a??(a=e0((l=this.nameProvider.getNameNode(e))!==null&&l!==void 0?l:e.$cstNode))},"nameSegmentGetter");return{node:e,name:r,get nameSegment(){return s()},selectionSegment:e0(e.$cstNode),type:e.$type,documentUri:n.uri,path:i}}},lx=class{static{o(this,"DefaultReferenceDescriptionProvider")}constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,r=Ar.CancellationToken.None){let n=[],i=e.parseResult.value;for(let a of tl(i))await Hi(r),rg(a).filter(s=>!Zd(s)).forEach(s=>{let l=this.createDescription(s);l&&n.push(l)});return n}createDescription(e){let r=e.reference.$nodeDescription,n=e.reference.$refNode;if(!r||!n)return;let i=Vi(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:r.documentUri,targetPath:r.path,segment:e0(n),local:ds.equals(r.documentUri,i)}}}});var cx,YM=M(()=>{"use strict";cx=class{static{o(this,"DefaultAstNodeLocator")}constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,a)=>{if(!i||a.length===0)return i;let s=a.indexOf(this.indexSeparator);if(s>0){let l=a.substring(0,s),u=parseInt(a.substring(s+1)),h=i[l];return h?.[u]}return i[a]},e)}}});var ux,qM=M(()=>{"use strict";nl();ux=class{static{o(this,"DefaultConfigurationProvider")}constructor(e){this._ready=new fs,this.settings={},this.workspaceConfig=!1,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var r,n;this.workspaceConfig=(n=(r=e.capabilities.workspace)===null||r===void 0?void 0:r.configuration)!==null&&n!==void 0?n:!1}async initialized(e){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(r);r.forEach((i,a)=>{this.updateSectionConfiguration(i.section,n[a])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(r=>{this.updateSectionConfiguration(r,e.settings[r])})}updateSectionConfiguration(e,r){this.settings[e]=r}async getConfiguration(e,r){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]}toSectionName(e){return`${e}`}}});var C0,XM=M(()=>{"use strict";(function(t){function e(r){return{dispose:o(async()=>await r(),"dispose")}}o(e,"create"),t.create=e})(C0||(C0={}))});var hx,jM=M(()=>{"use strict";rl();XM();Fg();nl();$s();ax();Bg();hx=class{static{o(this,"DefaultDocumentBuilder")}constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Hc,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=Tn.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,r={},n=Ar.CancellationToken.None){var i,a;for(let s of e){let l=s.uri.toString();if(s.state===Tn.Validated){if(typeof r.validation=="boolean"&&r.validation)s.state=Tn.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(l);else if(typeof r.validation=="object"){let u=this.buildState.get(l),h=(i=u?.result)===null||i===void 0?void 0:i.validationChecks;if(h){let d=((a=r.validation.categories)!==null&&a!==void 0?a:Vg.all).filter(p=>!h.includes(p));d.length>0&&(this.buildState.set(l,{completed:!1,options:{validation:Object.assign(Object.assign({},r.validation),{categories:d})},result:u.result}),s.state=Tn.IndexedReferences)}}}else this.buildState.delete(l)}this.currentState=Tn.Changed,await this.emitUpdate(e.map(s=>s.uri),[]),await this.buildDocuments(e,r,n)}async update(e,r,n=Ar.CancellationToken.None){this.currentState=Tn.Changed;for(let s of r)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(let s of e){if(!this.langiumDocuments.invalidateDocument(s)){let u=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);u.state=Tn.Changed,this.langiumDocuments.addDocument(u)}this.buildState.delete(s.toString())}let i=tn(e).concat(r).map(s=>s.toString()).toSet();this.langiumDocuments.all.filter(s=>!i.has(s.uri.toString())&&this.shouldRelink(s,i)).forEach(s=>{this.serviceRegistry.getServices(s.uri).references.Linker.unlink(s),s.state=Math.min(s.state,Tn.ComputedScopes),s.diagnostics=void 0}),await this.emitUpdate(e,r),await Hi(n);let a=this.langiumDocuments.all.filter(s=>{var l;return s.staten(e,r)))}shouldRelink(e,r){return e.references.some(n=>n.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),C0.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}async buildDocuments(e,r,n){this.prepareBuild(e,r),await this.runCancelable(e,Tn.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),await this.runCancelable(e,Tn.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),await this.runCancelable(e,Tn.ComputedScopes,n,async a=>{let s=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.precomputedScopes=await s.computeLocalScopes(a,n)}),await this.runCancelable(e,Tn.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),await this.runCancelable(e,Tn.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let i=e.filter(a=>this.shouldValidate(a));await this.runCancelable(i,Tn.Validated,n,a=>this.validate(a,n));for(let a of e){let s=this.buildState.get(a.uri.toString());s&&(s.completed=!0)}}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),a=this.buildState.get(i);(!a||a.completed)&&this.buildState.set(i,{completed:!1,options:r,result:a?.result})}}async runCancelable(e,r,n,i){let a=e.filter(s=>s.state{this.buildPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;if(r&&"path"in r?i=r:n=r,n??(n=Ar.CancellationToken.None),i){let a=this.langiumDocuments.getDocument(i);if(a&&a.state>e)return Promise.resolve(i)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(Vc):new Promise((a,s)=>{let l=this.onBuildPhase(e,()=>{if(l.dispose(),u.dispose(),i){let h=this.langiumDocuments.getDocument(i);a(h?.uri)}else a(void 0)}),u=n.onCancellationRequested(()=>{l.dispose(),u.dispose(),s(Vc)})})}async notifyBuildPhase(e,r,n){if(e.length===0)return;let i=this.buildPhaseListeners.get(r);for(let a of i)await Hi(n),await a(e,n)}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,r){var n,i;let a=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,l=typeof s=="object"?s:void 0,u=await a.validateDocument(e,l,r);e.diagnostics?e.diagnostics.push(...u):e.diagnostics=u;let h=this.buildState.get(e.uri.toString());if(h){(n=h.result)!==null&&n!==void 0||(h.result={});let f=(i=l?.categories)!==null&&i!==void 0?i:Vg.all;h.result.validationChecks?h.result.validationChecks.push(...f):h.result.validationChecks=[...f]}}getBuildOptions(e){var r,n;return(n=(r=this.buildState.get(e.uri.toString()))===null||r===void 0?void 0:r.options)!==null&&n!==void 0?n:{}}}});var fx,KM=M(()=>{"use strict";os();Xk();rl();$s();Uc();fx=class{static{o(this,"DefaultIndexManager")}constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new S0,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=Vi(e).uri,i=[];return this.referenceIndex.forEach(a=>{a.forEach(s=>{ds.equals(s.targetUri,n)&&s.targetPath===r&&i.push(s)})}),tn(i)}allElements(e,r){let n=tn(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){var n;return r?this.symbolByTypeIndex.get(e,r,()=>{var a;return((a=this.symbolIndex.get(e))!==null&&a!==void 0?a:[]).filter(l=>this.astReflection.isSubtype(l.type,r))}):(n=this.symbolIndex.get(e))!==null&&n!==void 0?n:[]}remove(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r),this.referenceIndex.delete(r)}async updateContent(e,r=Ar.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.computeExports(e,r),a=e.uri.toString();this.symbolIndex.set(a,i),this.symbolByTypeIndex.clear(a)}async updateReferences(e,r=Ar.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}}});var dx,QM=M(()=>{"use strict";rl();nl();Uc();dx=class{static{o(this,"DefaultWorkspaceManager")}constructor(e){this.initialBuildOptions={},this._ready=new fs,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}initialize(e){var r;this.folders=(r=e.workspaceFolders)!==null&&r!==void 0?r:void 0}initialized(e){return this.mutex.write(r=>{var n;return this.initializeWorkspace((n=this.folders)!==null&&n!==void 0?n:[],r)})}async initializeWorkspace(e,r=Ar.CancellationToken.None){let n=await this.performStartup(e);await Hi(r),await this.documentBuilder.build(n,this.initialBuildOptions,r)}async performStartup(e){let r=this.serviceRegistry.all.flatMap(a=>a.LanguageMetaData.fileExtensions),n=[],i=o(a=>{n.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)},"collector");return await this.loadAdditionalDocuments(e,i),await Promise.all(e.map(a=>[a,this.getRootFolder(a)]).map(async a=>this.traverseFolder(...a,r,i))),this._ready.resolve(),n}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return Hs.parse(e.uri)}async traverseFolder(e,r,n,i){let a=await this.fileSystemProvider.readDirectory(r);await Promise.all(a.map(async s=>{if(this.includeEntry(e,s,n)){if(s.isDirectory)await this.traverseFolder(e,s.uri,n,i);else if(s.isFile){let l=await this.langiumDocuments.getOrCreateDocument(s.uri);i(l)}}}))}includeEntry(e,r,n){let i=ds.basename(r.uri);if(i.startsWith("."))return!1;if(r.isDirectory)return i!=="node_modules"&&i!=="out";if(r.isFile){let a=ds.extname(r.uri);return n.includes(a)}return!1}}});function yce(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function JM(t){return t&&"modes"in t&&"defaultMode"in t}function ZM(t){return!yce(t)&&!JM(t)}var px,eI=M(()=>{"use strict";g0();px=class{static{o(this,"DefaultLexer")}constructor(e){let r=e.parser.TokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=ZM(r)?Object.values(r):r;this.chevrotainLexer=new ci(n,{positionTracking:"full"})}get definition(){return this.tokenTypes}tokenize(e){var r;let n=this.chevrotainLexer.tokenize(e);return{tokens:n.tokens,errors:n.errors,hidden:(r=n.groups.hidden)!==null&&r!==void 0?r:[]}}toTokenTypeDictionary(e){if(ZM(e))return e;let r=JM(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};o(yce,"isTokenTypeArray");o(JM,"isIMultiModeLexerDefinition");o(ZM,"isTokenTypeDictionary")});function nI(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=Xr.create(0,0));let a=bce(t),s=aI(n),l=pze({lines:a,position:i,options:s});return xze({index:0,tokens:l,position:i})}function iI(t,e){let r=aI(e),n=bce(t);if(n.length===0)return!1;let i=n[0],a=n[n.length-1],s=r.start,l=r.end;return!!s?.exec(i)&&!!l?.exec(a)}function bce(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(XN)}function pze(t){var e,r,n;let i=[],a=t.position.line,s=t.position.character;for(let l=0;l=f.length){if(i.length>0){let m=Xr.create(a,s);i.push({type:"break",content:"",range:Nr.create(m,m)})}}else{vce.lastIndex=d;let m=vce.exec(f);if(m){let g=m[0],y=m[1],v=Xr.create(a,s+d),x=Xr.create(a,s+d+g.length);i.push({type:"tag",content:y,range:Nr.create(v,x)}),d+=g.length,d=rI(f,d)}if(d0&&i[i.length-1].type==="break"?i.slice(0,-1):i}function mze(t,e,r,n){let i=[];if(t.length===0){let a=Xr.create(r,n),s=Xr.create(r,n+e.length);i.push({type:"text",content:e,range:Nr.create(a,s)})}else{let a=0;for(let l of t){let u=l.index,h=e.substring(a,u);h.length>0&&i.push({type:"text",content:e.substring(a,u),range:Nr.create(Xr.create(r,a+n),Xr.create(r,u+n))});let f=h.length+1,d=l[1];if(i.push({type:"inline-tag",content:d,range:Nr.create(Xr.create(r,a+f+n),Xr.create(r,a+f+d.length+n))}),f+=d.length,l.length===4){f+=l[2].length;let p=l[3];i.push({type:"text",content:p,range:Nr.create(Xr.create(r,a+f+n),Xr.create(r,a+f+p.length+n))})}else i.push({type:"text",content:"",range:Nr.create(Xr.create(r,a+f+n),Xr.create(r,a+f+n))});a=u+l[0].length}let s=e.substring(a);s.length>0&&i.push({type:"text",content:s,range:Nr.create(Xr.create(r,a+n),Xr.create(r,a+n+s.length))})}return i}function rI(t,e){let r=t.substring(e).match(gze);return r?e+r.index:t.length}function vze(t){let e=t.match(yze);if(e&&typeof e.index=="number")return e.index}function xze(t){var e,r,n,i;let a=Xr.create(t.position.line,t.position.character);if(t.tokens.length===0)return new Zk([],Nr.create(a,a));let s=[];for(;t.index0){let u=rI(e,a);s=e.substring(u),e=e.substring(0,a)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(s=`\`${s}\``),(i=(n=r.renderLink)===null||n===void 0?void 0:n.call(r,e,s))!==null&&i!==void 0?i:Eze(e,s)}}function Eze(t,e){try{return Hs.parse(t,!0),`[${e}](${t})`}catch{return t}}function xce(t){return t.endsWith(` +`)?` +`:` + +`}var vce,dze,gze,yze,Zk,mx,gx,Jk,sI=M(()=>{"use strict";fM();ig();Uc();o(nI,"parseJSDoc");o(iI,"isJSDoc");o(bce,"getLines");vce=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,dze=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;o(pze,"tokenize");o(mze,"buildInlineTokens");gze=/\S/,yze=/\s*$/;o(rI,"skipWhitespace");o(vze,"lastCharacter");o(xze,"parseJSDocComment");o(bze,"parseJSDocElement");o(wze,"appendEmptyLine");o(wce,"parseJSDocText");o(Tze,"parseJSDocInline");o(Tce,"parseJSDocTag");o(kce,"parseJSDocLine");o(aI,"normalizeOptions");o(tI,"normalizeOption");Zk=class{static{o(this,"JSDocCommentImpl")}constructor(e,r){this.elements=e,this.range=r}getTag(e){return this.getAllTags().find(r=>r.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=xce(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=xce(r)+i}return r.trim()}},mx=class{static{o(this,"JSDocTagImpl")}constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} +${r}`),this.inline?`{${e}}`:e}toMarkdown(e){var r,n;return(n=(r=e?.renderTag)===null||r===void 0?void 0:r.call(e,this))!==null&&n!==void 0?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let a=kze(this.name,r,e??{});if(typeof a=="string")return a}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} +${r}`),this.inline?`{${i}}`:i}};o(kze,"renderInlineTag");o(Eze,"renderLinkDefault");gx=class{static{o(this,"JSDocTextImpl")}constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` +`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` +`)}return r}},Jk=class{static{o(this,"JSDocLineImpl")}constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};o(xce,"fillNewlines")});var yx,oI=M(()=>{"use strict";os();sI();yx=class{static{o(this,"JSDocDocumentationProvider")}constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&iI(r))return nI(r).toMarkdown({renderLink:o((i,a)=>this.documentationLinkRenderer(e,i,a),"renderLink"),renderTag:o(i=>this.documentationTagRenderer(e,i),"renderTag")})}documentationLinkRenderer(e,r,n){var i;let a=(i=this.findNameInPrecomputedScopes(e,r))!==null&&i!==void 0?i:this.findNameInGlobalScope(e,r);if(a&&a.nameSegment){let s=a.nameSegment.range.start.line+1,l=a.nameSegment.range.start.character+1,u=a.documentUri.with({fragment:`L${s},${l}`});return`[${n}](${u.toString()})`}else return}documentationTagRenderer(e,r){}findNameInPrecomputedScopes(e,r){let i=Vi(e).precomputedScopes;if(!i)return;let a=e;do{let l=i.get(a).find(u=>u.name===r);if(l)return l;a=a.$container}while(a)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}}});var vx,lI=M(()=>{"use strict";jk();zl();vx=class{static{o(this,"DefaultCommentProvider")}constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var r;return VM(e)?e.$comment:(r=zD(e.$cstNode,this.grammarConfig().multilineCommentRules))===null||r===void 0?void 0:r.text}}});var ui={};var cI=M(()=>{"use strict";Sr(ui,Ji(LM(),1))});var xx,uI,hI,fI=M(()=>{"use strict";nl();cI();xx=class{static{o(this,"DefaultAsyncParser")}constructor(e){this.syncParser=e.parser.LangiumParser}parse(e){return Promise.resolve(this.syncParser.parse(e))}},uI=class{static{o(this,"AbstractThreadedAsyncParser")}constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}async parse(e,r){let n=await this.acquireParserWorker(r),i=new fs,a,s=r.onCancellationRequested(()=>{a=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(l=>{let u=this.hydrator.hydrate(l);i.resolve(u)}).catch(l=>{i.reject(l)}).finally(()=>{s.dispose(),clearTimeout(a)}),i.promise}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new fs;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(Vc)}),this.queue.push(r),r.promise}},hI=class{static{o(this,"ParserWorker")}get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new ui.Emitter,this.deferred=new fs,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(a=>{let s=a;this.deferred.resolve(s),this.unlock()}),n(a=>{this.deferred.reject(a),this.unlock()})}terminate(){this.deferred.reject(Vc),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new fs,this.sendMessage(e),this.deferred.promise}}});var bx,dI=M(()=>{"use strict";rl();nl();bx=class{static{o(this,"DefaultWorkspaceLock")}constructor(){this.previousTokenSource=new Ar.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=new Ar.CancellationTokenSource;return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n){let i=new fs,a={action:r,deferred:i,cancellationToken:n??Ar.CancellationToken.None};return e.push(a),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:r,deferred:n,cancellationToken:i})=>{try{let a=await Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){mf(a)?n.resolve(void 0):n.reject(a)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}});var wx,pI=M(()=>{"use strict";Fk();Bc();Zo();os();Fg();zl();wx=class{static{o(this,"DefaultHydrator")}constructor(e){this.grammarElementIdMap=new E0,this.tokenTypeIdMap=new E0,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors.map(r=>Object.assign({},r)),parserErrors:e.parserErrors.map(r=>Object.assign({},r)),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of tl(e))r.set(i,{});if(e.$cstNode)for(let i of Jd(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)ri(l)?s.push(this.dehydrateAstNode(l,r)):Ta(l)?s.push(this.dehydrateReference(l,r)):s.push(l)}else ri(a)?n[i]=this.dehydrateAstNode(a,r):Ta(a)?n[i]=this.dehydrateReference(a,r):a!==void 0&&(n[i]=a);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return t2(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),ho(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):cf(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let a of tl(e))r.set(a,{});let i;if(e.$cstNode)for(let a of Jd(e.$cstNode)){let s;"fullText"in a?(s=new Ng(a.fullText),i=s):"content"in a?s=new b0:"tokenType"in a&&(s=this.hydrateCstLeafNode(a)),s&&(n.set(a,s),s.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)ri(l)?s.push(this.setParent(this.hydrateAstNode(l,r),n)):Ta(l)?s.push(this.hydrateReference(l,n,i,r)):s.push(l)}else ri(a)?n[i]=this.setParent(this.hydrateAstNode(a,r),n):Ta(a)?n[i]=this.hydrateReference(a,n,i,r):a!==void 0&&(n[i]=a);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),ho(i))for(let a of e.content){let s=this.hydrateCstNode(a,r,n++);i.content.push(s)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,a=e.startLine,s=e.startColumn,l=e.endLine,u=e.endColumn,h=e.hidden;return new x0(n,i,{start:{line:a,character:s},end:{line:l,character:u}},r,h)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap();let r=this.grammarElementIdMap.getKey(e);if(r)return r;throw new Error("Invalid grammar element id: "+e)}createGrammarElementIdMap(){let e=0;for(let r of tl(this.grammar))a2(r)&&this.grammarElementIdMap.set(r,e++)}}});function go(t){return{documentation:{CommentProvider:o(e=>new vx(e),"CommentProvider"),DocumentationProvider:o(e=>new yx(e),"DocumentationProvider")},parser:{AsyncParser:o(e=>new xx(e),"AsyncParser"),GrammarConfig:o(e=>uR(e),"GrammarConfig"),LangiumParser:o(e=>bM(e),"LangiumParser"),CompletionParser:o(e=>vM(e),"CompletionParser"),ValueConverter:o(()=>new k0,"ValueConverter"),TokenBuilder:o(()=>new T0,"TokenBuilder"),Lexer:o(e=>new px(e),"Lexer"),ParserErrorMessageProvider:o(()=>new Rg,"ParserErrorMessageProvider")},workspace:{AstNodeLocator:o(()=>new cx,"AstNodeLocator"),AstNodeDescriptionProvider:o(e=>new ox(e),"AstNodeDescriptionProvider"),ReferenceDescriptionProvider:o(e=>new lx(e),"ReferenceDescriptionProvider")},references:{Linker:o(e=>new j2(e),"Linker"),NameProvider:o(()=>new K2,"NameProvider"),ScopeProvider:o(e=>new tx(e),"ScopeProvider"),ScopeComputation:o(e=>new Z2(e),"ScopeComputation"),References:o(e=>new Q2(e),"References")},serializer:{Hydrator:o(e=>new wx(e),"Hydrator"),JsonSerializer:o(e=>new rx(e),"JsonSerializer")},validation:{DocumentValidator:o(e=>new sx(e),"DocumentValidator"),ValidationRegistry:o(e=>new ix(e),"ValidationRegistry")},shared:o(()=>t.shared,"shared")}}function yo(t){return{ServiceRegistry:o(()=>new nx,"ServiceRegistry"),workspace:{LangiumDocuments:o(e=>new X2(e),"LangiumDocuments"),LangiumDocumentFactory:o(e=>new q2(e),"LangiumDocumentFactory"),DocumentBuilder:o(e=>new hx(e),"DocumentBuilder"),IndexManager:o(e=>new fx(e),"IndexManager"),WorkspaceManager:o(e=>new dx(e),"WorkspaceManager"),FileSystemProvider:o(e=>t.fileSystemProvider(e),"FileSystemProvider"),WorkspaceLock:o(()=>new bx,"WorkspaceLock"),ConfigurationProvider:o(e=>new ux(e),"ConfigurationProvider")}}}var mI=M(()=>{"use strict";hR();xM();wM();TM();kM();PM();BM();FM();zM();$M();jk();UM();HM();ax();WM();YM();qM();jM();Bg();KM();QM();eI();oI();lI();Y2();fI();dI();pI();o(go,"createDefaultCoreModule");o(yo,"createDefaultSharedCoreModule")});function Wi(t,e,r,n,i,a,s,l,u){let h=[t,e,r,n,i,a,s,l,u].reduce(eE,{});return Ace(h)}function Cce(t){if(t&&t[yI])for(let e of Object.values(t))Cce(e);return t}function Ace(t,e){let r=new Proxy({},{deleteProperty:o(()=>!1,"deleteProperty"),get:o((n,i)=>Sce(n,i,t,e||r),"get"),getOwnPropertyDescriptor:o((n,i)=>(Sce(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),"getOwnPropertyDescriptor"),has:o((n,i)=>i in t,"has"),ownKeys:o(()=>[...Reflect.ownKeys(t),yI],"ownKeys")});return r[yI]=!0,r}function Sce(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:t[e]});if(t[e]===Ece)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. See https://langium.org/docs/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=Ece;try{t[e]=typeof i=="function"?i(n):Ace(i,n)}catch(a){throw t[e]=a instanceof Error?a:void 0,a}return t[e]}else return}function eE(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!==void 0){let i=t[r];i!==null&&n!==null&&typeof i=="object"&&typeof n=="object"?t[r]=eE(i,n):t[r]=n}}return t}var gI,yI,Ece,vI=M(()=>{"use strict";(function(t){t.merge=(e,r)=>eE(eE({},e),r)})(gI||(gI={}));o(Wi,"inject");yI=Symbol("isProxy");o(Cce,"eagerLoad");o(Ace,"_inject");Ece=Symbol();o(Sce,"_resolve");o(eE,"_merge")});var _ce=M(()=>{"use strict"});var Lce=M(()=>{"use strict";lI();oI();sI()});var Dce=M(()=>{"use strict"});var Nce=M(()=>{"use strict";hR();Dce()});var Rce=M(()=>{"use strict"});var Mce=M(()=>{"use strict";fI();xM();Fk();wM();Y2();eI();Rce();TM();kM()});var Ice=M(()=>{"use strict";PM();BM();FM();GM();zM();$M()});var Oce=M(()=>{"use strict";pI();jk()});var tE,vo,xI=M(()=>{"use strict";tE=class{static{o(this,"EmptyFileSystemProvider")}readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}},vo={fileSystemProvider:o(()=>new tE,"fileSystemProvider")}});function Aze(){let t=Wi(yo(vo),Cze),e=Wi(go({shared:t}),Sze);return t.ServiceRegistry.register(e),e}function gf(t){var e;let r=Aze(),n=r.serializer.JsonSerializer.deserialize(t);return r.shared.workspace.LangiumDocumentFactory.fromModel(n,Hs.parse(`memory://${(e=n.name)!==null&&e!==void 0?e:"grammar"}.langium`)),n}var Sze,Cze,Pce=M(()=>{"use strict";mI();vI();Bc();xI();Uc();Sze={Grammar:o(()=>{},"Grammar"),LanguageMetaData:o(()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"}),"LanguageMetaData")},Cze={AstReflection:o(()=>new tg,"AstReflection")};o(Aze,"createMinimalGrammarServices");o(gf,"loadGrammarFromJson")});var $r={};vr($r,{AstUtils:()=>zT,BiMap:()=>E0,Cancellation:()=>Ar,ContextCache:()=>S0,CstUtils:()=>AT,DONE_RESULT:()=>ss,Deferred:()=>fs,Disposable:()=>C0,DisposableCache:()=>Gg,DocumentCache:()=>qk,EMPTY_STREAM:()=>r2,ErrorWithLocation:()=>t0,GrammarUtils:()=>WT,MultiMap:()=>Hc,OperationCancelled:()=>Vc,Reduction:()=>Jm,RegExpUtils:()=>UT,SimpleCache:()=>ex,StreamImpl:()=>fo,TreeStreamImpl:()=>Pc,URI:()=>Hs,UriUtils:()=>ds,WorkspaceCache:()=>$g,assertUnreachable:()=>uf,delayNextTick:()=>MM,interruptAndCheck:()=>Hi,isOperationCancelled:()=>mf,loadGrammarFromJson:()=>gf,setInterruptionPeriod:()=>lce,startCancelableOperation:()=>oce,stream:()=>tn});var Bce=M(()=>{"use strict";Xk();cI();Sr($r,ui);Fg();XM();_T();Pce();nl();$s();Uc();os();rl();zl();Vl();ig()});var Fce=M(()=>{"use strict";HM();ax()});var zce=M(()=>{"use strict";WM();YM();qM();jM();Bg();xI();KM();dI();QM()});var ka={};vr(ka,{AbstractAstReflection:()=>Qd,AbstractCstNode:()=>V2,AbstractLangiumParser:()=>U2,AbstractParserErrorMessageProvider:()=>Gk,AbstractThreadedAsyncParser:()=>uI,AstUtils:()=>zT,BiMap:()=>E0,Cancellation:()=>Ar,CompositeCstNodeImpl:()=>b0,ContextCache:()=>S0,CstNodeBuilder:()=>$2,CstUtils:()=>AT,DONE_RESULT:()=>ss,DatatypeSymbol:()=>zk,DefaultAstNodeDescriptionProvider:()=>ox,DefaultAstNodeLocator:()=>cx,DefaultAsyncParser:()=>xx,DefaultCommentProvider:()=>vx,DefaultConfigurationProvider:()=>ux,DefaultDocumentBuilder:()=>hx,DefaultDocumentValidator:()=>sx,DefaultHydrator:()=>wx,DefaultIndexManager:()=>fx,DefaultJsonSerializer:()=>rx,DefaultLangiumDocumentFactory:()=>q2,DefaultLangiumDocuments:()=>X2,DefaultLexer:()=>px,DefaultLinker:()=>j2,DefaultNameProvider:()=>K2,DefaultReferenceDescriptionProvider:()=>lx,DefaultReferences:()=>Q2,DefaultScopeComputation:()=>Z2,DefaultScopeProvider:()=>tx,DefaultServiceRegistry:()=>nx,DefaultTokenBuilder:()=>T0,DefaultValueConverter:()=>k0,DefaultWorkspaceLock:()=>bx,DefaultWorkspaceManager:()=>dx,Deferred:()=>fs,Disposable:()=>C0,DisposableCache:()=>Gg,DocumentCache:()=>qk,DocumentState:()=>Tn,DocumentValidator:()=>Qu,EMPTY_SCOPE:()=>fze,EMPTY_STREAM:()=>r2,EmptyFileSystem:()=>vo,EmptyFileSystemProvider:()=>tE,ErrorWithLocation:()=>t0,GrammarAST:()=>o2,GrammarUtils:()=>WT,JSDocDocumentationProvider:()=>yx,LangiumCompletionParser:()=>W2,LangiumParser:()=>H2,LangiumParserErrorMessageProvider:()=>Rg,LeafCstNodeImpl:()=>x0,MapScope:()=>J2,Module:()=>gI,MultiMap:()=>Hc,OperationCancelled:()=>Vc,ParserWorker:()=>hI,Reduction:()=>Jm,RegExpUtils:()=>UT,RootCstNodeImpl:()=>Ng,SimpleCache:()=>ex,StreamImpl:()=>fo,StreamScope:()=>zg,TextDocument:()=>Og,TreeStreamImpl:()=>Pc,URI:()=>Hs,UriUtils:()=>ds,ValidationCategory:()=>Vg,ValidationRegistry:()=>ix,ValueConverter:()=>$c,WorkspaceCache:()=>$g,assertUnreachable:()=>uf,createCompletionParser:()=>vM,createDefaultCoreModule:()=>go,createDefaultSharedCoreModule:()=>yo,createGrammarConfig:()=>uR,createLangiumParser:()=>bM,delayNextTick:()=>MM,diagnosticData:()=>Kk,eagerLoad:()=>Cce,getDiagnosticRange:()=>gce,inject:()=>Wi,interruptAndCheck:()=>Hi,isAstNode:()=>ri,isAstNodeDescription:()=>OD,isAstNodeWithComment:()=>VM,isCompositeCstNode:()=>ho,isIMultiModeLexerDefinition:()=>JM,isJSDoc:()=>iI,isLeafCstNode:()=>cf,isLinkingError:()=>Zd,isNamed:()=>pce,isOperationCancelled:()=>mf,isReference:()=>Ta,isRootCstNode:()=>t2,isTokenTypeArray:()=>yce,isTokenTypeDictionary:()=>ZM,loadGrammarFromJson:()=>gf,parseJSDoc:()=>nI,prepareLangiumParser:()=>ece,setInterruptionPeriod:()=>lce,startCancelableOperation:()=>oce,stream:()=>tn,toDiagnosticSeverity:()=>Qk});var Wc=M(()=>{"use strict";mI();vI();UM();_ce();Zo();Lce();Nce();Mce();Ice();Oce();Bce();Sr(ka,$r);Fce();zce();Bc()});function qce(t){return Hl.isInstance(t,Yce)}function Xce(t){return Hl.isInstance(t,bI)}function jce(t){return Hl.isInstance(t,wI)}function Kce(t){return Hl.isInstance(t,Nze)}function Qce(t){return Hl.isInstance(t,TI)}function Jce(t){return Hl.isInstance(t,Zce)}function eue(t){return Hl.isInstance(t,kI)}function rue(t){return Hl.isInstance(t,tue)}function iue(t){return Hl.isInstance(t,nue)}function sue(t){return Hl.isInstance(t,aue)}function lue(t){return Hl.isInstance(t,oue)}var _ze,Rt,Wce,Yce,bI,Lze,Dze,wI,Nze,TI,Zce,kI,tue,nue,aue,oue,Rze,cue,Hl,Gce,Mze,$ce,Ize,Vce,Oze,Uce,Pze,Hce,Bze,Fze,zze,Gze,$ze,Vze,Wl,EI,SI,CI,AI,_I,Uze,Hze,Wze,Yze,Ug,A0,il,qze,al=M(()=>{"use strict";Wc();Wc();Wc();Wc();_ze=Object.defineProperty,Rt=o((t,e)=>_ze(t,"name",{value:e,configurable:!0}),"__name"),Wce="Statement",Yce="Architecture";o(qce,"isArchitecture");Rt(qce,"isArchitecture");bI="Branch";o(Xce,"isBranch");Rt(Xce,"isBranch");Lze="Checkout",Dze="CherryPicking",wI="Commit";o(jce,"isCommit");Rt(jce,"isCommit");Nze="Common";o(Kce,"isCommon");Rt(Kce,"isCommon");TI="GitGraph";o(Qce,"isGitGraph");Rt(Qce,"isGitGraph");Zce="Info";o(Jce,"isInfo");Rt(Jce,"isInfo");kI="Merge";o(eue,"isMerge");Rt(eue,"isMerge");tue="Packet";o(rue,"isPacket");Rt(rue,"isPacket");nue="PacketBlock";o(iue,"isPacketBlock");Rt(iue,"isPacketBlock");aue="Pie";o(sue,"isPie");Rt(sue,"isPie");oue="PieSection";o(lue,"isPieSection");Rt(lue,"isPieSection");Rze="Direction",cue=class extends Qd{static{o(this,"MermaidAstReflection")}static{Rt(this,"MermaidAstReflection")}getAllTypes(){return["Architecture","Branch","Checkout","CherryPicking","Commit","Common","Direction","Edge","GitGraph","Group","Info","Junction","Merge","Packet","PacketBlock","Pie","PieSection","Service","Statement"]}computeIsSubtype(t,e){switch(t){case bI:case Lze:case Dze:case wI:case kI:return this.isSubtype(Wce,e);case Rze:return this.isSubtype(TI,e);default:return!1}}getReferenceType(t){let e=`${t.container.$type}:${t.property}`;switch(e){default:throw new Error(`${e} is not a valid reference id.`)}}getTypeMetaData(t){switch(t){case"Architecture":return{name:"Architecture",properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case"Branch":return{name:"Branch",properties:[{name:"name"},{name:"order"}]};case"Checkout":return{name:"Checkout",properties:[{name:"branch"}]};case"CherryPicking":return{name:"CherryPicking",properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case"Commit":return{name:"Commit",properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case"Common":return{name:"Common",properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case"Edge":return{name:"Edge",properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case"GitGraph":return{name:"GitGraph",properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case"Group":return{name:"Group",properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case"Info":return{name:"Info",properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case"Junction":return{name:"Junction",properties:[{name:"id"},{name:"in"}]};case"Merge":return{name:"Merge",properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case"Packet":return{name:"Packet",properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case"PacketBlock":return{name:"PacketBlock",properties:[{name:"end"},{name:"label"},{name:"start"}]};case"Pie":return{name:"Pie",properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case"PieSection":return{name:"PieSection",properties:[{name:"label"},{name:"value"}]};case"Service":return{name:"Service",properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case"Direction":return{name:"Direction",properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};default:return{name:t,properties:[]}}}},Hl=new cue,Mze=Rt(()=>Gce??(Gce=gf('{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","name":"Info","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"InfoGrammar"),Ize=Rt(()=>$ce??($ce=gf(`{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","name":"Packet","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"packet-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}`)),"PacketGrammar"),Oze=Rt(()=>Vce??(Vce=gf('{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","name":"Pie","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"PIE_SECTION_LABEL","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]+\\"/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"PIE_SECTION_VALUE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/(0|[1-9][0-9]*)(\\\\.[0-9]+)?/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"PieGrammar"),Pze=Rt(()=>Uce??(Uce=gf('{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","name":"Architecture","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","fragment":true,"definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LeftPort","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RightPort","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Arrow","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_ID","definition":{"$type":"RegexToken","regex":"/[\\\\w]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TEXT_ICON","definition":{"$type":"RegexToken","regex":"/\\\\(\\"[^\\"]+\\"\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"ArchitectureGrammar"),Bze=Rt(()=>Hce??(Hce=gf(`{"$type":"Grammar","isDeclared":true,"name":"GitGraph","interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"rules":[{"$type":"ParserRule","name":"TitleAndAccessibilities","fragment":true,"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"EOL","fragment":true,"dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"ParserRule","name":"GitGraph","entry":true,"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+(?=\\\\s)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[]}`)),"GitGraphGrammar"),Fze={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},zze={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},Gze={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},$ze={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},Vze={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1},Wl={AstReflection:Rt(()=>new cue,"AstReflection")},EI={Grammar:Rt(()=>Mze(),"Grammar"),LanguageMetaData:Rt(()=>Fze,"LanguageMetaData"),parser:{}},SI={Grammar:Rt(()=>Ize(),"Grammar"),LanguageMetaData:Rt(()=>zze,"LanguageMetaData"),parser:{}},CI={Grammar:Rt(()=>Oze(),"Grammar"),LanguageMetaData:Rt(()=>Gze,"LanguageMetaData"),parser:{}},AI={Grammar:Rt(()=>Pze(),"Grammar"),LanguageMetaData:Rt(()=>$ze,"LanguageMetaData"),parser:{}},_I={Grammar:Rt(()=>Bze(),"Grammar"),LanguageMetaData:Rt(()=>Vze,"LanguageMetaData"),parser:{}},Uze=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,Hze=/accTitle[\t ]*:([^\n\r]*)/,Wze=/title([\t ][^\n\r]*|)/,Yze={ACC_DESCR:Uze,ACC_TITLE:Hze,TITLE:Wze},Ug=class extends k0{static{o(this,"AbstractMermaidValueConverter")}static{Rt(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=Yze[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` +`)}}},A0=class extends Ug{static{o(this,"CommonValueConverter")}static{Rt(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},il=class extends T0{static{o(this,"AbstractMermaidTokenBuilder")}static{Rt(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},qze=class extends il{static{o(this,"CommonTokenBuilder")}static{Rt(this,"CommonTokenBuilder")}}});function nE(t=vo){let e=Wi(yo(t),Wl),r=Wi(go({shared:e}),_I,rE);return e.ServiceRegistry.register(r),{shared:e,GitGraph:r}}var Xze,rE,LI=M(()=>{"use strict";al();Wc();Xze=class extends il{static{o(this,"GitGraphTokenBuilder")}static{Rt(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},rE={parser:{TokenBuilder:Rt(()=>new Xze,"TokenBuilder"),ValueConverter:Rt(()=>new A0,"ValueConverter")}};o(nE,"createGitGraphServices");Rt(nE,"createGitGraphServices")});function aE(t=vo){let e=Wi(yo(t),Wl),r=Wi(go({shared:e}),EI,iE);return e.ServiceRegistry.register(r),{shared:e,Info:r}}var jze,iE,DI=M(()=>{"use strict";al();Wc();jze=class extends il{static{o(this,"InfoTokenBuilder")}static{Rt(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},iE={parser:{TokenBuilder:Rt(()=>new jze,"TokenBuilder"),ValueConverter:Rt(()=>new A0,"ValueConverter")}};o(aE,"createInfoServices");Rt(aE,"createInfoServices")});function oE(t=vo){let e=Wi(yo(t),Wl),r=Wi(go({shared:e}),SI,sE);return e.ServiceRegistry.register(r),{shared:e,Packet:r}}var Kze,sE,NI=M(()=>{"use strict";al();Wc();Kze=class extends il{static{o(this,"PacketTokenBuilder")}static{Rt(this,"PacketTokenBuilder")}constructor(){super(["packet-beta"])}},sE={parser:{TokenBuilder:Rt(()=>new Kze,"TokenBuilder"),ValueConverter:Rt(()=>new A0,"ValueConverter")}};o(oE,"createPacketServices");Rt(oE,"createPacketServices")});function cE(t=vo){let e=Wi(yo(t),Wl),r=Wi(go({shared:e}),CI,lE);return e.ServiceRegistry.register(r),{shared:e,Pie:r}}var Qze,Zze,lE,RI=M(()=>{"use strict";al();Wc();Qze=class extends il{static{o(this,"PieTokenBuilder")}static{Rt(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},Zze=class extends Ug{static{o(this,"PieValueConverter")}static{Rt(this,"PieValueConverter")}runCustomConverter(t,e,r){if(t.name==="PIE_SECTION_LABEL")return e.replace(/"/g,"").trim()}},lE={parser:{TokenBuilder:Rt(()=>new Qze,"TokenBuilder"),ValueConverter:Rt(()=>new Zze,"ValueConverter")}};o(cE,"createPieServices");Rt(cE,"createPieServices")});function hE(t=vo){let e=Wi(yo(t),Wl),r=Wi(go({shared:e}),AI,uE);return e.ServiceRegistry.register(r),{shared:e,Architecture:r}}var Jze,eGe,uE,MI=M(()=>{"use strict";al();Wc();Jze=class extends il{static{o(this,"ArchitectureTokenBuilder")}static{Rt(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},eGe=class extends Ug{static{o(this,"ArchitectureValueConverter")}static{Rt(this,"ArchitectureValueConverter")}runCustomConverter(t,e,r){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE")return e.replace(/[[\]]/g,"").trim()}},uE={parser:{TokenBuilder:Rt(()=>new Jze,"TokenBuilder"),ValueConverter:Rt(()=>new eGe,"ValueConverter")}};o(hE,"createArchitectureServices");Rt(hE,"createArchitectureServices")});var uue={};vr(uue,{InfoModule:()=>iE,createInfoServices:()=>aE});var hue=M(()=>{"use strict";DI();al()});var fue={};vr(fue,{PacketModule:()=>sE,createPacketServices:()=>oE});var due=M(()=>{"use strict";NI();al()});var pue={};vr(pue,{PieModule:()=>lE,createPieServices:()=>cE});var mue=M(()=>{"use strict";RI();al()});var gue={};vr(gue,{ArchitectureModule:()=>uE,createArchitectureServices:()=>hE});var yue=M(()=>{"use strict";MI();al()});var vue={};vr(vue,{GitGraphModule:()=>rE,createGitGraphServices:()=>nE});var xue=M(()=>{"use strict";LI();al()});async function Yl(t,e){let r=tGe[t];if(!r)throw new Error(`Unknown diagram type: ${t}`);_0[t]||await r();let i=_0[t].parse(e);if(i.lexerErrors.length>0||i.parserErrors.length>0)throw new rGe(i);return i.value}var _0,tGe,rGe,Hg=M(()=>{"use strict";LI();DI();NI();RI();MI();al();_0={},tGe={info:Rt(async()=>{let{createInfoServices:t}=await Promise.resolve().then(()=>(hue(),uue)),e=t().Info.parser.LangiumParser;_0.info=e},"info"),packet:Rt(async()=>{let{createPacketServices:t}=await Promise.resolve().then(()=>(due(),fue)),e=t().Packet.parser.LangiumParser;_0.packet=e},"packet"),pie:Rt(async()=>{let{createPieServices:t}=await Promise.resolve().then(()=>(mue(),pue)),e=t().Pie.parser.LangiumParser;_0.pie=e},"pie"),architecture:Rt(async()=>{let{createArchitectureServices:t}=await Promise.resolve().then(()=>(yue(),gue)),e=t().Architecture.parser.LangiumParser;_0.architecture=e},"architecture"),gitGraph:Rt(async()=>{let{createGitGraphServices:t}=await Promise.resolve().then(()=>(xue(),vue)),e=t().GitGraph.parser.LangiumParser;_0.gitGraph=e},"gitGraph")};o(Yl,"parse");Rt(Yl,"parse");rGe=class extends Error{static{o(this,"MermaidParseError")}constructor(t){let e=t.lexerErrors.map(n=>n.message).join(` +`),r=t.parserErrors.map(n=>n.message).join(` +`);super(`Parsing failed: ${e} ${r}`),this.result=t}static{Rt(this,"MermaidParseError")}}});function yf(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}var Tx=M(()=>{"use strict";o(yf,"populateCommonDb")});var jr,fE=M(()=>{"use strict";jr={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4}});var vf,dE=M(()=>{"use strict";vf=class{constructor(e){this.init=e;this.records=this.init()}static{o(this,"ImperativeState")}reset(){this.records=this.init()}}});function II(){return n9({length:7})}function iGe(t,e){let r=Object.create(null);return t.reduce((n,i)=>{let a=e(i);return r[a]||(r[a]=!0,n.push(i)),n},[])}function bue(t,e,r){let n=t.indexOf(e);n===-1?t.push(r):t.splice(n,1,r)}function Tue(t){let e=t.reduce((i,a)=>i.seq>a.seq?i:a,t[0]),r="";t.forEach(function(i){i===e?r+=" *":r+=" |"});let n=[r,e.id,e.seq];for(let i in Tt.records.branches)Tt.records.branches.get(i)===e.id&&n.push(i);if(Y.debug(n.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let i=Tt.records.commits.get(e.parents[0]);bue(t,e,i),e.parents[1]&&t.push(Tt.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let i=Tt.records.commits.get(e.parents[0]);bue(t,e,i)}}t=iGe(t,i=>i.id),Tue(t)}var nGe,L0,Tt,aGe,sGe,oGe,lGe,cGe,uGe,hGe,wue,fGe,dGe,pGe,mGe,gGe,kue,yGe,vGe,xGe,pE,OI=M(()=>{"use strict";ut();hr();Za();fr();Ai();fE();dE();bs();nGe=ur.gitGraph,L0=o(()=>Ds({...nGe,...Cr().gitGraph}),"getConfig"),Tt=new vf(()=>{let t=L0(),e=t.mainBranchName,r=t.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:r}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});o(II,"getID");o(iGe,"uniqBy");aGe=o(function(t){Tt.records.direction=t},"setDirection"),sGe=o(function(t){Y.debug("options str",t),t=t?.trim(),t=t||"{}";try{Tt.records.options=JSON.parse(t)}catch(e){Y.error("error while parsing gitGraph options",e.message)}},"setOptions"),oGe=o(function(){return Tt.records.options},"getOptions"),lGe=o(function(t){let e=t.msg,r=t.id,n=t.type,i=t.tags;Y.info("commit",e,r,n,i),Y.debug("Entering commit:",e,r,n,i);let a=L0();r=qe.sanitizeText(r,a),e=qe.sanitizeText(e,a),i=i?.map(l=>qe.sanitizeText(l,a));let s={id:r||Tt.records.seq+"-"+II(),message:e,seq:Tt.records.seq++,type:n??jr.NORMAL,tags:i??[],parents:Tt.records.head==null?[]:[Tt.records.head.id],branch:Tt.records.currBranch};Tt.records.head=s,Y.info("main branch",a.mainBranchName),Tt.records.commits.set(s.id,s),Tt.records.branches.set(Tt.records.currBranch,s.id),Y.debug("in pushCommit "+s.id)},"commit"),cGe=o(function(t){let e=t.name,r=t.order;if(e=qe.sanitizeText(e,L0()),Tt.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);Tt.records.branches.set(e,Tt.records.head!=null?Tt.records.head.id:null),Tt.records.branchConfig.set(e,{name:e,order:r}),wue(e),Y.debug("in createBranch")},"branch"),uGe=o(t=>{let e=t.branch,r=t.id,n=t.type,i=t.tags,a=L0();e=qe.sanitizeText(e,a),r&&(r=qe.sanitizeText(r,a));let s=Tt.records.branches.get(Tt.records.currBranch),l=Tt.records.branches.get(e),u=s?Tt.records.commits.get(s):void 0,h=l?Tt.records.commits.get(l):void 0;if(u&&h&&u.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(Tt.records.currBranch===e){let p=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(u===void 0||!u){let p=new Error(`Incorrect usage of "merge". Current branch (${Tt.records.currBranch})has no commits`);throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},p}if(!Tt.records.branches.has(e)){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},p}if(h===void 0||!h){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},p}if(u===h){let p=new Error('Incorrect usage of "merge". Both branches have same head');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(r&&Tt.records.commits.has(r)){let p=new Error('Incorrect usage of "merge". Commit with id:'+r+" already exists, use different custom Id");throw p.hash={text:`merge ${e} ${r} ${n} ${i?.join(" ")}`,token:`merge ${e} ${r} ${n} ${i?.join(" ")}`,expected:[`merge ${e} ${r}_UNIQUE ${n} ${i?.join(" ")}`]},p}let f=l||"",d={id:r||`${Tt.records.seq}-${II()}`,message:`merged branch ${e} into ${Tt.records.currBranch}`,seq:Tt.records.seq++,parents:Tt.records.head==null?[]:[Tt.records.head.id,f],branch:Tt.records.currBranch,type:jr.MERGE,customType:n,customId:!!r,tags:i??[]};Tt.records.head=d,Tt.records.commits.set(d.id,d),Tt.records.branches.set(Tt.records.currBranch,d.id),Y.debug(Tt.records.branches),Y.debug("in mergeBranch")},"merge"),hGe=o(function(t){let e=t.id,r=t.targetId,n=t.tags,i=t.parent;Y.debug("Entering cherryPick:",e,r,n);let a=L0();if(e=qe.sanitizeText(e,a),r=qe.sanitizeText(r,a),n=n?.map(u=>qe.sanitizeText(u,a)),i=qe.sanitizeText(i,a),!e||!Tt.records.commits.has(e)){let u=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw u.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},u}let s=Tt.records.commits.get(e);if(s===void 0||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(i&&!(Array.isArray(s.parents)&&s.parents.includes(i)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let l=s.branch;if(s.type===jr.MERGE&&!i)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!r||!Tt.records.commits.has(r)){if(l===Tt.records.currBranch){let d=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let u=Tt.records.branches.get(Tt.records.currBranch);if(u===void 0||!u){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Tt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let h=Tt.records.commits.get(u);if(h===void 0||!h){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Tt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let f={id:Tt.records.seq+"-"+II(),message:`cherry-picked ${s?.message} into ${Tt.records.currBranch}`,seq:Tt.records.seq++,parents:Tt.records.head==null?[]:[Tt.records.head.id,s.id],branch:Tt.records.currBranch,type:jr.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===jr.MERGE?`|parent:${i}`:""}`]};Tt.records.head=f,Tt.records.commits.set(f.id,f),Tt.records.branches.set(Tt.records.currBranch,f.id),Y.debug(Tt.records.branches),Y.debug("in cherryPick")}},"cherryPick"),wue=o(function(t){if(t=qe.sanitizeText(t,L0()),Tt.records.branches.has(t)){Tt.records.currBranch=t;let e=Tt.records.branches.get(Tt.records.currBranch);e===void 0||!e?Tt.records.head=null:Tt.records.head=Tt.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw e.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},e}},"checkout");o(bue,"upsert");o(Tue,"prettyPrintCommitHistory");fGe=o(function(){Y.debug(Tt.records.commits);let t=kue()[0];Tue([t])},"prettyPrint"),dGe=o(function(){Tt.reset(),Lr()},"clear"),pGe=o(function(){return[...Tt.records.branchConfig.values()].map((e,r)=>e.order!==null&&e.order!==void 0?e:{...e,order:parseFloat(`0.${r}`)}).sort((e,r)=>(e.order??0)-(r.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),mGe=o(function(){return Tt.records.branches},"getBranches"),gGe=o(function(){return Tt.records.commits},"getCommits"),kue=o(function(){let t=[...Tt.records.commits.values()];return t.forEach(function(e){Y.debug(e.id)}),t.sort((e,r)=>e.seq-r.seq),t},"getCommitsArray"),yGe=o(function(){return Tt.records.currBranch},"getCurrentBranch"),vGe=o(function(){return Tt.records.direction},"getDirection"),xGe=o(function(){return Tt.records.head},"getHead"),pE={commitType:jr,getConfig:L0,setDirection:aGe,setOptions:sGe,getOptions:oGe,commit:lGe,branch:cGe,merge:uGe,cherryPick:hGe,checkout:wue,prettyPrint:fGe,clear:dGe,getBranchesAsObjArray:pGe,getBranches:mGe,getCommits:gGe,getCommitsArray:kue,getCurrentBranch:yGe,getDirection:vGe,getHead:xGe,setAccTitle:Mr,getAccTitle:Br,getAccDescription:zr,setAccDescription:Fr,setDiagramTitle:cn,getDiagramTitle:Jr}});var bGe,wGe,TGe,kGe,EGe,SGe,CGe,Eue,Sue=M(()=>{"use strict";Hg();ut();Tx();OI();fE();bGe=o((t,e)=>{yf(t,e),t.dir&&e.setDirection(t.dir);for(let r of t.statements)wGe(r,e)},"populate"),wGe=o((t,e)=>{let n={Commit:o(i=>e.commit(TGe(i)),"Commit"),Branch:o(i=>e.branch(kGe(i)),"Branch"),Merge:o(i=>e.merge(EGe(i)),"Merge"),Checkout:o(i=>e.checkout(SGe(i)),"Checkout"),CherryPicking:o(i=>e.cherryPick(CGe(i)),"CherryPicking")}[t.$type];n?n(t):Y.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),TGe=o(t=>({id:t.id,msg:t.message??"",type:t.type!==void 0?jr[t.type]:jr.NORMAL,tags:t.tags??void 0}),"parseCommit"),kGe=o(t=>({name:t.name,order:t.order??0}),"parseBranch"),EGe=o(t=>({branch:t.branch,id:t.id??"",type:t.type!==void 0?jr[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),SGe=o(t=>t.branch,"parseCheckout"),CGe=o(t=>({id:t.id,targetId:"",tags:t.tags?.length===0?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),Eue={parse:o(async t=>{let e=await Yl("gitGraph",t);Y.debug(e),bGe(e,pE)},"parse")}});var AGe,sl,bf,wf,Yc,Zu,D0,Ws,Ys,mE,kx,gE,xf,Rr,_Ge,Aue,_ue,LGe,DGe,NGe,RGe,MGe,IGe,OGe,PGe,BGe,FGe,zGe,GGe,Cue,$Ge,Ex,VGe,UGe,HGe,WGe,YGe,Lue,Due=M(()=>{"use strict";pr();Vt();ut();hr();fE();AGe=pe(),sl=AGe?.gitGraph,bf=10,wf=40,Yc=4,Zu=2,D0=8,Ws=new Map,Ys=new Map,mE=30,kx=new Map,gE=[],xf=0,Rr="LR",_Ge=o(()=>{Ws.clear(),Ys.clear(),kx.clear(),xf=0,gE=[],Rr="LR"},"clear"),Aue=o(t=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof t=="string"?t.split(/\\n|\n|/gi):t).forEach(n=>{let i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),i.setAttribute("class","row"),i.textContent=n.trim(),e.appendChild(i)}),e},"drawText"),_ue=o(t=>{let e,r,n;return Rr==="BT"?(r=o((i,a)=>i<=a,"comparisonFunc"),n=1/0):(r=o((i,a)=>i>=a,"comparisonFunc"),n=0),t.forEach(i=>{let a=Rr==="TB"||Rr=="BT"?Ys.get(i)?.y:Ys.get(i)?.x;a!==void 0&&r(a,n)&&(e=i,n=a)}),e},"findClosestParent"),LGe=o(t=>{let e="",r=1/0;return t.forEach(n=>{let i=Ys.get(n).y;i<=r&&(e=n,r=i)}),e||void 0},"findClosestParentBT"),DGe=o((t,e,r)=>{let n=r,i=r,a=[];t.forEach(s=>{let l=e.get(s);if(!l)throw new Error(`Commit not found for key ${s}`);l.parents.length?(n=RGe(l),i=Math.max(n,i)):a.push(l),MGe(l,n)}),n=i,a.forEach(s=>{IGe(s,n,r)}),t.forEach(s=>{let l=e.get(s);if(l?.parents.length){let u=LGe(l.parents);n=Ys.get(u).y-wf,n<=i&&(i=n);let h=Ws.get(l.branch).pos,f=n-bf;Ys.set(l.id,{x:h,y:f})}})},"setParallelBTPos"),NGe=o(t=>{let e=_ue(t.parents.filter(n=>n!==null));if(!e)throw new Error(`Closest parent not found for commit ${t.id}`);let r=Ys.get(e)?.y;if(r===void 0)throw new Error(`Closest parent position not found for commit ${t.id}`);return r},"findClosestParentPos"),RGe=o(t=>NGe(t)+wf,"calculateCommitPosition"),MGe=o((t,e)=>{let r=Ws.get(t.branch);if(!r)throw new Error(`Branch not found for commit ${t.id}`);let n=r.pos,i=e+bf;return Ys.set(t.id,{x:n,y:i}),{x:n,y:i}},"setCommitPosition"),IGe=o((t,e,r)=>{let n=Ws.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);let i=e+r,a=n.pos;Ys.set(t.id,{x:a,y:i})},"setRootPosition"),OGe=o((t,e,r,n,i,a)=>{if(a===jr.HIGHLIGHT)t.append("rect").attr("x",r.x-10).attr("y",r.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${i%D0} ${n}-outer`),t.append("rect").attr("x",r.x-6).attr("y",r.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${i%D0} ${n}-inner`);else if(a===jr.CHERRY_PICK)t.append("circle").attr("cx",r.x).attr("cy",r.y).attr("r",10).attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x-3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x+3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x+3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x-3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`);else{let s=t.append("circle");if(s.attr("cx",r.x),s.attr("cy",r.y),s.attr("r",e.type===jr.MERGE?9:10),s.attr("class",`commit ${e.id} commit${i%D0}`),a===jr.MERGE){let l=t.append("circle");l.attr("cx",r.x),l.attr("cy",r.y),l.attr("r",6),l.attr("class",`commit ${n} ${e.id} commit${i%D0}`)}a===jr.REVERSE&&t.append("path").attr("d",`M ${r.x-5},${r.y-5}L${r.x+5},${r.y+5}M${r.x-5},${r.y+5}L${r.x+5},${r.y-5}`).attr("class",`commit ${n} ${e.id} commit${i%D0}`)}},"drawCommitBullet"),PGe=o((t,e,r,n)=>{if(e.type!==jr.CHERRY_PICK&&(e.customId&&e.type===jr.MERGE||e.type!==jr.MERGE)&&sl?.showCommitLabel){let i=t.append("g"),a=i.insert("rect").attr("class","commit-label-bkg"),s=i.append("text").attr("x",n).attr("y",r.y+25).attr("class","commit-label").text(e.id),l=s.node()?.getBBox();if(l&&(a.attr("x",r.posWithOffset-l.width/2-Zu).attr("y",r.y+13.5).attr("width",l.width+2*Zu).attr("height",l.height+2*Zu),Rr==="TB"||Rr==="BT"?(a.attr("x",r.x-(l.width+4*Yc+5)).attr("y",r.y-12),s.attr("x",r.x-(l.width+4*Yc)).attr("y",r.y+l.height-12)):s.attr("x",r.posWithOffset-l.width/2),sl.rotateCommitLabel))if(Rr==="TB"||Rr==="BT")s.attr("transform","rotate(-45, "+r.x+", "+r.y+")"),a.attr("transform","rotate(-45, "+r.x+", "+r.y+")");else{let u=-7.5-(l.width+10)/25*9.5,h=10+l.width/25*8.5;i.attr("transform","translate("+u+", "+h+") rotate(-45, "+n+", "+r.y+")")}}},"drawCommitLabel"),BGe=o((t,e,r,n)=>{if(e.tags.length>0){let i=0,a=0,s=0,l=[];for(let u of e.tags.reverse()){let h=t.insert("polygon"),f=t.append("circle"),d=t.append("text").attr("y",r.y-16-i).attr("class","tag-label").text(u),p=d.node()?.getBBox();if(!p)throw new Error("Tag bbox not found");a=Math.max(a,p.width),s=Math.max(s,p.height),d.attr("x",r.posWithOffset-p.width/2),l.push({tag:d,hole:f,rect:h,yOffset:i}),i+=20}for(let{tag:u,hole:h,rect:f,yOffset:d}of l){let p=s/2,m=r.y-19.2-d;if(f.attr("class","tag-label-bkg").attr("points",` + ${n-a/2-Yc/2},${m+Zu} + ${n-a/2-Yc/2},${m-Zu} + ${r.posWithOffset-a/2-Yc},${m-p-Zu} + ${r.posWithOffset+a/2+Yc},${m-p-Zu} + ${r.posWithOffset+a/2+Yc},${m+p+Zu} + ${r.posWithOffset-a/2-Yc},${m+p+Zu}`),h.attr("cy",m).attr("cx",n-a/2+Yc/2).attr("r",1.5).attr("class","tag-hole"),Rr==="TB"||Rr==="BT"){let g=n+d;f.attr("class","tag-label-bkg").attr("points",` + ${r.x},${g+2} + ${r.x},${g-2} + ${r.x+bf},${g-p-2} + ${r.x+bf+a+4},${g-p-2} + ${r.x+bf+a+4},${g+p+2} + ${r.x+bf},${g+p+2}`).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),h.attr("cx",r.x+Yc/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),u.attr("x",r.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+r.x+","+n+")")}}}},"drawCommitTags"),FGe=o(t=>{switch(t.customType??t.type){case jr.NORMAL:return"commit-normal";case jr.REVERSE:return"commit-reverse";case jr.HIGHLIGHT:return"commit-highlight";case jr.MERGE:return"commit-merge";case jr.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),zGe=o((t,e,r,n)=>{let i={x:0,y:0};if(t.parents.length>0){let a=_ue(t.parents);if(a){let s=n.get(a)??i;return e==="TB"?s.y+wf:e==="BT"?(n.get(t.id)??i).y-wf:s.x+wf}}else return e==="TB"?mE:e==="BT"?(n.get(t.id)??i).y-wf:0;return 0},"calculatePosition"),GGe=o((t,e,r)=>{let n=Rr==="BT"&&r?e:e+bf,i=Rr==="TB"||Rr==="BT"?n:Ws.get(t.branch)?.pos,a=Rr==="TB"||Rr==="BT"?Ws.get(t.branch)?.pos:n;if(a===void 0||i===void 0)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:i,posWithOffset:n}},"getCommitPosition"),Cue=o((t,e,r)=>{if(!sl)throw new Error("GitGraph config not found");let n=t.append("g").attr("class","commit-bullets"),i=t.append("g").attr("class","commit-labels"),a=Rr==="TB"||Rr==="BT"?mE:0,s=[...e.keys()],l=sl?.parallelCommits??!1,u=o((f,d)=>{let p=e.get(f)?.seq,m=e.get(d)?.seq;return p!==void 0&&m!==void 0?p-m:0},"sortKeys"),h=s.sort(u);Rr==="BT"&&(l&&DGe(h,e,a),h=h.reverse()),h.forEach(f=>{let d=e.get(f);if(!d)throw new Error(`Commit not found for key ${f}`);l&&(a=zGe(d,Rr,a,Ys));let p=GGe(d,a,l);if(r){let m=FGe(d),g=d.customType??d.type,y=Ws.get(d.branch)?.index??0;OGe(n,d,p,m,y,g),PGe(i,d,p,a),BGe(i,d,p,a)}Rr==="TB"||Rr==="BT"?Ys.set(d.id,{x:p.x,y:p.posWithOffset}):Ys.set(d.id,{x:p.posWithOffset,y:p.y}),a=Rr==="BT"&&l?a+wf:a+wf+bf,a>xf&&(xf=a)})},"drawCommits"),$Ge=o((t,e,r,n,i)=>{let s=(Rr==="TB"||Rr==="BT"?r.xh.branch===s,"isOnBranchToGetCurve"),u=o(h=>h.seq>t.seq&&h.sequ(h)&&l(h))},"shouldRerouteArrow"),Ex=o((t,e,r=0)=>{let n=t+Math.abs(t-e)/2;if(r>5)return n;if(gE.every(s=>Math.abs(s-n)>=10))return gE.push(n),n;let a=Math.abs(t-e);return Ex(t,e-a/5,r+1)},"findLane"),VGe=o((t,e,r,n)=>{let i=Ys.get(e.id),a=Ys.get(r.id);if(i===void 0||a===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${r.id}`);let s=$Ge(e,r,i,a,n),l="",u="",h=0,f=0,d=Ws.get(r.branch)?.index;r.type===jr.MERGE&&e.id!==r.parents[0]&&(d=Ws.get(e.branch)?.index);let p;if(s){l="A 10 10, 0, 0, 0,",u="A 10 10, 0, 0, 1,",h=10,f=10;let m=i.ya.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===jr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y-h} ${u} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x+h} ${i.y} ${l} ${a.x} ${i.y+f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):Rr==="BT"?(i.xa.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===jr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${l} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):(i.ya.y&&(r.type===jr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${u} ${i.x+f} ${a.y} L ${a.x} ${a.y}`),i.y===a.y&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`));if(p===void 0)throw new Error("Line definition not found");t.append("path").attr("d",p).attr("class","arrow arrow"+d%D0)},"drawArrow"),UGe=o((t,e)=>{let r=t.append("g").attr("class","commit-arrows");[...e.keys()].forEach(n=>{let i=e.get(n);i.parents&&i.parents.length>0&&i.parents.forEach(a=>{VGe(r,e.get(a),i,e)})})},"drawArrows"),HGe=o((t,e)=>{let r=t.append("g");e.forEach((n,i)=>{let a=i%D0,s=Ws.get(n.name)?.pos;if(s===void 0)throw new Error(`Position not found for branch ${n.name}`);let l=r.append("line");l.attr("x1",0),l.attr("y1",s),l.attr("x2",xf),l.attr("y2",s),l.attr("class","branch branch"+a),Rr==="TB"?(l.attr("y1",mE),l.attr("x1",s),l.attr("y2",xf),l.attr("x2",s)):Rr==="BT"&&(l.attr("y1",xf),l.attr("x1",s),l.attr("y2",mE),l.attr("x2",s)),gE.push(s);let u=n.name,h=Aue(u),f=r.insert("rect"),p=r.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+a);p.node().appendChild(h);let m=h.getBBox();f.attr("class","branchLabelBkg label"+a).attr("rx",4).attr("ry",4).attr("x",-m.width-4-(sl?.rotateCommitLabel===!0?30:0)).attr("y",-m.height/2+8).attr("width",m.width+18).attr("height",m.height+4),p.attr("transform","translate("+(-m.width-14-(sl?.rotateCommitLabel===!0?30:0))+", "+(s-m.height/2-1)+")"),Rr==="TB"?(f.attr("x",s-m.width/2-10).attr("y",0),p.attr("transform","translate("+(s-m.width/2-5)+", 0)")):Rr==="BT"?(f.attr("x",s-m.width/2-10).attr("y",xf),p.attr("transform","translate("+(s-m.width/2-5)+", "+xf+")")):f.attr("transform","translate(-19, "+(s-m.height/2)+")")})},"drawBranches"),WGe=o(function(t,e,r,n,i){return Ws.set(t,{pos:e,index:r}),e+=50+(i?40:0)+(Rr==="TB"||Rr==="BT"?n.width/2:0),e},"setBranchPosition"),YGe=o(function(t,e,r,n){if(_Ge(),Y.debug("in gitgraph renderer",t+` +`,"id:",e,r),!sl)throw new Error("GitGraph config not found");let i=sl.rotateCommitLabel??!1,a=n.db;kx=a.getCommits();let s=a.getBranchesAsObjArray();Rr=a.getDirection();let l=Ve(`[id="${e}"]`),u=0;s.forEach((h,f)=>{let d=Aue(h.name),p=l.append("g"),m=p.insert("g").attr("class","branchLabel"),g=m.insert("g").attr("class","label branch-label");g.node()?.appendChild(d);let y=d.getBBox();u=WGe(h.name,u,f,y,i),g.remove(),m.remove(),p.remove()}),Cue(l,kx,!1),sl.showBranches&&HGe(l,s),UGe(l,kx),Cue(l,kx,!0),Ut.insertTitle(l,"gitTitleText",sl.titleTopMargin??0,a.getDiagramTitle()),o7(void 0,l,sl.diagramPadding,sl.useMaxWidth)},"draw"),Lue={draw:YGe}});var qGe,Nue,Rue=M(()=>{"use strict";qGe=o(t=>` + .commit-id, + .commit-msg, + .branch-label { + fill: lightgrey; + color: lightgrey; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + ${[0,1,2,3,4,5,6,7].map(e=>` + .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; } + .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; } + .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; } + .label${e} { fill: ${t["git"+e]}; } + .arrow${e} { stroke: ${t["git"+e]}; } + `).join(` +`)} + + .branch { + stroke-width: 1; + stroke: ${t.lineColor}; + stroke-dasharray: 2; + } + .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};} + .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; } + .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};} + .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; } + .tag-hole { fill: ${t.textColor}; } + + .commit-merge { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + .commit-reverse { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + stroke-width: 3; + } + .commit-highlight-outer { + } + .commit-highlight-inner { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + + .arrow { stroke-width: 8; stroke-linecap: round; fill: none} + .gitTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } +`,"getStyles"),Nue=qGe});var Mue={};vr(Mue,{diagram:()=>XGe});var XGe,Iue=M(()=>{"use strict";Sue();OI();Due();Rue();XGe={parser:Eue,db:pE,renderer:Lue,styles:Nue}});var PI,Bue,Fue=M(()=>{"use strict";PI=function(){var t=o(function(R,C,O,N){for(O=O||{},N=R.length;N--;O[R[N]]=C);return O},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],r=[1,26],n=[1,27],i=[1,28],a=[1,29],s=[1,30],l=[1,31],u=[1,32],h=[1,33],f=[1,34],d=[1,9],p=[1,10],m=[1,11],g=[1,12],y=[1,13],v=[1,14],x=[1,15],b=[1,16],w=[1,19],_=[1,20],T=[1,21],E=[1,22],L=[1,23],S=[1,25],A=[1,35],I={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:o(function(C,O,N,P,F,B,G){var z=B.length-1;switch(F){case 1:return B[z-1];case 2:this.$=[];break;case 3:B[z-1].push(B[z]),this.$=B[z-1];break;case 4:case 5:this.$=B[z];break;case 6:case 7:this.$=[];break;case 8:P.setWeekday("monday");break;case 9:P.setWeekday("tuesday");break;case 10:P.setWeekday("wednesday");break;case 11:P.setWeekday("thursday");break;case 12:P.setWeekday("friday");break;case 13:P.setWeekday("saturday");break;case 14:P.setWeekday("sunday");break;case 15:P.setWeekend("friday");break;case 16:P.setWeekend("saturday");break;case 17:P.setDateFormat(B[z].substr(11)),this.$=B[z].substr(11);break;case 18:P.enableInclusiveEndDates(),this.$=B[z].substr(18);break;case 19:P.TopAxis(),this.$=B[z].substr(8);break;case 20:P.setAxisFormat(B[z].substr(11)),this.$=B[z].substr(11);break;case 21:P.setTickInterval(B[z].substr(13)),this.$=B[z].substr(13);break;case 22:P.setExcludes(B[z].substr(9)),this.$=B[z].substr(9);break;case 23:P.setIncludes(B[z].substr(9)),this.$=B[z].substr(9);break;case 24:P.setTodayMarker(B[z].substr(12)),this.$=B[z].substr(12);break;case 27:P.setDiagramTitle(B[z].substr(6)),this.$=B[z].substr(6);break;case 28:this.$=B[z].trim(),P.setAccTitle(this.$);break;case 29:case 30:this.$=B[z].trim(),P.setAccDescription(this.$);break;case 31:P.addSection(B[z].substr(8)),this.$=B[z].substr(8);break;case 33:P.addTask(B[z-1],B[z]),this.$="task";break;case 34:this.$=B[z-1],P.setClickEvent(B[z-1],B[z],null);break;case 35:this.$=B[z-2],P.setClickEvent(B[z-2],B[z-1],B[z]);break;case 36:this.$=B[z-2],P.setClickEvent(B[z-2],B[z-1],null),P.setLink(B[z-2],B[z]);break;case 37:this.$=B[z-3],P.setClickEvent(B[z-3],B[z-2],B[z-1]),P.setLink(B[z-3],B[z]);break;case 38:this.$=B[z-2],P.setClickEvent(B[z-2],B[z],null),P.setLink(B[z-2],B[z-1]);break;case 39:this.$=B[z-3],P.setClickEvent(B[z-3],B[z-1],B[z]),P.setLink(B[z-3],B[z-2]);break;case 40:this.$=B[z-1],P.setLink(B[z-1],B[z]);break;case 41:case 47:this.$=B[z-1]+" "+B[z];break;case 42:case 43:case 45:this.$=B[z-2]+" "+B[z-1]+" "+B[z];break;case 44:case 46:this.$=B[z-3]+" "+B[z-2]+" "+B[z-1]+" "+B[z];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:w,31:_,33:T,35:E,36:L,37:24,38:S,40:A},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:w,31:_,33:T,35:E,36:L,37:24,38:S,40:A},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:o(function(C,O){if(O.recoverable)this.trace(C);else{var N=new Error(C);throw N.hash=O,N}},"parseError"),parse:o(function(C){var O=this,N=[0],P=[],F=[null],B=[],G=this.table,z="",W=0,Z=0,j=0,oe=2,K=1,ee=B.slice.call(arguments,1),J=Object.create(this.lexer),H={yy:{}};for(var q in this.yy)Object.prototype.hasOwnProperty.call(this.yy,q)&&(H.yy[q]=this.yy[q]);J.setInput(C,H.yy),H.yy.lexer=J,H.yy.parser=this,typeof J.yylloc>"u"&&(J.yylloc={});var Q=J.yylloc;B.push(Q);var ae=J.options&&J.options.ranges;typeof H.yy.parseError=="function"?this.parseError=H.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ue(he){N.length=N.length-2*he,F.length=F.length-he,B.length=B.length-he}o(ue,"popStack");function ce(){var he;return he=P.pop()||J.lex()||K,typeof he!="number"&&(he instanceof Array&&(P=he,he=P.pop()),he=O.symbols_[he]||he),he}o(ce,"lex");for(var te,Ne,se,ke,Re,Ce,Pe={},Ie,$e,ye,X;;){if(se=N[N.length-1],this.defaultActions[se]?ke=this.defaultActions[se]:((te===null||typeof te>"u")&&(te=ce()),ke=G[se]&&G[se][te]),typeof ke>"u"||!ke.length||!ke[0]){var fe="";X=[];for(Ie in G[se])this.terminals_[Ie]&&Ie>oe&&X.push("'"+this.terminals_[Ie]+"'");J.showPosition?fe="Parse error on line "+(W+1)+`: +`+J.showPosition()+` +Expecting `+X.join(", ")+", got '"+(this.terminals_[te]||te)+"'":fe="Parse error on line "+(W+1)+": Unexpected "+(te==K?"end of input":"'"+(this.terminals_[te]||te)+"'"),this.parseError(fe,{text:J.match,token:this.terminals_[te]||te,line:J.yylineno,loc:Q,expected:X})}if(ke[0]instanceof Array&&ke.length>1)throw new Error("Parse Error: multiple actions possible at state: "+se+", token: "+te);switch(ke[0]){case 1:N.push(te),F.push(J.yytext),B.push(J.yylloc),N.push(ke[1]),te=null,Ne?(te=Ne,Ne=null):(Z=J.yyleng,z=J.yytext,W=J.yylineno,Q=J.yylloc,j>0&&j--);break;case 2:if($e=this.productions_[ke[1]][1],Pe.$=F[F.length-$e],Pe._$={first_line:B[B.length-($e||1)].first_line,last_line:B[B.length-1].last_line,first_column:B[B.length-($e||1)].first_column,last_column:B[B.length-1].last_column},ae&&(Pe._$.range=[B[B.length-($e||1)].range[0],B[B.length-1].range[1]]),Ce=this.performAction.apply(Pe,[z,Z,W,H.yy,ke[1],F,B].concat(ee)),typeof Ce<"u")return Ce;$e&&(N=N.slice(0,-1*$e*2),F=F.slice(0,-1*$e),B=B.slice(0,-1*$e)),N.push(this.productions_[ke[1]][0]),F.push(Pe.$),B.push(Pe._$),ye=G[N[N.length-2]][N[N.length-1]],N.push(ye);break;case 3:return!0}}return!0},"parse")},D=function(){var R={EOF:1,parseError:o(function(O,N){if(this.yy.parser)this.yy.parser.parseError(O,N);else throw new Error(O)},"parseError"),setInput:o(function(C,O){return this.yy=O||this.yy||{},this._input=C,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var C=this._input[0];this.yytext+=C,this.yyleng++,this.offset++,this.match+=C,this.matched+=C;var O=C.match(/(?:\r\n?|\n).*/g);return O?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),C},"input"),unput:o(function(C){var O=C.length,N=C.split(/(?:\r\n?|\n)/g);this._input=C+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-O),this.offset-=O;var P=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),N.length-1&&(this.yylineno-=N.length-1);var F=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:N?(N.length===P.length?this.yylloc.first_column:0)+P[P.length-N.length].length-N[0].length:this.yylloc.first_column-O},this.options.ranges&&(this.yylloc.range=[F[0],F[0]+this.yyleng-O]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(C){this.unput(this.match.slice(C))},"less"),pastInput:o(function(){var C=this.matched.substr(0,this.matched.length-this.match.length);return(C.length>20?"...":"")+C.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var C=this.match;return C.length<20&&(C+=this._input.substr(0,20-C.length)),(C.substr(0,20)+(C.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var C=this.pastInput(),O=new Array(C.length+1).join("-");return C+this.upcomingInput()+` +`+O+"^"},"showPosition"),test_match:o(function(C,O){var N,P,F;if(this.options.backtrack_lexer&&(F={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(F.yylloc.range=this.yylloc.range.slice(0))),P=C[0].match(/(?:\r\n?|\n).*/g),P&&(this.yylineno+=P.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:P?P[P.length-1].length-P[P.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+C[0].length},this.yytext+=C[0],this.match+=C[0],this.matches=C,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(C[0].length),this.matched+=C[0],N=this.performAction.call(this,this.yy,this,O,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),N)return N;if(this._backtrack){for(var B in F)this[B]=F[B];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var C,O,N,P;this._more||(this.yytext="",this.match="");for(var F=this._currentRules(),B=0;BO[0].length)){if(O=N,P=B,this.options.backtrack_lexer){if(C=this.test_match(N,F[B]),C!==!1)return C;if(this._backtrack){O=!1;continue}else return!1}else if(!this.options.flex)break}return O?(C=this.test_match(O,F[P]),C!==!1?C:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var O=this.next();return O||this.lex()},"lex"),begin:o(function(O){this.conditionStack.push(O)},"begin"),popState:o(function(){var O=this.conditionStack.length-1;return O>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(O){return O=this.conditionStack.length-1-Math.abs(O||0),O>=0?this.conditionStack[O]:"INITIAL"},"topState"),pushState:o(function(O){this.begin(O)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(O,N,P,F){var B=F;switch(P){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return R}();I.lexer=D;function k(){this.yy={}}return o(k,"Parser"),k.prototype=I,I.Parser=k,new k}();PI.parser=PI;Bue=PI});var zue=Ei((BI,FI)=>{"use strict";(function(t,e){typeof BI=="object"&&typeof FI<"u"?FI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=e()})(BI,function(){"use strict";var t="day";return function(e,r,n){var i=o(function(l){return l.add(4-l.isoWeekday(),t)},"a"),a=r.prototype;a.isoWeekYear=function(){return i(this).year()},a.isoWeek=function(l){if(!this.$utils().u(l))return this.add(7*(l-this.isoWeek()),t);var u,h,f,d,p=i(this),m=(u=this.isoWeekYear(),h=this.$u,f=(h?n.utc:n)().year(u).startOf("year"),d=4-f.isoWeekday(),f.isoWeekday()>4&&(d+=7),f.add(d,t));return p.diff(m,"week")+1},a.isoWeekday=function(l){return this.$utils().u(l)?this.day()||7:this.day(this.day()%7?l:l-7)};var s=a.startOf;a.startOf=function(l,u){var h=this.$utils(),f=!!h.u(u)||u;return h.p(l)==="isoweek"?f?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(l,u)}}})});var Gue=Ei((zI,GI)=>{"use strict";(function(t,e){typeof zI=="object"&&typeof GI<"u"?GI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=e()})(zI,function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\d/,n=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,s={},l=o(function(g){return(g=+g)+(g>68?1900:2e3)},"a"),u=o(function(g){return function(y){this[g]=+y}},"f"),h=[/[+-]\d\d:?(\d\d)?|Z/,function(g){(this.zone||(this.zone={})).offset=function(y){if(!y||y==="Z")return 0;var v=y.match(/([+-]|\d\d)/g),x=60*v[1]+(+v[2]||0);return x===0?0:v[0]==="+"?-x:x}(g)}],f=o(function(g){var y=s[g];return y&&(y.indexOf?y:y.s.concat(y.f))},"u"),d=o(function(g,y){var v,x=s.meridiem;if(x){for(var b=1;b<=24;b+=1)if(g.indexOf(x(b,0,y))>-1){v=b>12;break}}else v=g===(y?"pm":"PM");return v},"d"),p={A:[a,function(g){this.afternoon=d(g,!1)}],a:[a,function(g){this.afternoon=d(g,!0)}],Q:[r,function(g){this.month=3*(g-1)+1}],S:[r,function(g){this.milliseconds=100*+g}],SS:[n,function(g){this.milliseconds=10*+g}],SSS:[/\d{3}/,function(g){this.milliseconds=+g}],s:[i,u("seconds")],ss:[i,u("seconds")],m:[i,u("minutes")],mm:[i,u("minutes")],H:[i,u("hours")],h:[i,u("hours")],HH:[i,u("hours")],hh:[i,u("hours")],D:[i,u("day")],DD:[n,u("day")],Do:[a,function(g){var y=s.ordinal,v=g.match(/\d+/);if(this.day=v[0],y)for(var x=1;x<=31;x+=1)y(x).replace(/\[|\]/g,"")===g&&(this.day=x)}],w:[i,u("week")],ww:[n,u("week")],M:[i,u("month")],MM:[n,u("month")],MMM:[a,function(g){var y=f("months"),v=(f("monthsShort")||y.map(function(x){return x.slice(0,3)})).indexOf(g)+1;if(v<1)throw new Error;this.month=v%12||v}],MMMM:[a,function(g){var y=f("months").indexOf(g)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,u("year")],YY:[n,function(g){this.year=l(g)}],YYYY:[/\d{4}/,u("year")],Z:h,ZZ:h};function m(g){var y,v;y=g,v=s&&s.formats;for(var x=(g=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(S,A,I){var D=I&&I.toUpperCase();return A||v[I]||t[I]||v[D].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(k,R,C){return R||C.slice(1)})})).match(e),b=x.length,w=0;w-1)return new Date((N==="X"?1e3:1)*O);var B=m(N)(O),G=B.year,z=B.month,W=B.day,Z=B.hours,j=B.minutes,oe=B.seconds,K=B.milliseconds,ee=B.zone,J=B.week,H=new Date,q=W||(G||z?1:H.getDate()),Q=G||H.getFullYear(),ae=0;G&&!z||(ae=z>0?z-1:H.getMonth());var ue,ce=Z||0,te=j||0,Ne=oe||0,se=K||0;return ee?new Date(Date.UTC(Q,ae,q,ce,te,Ne,se+60*ee.offset*1e3)):P?new Date(Date.UTC(Q,ae,q,ce,te,Ne,se)):(ue=new Date(Q,ae,q,ce,te,Ne,se),J&&(ue=F(ue).week(J).toDate()),ue)}catch{return new Date("")}}(_,L,T,v),this.init(),D&&D!==!0&&(this.$L=this.locale(D).$L),I&&_!=this.format(L)&&(this.$d=new Date("")),s={}}else if(L instanceof Array)for(var k=L.length,R=1;R<=k;R+=1){E[1]=L[R-1];var C=v.apply(this,E);if(C.isValid()){this.$d=C.$d,this.$L=C.$L,this.init();break}R===k&&(this.$d=new Date(""))}else b.call(this,w)}}})});var $ue=Ei(($I,VI)=>{"use strict";(function(t,e){typeof $I=="object"&&typeof VI<"u"?VI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=e()})($I,function(){"use strict";return function(t,e){var r=e.prototype,n=r.format;r.format=function(i){var a=this,s=this.$locale();if(!this.isValid())return n.bind(this)(i);var l=this.$utils(),u=(i||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(h){switch(h){case"Q":return Math.ceil((a.$M+1)/3);case"Do":return s.ordinal(a.$D);case"gggg":return a.weekYear();case"GGGG":return a.isoWeekYear();case"wo":return s.ordinal(a.week(),"W");case"w":case"ww":return l.s(a.week(),h==="w"?1:2,"0");case"W":case"WW":return l.s(a.isoWeek(),h==="W"?1:2,"0");case"k":case"kk":return l.s(String(a.$H===0?24:a.$H),h==="k"?1:2,"0");case"X":return Math.floor(a.$d.getTime()/1e3);case"x":return a.$d.getTime();case"z":return"["+a.offsetName()+"]";case"zzz":return"["+a.offsetName("long")+"]";default:return h}});return n.bind(this)(u)}}})});function nhe(t,e,r){let n=!0;for(;n;)n=!1,r.forEach(function(i){let a="^\\s*"+i+"\\s*$",s=new RegExp(a);t[0].match(s)&&(e[i]=!0,t.shift(1),n=!0)})}var Hue,xo,Wue,Yue,que,Vue,qc,YI,qI,XI,Sx,Cx,jI,KI,xE,Yg,QI,Xue,ZI,Ax,JI,eO,bE,UI,ZGe,JGe,e$e,t$e,r$e,n$e,i$e,a$e,s$e,o$e,l$e,c$e,u$e,h$e,f$e,d$e,p$e,m$e,g$e,y$e,v$e,x$e,b$e,jue,w$e,T$e,k$e,Kue,E$e,HI,Que,Zue,yE,Wg,S$e,C$e,WI,vE,Yi,Jue,A$e,N0,_$e,Uue,L$e,ehe,D$e,the,N$e,R$e,rhe,ihe=M(()=>{"use strict";Hue=Ji(Qp(),1),xo=Ji(Vb(),1),Wue=Ji(zue(),1),Yue=Ji(Gue(),1),que=Ji($ue(),1);ut();Vt();hr();Ai();xo.default.extend(Wue.default);xo.default.extend(Yue.default);xo.default.extend(que.default);Vue={friday:5,saturday:6},qc="",YI="",XI="",Sx=[],Cx=[],jI=new Map,KI=[],xE=[],Yg="",QI="",Xue=["active","done","crit","milestone"],ZI=[],Ax=!1,JI=!1,eO="sunday",bE="saturday",UI=0,ZGe=o(function(){KI=[],xE=[],Yg="",ZI=[],yE=0,WI=void 0,vE=void 0,Yi=[],qc="",YI="",QI="",qI=void 0,XI="",Sx=[],Cx=[],Ax=!1,JI=!1,UI=0,jI=new Map,Lr(),eO="sunday",bE="saturday"},"clear"),JGe=o(function(t){YI=t},"setAxisFormat"),e$e=o(function(){return YI},"getAxisFormat"),t$e=o(function(t){qI=t},"setTickInterval"),r$e=o(function(){return qI},"getTickInterval"),n$e=o(function(t){XI=t},"setTodayMarker"),i$e=o(function(){return XI},"getTodayMarker"),a$e=o(function(t){qc=t},"setDateFormat"),s$e=o(function(){Ax=!0},"enableInclusiveEndDates"),o$e=o(function(){return Ax},"endDatesAreInclusive"),l$e=o(function(){JI=!0},"enableTopAxis"),c$e=o(function(){return JI},"topAxisEnabled"),u$e=o(function(t){QI=t},"setDisplayMode"),h$e=o(function(){return QI},"getDisplayMode"),f$e=o(function(){return qc},"getDateFormat"),d$e=o(function(t){Sx=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),p$e=o(function(){return Sx},"getIncludes"),m$e=o(function(t){Cx=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),g$e=o(function(){return Cx},"getExcludes"),y$e=o(function(){return jI},"getLinks"),v$e=o(function(t){Yg=t,KI.push(t)},"addSection"),x$e=o(function(){return KI},"getSections"),b$e=o(function(){let t=Uue(),e=10,r=0;for(;!t&&r[\d\w- ]+)/.exec(r);if(i!==null){let s=null;for(let u of i.groups.ids.split(" ")){let h=N0(u);h!==void 0&&(!s||h.endTime>s.endTime)&&(s=h)}if(s)return s.endTime;let l=new Date;return l.setHours(0,0,0,0),l}let a=(0,xo.default)(r,e.trim(),!0);if(a.isValid())return a.toDate();{Y.debug("Invalid date:"+r),Y.debug("With date format:"+e.trim());let s=new Date(r);if(s===void 0||isNaN(s.getTime())||s.getFullYear()<-1e4||s.getFullYear()>1e4)throw new Error("Invalid date:"+r);return s}},"getStartDate"),Que=o(function(t){let e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return e!==null?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),Zue=o(function(t,e,r,n=!1){r=r.trim();let a=/^until\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let f=null;for(let p of a.groups.ids.split(" ")){let m=N0(p);m!==void 0&&(!f||m.startTime{window.open(r,"_self")}),jI.set(n,r))}),ehe(t,"clickable")},"setLink"),ehe=o(function(t,e){t.split(",").forEach(function(r){let n=N0(r);n!==void 0&&n.classes.push(e)})},"setClass"),D$e=o(function(t,e,r){if(pe().securityLevel!=="loose"||e===void 0)return;let n=[];if(typeof r=="string"){n=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let a=0;a{Ut.runFunc(e,...n)})},"setClickFun"),the=o(function(t,e){ZI.push(function(){let r=document.querySelector(`[id="${t}"]`);r!==null&&r.addEventListener("click",function(){e()})},function(){let r=document.querySelector(`[id="${t}-text"]`);r!==null&&r.addEventListener("click",function(){e()})})},"pushFun"),N$e=o(function(t,e,r){t.split(",").forEach(function(n){D$e(n,e,r)}),ehe(t,"clickable")},"setClickEvent"),R$e=o(function(t){ZI.forEach(function(e){e(t)})},"bindFunctions"),rhe={getConfig:o(()=>pe().gantt,"getConfig"),clear:ZGe,setDateFormat:a$e,getDateFormat:f$e,enableInclusiveEndDates:s$e,endDatesAreInclusive:o$e,enableTopAxis:l$e,topAxisEnabled:c$e,setAxisFormat:JGe,getAxisFormat:e$e,setTickInterval:t$e,getTickInterval:r$e,setTodayMarker:n$e,getTodayMarker:i$e,setAccTitle:Mr,getAccTitle:Br,setDiagramTitle:cn,getDiagramTitle:Jr,setDisplayMode:u$e,getDisplayMode:h$e,setAccDescription:Fr,getAccDescription:zr,addSection:v$e,getSections:x$e,getTasks:b$e,addTask:A$e,findTaskById:N0,addTaskOrg:_$e,setIncludes:d$e,getIncludes:p$e,setExcludes:m$e,getExcludes:g$e,setClickEvent:N$e,setLink:L$e,getLinks:y$e,bindFunctions:R$e,parseDuration:Que,isInvalidDate:jue,setWeekday:w$e,getWeekday:T$e,setWeekend:k$e};o(nhe,"getTaskTags")});var wE,M$e,ahe,I$e,Ju,O$e,she,ohe=M(()=>{"use strict";wE=Ji(Vb(),1);ut();pr();fr();Vt();ai();M$e=o(function(){Y.debug("Something is calling, setConf, remove the call")},"setConf"),ahe={monday:Nh,tuesday:R3,wednesday:M3,thursday:xc,friday:I3,saturday:O3,sunday:Al},I$e=o((t,e)=>{let r=[...t].map(()=>-1/0),n=[...t].sort((a,s)=>a.startTime-s.startTime||a.order-s.order),i=0;for(let a of n)for(let s=0;s=r[s]){r[s]=a.endTime,a.order=s+e,s>i&&(i=s);break}return i},"getMaxIntersections"),O$e=o(function(t,e,r,n){let i=pe().gantt,a=pe().securityLevel,s;a==="sandbox"&&(s=Ve("#i"+e));let l=a==="sandbox"?Ve(s.nodes()[0].contentDocument.body):Ve("body"),u=a==="sandbox"?s.nodes()[0].contentDocument:document,h=u.getElementById(e);Ju=h.parentElement.offsetWidth,Ju===void 0&&(Ju=1200),i.useWidth!==void 0&&(Ju=i.useWidth);let f=n.db.getTasks(),d=[];for(let S of f)d.push(S.type);d=L(d);let p={},m=2*i.topPadding;if(n.db.getDisplayMode()==="compact"||i.displayMode==="compact"){let S={};for(let I of f)S[I.section]===void 0?S[I.section]=[I]:S[I.section].push(I);let A=0;for(let I of Object.keys(S)){let D=I$e(S[I],A)+1;A+=D,m+=D*(i.barHeight+i.barGap),p[I]=D}}else{m+=f.length*(i.barHeight+i.barGap);for(let S of d)p[S]=f.filter(A=>A.type===S).length}h.setAttribute("viewBox","0 0 "+Ju+" "+m);let g=l.select(`[id="${e}"]`),y=F3().domain([U4(f,function(S){return S.startTime}),V4(f,function(S){return S.endTime})]).rangeRound([0,Ju-i.leftPadding-i.rightPadding]);function v(S,A){let I=S.startTime,D=A.startTime,k=0;return I>D?k=1:IG.order))].map(G=>S.find(z=>z.order===G));g.append("g").selectAll("rect").data(N).enter().append("rect").attr("x",0).attr("y",function(G,z){return z=G.order,z*A+I-2}).attr("width",function(){return C-i.rightPadding/2}).attr("height",A).attr("class",function(G){for(let[z,W]of d.entries())if(G.type===W)return"section section"+z%i.numberSectionStyles;return"section section0"});let P=g.append("g").selectAll("rect").data(S).enter(),F=n.db.getLinks();if(P.append("rect").attr("id",function(G){return G.id}).attr("rx",3).attr("ry",3).attr("x",function(G){return G.milestone?y(G.startTime)+D+.5*(y(G.endTime)-y(G.startTime))-.5*k:y(G.startTime)+D}).attr("y",function(G,z){return z=G.order,z*A+I}).attr("width",function(G){return G.milestone?k:y(G.renderEndTime||G.endTime)-y(G.startTime)}).attr("height",k).attr("transform-origin",function(G,z){return z=G.order,(y(G.startTime)+D+.5*(y(G.endTime)-y(G.startTime))).toString()+"px "+(z*A+I+.5*k).toString()+"px"}).attr("class",function(G){let z="task",W="";G.classes.length>0&&(W=G.classes.join(" "));let Z=0;for(let[oe,K]of d.entries())G.type===K&&(Z=oe%i.numberSectionStyles);let j="";return G.active?G.crit?j+=" activeCrit":j=" active":G.done?G.crit?j=" doneCrit":j=" done":G.crit&&(j+=" crit"),j.length===0&&(j=" task"),G.milestone&&(j=" milestone "+j),j+=Z,j+=" "+W,z+j}),P.append("text").attr("id",function(G){return G.id+"-text"}).text(function(G){return G.task}).attr("font-size",i.fontSize).attr("x",function(G){let z=y(G.startTime),W=y(G.renderEndTime||G.endTime);G.milestone&&(z+=.5*(y(G.endTime)-y(G.startTime))-.5*k),G.milestone&&(W=z+k);let Z=this.getBBox().width;return Z>W-z?W+Z+1.5*i.leftPadding>C?z+D-5:W+D+5:(W-z)/2+z+D}).attr("y",function(G,z){return z=G.order,z*A+i.barHeight/2+(i.fontSize/2-2)+I}).attr("text-height",k).attr("class",function(G){let z=y(G.startTime),W=y(G.endTime);G.milestone&&(W=z+k);let Z=this.getBBox().width,j="";G.classes.length>0&&(j=G.classes.join(" "));let oe=0;for(let[ee,J]of d.entries())G.type===J&&(oe=ee%i.numberSectionStyles);let K="";return G.active&&(G.crit?K="activeCritText"+oe:K="activeText"+oe),G.done?G.crit?K=K+" doneCritText"+oe:K=K+" doneText"+oe:G.crit&&(K=K+" critText"+oe),G.milestone&&(K+=" milestoneText"),Z>W-z?W+Z+1.5*i.leftPadding>C?j+" taskTextOutsideLeft taskTextOutside"+oe+" "+K:j+" taskTextOutsideRight taskTextOutside"+oe+" "+K+" width-"+Z:j+" taskText taskText"+oe+" "+K+" width-"+Z}),pe().securityLevel==="sandbox"){let G;G=Ve("#i"+e);let z=G.nodes()[0].contentDocument;P.filter(function(W){return F.has(W.id)}).each(function(W){var Z=z.querySelector("#"+W.id),j=z.querySelector("#"+W.id+"-text");let oe=Z.parentNode;var K=z.createElement("a");K.setAttribute("xlink:href",F.get(W.id)),K.setAttribute("target","_top"),oe.appendChild(K),K.appendChild(Z),K.appendChild(j)})}}o(b,"drawRects");function w(S,A,I,D,k,R,C,O){if(C.length===0&&O.length===0)return;let N,P;for(let{startTime:Z,endTime:j}of R)(N===void 0||ZP)&&(P=j);if(!N||!P)return;if((0,wE.default)(P).diff((0,wE.default)(N),"year")>5){Y.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let F=n.db.getDateFormat(),B=[],G=null,z=(0,wE.default)(N);for(;z.valueOf()<=P;)n.db.isInvalidDate(z,F,C,O)?G?G.end=z:G={start:z,end:z}:G&&(B.push(G),G=null),z=z.add(1,"d");g.append("g").selectAll("rect").data(B).enter().append("rect").attr("id",function(Z){return"exclude-"+Z.start.format("YYYY-MM-DD")}).attr("x",function(Z){return y(Z.start)+I}).attr("y",i.gridLineStartPadding).attr("width",function(Z){let j=Z.end.add(1,"day");return y(j)-y(Z.start)}).attr("height",k-A-i.gridLineStartPadding).attr("transform-origin",function(Z,j){return(y(Z.start)+I+.5*(y(Z.end)-y(Z.start))).toString()+"px "+(j*S+.5*k).toString()+"px"}).attr("class","exclude-range")}o(w,"drawExcludeDays");function _(S,A,I,D){let k=b7(y).tickSize(-D+A+i.gridLineStartPadding).tickFormat(kd(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d")),C=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(n.db.getTickInterval()||i.tickInterval);if(C!==null){let O=C[1],N=C[2],P=n.db.getWeekday()||i.weekday;switch(N){case"millisecond":k.ticks(yc.every(O));break;case"second":k.ticks(to.every(O));break;case"minute":k.ticks(Su.every(O));break;case"hour":k.ticks(Cu.every(O));break;case"day":k.ticks(Oo.every(O));break;case"week":k.ticks(ahe[P].every(O));break;case"month":k.ticks(Au.every(O));break}}if(g.append("g").attr("class","grid").attr("transform","translate("+S+", "+(D-50)+")").call(k).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),n.db.topAxisEnabled()||i.topAxis){let O=x7(y).tickSize(-D+A+i.gridLineStartPadding).tickFormat(kd(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d"));if(C!==null){let N=C[1],P=C[2],F=n.db.getWeekday()||i.weekday;switch(P){case"millisecond":O.ticks(yc.every(N));break;case"second":O.ticks(to.every(N));break;case"minute":O.ticks(Su.every(N));break;case"hour":O.ticks(Cu.every(N));break;case"day":O.ticks(Oo.every(N));break;case"week":O.ticks(ahe[F].every(N));break;case"month":O.ticks(Au.every(N));break}}g.append("g").attr("class","grid").attr("transform","translate("+S+", "+A+")").call(O).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}o(_,"makeGrid");function T(S,A){let I=0,D=Object.keys(p).map(k=>[k,p[k]]);g.append("g").selectAll("text").data(D).enter().append(function(k){let R=k[0].split(qe.lineBreakRegex),C=-(R.length-1)/2,O=u.createElementNS("http://www.w3.org/2000/svg","text");O.setAttribute("dy",C+"em");for(let[N,P]of R.entries()){let F=u.createElementNS("http://www.w3.org/2000/svg","tspan");F.setAttribute("alignment-baseline","central"),F.setAttribute("x","10"),N>0&&F.setAttribute("dy","1em"),F.textContent=P,O.appendChild(F)}return O}).attr("x",10).attr("y",function(k,R){if(R>0)for(let C=0;C{"use strict";P$e=o(t=>` + .mermaid-main-font { + font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); + } + + .exclude-range { + fill: ${t.excludeBkgColor}; + } + + .section { + stroke: none; + opacity: 0.2; + } + + .section0 { + fill: ${t.sectionBkgColor}; + } + + .section2 { + fill: ${t.sectionBkgColor2}; + } + + .section1, + .section3 { + fill: ${t.altSectionBkgColor}; + opacity: 0.2; + } + + .sectionTitle0 { + fill: ${t.titleColor}; + } + + .sectionTitle1 { + fill: ${t.titleColor}; + } + + .sectionTitle2 { + fill: ${t.titleColor}; + } + + .sectionTitle3 { + fill: ${t.titleColor}; + } + + .sectionTitle { + text-anchor: start; + font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); + } + + + /* Grid and axis */ + + .grid .tick { + stroke: ${t.gridColor}; + opacity: 0.8; + shape-rendering: crispEdges; + } + + .grid .tick text { + font-family: ${t.fontFamily}; + fill: ${t.textColor}; + } + + .grid path { + stroke-width: 0; + } + + + /* Today line */ + + .today { + fill: none; + stroke: ${t.todayLineColor}; + stroke-width: 2px; + } + + + /* Task styling */ + + /* Default task */ + + .task { + stroke-width: 2; + } + + .taskText { + text-anchor: middle; + font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); + } + + .taskTextOutsideRight { + fill: ${t.taskTextDarkColor}; + text-anchor: start; + font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); + } + + .taskTextOutsideLeft { + fill: ${t.taskTextDarkColor}; + text-anchor: end; + } + + + /* Special case clickable */ + + .task.clickable { + cursor: pointer; + } + + .taskText.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideLeft.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideRight.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + + /* Specific task settings for the sections*/ + + .taskText0, + .taskText1, + .taskText2, + .taskText3 { + fill: ${t.taskTextColor}; + } + + .task0, + .task1, + .task2, + .task3 { + fill: ${t.taskBkgColor}; + stroke: ${t.taskBorderColor}; + } + + .taskTextOutside0, + .taskTextOutside2 + { + fill: ${t.taskTextOutsideColor}; + } + + .taskTextOutside1, + .taskTextOutside3 { + fill: ${t.taskTextOutsideColor}; + } + + + /* Active task */ + + .active0, + .active1, + .active2, + .active3 { + fill: ${t.activeTaskBkgColor}; + stroke: ${t.activeTaskBorderColor}; + } + + .activeText0, + .activeText1, + .activeText2, + .activeText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Completed task */ + + .done0, + .done1, + .done2, + .done3 { + stroke: ${t.doneTaskBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + } + + .doneText0, + .doneText1, + .doneText2, + .doneText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Tasks on the critical line */ + + .crit0, + .crit1, + .crit2, + .crit3 { + stroke: ${t.critBorderColor}; + fill: ${t.critBkgColor}; + stroke-width: 2; + } + + .activeCrit0, + .activeCrit1, + .activeCrit2, + .activeCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.activeTaskBkgColor}; + stroke-width: 2; + } + + .doneCrit0, + .doneCrit1, + .doneCrit2, + .doneCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; + } + + .milestone { + transform: rotate(45deg) scale(0.8,0.8); + } + + .milestoneText { + font-style: italic; + } + .doneCritText0, + .doneCritText1, + .doneCritText2, + .doneCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .activeCritText0, + .activeCritText1, + .activeCritText2, + .activeCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .titleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.titleColor||t.textColor}; + font-family: var(--mermaid-font-family, "trebuchet ms", verdana, arial, sans-serif); + } +`,"getStyles"),lhe=P$e});var uhe={};vr(uhe,{diagram:()=>B$e});var B$e,hhe=M(()=>{"use strict";Fue();ihe();ohe();che();B$e={parser:Bue,db:rhe,renderer:she,styles:lhe}});var phe,mhe=M(()=>{"use strict";Hg();ut();phe={parse:o(async t=>{let e=await Yl("info",t);Y.debug(e)},"parse")}});var _x,tO=M(()=>{_x="11.4.0"});var V$e,U$e,ghe,yhe=M(()=>{"use strict";tO();V$e={version:_x},U$e=o(()=>V$e.version,"getVersion"),ghe={getVersion:U$e}});var Va,eh=M(()=>{"use strict";pr();Vt();Va=o(t=>{let{securityLevel:e}=pe(),r=Ve("body");if(e==="sandbox"){let a=Ve(`#i${t}`).node()?.contentDocument??document;r=Ve(a.body)}return r.select(`#${t}`)},"selectSvgElement")});var H$e,vhe,xhe=M(()=>{"use strict";ut();eh();ai();H$e=o((t,e,r)=>{Y.debug(`rendering info diagram +`+t);let n=Va(e);Zr(n,100,400,!0),n.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw"),vhe={draw:H$e}});var bhe={};vr(bhe,{diagram:()=>W$e});var W$e,whe=M(()=>{"use strict";mhe();yhe();xhe();W$e={parser:phe,db:ghe,renderer:vhe}});var Ehe,rO,TE,nO,X$e,j$e,K$e,Q$e,Z$e,J$e,eVe,kE,iO=M(()=>{"use strict";ut();Ai();bs();Ehe=ur.pie,rO={sections:new Map,showData:!1,config:Ehe},TE=rO.sections,nO=rO.showData,X$e=structuredClone(Ehe),j$e=o(()=>structuredClone(X$e),"getConfig"),K$e=o(()=>{TE=new Map,nO=rO.showData,Lr()},"clear"),Q$e=o(({label:t,value:e})=>{TE.has(t)||(TE.set(t,e),Y.debug(`added new section: ${t}, with value: ${e}`))},"addSection"),Z$e=o(()=>TE,"getSections"),J$e=o(t=>{nO=t},"setShowData"),eVe=o(()=>nO,"getShowData"),kE={getConfig:j$e,clear:K$e,setDiagramTitle:cn,getDiagramTitle:Jr,setAccTitle:Mr,getAccTitle:Br,setAccDescription:Fr,getAccDescription:zr,addSection:Q$e,getSections:Z$e,setShowData:J$e,getShowData:eVe}});var tVe,She,Che=M(()=>{"use strict";Hg();ut();Tx();iO();tVe=o((t,e)=>{yf(t,e),e.setShowData(t.showData),t.sections.map(e.addSection)},"populateDb"),She={parse:o(async t=>{let e=await Yl("pie",t);Y.debug(e),tVe(e,kE)},"parse")}});var rVe,Ahe,_he=M(()=>{"use strict";rVe=o(t=>` + .pieCircle{ + stroke: ${t.pieStrokeColor}; + stroke-width : ${t.pieStrokeWidth}; + opacity : ${t.pieOpacity}; + } + .pieOuterCircle{ + stroke: ${t.pieOuterStrokeColor}; + stroke-width: ${t.pieOuterStrokeWidth}; + fill: none; + } + .pieTitleText { + text-anchor: middle; + font-size: ${t.pieTitleTextSize}; + fill: ${t.pieTitleTextColor}; + font-family: ${t.fontFamily}; + } + .slice { + font-family: ${t.fontFamily}; + fill: ${t.pieSectionTextColor}; + font-size:${t.pieSectionTextSize}; + // fill: white; + } + .legend text { + fill: ${t.pieLegendTextColor}; + font-family: ${t.fontFamily}; + font-size: ${t.pieLegendTextSize}; + } +`,"getStyles"),Ahe=rVe});var nVe,iVe,Lhe,Dhe=M(()=>{"use strict";pr();Vt();ut();eh();ai();hr();nVe=o(t=>{let e=[...t.entries()].map(n=>({label:n[0],value:n[1]})).sort((n,i)=>i.value-n.value);return H3().value(n=>n.value)(e)},"createPieArcs"),iVe=o((t,e,r,n)=>{Y.debug(`rendering pie chart +`+t);let i=n.db,a=pe(),s=Ds(i.getConfig(),a.pie),l=40,u=18,h=4,f=450,d=f,p=Va(e),m=p.append("g");m.attr("transform","translate("+d/2+","+f/2+")");let{themeVariables:g}=a,[y]=Ho(g.pieOuterStrokeWidth);y??=2;let v=s.textPosition,x=Math.min(d,f)/2-l,b=Dl().innerRadius(0).outerRadius(x),w=Dl().innerRadius(x*v).outerRadius(x*v);m.append("circle").attr("cx",0).attr("cy",0).attr("r",x+y/2).attr("class","pieOuterCircle");let _=i.getSections(),T=nVe(_),E=[g.pie1,g.pie2,g.pie3,g.pie4,g.pie5,g.pie6,g.pie7,g.pie8,g.pie9,g.pie10,g.pie11,g.pie12],L=ku(E);m.selectAll("mySlices").data(T).enter().append("path").attr("d",b).attr("fill",k=>L(k.data.label)).attr("class","pieCircle");let S=0;_.forEach(k=>{S+=k}),m.selectAll("mySlices").data(T).enter().append("text").text(k=>(k.data.value/S*100).toFixed(0)+"%").attr("transform",k=>"translate("+w.centroid(k)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(i.getDiagramTitle()).attr("x",0).attr("y",-(f-50)/2).attr("class","pieTitleText");let A=m.selectAll(".legend").data(L.domain()).enter().append("g").attr("class","legend").attr("transform",(k,R)=>{let C=u+h,O=C*L.domain().length/2,N=12*u,P=R*C-O;return"translate("+N+","+P+")"});A.append("rect").attr("width",u).attr("height",u).style("fill",L).style("stroke",L),A.data(T).append("text").attr("x",u+h).attr("y",u-h).text(k=>{let{label:R,value:C}=k.data;return i.getShowData()?`${R} [${C}]`:R});let I=Math.max(...A.selectAll("text").nodes().map(k=>k?.getBoundingClientRect().width??0)),D=d+l+u+h+I;p.attr("viewBox",`0 0 ${D} ${f}`),Zr(p,f,D,s.useMaxWidth)},"draw"),Lhe={draw:iVe}});var Nhe={};vr(Nhe,{diagram:()=>aVe});var aVe,Rhe=M(()=>{"use strict";Che();iO();_he();Dhe();aVe={parser:She,db:kE,renderer:Lhe,styles:Ahe}});var aO,Ohe,Phe=M(()=>{"use strict";aO=function(){var t=o(function(Te,ie,Ee,Ae){for(Ee=Ee||{},Ae=Te.length;Ae--;Ee[Te[Ae]]=ie);return Ee},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[1,7],s=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],u=[55,56,57],h=[2,36],f=[1,37],d=[1,36],p=[1,38],m=[1,35],g=[1,43],y=[1,41],v=[1,14],x=[1,23],b=[1,18],w=[1,19],_=[1,20],T=[1,21],E=[1,22],L=[1,24],S=[1,25],A=[1,26],I=[1,27],D=[1,28],k=[1,29],R=[1,32],C=[1,33],O=[1,34],N=[1,39],P=[1,40],F=[1,42],B=[1,44],G=[1,62],z=[1,61],W=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],Z=[1,65],j=[1,66],oe=[1,67],K=[1,68],ee=[1,69],J=[1,70],H=[1,71],q=[1,72],Q=[1,73],ae=[1,74],ue=[1,75],ce=[1,76],te=[4,5,6,7,8,9,10,11,12,13,14,15,18],Ne=[1,90],se=[1,91],ke=[1,92],Re=[1,99],Ce=[1,93],Pe=[1,96],Ie=[1,94],$e=[1,95],ye=[1,97],X=[1,98],fe=[1,102],he=[10,55,56,57],ge=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],ne={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(ie,Ee,Ae,Ge,Be,me,He){var Oe=me.length-1;switch(Be){case 23:this.$=me[Oe];break;case 24:this.$=me[Oe-1]+""+me[Oe];break;case 26:this.$=me[Oe-1]+me[Oe];break;case 27:this.$=[me[Oe].trim()];break;case 28:me[Oe-2].push(me[Oe].trim()),this.$=me[Oe-2];break;case 29:this.$=me[Oe-4],Ge.addClass(me[Oe-2],me[Oe]);break;case 37:this.$=[];break;case 42:this.$=me[Oe].trim(),Ge.setDiagramTitle(this.$);break;case 43:this.$=me[Oe].trim(),Ge.setAccTitle(this.$);break;case 44:case 45:this.$=me[Oe].trim(),Ge.setAccDescription(this.$);break;case 46:Ge.addSection(me[Oe].substr(8)),this.$=me[Oe].substr(8);break;case 47:Ge.addPoint(me[Oe-3],"",me[Oe-1],me[Oe],[]);break;case 48:Ge.addPoint(me[Oe-4],me[Oe-3],me[Oe-1],me[Oe],[]);break;case 49:Ge.addPoint(me[Oe-4],"",me[Oe-2],me[Oe-1],me[Oe]);break;case 50:Ge.addPoint(me[Oe-5],me[Oe-4],me[Oe-2],me[Oe-1],me[Oe]);break;case 51:Ge.setXAxisLeftText(me[Oe-2]),Ge.setXAxisRightText(me[Oe]);break;case 52:me[Oe-1].text+=" \u27F6 ",Ge.setXAxisLeftText(me[Oe-1]);break;case 53:Ge.setXAxisLeftText(me[Oe]);break;case 54:Ge.setYAxisBottomText(me[Oe-2]),Ge.setYAxisTopText(me[Oe]);break;case 55:me[Oe-1].text+=" \u27F6 ",Ge.setYAxisBottomText(me[Oe-1]);break;case 56:Ge.setYAxisBottomText(me[Oe]);break;case 57:Ge.setQuadrant1Text(me[Oe]);break;case 58:Ge.setQuadrant2Text(me[Oe]);break;case 59:Ge.setQuadrant3Text(me[Oe]);break;case 60:Ge.setQuadrant4Text(me[Oe]);break;case 64:this.$={text:me[Oe],type:"text"};break;case 65:this.$={text:me[Oe-1].text+""+me[Oe],type:me[Oe-1].type};break;case 66:this.$={text:me[Oe],type:"text"};break;case 67:this.$={text:me[Oe],type:"markdown"};break;case 68:this.$=me[Oe];break;case 69:this.$=me[Oe-1]+""+me[Oe];break}},"anonymous"),table:[{18:e,26:1,27:2,28:r,55:n,56:i,57:a},{1:[3]},{18:e,26:8,27:2,28:r,55:n,56:i,57:a},{18:e,26:9,27:2,28:r,55:n,56:i,57:a},t(s,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(u,h,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:w,39:_,41:T,42:E,48:L,50:S,51:A,52:I,53:D,54:k,60:R,61:C,63:O,64:N,65:P,66:F,67:B}),t(s,[2,34]),{27:45,55:n,56:i,57:a},t(u,[2,37]),t(u,h,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:w,39:_,41:T,42:E,48:L,50:S,51:A,52:I,53:D,54:k,60:R,61:C,63:O,64:N,65:P,66:F,67:B}),t(u,[2,39]),t(u,[2,40]),t(u,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(u,[2,45]),t(u,[2,46]),{18:[1,50]},{4:f,5:d,10:p,12:m,13:g,14:y,43:51,58:31,60:R,61:C,63:O,64:N,65:P,66:F,67:B},{4:f,5:d,10:p,12:m,13:g,14:y,43:52,58:31,60:R,61:C,63:O,64:N,65:P,66:F,67:B},{4:f,5:d,10:p,12:m,13:g,14:y,43:53,58:31,60:R,61:C,63:O,64:N,65:P,66:F,67:B},{4:f,5:d,10:p,12:m,13:g,14:y,43:54,58:31,60:R,61:C,63:O,64:N,65:P,66:F,67:B},{4:f,5:d,10:p,12:m,13:g,14:y,43:55,58:31,60:R,61:C,63:O,64:N,65:P,66:F,67:B},{4:f,5:d,10:p,12:m,13:g,14:y,43:56,58:31,60:R,61:C,63:O,64:N,65:P,66:F,67:B},{4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,44:[1,57],47:[1,58],58:60,59:59,63:O,64:N,65:P,66:F,67:B},t(W,[2,64]),t(W,[2,66]),t(W,[2,67]),t(W,[2,70]),t(W,[2,71]),t(W,[2,72]),t(W,[2,73]),t(W,[2,74]),t(W,[2,75]),t(W,[2,76]),t(W,[2,77]),t(W,[2,78]),t(W,[2,79]),t(W,[2,80]),t(s,[2,35]),t(u,[2,38]),t(u,[2,42]),t(u,[2,43]),t(u,[2,44]),{3:64,4:Z,5:j,6:oe,7:K,8:ee,9:J,10:H,11:q,12:Q,13:ae,14:ue,15:ce,21:63},t(u,[2,53],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,49:[1,77],63:O,64:N,65:P,66:F,67:B}),t(u,[2,56],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,49:[1,78],63:O,64:N,65:P,66:F,67:B}),t(u,[2,57],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,63:O,64:N,65:P,66:F,67:B}),t(u,[2,58],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,63:O,64:N,65:P,66:F,67:B}),t(u,[2,59],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,63:O,64:N,65:P,66:F,67:B}),t(u,[2,60],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,63:O,64:N,65:P,66:F,67:B}),{45:[1,79]},{44:[1,80]},t(W,[2,65]),t(W,[2,81]),t(W,[2,82]),t(W,[2,83]),{3:82,4:Z,5:j,6:oe,7:K,8:ee,9:J,10:H,11:q,12:Q,13:ae,14:ue,15:ce,18:[1,81]},t(te,[2,23]),t(te,[2,1]),t(te,[2,2]),t(te,[2,3]),t(te,[2,4]),t(te,[2,5]),t(te,[2,6]),t(te,[2,7]),t(te,[2,8]),t(te,[2,9]),t(te,[2,10]),t(te,[2,11]),t(te,[2,12]),t(u,[2,52],{58:31,43:83,4:f,5:d,10:p,12:m,13:g,14:y,60:R,61:C,63:O,64:N,65:P,66:F,67:B}),t(u,[2,55],{58:31,43:84,4:f,5:d,10:p,12:m,13:g,14:y,60:R,61:C,63:O,64:N,65:P,66:F,67:B}),{46:[1,85]},{45:[1,86]},{4:Ne,5:se,6:ke,8:Re,11:Ce,13:Pe,16:89,17:Ie,18:$e,19:ye,20:X,22:88,23:87},t(te,[2,24]),t(u,[2,51],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,63:O,64:N,65:P,66:F,67:B}),t(u,[2,54],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:z,63:O,64:N,65:P,66:F,67:B}),t(u,[2,47],{22:88,16:89,23:100,4:Ne,5:se,6:ke,8:Re,11:Ce,13:Pe,17:Ie,18:$e,19:ye,20:X}),{46:[1,101]},t(u,[2,29],{10:fe}),t(he,[2,27],{16:103,4:Ne,5:se,6:ke,8:Re,11:Ce,13:Pe,17:Ie,18:$e,19:ye,20:X}),t(ge,[2,25]),t(ge,[2,13]),t(ge,[2,14]),t(ge,[2,15]),t(ge,[2,16]),t(ge,[2,17]),t(ge,[2,18]),t(ge,[2,19]),t(ge,[2,20]),t(ge,[2,21]),t(ge,[2,22]),t(u,[2,49],{10:fe}),t(u,[2,48],{22:88,16:89,23:104,4:Ne,5:se,6:ke,8:Re,11:Ce,13:Pe,17:Ie,18:$e,19:ye,20:X}),{4:Ne,5:se,6:ke,8:Re,11:Ce,13:Pe,16:89,17:Ie,18:$e,19:ye,20:X,22:105},t(ge,[2,26]),t(u,[2,50],{10:fe}),t(he,[2,28],{16:103,4:Ne,5:se,6:ke,8:Re,11:Ce,13:Pe,17:Ie,18:$e,19:ye,20:X})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(ie,Ee){if(Ee.recoverable)this.trace(ie);else{var Ae=new Error(ie);throw Ae.hash=Ee,Ae}},"parseError"),parse:o(function(ie){var Ee=this,Ae=[0],Ge=[],Be=[null],me=[],He=this.table,Oe="",et=0,bt=0,kt=0,vt=2,rt=1,yt=me.slice.call(arguments,1),Ue=Object.create(this.lexer),tt={yy:{}};for(var ht in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ht)&&(tt.yy[ht]=this.yy[ht]);Ue.setInput(ie,tt.yy),tt.yy.lexer=Ue,tt.yy.parser=this,typeof Ue.yylloc>"u"&&(Ue.yylloc={});var Et=Ue.yylloc;me.push(Et);var er=Ue.options&&Ue.options.ranges;typeof tt.yy.parseError=="function"?this.parseError=tt.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function dt(_r){Ae.length=Ae.length-2*_r,Be.length=Be.length-_r,me.length=me.length-_r}o(dt,"popStack");function Je(){var _r;return _r=Ge.pop()||Ue.lex()||rt,typeof _r!="number"&&(_r instanceof Array&&(Ge=_r,_r=Ge.pop()),_r=Ee.symbols_[_r]||_r),_r}o(Je,"lex");for(var ct,Ct,pt,Bt,Tr,yr,or={},ln,Or,ii,mn;;){if(pt=Ae[Ae.length-1],this.defaultActions[pt]?Bt=this.defaultActions[pt]:((ct===null||typeof ct>"u")&&(ct=Je()),Bt=He[pt]&&He[pt][ct]),typeof Bt>"u"||!Bt.length||!Bt[0]){var On="";mn=[];for(ln in He[pt])this.terminals_[ln]&&ln>vt&&mn.push("'"+this.terminals_[ln]+"'");Ue.showPosition?On="Parse error on line "+(et+1)+`: +`+Ue.showPosition()+` +Expecting `+mn.join(", ")+", got '"+(this.terminals_[ct]||ct)+"'":On="Parse error on line "+(et+1)+": Unexpected "+(ct==rt?"end of input":"'"+(this.terminals_[ct]||ct)+"'"),this.parseError(On,{text:Ue.match,token:this.terminals_[ct]||ct,line:Ue.yylineno,loc:Et,expected:mn})}if(Bt[0]instanceof Array&&Bt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+pt+", token: "+ct);switch(Bt[0]){case 1:Ae.push(ct),Be.push(Ue.yytext),me.push(Ue.yylloc),Ae.push(Bt[1]),ct=null,Ct?(ct=Ct,Ct=null):(bt=Ue.yyleng,Oe=Ue.yytext,et=Ue.yylineno,Et=Ue.yylloc,kt>0&&kt--);break;case 2:if(Or=this.productions_[Bt[1]][1],or.$=Be[Be.length-Or],or._$={first_line:me[me.length-(Or||1)].first_line,last_line:me[me.length-1].last_line,first_column:me[me.length-(Or||1)].first_column,last_column:me[me.length-1].last_column},er&&(or._$.range=[me[me.length-(Or||1)].range[0],me[me.length-1].range[1]]),yr=this.performAction.apply(or,[Oe,bt,et,tt.yy,Bt[1],Be,me].concat(yt)),typeof yr<"u")return yr;Or&&(Ae=Ae.slice(0,-1*Or*2),Be=Be.slice(0,-1*Or),me=me.slice(0,-1*Or)),Ae.push(this.productions_[Bt[1]][0]),Be.push(or.$),me.push(or._$),ii=He[Ae[Ae.length-2]][Ae[Ae.length-1]],Ae.push(ii);break;case 3:return!0}}return!0},"parse")},ve=function(){var Te={EOF:1,parseError:o(function(Ee,Ae){if(this.yy.parser)this.yy.parser.parseError(Ee,Ae);else throw new Error(Ee)},"parseError"),setInput:o(function(ie,Ee){return this.yy=Ee||this.yy||{},this._input=ie,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var ie=this._input[0];this.yytext+=ie,this.yyleng++,this.offset++,this.match+=ie,this.matched+=ie;var Ee=ie.match(/(?:\r\n?|\n).*/g);return Ee?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ie},"input"),unput:o(function(ie){var Ee=ie.length,Ae=ie.split(/(?:\r\n?|\n)/g);this._input=ie+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ee),this.offset-=Ee;var Ge=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Ae.length-1&&(this.yylineno-=Ae.length-1);var Be=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Ae?(Ae.length===Ge.length?this.yylloc.first_column:0)+Ge[Ge.length-Ae.length].length-Ae[0].length:this.yylloc.first_column-Ee},this.options.ranges&&(this.yylloc.range=[Be[0],Be[0]+this.yyleng-Ee]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(ie){this.unput(this.match.slice(ie))},"less"),pastInput:o(function(){var ie=this.matched.substr(0,this.matched.length-this.match.length);return(ie.length>20?"...":"")+ie.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var ie=this.match;return ie.length<20&&(ie+=this._input.substr(0,20-ie.length)),(ie.substr(0,20)+(ie.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var ie=this.pastInput(),Ee=new Array(ie.length+1).join("-");return ie+this.upcomingInput()+` +`+Ee+"^"},"showPosition"),test_match:o(function(ie,Ee){var Ae,Ge,Be;if(this.options.backtrack_lexer&&(Be={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Be.yylloc.range=this.yylloc.range.slice(0))),Ge=ie[0].match(/(?:\r\n?|\n).*/g),Ge&&(this.yylineno+=Ge.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ge?Ge[Ge.length-1].length-Ge[Ge.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ie[0].length},this.yytext+=ie[0],this.match+=ie[0],this.matches=ie,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ie[0].length),this.matched+=ie[0],Ae=this.performAction.call(this,this.yy,this,Ee,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Ae)return Ae;if(this._backtrack){for(var me in Be)this[me]=Be[me];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ie,Ee,Ae,Ge;this._more||(this.yytext="",this.match="");for(var Be=this._currentRules(),me=0;meEe[0].length)){if(Ee=Ae,Ge=me,this.options.backtrack_lexer){if(ie=this.test_match(Ae,Be[me]),ie!==!1)return ie;if(this._backtrack){Ee=!1;continue}else return!1}else if(!this.options.flex)break}return Ee?(ie=this.test_match(Ee,Be[Ge]),ie!==!1?ie:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ee=this.next();return Ee||this.lex()},"lex"),begin:o(function(Ee){this.conditionStack.push(Ee)},"begin"),popState:o(function(){var Ee=this.conditionStack.length-1;return Ee>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ee){return Ee=this.conditionStack.length-1-Math.abs(Ee||0),Ee>=0?this.conditionStack[Ee]:"INITIAL"},"topState"),pushState:o(function(Ee){this.begin(Ee)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(Ee,Ae,Ge,Be){var me=Be;switch(Ge){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return Te}();ne.lexer=ve;function U(){this.yy={}}return o(U,"Parser"),U.prototype=ne,ne.Parser=U,new U}();aO.parser=aO;Ohe=aO});var ps,EE,Bhe=M(()=>{"use strict";pr();bs();ut();i4();ps=vp(),EE=class{constructor(){this.classes=new Map;this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{o(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:ur.quadrantChart?.chartWidth||500,chartWidth:ur.quadrantChart?.chartHeight||500,titlePadding:ur.quadrantChart?.titlePadding||10,titleFontSize:ur.quadrantChart?.titleFontSize||20,quadrantPadding:ur.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:ur.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:ur.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:ur.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:ur.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:ur.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:ur.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:ur.quadrantChart?.pointTextPadding||5,pointLabelFontSize:ur.quadrantChart?.pointLabelFontSize||12,pointRadius:ur.quadrantChart?.pointRadius||5,xAxisPosition:ur.quadrantChart?.xAxisPosition||"top",yAxisPosition:ur.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:ur.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:ur.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:ps.quadrant1Fill,quadrant2Fill:ps.quadrant2Fill,quadrant3Fill:ps.quadrant3Fill,quadrant4Fill:ps.quadrant4Fill,quadrant1TextFill:ps.quadrant1TextFill,quadrant2TextFill:ps.quadrant2TextFill,quadrant3TextFill:ps.quadrant3TextFill,quadrant4TextFill:ps.quadrant4TextFill,quadrantPointFill:ps.quadrantPointFill,quadrantPointTextFill:ps.quadrantPointTextFill,quadrantXAxisTextFill:ps.quadrantXAxisTextFill,quadrantYAxisTextFill:ps.quadrantYAxisTextFill,quadrantTitleFill:ps.quadrantTitleFill,quadrantInternalBorderStrokeFill:ps.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:ps.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,Y.info("clear called")}setData(e){this.data={...this.data,...e}}addPoints(e){this.data.points=[...e,...this.data.points]}addClass(e,r){this.classes.set(e,r)}setConfig(e){Y.trace("setConfig called with: ",e),this.config={...this.config,...e}}setThemeConfig(e){Y.trace("setThemeConfig called with: ",e),this.themeConfig={...this.themeConfig,...e}}calculateSpace(e,r,n,i){let a=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,s={top:e==="top"&&r?a:0,bottom:e==="bottom"&&r?a:0},l=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,u={left:this.config.yAxisPosition==="left"&&n?l:0,right:this.config.yAxisPosition==="right"&&n?l:0},h=this.config.titleFontSize+this.config.titlePadding*2,f={top:i?h:0},d=this.config.quadrantPadding+u.left,p=this.config.quadrantPadding+s.top+f.top,m=this.config.chartWidth-this.config.quadrantPadding*2-u.left-u.right,g=this.config.chartHeight-this.config.quadrantPadding*2-s.top-s.bottom-f.top,y=m/2,v=g/2;return{xAxisSpace:s,yAxisSpace:u,titleSpace:f,quadrantSpace:{quadrantLeft:d,quadrantTop:p,quadrantWidth:m,quadrantHalfWidth:y,quadrantHeight:g,quadrantHalfHeight:v}}}getAxisLabels(e,r,n,i){let{quadrantSpace:a,titleSpace:s}=i,{quadrantHalfHeight:l,quadrantHeight:u,quadrantLeft:h,quadrantHalfWidth:f,quadrantTop:d,quadrantWidth:p}=a,m=!!this.data.xAxisRightText,g=!!this.data.yAxisTopText,y=[];return this.data.xAxisLeftText&&r&&y.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&r&&y.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+f+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&n&&y.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+u-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&n&&y.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+l-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),y}getQuadrants(e){let{quadrantSpace:r}=e,{quadrantHalfHeight:n,quadrantLeft:i,quadrantHalfWidth:a,quadrantTop:s}=r,l=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s,width:a,height:n,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s,width:a,height:n,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant4Fill}];for(let u of l)u.text.x=u.x+u.width/2,this.data.points.length===0?(u.text.y=u.y+u.height/2,u.text.horizontalPos="middle"):(u.text.y=u.y+this.config.quadrantTextTopPadding,u.text.horizontalPos="top");return l}getQuadrantPoints(e){let{quadrantSpace:r}=e,{quadrantHeight:n,quadrantLeft:i,quadrantTop:a,quadrantWidth:s}=r,l=Cl().domain([0,1]).range([i,s+i]),u=Cl().domain([0,1]).range([n+a,a]);return this.data.points.map(f=>{let d=this.classes.get(f.className);return d&&(f={...d,...f}),{x:l(f.x),y:u(f.y),fill:f.color??this.themeConfig.quadrantPointFill,radius:f.radius??this.config.pointRadius,text:{text:f.text,fill:this.themeConfig.quadrantPointTextFill,x:l(f.x),y:u(f.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:f.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:f.strokeWidth??"0px"}})}getBorders(e){let r=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:n}=e,{quadrantHalfHeight:i,quadrantHeight:a,quadrantLeft:s,quadrantHalfWidth:l,quadrantTop:u,quadrantWidth:h}=n;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u,x2:s+h+r,y2:u},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+h,y1:u+r,x2:s+h,y2:u+a-r},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u+a,x2:s+h+r,y2:u+a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:u+r,x2:s,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+l,y1:u+r,x2:s+l,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:u+i,x2:s+h-r,y2:u+i}]}getTitle(e){if(e)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let e=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),r=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),n=this.config.showTitle&&!!this.data.titleText,i=this.data.points.length>0?"bottom":this.config.xAxisPosition,a=this.calculateSpace(i,e,r,n);return{points:this.getQuadrantPoints(a),quadrants:this.getQuadrants(a),axisLabels:this.getAxisLabels(i,e,r,a),borderLines:this.getBorders(a),title:this.getTitle(n)}}}});function sO(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function Fhe(t){return!/^\d+$/.test(t)}function zhe(t){return!/^\d+px$/.test(t)}var R0,Ghe=M(()=>{"use strict";R0=class extends Error{static{o(this,"InvalidStyleError")}constructor(e,r,n){super(`value for ${e} ${r} is invalid, please use a valid ${n}`),this.name="InvalidStyleError"}};o(sO,"validateHexCode");o(Fhe,"validateNumber");o(zhe,"validateSizeInPixels")});function th(t){return kr(t.trim(),lVe)}function cVe(t){Ea.setData({quadrant1Text:th(t.text)})}function uVe(t){Ea.setData({quadrant2Text:th(t.text)})}function hVe(t){Ea.setData({quadrant3Text:th(t.text)})}function fVe(t){Ea.setData({quadrant4Text:th(t.text)})}function dVe(t){Ea.setData({xAxisLeftText:th(t.text)})}function pVe(t){Ea.setData({xAxisRightText:th(t.text)})}function mVe(t){Ea.setData({yAxisTopText:th(t.text)})}function gVe(t){Ea.setData({yAxisBottomText:th(t.text)})}function oO(t){let e={};for(let r of t){let[n,i]=r.trim().split(/\s*:\s*/);if(n==="radius"){if(Fhe(i))throw new R0(n,i,"number");e.radius=parseInt(i)}else if(n==="color"){if(sO(i))throw new R0(n,i,"hex code");e.color=i}else if(n==="stroke-color"){if(sO(i))throw new R0(n,i,"hex code");e.strokeColor=i}else if(n==="stroke-width"){if(zhe(i))throw new R0(n,i,"number of pixels (eg. 10px)");e.strokeWidth=i}else throw new Error(`style named ${n} is not supported.`)}return e}function yVe(t,e,r,n,i){let a=oO(i);Ea.addPoints([{x:r,y:n,text:th(t.text),className:e,...a}])}function vVe(t,e){Ea.addClass(t,oO(e))}function xVe(t){Ea.setConfig({chartWidth:t})}function bVe(t){Ea.setConfig({chartHeight:t})}function wVe(){let t=pe(),{themeVariables:e,quadrantChart:r}=t;return r&&Ea.setConfig(r),Ea.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),Ea.setData({titleText:Jr()}),Ea.build()}var lVe,Ea,TVe,$he,Vhe=M(()=>{"use strict";Vt();fr();Ai();Bhe();Ghe();lVe=pe();o(th,"textSanitizer");Ea=new EE;o(cVe,"setQuadrant1Text");o(uVe,"setQuadrant2Text");o(hVe,"setQuadrant3Text");o(fVe,"setQuadrant4Text");o(dVe,"setXAxisLeftText");o(pVe,"setXAxisRightText");o(mVe,"setYAxisTopText");o(gVe,"setYAxisBottomText");o(oO,"parseStyles");o(yVe,"addPoint");o(vVe,"addClass");o(xVe,"setWidth");o(bVe,"setHeight");o(wVe,"getQuadrantData");TVe=o(function(){Ea.clear(),Lr()},"clear"),$he={setWidth:xVe,setHeight:bVe,setQuadrant1Text:cVe,setQuadrant2Text:uVe,setQuadrant3Text:hVe,setQuadrant4Text:fVe,setXAxisLeftText:dVe,setXAxisRightText:pVe,setYAxisTopText:mVe,setYAxisBottomText:gVe,parseStyles:oO,addPoint:yVe,addClass:vVe,getQuadrantData:wVe,clear:TVe,setAccTitle:Mr,getAccTitle:Br,setDiagramTitle:cn,getDiagramTitle:Jr,getAccDescription:zr,setAccDescription:Fr}});var kVe,Uhe,Hhe=M(()=>{"use strict";pr();Vt();ut();ai();kVe=o((t,e,r,n)=>{function i(S){return S==="top"?"hanging":"middle"}o(i,"getDominantBaseLine");function a(S){return S==="left"?"start":"middle"}o(a,"getTextAnchor");function s(S){return`translate(${S.x}, ${S.y}) rotate(${S.rotation||0})`}o(s,"getTransformation");let l=pe();Y.debug(`Rendering quadrant chart +`+t);let u=l.securityLevel,h;u==="sandbox"&&(h=Ve("#i"+e));let d=(u==="sandbox"?Ve(h.nodes()[0].contentDocument.body):Ve("body")).select(`[id="${e}"]`),p=d.append("g").attr("class","main"),m=l.quadrantChart?.chartWidth??500,g=l.quadrantChart?.chartHeight??500;Zr(d,g,m,l.quadrantChart?.useMaxWidth??!0),d.attr("viewBox","0 0 "+m+" "+g),n.db.setHeight(g),n.db.setWidth(m);let y=n.db.getQuadrantData(),v=p.append("g").attr("class","quadrants"),x=p.append("g").attr("class","border"),b=p.append("g").attr("class","data-points"),w=p.append("g").attr("class","labels"),_=p.append("g").attr("class","title");y.title&&_.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",i(y.title.horizontalPos)).attr("text-anchor",a(y.title.verticalPos)).attr("transform",s(y.title)).text(y.title.text),y.borderLines&&x.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",S=>S.x1).attr("y1",S=>S.y1).attr("x2",S=>S.x2).attr("y2",S=>S.y2).style("stroke",S=>S.strokeFill).style("stroke-width",S=>S.strokeWidth);let T=v.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");T.append("rect").attr("x",S=>S.x).attr("y",S=>S.y).attr("width",S=>S.width).attr("height",S=>S.height).attr("fill",S=>S.fill),T.append("text").attr("x",0).attr("y",0).attr("fill",S=>S.text.fill).attr("font-size",S=>S.text.fontSize).attr("dominant-baseline",S=>i(S.text.horizontalPos)).attr("text-anchor",S=>a(S.text.verticalPos)).attr("transform",S=>s(S.text)).text(S=>S.text.text),w.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(S=>S.text).attr("fill",S=>S.fill).attr("font-size",S=>S.fontSize).attr("dominant-baseline",S=>i(S.horizontalPos)).attr("text-anchor",S=>a(S.verticalPos)).attr("transform",S=>s(S));let L=b.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");L.append("circle").attr("cx",S=>S.x).attr("cy",S=>S.y).attr("r",S=>S.radius).attr("fill",S=>S.fill).attr("stroke",S=>S.strokeColor).attr("stroke-width",S=>S.strokeWidth),L.append("text").attr("x",0).attr("y",0).text(S=>S.text.text).attr("fill",S=>S.text.fill).attr("font-size",S=>S.text.fontSize).attr("dominant-baseline",S=>i(S.text.horizontalPos)).attr("text-anchor",S=>a(S.text.verticalPos)).attr("transform",S=>s(S.text))},"draw"),Uhe={draw:kVe}});var Whe={};vr(Whe,{diagram:()=>EVe});var EVe,Yhe=M(()=>{"use strict";Phe();Vhe();Hhe();EVe={parser:Ohe,db:$he,renderer:Uhe,styles:o(()=>"","styles")}});var lO,jhe,Khe=M(()=>{"use strict";lO=function(){var t=o(function(O,N,P,F){for(P=P||{},F=O.length;F--;P[O[F]]=N);return P},"o"),e=[1,10,12,14,16,18,19,21,23],r=[2,6],n=[1,3],i=[1,5],a=[1,6],s=[1,7],l=[1,5,10,12,14,16,18,19,21,23,34,35,36],u=[1,25],h=[1,26],f=[1,28],d=[1,29],p=[1,30],m=[1,31],g=[1,32],y=[1,33],v=[1,34],x=[1,35],b=[1,36],w=[1,37],_=[1,43],T=[1,42],E=[1,47],L=[1,50],S=[1,10,12,14,16,18,19,21,23,34,35,36],A=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],I=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],D=[1,64],k={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:o(function(N,P,F,B,G,z,W){var Z=z.length-1;switch(G){case 5:B.setOrientation(z[Z]);break;case 9:B.setDiagramTitle(z[Z].text.trim());break;case 12:B.setLineData({text:"",type:"text"},z[Z]);break;case 13:B.setLineData(z[Z-1],z[Z]);break;case 14:B.setBarData({text:"",type:"text"},z[Z]);break;case 15:B.setBarData(z[Z-1],z[Z]);break;case 16:this.$=z[Z].trim(),B.setAccTitle(this.$);break;case 17:case 18:this.$=z[Z].trim(),B.setAccDescription(this.$);break;case 19:this.$=z[Z-1];break;case 20:this.$=[Number(z[Z-2]),...z[Z]];break;case 21:this.$=[Number(z[Z])];break;case 22:B.setXAxisTitle(z[Z]);break;case 23:B.setXAxisTitle(z[Z-1]);break;case 24:B.setXAxisTitle({type:"text",text:""});break;case 25:B.setXAxisBand(z[Z]);break;case 26:B.setXAxisRangeData(Number(z[Z-2]),Number(z[Z]));break;case 27:this.$=z[Z-1];break;case 28:this.$=[z[Z-2],...z[Z]];break;case 29:this.$=[z[Z]];break;case 30:B.setYAxisTitle(z[Z]);break;case 31:B.setYAxisTitle(z[Z-1]);break;case 32:B.setYAxisTitle({type:"text",text:""});break;case 33:B.setYAxisRangeData(Number(z[Z-2]),Number(z[Z]));break;case 37:this.$={text:z[Z],type:"text"};break;case 38:this.$={text:z[Z],type:"text"};break;case 39:this.$={text:z[Z],type:"markdown"};break;case 40:this.$=z[Z];break;case 41:this.$=z[Z-1]+""+z[Z];break}},"anonymous"),table:[t(e,r,{3:1,4:2,7:4,5:n,34:i,35:a,36:s}),{1:[3]},t(e,r,{4:2,7:4,3:8,5:n,34:i,35:a,36:s}),t(e,r,{4:2,7:4,6:9,3:10,5:n,8:[1,11],34:i,35:a,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(l,[2,34]),t(l,[2,35]),t(l,[2,36]),{1:[2,1]},t(e,r,{4:2,7:4,3:21,5:n,34:i,35:a,36:s}),{1:[2,3]},t(l,[2,5]),t(e,[2,7],{4:22,34:i,35:a,36:s}),{11:23,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:39,13:38,24:_,27:T,29:40,30:41,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:45,15:44,27:E,33:46,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:49,17:48,24:L,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:52,17:51,24:L,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{20:[1,53]},{22:[1,54]},t(S,[2,18]),{1:[2,2]},t(S,[2,8]),t(S,[2,9]),t(A,[2,37],{40:55,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w}),t(A,[2,38]),t(A,[2,39]),t(I,[2,40]),t(I,[2,42]),t(I,[2,43]),t(I,[2,44]),t(I,[2,45]),t(I,[2,46]),t(I,[2,47]),t(I,[2,48]),t(I,[2,49]),t(I,[2,50]),t(I,[2,51]),t(S,[2,10]),t(S,[2,22],{30:41,29:56,24:_,27:T}),t(S,[2,24]),t(S,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},t(S,[2,11]),t(S,[2,30],{33:60,27:E}),t(S,[2,32]),{31:[1,61]},t(S,[2,12]),{17:62,24:L},{25:63,27:D},t(S,[2,14]),{17:65,24:L},t(S,[2,16]),t(S,[2,17]),t(I,[2,41]),t(S,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(S,[2,31]),{27:[1,69]},t(S,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(S,[2,15]),t(S,[2,26]),t(S,[2,27]),{11:59,32:72,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},t(S,[2,33]),t(S,[2,19]),{25:73,27:D},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:o(function(N,P){if(P.recoverable)this.trace(N);else{var F=new Error(N);throw F.hash=P,F}},"parseError"),parse:o(function(N){var P=this,F=[0],B=[],G=[null],z=[],W=this.table,Z="",j=0,oe=0,K=0,ee=2,J=1,H=z.slice.call(arguments,1),q=Object.create(this.lexer),Q={yy:{}};for(var ae in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ae)&&(Q.yy[ae]=this.yy[ae]);q.setInput(N,Q.yy),Q.yy.lexer=q,Q.yy.parser=this,typeof q.yylloc>"u"&&(q.yylloc={});var ue=q.yylloc;z.push(ue);var ce=q.options&&q.options.ranges;typeof Q.yy.parseError=="function"?this.parseError=Q.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function te(ne){F.length=F.length-2*ne,G.length=G.length-ne,z.length=z.length-ne}o(te,"popStack");function Ne(){var ne;return ne=B.pop()||q.lex()||J,typeof ne!="number"&&(ne instanceof Array&&(B=ne,ne=B.pop()),ne=P.symbols_[ne]||ne),ne}o(Ne,"lex");for(var se,ke,Re,Ce,Pe,Ie,$e={},ye,X,fe,he;;){if(Re=F[F.length-1],this.defaultActions[Re]?Ce=this.defaultActions[Re]:((se===null||typeof se>"u")&&(se=Ne()),Ce=W[Re]&&W[Re][se]),typeof Ce>"u"||!Ce.length||!Ce[0]){var ge="";he=[];for(ye in W[Re])this.terminals_[ye]&&ye>ee&&he.push("'"+this.terminals_[ye]+"'");q.showPosition?ge="Parse error on line "+(j+1)+`: +`+q.showPosition()+` +Expecting `+he.join(", ")+", got '"+(this.terminals_[se]||se)+"'":ge="Parse error on line "+(j+1)+": Unexpected "+(se==J?"end of input":"'"+(this.terminals_[se]||se)+"'"),this.parseError(ge,{text:q.match,token:this.terminals_[se]||se,line:q.yylineno,loc:ue,expected:he})}if(Ce[0]instanceof Array&&Ce.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Re+", token: "+se);switch(Ce[0]){case 1:F.push(se),G.push(q.yytext),z.push(q.yylloc),F.push(Ce[1]),se=null,ke?(se=ke,ke=null):(oe=q.yyleng,Z=q.yytext,j=q.yylineno,ue=q.yylloc,K>0&&K--);break;case 2:if(X=this.productions_[Ce[1]][1],$e.$=G[G.length-X],$e._$={first_line:z[z.length-(X||1)].first_line,last_line:z[z.length-1].last_line,first_column:z[z.length-(X||1)].first_column,last_column:z[z.length-1].last_column},ce&&($e._$.range=[z[z.length-(X||1)].range[0],z[z.length-1].range[1]]),Ie=this.performAction.apply($e,[Z,oe,j,Q.yy,Ce[1],G,z].concat(H)),typeof Ie<"u")return Ie;X&&(F=F.slice(0,-1*X*2),G=G.slice(0,-1*X),z=z.slice(0,-1*X)),F.push(this.productions_[Ce[1]][0]),G.push($e.$),z.push($e._$),fe=W[F[F.length-2]][F[F.length-1]],F.push(fe);break;case 3:return!0}}return!0},"parse")},R=function(){var O={EOF:1,parseError:o(function(P,F){if(this.yy.parser)this.yy.parser.parseError(P,F);else throw new Error(P)},"parseError"),setInput:o(function(N,P){return this.yy=P||this.yy||{},this._input=N,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var N=this._input[0];this.yytext+=N,this.yyleng++,this.offset++,this.match+=N,this.matched+=N;var P=N.match(/(?:\r\n?|\n).*/g);return P?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),N},"input"),unput:o(function(N){var P=N.length,F=N.split(/(?:\r\n?|\n)/g);this._input=N+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-P),this.offset-=P;var B=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),F.length-1&&(this.yylineno-=F.length-1);var G=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:F?(F.length===B.length?this.yylloc.first_column:0)+B[B.length-F.length].length-F[0].length:this.yylloc.first_column-P},this.options.ranges&&(this.yylloc.range=[G[0],G[0]+this.yyleng-P]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(N){this.unput(this.match.slice(N))},"less"),pastInput:o(function(){var N=this.matched.substr(0,this.matched.length-this.match.length);return(N.length>20?"...":"")+N.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var N=this.match;return N.length<20&&(N+=this._input.substr(0,20-N.length)),(N.substr(0,20)+(N.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var N=this.pastInput(),P=new Array(N.length+1).join("-");return N+this.upcomingInput()+` +`+P+"^"},"showPosition"),test_match:o(function(N,P){var F,B,G;if(this.options.backtrack_lexer&&(G={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(G.yylloc.range=this.yylloc.range.slice(0))),B=N[0].match(/(?:\r\n?|\n).*/g),B&&(this.yylineno+=B.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:B?B[B.length-1].length-B[B.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+N[0].length},this.yytext+=N[0],this.match+=N[0],this.matches=N,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(N[0].length),this.matched+=N[0],F=this.performAction.call(this,this.yy,this,P,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),F)return F;if(this._backtrack){for(var z in G)this[z]=G[z];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var N,P,F,B;this._more||(this.yytext="",this.match="");for(var G=this._currentRules(),z=0;zP[0].length)){if(P=F,B=z,this.options.backtrack_lexer){if(N=this.test_match(F,G[z]),N!==!1)return N;if(this._backtrack){P=!1;continue}else return!1}else if(!this.options.flex)break}return P?(N=this.test_match(P,G[B]),N!==!1?N:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var P=this.next();return P||this.lex()},"lex"),begin:o(function(P){this.conditionStack.push(P)},"begin"),popState:o(function(){var P=this.conditionStack.length-1;return P>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(P){return P=this.conditionStack.length-1-Math.abs(P||0),P>=0?this.conditionStack[P]:"INITIAL"},"topState"),pushState:o(function(P){this.begin(P)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(P,F,B,G){var z=G;switch(B){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 8;case 16:return this.pushState("axis_data"),"X_AXIS";break;case 17:return this.pushState("axis_data"),"Y_AXIS";break;case 18:return this.pushState("axis_band_data"),24;break;case 19:return 31;case 20:return this.pushState("data"),16;break;case 21:return this.pushState("data"),18;break;case 22:return this.pushState("data_inner"),24;break;case 23:return 27;case 24:return this.popState(),26;break;case 25:this.popState();break;case 26:this.pushState("string");break;case 27:this.popState();break;case 28:return"STR";case 29:return 24;case 30:return 26;case 31:return 43;case 32:return"COLON";case 33:return 44;case 34:return 28;case 35:return 45;case 36:return 46;case 37:return 48;case 38:return 50;case 39:return 47;case 40:return 41;case 41:return 49;case 42:return 42;case 43:break;case 44:return 35;case 45:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,20,21,22,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,23,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[27,28],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0}}};return O}();k.lexer=R;function C(){this.yy={}}return o(C,"Parser"),C.prototype=k,k.Parser=C,new C}();lO.parser=lO;jhe=lO});function cO(t){return t.type==="bar"}function SE(t){return t.type==="band"}function qg(t){return t.type==="linear"}var CE=M(()=>{"use strict";o(cO,"isBarPlot");o(SE,"isBandAxisData");o(qg,"isLinearAxisData")});var Xg,uO=M(()=>{"use strict";Pl();Xg=class{constructor(e){this.parentGroup=e}static{o(this,"TextDimensionCalculatorWithFont")}getMaxDimension(e,r){if(!this.parentGroup)return{width:e.reduce((a,s)=>Math.max(s.length,a),0)*r,height:r};let n={width:0,height:0},i=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",r);for(let a of e){let s=dj(i,1,a),l=s?s.width:a.length*r,u=s?s.height:r;n.width=Math.max(n.width,l),n.height=Math.max(n.height,u)}return i.remove(),n}}});var jg,hO=M(()=>{"use strict";jg=class{constructor(e,r,n,i){this.axisConfig=e;this.title=r;this.textDimensionCalculator=n;this.axisThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0};this.axisPosition="left";this.showTitle=!1;this.showLabel=!1;this.showTick=!1;this.showAxisLine=!1;this.outerPadding=0;this.titleTextHeight=0;this.labelTextHeight=0;this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{o(this,"BaseAxis")}setRange(e){this.range=e,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=e[1]-e[0]:this.boundingRect.width=e[1]-e[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(e){this.axisPosition=e,this.setRange(this.range)}getTickDistance(){let e=this.getRange();return Math.abs(e[0]-e[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(e=>e.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(e){let r=e.height;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.width;this.outerPadding=Math.min(n.width/2,i);let a=n.height+this.axisConfig.labelPadding*2;this.labelTextHeight=n.height,a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width,this.boundingRect.height=e.height-r}calculateSpaceIfDrawnVertical(e){let r=e.width;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.height;this.outerPadding=Math.min(n.height/2,i);let a=n.width+this.axisConfig.labelPadding*2;a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width-r,this.boundingRect.height=e.height}calculateSpace(e){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(e):this.calculateSpaceIfDrawnHorizontally(e),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}getDrawableElementsForLeftAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${r},${this.boundingRect.y} L ${r},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(r),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let r=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${r},${this.getScaleValue(n)} L ${r-this.axisConfig.tickLength},${this.getScaleValue(n)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForBottomAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r} L ${this.getScaleValue(n)},${r+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForTopAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y;e.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(n)},${r+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}}});var AE,Qhe=M(()=>{"use strict";pr();ut();hO();AE=class extends jg{static{o(this,"BandAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.categories=n,this.scale=Vp().domain(this.categories).range(this.getRange())}setRange(e){super.setRange(e)}recalculateScale(){this.scale=Vp().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),Y.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(e){return this.scale(e)??this.getRange()[0]}}});var _E,Zhe=M(()=>{"use strict";pr();hO();_E=class extends jg{static{o(this,"LinearAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.domain=n,this.scale=Cl().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let e=[...this.domain];this.axisPosition==="left"&&e.reverse(),this.scale=Cl().domain(e).range(this.getRange())}getScaleValue(e){return this.scale(e)}}});function fO(t,e,r,n){let i=new Xg(n);return SE(t)?new AE(e,r,t.categories,t.title,i):new _E(e,r,[t.min,t.max],t.title,i)}var Jhe=M(()=>{"use strict";CE();uO();Qhe();Zhe();o(fO,"getAxis")});function efe(t,e,r,n){let i=new Xg(n);return new dO(i,t,e,r)}var dO,tfe=M(()=>{"use strict";uO();dO=class{constructor(e,r,n,i){this.textDimensionCalculator=e;this.chartConfig=r;this.chartData=n;this.chartThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{o(this,"ChartTitle")}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){let r=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),n=Math.max(r.width,e.width),i=r.height+2*this.chartConfig.titlePadding;return r.width<=n&&r.height<=i&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=n,this.boundingRect.height=i,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let e=[];return this.showChartTitle&&e.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),e}};o(efe,"getChartTitleComponent")});var LE,rfe=M(()=>{"use strict";pr();LE=class{constructor(e,r,n,i,a){this.plotData=e;this.xAxis=r;this.yAxis=n;this.orientation=i;this.plotIndex=a}static{o(this,"LinePlot")}getDrawableElement(){let e=this.plotData.data.map(n=>[this.xAxis.getScaleValue(n[0]),this.yAxis.getScaleValue(n[1])]),r;return this.orientation==="horizontal"?r=ns().y(n=>n[0]).x(n=>n[1])(e):r=ns().x(n=>n[0]).y(n=>n[1])(e),r?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:r,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}}});var DE,nfe=M(()=>{"use strict";DE=class{constructor(e,r,n,i,a,s){this.barData=e;this.boundingRect=r;this.xAxis=n;this.yAxis=i;this.orientation=a;this.plotIndex=s}static{o(this,"BarPlot")}getDrawableElement(){let e=this.barData.data.map(a=>[this.xAxis.getScaleValue(a[0]),this.yAxis.getScaleValue(a[1])]),n=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),i=n/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:this.boundingRect.x,y:a[0]-i,height:n,width:a[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:a[0]-i,y:a[1],width:n,height:this.boundingRect.y+this.boundingRect.height-a[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}}});function ife(t,e,r){return new pO(t,e,r)}var pO,afe=M(()=>{"use strict";rfe();nfe();pO=class{constructor(e,r,n){this.chartConfig=e;this.chartData=r;this.chartThemeConfig=n;this.boundingRect={x:0,y:0,width:0,height:0}}static{o(this,"BasePlot")}setAxes(e,r){this.xAxis=e,this.yAxis=r}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){return this.boundingRect.width=e.width,this.boundingRect.height=e.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let e=[];for(let[r,n]of this.chartData.plots.entries())switch(n.type){case"line":{let i=new LE(n,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break;case"bar":{let i=new DE(n,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break}return e}};o(ife,"getPlotComponent")});var NE,sfe=M(()=>{"use strict";Jhe();tfe();afe();CE();NE=class{constructor(e,r,n,i){this.chartConfig=e;this.chartData=r;this.componentStore={title:efe(e,r,n,i),plot:ife(e,r,n),xAxis:fO(r.xAxis,e.xAxis,{titleColor:n.xAxisTitleColor,labelColor:n.xAxisLabelColor,tickColor:n.xAxisTickColor,axisLineColor:n.xAxisLineColor},i),yAxis:fO(r.yAxis,e.yAxis,{titleColor:n.yAxisTitleColor,labelColor:n.yAxisLabelColor,tickColor:n.yAxisTickColor,axisLineColor:n.yAxisLineColor},i)}}static{o(this,"Orchestrator")}calculateVerticalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),l=this.componentStore.plot.calculateSpace({width:a,height:s});e-=l.width,r-=l.height,l=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),i=l.height,r-=l.height,this.componentStore.xAxis.setAxisPosition("bottom"),l=this.componentStore.xAxis.calculateSpace({width:e,height:r}),r-=l.height,this.componentStore.yAxis.setAxisPosition("left"),l=this.componentStore.yAxis.calculateSpace({width:e,height:r}),n=l.width,e-=l.width,e>0&&(a+=e,e=0),r>0&&(s+=r,r=0),this.componentStore.plot.calculateSpace({width:a,height:s}),this.componentStore.plot.setBoundingBoxXY({x:n,y:i}),this.componentStore.xAxis.setRange([n,n+a]),this.componentStore.xAxis.setBoundingBoxXY({x:n,y:i+s}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(u=>cO(u))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=0,s=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),l=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),u=this.componentStore.plot.calculateSpace({width:s,height:l});e-=u.width,r-=u.height,u=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),n=u.height,r-=u.height,this.componentStore.xAxis.setAxisPosition("left"),u=this.componentStore.xAxis.calculateSpace({width:e,height:r}),e-=u.width,i=u.width,this.componentStore.yAxis.setAxisPosition("top"),u=this.componentStore.yAxis.calculateSpace({width:e,height:r}),r-=u.height,a=n+u.height,e>0&&(s+=e,e=0),r>0&&(l+=r,r=0),this.componentStore.plot.calculateSpace({width:s,height:l}),this.componentStore.plot.setBoundingBoxXY({x:i,y:a}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:i,y:n}),this.componentStore.xAxis.setRange([a,a+l]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:a}),this.chartData.plots.some(h=>cO(h))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let e=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let r of Object.values(this.componentStore))e.push(...r.getDrawableElements());return e}}});var RE,ofe=M(()=>{"use strict";sfe();RE=class{static{o(this,"XYChartBuilder")}static build(e,r,n,i){return new NE(e,r,n,i).getDrawableElement()}}});function cfe(){let t=vp(),e=Cr();return Ds(t.xyChart,e.themeVariables.xyChart)}function ufe(){let t=Cr();return Ds(ur.xyChart,t.xyChart)}function hfe(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function yO(t){let e=Cr();return kr(t.trim(),e)}function _Ve(t){lfe=t}function LVe(t){t==="horizontal"?Dx.chartOrientation="horizontal":Dx.chartOrientation="vertical"}function DVe(t){hn.xAxis.title=yO(t.text)}function ffe(t,e){hn.xAxis={type:"linear",title:hn.xAxis.title,min:t,max:e},ME=!0}function NVe(t){hn.xAxis={type:"band",title:hn.xAxis.title,categories:t.map(e=>yO(e.text))},ME=!0}function RVe(t){hn.yAxis.title=yO(t.text)}function MVe(t,e){hn.yAxis={type:"linear",title:hn.yAxis.title,min:t,max:e},gO=!0}function IVe(t){let e=Math.min(...t),r=Math.max(...t),n=qg(hn.yAxis)?hn.yAxis.min:1/0,i=qg(hn.yAxis)?hn.yAxis.max:-1/0;hn.yAxis={type:"linear",title:hn.yAxis.title,min:Math.min(n,e),max:Math.max(i,r)}}function dfe(t){let e=[];if(t.length===0)return e;if(!ME){let r=qg(hn.xAxis)?hn.xAxis.min:1/0,n=qg(hn.xAxis)?hn.xAxis.max:-1/0;ffe(Math.min(r,1),Math.max(n,t.length))}if(gO||IVe(t),SE(hn.xAxis)&&(e=hn.xAxis.categories.map((r,n)=>[r,t[n]])),qg(hn.xAxis)){let r=hn.xAxis.min,n=hn.xAxis.max,i=(n-r)/(t.length-1),a=[];for(let s=r;s<=n;s+=i)a.push(`${s}`);e=a.map((s,l)=>[s,t[l]])}return e}function pfe(t){return mO[t===0?0:t%mO.length]}function OVe(t,e){let r=dfe(e);hn.plots.push({type:"line",strokeFill:pfe(Lx),strokeWidth:2,data:r}),Lx++}function PVe(t,e){let r=dfe(e);hn.plots.push({type:"bar",fill:pfe(Lx),data:r}),Lx++}function BVe(){if(hn.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return hn.title=Jr(),RE.build(Dx,hn,Nx,lfe)}function FVe(){return Nx}function zVe(){return Dx}var Lx,lfe,Dx,Nx,hn,mO,ME,gO,GVe,mfe,gfe=M(()=>{"use strict";Za();bs();i4();hr();fr();Ai();ofe();CE();Lx=0,Dx=ufe(),Nx=cfe(),hn=hfe(),mO=Nx.plotColorPalette.split(",").map(t=>t.trim()),ME=!1,gO=!1;o(cfe,"getChartDefaultThemeConfig");o(ufe,"getChartDefaultConfig");o(hfe,"getChartDefaultData");o(yO,"textSanitizer");o(_Ve,"setTmpSVGG");o(LVe,"setOrientation");o(DVe,"setXAxisTitle");o(ffe,"setXAxisRangeData");o(NVe,"setXAxisBand");o(RVe,"setYAxisTitle");o(MVe,"setYAxisRangeData");o(IVe,"setYAxisRangeFromPlotData");o(dfe,"transformDataWithoutCategory");o(pfe,"getPlotColorFromPalette");o(OVe,"setLineData");o(PVe,"setBarData");o(BVe,"getDrawableElem");o(FVe,"getChartThemeConfig");o(zVe,"getChartConfig");GVe=o(function(){Lr(),Lx=0,Dx=ufe(),hn=hfe(),Nx=cfe(),mO=Nx.plotColorPalette.split(",").map(t=>t.trim()),ME=!1,gO=!1},"clear"),mfe={getDrawableElem:BVe,clear:GVe,setAccTitle:Mr,getAccTitle:Br,setDiagramTitle:cn,getDiagramTitle:Jr,getAccDescription:zr,setAccDescription:Fr,setOrientation:LVe,setXAxisTitle:DVe,setXAxisRangeData:ffe,setXAxisBand:NVe,setYAxisTitle:RVe,setYAxisRangeData:MVe,setLineData:OVe,setBarData:PVe,setTmpSVGG:_Ve,getChartThemeConfig:FVe,getChartConfig:zVe}});var $Ve,yfe,vfe=M(()=>{"use strict";ut();eh();ai();$Ve=o((t,e,r,n)=>{let i=n.db,a=i.getChartThemeConfig(),s=i.getChartConfig();function l(v){return v==="top"?"text-before-edge":"middle"}o(l,"getDominantBaseLine");function u(v){return v==="left"?"start":v==="right"?"end":"middle"}o(u,"getTextAnchor");function h(v){return`translate(${v.x}, ${v.y}) rotate(${v.rotation||0})`}o(h,"getTextTransformation"),Y.debug(`Rendering xychart chart +`+t);let f=Va(e),d=f.append("g").attr("class","main"),p=d.append("rect").attr("width",s.width).attr("height",s.height).attr("class","background");Zr(f,s.height,s.width,!0),f.attr("viewBox",`0 0 ${s.width} ${s.height}`),p.attr("fill",a.backgroundColor),i.setTmpSVGG(f.append("g").attr("class","mermaid-tmp-group"));let m=i.getDrawableElem(),g={};function y(v){let x=d,b="";for(let[w]of v.entries()){let _=d;w>0&&g[b]&&(_=g[b]),b+=v[w],x=g[b],x||(x=g[b]=_.append("g").attr("class",v[w]))}return x}o(y,"getGroup");for(let v of m){if(v.data.length===0)continue;let x=y(v.groupTexts);switch(v.type){case"rect":x.selectAll("rect").data(v.data).enter().append("rect").attr("x",b=>b.x).attr("y",b=>b.y).attr("width",b=>b.width).attr("height",b=>b.height).attr("fill",b=>b.fill).attr("stroke",b=>b.strokeFill).attr("stroke-width",b=>b.strokeWidth);break;case"text":x.selectAll("text").data(v.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",b=>b.fill).attr("font-size",b=>b.fontSize).attr("dominant-baseline",b=>l(b.verticalPos)).attr("text-anchor",b=>u(b.horizontalPos)).attr("transform",b=>h(b)).text(b=>b.text);break;case"path":x.selectAll("path").data(v.data).enter().append("path").attr("d",b=>b.path).attr("fill",b=>b.fill?b.fill:"none").attr("stroke",b=>b.strokeFill).attr("stroke-width",b=>b.strokeWidth);break}}},"draw"),yfe={draw:$Ve}});var xfe={};vr(xfe,{diagram:()=>VVe});var VVe,bfe=M(()=>{"use strict";Khe();gfe();vfe();VVe={parser:jhe,db:mfe,renderer:yfe}});var vO,kfe,Efe=M(()=>{"use strict";vO=function(){var t=o(function(oe,K,ee,J){for(ee=ee||{},J=oe.length;J--;ee[oe[J]]=K);return ee},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[5,6,8,9,11,13,31,32,33,34,35,36,44,62,63],s=[1,18],l=[2,7],u=[1,22],h=[1,23],f=[1,24],d=[1,25],p=[1,26],m=[1,27],g=[1,20],y=[1,28],v=[1,29],x=[62,63],b=[5,8,9,11,13,31,32,33,34,35,36,44,51,53,62,63],w=[1,47],_=[1,48],T=[1,49],E=[1,50],L=[1,51],S=[1,52],A=[1,53],I=[53,54],D=[1,64],k=[1,60],R=[1,61],C=[1,62],O=[1,63],N=[1,65],P=[1,69],F=[1,70],B=[1,67],G=[1,68],z=[5,8,9,11,13,31,32,33,34,35,36,44,62,63],W={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,requirementType:17,requirementName:18,STRUCT_START:19,requirementBody:20,ID:21,COLONSEP:22,id:23,TEXT:24,text:25,RISK:26,riskLevel:27,VERIFYMTHD:28,verifyType:29,STRUCT_STOP:30,REQUIREMENT:31,FUNCTIONAL_REQUIREMENT:32,INTERFACE_REQUIREMENT:33,PERFORMANCE_REQUIREMENT:34,PHYSICAL_REQUIREMENT:35,DESIGN_CONSTRAINT:36,LOW_RISK:37,MED_RISK:38,HIGH_RISK:39,VERIFY_ANALYSIS:40,VERIFY_DEMONSTRATION:41,VERIFY_INSPECTION:42,VERIFY_TEST:43,ELEMENT:44,elementName:45,elementBody:46,TYPE:47,type:48,DOCREF:49,ref:50,END_ARROW_L:51,relationship:52,LINE:53,END_ARROW_R:54,CONTAINS:55,COPIES:56,DERIVES:57,SATISFIES:58,VERIFIES:59,REFINES:60,TRACES:61,unqString:62,qString:63,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",19:"STRUCT_START",21:"ID",22:"COLONSEP",24:"TEXT",26:"RISK",28:"VERIFYMTHD",30:"STRUCT_STOP",31:"REQUIREMENT",32:"FUNCTIONAL_REQUIREMENT",33:"INTERFACE_REQUIREMENT",34:"PERFORMANCE_REQUIREMENT",35:"PHYSICAL_REQUIREMENT",36:"DESIGN_CONSTRAINT",37:"LOW_RISK",38:"MED_RISK",39:"HIGH_RISK",40:"VERIFY_ANALYSIS",41:"VERIFY_DEMONSTRATION",42:"VERIFY_INSPECTION",43:"VERIFY_TEST",44:"ELEMENT",47:"TYPE",49:"DOCREF",51:"END_ARROW_L",53:"LINE",54:"END_ARROW_R",55:"CONTAINS",56:"COPIES",57:"DERIVES",58:"SATISFIES",59:"VERIFIES",60:"REFINES",61:"TRACES",62:"unqString",63:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[14,5],[20,5],[20,5],[20,5],[20,5],[20,2],[20,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[27,1],[27,1],[27,1],[29,1],[29,1],[29,1],[29,1],[15,5],[46,5],[46,5],[46,2],[46,1],[16,5],[16,5],[52,1],[52,1],[52,1],[52,1],[52,1],[52,1],[52,1],[18,1],[18,1],[23,1],[23,1],[25,1],[25,1],[45,1],[45,1],[48,1],[48,1],[50,1],[50,1]],performAction:o(function(K,ee,J,H,q,Q,ae){var ue=Q.length-1;switch(q){case 4:this.$=Q[ue].trim(),H.setAccTitle(this.$);break;case 5:case 6:this.$=Q[ue].trim(),H.setAccDescription(this.$);break;case 7:this.$=[];break;case 13:H.addRequirement(Q[ue-3],Q[ue-4]);break;case 14:H.setNewReqId(Q[ue-2]);break;case 15:H.setNewReqText(Q[ue-2]);break;case 16:H.setNewReqRisk(Q[ue-2]);break;case 17:H.setNewReqVerifyMethod(Q[ue-2]);break;case 20:this.$=H.RequirementType.REQUIREMENT;break;case 21:this.$=H.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 22:this.$=H.RequirementType.INTERFACE_REQUIREMENT;break;case 23:this.$=H.RequirementType.PERFORMANCE_REQUIREMENT;break;case 24:this.$=H.RequirementType.PHYSICAL_REQUIREMENT;break;case 25:this.$=H.RequirementType.DESIGN_CONSTRAINT;break;case 26:this.$=H.RiskLevel.LOW_RISK;break;case 27:this.$=H.RiskLevel.MED_RISK;break;case 28:this.$=H.RiskLevel.HIGH_RISK;break;case 29:this.$=H.VerifyType.VERIFY_ANALYSIS;break;case 30:this.$=H.VerifyType.VERIFY_DEMONSTRATION;break;case 31:this.$=H.VerifyType.VERIFY_INSPECTION;break;case 32:this.$=H.VerifyType.VERIFY_TEST;break;case 33:H.addElement(Q[ue-3]);break;case 34:H.setNewElementType(Q[ue-2]);break;case 35:H.setNewElementDocRef(Q[ue-2]);break;case 38:H.addRelationship(Q[ue-2],Q[ue],Q[ue-4]);break;case 39:H.addRelationship(Q[ue-2],Q[ue-4],Q[ue]);break;case 40:this.$=H.Relationships.CONTAINS;break;case 41:this.$=H.Relationships.COPIES;break;case 42:this.$=H.Relationships.DERIVES;break;case 43:this.$=H.Relationships.SATISFIES;break;case 44:this.$=H.Relationships.VERIFIES;break;case 45:this.$=H.Relationships.REFINES;break;case 46:this.$=H.Relationships.TRACES;break}},"anonymous"),table:[{3:1,4:2,6:e,9:r,11:n,13:i},{1:[3]},{3:8,4:2,5:[1,7],6:e,9:r,11:n,13:i},{5:[1,9]},{10:[1,10]},{12:[1,11]},t(a,[2,6]),{3:12,4:2,6:e,9:r,11:n,13:i},{1:[2,2]},{4:17,5:s,7:13,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:u,32:h,33:f,34:d,35:p,36:m,44:g,62:y,63:v},t(a,[2,4]),t(a,[2,5]),{1:[2,1]},{8:[1,30]},{4:17,5:s,7:31,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:u,32:h,33:f,34:d,35:p,36:m,44:g,62:y,63:v},{4:17,5:s,7:32,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:u,32:h,33:f,34:d,35:p,36:m,44:g,62:y,63:v},{4:17,5:s,7:33,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:u,32:h,33:f,34:d,35:p,36:m,44:g,62:y,63:v},{4:17,5:s,7:34,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:u,32:h,33:f,34:d,35:p,36:m,44:g,62:y,63:v},{4:17,5:s,7:35,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:19,23:21,31:u,32:h,33:f,34:d,35:p,36:m,44:g,62:y,63:v},{18:36,62:[1,37],63:[1,38]},{45:39,62:[1,40],63:[1,41]},{51:[1,42],53:[1,43]},t(x,[2,20]),t(x,[2,21]),t(x,[2,22]),t(x,[2,23]),t(x,[2,24]),t(x,[2,25]),t(b,[2,49]),t(b,[2,50]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{19:[1,44]},{19:[2,47]},{19:[2,48]},{19:[1,45]},{19:[2,53]},{19:[2,54]},{52:46,55:w,56:_,57:T,58:E,59:L,60:S,61:A},{52:54,55:w,56:_,57:T,58:E,59:L,60:S,61:A},{5:[1,55]},{5:[1,56]},{53:[1,57]},t(I,[2,40]),t(I,[2,41]),t(I,[2,42]),t(I,[2,43]),t(I,[2,44]),t(I,[2,45]),t(I,[2,46]),{54:[1,58]},{5:D,20:59,21:k,24:R,26:C,28:O,30:N},{5:P,30:F,46:66,47:B,49:G},{23:71,62:y,63:v},{23:72,62:y,63:v},t(z,[2,13]),{22:[1,73]},{22:[1,74]},{22:[1,75]},{22:[1,76]},{5:D,20:77,21:k,24:R,26:C,28:O,30:N},t(z,[2,19]),t(z,[2,33]),{22:[1,78]},{22:[1,79]},{5:P,30:F,46:80,47:B,49:G},t(z,[2,37]),t(z,[2,38]),t(z,[2,39]),{23:81,62:y,63:v},{25:82,62:[1,83],63:[1,84]},{27:85,37:[1,86],38:[1,87],39:[1,88]},{29:89,40:[1,90],41:[1,91],42:[1,92],43:[1,93]},t(z,[2,18]),{48:94,62:[1,95],63:[1,96]},{50:97,62:[1,98],63:[1,99]},t(z,[2,36]),{5:[1,100]},{5:[1,101]},{5:[2,51]},{5:[2,52]},{5:[1,102]},{5:[2,26]},{5:[2,27]},{5:[2,28]},{5:[1,103]},{5:[2,29]},{5:[2,30]},{5:[2,31]},{5:[2,32]},{5:[1,104]},{5:[2,55]},{5:[2,56]},{5:[1,105]},{5:[2,57]},{5:[2,58]},{5:D,20:106,21:k,24:R,26:C,28:O,30:N},{5:D,20:107,21:k,24:R,26:C,28:O,30:N},{5:D,20:108,21:k,24:R,26:C,28:O,30:N},{5:D,20:109,21:k,24:R,26:C,28:O,30:N},{5:P,30:F,46:110,47:B,49:G},{5:P,30:F,46:111,47:B,49:G},t(z,[2,14]),t(z,[2,15]),t(z,[2,16]),t(z,[2,17]),t(z,[2,34]),t(z,[2,35])],defaultActions:{8:[2,2],12:[2,1],30:[2,3],31:[2,8],32:[2,9],33:[2,10],34:[2,11],35:[2,12],37:[2,47],38:[2,48],40:[2,53],41:[2,54],83:[2,51],84:[2,52],86:[2,26],87:[2,27],88:[2,28],90:[2,29],91:[2,30],92:[2,31],93:[2,32],95:[2,55],96:[2,56],98:[2,57],99:[2,58]},parseError:o(function(K,ee){if(ee.recoverable)this.trace(K);else{var J=new Error(K);throw J.hash=ee,J}},"parseError"),parse:o(function(K){var ee=this,J=[0],H=[],q=[null],Q=[],ae=this.table,ue="",ce=0,te=0,Ne=0,se=2,ke=1,Re=Q.slice.call(arguments,1),Ce=Object.create(this.lexer),Pe={yy:{}};for(var Ie in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ie)&&(Pe.yy[Ie]=this.yy[Ie]);Ce.setInput(K,Pe.yy),Pe.yy.lexer=Ce,Pe.yy.parser=this,typeof Ce.yylloc>"u"&&(Ce.yylloc={});var $e=Ce.yylloc;Q.push($e);var ye=Ce.options&&Ce.options.ranges;typeof Pe.yy.parseError=="function"?this.parseError=Pe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function X(He){J.length=J.length-2*He,q.length=q.length-He,Q.length=Q.length-He}o(X,"popStack");function fe(){var He;return He=H.pop()||Ce.lex()||ke,typeof He!="number"&&(He instanceof Array&&(H=He,He=H.pop()),He=ee.symbols_[He]||He),He}o(fe,"lex");for(var he,ge,ne,ve,U,Te,ie={},Ee,Ae,Ge,Be;;){if(ne=J[J.length-1],this.defaultActions[ne]?ve=this.defaultActions[ne]:((he===null||typeof he>"u")&&(he=fe()),ve=ae[ne]&&ae[ne][he]),typeof ve>"u"||!ve.length||!ve[0]){var me="";Be=[];for(Ee in ae[ne])this.terminals_[Ee]&&Ee>se&&Be.push("'"+this.terminals_[Ee]+"'");Ce.showPosition?me="Parse error on line "+(ce+1)+`: +`+Ce.showPosition()+` +Expecting `+Be.join(", ")+", got '"+(this.terminals_[he]||he)+"'":me="Parse error on line "+(ce+1)+": Unexpected "+(he==ke?"end of input":"'"+(this.terminals_[he]||he)+"'"),this.parseError(me,{text:Ce.match,token:this.terminals_[he]||he,line:Ce.yylineno,loc:$e,expected:Be})}if(ve[0]instanceof Array&&ve.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ne+", token: "+he);switch(ve[0]){case 1:J.push(he),q.push(Ce.yytext),Q.push(Ce.yylloc),J.push(ve[1]),he=null,ge?(he=ge,ge=null):(te=Ce.yyleng,ue=Ce.yytext,ce=Ce.yylineno,$e=Ce.yylloc,Ne>0&&Ne--);break;case 2:if(Ae=this.productions_[ve[1]][1],ie.$=q[q.length-Ae],ie._$={first_line:Q[Q.length-(Ae||1)].first_line,last_line:Q[Q.length-1].last_line,first_column:Q[Q.length-(Ae||1)].first_column,last_column:Q[Q.length-1].last_column},ye&&(ie._$.range=[Q[Q.length-(Ae||1)].range[0],Q[Q.length-1].range[1]]),Te=this.performAction.apply(ie,[ue,te,ce,Pe.yy,ve[1],q,Q].concat(Re)),typeof Te<"u")return Te;Ae&&(J=J.slice(0,-1*Ae*2),q=q.slice(0,-1*Ae),Q=Q.slice(0,-1*Ae)),J.push(this.productions_[ve[1]][0]),q.push(ie.$),Q.push(ie._$),Ge=ae[J[J.length-2]][J[J.length-1]],J.push(Ge);break;case 3:return!0}}return!0},"parse")},Z=function(){var oe={EOF:1,parseError:o(function(ee,J){if(this.yy.parser)this.yy.parser.parseError(ee,J);else throw new Error(ee)},"parseError"),setInput:o(function(K,ee){return this.yy=ee||this.yy||{},this._input=K,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var K=this._input[0];this.yytext+=K,this.yyleng++,this.offset++,this.match+=K,this.matched+=K;var ee=K.match(/(?:\r\n?|\n).*/g);return ee?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),K},"input"),unput:o(function(K){var ee=K.length,J=K.split(/(?:\r\n?|\n)/g);this._input=K+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ee),this.offset-=ee;var H=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),J.length-1&&(this.yylineno-=J.length-1);var q=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:J?(J.length===H.length?this.yylloc.first_column:0)+H[H.length-J.length].length-J[0].length:this.yylloc.first_column-ee},this.options.ranges&&(this.yylloc.range=[q[0],q[0]+this.yyleng-ee]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(K){this.unput(this.match.slice(K))},"less"),pastInput:o(function(){var K=this.matched.substr(0,this.matched.length-this.match.length);return(K.length>20?"...":"")+K.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var K=this.match;return K.length<20&&(K+=this._input.substr(0,20-K.length)),(K.substr(0,20)+(K.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var K=this.pastInput(),ee=new Array(K.length+1).join("-");return K+this.upcomingInput()+` +`+ee+"^"},"showPosition"),test_match:o(function(K,ee){var J,H,q;if(this.options.backtrack_lexer&&(q={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(q.yylloc.range=this.yylloc.range.slice(0))),H=K[0].match(/(?:\r\n?|\n).*/g),H&&(this.yylineno+=H.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:H?H[H.length-1].length-H[H.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+K[0].length},this.yytext+=K[0],this.match+=K[0],this.matches=K,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(K[0].length),this.matched+=K[0],J=this.performAction.call(this,this.yy,this,ee,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),J)return J;if(this._backtrack){for(var Q in q)this[Q]=q[Q];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var K,ee,J,H;this._more||(this.yytext="",this.match="");for(var q=this._currentRules(),Q=0;Qee[0].length)){if(ee=J,H=Q,this.options.backtrack_lexer){if(K=this.test_match(J,q[Q]),K!==!1)return K;if(this._backtrack){ee=!1;continue}else return!1}else if(!this.options.flex)break}return ee?(K=this.test_match(ee,q[H]),K!==!1?K:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var ee=this.next();return ee||this.lex()},"lex"),begin:o(function(ee){this.conditionStack.push(ee)},"begin"),popState:o(function(){var ee=this.conditionStack.length-1;return ee>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(ee){return ee=this.conditionStack.length-1-Math.abs(ee||0),ee>=0?this.conditionStack[ee]:"INITIAL"},"topState"),pushState:o(function(ee){this.begin(ee)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(ee,J,H,q){var Q=q;switch(H){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 5;case 9:break;case 10:break;case 11:break;case 12:return 8;case 13:return 6;case 14:return 19;case 15:return 30;case 16:return 22;case 17:return 21;case 18:return 24;case 19:return 26;case 20:return 28;case 21:return 31;case 22:return 32;case 23:return 33;case 24:return 34;case 25:return 35;case 26:return 36;case 27:return 37;case 28:return 38;case 29:return 39;case 30:return 40;case 31:return 41;case 32:return 42;case 33:return 43;case 34:return 44;case 35:return 55;case 36:return 56;case 37:return 57;case 38:return 58;case 39:return 59;case 40:return 60;case 41:return 61;case 42:return 47;case 43:return 49;case 44:return 51;case 45:return 54;case 46:return 53;case 47:this.begin("string");break;case 48:this.popState();break;case 49:return"qString";case 50:return J.yytext=J.yytext.trim(),62;break}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[48,49],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,50],inclusive:!0}}};return oe}();W.lexer=Z;function j(){this.yy={}}return o(j,"Parser"),j.prototype=W,W.Parser=j,new j}();vO.parser=vO;kfe=vO});var xO,qs,Rx,Tf,Mx,YVe,qVe,XVe,jVe,KVe,QVe,ZVe,JVe,eUe,tUe,rUe,nUe,iUe,aUe,sUe,oUe,lUe,Sfe,Cfe=M(()=>{"use strict";Vt();ut();Ai();xO=[],qs={},Rx=new Map,Tf={},Mx=new Map,YVe={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},qVe={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},XVe={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},jVe={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},KVe=o((t,e)=>(Rx.has(t)||Rx.set(t,{name:t,type:e,id:qs.id,text:qs.text,risk:qs.risk,verifyMethod:qs.verifyMethod}),qs={},Rx.get(t)),"addRequirement"),QVe=o(()=>Rx,"getRequirements"),ZVe=o(t=>{qs!==void 0&&(qs.id=t)},"setNewReqId"),JVe=o(t=>{qs!==void 0&&(qs.text=t)},"setNewReqText"),eUe=o(t=>{qs!==void 0&&(qs.risk=t)},"setNewReqRisk"),tUe=o(t=>{qs!==void 0&&(qs.verifyMethod=t)},"setNewReqVerifyMethod"),rUe=o(t=>(Mx.has(t)||(Mx.set(t,{name:t,type:Tf.type,docRef:Tf.docRef}),Y.info("Added new requirement: ",t)),Tf={},Mx.get(t)),"addElement"),nUe=o(()=>Mx,"getElements"),iUe=o(t=>{Tf!==void 0&&(Tf.type=t)},"setNewElementType"),aUe=o(t=>{Tf!==void 0&&(Tf.docRef=t)},"setNewElementDocRef"),sUe=o((t,e,r)=>{xO.push({type:t,src:e,dst:r})},"addRelationship"),oUe=o(()=>xO,"getRelationships"),lUe=o(()=>{xO=[],qs={},Rx=new Map,Tf={},Mx=new Map,Lr()},"clear"),Sfe={RequirementType:YVe,RiskLevel:qVe,VerifyType:XVe,Relationships:jVe,getConfig:o(()=>pe().req,"getConfig"),addRequirement:KVe,getRequirements:QVe,setNewReqId:ZVe,setNewReqText:JVe,setNewReqRisk:eUe,setNewReqVerifyMethod:tUe,setAccTitle:Mr,getAccTitle:Br,setAccDescription:Fr,getAccDescription:zr,addElement:rUe,getElements:nUe,setNewElementType:iUe,setNewElementDocRef:aUe,addRelationship:sUe,getRelationships:oUe,clear:lUe}});var cUe,Afe,_fe=M(()=>{"use strict";cUe=o(t=>` + + marker { + fill: ${t.relationColor}; + stroke: ${t.relationColor}; + } + + marker.cross { + stroke: ${t.lineColor}; + } + + svg { + font-family: ${t.fontFamily}; + font-size: ${t.fontSize}; + } + + .reqBox { + fill: ${t.requirementBackground}; + fill-opacity: 1.0; + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + + .reqTitle, .reqLabel{ + fill: ${t.requirementTextColor}; + } + .reqLabelBox { + fill: ${t.relationLabelBackground}; + fill-opacity: 1.0; + } + + .req-title-line { + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + .relationshipLine { + stroke: ${t.relationColor}; + stroke-width: 1; + } + .relationshipLabel { + fill: ${t.relationLabelColor}; + } + +`,"getStyles"),Afe=cUe});var bO,uUe,wO,Lfe=M(()=>{"use strict";bO={CONTAINS:"contains",ARROW:"arrow"},uUe=o((t,e)=>{let r=t.append("defs").append("marker").attr("id",bO.CONTAINS+"_line_ending").attr("refX",0).attr("refY",e.line_height/2).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("g");r.append("circle").attr("cx",e.line_height/2).attr("cy",e.line_height/2).attr("r",e.line_height/2).attr("fill","none"),r.append("line").attr("x1",0).attr("x2",e.line_height).attr("y1",e.line_height/2).attr("y2",e.line_height/2).attr("stroke-width",1),r.append("line").attr("y1",0).attr("y2",e.line_height).attr("x1",e.line_height/2).attr("x2",e.line_height/2).attr("stroke-width",1),t.append("defs").append("marker").attr("id",bO.ARROW+"_line_ending").attr("refX",e.line_height).attr("refY",.5*e.line_height).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("path").attr("d",`M0,0 + L${e.line_height},${e.line_height/2} + M${e.line_height},${e.line_height/2} + L0,${e.line_height}`).attr("stroke-width",1)},"insertLineEndings"),wO={ReqMarkers:bO,insertLineEndings:uUe}});var hi,Dfe,Nfe,Rfe,Mfe,hUe,fUe,dUe,pUe,mUe,gUe,Kg,yUe,Ife,Ofe=M(()=>{"use strict";pr();Qv();Gs();Vt();ut();ai();fr();Lfe();hi={},Dfe=0,Nfe=o((t,e)=>t.insert("rect","#"+e).attr("class","req reqBox").attr("x",0).attr("y",0).attr("width",hi.rect_min_width+"px").attr("height",hi.rect_min_height+"px"),"newRectNode"),Rfe=o((t,e,r)=>{let n=hi.rect_min_width/2,i=t.append("text").attr("class","req reqLabel reqTitle").attr("id",e).attr("x",n).attr("y",hi.rect_padding).attr("dominant-baseline","hanging"),a=0;r.forEach(h=>{a==0?i.append("tspan").attr("text-anchor","middle").attr("x",hi.rect_min_width/2).attr("dy",0).text(h):i.append("tspan").attr("text-anchor","middle").attr("x",hi.rect_min_width/2).attr("dy",hi.line_height*.75).text(h),a++});let s=1.5*hi.rect_padding,l=a*hi.line_height*.75,u=s+l;return t.append("line").attr("class","req-title-line").attr("x1","0").attr("x2",hi.rect_min_width).attr("y1",u).attr("y2",u),{titleNode:i,y:u}},"newTitleNode"),Mfe=o((t,e,r,n)=>{let i=t.append("text").attr("class","req reqLabel").attr("id",e).attr("x",hi.rect_padding).attr("y",n).attr("dominant-baseline","hanging"),a=0,s=30,l=[];return r.forEach(u=>{let h=u.length;for(;h>s&&a<3;){let f=u.substring(0,s);u=u.substring(s,u.length),h=u.length,l[l.length]=f,a++}if(a==3){let f=l[l.length-1];l[l.length-1]=f.substring(0,f.length-4)+"..."}else l[l.length]=u;a=0}),l.forEach(u=>{i.append("tspan").attr("x",hi.rect_padding).attr("dy",hi.line_height).text(u)}),i},"newBodyNode"),hUe=o((t,e,r,n)=>{let i=e.node().getTotalLength(),a=e.node().getPointAtLength(i*.5),s="rel"+Dfe;Dfe++;let u=t.append("text").attr("class","req relationshipLabel").attr("id",s).attr("x",a.x).attr("y",a.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(n).node().getBBox();t.insert("rect","#"+s).attr("class","req reqLabelBox").attr("x",a.x-u.width/2).attr("y",a.y-u.height/2).attr("width",u.width).attr("height",u.height).attr("fill","white").attr("fill-opacity","85%")},"addEdgeLabel"),fUe=o(function(t,e,r,n,i){let a=r.edge(Kg(e.src),Kg(e.dst)),s=ns().x(function(u){return u.x}).y(function(u){return u.y}),l=t.insert("path","#"+n).attr("class","er relationshipLine").attr("d",s(a.points)).attr("fill","none");e.type==i.db.Relationships.CONTAINS?l.attr("marker-start","url("+qe.getUrl(hi.arrowMarkerAbsolute)+"#"+e.type+"_line_ending)"):(l.attr("stroke-dasharray","10,7"),l.attr("marker-end","url("+qe.getUrl(hi.arrowMarkerAbsolute)+"#"+wO.ReqMarkers.ARROW+"_line_ending)")),hUe(t,l,hi,`<<${e.type}>>`)},"drawRelationshipFromLayout"),dUe=o((t,e,r)=>{t.forEach((n,i)=>{i=Kg(i),Y.info("Added new requirement: ",i);let a=r.append("g").attr("id",i),s="req-"+i,l=Nfe(a,s),u=[],h=Rfe(a,i+"_title",[`<<${n.type}>>`,`${n.name}`]);u.push(h.titleNode);let f=Mfe(a,i+"_body",[`Id: ${n.id}`,`Text: ${n.text}`,`Risk: ${n.risk}`,`Verification: ${n.verifyMethod}`],h.y);u.push(f);let d=l.node().getBBox();e.setNode(i,{width:d.width,height:d.height,shape:"rect",id:i})})},"drawReqs"),pUe=o((t,e,r)=>{t.forEach((n,i)=>{let a=Kg(i),s=r.append("g").attr("id",a),l="element-"+a,u=Nfe(s,l),h=[],f=Rfe(s,l+"_title",["<>",`${i}`]);h.push(f.titleNode);let d=Mfe(s,l+"_body",[`Type: ${n.type||"Not Specified"}`,`Doc Ref: ${n.docRef||"None"}`],f.y);h.push(d);let p=u.node().getBBox();e.setNode(a,{width:p.width,height:p.height,shape:"rect",id:a})})},"drawElements"),mUe=o((t,e)=>(t.forEach(function(r){let n=Kg(r.src),i=Kg(r.dst);e.setEdge(n,i,{relationship:r})}),t),"addRelationships"),gUe=o(function(t,e){e.nodes().forEach(function(r){r!==void 0&&e.node(r)!==void 0&&(t.select("#"+r),t.select("#"+r).attr("transform","translate("+(e.node(r).x-e.node(r).width/2)+","+(e.node(r).y-e.node(r).height/2)+" )"))})},"adjustEntities"),Kg=o(t=>t.replace(/\s/g,"").replace(/\./g,"_"),"elementString"),yUe=o((t,e,r,n)=>{hi=pe().requirement;let i=hi.securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let l=(i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body")).select(`[id='${e}']`);wO.insertLineEndings(l,hi);let u=new Ir({multigraph:!1,compound:!1,directed:!0}).setGraph({rankdir:hi.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel(function(){return{}}),h=n.db.getRequirements(),f=n.db.getElements(),d=n.db.getRelationships();dUe(h,u,l),pUe(f,u,l),mUe(d,u),Gu(u),gUe(l,u),d.forEach(function(v){fUe(l,v,u,e,n)});let p=hi.rect_padding,m=l.node().getBBox(),g=m.width+p*2,y=m.height+p*2;Zr(l,y,g,hi.useMaxWidth),l.attr("viewBox",`${m.x-p} ${m.y-p} ${g} ${y}`)},"draw"),Ife={draw:yUe}});var Pfe={};vr(Pfe,{diagram:()=>vUe});var vUe,Bfe=M(()=>{"use strict";Efe();Cfe();_fe();Ofe();vUe={parser:kfe,db:Sfe,renderer:Ife,styles:Afe}});var TO,Gfe,$fe=M(()=>{"use strict";TO=function(){var t=o(function(H,q,Q,ae){for(Q=Q||{},ae=H.length;ae--;Q[H[ae]]=q);return Q},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,13],u=[1,14],h=[1,16],f=[1,17],d=[1,18],p=[1,24],m=[1,25],g=[1,26],y=[1,27],v=[1,28],x=[1,29],b=[1,30],w=[1,31],_=[1,32],T=[1,33],E=[1,34],L=[1,35],S=[1,36],A=[1,37],I=[1,38],D=[1,39],k=[1,41],R=[1,42],C=[1,43],O=[1,44],N=[1,45],P=[1,46],F=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,54,59,60,61,62,70],B=[4,5,16,50,52,53],G=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],z=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,54,59,60,61,62,70],W=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,54,59,60,61,62,70],Z=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,54,59,60,61,62,70],j=[68,69,70],oe=[1,122],K={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,note:54,placement:55,text2:56,over:57,actor_pair:58,links:59,link:60,properties:61,details:62,spaceList:63,",":64,left_of:65,right_of:66,signaltype:67,"+":68,"-":69,ACTOR:70,SOLID_OPEN_ARROW:71,DOTTED_OPEN_ARROW:72,SOLID_ARROW:73,BIDIRECTIONAL_SOLID_ARROW:74,DOTTED_ARROW:75,BIDIRECTIONAL_DOTTED_ARROW:76,SOLID_CROSS:77,DOTTED_CROSS:78,SOLID_POINT:79,DOTTED_POINT:80,TXT:81,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",54:"note",57:"over",59:"links",60:"link",61:"properties",62:"details",64:",",65:"left_of",66:"right_of",68:"+",69:"-",70:"ACTOR",71:"SOLID_OPEN_ARROW",72:"DOTTED_OPEN_ARROW",73:"SOLID_ARROW",74:"BIDIRECTIONAL_SOLID_ARROW",75:"DOTTED_ARROW",76:"BIDIRECTIONAL_DOTTED_ARROW",77:"SOLID_CROSS",78:"DOTTED_CROSS",79:"SOLID_POINT",80:"DOTTED_POINT",81:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[63,2],[63,1],[58,3],[58,1],[55,1],[55,1],[17,5],[17,5],[17,4],[22,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[56,1]],performAction:o(function(q,Q,ae,ue,ce,te,Ne){var se=te.length-1;switch(ce){case 3:return ue.apply(te[se]),te[se];break;case 4:case 9:this.$=[];break;case 5:case 10:te[se-1].push(te[se]),this.$=te[se-1];break;case 6:case 7:case 11:case 12:this.$=te[se];break;case 8:case 13:this.$=[];break;case 15:te[se].type="createParticipant",this.$=te[se];break;case 16:te[se-1].unshift({type:"boxStart",boxData:ue.parseBoxData(te[se-2])}),te[se-1].push({type:"boxEnd",boxText:te[se-2]}),this.$=te[se-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(te[se-2]),sequenceIndexStep:Number(te[se-1]),sequenceVisible:!0,signalType:ue.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(te[se-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:ue.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:ue.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:ue.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:ue.LINETYPE.ACTIVE_START,actor:te[se-1].actor};break;case 23:this.$={type:"activeEnd",signalType:ue.LINETYPE.ACTIVE_END,actor:te[se-1].actor};break;case 29:ue.setDiagramTitle(te[se].substring(6)),this.$=te[se].substring(6);break;case 30:ue.setDiagramTitle(te[se].substring(7)),this.$=te[se].substring(7);break;case 31:this.$=te[se].trim(),ue.setAccTitle(this.$);break;case 32:case 33:this.$=te[se].trim(),ue.setAccDescription(this.$);break;case 34:te[se-1].unshift({type:"loopStart",loopText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.LOOP_START}),te[se-1].push({type:"loopEnd",loopText:te[se-2],signalType:ue.LINETYPE.LOOP_END}),this.$=te[se-1];break;case 35:te[se-1].unshift({type:"rectStart",color:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.RECT_START}),te[se-1].push({type:"rectEnd",color:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.RECT_END}),this.$=te[se-1];break;case 36:te[se-1].unshift({type:"optStart",optText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.OPT_START}),te[se-1].push({type:"optEnd",optText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.OPT_END}),this.$=te[se-1];break;case 37:te[se-1].unshift({type:"altStart",altText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.ALT_START}),te[se-1].push({type:"altEnd",signalType:ue.LINETYPE.ALT_END}),this.$=te[se-1];break;case 38:te[se-1].unshift({type:"parStart",parText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.PAR_START}),te[se-1].push({type:"parEnd",signalType:ue.LINETYPE.PAR_END}),this.$=te[se-1];break;case 39:te[se-1].unshift({type:"parStart",parText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.PAR_OVER_START}),te[se-1].push({type:"parEnd",signalType:ue.LINETYPE.PAR_END}),this.$=te[se-1];break;case 40:te[se-1].unshift({type:"criticalStart",criticalText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.CRITICAL_START}),te[se-1].push({type:"criticalEnd",signalType:ue.LINETYPE.CRITICAL_END}),this.$=te[se-1];break;case 41:te[se-1].unshift({type:"breakStart",breakText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.BREAK_START}),te[se-1].push({type:"breakEnd",optText:ue.parseMessage(te[se-2]),signalType:ue.LINETYPE.BREAK_END}),this.$=te[se-1];break;case 43:this.$=te[se-3].concat([{type:"option",optionText:ue.parseMessage(te[se-1]),signalType:ue.LINETYPE.CRITICAL_OPTION},te[se]]);break;case 45:this.$=te[se-3].concat([{type:"and",parText:ue.parseMessage(te[se-1]),signalType:ue.LINETYPE.PAR_AND},te[se]]);break;case 47:this.$=te[se-3].concat([{type:"else",altText:ue.parseMessage(te[se-1]),signalType:ue.LINETYPE.ALT_ELSE},te[se]]);break;case 48:te[se-3].draw="participant",te[se-3].type="addParticipant",te[se-3].description=ue.parseMessage(te[se-1]),this.$=te[se-3];break;case 49:te[se-1].draw="participant",te[se-1].type="addParticipant",this.$=te[se-1];break;case 50:te[se-3].draw="actor",te[se-3].type="addParticipant",te[se-3].description=ue.parseMessage(te[se-1]),this.$=te[se-3];break;case 51:te[se-1].draw="actor",te[se-1].type="addParticipant",this.$=te[se-1];break;case 52:te[se-1].type="destroyParticipant",this.$=te[se-1];break;case 53:this.$=[te[se-1],{type:"addNote",placement:te[se-2],actor:te[se-1].actor,text:te[se]}];break;case 54:te[se-2]=[].concat(te[se-1],te[se-1]).slice(0,2),te[se-2][0]=te[se-2][0].actor,te[se-2][1]=te[se-2][1].actor,this.$=[te[se-1],{type:"addNote",placement:ue.PLACEMENT.OVER,actor:te[se-2].slice(0,2),text:te[se]}];break;case 55:this.$=[te[se-1],{type:"addLinks",actor:te[se-1].actor,text:te[se]}];break;case 56:this.$=[te[se-1],{type:"addALink",actor:te[se-1].actor,text:te[se]}];break;case 57:this.$=[te[se-1],{type:"addProperties",actor:te[se-1].actor,text:te[se]}];break;case 58:this.$=[te[se-1],{type:"addDetails",actor:te[se-1].actor,text:te[se]}];break;case 61:this.$=[te[se-2],te[se]];break;case 62:this.$=te[se];break;case 63:this.$=ue.PLACEMENT.LEFTOF;break;case 64:this.$=ue.PLACEMENT.RIGHTOF;break;case 65:this.$=[te[se-4],te[se-1],{type:"addMessage",from:te[se-4].actor,to:te[se-1].actor,signalType:te[se-3],msg:te[se],activate:!0},{type:"activeStart",signalType:ue.LINETYPE.ACTIVE_START,actor:te[se-1].actor}];break;case 66:this.$=[te[se-4],te[se-1],{type:"addMessage",from:te[se-4].actor,to:te[se-1].actor,signalType:te[se-3],msg:te[se]},{type:"activeEnd",signalType:ue.LINETYPE.ACTIVE_END,actor:te[se-4].actor}];break;case 67:this.$=[te[se-3],te[se-1],{type:"addMessage",from:te[se-3].actor,to:te[se-1].actor,signalType:te[se-2],msg:te[se]}];break;case 68:this.$={type:"addParticipant",actor:te[se]};break;case 69:this.$=ue.LINETYPE.SOLID_OPEN;break;case 70:this.$=ue.LINETYPE.DOTTED_OPEN;break;case 71:this.$=ue.LINETYPE.SOLID;break;case 72:this.$=ue.LINETYPE.BIDIRECTIONAL_SOLID;break;case 73:this.$=ue.LINETYPE.DOTTED;break;case 74:this.$=ue.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 75:this.$=ue.LINETYPE.SOLID_CROSS;break;case 76:this.$=ue.LINETYPE.DOTTED_CROSS;break;case 77:this.$=ue.LINETYPE.SOLID_POINT;break;case 78:this.$=ue.LINETYPE.DOTTED_POINT;break;case 79:this.$=ue.parseMessage(te[se].trim().substring(1));break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},t(F,[2,5]),{9:47,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},t(F,[2,7]),t(F,[2,8]),t(F,[2,14]),{12:48,50:A,52:I,53:D},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,70:P},{22:55,70:P},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(F,[2,29]),t(F,[2,30]),{32:[1,61]},{34:[1,62]},t(F,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,70:P},{22:72,70:P},{22:73,70:P},{67:74,71:[1,75],72:[1,76],73:[1,77],74:[1,78],75:[1,79],76:[1,80],77:[1,81],78:[1,82],79:[1,83],80:[1,84]},{55:85,57:[1,86],65:[1,87],66:[1,88]},{22:89,70:P},{22:90,70:P},{22:91,70:P},{22:92,70:P},t([5,51,64,71,72,73,74,75,76,77,78,79,80,81],[2,68]),t(F,[2,6]),t(F,[2,15]),t(B,[2,9],{10:93}),t(F,[2,17]),{5:[1,95],19:[1,94]},{5:[1,96]},t(F,[2,21]),{5:[1,97]},{5:[1,98]},t(F,[2,24]),t(F,[2,25]),t(F,[2,26]),t(F,[2,27]),t(F,[2,28]),t(F,[2,31]),t(F,[2,32]),t(G,i,{7:99}),t(G,i,{7:100}),t(G,i,{7:101}),t(z,i,{40:102,7:103}),t(W,i,{42:104,7:105}),t(W,i,{7:105,42:106}),t(Z,i,{45:107,7:108}),t(G,i,{7:109}),{5:[1,111],51:[1,110]},{5:[1,113],51:[1,112]},{5:[1,114]},{22:117,68:[1,115],69:[1,116],70:P},t(j,[2,69]),t(j,[2,70]),t(j,[2,71]),t(j,[2,72]),t(j,[2,73]),t(j,[2,74]),t(j,[2,75]),t(j,[2,76]),t(j,[2,77]),t(j,[2,78]),{22:118,70:P},{22:120,58:119,70:P},{70:[2,63]},{70:[2,64]},{56:121,81:oe},{56:123,81:oe},{56:124,81:oe},{56:125,81:oe},{4:[1,128],5:[1,130],11:127,12:129,16:[1,126],50:A,52:I,53:D},{5:[1,131]},t(F,[2,19]),t(F,[2,20]),t(F,[2,22]),t(F,[2,23]),{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,132],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,133],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,134],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},{16:[1,135]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,46],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,49:[1,136],50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},{16:[1,137]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,44],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,48:[1,138],50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},{16:[1,139]},{16:[1,140]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,42],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,47:[1,141],50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,142],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:_,41:T,43:E,44:L,46:S,50:A,52:I,53:D,54:k,59:R,60:C,61:O,62:N,70:P},{15:[1,143]},t(F,[2,49]),{15:[1,144]},t(F,[2,51]),t(F,[2,52]),{22:145,70:P},{22:146,70:P},{56:147,81:oe},{56:148,81:oe},{56:149,81:oe},{64:[1,150],81:[2,62]},{5:[2,55]},{5:[2,79]},{5:[2,56]},{5:[2,57]},{5:[2,58]},t(F,[2,16]),t(B,[2,10]),{12:151,50:A,52:I,53:D},t(B,[2,12]),t(B,[2,13]),t(F,[2,18]),t(F,[2,34]),t(F,[2,35]),t(F,[2,36]),t(F,[2,37]),{15:[1,152]},t(F,[2,38]),{15:[1,153]},t(F,[2,39]),t(F,[2,40]),{15:[1,154]},t(F,[2,41]),{5:[1,155]},{5:[1,156]},{56:157,81:oe},{56:158,81:oe},{5:[2,67]},{5:[2,53]},{5:[2,54]},{22:159,70:P},t(B,[2,11]),t(z,i,{7:103,40:160}),t(W,i,{7:105,42:161}),t(Z,i,{7:108,45:162}),t(F,[2,48]),t(F,[2,50]),{5:[2,65]},{5:[2,66]},{81:[2,61]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],87:[2,63],88:[2,64],121:[2,55],122:[2,79],123:[2,56],124:[2,57],125:[2,58],147:[2,67],148:[2,53],149:[2,54],157:[2,65],158:[2,66],159:[2,61],160:[2,47],161:[2,45],162:[2,43]},parseError:o(function(q,Q){if(Q.recoverable)this.trace(q);else{var ae=new Error(q);throw ae.hash=Q,ae}},"parseError"),parse:o(function(q){var Q=this,ae=[0],ue=[],ce=[null],te=[],Ne=this.table,se="",ke=0,Re=0,Ce=0,Pe=2,Ie=1,$e=te.slice.call(arguments,1),ye=Object.create(this.lexer),X={yy:{}};for(var fe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,fe)&&(X.yy[fe]=this.yy[fe]);ye.setInput(q,X.yy),X.yy.lexer=ye,X.yy.parser=this,typeof ye.yylloc>"u"&&(ye.yylloc={});var he=ye.yylloc;te.push(he);var ge=ye.options&&ye.options.ranges;typeof X.yy.parseError=="function"?this.parseError=X.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ne(kt){ae.length=ae.length-2*kt,ce.length=ce.length-kt,te.length=te.length-kt}o(ne,"popStack");function ve(){var kt;return kt=ue.pop()||ye.lex()||Ie,typeof kt!="number"&&(kt instanceof Array&&(ue=kt,kt=ue.pop()),kt=Q.symbols_[kt]||kt),kt}o(ve,"lex");for(var U,Te,ie,Ee,Ae,Ge,Be={},me,He,Oe,et;;){if(ie=ae[ae.length-1],this.defaultActions[ie]?Ee=this.defaultActions[ie]:((U===null||typeof U>"u")&&(U=ve()),Ee=Ne[ie]&&Ne[ie][U]),typeof Ee>"u"||!Ee.length||!Ee[0]){var bt="";et=[];for(me in Ne[ie])this.terminals_[me]&&me>Pe&&et.push("'"+this.terminals_[me]+"'");ye.showPosition?bt="Parse error on line "+(ke+1)+`: +`+ye.showPosition()+` +Expecting `+et.join(", ")+", got '"+(this.terminals_[U]||U)+"'":bt="Parse error on line "+(ke+1)+": Unexpected "+(U==Ie?"end of input":"'"+(this.terminals_[U]||U)+"'"),this.parseError(bt,{text:ye.match,token:this.terminals_[U]||U,line:ye.yylineno,loc:he,expected:et})}if(Ee[0]instanceof Array&&Ee.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ie+", token: "+U);switch(Ee[0]){case 1:ae.push(U),ce.push(ye.yytext),te.push(ye.yylloc),ae.push(Ee[1]),U=null,Te?(U=Te,Te=null):(Re=ye.yyleng,se=ye.yytext,ke=ye.yylineno,he=ye.yylloc,Ce>0&&Ce--);break;case 2:if(He=this.productions_[Ee[1]][1],Be.$=ce[ce.length-He],Be._$={first_line:te[te.length-(He||1)].first_line,last_line:te[te.length-1].last_line,first_column:te[te.length-(He||1)].first_column,last_column:te[te.length-1].last_column},ge&&(Be._$.range=[te[te.length-(He||1)].range[0],te[te.length-1].range[1]]),Ge=this.performAction.apply(Be,[se,Re,ke,X.yy,Ee[1],ce,te].concat($e)),typeof Ge<"u")return Ge;He&&(ae=ae.slice(0,-1*He*2),ce=ce.slice(0,-1*He),te=te.slice(0,-1*He)),ae.push(this.productions_[Ee[1]][0]),ce.push(Be.$),te.push(Be._$),Oe=Ne[ae[ae.length-2]][ae[ae.length-1]],ae.push(Oe);break;case 3:return!0}}return!0},"parse")},ee=function(){var H={EOF:1,parseError:o(function(Q,ae){if(this.yy.parser)this.yy.parser.parseError(Q,ae);else throw new Error(Q)},"parseError"),setInput:o(function(q,Q){return this.yy=Q||this.yy||{},this._input=q,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var q=this._input[0];this.yytext+=q,this.yyleng++,this.offset++,this.match+=q,this.matched+=q;var Q=q.match(/(?:\r\n?|\n).*/g);return Q?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),q},"input"),unput:o(function(q){var Q=q.length,ae=q.split(/(?:\r\n?|\n)/g);this._input=q+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Q),this.offset-=Q;var ue=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ae.length-1&&(this.yylineno-=ae.length-1);var ce=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ae?(ae.length===ue.length?this.yylloc.first_column:0)+ue[ue.length-ae.length].length-ae[0].length:this.yylloc.first_column-Q},this.options.ranges&&(this.yylloc.range=[ce[0],ce[0]+this.yyleng-Q]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(q){this.unput(this.match.slice(q))},"less"),pastInput:o(function(){var q=this.matched.substr(0,this.matched.length-this.match.length);return(q.length>20?"...":"")+q.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var q=this.match;return q.length<20&&(q+=this._input.substr(0,20-q.length)),(q.substr(0,20)+(q.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var q=this.pastInput(),Q=new Array(q.length+1).join("-");return q+this.upcomingInput()+` +`+Q+"^"},"showPosition"),test_match:o(function(q,Q){var ae,ue,ce;if(this.options.backtrack_lexer&&(ce={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ce.yylloc.range=this.yylloc.range.slice(0))),ue=q[0].match(/(?:\r\n?|\n).*/g),ue&&(this.yylineno+=ue.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ue?ue[ue.length-1].length-ue[ue.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+q[0].length},this.yytext+=q[0],this.match+=q[0],this.matches=q,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(q[0].length),this.matched+=q[0],ae=this.performAction.call(this,this.yy,this,Q,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ae)return ae;if(this._backtrack){for(var te in ce)this[te]=ce[te];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var q,Q,ae,ue;this._more||(this.yytext="",this.match="");for(var ce=this._currentRules(),te=0;teQ[0].length)){if(Q=ae,ue=te,this.options.backtrack_lexer){if(q=this.test_match(ae,ce[te]),q!==!1)return q;if(this._backtrack){Q=!1;continue}else return!1}else if(!this.options.flex)break}return Q?(q=this.test_match(Q,ce[ue]),q!==!1?q:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Q=this.next();return Q||this.lex()},"lex"),begin:o(function(Q){this.conditionStack.push(Q)},"begin"),popState:o(function(){var Q=this.conditionStack.length-1;return Q>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Q){return Q=this.conditionStack.length-1-Math.abs(Q||0),Q>=0?this.conditionStack[Q]:"INITIAL"},"topState"),pushState:o(function(Q){this.begin(Q)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(Q,ae,ue,ce){var te=ce;switch(ue){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 19;case 7:return this.begin("LINE"),14;break;case 8:return this.begin("ID"),50;break;case 9:return this.begin("ID"),52;break;case 10:return 13;case 11:return this.begin("ID"),53;break;case 12:return ae.yytext=ae.yytext.trim(),this.begin("ALIAS"),70;break;case 13:return this.popState(),this.popState(),this.begin("LINE"),51;break;case 14:return this.popState(),this.popState(),5;break;case 15:return this.begin("LINE"),36;break;case 16:return this.begin("LINE"),37;break;case 17:return this.begin("LINE"),38;break;case 18:return this.begin("LINE"),39;break;case 19:return this.begin("LINE"),49;break;case 20:return this.begin("LINE"),41;break;case 21:return this.begin("LINE"),43;break;case 22:return this.begin("LINE"),48;break;case 23:return this.begin("LINE"),44;break;case 24:return this.begin("LINE"),47;break;case 25:return this.begin("LINE"),46;break;case 26:return this.popState(),15;break;case 27:return 16;case 28:return 65;case 29:return 66;case 30:return 59;case 31:return 60;case 32:return 61;case 33:return 62;case 34:return 57;case 35:return 54;case 36:return this.begin("ID"),21;break;case 37:return this.begin("ID"),23;break;case 38:return 29;case 39:return 30;case 40:return this.begin("acc_title"),31;break;case 41:return this.popState(),"acc_title_value";break;case 42:return this.begin("acc_descr"),33;break;case 43:return this.popState(),"acc_descr_value";break;case 44:this.begin("acc_descr_multiline");break;case 45:this.popState();break;case 46:return"acc_descr_multiline_value";case 47:return 6;case 48:return 18;case 49:return 20;case 50:return 64;case 51:return 5;case 52:return ae.yytext=ae.yytext.trim(),70;break;case 53:return 73;case 54:return 74;case 55:return 75;case 56:return 76;case 57:return 71;case 58:return 72;case 59:return 77;case 60:return 78;case 61:return 79;case 62:return 80;case 63:return 81;case 64:return 68;case 65:return 69;case 66:return 5;case 67:return"INVALID"}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^\<->\->:\n,;]+?([\-]*[^\<->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\<->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\<->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[45,46],inclusive:!1},acc_descr:{rules:[43],inclusive:!1},acc_title:{rules:[41],inclusive:!1},ID:{rules:[2,3,12],inclusive:!1},ALIAS:{rules:[2,3,13,14],inclusive:!1},LINE:{rules:[2,3,26],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39,40,42,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67],inclusive:!0}}};return H}();K.lexer=ee;function J(){this.yy={}}return o(J,"Parser"),J.prototype=K,K.Parser=J,new J}();TO.parser=TO;Gfe=TO});function EO(t,e){if(t.links==null)t.links=e;else for(let r in e)t.links[r]=e[r]}function Yfe(t,e){if(t.properties==null)t.properties=e;else for(let r in e)t.properties[r]=e[r]}function UUe(){$t.records.currentBox=void 0}var $t,TUe,kO,kUe,EUe,wi,SUe,CUe,AUe,_Ue,LUe,DUe,NUe,Ox,RUe,MUe,IUe,OUe,PUe,Vfe,M0,BUe,FUe,zUe,Ix,GUe,$Ue,Ufe,Hfe,VUe,Wfe,qfe,HUe,Xfe,SO,jfe=M(()=>{"use strict";Vt();ut();dE();fr();Ai();$t=new vf(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0})),TUe=o(function(t){$t.records.boxes.push({name:t.text,wrap:t.wrap??M0(),fill:t.color,actorKeys:[]}),$t.records.currentBox=$t.records.boxes.slice(-1)[0]},"addBox"),kO=o(function(t,e,r,n){let i=$t.records.currentBox,a=$t.records.actors.get(t);if(a){if($t.records.currentBox&&a.box&&$t.records.currentBox!==a.box)throw new Error(`A same participant should only be defined in one Box: ${a.name} can't be in '${a.box.name}' and in '${$t.records.currentBox.name}' at the same time.`);if(i=a.box?a.box:$t.records.currentBox,a.box=i,a&&e===a.name&&r==null)return}if(r?.text==null&&(r={text:e,type:n}),(n==null||r.text==null)&&(r={text:e,type:n}),$t.records.actors.set(t,{box:i,name:e,description:r.text,wrap:r.wrap??M0(),prevActor:$t.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:n??"participant"}),$t.records.prevActor){let s=$t.records.actors.get($t.records.prevActor);s&&(s.nextActor=t)}$t.records.currentBox&&$t.records.currentBox.actorKeys.push(t),$t.records.prevActor=t},"addActor"),kUe=o(t=>{let e,r=0;if(!t)return 0;for(e=0;e<$t.records.messages.length;e++)$t.records.messages[e].type===Ix.ACTIVE_START&&$t.records.messages[e].from===t&&r++,$t.records.messages[e].type===Ix.ACTIVE_END&&$t.records.messages[e].from===t&&r--;return r},"activationCount"),EUe=o(function(t,e,r,n){$t.records.messages.push({from:t,to:e,message:r.text,wrap:r.wrap??M0(),answer:n})},"addMessage"),wi=o(function(t,e,r,n,i=!1){if(n===Ix.ACTIVE_END&&kUe(t??"")<1){let s=new Error("Trying to inactivate an inactive participant ("+t+")");throw s.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},s}return $t.records.messages.push({from:t,to:e,message:r?.text??"",wrap:r?.wrap??M0(),type:n,activate:i}),!0},"addSignal"),SUe=o(function(){return $t.records.boxes.length>0},"hasAtLeastOneBox"),CUe=o(function(){return $t.records.boxes.some(t=>t.name)},"hasAtLeastOneBoxWithTitle"),AUe=o(function(){return $t.records.messages},"getMessages"),_Ue=o(function(){return $t.records.boxes},"getBoxes"),LUe=o(function(){return $t.records.actors},"getActors"),DUe=o(function(){return $t.records.createdActors},"getCreatedActors"),NUe=o(function(){return $t.records.destroyedActors},"getDestroyedActors"),Ox=o(function(t){return $t.records.actors.get(t)},"getActor"),RUe=o(function(){return[...$t.records.actors.keys()]},"getActorKeys"),MUe=o(function(){$t.records.sequenceNumbersEnabled=!0},"enableSequenceNumbers"),IUe=o(function(){$t.records.sequenceNumbersEnabled=!1},"disableSequenceNumbers"),OUe=o(()=>$t.records.sequenceNumbersEnabled,"showSequenceNumbers"),PUe=o(function(t){$t.records.wrapEnabled=t},"setWrap"),Vfe=o(t=>{if(t===void 0)return{};t=t.trim();let e=/^:?wrap:/.exec(t)!==null?!0:/^:?nowrap:/.exec(t)!==null?!1:void 0;return{cleanedText:(e===void 0?t:t.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:e}},"extractWrap"),M0=o(()=>$t.records.wrapEnabled!==void 0?$t.records.wrapEnabled:pe().sequence?.wrap??!1,"autoWrap"),BUe=o(function(){$t.reset(),Lr()},"clear"),FUe=o(function(t){let e=t.trim(),{wrap:r,cleanedText:n}=Vfe(e),i={text:n,wrap:r};return Y.debug(`parseMessage: ${JSON.stringify(i)}`),i},"parseMessage"),zUe=o(function(t){let e=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(t),r=e?.[1]?e[1].trim():"transparent",n=e?.[2]?e[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",r)||(r="transparent",n=t.trim());else{let s=new Option().style;s.color=r,s.color!==r&&(r="transparent",n=t.trim())}let{wrap:i,cleanedText:a}=Vfe(n);return{text:a?kr(a,pe()):void 0,color:r,wrap:i}},"parseBoxData"),Ix={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34},GUe={FILLED:0,OPEN:1},$Ue={LEFTOF:0,RIGHTOF:1,OVER:2},Ufe=o(function(t,e,r){let n={actor:t,placement:e,message:r.text,wrap:r.wrap??M0()},i=[].concat(t,t);$t.records.notes.push(n),$t.records.messages.push({from:i[0],to:i[1],message:r.text,wrap:r.wrap??M0(),type:Ix.NOTE,placement:e})},"addNote"),Hfe=o(function(t,e){let r=Ox(t);try{let n=kr(e.text,pe());n=n.replace(/&/g,"&"),n=n.replace(/=/g,"=");let i=JSON.parse(n);EO(r,i)}catch(n){Y.error("error while parsing actor link text",n)}},"addLinks"),VUe=o(function(t,e){let r=Ox(t);try{let n={},i=kr(e.text,pe()),a=i.indexOf("@");i=i.replace(/&/g,"&"),i=i.replace(/=/g,"=");let s=i.slice(0,a-1).trim(),l=i.slice(a+1).trim();n[s]=l,EO(r,n)}catch(n){Y.error("error while parsing actor link text",n)}},"addALink");o(EO,"insertLinks");Wfe=o(function(t,e){let r=Ox(t);try{let n=kr(e.text,pe()),i=JSON.parse(n);Yfe(r,i)}catch(n){Y.error("error while parsing actor properties text",n)}},"addProperties");o(Yfe,"insertProperties");o(UUe,"boxEnd");qfe=o(function(t,e){let r=Ox(t),n=document.getElementById(e.text);try{let i=n.innerHTML,a=JSON.parse(i);a.properties&&Yfe(r,a.properties),a.links&&EO(r,a.links)}catch(i){Y.error("error while parsing actor details text",i)}},"addDetails"),HUe=o(function(t,e){if(t?.properties!==void 0)return t.properties[e]},"getActorProperty"),Xfe=o(function(t){if(Array.isArray(t))t.forEach(function(e){Xfe(e)});else switch(t.type){case"sequenceIndex":$t.records.messages.push({from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":kO(t.actor,t.actor,t.description,t.draw);break;case"createParticipant":if($t.records.actors.has(t.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");$t.records.lastCreated=t.actor,kO(t.actor,t.actor,t.description,t.draw),$t.records.createdActors.set(t.actor,$t.records.messages.length);break;case"destroyParticipant":$t.records.lastDestroyed=t.actor,$t.records.destroyedActors.set(t.actor,$t.records.messages.length);break;case"activeStart":wi(t.actor,void 0,void 0,t.signalType);break;case"activeEnd":wi(t.actor,void 0,void 0,t.signalType);break;case"addNote":Ufe(t.actor,t.placement,t.text);break;case"addLinks":Hfe(t.actor,t.text);break;case"addALink":VUe(t.actor,t.text);break;case"addProperties":Wfe(t.actor,t.text);break;case"addDetails":qfe(t.actor,t.text);break;case"addMessage":if($t.records.lastCreated){if(t.to!==$t.records.lastCreated)throw new Error("The created participant "+$t.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");$t.records.lastCreated=void 0}else if($t.records.lastDestroyed){if(t.to!==$t.records.lastDestroyed&&t.from!==$t.records.lastDestroyed)throw new Error("The destroyed participant "+$t.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");$t.records.lastDestroyed=void 0}wi(t.from,t.to,t.msg,t.signalType,t.activate);break;case"boxStart":TUe(t.boxData);break;case"boxEnd":UUe();break;case"loopStart":wi(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":wi(void 0,void 0,void 0,t.signalType);break;case"rectStart":wi(void 0,void 0,t.color,t.signalType);break;case"rectEnd":wi(void 0,void 0,void 0,t.signalType);break;case"optStart":wi(void 0,void 0,t.optText,t.signalType);break;case"optEnd":wi(void 0,void 0,void 0,t.signalType);break;case"altStart":wi(void 0,void 0,t.altText,t.signalType);break;case"else":wi(void 0,void 0,t.altText,t.signalType);break;case"altEnd":wi(void 0,void 0,void 0,t.signalType);break;case"setAccTitle":Mr(t.text);break;case"parStart":wi(void 0,void 0,t.parText,t.signalType);break;case"and":wi(void 0,void 0,t.parText,t.signalType);break;case"parEnd":wi(void 0,void 0,void 0,t.signalType);break;case"criticalStart":wi(void 0,void 0,t.criticalText,t.signalType);break;case"option":wi(void 0,void 0,t.optionText,t.signalType);break;case"criticalEnd":wi(void 0,void 0,void 0,t.signalType);break;case"breakStart":wi(void 0,void 0,t.breakText,t.signalType);break;case"breakEnd":wi(void 0,void 0,void 0,t.signalType);break}},"apply"),SO={addActor:kO,addMessage:EUe,addSignal:wi,addLinks:Hfe,addDetails:qfe,addProperties:Wfe,autoWrap:M0,setWrap:PUe,enableSequenceNumbers:MUe,disableSequenceNumbers:IUe,showSequenceNumbers:OUe,getMessages:AUe,getActors:LUe,getCreatedActors:DUe,getDestroyedActors:NUe,getActor:Ox,getActorKeys:RUe,getActorProperty:HUe,getAccTitle:Br,getBoxes:_Ue,getDiagramTitle:Jr,setDiagramTitle:cn,getConfig:o(()=>pe().sequence,"getConfig"),clear:BUe,parseMessage:FUe,parseBoxData:zUe,LINETYPE:Ix,ARROWTYPE:GUe,PLACEMENT:$Ue,addNote:Ufe,setAccTitle:Mr,apply:Xfe,setAccDescription:Fr,getAccDescription:zr,hasAtLeastOneBox:SUe,hasAtLeastOneBoxWithTitle:CUe}});var WUe,Kfe,Qfe=M(()=>{"use strict";WUe=o(t=>`.actor { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + + text.actor > tspan { + fill: ${t.actorTextColor}; + stroke: none; + } + + .actor-line { + stroke: ${t.actorLineColor}; + } + + .messageLine0 { + stroke-width: 1.5; + stroke-dasharray: none; + stroke: ${t.signalColor}; + } + + .messageLine1 { + stroke-width: 1.5; + stroke-dasharray: 2, 2; + stroke: ${t.signalColor}; + } + + #arrowhead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .sequenceNumber { + fill: ${t.sequenceNumberColor}; + } + + #sequencenumber { + fill: ${t.signalColor}; + } + + #crosshead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .messageText { + fill: ${t.signalTextColor}; + stroke: none; + } + + .labelBox { + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBkgColor}; + } + + .labelText, .labelText > tspan { + fill: ${t.labelTextColor}; + stroke: none; + } + + .loopText, .loopText > tspan { + fill: ${t.loopTextColor}; + stroke: none; + } + + .loopLine { + stroke-width: 2px; + stroke-dasharray: 2, 2; + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBorderColor}; + } + + .note { + //stroke: #decc93; + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + } + + .noteText, .noteText > tspan { + fill: ${t.noteTextColor}; + stroke: none; + } + + .activation0 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation1 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation2 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .actorPopupMenu { + position: absolute; + } + + .actorPopupMenuPanel { + position: absolute; + fill: ${t.actorBkg}; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); +} + .actor-man line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + .actor-man circle, line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + stroke-width: 2px; + } +`,"getStyles"),Kfe=WUe});var CO,kf,Jfe,ede,YUe,Zfe,AO,qUe,XUe,Px,I0,tde,Xc,_O,jUe,KUe,QUe,ZUe,JUe,eHe,tHe,rde,rHe,nHe,iHe,aHe,sHe,oHe,lHe,nde,cHe,LO,uHe,fi,ide=M(()=>{"use strict";fr();lv();hr();CO=Ji(Qp(),1);Za();kf=18*2,Jfe="actor-top",ede="actor-bottom",YUe="actor-box",Zfe="actor-man",AO=o(function(t,e){return Sd(t,e)},"drawRect"),qUe=o(function(t,e,r,n,i){if(e.links===void 0||e.links===null||Object.keys(e.links).length===0)return{height:0,width:0};let a=e.links,s=e.actorCnt,l=e.rectData;var u="none";i&&(u="block !important");let h=t.append("g");h.attr("id","actor"+s+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",u);var f="";l.class!==void 0&&(f=" "+l.class);let d=l.width>r?l.width:r,p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+f),p.attr("x",l.x),p.attr("y",l.height),p.attr("fill",l.fill),p.attr("stroke",l.stroke),p.attr("width",d),p.attr("height",l.height),p.attr("rx",l.rx),p.attr("ry",l.ry),a!=null){var m=20;for(let v in a){var g=h.append("a"),y=(0,CO.sanitizeUrl)(a[v]);g.attr("xlink:href",y),g.attr("target","_blank"),uHe(n)(v,g,l.x+10,l.height+m,d,20,{class:"actor"},n),m+=30}}return p.attr("height",m),{height:l.height+m,width:d}},"drawPopup"),XUe=o(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),Px=o(async function(t,e,r=null){let n=t.append("foreignObject"),i=await bh(e.text,Cr()),s=n.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(n.attr("height",Math.round(s.height)).attr("width",Math.round(s.width)),e.class==="noteText"){let l=t.node().firstChild;l.setAttribute("height",s.height+2*e.textMargin);let u=l.getBBox();n.attr("x",Math.round(u.x+u.width/2-s.width/2)).attr("y",Math.round(u.y+u.height/2-s.height/2))}else if(r){let{startx:l,stopx:u,starty:h}=r;if(l>u){let f=l;l=u,u=f}n.attr("x",Math.round(l+Math.abs(l-u)/2-s.width/2)),e.class==="loopText"?n.attr("y",Math.round(h)):n.attr("y",Math.round(h-s.height))}return[n]},"drawKatex"),I0=o(function(t,e){let r=0,n=0,i=e.text.split(qe.lineBreakRegex),[a,s]=Ho(e.fontSize),l=[],u=0,h=o(()=>e.y,"yfunc");if(e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0)switch(e.valign){case"top":case"start":h=o(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":h=o(()=>Math.round(e.y+(r+n+e.textMargin)/2),"yfunc");break;case"bottom":case"end":h=o(()=>Math.round(e.y+(r+n+2*e.textMargin)-e.textMargin),"yfunc");break}if(e.anchor!==void 0&&e.textMargin!==void 0&&e.width!==void 0)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle";break}for(let[f,d]of i.entries()){e.textMargin!==void 0&&e.textMargin===0&&a!==void 0&&(u=f*a);let p=t.append("text");p.attr("x",e.x),p.attr("y",h()),e.anchor!==void 0&&p.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),e.fontFamily!==void 0&&p.style("font-family",e.fontFamily),s!==void 0&&p.style("font-size",s),e.fontWeight!==void 0&&p.style("font-weight",e.fontWeight),e.fill!==void 0&&p.attr("fill",e.fill),e.class!==void 0&&p.attr("class",e.class),e.dy!==void 0?p.attr("dy",e.dy):u!==0&&p.attr("dy",u);let m=d||Z_;if(e.tspan){let g=p.append("tspan");g.attr("x",e.x),e.fill!==void 0&&g.attr("fill",e.fill),g.text(m)}else p.text(m);e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0&&(n+=(p._groups||p)[0][0].getBBox().height,r=n),l.push(p)}return l},"drawText"),tde=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");return n.attr("points",r(e.x,e.y,e.width,e.height,7)),n.attr("class","labelBox"),e.y=e.y+e.height/2,I0(t,e),n},"drawLabel"),Xc=-1,_O=o((t,e,r,n)=>{t.select&&r.forEach(i=>{let a=e.get(i),s=t.select("#actor"+a.actorCnt);!n.mirrorActors&&a.stopy?s.attr("y2",a.stopy+a.height/2):n.mirrorActors&&s.attr("y2",a.stopy)})},"fixLifeLineHeights"),jUe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Xc++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",XUe(`actor${Xc}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Xc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Xc,e.links!=null&&u.attr("id","root-"+Xc));let h=Nl();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${ede}`:f+=` ${Jfe}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.rx=3,h.ry=3,h.name=e.name;let d=AO(u,h);if(e.rectData=h,e.properties?.icon){let m=e.properties.icon.trim();m.charAt(0)==="@"?LY(u,h.x+h.width-20,h.y+10,m.substr(1)):_Y(u,h.x+h.width-20,h.y+10,m)}LO(r,yi(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${YUe}`},r);let p=e.height;if(d.node){let m=d.node().getBBox();e.height=m.height,p=m.height}return p},"drawActorTypeParticipant"),KUe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=t.append("g").lower();n||(Xc++,l.append("line").attr("id","actor"+Xc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Xc);let u=t.append("g"),h=Zfe;n?h+=` ${ede}`:h+=` ${Jfe}`,u.attr("class",h),u.attr("name",e.name);let f=Nl();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor",f.rx=3,f.ry=3,u.append("line").attr("id","actor-man-torso"+Xc).attr("x1",a).attr("y1",i+25).attr("x2",a).attr("y2",i+45),u.append("line").attr("id","actor-man-arms"+Xc).attr("x1",a-kf/2).attr("y1",i+33).attr("x2",a+kf/2).attr("y2",i+33),u.append("line").attr("x1",a-kf/2).attr("y1",i+60).attr("x2",a).attr("y2",i+45),u.append("line").attr("x1",a).attr("y1",i+45).attr("x2",a+kf/2-2).attr("y2",i+60);let d=u.append("circle");d.attr("cx",e.x+e.width/2),d.attr("cy",i+10),d.attr("r",15),d.attr("width",e.width),d.attr("height",e.height);let p=u.node().getBBox();return e.height=p.height,LO(r,yi(e.description))(e.description,u,f.x,f.y+35,f.width,f.height,{class:`actor ${Zfe}`},r),e.height},"drawActorTypeActor"),QUe=o(async function(t,e,r,n){switch(e.type){case"actor":return await KUe(t,e,r,n);case"participant":return await jUe(t,e,r,n)}},"drawActor"),ZUe=o(function(t,e,r){let i=t.append("g");rde(i,e),e.name&&LO(r)(e.name,i,e.x,e.y+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},r),i.lower()},"drawBox"),JUe=o(function(t){return t.append("g")},"anchorElement"),eHe=o(function(t,e,r,n,i){let a=Nl(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+i%3,a.width=e.stopx-e.startx,a.height=r-e.starty,AO(s,a)},"drawActivation"),tHe=o(async function(t,e,r,n){let{boxMargin:i,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:l,messageFontFamily:u,messageFontSize:h,messageFontWeight:f}=n,d=t.append("g"),p=o(function(y,v,x,b){return d.append("line").attr("x1",y).attr("y1",v).attr("x2",x).attr("y2",b).attr("class","loopLine")},"drawLoopLine");p(e.startx,e.starty,e.stopx,e.starty),p(e.stopx,e.starty,e.stopx,e.stopy),p(e.startx,e.stopy,e.stopx,e.stopy),p(e.startx,e.starty,e.startx,e.stopy),e.sections!==void 0&&e.sections.forEach(function(y){p(e.startx,y.y,e.stopx,y.y).style("stroke-dasharray","3, 3")});let m=ov();m.text=r,m.x=e.startx,m.y=e.starty,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.anchor="middle",m.valign="middle",m.tspan=!1,m.width=l||50,m.height=s||20,m.textMargin=a,m.class="labelText",tde(d,m),m=nde(),m.text=e.title,m.x=e.startx+l/2+(e.stopx-e.startx)/2,m.y=e.starty+i+a,m.anchor="middle",m.valign="middle",m.textMargin=a,m.class="loopText",m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=!0;let g=yi(m.text)?await Px(d,m,e):I0(d,m);if(e.sectionTitles!==void 0){for(let[y,v]of Object.entries(e.sectionTitles))if(v.message){m.text=v.message,m.x=e.startx+(e.stopx-e.startx)/2,m.y=e.sections[y].y+i+a,m.class="loopText",m.anchor="middle",m.valign="middle",m.tspan=!1,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=e.wrap,yi(m.text)?(e.starty=e.sections[y].y,await Px(d,m,e)):I0(d,m);let x=Math.round(g.map(b=>(b._groups||b)[0][0].getBBox().height).reduce((b,w)=>b+w));e.sections[y].height+=x-(i+a)}}return e.height=Math.round(e.stopy-e.starty),d},"drawLoop"),rde=o(function(t,e){i5(t,e)},"drawBackgroundRect"),rHe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),nHe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),iHe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),aHe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),sHe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),oHe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),lHe=o(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),nde=o(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),cHe=o(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),LO=function(){function t(a,s,l,u,h,f,d){let p=s.append("text").attr("x",l+h/2).attr("y",u+f/2+5).style("text-anchor","middle").text(a);i(p,d)}o(t,"byText");function e(a,s,l,u,h,f,d,p){let{actorFontSize:m,actorFontFamily:g,actorFontWeight:y}=p,[v,x]=Ho(m),b=a.split(qe.lineBreakRegex);for(let w=0;w{let s=O0(De),l=a.actorKeys.reduce((f,d)=>f+=t.get(d).width+(t.get(d).margin||0),0);l-=2*De.boxTextMargin,a.wrap&&(a.name=Ut.wrapLabel(a.name,l-2*De.wrapPadding,s));let u=Ut.calculateTextDimensions(a.name,s);i=qe.getMax(u.height,i);let h=qe.getMax(l,u.width+2*De.wrapPadding);if(a.margin=De.boxTextMargin,la.textMaxHeight=i),qe.getMax(n,De.height)}var De,nt,hHe,O0,Qg,DO,dHe,pHe,NO,sde,ode,IE,ade,gHe,vHe,bHe,wHe,THe,lde,cde=M(()=>{"use strict";pr();ide();ut();fr();lv();Vt();gp();hr();ai();De={},nt={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:o(function(){return Math.max.apply(null,this.actors.length===0?[0]:this.actors.map(t=>t.height||0))+(this.loops.length===0?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.messages.length===0?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.notes.length===0?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:o(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:o(function(t){this.boxes.push(t)},"addBox"),addActor:o(function(t){this.actors.push(t)},"addActor"),addLoop:o(function(t){this.loops.push(t)},"addLoop"),addMessage:o(function(t){this.messages.push(t)},"addMessage"),addNote:o(function(t){this.notes.push(t)},"addNote"),lastActor:o(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:o(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:o(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:o(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:o(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,ode(pe())},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=this,a=0;function s(l){return o(function(h){a++;let f=i.sequenceItems.length-a+1;i.updateVal(h,"starty",e-f*De.boxMargin,Math.min),i.updateVal(h,"stopy",n+f*De.boxMargin,Math.max),i.updateVal(nt.data,"startx",t-f*De.boxMargin,Math.min),i.updateVal(nt.data,"stopx",r+f*De.boxMargin,Math.max),l!=="activation"&&(i.updateVal(h,"startx",t-f*De.boxMargin,Math.min),i.updateVal(h,"stopx",r+f*De.boxMargin,Math.max),i.updateVal(nt.data,"starty",e-f*De.boxMargin,Math.min),i.updateVal(nt.data,"stopy",n+f*De.boxMargin,Math.max))},"updateItemBounds")}o(s,"updateFn"),this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},"updateBounds"),insert:o(function(t,e,r,n){let i=qe.getMin(t,r),a=qe.getMax(t,r),s=qe.getMin(e,n),l=qe.getMax(e,n);this.updateVal(nt.data,"startx",i,Math.min),this.updateVal(nt.data,"starty",s,Math.min),this.updateVal(nt.data,"stopx",a,Math.max),this.updateVal(nt.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),newActivation:o(function(t,e,r){let n=r.get(t.from),i=IE(t.from).length||0,a=n.x+n.width/2+(i-1)*De.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+De.activationWidth,stopy:void 0,actor:t.from,anchored:fi.anchorElement(e)})},"newActivation"),endActivation:o(function(t){let e=this.activations.map(function(r){return r.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:o(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:o(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:o(function(t){let e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:nt.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:o(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:o(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=qe.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return{bounds:this.data,models:this.models}},"getBounds")},hHe=o(async function(t,e){nt.bumpVerticalPos(De.boxMargin),e.height=De.boxMargin,e.starty=nt.getVerticalPos();let r=Nl();r.x=e.startx,r.y=e.starty,r.width=e.width||De.width,r.class="note";let n=t.append("g"),i=fi.drawRect(n,r),a=ov();a.x=e.startx,a.y=e.starty,a.width=r.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=De.noteFontFamily,a.fontSize=De.noteFontSize,a.fontWeight=De.noteFontWeight,a.anchor=De.noteAlign,a.textMargin=De.noteMargin,a.valign="center";let s=yi(a.text)?await Px(n,a):I0(n,a),l=Math.round(s.map(u=>(u._groups||u)[0][0].getBBox().height).reduce((u,h)=>u+h));i.attr("height",l+2*De.noteMargin),e.height+=l+2*De.noteMargin,nt.bumpVerticalPos(l+2*De.noteMargin),e.stopy=e.starty+l+2*De.noteMargin,e.stopx=e.startx+r.width,nt.insert(e.startx,e.starty,e.stopx,e.stopy),nt.models.addNote(e)},"drawNote"),O0=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),Qg=o(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),DO=o(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");o(fHe,"boundMessage");dHe=o(async function(t,e,r,n){let{startx:i,stopx:a,starty:s,message:l,type:u,sequenceIndex:h,sequenceVisible:f}=e,d=Ut.calculateTextDimensions(l,O0(De)),p=ov();p.x=i,p.y=s+10,p.width=a-i,p.class="messageText",p.dy="1em",p.text=l,p.fontFamily=De.messageFontFamily,p.fontSize=De.messageFontSize,p.fontWeight=De.messageFontWeight,p.anchor=De.messageAlign,p.valign="center",p.textMargin=De.wrapPadding,p.tspan=!1,yi(p.text)?await Px(t,p,{startx:i,stopx:a,starty:r}):I0(t,p);let m=d.width,g;i===a?De.rightAngles?g=t.append("path").attr("d",`M ${i},${r} H ${i+qe.getMax(De.width/2,m/2)} V ${r+25} H ${i}`):g=t.append("path").attr("d","M "+i+","+r+" C "+(i+60)+","+(r-10)+" "+(i+60)+","+(r+30)+" "+i+","+(r+20)):(g=t.append("line"),g.attr("x1",i),g.attr("y1",r),g.attr("x2",a),g.attr("y2",r)),u===n.db.LINETYPE.DOTTED||u===n.db.LINETYPE.DOTTED_CROSS||u===n.db.LINETYPE.DOTTED_POINT||u===n.db.LINETYPE.DOTTED_OPEN||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED?(g.style("stroke-dasharray","3, 3"),g.attr("class","messageLine1")):g.attr("class","messageLine0");let y="";De.arrowMarkerAbsolute&&(y=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,y=y.replace(/\(/g,"\\("),y=y.replace(/\)/g,"\\)")),g.attr("stroke-width",2),g.attr("stroke","none"),g.style("fill","none"),(u===n.db.LINETYPE.SOLID||u===n.db.LINETYPE.DOTTED)&&g.attr("marker-end","url("+y+"#arrowhead)"),(u===n.db.LINETYPE.BIDIRECTIONAL_SOLID||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(g.attr("marker-start","url("+y+"#arrowhead)"),g.attr("marker-end","url("+y+"#arrowhead)")),(u===n.db.LINETYPE.SOLID_POINT||u===n.db.LINETYPE.DOTTED_POINT)&&g.attr("marker-end","url("+y+"#filled-head)"),(u===n.db.LINETYPE.SOLID_CROSS||u===n.db.LINETYPE.DOTTED_CROSS)&&g.attr("marker-end","url("+y+"#crosshead)"),(f||De.showSequenceNumbers)&&(g.attr("marker-start","url("+y+"#sequencenumber)"),t.append("text").attr("x",i).attr("y",r+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(h))},"drawMessage"),pHe=o(function(t,e,r,n,i,a,s){let l=0,u=0,h,f=0;for(let d of n){let p=e.get(d),m=p.box;h&&h!=m&&(s||nt.models.addBox(h),u+=De.boxMargin+h.margin),m&&m!=h&&(s||(m.x=l+u,m.y=i),u+=m.margin),p.width=p.width||De.width,p.height=qe.getMax(p.height||De.height,De.height),p.margin=p.margin||De.actorMargin,f=qe.getMax(f,p.height),r.get(p.name)&&(u+=p.width/2),p.x=l+u,p.starty=nt.getVerticalPos(),nt.insert(p.x,i,p.x+p.width,p.height),l+=p.width+u,p.box&&(p.box.width=l+m.margin-p.box.x),u=p.margin,h=p.box,nt.models.addActor(p)}h&&!s&&nt.models.addBox(h),nt.bumpVerticalPos(f)},"addActorRenderingData"),NO=o(async function(t,e,r,n){if(n){let i=0;nt.bumpVerticalPos(De.boxMargin*2);for(let a of r){let s=e.get(a);s.stopy||(s.stopy=nt.getVerticalPos());let l=await fi.drawActor(t,s,De,!0);i=qe.getMax(i,l)}nt.bumpVerticalPos(i+De.boxMargin)}else for(let i of r){let a=e.get(i);await fi.drawActor(t,a,De,!1)}},"drawActors"),sde=o(function(t,e,r,n){let i=0,a=0;for(let s of r){let l=e.get(s),u=vHe(l),h=fi.drawPopup(t,l,u,De,De.forceMenus,n);h.height>i&&(i=h.height),h.width+l.x>a&&(a=h.width+l.x)}return{maxHeight:i,maxWidth:a}},"drawActorsPopup"),ode=o(function(t){Vn(De,t),t.fontFamily&&(De.actorFontFamily=De.noteFontFamily=De.messageFontFamily=t.fontFamily),t.fontSize&&(De.actorFontSize=De.noteFontSize=De.messageFontSize=t.fontSize),t.fontWeight&&(De.actorFontWeight=De.noteFontWeight=De.messageFontWeight=t.fontWeight)},"setConf"),IE=o(function(t){return nt.activations.filter(function(e){return e.actor===t})},"actorActivations"),ade=o(function(t,e){let r=e.get(t),n=IE(t),i=n.reduce(function(s,l){return qe.getMin(s,l.startx)},r.x+r.width/2-1),a=n.reduce(function(s,l){return qe.getMax(s,l.stopx)},r.x+r.width/2+1);return[i,a]},"activationBounds");o(jc,"adjustLoopHeightForWrap");o(mHe,"adjustCreatedDestroyedData");gHe=o(async function(t,e,r,n){let{securityLevel:i,sequence:a}=pe();De=a;let s;i==="sandbox"&&(s=Ve("#i"+e));let l=i==="sandbox"?Ve(s.nodes()[0].contentDocument.body):Ve("body"),u=i==="sandbox"?s.nodes()[0].contentDocument:document;nt.init(),Y.debug(n.db);let h=i==="sandbox"?l.select(`[id="${e}"]`):Ve(`[id="${e}"]`),f=n.db.getActors(),d=n.db.getCreatedActors(),p=n.db.getDestroyedActors(),m=n.db.getBoxes(),g=n.db.getActorKeys(),y=n.db.getMessages(),v=n.db.getDiagramTitle(),x=n.db.hasAtLeastOneBox(),b=n.db.hasAtLeastOneBoxWithTitle(),w=await yHe(f,y,n);if(De.height=await xHe(f,w,m),fi.insertComputerIcon(h),fi.insertDatabaseIcon(h),fi.insertClockIcon(h),x&&(nt.bumpVerticalPos(De.boxMargin),b&&nt.bumpVerticalPos(m[0].textMaxHeight)),De.hideUnusedParticipants===!0){let F=new Set;y.forEach(B=>{F.add(B.from),F.add(B.to)}),g=g.filter(B=>F.has(B))}pHe(h,f,d,g,0,y,!1);let _=await THe(y,f,w,n);fi.insertArrowHead(h),fi.insertArrowCrossHead(h),fi.insertArrowFilledHead(h),fi.insertSequenceNumber(h);function T(F,B){let G=nt.endActivation(F);G.starty+18>B&&(G.starty=B-6,B+=12),fi.drawActivation(h,G,B,De,IE(F.from).length),nt.insert(G.startx,B-10,G.stopx,B)}o(T,"activeEnd");let E=1,L=1,S=[],A=[],I=0;for(let F of y){let B,G,z;switch(F.type){case n.db.LINETYPE.NOTE:nt.resetVerticalPos(),G=F.noteModel,await hHe(h,G);break;case n.db.LINETYPE.ACTIVE_START:nt.newActivation(F,h,f);break;case n.db.LINETYPE.ACTIVE_END:T(F,nt.getVerticalPos());break;case n.db.LINETYPE.LOOP_START:jc(_,F,De.boxMargin,De.boxMargin+De.boxTextMargin,W=>nt.newLoop(W));break;case n.db.LINETYPE.LOOP_END:B=nt.endLoop(),await fi.drawLoop(h,B,"loop",De),nt.bumpVerticalPos(B.stopy-nt.getVerticalPos()),nt.models.addLoop(B);break;case n.db.LINETYPE.RECT_START:jc(_,F,De.boxMargin,De.boxMargin,W=>nt.newLoop(void 0,W.message));break;case n.db.LINETYPE.RECT_END:B=nt.endLoop(),A.push(B),nt.models.addLoop(B),nt.bumpVerticalPos(B.stopy-nt.getVerticalPos());break;case n.db.LINETYPE.OPT_START:jc(_,F,De.boxMargin,De.boxMargin+De.boxTextMargin,W=>nt.newLoop(W));break;case n.db.LINETYPE.OPT_END:B=nt.endLoop(),await fi.drawLoop(h,B,"opt",De),nt.bumpVerticalPos(B.stopy-nt.getVerticalPos()),nt.models.addLoop(B);break;case n.db.LINETYPE.ALT_START:jc(_,F,De.boxMargin,De.boxMargin+De.boxTextMargin,W=>nt.newLoop(W));break;case n.db.LINETYPE.ALT_ELSE:jc(_,F,De.boxMargin+De.boxTextMargin,De.boxMargin,W=>nt.addSectionToLoop(W));break;case n.db.LINETYPE.ALT_END:B=nt.endLoop(),await fi.drawLoop(h,B,"alt",De),nt.bumpVerticalPos(B.stopy-nt.getVerticalPos()),nt.models.addLoop(B);break;case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:jc(_,F,De.boxMargin,De.boxMargin+De.boxTextMargin,W=>nt.newLoop(W)),nt.saveVerticalPos();break;case n.db.LINETYPE.PAR_AND:jc(_,F,De.boxMargin+De.boxTextMargin,De.boxMargin,W=>nt.addSectionToLoop(W));break;case n.db.LINETYPE.PAR_END:B=nt.endLoop(),await fi.drawLoop(h,B,"par",De),nt.bumpVerticalPos(B.stopy-nt.getVerticalPos()),nt.models.addLoop(B);break;case n.db.LINETYPE.AUTONUMBER:E=F.message.start||E,L=F.message.step||L,F.message.visible?n.db.enableSequenceNumbers():n.db.disableSequenceNumbers();break;case n.db.LINETYPE.CRITICAL_START:jc(_,F,De.boxMargin,De.boxMargin+De.boxTextMargin,W=>nt.newLoop(W));break;case n.db.LINETYPE.CRITICAL_OPTION:jc(_,F,De.boxMargin+De.boxTextMargin,De.boxMargin,W=>nt.addSectionToLoop(W));break;case n.db.LINETYPE.CRITICAL_END:B=nt.endLoop(),await fi.drawLoop(h,B,"critical",De),nt.bumpVerticalPos(B.stopy-nt.getVerticalPos()),nt.models.addLoop(B);break;case n.db.LINETYPE.BREAK_START:jc(_,F,De.boxMargin,De.boxMargin+De.boxTextMargin,W=>nt.newLoop(W));break;case n.db.LINETYPE.BREAK_END:B=nt.endLoop(),await fi.drawLoop(h,B,"break",De),nt.bumpVerticalPos(B.stopy-nt.getVerticalPos()),nt.models.addLoop(B);break;default:try{z=F.msgModel,z.starty=nt.getVerticalPos(),z.sequenceIndex=E,z.sequenceVisible=n.db.showSequenceNumbers();let W=await fHe(h,z);mHe(F,z,W,I,f,d,p),S.push({messageModel:z,lineStartY:W}),nt.models.addMessage(z)}catch(W){Y.error("error while drawing message",W)}}[n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT,n.db.LINETYPE.BIDIRECTIONAL_SOLID,n.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(F.type)&&(E=E+L),I++}Y.debug("createdActors",d),Y.debug("destroyedActors",p),await NO(h,f,g,!1);for(let F of S)await dHe(h,F.messageModel,F.lineStartY,n);De.mirrorActors&&await NO(h,f,g,!0),A.forEach(F=>fi.drawBackgroundRect(h,F)),_O(h,f,g,De);for(let F of nt.models.boxes)F.height=nt.getVerticalPos()-F.y,nt.insert(F.x,F.y,F.x+F.width,F.height),F.startx=F.x,F.starty=F.y,F.stopx=F.startx+F.width,F.stopy=F.starty+F.height,F.stroke="rgb(0,0,0, 0.5)",fi.drawBox(h,F,De);x&&nt.bumpVerticalPos(De.boxMargin);let D=sde(h,f,g,u),{bounds:k}=nt.getBounds();k.startx===void 0&&(k.startx=0),k.starty===void 0&&(k.starty=0),k.stopx===void 0&&(k.stopx=0),k.stopy===void 0&&(k.stopy=0);let R=k.stopy-k.starty;R2,d=o(y=>l?-y:y,"adjustValue");t.from===t.to?h=u:(t.activate&&!f&&(h+=d(De.activationWidth/2-1)),[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(h+=d(3)),[r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(u-=d(3)));let p=[n,i,a,s],m=Math.abs(u-h);t.wrap&&t.message&&(t.message=Ut.wrapLabel(t.message,qe.getMax(m+2*De.wrapPadding,De.width),O0(De)));let g=Ut.calculateTextDimensions(t.message,O0(De));return{width:qe.getMax(t.wrap?0:g.width+2*De.wrapPadding,m+2*De.wrapPadding,De.width),height:0,startx:u,stopx:h,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,p),toBounds:Math.max.apply(null,p)}},"buildMessageModel"),THe=o(async function(t,e,r,n){let i={},a=[],s,l,u;for(let h of t){switch(h.id=Ut.random({length:10}),h.type){case n.db.LINETYPE.LOOP_START:case n.db.LINETYPE.ALT_START:case n.db.LINETYPE.OPT_START:case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:case n.db.LINETYPE.CRITICAL_START:case n.db.LINETYPE.BREAK_START:a.push({id:h.id,msg:h.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case n.db.LINETYPE.ALT_ELSE:case n.db.LINETYPE.PAR_AND:case n.db.LINETYPE.CRITICAL_OPTION:h.message&&(s=a.pop(),i[s.id]=s,i[h.id]=s,a.push(s));break;case n.db.LINETYPE.LOOP_END:case n.db.LINETYPE.ALT_END:case n.db.LINETYPE.OPT_END:case n.db.LINETYPE.PAR_END:case n.db.LINETYPE.CRITICAL_END:case n.db.LINETYPE.BREAK_END:s=a.pop(),i[s.id]=s;break;case n.db.LINETYPE.ACTIVE_START:{let d=e.get(h.from?h.from:h.to.actor),p=IE(h.from?h.from:h.to.actor).length,m=d.x+d.width/2+(p-1)*De.activationWidth/2,g={startx:m,stopx:m+De.activationWidth,actor:h.from,enabled:!0};nt.activations.push(g)}break;case n.db.LINETYPE.ACTIVE_END:{let d=nt.activations.map(p=>p.actor).lastIndexOf(h.from);nt.activations.splice(d,1).splice(0,1)}break}h.placement!==void 0?(l=await bHe(h,e,n),h.noteModel=l,a.forEach(d=>{s=d,s.from=qe.getMin(s.from,l.startx),s.to=qe.getMax(s.to,l.startx+l.width),s.width=qe.getMax(s.width,Math.abs(s.from-s.to))-De.labelBoxWidth})):(u=wHe(h,e,n),h.msgModel=u,u.startx&&u.stopx&&a.length>0&&a.forEach(d=>{if(s=d,u.startx===u.stopx){let p=e.get(h.from),m=e.get(h.to);s.from=qe.getMin(p.x-u.width/2,p.x-p.width/2,s.from),s.to=qe.getMax(m.x+u.width/2,m.x+p.width/2,s.to),s.width=qe.getMax(s.width,Math.abs(s.to-s.from))-De.labelBoxWidth}else s.from=qe.getMin(u.startx,s.from),s.to=qe.getMax(u.stopx,s.to),s.width=qe.getMax(s.width,u.width)-De.labelBoxWidth}))}return nt.activations=[],Y.debug("Loop type widths:",i),i},"calculateLoopBounds"),lde={bounds:nt,drawActors:NO,drawActorsPopup:sde,setConf:ode,draw:gHe}});var ude={};vr(ude,{diagram:()=>kHe});var kHe,hde=M(()=>{"use strict";$fe();jfe();Qfe();cde();kHe={parser:Gfe,db:SO,renderer:lde,styles:Kfe,init:o(({wrap:t})=>{SO.setWrap(t)},"init")}});var RO,OE,MO=M(()=>{"use strict";RO=function(){var t=o(function(X,fe,he,ge){for(he=he||{},ge=X.length;ge--;he[X[ge]]=fe);return he},"o"),e=[1,18],r=[1,19],n=[1,20],i=[1,41],a=[1,42],s=[1,26],l=[1,24],u=[1,25],h=[1,32],f=[1,33],d=[1,34],p=[1,45],m=[1,35],g=[1,36],y=[1,37],v=[1,38],x=[1,27],b=[1,28],w=[1,29],_=[1,30],T=[1,31],E=[1,44],L=[1,46],S=[1,43],A=[1,47],I=[1,9],D=[1,8,9],k=[1,58],R=[1,59],C=[1,60],O=[1,61],N=[1,62],P=[1,63],F=[1,64],B=[1,8,9,41],G=[1,76],z=[1,8,9,12,13,22,39,41,44,66,67,68,69,70,71,72,77,79],W=[1,8,9,12,13,17,20,22,39,41,44,48,58,66,67,68,69,70,71,72,77,79,84,99,101,102],Z=[13,58,84,99,101,102],j=[13,58,71,72,84,99,101,102],oe=[13,58,66,67,68,69,70,84,99,101,102],K=[1,98],ee=[1,115],J=[1,107],H=[1,113],q=[1,108],Q=[1,109],ae=[1,110],ue=[1,111],ce=[1,112],te=[1,114],Ne=[22,58,59,80,84,85,86,87,88,89],se=[1,8,9,39,41,44],ke=[1,8,9,22],Re=[1,143],Ce=[1,8,9,59],Pe=[1,8,9,22,58,59,80,84,85,86,87,88,89],Ie={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,DOT:17,className:18,classLiteralName:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,ANNOTATION_START:47,ANNOTATION_END:48,MEMBER:49,SEPARATOR:50,relation:51,NOTE_FOR:52,noteText:53,NOTE:54,CLASSDEF:55,classList:56,stylesOpt:57,ALPHA:58,COMMA:59,direction_tb:60,direction_bt:61,direction_rl:62,direction_lr:63,relationType:64,lineType:65,AGGREGATION:66,EXTENSION:67,COMPOSITION:68,DEPENDENCY:69,LOLLIPOP:70,LINE:71,DOTTED_LINE:72,CALLBACK:73,LINK:74,LINK_TARGET:75,CLICK:76,CALLBACK_NAME:77,CALLBACK_ARGS:78,HREF:79,STYLE:80,CSSCLASS:81,style:82,styleComponent:83,NUM:84,COLON:85,UNIT:86,SPACE:87,BRKT:88,PCT:89,commentToken:90,textToken:91,graphCodeTokens:92,textNoTagsToken:93,TAGSTART:94,TAGEND:95,"==":96,"--":97,DEFAULT:98,MINUS:99,keywords:100,UNICODE_TEXT:101,BQUOTE_STR:102,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",17:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",47:"ANNOTATION_START",48:"ANNOTATION_END",49:"MEMBER",50:"SEPARATOR",52:"NOTE_FOR",54:"NOTE",55:"CLASSDEF",58:"ALPHA",59:"COMMA",60:"direction_tb",61:"direction_bt",62:"direction_rl",63:"direction_lr",66:"AGGREGATION",67:"EXTENSION",68:"COMPOSITION",69:"DEPENDENCY",70:"LOLLIPOP",71:"LINE",72:"DOTTED_LINE",73:"CALLBACK",74:"LINK",75:"LINK_TARGET",76:"CLICK",77:"CALLBACK_NAME",78:"CALLBACK_ARGS",79:"HREF",80:"STYLE",81:"CSSCLASS",84:"NUM",85:"COLON",86:"UNIT",87:"SPACE",88:"BRKT",89:"PCT",92:"graphCodeTokens",94:"TAGSTART",95:"TAGEND",96:"==",97:"--",98:"DEFAULT",99:"MINUS",100:"keywords",101:"UNICODE_TEXT",102:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,3],[15,2],[18,1],[18,3],[18,1],[18,2],[18,2],[18,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,6],[43,2],[43,3],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[56,1],[56,3],[32,1],[32,1],[32,1],[32,1],[51,3],[51,2],[51,2],[51,1],[64,1],[64,1],[64,1],[64,1],[64,1],[65,1],[65,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[57,1],[57,3],[82,1],[82,2],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[90,1],[90,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[93,1],[93,1],[93,1],[93,1],[16,1],[16,1],[16,1],[16,1],[19,1],[53,1]],performAction:o(function(fe,he,ge,ne,ve,U,Te){var ie=U.length-1;switch(ve){case 8:this.$=U[ie-1];break;case 9:case 12:case 14:this.$=U[ie];break;case 10:case 13:this.$=U[ie-2]+"."+U[ie];break;case 11:case 15:this.$=U[ie-1]+U[ie];break;case 16:case 17:this.$=U[ie-1]+"~"+U[ie]+"~";break;case 18:ne.addRelation(U[ie]);break;case 19:U[ie-1].title=ne.cleanupLabel(U[ie]),ne.addRelation(U[ie-1]);break;case 30:this.$=U[ie].trim(),ne.setAccTitle(this.$);break;case 31:case 32:this.$=U[ie].trim(),ne.setAccDescription(this.$);break;case 33:ne.addClassesToNamespace(U[ie-3],U[ie-1]);break;case 34:ne.addClassesToNamespace(U[ie-4],U[ie-1]);break;case 35:this.$=U[ie],ne.addNamespace(U[ie]);break;case 36:this.$=[U[ie]];break;case 37:this.$=[U[ie-1]];break;case 38:U[ie].unshift(U[ie-2]),this.$=U[ie];break;case 40:ne.setCssClass(U[ie-2],U[ie]);break;case 41:ne.addMembers(U[ie-3],U[ie-1]);break;case 42:ne.setCssClass(U[ie-5],U[ie-3]),ne.addMembers(U[ie-5],U[ie-1]);break;case 43:this.$=U[ie],ne.addClass(U[ie]);break;case 44:this.$=U[ie-1],ne.addClass(U[ie-1]),ne.setClassLabel(U[ie-1],U[ie]);break;case 45:ne.addAnnotation(U[ie],U[ie-2]);break;case 46:case 59:this.$=[U[ie]];break;case 47:U[ie].push(U[ie-1]),this.$=U[ie];break;case 48:break;case 49:ne.addMember(U[ie-1],ne.cleanupLabel(U[ie]));break;case 50:break;case 51:break;case 52:this.$={id1:U[ie-2],id2:U[ie],relation:U[ie-1],relationTitle1:"none",relationTitle2:"none"};break;case 53:this.$={id1:U[ie-3],id2:U[ie],relation:U[ie-1],relationTitle1:U[ie-2],relationTitle2:"none"};break;case 54:this.$={id1:U[ie-3],id2:U[ie],relation:U[ie-2],relationTitle1:"none",relationTitle2:U[ie-1]};break;case 55:this.$={id1:U[ie-4],id2:U[ie],relation:U[ie-2],relationTitle1:U[ie-3],relationTitle2:U[ie-1]};break;case 56:ne.addNote(U[ie],U[ie-1]);break;case 57:ne.addNote(U[ie]);break;case 58:this.$=U[ie-2],ne.defineClass(U[ie-1],U[ie]);break;case 60:this.$=U[ie-2].concat([U[ie]]);break;case 61:ne.setDirection("TB");break;case 62:ne.setDirection("BT");break;case 63:ne.setDirection("RL");break;case 64:ne.setDirection("LR");break;case 65:this.$={type1:U[ie-2],type2:U[ie],lineType:U[ie-1]};break;case 66:this.$={type1:"none",type2:U[ie],lineType:U[ie-1]};break;case 67:this.$={type1:U[ie-1],type2:"none",lineType:U[ie]};break;case 68:this.$={type1:"none",type2:"none",lineType:U[ie]};break;case 69:this.$=ne.relationType.AGGREGATION;break;case 70:this.$=ne.relationType.EXTENSION;break;case 71:this.$=ne.relationType.COMPOSITION;break;case 72:this.$=ne.relationType.DEPENDENCY;break;case 73:this.$=ne.relationType.LOLLIPOP;break;case 74:this.$=ne.lineType.LINE;break;case 75:this.$=ne.lineType.DOTTED_LINE;break;case 76:case 82:this.$=U[ie-2],ne.setClickEvent(U[ie-1],U[ie]);break;case 77:case 83:this.$=U[ie-3],ne.setClickEvent(U[ie-2],U[ie-1]),ne.setTooltip(U[ie-2],U[ie]);break;case 78:this.$=U[ie-2],ne.setLink(U[ie-1],U[ie]);break;case 79:this.$=U[ie-3],ne.setLink(U[ie-2],U[ie-1],U[ie]);break;case 80:this.$=U[ie-3],ne.setLink(U[ie-2],U[ie-1]),ne.setTooltip(U[ie-2],U[ie]);break;case 81:this.$=U[ie-4],ne.setLink(U[ie-3],U[ie-2],U[ie]),ne.setTooltip(U[ie-3],U[ie-1]);break;case 84:this.$=U[ie-3],ne.setClickEvent(U[ie-2],U[ie-1],U[ie]);break;case 85:this.$=U[ie-4],ne.setClickEvent(U[ie-3],U[ie-2],U[ie-1]),ne.setTooltip(U[ie-3],U[ie]);break;case 86:this.$=U[ie-3],ne.setLink(U[ie-2],U[ie]);break;case 87:this.$=U[ie-4],ne.setLink(U[ie-3],U[ie-1],U[ie]);break;case 88:this.$=U[ie-4],ne.setLink(U[ie-3],U[ie-1]),ne.setTooltip(U[ie-3],U[ie]);break;case 89:this.$=U[ie-5],ne.setLink(U[ie-4],U[ie-2],U[ie]),ne.setTooltip(U[ie-4],U[ie-1]);break;case 90:this.$=U[ie-2],ne.setCssStyle(U[ie-1],U[ie]);break;case 91:ne.setCssClass(U[ie-1],U[ie]);break;case 92:this.$=[U[ie]];break;case 93:U[ie-2].push(U[ie]),this.$=U[ie-2];break;case 95:this.$=U[ie-1]+U[ie];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:w,80:_,81:T,84:E,99:L,101:S,102:A},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(I,[2,5],{8:[1,48]}),{8:[1,49]},t(D,[2,18],{22:[1,50]}),t(D,[2,20]),t(D,[2,21]),t(D,[2,22]),t(D,[2,23]),t(D,[2,24]),t(D,[2,25]),t(D,[2,26]),t(D,[2,27]),t(D,[2,28]),t(D,[2,29]),{34:[1,51]},{36:[1,52]},t(D,[2,32]),t(D,[2,48],{51:53,64:56,65:57,13:[1,54],22:[1,55],66:k,67:R,68:C,69:O,70:N,71:P,72:F}),{39:[1,65]},t(B,[2,39],{39:[1,67],44:[1,66]}),t(D,[2,50]),t(D,[2,51]),{16:68,58:p,84:E,99:L,101:S},{16:39,18:69,19:40,58:p,84:E,99:L,101:S,102:A},{16:39,18:70,19:40,58:p,84:E,99:L,101:S,102:A},{16:39,18:71,19:40,58:p,84:E,99:L,101:S,102:A},{58:[1,72]},{13:[1,73]},{16:39,18:74,19:40,58:p,84:E,99:L,101:S,102:A},{13:G,53:75},{56:77,58:[1,78]},t(D,[2,61]),t(D,[2,62]),t(D,[2,63]),t(D,[2,64]),t(z,[2,12],{16:39,19:40,18:80,17:[1,79],20:[1,81],58:p,84:E,99:L,101:S,102:A}),t(z,[2,14],{20:[1,82]}),{15:83,16:84,58:p,84:E,99:L,101:S},{16:39,18:85,19:40,58:p,84:E,99:L,101:S,102:A},t(W,[2,118]),t(W,[2,119]),t(W,[2,120]),t(W,[2,121]),t([1,8,9,12,13,20,22,39,41,44,66,67,68,69,70,71,72,77,79],[2,122]),t(I,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,18:21,38:22,43:23,16:39,19:40,5:86,33:e,35:r,37:n,42:i,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:w,80:_,81:T,84:E,99:L,101:S,102:A}),{5:87,10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:w,80:_,81:T,84:E,99:L,101:S,102:A},t(D,[2,19]),t(D,[2,30]),t(D,[2,31]),{13:[1,89],16:39,18:88,19:40,58:p,84:E,99:L,101:S,102:A},{51:90,64:56,65:57,66:k,67:R,68:C,69:O,70:N,71:P,72:F},t(D,[2,49]),{65:91,71:P,72:F},t(Z,[2,68],{64:92,66:k,67:R,68:C,69:O,70:N}),t(j,[2,69]),t(j,[2,70]),t(j,[2,71]),t(j,[2,72]),t(j,[2,73]),t(oe,[2,74]),t(oe,[2,75]),{8:[1,94],24:95,40:93,43:23,46:a},{16:96,58:p,84:E,99:L,101:S},{45:97,49:K},{48:[1,99]},{13:[1,100]},{13:[1,101]},{77:[1,102],79:[1,103]},{22:ee,57:104,58:J,80:H,82:105,83:106,84:q,85:Q,86:ae,87:ue,88:ce,89:te},{58:[1,116]},{13:G,53:117},t(D,[2,57]),t(D,[2,123]),{22:ee,57:118,58:J,59:[1,119],80:H,82:105,83:106,84:q,85:Q,86:ae,87:ue,88:ce,89:te},t(Ne,[2,59]),{16:39,18:120,19:40,58:p,84:E,99:L,101:S,102:A},t(z,[2,15]),t(z,[2,16]),t(z,[2,17]),{39:[2,35]},{15:122,16:84,17:[1,121],39:[2,9],58:p,84:E,99:L,101:S},t(se,[2,43],{11:123,12:[1,124]}),t(I,[2,7]),{9:[1,125]},t(ke,[2,52]),{16:39,18:126,19:40,58:p,84:E,99:L,101:S,102:A},{13:[1,128],16:39,18:127,19:40,58:p,84:E,99:L,101:S,102:A},t(Z,[2,67],{64:129,66:k,67:R,68:C,69:O,70:N}),t(Z,[2,66]),{41:[1,130]},{24:95,40:131,43:23,46:a},{8:[1,132],41:[2,36]},t(B,[2,40],{39:[1,133]}),{41:[1,134]},{41:[2,46],45:135,49:K},{16:39,18:136,19:40,58:p,84:E,99:L,101:S,102:A},t(D,[2,76],{13:[1,137]}),t(D,[2,78],{13:[1,139],75:[1,138]}),t(D,[2,82],{13:[1,140],78:[1,141]}),{13:[1,142]},t(D,[2,90],{59:Re}),t(Ce,[2,92],{83:144,22:ee,58:J,80:H,84:q,85:Q,86:ae,87:ue,88:ce,89:te}),t(Pe,[2,94]),t(Pe,[2,96]),t(Pe,[2,97]),t(Pe,[2,98]),t(Pe,[2,99]),t(Pe,[2,100]),t(Pe,[2,101]),t(Pe,[2,102]),t(Pe,[2,103]),t(Pe,[2,104]),t(D,[2,91]),t(D,[2,56]),t(D,[2,58],{59:Re}),{58:[1,145]},t(z,[2,13]),{15:146,16:84,58:p,84:E,99:L,101:S},{39:[2,11]},t(se,[2,44]),{13:[1,147]},{1:[2,4]},t(ke,[2,54]),t(ke,[2,53]),{16:39,18:148,19:40,58:p,84:E,99:L,101:S,102:A},t(Z,[2,65]),t(D,[2,33]),{41:[1,149]},{24:95,40:150,41:[2,37],43:23,46:a},{45:151,49:K},t(B,[2,41]),{41:[2,47]},t(D,[2,45]),t(D,[2,77]),t(D,[2,79]),t(D,[2,80],{75:[1,152]}),t(D,[2,83]),t(D,[2,84],{13:[1,153]}),t(D,[2,86],{13:[1,155],75:[1,154]}),{22:ee,58:J,80:H,82:156,83:106,84:q,85:Q,86:ae,87:ue,88:ce,89:te},t(Pe,[2,95]),t(Ne,[2,60]),{39:[2,10]},{14:[1,157]},t(ke,[2,55]),t(D,[2,34]),{41:[2,38]},{41:[1,158]},t(D,[2,81]),t(D,[2,85]),t(D,[2,87]),t(D,[2,88],{75:[1,159]}),t(Ce,[2,93],{83:144,22:ee,58:J,80:H,84:q,85:Q,86:ae,87:ue,88:ce,89:te}),t(se,[2,8]),t(B,[2,42]),t(D,[2,89])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,35],122:[2,11],125:[2,4],135:[2,47],146:[2,10],150:[2,38]},parseError:o(function(fe,he){if(he.recoverable)this.trace(fe);else{var ge=new Error(fe);throw ge.hash=he,ge}},"parseError"),parse:o(function(fe){var he=this,ge=[0],ne=[],ve=[null],U=[],Te=this.table,ie="",Ee=0,Ae=0,Ge=0,Be=2,me=1,He=U.slice.call(arguments,1),Oe=Object.create(this.lexer),et={yy:{}};for(var bt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,bt)&&(et.yy[bt]=this.yy[bt]);Oe.setInput(fe,et.yy),et.yy.lexer=Oe,et.yy.parser=this,typeof Oe.yylloc>"u"&&(Oe.yylloc={});var kt=Oe.yylloc;U.push(kt);var vt=Oe.options&&Oe.options.ranges;typeof et.yy.parseError=="function"?this.parseError=et.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function rt(yr){ge.length=ge.length-2*yr,ve.length=ve.length-yr,U.length=U.length-yr}o(rt,"popStack");function yt(){var yr;return yr=ne.pop()||Oe.lex()||me,typeof yr!="number"&&(yr instanceof Array&&(ne=yr,yr=ne.pop()),yr=he.symbols_[yr]||yr),yr}o(yt,"lex");for(var Ue,tt,ht,Et,er,dt,Je={},ct,Ct,pt,Bt;;){if(ht=ge[ge.length-1],this.defaultActions[ht]?Et=this.defaultActions[ht]:((Ue===null||typeof Ue>"u")&&(Ue=yt()),Et=Te[ht]&&Te[ht][Ue]),typeof Et>"u"||!Et.length||!Et[0]){var Tr="";Bt=[];for(ct in Te[ht])this.terminals_[ct]&&ct>Be&&Bt.push("'"+this.terminals_[ct]+"'");Oe.showPosition?Tr="Parse error on line "+(Ee+1)+`: +`+Oe.showPosition()+` +Expecting `+Bt.join(", ")+", got '"+(this.terminals_[Ue]||Ue)+"'":Tr="Parse error on line "+(Ee+1)+": Unexpected "+(Ue==me?"end of input":"'"+(this.terminals_[Ue]||Ue)+"'"),this.parseError(Tr,{text:Oe.match,token:this.terminals_[Ue]||Ue,line:Oe.yylineno,loc:kt,expected:Bt})}if(Et[0]instanceof Array&&Et.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ht+", token: "+Ue);switch(Et[0]){case 1:ge.push(Ue),ve.push(Oe.yytext),U.push(Oe.yylloc),ge.push(Et[1]),Ue=null,tt?(Ue=tt,tt=null):(Ae=Oe.yyleng,ie=Oe.yytext,Ee=Oe.yylineno,kt=Oe.yylloc,Ge>0&&Ge--);break;case 2:if(Ct=this.productions_[Et[1]][1],Je.$=ve[ve.length-Ct],Je._$={first_line:U[U.length-(Ct||1)].first_line,last_line:U[U.length-1].last_line,first_column:U[U.length-(Ct||1)].first_column,last_column:U[U.length-1].last_column},vt&&(Je._$.range=[U[U.length-(Ct||1)].range[0],U[U.length-1].range[1]]),dt=this.performAction.apply(Je,[ie,Ae,Ee,et.yy,Et[1],ve,U].concat(He)),typeof dt<"u")return dt;Ct&&(ge=ge.slice(0,-1*Ct*2),ve=ve.slice(0,-1*Ct),U=U.slice(0,-1*Ct)),ge.push(this.productions_[Et[1]][0]),ve.push(Je.$),U.push(Je._$),pt=Te[ge[ge.length-2]][ge[ge.length-1]],ge.push(pt);break;case 3:return!0}}return!0},"parse")},$e=function(){var X={EOF:1,parseError:o(function(he,ge){if(this.yy.parser)this.yy.parser.parseError(he,ge);else throw new Error(he)},"parseError"),setInput:o(function(fe,he){return this.yy=he||this.yy||{},this._input=fe,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var fe=this._input[0];this.yytext+=fe,this.yyleng++,this.offset++,this.match+=fe,this.matched+=fe;var he=fe.match(/(?:\r\n?|\n).*/g);return he?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),fe},"input"),unput:o(function(fe){var he=fe.length,ge=fe.split(/(?:\r\n?|\n)/g);this._input=fe+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-he),this.offset-=he;var ne=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ge.length-1&&(this.yylineno-=ge.length-1);var ve=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ge?(ge.length===ne.length?this.yylloc.first_column:0)+ne[ne.length-ge.length].length-ge[0].length:this.yylloc.first_column-he},this.options.ranges&&(this.yylloc.range=[ve[0],ve[0]+this.yyleng-he]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(fe){this.unput(this.match.slice(fe))},"less"),pastInput:o(function(){var fe=this.matched.substr(0,this.matched.length-this.match.length);return(fe.length>20?"...":"")+fe.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var fe=this.match;return fe.length<20&&(fe+=this._input.substr(0,20-fe.length)),(fe.substr(0,20)+(fe.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var fe=this.pastInput(),he=new Array(fe.length+1).join("-");return fe+this.upcomingInput()+` +`+he+"^"},"showPosition"),test_match:o(function(fe,he){var ge,ne,ve;if(this.options.backtrack_lexer&&(ve={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ve.yylloc.range=this.yylloc.range.slice(0))),ne=fe[0].match(/(?:\r\n?|\n).*/g),ne&&(this.yylineno+=ne.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ne?ne[ne.length-1].length-ne[ne.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+fe[0].length},this.yytext+=fe[0],this.match+=fe[0],this.matches=fe,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(fe[0].length),this.matched+=fe[0],ge=this.performAction.call(this,this.yy,this,he,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ge)return ge;if(this._backtrack){for(var U in ve)this[U]=ve[U];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var fe,he,ge,ne;this._more||(this.yytext="",this.match="");for(var ve=this._currentRules(),U=0;Uhe[0].length)){if(he=ge,ne=U,this.options.backtrack_lexer){if(fe=this.test_match(ge,ve[U]),fe!==!1)return fe;if(this._backtrack){he=!1;continue}else return!1}else if(!this.options.flex)break}return he?(fe=this.test_match(he,ve[ne]),fe!==!1?fe:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var he=this.next();return he||this.lex()},"lex"),begin:o(function(he){this.conditionStack.push(he)},"begin"),popState:o(function(){var he=this.conditionStack.length-1;return he>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(he){return he=this.conditionStack.length-1-Math.abs(he||0),he>=0?this.conditionStack[he]:"INITIAL"},"topState"),pushState:o(function(he){this.begin(he)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(he,ge,ne,ve){var U=ve;switch(ne){case 0:return 60;case 1:return 61;case 2:return 62;case 3:return 63;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 77;case 22:this.popState();break;case 23:return 78;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 80;case 28:return 55;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 81;case 50:return 73;case 51:return 74;case 52:return 76;case 53:return 52;case 54:return 54;case 55:return 47;case 56:return 48;case 57:return 79;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 75;case 65:return 75;case 66:return 75;case 67:return 75;case 68:return 67;case 69:return 67;case 70:return 69;case 71:return 69;case 72:return 68;case 73:return 66;case 74:return 70;case 75:return 71;case 76:return 72;case 77:return 22;case 78:return 44;case 79:return 99;case 80:return 17;case 81:return"PLUS";case 82:return 85;case 83:return 59;case 84:return 88;case 85:return 88;case 86:return 89;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 58;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 84;case 94:return 101;case 95:return 87;case 96:return 87;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return X}();Ie.lexer=$e;function ye(){this.yy={}}return o(ye,"Parser"),ye.prototype=Ie,Ie.Parser=ye,new ye}();RO.parser=RO;OE=RO});var pde,Bx,mde=M(()=>{"use strict";Vt();fr();pde=["#","+","~","-",""],Bx=class{static{o(this,"ClassMember")}constructor(e,r){this.memberType=r,this.visibility="",this.classifier="",this.text="";let n=kr(e,pe());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+yu(this.id);this.memberType==="method"&&(e+=`(${yu(this.parameters.trim())})`,this.returnType&&(e+=" : "+yu(this.returnType))),e=e.trim();let r=this.parseClassifier();return{displayText:e,cssStyle:r}}parseMember(e){let r="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let s=a[1]?a[1].trim():"";if(pde.includes(s)&&(this.visibility=s),this.id=a[2],this.parameters=a[3]?a[3].trim():"",r=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",r===""){let l=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(l)&&(r=l,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let i=e.length,a=e.substring(0,1),s=e.substring(i-1);pde.includes(a)&&(this.visibility=a),/[$*]/.exec(s)&&(r=s),this.id=e.substring(this.visibility===""?0:1,r===""?i:i-1)}this.classifier=r,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${yu(this.id)}${this.memberType==="method"?`(${yu(this.parameters)})${this.returnType?" : "+yu(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}}});function xde(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}var PE,BE,Nn,gde,Fx,Jg,yde,ql,IO,zx,P0,B0,AHe,Zg,vde,bde,_He,LHe,DHe,NHe,RHe,MHe,IHe,wde,OHe,PHe,BHe,OO,FHe,zHe,GHe,$He,VHe,UHe,HHe,WHe,Ef,Tde,PO,kde,YHe,qHe,XHe,jHe,KHe,QHe,ZHe,e1,BO=M(()=>{"use strict";pr();ut();Vt();fr();hr();Ai();mde();PE="classId-",BE=[],Nn=new Map,gde=new Map,Fx=[],Jg=[],yde=0,ql=new Map,IO=0,zx=[],P0=o(t=>qe.sanitizeText(t,pe()),"sanitizeText"),B0=o(function(t){let e=qe.sanitizeText(t,pe()),r="",n=e;if(e.indexOf("~")>0){let i=e.split("~");n=P0(i[0]),r=P0(i[1])}return{className:n,type:r}},"splitClassNameAndType"),AHe=o(function(t,e){let r=qe.sanitizeText(t,pe());e&&(e=P0(e));let{className:n}=B0(r);Nn.get(n).label=e,Nn.get(n).text=`${e}${Nn.get(n).type?`<${Nn.get(n).type}>`:""}`},"setClassLabel"),Zg=o(function(t){let e=qe.sanitizeText(t,pe()),{className:r,type:n}=B0(e);if(Nn.has(r))return;let i=qe.sanitizeText(r,pe());Nn.set(i,{id:i,type:n,label:i,text:`${i}${n?`<${n}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:PE+i+"-"+yde}),yde++},"addClass"),vde=o(function(t,e){let r={id:`interface${Jg.length}`,label:t,classId:e};Jg.push(r)},"addInterface"),bde=o(function(t){let e=qe.sanitizeText(t,pe());if(Nn.has(e))return Nn.get(e).domId;throw new Error("Class not found: "+e)},"lookUpDomId"),_He=o(function(){BE=[],Nn=new Map,Fx=[],Jg=[],zx=[],zx.push(Tde),ql=new Map,IO=0,PO="TB",Lr()},"clear"),LHe=o(function(t){return Nn.get(t)},"getClass"),DHe=o(function(){return Nn},"getClasses"),NHe=o(function(){return BE},"getRelations"),RHe=o(function(){return Fx},"getNotes"),MHe=o(function(t){Y.debug("Adding relation: "+JSON.stringify(t));let e=[Ef.LOLLIPOP,Ef.AGGREGATION,Ef.COMPOSITION,Ef.DEPENDENCY,Ef.EXTENSION];t.relation.type1===Ef.LOLLIPOP&&!e.includes(t.relation.type2)?(Zg(t.id2),vde(t.id1,t.id2),t.id1=`interface${Jg.length-1}`):t.relation.type2===Ef.LOLLIPOP&&!e.includes(t.relation.type1)?(Zg(t.id1),vde(t.id2,t.id1),t.id2=`interface${Jg.length-1}`):(Zg(t.id1),Zg(t.id2)),t.id1=B0(t.id1).className,t.id2=B0(t.id2).className,t.relationTitle1=qe.sanitizeText(t.relationTitle1.trim(),pe()),t.relationTitle2=qe.sanitizeText(t.relationTitle2.trim(),pe()),BE.push(t)},"addRelation"),IHe=o(function(t,e){let r=B0(t).className;Nn.get(r).annotations.push(e)},"addAnnotation"),wde=o(function(t,e){Zg(t);let r=B0(t).className,n=Nn.get(r);if(typeof e=="string"){let i=e.trim();i.startsWith("<<")&&i.endsWith(">>")?n.annotations.push(P0(i.substring(2,i.length-2))):i.indexOf(")")>0?n.methods.push(new Bx(i,"method")):i&&n.members.push(new Bx(i,"attribute"))}},"addMember"),OHe=o(function(t,e){Array.isArray(e)&&(e.reverse(),e.forEach(r=>wde(t,r)))},"addMembers"),PHe=o(function(t,e){let r={id:`note${Fx.length}`,class:e,text:t};Fx.push(r)},"addNote"),BHe=o(function(t){return t.startsWith(":")&&(t=t.substring(1)),P0(t.trim())},"cleanupLabel"),OO=o(function(t,e){t.split(",").forEach(function(r){let n=r;/\d/.exec(r[0])&&(n=PE+n);let i=Nn.get(n);i&&(i.cssClasses+=" "+e)})},"setCssClass"),FHe=o(function(t,e){for(let r of t){let n=gde.get(r);n===void 0&&(n={id:r,styles:[],textStyles:[]},gde.set(r,n)),e&&e.forEach(function(i){if(/color/.exec(i)){let a=i.replace("fill","bgFill");n.textStyles.push(a)}n.styles.push(i)}),Nn.forEach(i=>{i.cssClasses.includes(r)&&i.styles.push(...e.flatMap(a=>a.split(",")))})}},"defineClass"),zHe=o(function(t,e){t.split(",").forEach(function(r){e!==void 0&&(Nn.get(r).tooltip=P0(e))})},"setTooltip"),GHe=o(function(t,e){return e&&ql.has(e)?ql.get(e).classes.get(t).tooltip:Nn.get(t).tooltip},"getTooltip"),$He=o(function(t,e,r){let n=pe();t.split(",").forEach(function(i){let a=i;/\d/.exec(i[0])&&(a=PE+a);let s=Nn.get(a);s&&(s.link=Ut.formatUrl(e,n),n.securityLevel==="sandbox"?s.linkTarget="_top":typeof r=="string"?s.linkTarget=P0(r):s.linkTarget="_blank")}),OO(t,"clickable")},"setLink"),VHe=o(function(t,e,r){t.split(",").forEach(function(n){UHe(n,e,r),Nn.get(n).haveCallback=!0}),OO(t,"clickable")},"setClickEvent"),UHe=o(function(t,e,r){let n=qe.sanitizeText(t,pe());if(pe().securityLevel!=="loose"||e===void 0)return;let a=n;if(Nn.has(a)){let s=bde(a),l=[];if(typeof r=="string"){l=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let u=0;u")),i.classed("hover",!0)}).on("mouseout",function(){e.transition().duration(500).style("opacity",0),Ve(this).classed("hover",!1)})},"setupToolTips");zx.push(Tde);PO="TB",kde=o(()=>PO,"getDirection"),YHe=o(t=>{PO=t},"setDirection"),qHe=o(function(t){ql.has(t)||(ql.set(t,{id:t,classes:new Map,children:{},domId:PE+t+"-"+IO}),IO++)},"addNamespace"),XHe=o(function(t){return ql.get(t)},"getNamespace"),jHe=o(function(){return ql},"getNamespaces"),KHe=o(function(t,e){if(ql.has(t))for(let r of e){let{className:n}=B0(r);Nn.get(n).parent=t,ql.get(t).classes.set(n,Nn.get(n))}},"addClassesToNamespace"),QHe=o(function(t,e){let r=Nn.get(t);if(!(!e||!r))for(let n of e)n.includes(",")?r.styles.push(...n.split(",")):r.styles.push(n)},"setCssStyle");o(xde,"getArrowMarker");ZHe=o(()=>{let t=[],e=[],r=pe();for(let i of ql.keys()){let a=ql.get(i);if(a){let s={id:a.id,label:a.id,isGroup:!0,padding:r.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:r.look};t.push(s)}}for(let i of Nn.keys()){let a=Nn.get(i);if(a){let s=a;s.parentId=a.parent,s.look=r.look,t.push(s)}}let n=0;for(let i of Fx){n++;let a={id:i.id,label:i.text,isGroup:!1,shape:"note",padding:r.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${r.themeVariables.noteBkgColor}`,`stroke: ${r.themeVariables.noteBorderColor}`],look:r.look};t.push(a);let s=Nn.get(i.class)?.id??"";if(s){let l={id:`edgeNote${n}`,start:i.id,end:s,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:r.look};e.push(l)}}for(let i of Jg){let a={id:i.id,label:i.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:r.look};t.push(a)}n=0;for(let i of BE){n++;let a={id:C5(i.id1,i.id2,{prefix:"id",counter:n}),start:i.id1,end:i.id2,type:"normal",label:i.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:xde(i.relation.type1),arrowTypeEnd:xde(i.relation.type2),startLabelRight:i.relationTitle1==="none"?"":i.relationTitle1,endLabelLeft:i.relationTitle2==="none"?"":i.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:i.style||"",pattern:i.relation.lineType==1?"dashed":"solid",look:r.look};e.push(a)}return{nodes:t,edges:e,other:{},config:r,direction:kde()}},"getData"),e1={setAccTitle:Mr,getAccTitle:Br,getAccDescription:zr,setAccDescription:Fr,getConfig:o(()=>pe().class,"getConfig"),addClass:Zg,bindFunctions:HHe,clear:_He,getClass:LHe,getClasses:DHe,getNotes:RHe,addAnnotation:IHe,addNote:PHe,getRelations:NHe,addRelation:MHe,getDirection:kde,setDirection:YHe,addMember:wde,addMembers:OHe,cleanupLabel:BHe,lineType:WHe,relationType:Ef,setClickEvent:VHe,setCssClass:OO,defineClass:FHe,setLink:$He,getTooltip:GHe,setTooltip:zHe,lookUpDomId:bde,setDiagramTitle:cn,getDiagramTitle:Jr,setClassLabel:AHe,addNamespace:qHe,addClassesToNamespace:KHe,getNamespace:XHe,getNamespaces:jHe,setCssStyle:QHe,getData:ZHe}});var JHe,FE,FO=M(()=>{"use strict";JHe=o(t=>`g.classGroup text { + fill: ${t.nodeBorder||t.classText}; + stroke: none; + font-family: ${t.fontFamily}; + font-size: 10px; + + .title { + font-weight: bolder; + } + +} + +.nodeLabel, .edgeLabel { + color: ${t.classText}; +} +.edgeLabel .label rect { + fill: ${t.mainBkg}; +} +.label text { + fill: ${t.classText}; +} + +.labelBkg { + background: ${t.mainBkg}; +} +.edgeLabel .label span { + background: ${t.mainBkg}; +} + +.classTitle { + font-weight: bolder; +} +.node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + +.divider { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +g.clickable { + cursor: pointer; +} + +g.classGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.classGroup line { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +.classLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.classLabel .label { + fill: ${t.nodeBorder}; + font-size: 10px; +} + +.relation { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; +} + +.dashed-line{ + stroke-dasharray: 3; +} + +.dotted-line{ + stroke-dasharray: 1 2; +} + +#compositionStart, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#compositionEnd, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionStart, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionEnd, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationStart, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationEnd, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopStart, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopEnd, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +.edgeTerminals { + font-size: 11px; + line-height: initial; +} + +.classTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} +`,"getStyles"),FE=JHe});var eWe,tWe,rWe,zE,zO=M(()=>{"use strict";Vt();ut();ow();Jv();TT();hr();eWe=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),tWe=o(function(t,e){return e.db.getClasses()},"getClasses"),rWe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing class diagram (v3)",e);let{securityLevel:i,state:a,layout:s}=pe(),l=n.db.getData(),u=Am(e,i);l.type=n.type,l.layoutAlgorithm=wT(s),l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["aggregation","extension","composition","dependency","lollipop"],l.diagramId=e,await Qm(l,u);let h=8;Ut.insertTitle(u,"classDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Zm(u,h,"classDiagram",a?.useMaxWidth??!0)},"draw"),zE={getClasses:tWe,draw:rWe,getDir:eWe}});var Ede={};vr(Ede,{diagram:()=>nWe});var nWe,Sde=M(()=>{"use strict";MO();BO();FO();zO();nWe={parser:OE,db:e1,renderer:zE,styles:FE,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,e1.clear()},"init")}});var _de={};vr(_de,{diagram:()=>oWe});var oWe,Lde=M(()=>{"use strict";MO();BO();FO();zO();oWe={parser:OE,db:e1,renderer:zE,styles:FE,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,e1.clear()},"init")}});var GO,GE,$O=M(()=>{"use strict";GO=function(){var t=o(function(F,B,G,z){for(G=G||{},z=F.length;z--;G[F[z]]=B);return G},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,16],u=[1,17],h=[1,18],f=[1,19],d=[1,32],p=[1,20],m=[1,21],g=[1,22],y=[1,23],v=[1,24],x=[1,26],b=[1,27],w=[1,28],_=[1,29],T=[1,30],E=[1,31],L=[1,34],S=[1,35],A=[1,36],I=[1,37],D=[1,33],k=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],R=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],C=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],O={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,style:42,STYLE_IDS:43,STYLEDEF_STYLEOPTS:44,class:45,CLASSENTITY_IDS:46,STYLECLASS:47,direction_tb:48,direction_bt:49,direction_rl:50,direction_lr:51,eol:52,";":53,EDGE_STATE:54,STYLE_SEPARATOR:55,left_of:56,right_of:57,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"style",43:"STYLE_IDS",44:"STYLEDEF_STYLEOPTS",45:"class",46:"CLASSENTITY_IDS",47:"STYLECLASS",48:"direction_tb",49:"direction_bt",50:"direction_rl",51:"direction_lr",53:";",54:"EDGE_STATE",55:"STYLE_SEPARATOR",56:"left_of",57:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[52,1],[52,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:o(function(B,G,z,W,Z,j,oe){var K=j.length-1;switch(Z){case 3:return W.setRootDoc(j[K]),j[K];break;case 4:this.$=[];break;case 5:j[K]!="nl"&&(j[K-1].push(j[K]),this.$=j[K-1]);break;case 6:case 7:this.$=j[K];break;case 8:this.$="nl";break;case 12:this.$=j[K];break;case 13:let q=j[K-1];q.description=W.trimColon(j[K]),this.$=q;break;case 14:this.$={stmt:"relation",state1:j[K-2],state2:j[K]};break;case 15:let Q=W.trimColon(j[K]);this.$={stmt:"relation",state1:j[K-3],state2:j[K-1],description:Q};break;case 19:this.$={stmt:"state",id:j[K-3],type:"default",description:"",doc:j[K-1]};break;case 20:var ee=j[K],J=j[K-2].trim();if(j[K].match(":")){var H=j[K].split(":");ee=H[0],J=[J,H[1]]}this.$={stmt:"state",id:ee,type:"default",description:J};break;case 21:this.$={stmt:"state",id:j[K-3],type:"default",description:j[K-5],doc:j[K-1]};break;case 22:this.$={stmt:"state",id:j[K],type:"fork"};break;case 23:this.$={stmt:"state",id:j[K],type:"join"};break;case 24:this.$={stmt:"state",id:j[K],type:"choice"};break;case 25:this.$={stmt:"state",id:W.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:j[K-1].trim(),note:{position:j[K-2].trim(),text:j[K].trim()}};break;case 29:this.$=j[K].trim(),W.setAccTitle(this.$);break;case 30:case 31:this.$=j[K].trim(),W.setAccDescription(this.$);break;case 32:case 33:this.$={stmt:"classDef",id:j[K-1].trim(),classes:j[K].trim()};break;case 34:this.$={stmt:"style",id:j[K-1].trim(),styleClass:j[K].trim()};break;case 35:this.$={stmt:"applyClass",id:j[K-1].trim(),styleClass:j[K].trim()};break;case 36:W.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 37:W.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 38:W.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 39:W.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 42:case 43:this.$={stmt:"state",id:j[K].trim(),type:"default",description:""};break;case 44:this.$={stmt:"state",id:j[K-2].trim(),classes:[j[K].trim()],type:"default",description:""};break;case 45:this.$={stmt:"state",id:j[K-2].trim(),classes:[j[K].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:_,42:T,45:E,48:L,49:S,50:A,51:I,54:D},t(k,[2,5]),{9:38,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:_,42:T,45:E,48:L,49:S,50:A,51:I,54:D},t(k,[2,7]),t(k,[2,8]),t(k,[2,9]),t(k,[2,10]),t(k,[2,11]),t(k,[2,12],{14:[1,39],15:[1,40]}),t(k,[2,16]),{18:[1,41]},t(k,[2,18],{20:[1,42]}),{23:[1,43]},t(k,[2,22]),t(k,[2,23]),t(k,[2,24]),t(k,[2,25]),{30:44,31:[1,45],56:[1,46],57:[1,47]},t(k,[2,28]),{34:[1,48]},{36:[1,49]},t(k,[2,31]),{39:[1,50],41:[1,51]},{43:[1,52]},{46:[1,53]},t(R,[2,42],{55:[1,54]}),t(R,[2,43],{55:[1,55]}),t(k,[2,36]),t(k,[2,37]),t(k,[2,38]),t(k,[2,39]),t(k,[2,6]),t(k,[2,13]),{13:56,24:d,54:D},t(k,[2,17]),t(C,i,{7:57}),{24:[1,58]},{24:[1,59]},{23:[1,60]},{24:[2,46]},{24:[2,47]},t(k,[2,29]),t(k,[2,30]),{40:[1,61]},{40:[1,62]},{44:[1,63]},{47:[1,64]},{24:[1,65]},{24:[1,66]},t(k,[2,14],{14:[1,67]}),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,68],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:_,42:T,45:E,48:L,49:S,50:A,51:I,54:D},t(k,[2,20],{20:[1,69]}),{31:[1,70]},{24:[1,71]},t(k,[2,32]),t(k,[2,33]),t(k,[2,34]),t(k,[2,35]),t(R,[2,44]),t(R,[2,45]),t(k,[2,15]),t(k,[2,19]),t(C,i,{7:72}),t(k,[2,26]),t(k,[2,27]),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,73],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:_,42:T,45:E,48:L,49:S,50:A,51:I,54:D},t(k,[2,21])],defaultActions:{5:[2,1],6:[2,2],46:[2,46],47:[2,47]},parseError:o(function(B,G){if(G.recoverable)this.trace(B);else{var z=new Error(B);throw z.hash=G,z}},"parseError"),parse:o(function(B){var G=this,z=[0],W=[],Z=[null],j=[],oe=this.table,K="",ee=0,J=0,H=0,q=2,Q=1,ae=j.slice.call(arguments,1),ue=Object.create(this.lexer),ce={yy:{}};for(var te in this.yy)Object.prototype.hasOwnProperty.call(this.yy,te)&&(ce.yy[te]=this.yy[te]);ue.setInput(B,ce.yy),ce.yy.lexer=ue,ce.yy.parser=this,typeof ue.yylloc>"u"&&(ue.yylloc={});var Ne=ue.yylloc;j.push(Ne);var se=ue.options&&ue.options.ranges;typeof ce.yy.parseError=="function"?this.parseError=ce.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ke(Te){z.length=z.length-2*Te,Z.length=Z.length-Te,j.length=j.length-Te}o(ke,"popStack");function Re(){var Te;return Te=W.pop()||ue.lex()||Q,typeof Te!="number"&&(Te instanceof Array&&(W=Te,Te=W.pop()),Te=G.symbols_[Te]||Te),Te}o(Re,"lex");for(var Ce,Pe,Ie,$e,ye,X,fe={},he,ge,ne,ve;;){if(Ie=z[z.length-1],this.defaultActions[Ie]?$e=this.defaultActions[Ie]:((Ce===null||typeof Ce>"u")&&(Ce=Re()),$e=oe[Ie]&&oe[Ie][Ce]),typeof $e>"u"||!$e.length||!$e[0]){var U="";ve=[];for(he in oe[Ie])this.terminals_[he]&&he>q&&ve.push("'"+this.terminals_[he]+"'");ue.showPosition?U="Parse error on line "+(ee+1)+`: +`+ue.showPosition()+` +Expecting `+ve.join(", ")+", got '"+(this.terminals_[Ce]||Ce)+"'":U="Parse error on line "+(ee+1)+": Unexpected "+(Ce==Q?"end of input":"'"+(this.terminals_[Ce]||Ce)+"'"),this.parseError(U,{text:ue.match,token:this.terminals_[Ce]||Ce,line:ue.yylineno,loc:Ne,expected:ve})}if($e[0]instanceof Array&&$e.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ie+", token: "+Ce);switch($e[0]){case 1:z.push(Ce),Z.push(ue.yytext),j.push(ue.yylloc),z.push($e[1]),Ce=null,Pe?(Ce=Pe,Pe=null):(J=ue.yyleng,K=ue.yytext,ee=ue.yylineno,Ne=ue.yylloc,H>0&&H--);break;case 2:if(ge=this.productions_[$e[1]][1],fe.$=Z[Z.length-ge],fe._$={first_line:j[j.length-(ge||1)].first_line,last_line:j[j.length-1].last_line,first_column:j[j.length-(ge||1)].first_column,last_column:j[j.length-1].last_column},se&&(fe._$.range=[j[j.length-(ge||1)].range[0],j[j.length-1].range[1]]),X=this.performAction.apply(fe,[K,J,ee,ce.yy,$e[1],Z,j].concat(ae)),typeof X<"u")return X;ge&&(z=z.slice(0,-1*ge*2),Z=Z.slice(0,-1*ge),j=j.slice(0,-1*ge)),z.push(this.productions_[$e[1]][0]),Z.push(fe.$),j.push(fe._$),ne=oe[z[z.length-2]][z[z.length-1]],z.push(ne);break;case 3:return!0}}return!0},"parse")},N=function(){var F={EOF:1,parseError:o(function(G,z){if(this.yy.parser)this.yy.parser.parseError(G,z);else throw new Error(G)},"parseError"),setInput:o(function(B,G){return this.yy=G||this.yy||{},this._input=B,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var B=this._input[0];this.yytext+=B,this.yyleng++,this.offset++,this.match+=B,this.matched+=B;var G=B.match(/(?:\r\n?|\n).*/g);return G?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),B},"input"),unput:o(function(B){var G=B.length,z=B.split(/(?:\r\n?|\n)/g);this._input=B+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-G),this.offset-=G;var W=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),z.length-1&&(this.yylineno-=z.length-1);var Z=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:z?(z.length===W.length?this.yylloc.first_column:0)+W[W.length-z.length].length-z[0].length:this.yylloc.first_column-G},this.options.ranges&&(this.yylloc.range=[Z[0],Z[0]+this.yyleng-G]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(B){this.unput(this.match.slice(B))},"less"),pastInput:o(function(){var B=this.matched.substr(0,this.matched.length-this.match.length);return(B.length>20?"...":"")+B.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var B=this.match;return B.length<20&&(B+=this._input.substr(0,20-B.length)),(B.substr(0,20)+(B.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var B=this.pastInput(),G=new Array(B.length+1).join("-");return B+this.upcomingInput()+` +`+G+"^"},"showPosition"),test_match:o(function(B,G){var z,W,Z;if(this.options.backtrack_lexer&&(Z={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Z.yylloc.range=this.yylloc.range.slice(0))),W=B[0].match(/(?:\r\n?|\n).*/g),W&&(this.yylineno+=W.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:W?W[W.length-1].length-W[W.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+B[0].length},this.yytext+=B[0],this.match+=B[0],this.matches=B,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(B[0].length),this.matched+=B[0],z=this.performAction.call(this,this.yy,this,G,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),z)return z;if(this._backtrack){for(var j in Z)this[j]=Z[j];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var B,G,z,W;this._more||(this.yytext="",this.match="");for(var Z=this._currentRules(),j=0;jG[0].length)){if(G=z,W=j,this.options.backtrack_lexer){if(B=this.test_match(z,Z[j]),B!==!1)return B;if(this._backtrack){G=!1;continue}else return!1}else if(!this.options.flex)break}return G?(B=this.test_match(G,Z[W]),B!==!1?B:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var G=this.next();return G||this.lex()},"lex"),begin:o(function(G){this.conditionStack.push(G)},"begin"),popState:o(function(){var G=this.conditionStack.length-1;return G>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(G){return G=this.conditionStack.length-1-Math.abs(G||0),G>=0?this.conditionStack[G]:"INITIAL"},"topState"),pushState:o(function(G){this.begin(G)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(G,z,W,Z){var j=Z;switch(W){case 0:return 41;case 1:return 48;case 2:return 49;case 3:return 50;case 4:return 51;case 5:break;case 6:break;case 7:return 5;case 8:break;case 9:break;case 10:break;case 11:break;case 12:return this.pushState("SCALE"),17;break;case 13:return 18;case 14:this.popState();break;case 15:return this.begin("acc_title"),33;break;case 16:return this.popState(),"acc_title_value";break;case 17:return this.begin("acc_descr"),35;break;case 18:return this.popState(),"acc_descr_value";break;case 19:this.begin("acc_descr_multiline");break;case 20:this.popState();break;case 21:return"acc_descr_multiline_value";case 22:return this.pushState("CLASSDEF"),38;break;case 23:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 24:return this.popState(),this.pushState("CLASSDEFID"),39;break;case 25:return this.popState(),40;break;case 26:return this.pushState("CLASS"),45;break;case 27:return this.popState(),this.pushState("CLASS_STYLE"),46;break;case 28:return this.popState(),47;break;case 29:return this.pushState("STYLE"),42;break;case 30:return this.popState(),this.pushState("STYLEDEF_STYLES"),43;break;case 31:return this.popState(),44;break;case 32:return this.pushState("SCALE"),17;break;case 33:return 18;case 34:this.popState();break;case 35:this.pushState("STATE");break;case 36:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),25;break;case 37:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),26;break;case 38:return this.popState(),z.yytext=z.yytext.slice(0,-10).trim(),27;break;case 39:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),z.yytext=z.yytext.slice(0,-10).trim(),27;break;case 42:return 48;case 43:return 49;case 44:return 50;case 45:return 51;case 46:this.pushState("STATE_STRING");break;case 47:return this.pushState("STATE_ID"),"AS";break;case 48:return this.popState(),"ID";break;case 49:this.popState();break;case 50:return"STATE_DESCR";case 51:return 19;case 52:this.popState();break;case 53:return this.popState(),this.pushState("struct"),20;break;case 54:break;case 55:return this.popState(),21;break;case 56:break;case 57:return this.begin("NOTE"),29;break;case 58:return this.popState(),this.pushState("NOTE_ID"),56;break;case 59:return this.popState(),this.pushState("NOTE_ID"),57;break;case 60:this.popState(),this.pushState("FLOATING_NOTE");break;case 61:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 62:break;case 63:return"NOTE_TEXT";case 64:return this.popState(),"ID";break;case 65:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 66:return this.popState(),z.yytext=z.yytext.substr(2).trim(),31;break;case 67:return this.popState(),z.yytext=z.yytext.slice(0,-8).trim(),31;break;case 68:return 6;case 69:return 6;case 70:return 16;case 71:return 54;case 72:return 24;case 73:return z.yytext=z.yytext.trim(),14;break;case 74:return 15;case 75:return 28;case 76:return 55;case 77:return 5;case 78:return"INVALID"}},"anonymous"),rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[9,10],inclusive:!1},struct:{rules:[9,10,22,26,29,35,42,43,44,45,54,55,56,57,71,72,73,74,75],inclusive:!1},FLOATING_NOTE_ID:{rules:[64],inclusive:!1},FLOATING_NOTE:{rules:[61,62,63],inclusive:!1},NOTE_TEXT:{rules:[66,67],inclusive:!1},NOTE_ID:{rules:[65],inclusive:!1},NOTE:{rules:[58,59,60],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[31],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[30],inclusive:!1},CLASS_STYLE:{rules:[28],inclusive:!1},CLASS:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[25],inclusive:!1},CLASSDEF:{rules:[23,24],inclusive:!1},acc_descr_multiline:{rules:[20,21],inclusive:!1},acc_descr:{rules:[18],inclusive:!1},acc_title:{rules:[16],inclusive:!1},SCALE:{rules:[13,14,33,34],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[48],inclusive:!1},STATE_STRING:{rules:[49,50],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[9,10,36,37,38,39,40,41,46,47,51,52,53],inclusive:!1},ID:{rules:[9,10],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,10,11,12,15,17,19,22,26,29,32,35,53,57,68,69,70,71,72,73,74,76,77,78],inclusive:!0}}};return F}();O.lexer=N;function P(){this.yy={}}return o(P,"Parser"),P.prototype=O,O.Parser=P,new P}();GO.parser=GO;GE=GO});var Rde,$E,t1,Gx,Mde,Ide,Ode,F0,VE,VO,UO,HO,WO,YO,UE,HE,Pde,Bde,qO,XO,Fde,zde,r1,hWe,Gde,jO,fWe,dWe,$de,Vde,pWe,Ude,mWe,Hde,KO,QO,Wde,WE,Yde,ZO,YE=M(()=>{"use strict";Rde="LR",$E="TB",t1="state",Gx="relation",Mde="classDef",Ide="style",Ode="applyClass",F0="default",VE="divider",VO="fill:none",UO="fill: #333",HO="c",WO="text",YO="normal",UE="rect",HE="rectWithTitle",Pde="stateStart",Bde="stateEnd",qO="divider",XO="roundedWithTitle",Fde="note",zde="noteGroup",r1="statediagram",hWe="state",Gde=`${r1}-${hWe}`,jO="transition",fWe="note",dWe="note-edge",$de=`${jO} ${dWe}`,Vde=`${r1}-${fWe}`,pWe="cluster",Ude=`${r1}-${pWe}`,mWe="cluster-alt",Hde=`${r1}-${mWe}`,KO="parent",QO="note",Wde="state",WE="----",Yde=`${WE}${QO}`,ZO=`${WE}${KO}`});function JO(t="",e=0,r="",n=WE){let i=r!==null&&r.length>0?`${n}${r}`:"";return`${Wde}-${t}${i}-${e}`}function qE(t,e,r){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(i=>{if(r.get(i)){let a=r.get(i);e.cssCompiledStyles=[...e.cssCompiledStyles,...a.styles]}}));let n=t.find(i=>i.id===e.id);n?Object.assign(n,e):t.push(e)}function yWe(t){return t?.classes?.join(" ")??""}function vWe(t){return t?.styles??[]}var XE,Sf,gWe,qde,n1,Xde,jde=M(()=>{"use strict";Vt();ut();fr();YE();XE=new Map,Sf=0;o(JO,"stateDomId");gWe=o((t,e,r,n,i,a,s,l)=>{Y.trace("items",e),e.forEach(u=>{switch(u.stmt){case t1:n1(t,u,r,n,i,a,s,l);break;case F0:n1(t,u,r,n,i,a,s,l);break;case Gx:{n1(t,u.state1,r,n,i,a,s,l),n1(t,u.state2,r,n,i,a,s,l);let h={id:"edge"+Sf,start:u.state1.id,end:u.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:VO,labelStyle:"",label:qe.sanitizeText(u.description,pe()),arrowheadStyle:UO,labelpos:HO,labelType:WO,thickness:YO,classes:jO,look:s};i.push(h),Sf++}break}})},"setupDoc"),qde=o((t,e=$E)=>{let r=e;if(t.doc)for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir");o(qE,"insertOrUpdateNode");o(yWe,"getClassesFromDbInfo");o(vWe,"getStylesFromDbInfo");n1=o((t,e,r,n,i,a,s,l)=>{let u=e.id,h=r.get(u),f=yWe(h),d=vWe(h);if(Y.info("dataFetcher parsedItem",e,h,d),u!=="root"){let p=UE;e.start===!0?p=Pde:e.start===!1&&(p=Bde),e.type!==F0&&(p=e.type),XE.get(u)||XE.set(u,{id:u,shape:p,description:qe.sanitizeText(u,pe()),cssClasses:`${f} ${Gde}`,cssStyles:d});let m=XE.get(u);e.description&&(Array.isArray(m.description)?(m.shape=HE,m.description.push(e.description)):m.description?.length>0?(m.shape=HE,m.description===u?m.description=[e.description]:m.description=[m.description,e.description]):(m.shape=UE,m.description=e.description),m.description=qe.sanitizeTextOrArray(m.description,pe())),m.description?.length===1&&m.shape===HE&&(m.type==="group"?m.shape=XO:m.shape=UE),!m.type&&e.doc&&(Y.info("Setting cluster for XCX",u,qde(e)),m.type="group",m.isGroup=!0,m.dir=qde(e),m.shape=e.type===VE?qO:XO,m.cssClasses=`${m.cssClasses} ${Ude} ${a?Hde:""}`);let g={labelStyle:"",shape:m.shape,label:m.description,cssClasses:m.cssClasses,cssCompiledStyles:[],cssStyles:m.cssStyles,id:u,dir:m.dir,domId:JO(u,Sf),type:m.type,isGroup:m.type==="group",padding:8,rx:10,ry:10,look:s};if(g.shape===qO&&(g.label=""),t&&t.id!=="root"&&(Y.trace("Setting node ",u," to be child of its parent ",t.id),g.parentId=t.id),g.centerLabel=!0,e.note){let y={labelStyle:"",shape:Fde,label:e.note.text,cssClasses:Vde,cssStyles:[],cssCompilesStyles:[],id:u+Yde+"-"+Sf,domId:JO(u,Sf,QO),type:m.type,isGroup:m.type==="group",padding:pe().flowchart.padding,look:s,position:e.note.position},v=u+ZO,x={labelStyle:"",shape:zde,label:e.note.text,cssClasses:m.cssClasses,cssStyles:[],id:u+ZO,domId:JO(u,Sf,KO),type:"group",isGroup:!0,padding:16,look:s,position:e.note.position};Sf++,x.id=v,y.parentId=v,qE(n,x,l),qE(n,y,l),qE(n,g,l);let b=u,w=y.id;e.note.position==="left of"&&(b=y.id,w=u),i.push({id:b+"-"+w,start:b,end:w,arrowhead:"none",arrowTypeEnd:"",style:VO,labelStyle:"",classes:$de,arrowheadStyle:UO,labelpos:HO,labelType:WO,thickness:YO,look:s})}else qE(n,g,l)}e.doc&&(Y.trace("Adding nodes children "),gWe(e,e.doc,r,n,i,!a,s,l))},"dataFetcher"),Xde=o(()=>{XE.clear(),Sf=0},"reset")});var eP,xWe,bWe,Kde,tP=M(()=>{"use strict";Vt();ut();ow();Jv();TT();hr();YE();eP=o((t,e=$E)=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),xWe=o(function(t,e){return e.db.extract(e.db.getRootDocV2()),e.db.getClasses()},"getClasses"),bWe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing state diagram (v2)",e);let{securityLevel:i,state:a,layout:s}=pe();n.db.extract(n.db.getRootDocV2());let l=n.db.getData(),u=Am(e,i);l.type=n.type,l.layoutAlgorithm=s,l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["barb"],l.diagramId=e,await Qm(l,u);let h=8;Ut.insertTitle(u,"statediagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Zm(u,h,r1,a?.useMaxWidth??!0)},"draw"),Kde={getClasses:xWe,draw:bWe,getDir:eP}});function n0e(){return new Map}function rP(t=""){let e=t;return t===aP&&($x++,e=`${e0e}${$x}`),e}function nP(t="",e=F0){return t===aP?e0e:e}function DWe(t=""){let e=t;return t===t0e&&($x++,e=`${r0e}${$x}`),e}function NWe(t="",e=F0){return t===t0e?r0e:e}function RWe(t,e,r){let n=rP(t.id.trim()),i=nP(t.id.trim(),t.type),a=rP(e.id.trim()),s=nP(e.id.trim(),e.type);Cf(n,i,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),Cf(a,s,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),Xs.relations.push({id1:n,id2:a,relationTitle:qe.sanitizeText(r,pe())})}var aP,e0e,t0e,r0e,Qde,Zde,wWe,TWe,QE,sP,i0e,ZE,i1,a0e,JE,Xs,$x,Jde,kWe,EWe,jE,SWe,CWe,KE,oP,AWe,Cf,s0e,z0,o0e,_We,LWe,l0e,iP,MWe,IWe,c0e,OWe,lP,PWe,BWe,FWe,zWe,GWe,$We,ol,e6=M(()=>{"use strict";ut();hr();fr();Vt();Ai();jde();tP();YE();aP="[*]",e0e="start",t0e=aP,r0e="end",Qde="color",Zde="fill",wWe="bgFill",TWe=",";o(n0e,"newClassesList");QE=[],sP=[],i0e=Rde,ZE=[],i1=n0e(),a0e=o(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),JE={root:a0e()},Xs=JE.root,$x=0,Jde=0,kWe={LINE:0,DOTTED_LINE:1},EWe={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3},jE=o(t=>JSON.parse(JSON.stringify(t)),"clone"),SWe=o(t=>{Y.info("Setting root doc",t),ZE=t},"setRootDoc"),CWe=o(()=>ZE,"getRootDoc"),KE=o((t,e,r)=>{if(e.stmt===Gx)KE(t,e.state1,!0),KE(t,e.state2,!1);else if(e.stmt===t1&&(e.id==="[*]"?(e.id=r?t.id+"_start":t.id+"_end",e.start=r):e.id=e.id.trim()),e.doc){let n=[],i=[],a;for(a=0;a0&&i.length>0){let s={stmt:t1,id:r9(),type:"divider",doc:jE(i)};n.push(jE(s)),e.doc=n}e.doc.forEach(s=>KE(e,s,!0))}},"docTranslator"),oP=o(()=>(KE({id:"root"},{id:"root",doc:ZE},!0),{id:"root",doc:ZE}),"getRootDocV2"),AWe=o(t=>{let e;t.doc?e=t.doc:e=t,Y.info(e),s0e(!0),Y.info("Extract initial document:",e),e.forEach(a=>{switch(Y.warn("Statement",a.stmt),a.stmt){case t1:Cf(a.id.trim(),a.type,a.doc,a.description,a.note,a.classes,a.styles,a.textStyles);break;case Gx:l0e(a.state1,a.state2,a.description);break;case Mde:c0e(a.id.trim(),a.classes);break;case Ide:{let s=a.id.trim().split(","),l=a.styleClass.split(",");s.forEach(u=>{let h=z0(u);if(h===void 0){let f=u.trim();Cf(f),h=z0(f)}h.styles=l.map(f=>f.replace(/;/g,"")?.trim())})}break;case Ode:lP(a.id.trim(),a.styleClass);break}});let r=o0e(),i=pe().look;Xde(),n1(void 0,oP(),r,QE,sP,!0,i,i1),QE.forEach(a=>{if(Array.isArray(a.label)){if(a.description=a.label.slice(1),a.isGroup&&a.description.length>0)throw new Error("Group nodes can only have label. Remove the additional description for node ["+a.id+"]");a.label=a.label[0]}})},"extract"),Cf=o(function(t,e=F0,r=null,n=null,i=null,a=null,s=null,l=null){let u=t?.trim();if(Xs.states.has(u)?(Xs.states.get(u).doc||(Xs.states.get(u).doc=r),Xs.states.get(u).type||(Xs.states.get(u).type=e)):(Y.info("Adding state ",u,n),Xs.states.set(u,{id:u,descriptions:[],type:e,doc:r,note:i,classes:[],styles:[],textStyles:[]})),n&&(Y.info("Setting state description",u,n),typeof n=="string"&&iP(u,n.trim()),typeof n=="object"&&n.forEach(h=>iP(u,h.trim()))),i){let h=Xs.states.get(u);h.note=i,h.note.text=qe.sanitizeText(h.note.text,pe())}a&&(Y.info("Setting state classes",u,a),(typeof a=="string"?[a]:a).forEach(f=>lP(u,f.trim()))),s&&(Y.info("Setting state styles",u,s),(typeof s=="string"?[s]:s).forEach(f=>PWe(u,f.trim()))),l&&(Y.info("Setting state styles",u,s),(typeof l=="string"?[l]:l).forEach(f=>BWe(u,f.trim())))},"addState"),s0e=o(function(t){QE=[],sP=[],JE={root:a0e()},Xs=JE.root,$x=0,i1=n0e(),t||Lr()},"clear"),z0=o(function(t){return Xs.states.get(t)},"getState"),o0e=o(function(){return Xs.states},"getStates"),_We=o(function(){Y.info("Documents = ",JE)},"logDocuments"),LWe=o(function(){return Xs.relations},"getRelations");o(rP,"startIdIfNeeded");o(nP,"startTypeIfNeeded");o(DWe,"endIdIfNeeded");o(NWe,"endTypeIfNeeded");o(RWe,"addRelationObjs");l0e=o(function(t,e,r){if(typeof t=="object")RWe(t,e,r);else{let n=rP(t.trim()),i=nP(t),a=DWe(e.trim()),s=NWe(e);Cf(n,i),Cf(a,s),Xs.relations.push({id1:n,id2:a,title:qe.sanitizeText(r,pe())})}},"addRelation"),iP=o(function(t,e){let r=Xs.states.get(t),n=e.startsWith(":")?e.replace(":","").trim():e;r.descriptions.push(qe.sanitizeText(n,pe()))},"addDescription"),MWe=o(function(t){return t.substring(0,1)===":"?t.substr(2).trim():t.trim()},"cleanupLabel"),IWe=o(()=>(Jde++,"divider-id-"+Jde),"getDividerId"),c0e=o(function(t,e=""){i1.has(t)||i1.set(t,{id:t,styles:[],textStyles:[]});let r=i1.get(t);e?.split(TWe).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(Qde).exec(n)){let s=i.replace(Zde,wWe).replace(Qde,Zde);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),OWe=o(function(){return i1},"getClasses"),lP=o(function(t,e){t.split(",").forEach(function(r){let n=z0(r);if(n===void 0){let i=r.trim();Cf(i),n=z0(i)}n.classes.push(e)})},"setCssClass"),PWe=o(function(t,e){let r=z0(t);r!==void 0&&r.styles.push(e)},"setStyle"),BWe=o(function(t,e){let r=z0(t);r!==void 0&&r.textStyles.push(e)},"setTextStyle"),FWe=o(()=>i0e,"getDirection"),zWe=o(t=>{i0e=t},"setDirection"),GWe=o(t=>t&&t[0]===":"?t.substr(1).trim():t.trim(),"trimColon"),$We=o(()=>{let t=pe();return{nodes:QE,edges:sP,other:{},config:t,direction:eP(oP())}},"getData"),ol={getConfig:o(()=>pe().state,"getConfig"),getData:$We,addState:Cf,clear:s0e,getState:z0,getStates:o0e,getRelations:LWe,getClasses:OWe,getDirection:FWe,addRelation:l0e,getDividerId:IWe,setDirection:zWe,cleanupLabel:MWe,lineType:kWe,relationType:EWe,logDocuments:_We,getRootDoc:CWe,setRootDoc:SWe,getRootDocV2:oP,extract:AWe,trimColon:GWe,getAccTitle:Br,setAccTitle:Mr,getAccDescription:zr,setAccDescription:Fr,addStyleClass:c0e,setCssClass:lP,addDescription:iP,setDiagramTitle:cn,getDiagramTitle:Jr}});var VWe,t6,cP=M(()=>{"use strict";VWe=o(t=>` +defs #statediagram-barbEnd { + fill: ${t.transitionColor}; + stroke: ${t.transitionColor}; + } +g.stateGroup text { + fill: ${t.nodeBorder}; + stroke: none; + font-size: 10px; +} +g.stateGroup text { + fill: ${t.textColor}; + stroke: none; + font-size: 10px; + +} +g.stateGroup .state-title { + font-weight: bolder; + fill: ${t.stateLabelColor}; +} + +g.stateGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.stateGroup line { + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.transition { + stroke: ${t.transitionColor}; + stroke-width: 1; + fill: none; +} + +.stateGroup .composit { + fill: ${t.background}; + border-bottom: 1px +} + +.stateGroup .alt-composit { + fill: #e0e0e0; + border-bottom: 1px +} + +.state-note { + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + + text { + fill: ${t.noteTextColor}; + stroke: none; + font-size: 10px; + } +} + +.stateLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.edgeLabel .label rect { + fill: ${t.labelBackgroundColor}; + opacity: 0.5; +} +.edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; +} +.edgeLabel .label text { + fill: ${t.transitionLabelColor||t.tertiaryTextColor}; +} +.label div .edgeLabel { + color: ${t.transitionLabelColor||t.tertiaryTextColor}; +} + +.stateLabel text { + fill: ${t.stateLabelColor}; + font-size: 10px; + font-weight: bold; +} + +.node circle.state-start { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node .fork-join { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node circle.state-end { + fill: ${t.innerEndBackground}; + stroke: ${t.background}; + stroke-width: 1.5 +} +.end-state-inner { + fill: ${t.compositeBackground||t.background}; + // stroke: ${t.background}; + stroke-width: 1.5 +} + +.node rect { + fill: ${t.stateBkg||t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} +.node polygon { + fill: ${t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder};; + stroke-width: 1px; +} +#statediagram-barbEnd { + fill: ${t.lineColor}; +} + +.statediagram-cluster rect { + fill: ${t.compositeTitleBackground}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} + +.cluster-label, .nodeLabel { + color: ${t.stateLabelColor}; + // line-height: 1; +} + +.statediagram-cluster rect.outer { + rx: 5px; + ry: 5px; +} +.statediagram-state .divider { + stroke: ${t.stateBorder||t.nodeBorder}; +} + +.statediagram-state .title-state { + rx: 5px; + ry: 5px; +} +.statediagram-cluster.statediagram-cluster .inner { + fill: ${t.compositeBackground||t.background}; +} +.statediagram-cluster.statediagram-cluster-alt .inner { + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.statediagram-cluster .inner { + rx:0; + ry:0; +} + +.statediagram-state rect.basic { + rx: 5px; + ry: 5px; +} +.statediagram-state rect.divider { + stroke-dasharray: 10,10; + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.note-edge { + stroke-dasharray: 5; +} + +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} + +.statediagram-note text { + fill: ${t.noteTextColor}; +} + +.statediagram-note .nodeLabel { + color: ${t.noteTextColor}; +} +.statediagram .edgeLabel { + color: red; // ${t.noteTextColor}; +} + +#dependencyStart, #dependencyEnd { + fill: ${t.lineColor}; + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.statediagramTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} +`,"getStyles"),t6=VWe});var uP,UWe,HWe,u0e,WWe,h0e,f0e=M(()=>{"use strict";uP={},UWe=o((t,e)=>{uP[t]=e},"set"),HWe=o(t=>uP[t],"get"),u0e=o(()=>Object.keys(uP),"keys"),WWe=o(()=>u0e().length,"size"),h0e={get:HWe,set:UWe,keys:u0e,size:WWe}});var YWe,qWe,XWe,jWe,p0e,KWe,QWe,ZWe,JWe,hP,d0e,m0e,g0e=M(()=>{"use strict";pr();f0e();e6();hr();fr();Vt();ut();YWe=o(t=>t.append("circle").attr("class","start-state").attr("r",pe().state.sizeUnit).attr("cx",pe().state.padding+pe().state.sizeUnit).attr("cy",pe().state.padding+pe().state.sizeUnit),"drawStartState"),qWe=o(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",pe().state.textHeight).attr("class","divider").attr("x2",pe().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),XWe=o((t,e)=>{let r=t.append("text").attr("x",2*pe().state.padding).attr("y",pe().state.textHeight+2*pe().state.padding).attr("font-size",pe().state.fontSize).attr("class","state-title").text(e.id),n=r.node().getBBox();return t.insert("rect",":first-child").attr("x",pe().state.padding).attr("y",pe().state.padding).attr("width",n.width+2*pe().state.padding).attr("height",n.height+2*pe().state.padding).attr("rx",pe().state.radius),r},"drawSimpleState"),jWe=o((t,e)=>{let r=o(function(p,m,g){let y=p.append("tspan").attr("x",2*pe().state.padding).text(m);g||y.attr("dy",pe().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*pe().state.padding).attr("y",pe().state.textHeight+1.3*pe().state.padding).attr("font-size",pe().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),a=i.height,s=t.append("text").attr("x",pe().state.padding).attr("y",a+pe().state.padding*.4+pe().state.dividerMargin+pe().state.textHeight).attr("class","state-description"),l=!0,u=!0;e.descriptions.forEach(function(p){l||(r(s,p,u),u=!1),l=!1});let h=t.append("line").attr("x1",pe().state.padding).attr("y1",pe().state.padding+a+pe().state.dividerMargin/2).attr("y2",pe().state.padding+a+pe().state.dividerMargin/2).attr("class","descr-divider"),f=s.node().getBBox(),d=Math.max(f.width,i.width);return h.attr("x2",d+3*pe().state.padding),t.insert("rect",":first-child").attr("x",pe().state.padding).attr("y",pe().state.padding).attr("width",d+2*pe().state.padding).attr("height",f.height+a+2*pe().state.padding).attr("rx",pe().state.radius),t},"drawDescrState"),p0e=o((t,e,r)=>{let n=pe().state.padding,i=2*pe().state.padding,a=t.node().getBBox(),s=a.width,l=a.x,u=t.append("text").attr("x",0).attr("y",pe().state.titleShift).attr("font-size",pe().state.fontSize).attr("class","state-title").text(e.id),f=u.node().getBBox().width+i,d=Math.max(f,s);d===s&&(d=d+i);let p,m=t.node().getBBox();e.doc,p=l-n,f>s&&(p=(s-d)/2+n),Math.abs(l-m.x)s&&(p=l-(f-s)/2);let g=1-pe().state.textHeight;return t.insert("rect",":first-child").attr("x",p).attr("y",g).attr("class",r?"alt-composit":"composit").attr("width",d).attr("height",m.height+pe().state.textHeight+pe().state.titleShift+1).attr("rx","0"),u.attr("x",p+n),f<=s&&u.attr("x",l+(d-i)/2-f/2+n),t.insert("rect",":first-child").attr("x",p).attr("y",pe().state.titleShift-pe().state.textHeight-pe().state.padding).attr("width",d).attr("height",pe().state.textHeight*3).attr("rx",pe().state.radius),t.insert("rect",":first-child").attr("x",p).attr("y",pe().state.titleShift-pe().state.textHeight-pe().state.padding).attr("width",d).attr("height",m.height+3+2*pe().state.textHeight).attr("rx",pe().state.radius),t},"addTitleAndBox"),KWe=o(t=>(t.append("circle").attr("class","end-state-outer").attr("r",pe().state.sizeUnit+pe().state.miniPadding).attr("cx",pe().state.padding+pe().state.sizeUnit+pe().state.miniPadding).attr("cy",pe().state.padding+pe().state.sizeUnit+pe().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",pe().state.sizeUnit).attr("cx",pe().state.padding+pe().state.sizeUnit+2).attr("cy",pe().state.padding+pe().state.sizeUnit+2)),"drawEndState"),QWe=o((t,e)=>{let r=pe().state.forkWidth,n=pe().state.forkHeight;if(e.parentId){let i=r;r=n,n=i}return t.append("rect").style("stroke","black").style("fill","black").attr("width",r).attr("height",n).attr("x",pe().state.padding).attr("y",pe().state.padding)},"drawForkJoinState"),ZWe=o((t,e,r,n)=>{let i=0,a=n.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"
    ");s=s.replace(/\n/g,"
    ");let l=s.split(qe.lineBreakRegex),u=1.25*pe().state.noteMargin;for(let h of l){let f=h.trim();if(f.length>0){let d=a.append("tspan");if(d.text(f),u===0){let p=d.node().getBBox();u+=p.height}i+=u,d.attr("x",e+pe().state.noteMargin),d.attr("y",r+i+1.25*pe().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:i}},"_drawLongText"),JWe=o((t,e)=>{e.attr("class","state-note");let r=e.append("rect").attr("x",0).attr("y",pe().state.padding),n=e.append("g"),{textWidth:i,textHeight:a}=ZWe(t,0,0,n);return r.attr("height",a+2*pe().state.noteMargin),r.attr("width",i+pe().state.noteMargin*2),r},"drawNote"),hP=o(function(t,e){let r=e.id,n={id:r,label:e.id,width:0,height:0},i=t.append("g").attr("id",r).attr("class","stateGroup");e.type==="start"&&YWe(i),e.type==="end"&&KWe(i),(e.type==="fork"||e.type==="join")&&QWe(i,e),e.type==="note"&&JWe(e.note.text,i),e.type==="divider"&&qWe(i),e.type==="default"&&e.descriptions.length===0&&XWe(i,e),e.type==="default"&&e.descriptions.length>0&&jWe(i,e);let a=i.node().getBBox();return n.width=a.width+2*pe().state.padding,n.height=a.height+2*pe().state.padding,h0e.set(r,n),n},"drawState"),d0e=0,m0e=o(function(t,e,r){let n=o(function(u){switch(u){case ol.relationType.AGGREGATION:return"aggregation";case ol.relationType.EXTENSION:return"extension";case ol.relationType.COMPOSITION:return"composition";case ol.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(u=>!Number.isNaN(u.y));let i=e.points,a=ns().x(function(u){return u.x}).y(function(u){return u.y}).curve(Po),s=t.append("path").attr("d",a(i)).attr("id","edge"+d0e).attr("class","transition"),l="";if(pe().state.arrowMarkerAbsolute&&(l=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,l=l.replace(/\(/g,"\\("),l=l.replace(/\)/g,"\\)")),s.attr("marker-end","url("+l+"#"+n(ol.relationType.DEPENDENCY)+"End)"),r.title!==void 0){let u=t.append("g").attr("class","stateLabel"),{x:h,y:f}=Ut.calcLabelPosition(e.points),d=qe.getRows(r.title),p=0,m=[],g=0,y=0;for(let b=0;b<=d.length;b++){let w=u.append("text").attr("text-anchor","middle").text(d[b]).attr("x",h).attr("y",f+p),_=w.node().getBBox();g=Math.max(g,_.width),y=Math.min(y,_.x),Y.info(_.x,h,f+p),p===0&&(p=w.node().getBBox().height,Y.info("Title height",p,f)),m.push(w)}let v=p*d.length;if(d.length>1){let b=(d.length-1)*p*.5;m.forEach((w,_)=>w.attr("y",f+_*p-b)),v=p*d.length}let x=u.node().getBBox();u.insert("rect",":first-child").attr("class","box").attr("x",h-g/2-pe().state.padding/2).attr("y",f-v/2-pe().state.padding/2-3.5).attr("width",g+pe().state.padding).attr("height",v+pe().state.padding),Y.info(x)}d0e++},"drawEdge")});var bo,fP,eYe,tYe,rYe,nYe,y0e,v0e,x0e=M(()=>{"use strict";pr();Qv();Gs();ut();fr();g0e();Vt();ai();fP={},eYe=o(function(){},"setConf"),tYe=o(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),rYe=o(function(t,e,r,n){bo=pe().state;let i=pe().securityLevel,a;i==="sandbox"&&(a=Ve("#i"+e));let s=i==="sandbox"?Ve(a.nodes()[0].contentDocument.body):Ve("body"),l=i==="sandbox"?a.nodes()[0].contentDocument:document;Y.debug("Rendering diagram "+t);let u=s.select(`[id='${e}']`);tYe(u);let h=n.db.getRootDoc();y0e(h,u,void 0,!1,s,l,n);let f=bo.padding,d=u.node().getBBox(),p=d.width+f*2,m=d.height+f*2,g=p*1.75;Zr(u,m,g,bo.useMaxWidth),u.attr("viewBox",`${d.x-bo.padding} ${d.y-bo.padding} `+p+" "+m)},"draw"),nYe=o(t=>t?t.length*bo.fontSizeFactor:1,"getLabelWidth"),y0e=o((t,e,r,n,i,a,s)=>{let l=new Ir({compound:!0,multigraph:!0}),u,h=!0;for(u=0;u{let T=_.parentElement,E=0,L=0;T&&(T.parentElement&&(E=T.parentElement.getBBox().width),L=parseInt(T.getAttribute("data-x-shift"),10),Number.isNaN(L)&&(L=0)),_.setAttribute("x1",0-L+8),_.setAttribute("x2",E-L-8)})):Y.debug("No Node "+b+": "+JSON.stringify(l.node(b)))});let v=y.getBBox();l.edges().forEach(function(b){b!==void 0&&l.edge(b)!==void 0&&(Y.debug("Edge "+b.v+" -> "+b.w+": "+JSON.stringify(l.edge(b))),m0e(e,l.edge(b),l.edge(b).relation))}),v=y.getBBox();let x={id:r||"root",label:r||"root",width:0,height:0};return x.width=v.width+2*bo.padding,x.height=v.height+2*bo.padding,Y.debug("Doc rendered",x,l),x},"renderDoc"),v0e={setConf:eYe,draw:rYe}});var b0e={};vr(b0e,{diagram:()=>iYe});var iYe,w0e=M(()=>{"use strict";$O();e6();cP();x0e();iYe={parser:GE,db:ol,renderer:v0e,styles:t6,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,ol.clear()},"init")}});var E0e={};vr(E0e,{diagram:()=>lYe});var lYe,S0e=M(()=>{"use strict";$O();e6();cP();tP();lYe={parser:GE,db:ol,renderer:Kde,styles:t6,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,ol.clear()},"init")}});var dP,_0e,L0e=M(()=>{"use strict";dP=function(){var t=o(function(d,p,m,g){for(m=m||{},g=d.length;g--;m[d[g]]=p);return m},"o"),e=[6,8,10,11,12,14,16,17,18],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,14],u={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:o(function(p,m,g,y,v,x,b){var w=x.length-1;switch(v){case 1:return x[w-1];case 2:this.$=[];break;case 3:x[w-1].push(x[w]),this.$=x[w-1];break;case 4:case 5:this.$=x[w];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(x[w].substr(6)),this.$=x[w].substr(6);break;case 9:this.$=x[w].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=x[w].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(x[w].substr(8)),this.$=x[w].substr(8);break;case 13:y.addTask(x[w-1],x[w]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:o(function(p,m){if(m.recoverable)this.trace(p);else{var g=new Error(p);throw g.hash=m,g}},"parseError"),parse:o(function(p){var m=this,g=[0],y=[],v=[null],x=[],b=this.table,w="",_=0,T=0,E=0,L=2,S=1,A=x.slice.call(arguments,1),I=Object.create(this.lexer),D={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(D.yy[k]=this.yy[k]);I.setInput(p,D.yy),D.yy.lexer=I,D.yy.parser=this,typeof I.yylloc>"u"&&(I.yylloc={});var R=I.yylloc;x.push(R);var C=I.options&&I.options.ranges;typeof D.yy.parseError=="function"?this.parseError=D.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function O(H){g.length=g.length-2*H,v.length=v.length-H,x.length=x.length-H}o(O,"popStack");function N(){var H;return H=y.pop()||I.lex()||S,typeof H!="number"&&(H instanceof Array&&(y=H,H=y.pop()),H=m.symbols_[H]||H),H}o(N,"lex");for(var P,F,B,G,z,W,Z={},j,oe,K,ee;;){if(B=g[g.length-1],this.defaultActions[B]?G=this.defaultActions[B]:((P===null||typeof P>"u")&&(P=N()),G=b[B]&&b[B][P]),typeof G>"u"||!G.length||!G[0]){var J="";ee=[];for(j in b[B])this.terminals_[j]&&j>L&&ee.push("'"+this.terminals_[j]+"'");I.showPosition?J="Parse error on line "+(_+1)+`: +`+I.showPosition()+` +Expecting `+ee.join(", ")+", got '"+(this.terminals_[P]||P)+"'":J="Parse error on line "+(_+1)+": Unexpected "+(P==S?"end of input":"'"+(this.terminals_[P]||P)+"'"),this.parseError(J,{text:I.match,token:this.terminals_[P]||P,line:I.yylineno,loc:R,expected:ee})}if(G[0]instanceof Array&&G.length>1)throw new Error("Parse Error: multiple actions possible at state: "+B+", token: "+P);switch(G[0]){case 1:g.push(P),v.push(I.yytext),x.push(I.yylloc),g.push(G[1]),P=null,F?(P=F,F=null):(T=I.yyleng,w=I.yytext,_=I.yylineno,R=I.yylloc,E>0&&E--);break;case 2:if(oe=this.productions_[G[1]][1],Z.$=v[v.length-oe],Z._$={first_line:x[x.length-(oe||1)].first_line,last_line:x[x.length-1].last_line,first_column:x[x.length-(oe||1)].first_column,last_column:x[x.length-1].last_column},C&&(Z._$.range=[x[x.length-(oe||1)].range[0],x[x.length-1].range[1]]),W=this.performAction.apply(Z,[w,T,_,D.yy,G[1],v,x].concat(A)),typeof W<"u")return W;oe&&(g=g.slice(0,-1*oe*2),v=v.slice(0,-1*oe),x=x.slice(0,-1*oe)),g.push(this.productions_[G[1]][0]),v.push(Z.$),x.push(Z._$),K=b[g[g.length-2]][g[g.length-1]],g.push(K);break;case 3:return!0}}return!0},"parse")},h=function(){var d={EOF:1,parseError:o(function(m,g){if(this.yy.parser)this.yy.parser.parseError(m,g);else throw new Error(m)},"parseError"),setInput:o(function(p,m){return this.yy=m||this.yy||{},this._input=p,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var p=this._input[0];this.yytext+=p,this.yyleng++,this.offset++,this.match+=p,this.matched+=p;var m=p.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),p},"input"),unput:o(function(p){var m=p.length,g=p.split(/(?:\r\n?|\n)/g);this._input=p+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var v=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===y.length?this.yylloc.first_column:0)+y[y.length-g.length].length-g[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[v[0],v[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(p){this.unput(this.match.slice(p))},"less"),pastInput:o(function(){var p=this.matched.substr(0,this.matched.length-this.match.length);return(p.length>20?"...":"")+p.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var p=this.match;return p.length<20&&(p+=this._input.substr(0,20-p.length)),(p.substr(0,20)+(p.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var p=this.pastInput(),m=new Array(p.length+1).join("-");return p+this.upcomingInput()+` +`+m+"^"},"showPosition"),test_match:o(function(p,m){var g,y,v;if(this.options.backtrack_lexer&&(v={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(v.yylloc.range=this.yylloc.range.slice(0))),y=p[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+p[0].length},this.yytext+=p[0],this.match+=p[0],this.matches=p,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(p[0].length),this.matched+=p[0],g=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var x in v)this[x]=v[x];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var p,m,g,y;this._more||(this.yytext="",this.match="");for(var v=this._currentRules(),x=0;xm[0].length)){if(m=g,y=x,this.options.backtrack_lexer){if(p=this.test_match(g,v[x]),p!==!1)return p;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(p=this.test_match(m,v[y]),p!==!1?p:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var m=this.next();return m||this.lex()},"lex"),begin:o(function(m){this.conditionStack.push(m)},"begin"),popState:o(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:o(function(m){this.begin(m)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(m,g,y,v){var x=v;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return d}();u.lexer=h;function f(){this.yy={}}return o(f,"Parser"),f.prototype=u,u.Parser=f,new f}();dP.parser=dP;_0e=dP});var a1,pP,Vx,Ux,fYe,dYe,pYe,mYe,gYe,yYe,vYe,D0e,xYe,mP,N0e=M(()=>{"use strict";Vt();Ai();a1="",pP=[],Vx=[],Ux=[],fYe=o(function(){pP.length=0,Vx.length=0,a1="",Ux.length=0,Lr()},"clear"),dYe=o(function(t){a1=t,pP.push(t)},"addSection"),pYe=o(function(){return pP},"getSections"),mYe=o(function(){let t=D0e(),e=100,r=0;for(;!t&&r{r.people&&t.push(...r.people)}),[...new Set(t)].sort()},"updateActors"),yYe=o(function(t,e){let r=e.substr(1).split(":"),n=0,i=[];r.length===1?(n=Number(r[0]),i=[]):(n=Number(r[0]),i=r[1].split(","));let a=i.map(l=>l.trim()),s={section:a1,type:a1,people:a,task:t,score:n};Ux.push(s)},"addTask"),vYe=o(function(t){let e={section:a1,type:a1,description:t,task:t,classes:[]};Vx.push(e)},"addTaskOrg"),D0e=o(function(){let t=o(function(r){return Ux[r].processed},"compileTask"),e=!0;for(let[r,n]of Ux.entries())t(r),e=e&&n.processed;return e},"compileTasks"),xYe=o(function(){return gYe()},"getActors"),mP={getConfig:o(()=>pe().journey,"getConfig"),clear:fYe,setDiagramTitle:cn,getDiagramTitle:Jr,setAccTitle:Mr,getAccTitle:Br,setAccDescription:Fr,getAccDescription:zr,addSection:dYe,getSections:pYe,getTasks:mYe,addTask:yYe,addTaskOrg:vYe,getActors:xYe}});var bYe,R0e,M0e=M(()=>{"use strict";bYe=o(t=>`.label { + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + color: ${t.textColor}; + } + .mouth { + stroke: #666; + } + + line { + stroke: ${t.textColor} + } + + .legend { + fill: ${t.textColor}; + } + + .label text { + fill: #333; + } + .label { + color: ${t.textColor} + } + + .face { + ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; + stroke: #999; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 1.5px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + } + text-align: center; + } + + .cluster rect { + } + + .cluster text { + fill: ${t.titleColor}; + } + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .task-type-0, .section-type-0 { + ${t.fillType0?`fill: ${t.fillType0}`:""}; + } + .task-type-1, .section-type-1 { + ${t.fillType0?`fill: ${t.fillType1}`:""}; + } + .task-type-2, .section-type-2 { + ${t.fillType0?`fill: ${t.fillType2}`:""}; + } + .task-type-3, .section-type-3 { + ${t.fillType0?`fill: ${t.fillType3}`:""}; + } + .task-type-4, .section-type-4 { + ${t.fillType0?`fill: ${t.fillType4}`:""}; + } + .task-type-5, .section-type-5 { + ${t.fillType0?`fill: ${t.fillType5}`:""}; + } + .task-type-6, .section-type-6 { + ${t.fillType0?`fill: ${t.fillType6}`:""}; + } + .task-type-7, .section-type-7 { + ${t.fillType0?`fill: ${t.fillType7}`:""}; + } + + .actor-0 { + ${t.actor0?`fill: ${t.actor0}`:""}; + } + .actor-1 { + ${t.actor1?`fill: ${t.actor1}`:""}; + } + .actor-2 { + ${t.actor2?`fill: ${t.actor2}`:""}; + } + .actor-3 { + ${t.actor3?`fill: ${t.actor3}`:""}; + } + .actor-4 { + ${t.actor4?`fill: ${t.actor4}`:""}; + } + .actor-5 { + ${t.actor5?`fill: ${t.actor5}`:""}; + } +`,"getStyles"),R0e=bYe});var gP,wYe,O0e,P0e,TYe,kYe,I0e,EYe,SYe,B0e,CYe,s1,F0e=M(()=>{"use strict";pr();lv();gP=o(function(t,e){return Sd(t,e)},"drawRect"),wYe=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Dl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Dl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),O0e=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),P0e=o(function(t,e){return AY(t,e)},"drawText"),TYe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,P0e(t,e)},"drawLabel"),kYe=o(function(t,e,r){let n=t.append("g"),i=Nl();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width*e.taskCount+r.diagramMarginX*(e.taskCount-1),i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,gP(n,i),B0e(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),I0e=-1,EYe=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");I0e++;let a=300+5*30;i.append("line").attr("id","task"+I0e).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),wYe(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=Nl();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,gP(i,s);let l=e.x+14;e.people.forEach(u=>{let h=e.actors[u].color,f={cx:l,cy:e.y,r:7,fill:h,stroke:"#000",title:u,pos:e.actors[u].position};O0e(i,f),l+=10}),B0e(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),SYe=o(function(t,e){i5(t,e)},"drawBackgroundRect"),B0e=function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{let i=rh[n].color,a={cx:20,cy:r,r:7,fill:i,stroke:"#000",pos:rh[n].position};s1.drawCircle(t,a);let s={x:40,y:r+7,fill:"#666",text:n,textMargin:e.boxTextMargin|5};s1.drawText(t,s),r+=20})}var AYe,rh,r6,G0,LYe,ll,yP,z0e,DYe,vP,G0e=M(()=>{"use strict";pr();F0e();Vt();ai();AYe=o(function(t){Object.keys(t).forEach(function(r){r6[r]=t[r]})},"setConf"),rh={};o(_Ye,"drawActorLegend");r6=pe().journey,G0=r6.leftMargin,LYe=o(function(t,e,r,n){let i=pe().journey,a=pe().securityLevel,s;a==="sandbox"&&(s=Ve("#i"+e));let l=a==="sandbox"?Ve(s.nodes()[0].contentDocument.body):Ve("body");ll.init();let u=l.select("#"+e);s1.initGraphics(u);let h=n.db.getTasks(),f=n.db.getDiagramTitle(),d=n.db.getActors();for(let x in rh)delete rh[x];let p=0;d.forEach(x=>{rh[x]={color:i.actorColours[p%i.actorColours.length],position:p},p++}),_Ye(u),ll.insert(0,0,G0,Object.keys(rh).length*50),DYe(u,h,0);let m=ll.getBounds();f&&u.append("text").text(f).attr("x",G0).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);let g=m.stopy-m.starty+2*i.diagramMarginY,y=G0+m.stopx+2*i.diagramMarginX;Zr(u,g,y,i.useMaxWidth),u.append("line").attr("x1",G0).attr("y1",i.height*4).attr("x2",y-G0-4).attr("y2",i.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let v=f?70:0;u.attr("viewBox",`${m.startx} -25 ${y} ${g+v}`),u.attr("preserveAspectRatio","xMinYMin meet"),u.attr("height",g+v+25)},"draw"),ll={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:o(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=pe().journey,a=this,s=0;function l(u){return o(function(f){s++;let d=a.sequenceItems.length-s+1;a.updateVal(f,"starty",e-d*i.boxMargin,Math.min),a.updateVal(f,"stopy",n+d*i.boxMargin,Math.max),a.updateVal(ll.data,"startx",t-d*i.boxMargin,Math.min),a.updateVal(ll.data,"stopx",r+d*i.boxMargin,Math.max),u!=="activation"&&(a.updateVal(f,"startx",t-d*i.boxMargin,Math.min),a.updateVal(f,"stopx",r+d*i.boxMargin,Math.max),a.updateVal(ll.data,"starty",e-d*i.boxMargin,Math.min),a.updateVal(ll.data,"stopy",n+d*i.boxMargin,Math.max))},"updateItemBounds")}o(l,"updateFn"),this.sequenceItems.forEach(l())},"updateBounds"),insert:o(function(t,e,r,n){let i=Math.min(t,r),a=Math.max(t,r),s=Math.min(e,n),l=Math.max(e,n);this.updateVal(ll.data,"startx",i,Math.min),this.updateVal(ll.data,"starty",s,Math.min),this.updateVal(ll.data,"stopx",a,Math.max),this.updateVal(ll.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return this.data},"getBounds")},yP=r6.sectionFills,z0e=r6.sectionColours,DYe=o(function(t,e,r){let n=pe().journey,i="",a=n.height*2+n.diagramMarginY,s=r+a,l=0,u="#CCC",h="black",f=0;for(let[d,p]of e.entries()){if(i!==p.section){u=yP[l%yP.length],f=l%yP.length,h=z0e[l%z0e.length];let g=0,y=p.section;for(let x=d;x(rh[y]&&(g[y]=rh[y]),g),{});p.x=d*n.taskMargin+d*n.width+G0,p.y=s,p.width=n.diagramMarginX,p.height=n.diagramMarginY,p.colour=h,p.fill=u,p.num=f,p.actors=m,s1.drawTask(t,p,n),ll.insert(p.x,p.y,p.x+p.width+n.taskMargin,300+5*30)}},"drawTasks"),vP={setConf:AYe,draw:LYe}});var $0e={};vr($0e,{diagram:()=>NYe});var NYe,V0e=M(()=>{"use strict";L0e();N0e();M0e();G0e();NYe={parser:_0e,db:mP,renderer:vP,styles:R0e,init:o(t=>{vP.setConf(t.journey),mP.clear()},"init")}});var bP,j0e,K0e=M(()=>{"use strict";bP=function(){var t=o(function(p,m,g,y){for(g=g||{},y=p.length;y--;g[p[y]]=m);return g},"o"),e=[6,8,10,11,12,14,16,17,20,21],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,16],u=[1,17],h={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:o(function(m,g,y,v,x,b,w){var _=b.length-1;switch(x){case 1:return b[_-1];case 2:this.$=[];break;case 3:b[_-1].push(b[_]),this.$=b[_-1];break;case 4:case 5:this.$=b[_];break;case 6:case 7:this.$=[];break;case 8:v.getCommonDb().setDiagramTitle(b[_].substr(6)),this.$=b[_].substr(6);break;case 9:this.$=b[_].trim(),v.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=b[_].trim(),v.getCommonDb().setAccDescription(this.$);break;case 12:v.addSection(b[_].substr(8)),this.$=b[_].substr(8);break;case 15:v.addTask(b[_],0,""),this.$=b[_];break;case 16:v.addEvent(b[_].substr(2)),this.$=b[_];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:o(function(m,g){if(g.recoverable)this.trace(m);else{var y=new Error(m);throw y.hash=g,y}},"parseError"),parse:o(function(m){var g=this,y=[0],v=[],x=[null],b=[],w=this.table,_="",T=0,E=0,L=0,S=2,A=1,I=b.slice.call(arguments,1),D=Object.create(this.lexer),k={yy:{}};for(var R in this.yy)Object.prototype.hasOwnProperty.call(this.yy,R)&&(k.yy[R]=this.yy[R]);D.setInput(m,k.yy),k.yy.lexer=D,k.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var C=D.yylloc;b.push(C);var O=D.options&&D.options.ranges;typeof k.yy.parseError=="function"?this.parseError=k.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function N(q){y.length=y.length-2*q,x.length=x.length-q,b.length=b.length-q}o(N,"popStack");function P(){var q;return q=v.pop()||D.lex()||A,typeof q!="number"&&(q instanceof Array&&(v=q,q=v.pop()),q=g.symbols_[q]||q),q}o(P,"lex");for(var F,B,G,z,W,Z,j={},oe,K,ee,J;;){if(G=y[y.length-1],this.defaultActions[G]?z=this.defaultActions[G]:((F===null||typeof F>"u")&&(F=P()),z=w[G]&&w[G][F]),typeof z>"u"||!z.length||!z[0]){var H="";J=[];for(oe in w[G])this.terminals_[oe]&&oe>S&&J.push("'"+this.terminals_[oe]+"'");D.showPosition?H="Parse error on line "+(T+1)+`: +`+D.showPosition()+` +Expecting `+J.join(", ")+", got '"+(this.terminals_[F]||F)+"'":H="Parse error on line "+(T+1)+": Unexpected "+(F==A?"end of input":"'"+(this.terminals_[F]||F)+"'"),this.parseError(H,{text:D.match,token:this.terminals_[F]||F,line:D.yylineno,loc:C,expected:J})}if(z[0]instanceof Array&&z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+F);switch(z[0]){case 1:y.push(F),x.push(D.yytext),b.push(D.yylloc),y.push(z[1]),F=null,B?(F=B,B=null):(E=D.yyleng,_=D.yytext,T=D.yylineno,C=D.yylloc,L>0&&L--);break;case 2:if(K=this.productions_[z[1]][1],j.$=x[x.length-K],j._$={first_line:b[b.length-(K||1)].first_line,last_line:b[b.length-1].last_line,first_column:b[b.length-(K||1)].first_column,last_column:b[b.length-1].last_column},O&&(j._$.range=[b[b.length-(K||1)].range[0],b[b.length-1].range[1]]),Z=this.performAction.apply(j,[_,E,T,k.yy,z[1],x,b].concat(I)),typeof Z<"u")return Z;K&&(y=y.slice(0,-1*K*2),x=x.slice(0,-1*K),b=b.slice(0,-1*K)),y.push(this.productions_[z[1]][0]),x.push(j.$),b.push(j._$),ee=w[y[y.length-2]][y[y.length-1]],y.push(ee);break;case 3:return!0}}return!0},"parse")},f=function(){var p={EOF:1,parseError:o(function(g,y){if(this.yy.parser)this.yy.parser.parseError(g,y);else throw new Error(g)},"parseError"),setInput:o(function(m,g){return this.yy=g||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var g=m.match(/(?:\r\n?|\n).*/g);return g?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:o(function(m){var g=m.length,y=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-g),this.offset-=g;var v=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),y.length-1&&(this.yylineno-=y.length-1);var x=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:y?(y.length===v.length?this.yylloc.first_column:0)+v[v.length-y.length].length-y[0].length:this.yylloc.first_column-g},this.options.ranges&&(this.yylloc.range=[x[0],x[0]+this.yyleng-g]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(m){this.unput(this.match.slice(m))},"less"),pastInput:o(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var m=this.pastInput(),g=new Array(m.length+1).join("-");return m+this.upcomingInput()+` +`+g+"^"},"showPosition"),test_match:o(function(m,g){var y,v,x;if(this.options.backtrack_lexer&&(x={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(x.yylloc.range=this.yylloc.range.slice(0))),v=m[0].match(/(?:\r\n?|\n).*/g),v&&(this.yylineno+=v.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:v?v[v.length-1].length-v[v.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],y=this.performAction.call(this,this.yy,this,g,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),y)return y;if(this._backtrack){for(var b in x)this[b]=x[b];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,g,y,v;this._more||(this.yytext="",this.match="");for(var x=this._currentRules(),b=0;bg[0].length)){if(g=y,v=b,this.options.backtrack_lexer){if(m=this.test_match(y,x[b]),m!==!1)return m;if(this._backtrack){g=!1;continue}else return!1}else if(!this.options.flex)break}return g?(m=this.test_match(g,x[v]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var g=this.next();return g||this.lex()},"lex"),begin:o(function(g){this.conditionStack.push(g)},"begin"),popState:o(function(){var g=this.conditionStack.length-1;return g>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(g){return g=this.conditionStack.length-1-Math.abs(g||0),g>=0?this.conditionStack[g]:"INITIAL"},"topState"),pushState:o(function(g){this.begin(g)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(g,y,v,x){var b=x;switch(v){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s[^:\n]+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return p}();h.lexer=f;function d(){this.yy={}}return o(d,"Parser"),d.prototype=h,h.Parser=d,new d}();bP.parser=bP;j0e=bP});var TP={};vr(TP,{addEvent:()=>ape,addSection:()=>tpe,addTask:()=>ipe,addTaskOrg:()=>spe,clear:()=>epe,default:()=>GYe,getCommonDb:()=>J0e,getSections:()=>rpe,getTasks:()=>npe});var o1,Z0e,wP,n6,l1,J0e,epe,tpe,rpe,npe,ipe,ape,spe,Q0e,GYe,ope=M(()=>{"use strict";Ai();o1="",Z0e=0,wP=[],n6=[],l1=[],J0e=o(()=>xy,"getCommonDb"),epe=o(function(){wP.length=0,n6.length=0,o1="",l1.length=0,Lr()},"clear"),tpe=o(function(t){o1=t,wP.push(t)},"addSection"),rpe=o(function(){return wP},"getSections"),npe=o(function(){let t=Q0e(),e=100,r=0;for(;!t&&rr.id===Z0e-1).events.push(t)},"addEvent"),spe=o(function(t){let e={section:o1,type:o1,description:t,task:t,classes:[]};n6.push(e)},"addTaskOrg"),Q0e=o(function(){let t=o(function(r){return l1[r].processed},"compileTask"),e=!0;for(let[r,n]of l1.entries())t(r),e=e&&n.processed;return e},"compileTasks"),GYe={clear:epe,getCommonDb:J0e,addSection:tpe,getSections:rpe,getTasks:npe,addTask:ipe,addTaskOrg:spe,addEvent:ape}});function hpe(t,e){t.each(function(){var r=Ve(this),n=r.text().split(/(\s+|
    )/).reverse(),i,a=[],s=1.1,l=r.attr("y"),u=parseFloat(r.attr("dy")),h=r.text(null).append("tspan").attr("x",0).attr("y",l).attr("dy",u+"em");for(let f=0;fe||i==="
    ")&&(a.pop(),h.text(a.join(" ").trim()),i==="
    "?a=[""]:a=[i],h=r.append("tspan").attr("x",0).attr("y",l).attr("dy",s+"em").text(i))})}var $Ye,i6,VYe,UYe,cpe,HYe,WYe,lpe,YYe,qYe,XYe,kP,upe,jYe,KYe,QYe,ZYe,Af,fpe=M(()=>{"use strict";pr();$Ye=12,i6=o(function(t,e){let r=t.append("rect");return r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),r.attr("rx",e.rx),r.attr("ry",e.ry),e.class!==void 0&&r.attr("class",e.class),r},"drawRect"),VYe=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Dl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Dl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),UYe=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),cpe=o(function(t,e){let r=e.text.replace(//gi," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class!==void 0&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),HYe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,cpe(t,e)},"drawLabel"),WYe=o(function(t,e,r){let n=t.append("g"),i=kP();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width,i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,i6(n,i),upe(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),lpe=-1,YYe=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");lpe++;let a=300+5*30;i.append("line").attr("id","task"+lpe).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),VYe(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=kP();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,i6(i,s),upe(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),qYe=o(function(t,e){i6(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),XYe=o(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),kP=o(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),upe=function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{"use strict";pr();fpe();ut();Vt();ai();JYe=o(function(t,e,r,n){let i=pe(),a=i.leftMargin??50;Y.debug("timeline",n.db);let s=i.securityLevel,l;s==="sandbox"&&(l=Ve("#i"+e));let h=(s==="sandbox"?Ve(l.nodes()[0].contentDocument.body):Ve("body")).select("#"+e);h.append("g");let f=n.db.getTasks(),d=n.db.getCommonDb().getDiagramTitle();Y.debug("task",f),Af.initGraphics(h);let p=n.db.getSections();Y.debug("sections",p);let m=0,g=0,y=0,v=0,x=50+a,b=50;v=50;let w=0,_=!0;p.forEach(function(A){let I={number:w,descr:A,section:w,width:150,padding:20,maxHeight:m},D=Af.getVirtualNodeHeight(h,I,i);Y.debug("sectionHeight before draw",D),m=Math.max(m,D+20)});let T=0,E=0;Y.debug("tasks.length",f.length);for(let[A,I]of f.entries()){let D={number:A,descr:I,section:I.section,width:150,padding:20,maxHeight:g},k=Af.getVirtualNodeHeight(h,D,i);Y.debug("taskHeight before draw",k),g=Math.max(g,k+20),T=Math.max(T,I.events.length);let R=0;for(let C of I.events){let O={descr:C,section:I.section,number:I.section,width:150,padding:20,maxHeight:50};R+=Af.getVirtualNodeHeight(h,O,i)}E=Math.max(E,R)}Y.debug("maxSectionHeight before draw",m),Y.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach(A=>{let I=f.filter(C=>C.section===A),D={number:w,descr:A,section:w,width:200*Math.max(I.length,1)-50,padding:20,maxHeight:m};Y.debug("sectionNode",D);let k=h.append("g"),R=Af.drawNode(k,D,w,i);Y.debug("sectionNode output",R),k.attr("transform",`translate(${x}, ${v})`),b+=m+50,I.length>0&&dpe(h,I,w,x,b,g,i,T,E,m,!1),x+=200*Math.max(I.length,1),b=v,w++}):(_=!1,dpe(h,f,w,x,b,g,i,T,E,m,!0));let L=h.node().getBBox();Y.debug("bounds",L),d&&h.append("text").text(d).attr("x",L.width/2-a).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),y=_?m+g+150:g+100,h.append("g").attr("class","lineWrapper").append("line").attr("x1",a).attr("y1",y).attr("x2",L.width+3*a).attr("y2",y).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),Io(void 0,h,i.timeline?.padding??50,i.timeline?.useMaxWidth??!1)},"draw"),dpe=o(function(t,e,r,n,i,a,s,l,u,h,f){for(let d of e){let p={descr:d.task,section:r,number:r,width:150,padding:20,maxHeight:a};Y.debug("taskNode",p);let m=t.append("g").attr("class","taskWrapper"),y=Af.drawNode(m,p,r,s).height;if(Y.debug("taskHeight after draw",y),m.attr("transform",`translate(${n}, ${i})`),a=Math.max(a,y),d.events){let v=t.append("g").attr("class","lineWrapper"),x=a;i+=100,x=x+eqe(t,d.events,r,n,i,s),i-=100,v.append("line").attr("x1",n+190/2).attr("y1",i+a).attr("x2",n+190/2).attr("y2",i+a+(f?a:h)+u+120).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}n=n+200,f&&!s.timeline?.disableMulticolor&&r++}i=i-10},"drawTasks"),eqe=o(function(t,e,r,n,i,a){let s=0,l=i;i=i+100;for(let u of e){let h={descr:u,section:r,number:r,width:150,padding:20,maxHeight:50};Y.debug("eventNode",h);let f=t.append("g").attr("class","eventWrapper"),p=Af.drawNode(f,h,r,a).height;s=s+p,f.attr("transform",`translate(${n}, ${i})`),i=i+10+p}return i=l,s},"drawEvents"),ppe={setConf:o(()=>{},"setConf"),draw:JYe}});var tqe,rqe,gpe,ype=M(()=>{"use strict";Lo();tqe=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${tqe(t)} + .section-root rect, .section-root path, .section-root circle { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`,"getStyles"),gpe=rqe});var vpe={};vr(vpe,{diagram:()=>nqe});var nqe,xpe=M(()=>{"use strict";K0e();ope();mpe();ype();nqe={db:TP,renderer:ppe,parser:j0e,styles:gpe}});var EP,Tpe,kpe=M(()=>{"use strict";EP=function(){var t=o(function(_,T,E,L){for(E=E||{},L=_.length;L--;E[_[L]]=T);return E},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,6,13,15,16,19,22],g=[1,33],y=[1,34],v=[1,6,7,11,13,15,16,19,22],x={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:o(function(T,E,L,S,A,I,D){var k=I.length-1;switch(A){case 6:case 7:return S;case 8:S.getLogger().trace("Stop NL ");break;case 9:S.getLogger().trace("Stop EOF ");break;case 11:S.getLogger().trace("Stop NL2 ");break;case 12:S.getLogger().trace("Stop EOF2 ");break;case 15:S.getLogger().info("Node: ",I[k].id),S.addNode(I[k-1].length,I[k].id,I[k].descr,I[k].type);break;case 16:S.getLogger().trace("Icon: ",I[k]),S.decorateNode({icon:I[k]});break;case 17:case 21:S.decorateNode({class:I[k]});break;case 18:S.getLogger().trace("SPACELIST");break;case 19:S.getLogger().trace("Node: ",I[k].id),S.addNode(0,I[k].id,I[k].descr,I[k].type);break;case 20:S.decorateNode({icon:I[k]});break;case 25:S.getLogger().trace("node found ..",I[k-2]),this.$={id:I[k-1],descr:I[k-1],type:S.getType(I[k-2],I[k])};break;case 26:this.$={id:I[k],descr:I[k],type:S.nodeType.DEFAULT};break;case 27:S.getLogger().trace("node found ..",I[k-3]),this.$={id:I[k-3],descr:I[k-1],type:S.getType(I[k-2],I[k])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:r,9:22,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:h,7:f,10:23,11:d},t(p,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:s,22:l}),t(p,[2,18]),t(p,[2,19]),t(p,[2,20]),t(p,[2,21]),t(p,[2,23]),t(p,[2,24]),t(p,[2,26],{19:[1,30]}),{20:[1,31]},{6:h,7:f,10:32,11:d},{1:[2,7],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(m,[2,14],{7:g,11:y}),t(v,[2,8]),t(v,[2,9]),t(v,[2,10]),t(p,[2,15]),t(p,[2,16]),t(p,[2,17]),{20:[1,35]},{21:[1,36]},t(m,[2,13],{7:g,11:y}),t(v,[2,11]),t(v,[2,12]),{21:[1,37]},t(p,[2,25]),t(p,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(T,E){if(E.recoverable)this.trace(T);else{var L=new Error(T);throw L.hash=E,L}},"parseError"),parse:o(function(T){var E=this,L=[0],S=[],A=[null],I=[],D=this.table,k="",R=0,C=0,O=0,N=2,P=1,F=I.slice.call(arguments,1),B=Object.create(this.lexer),G={yy:{}};for(var z in this.yy)Object.prototype.hasOwnProperty.call(this.yy,z)&&(G.yy[z]=this.yy[z]);B.setInput(T,G.yy),G.yy.lexer=B,G.yy.parser=this,typeof B.yylloc>"u"&&(B.yylloc={});var W=B.yylloc;I.push(W);var Z=B.options&&B.options.ranges;typeof G.yy.parseError=="function"?this.parseError=G.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function j(ke){L.length=L.length-2*ke,A.length=A.length-ke,I.length=I.length-ke}o(j,"popStack");function oe(){var ke;return ke=S.pop()||B.lex()||P,typeof ke!="number"&&(ke instanceof Array&&(S=ke,ke=S.pop()),ke=E.symbols_[ke]||ke),ke}o(oe,"lex");for(var K,ee,J,H,q,Q,ae={},ue,ce,te,Ne;;){if(J=L[L.length-1],this.defaultActions[J]?H=this.defaultActions[J]:((K===null||typeof K>"u")&&(K=oe()),H=D[J]&&D[J][K]),typeof H>"u"||!H.length||!H[0]){var se="";Ne=[];for(ue in D[J])this.terminals_[ue]&&ue>N&&Ne.push("'"+this.terminals_[ue]+"'");B.showPosition?se="Parse error on line "+(R+1)+`: +`+B.showPosition()+` +Expecting `+Ne.join(", ")+", got '"+(this.terminals_[K]||K)+"'":se="Parse error on line "+(R+1)+": Unexpected "+(K==P?"end of input":"'"+(this.terminals_[K]||K)+"'"),this.parseError(se,{text:B.match,token:this.terminals_[K]||K,line:B.yylineno,loc:W,expected:Ne})}if(H[0]instanceof Array&&H.length>1)throw new Error("Parse Error: multiple actions possible at state: "+J+", token: "+K);switch(H[0]){case 1:L.push(K),A.push(B.yytext),I.push(B.yylloc),L.push(H[1]),K=null,ee?(K=ee,ee=null):(C=B.yyleng,k=B.yytext,R=B.yylineno,W=B.yylloc,O>0&&O--);break;case 2:if(ce=this.productions_[H[1]][1],ae.$=A[A.length-ce],ae._$={first_line:I[I.length-(ce||1)].first_line,last_line:I[I.length-1].last_line,first_column:I[I.length-(ce||1)].first_column,last_column:I[I.length-1].last_column},Z&&(ae._$.range=[I[I.length-(ce||1)].range[0],I[I.length-1].range[1]]),Q=this.performAction.apply(ae,[k,C,R,G.yy,H[1],A,I].concat(F)),typeof Q<"u")return Q;ce&&(L=L.slice(0,-1*ce*2),A=A.slice(0,-1*ce),I=I.slice(0,-1*ce)),L.push(this.productions_[H[1]][0]),A.push(ae.$),I.push(ae._$),te=D[L[L.length-2]][L[L.length-1]],L.push(te);break;case 3:return!0}}return!0},"parse")},b=function(){var _={EOF:1,parseError:o(function(E,L){if(this.yy.parser)this.yy.parser.parseError(E,L);else throw new Error(E)},"parseError"),setInput:o(function(T,E){return this.yy=E||this.yy||{},this._input=T,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var T=this._input[0];this.yytext+=T,this.yyleng++,this.offset++,this.match+=T,this.matched+=T;var E=T.match(/(?:\r\n?|\n).*/g);return E?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),T},"input"),unput:o(function(T){var E=T.length,L=T.split(/(?:\r\n?|\n)/g);this._input=T+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-E),this.offset-=E;var S=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),L.length-1&&(this.yylineno-=L.length-1);var A=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:L?(L.length===S.length?this.yylloc.first_column:0)+S[S.length-L.length].length-L[0].length:this.yylloc.first_column-E},this.options.ranges&&(this.yylloc.range=[A[0],A[0]+this.yyleng-E]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(T){this.unput(this.match.slice(T))},"less"),pastInput:o(function(){var T=this.matched.substr(0,this.matched.length-this.match.length);return(T.length>20?"...":"")+T.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var T=this.match;return T.length<20&&(T+=this._input.substr(0,20-T.length)),(T.substr(0,20)+(T.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var T=this.pastInput(),E=new Array(T.length+1).join("-");return T+this.upcomingInput()+` +`+E+"^"},"showPosition"),test_match:o(function(T,E){var L,S,A;if(this.options.backtrack_lexer&&(A={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(A.yylloc.range=this.yylloc.range.slice(0))),S=T[0].match(/(?:\r\n?|\n).*/g),S&&(this.yylineno+=S.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:S?S[S.length-1].length-S[S.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+T[0].length},this.yytext+=T[0],this.match+=T[0],this.matches=T,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(T[0].length),this.matched+=T[0],L=this.performAction.call(this,this.yy,this,E,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),L)return L;if(this._backtrack){for(var I in A)this[I]=A[I];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var T,E,L,S;this._more||(this.yytext="",this.match="");for(var A=this._currentRules(),I=0;IE[0].length)){if(E=L,S=I,this.options.backtrack_lexer){if(T=this.test_match(L,A[I]),T!==!1)return T;if(this._backtrack){E=!1;continue}else return!1}else if(!this.options.flex)break}return E?(T=this.test_match(E,A[S]),T!==!1?T:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var E=this.next();return E||this.lex()},"lex"),begin:o(function(E){this.conditionStack.push(E)},"begin"),popState:o(function(){var E=this.conditionStack.length-1;return E>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(E){return E=this.conditionStack.length-1-Math.abs(E||0),E>=0?this.conditionStack[E]:"INITIAL"},"topState"),pushState:o(function(E){this.begin(E)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(E,L,S,A){var I=A;switch(S){case 0:return E.getLogger().trace("Found comment",L.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:E.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return E.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:E.getLogger().trace("end icon"),this.popState();break;case 10:return E.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return E.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return E.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return E.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:E.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return E.getLogger().trace("description:",L.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),E.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),E.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),E.getLogger().trace("node end ...",L.yytext),"NODE_DEND";break;case 30:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return E.getLogger().trace("Long description:",L.yytext),20;break;case 36:return E.getLogger().trace("Long description:",L.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return _}();x.lexer=b;function w(){this.yy={}}return o(w,"Parser"),w.prototype=x,x.Parser=w,new w}();EP.parser=EP;Tpe=EP});var Xl,Epe,SP,oqe,lqe,cqe,uqe,qi,hqe,fqe,dqe,pqe,mqe,gqe,yqe,Spe,Cpe=M(()=>{"use strict";Vt();fr();ut();bs();Xl=[],Epe=0,SP={},oqe=o(()=>{Xl=[],Epe=0,SP={}},"clear"),lqe=o(function(t){for(let e=Xl.length-1;e>=0;e--)if(Xl[e].levelXl.length>0?Xl[0]:null,"getMindmap"),uqe=o((t,e,r,n)=>{Y.info("addNode",t,e,r,n);let i=pe(),a=i.mindmap?.padding??ur.mindmap.padding;switch(n){case qi.ROUNDED_RECT:case qi.RECT:case qi.HEXAGON:a*=2}let s={id:Epe++,nodeId:kr(e,i),level:t,descr:kr(r,i),type:n,children:[],width:i.mindmap?.maxNodeWidth??ur.mindmap.maxNodeWidth,padding:a},l=lqe(t);if(l)l.children.push(s),Xl.push(s);else if(Xl.length===0)Xl.push(s);else throw new Error('There can be only one root. No parent could be found for ("'+s.descr+'")')},"addNode"),qi={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},hqe=o((t,e)=>{switch(Y.debug("In get type",t,e),t){case"[":return qi.RECT;case"(":return e===")"?qi.ROUNDED_RECT:qi.CLOUD;case"((":return qi.CIRCLE;case")":return qi.CLOUD;case"))":return qi.BANG;case"{{":return qi.HEXAGON;default:return qi.DEFAULT}},"getType"),fqe=o((t,e)=>{SP[t]=e},"setElementForId"),dqe=o(t=>{if(!t)return;let e=pe(),r=Xl[Xl.length-1];t.icon&&(r.icon=kr(t.icon,e)),t.class&&(r.class=kr(t.class,e))},"decorateNode"),pqe=o(t=>{switch(t){case qi.DEFAULT:return"no-border";case qi.RECT:return"rect";case qi.ROUNDED_RECT:return"rounded-rect";case qi.CIRCLE:return"circle";case qi.CLOUD:return"cloud";case qi.BANG:return"bang";case qi.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),mqe=o(()=>Y,"getLogger"),gqe=o(t=>SP[t],"getElementById"),yqe={clear:oqe,addNode:uqe,getMindmap:cqe,nodeType:qi,getType:hqe,setElementForId:fqe,decorateNode:dqe,type2Str:pqe,getLogger:mqe,getElementById:gqe},Spe=yqe});function Ki(t){"@babel/helpers - typeof";return Ki=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ki(t)}function tB(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function Ape(t,e){for(var r=0;rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},"n"),e:o(function(u){throw u},"e"),f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,s=!1,l;return{s:o(function(){r=r.call(t)},"s"),n:o(function(){var u=r.next();return a=u.done,u},"n"),e:o(function(u){s=!0,l=u},"e"),f:o(function(){try{!a&&r.return!=null&&r.return()}finally{if(s)throw l}},"f")}}function Hqe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}function Wqe(t,e){return e={exports:{}},t(e,e.exports),e.exports}function Zqe(t){for(var e=t.length;e--&&Qqe.test(t.charAt(e)););return e}function tXe(t){return t&&t.slice(0,Jqe(t)+1).replace(eXe,"")}function sXe(t){var e=iXe.call(t,Hx),r=t[Hx];try{t[Hx]=void 0;var n=!0}catch{}var i=aXe.call(t);return n&&(e?t[Hx]=r:delete t[Hx]),i}function uXe(t){return cXe.call(t)}function pXe(t){return t==null?t===void 0?dXe:fXe:Npe&&Npe in Object(t)?oXe(t):hXe(t)}function mXe(t){return t!=null&&typeof t=="object"}function vXe(t){return typeof t=="symbol"||gXe(t)&&Zme(t)==yXe}function kXe(t){if(typeof t=="number")return t;if(mb(t))return Rpe;if(X0(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=X0(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=rXe(t);var r=bXe.test(t);return r||wXe.test(t)?TXe(t.slice(2),r?2:8):xXe.test(t)?Rpe:+t}function AXe(t,e,r){var n,i,a,s,l,u,h=0,f=!1,d=!1,p=!0;if(typeof t!="function")throw new TypeError(EXe);e=Mpe(e)||0,X0(r)&&(f=!!r.leading,d="maxWait"in r,a=d?SXe(Mpe(r.maxWait)||0,e):a,p="trailing"in r?!!r.trailing:p);function m(E){var L=n,S=i;return n=i=void 0,h=E,s=t.apply(S,L),s}o(m,"invokeFunc");function g(E){return h=E,l=setTimeout(x,e),f?m(E):s}o(g,"leadingEdge");function y(E){var L=E-u,S=E-h,A=e-L;return d?CXe(A,a-S):A}o(y,"remainingWait");function v(E){var L=E-u,S=E-h;return u===void 0||L>=e||L<0||d&&S>=a}o(v,"shouldInvoke");function x(){var E=CP();if(v(E))return b(E);l=setTimeout(x,y(E))}o(x,"timerExpired");function b(E){return l=void 0,p&&n?m(E):(n=i=void 0,s)}o(b,"trailingEdge");function w(){l!==void 0&&clearTimeout(l),h=0,n=u=i=l=void 0}o(w,"cancel");function _(){return l===void 0?s:b(CP())}o(_,"flush");function T(){var E=CP(),L=v(E);if(n=arguments,i=this,u=E,L){if(l===void 0)return g(u);if(d)return clearTimeout(l),l=setTimeout(x,e),m(u)}return l===void 0&&(l=setTimeout(x,e)),s}return o(T,"debounced"),T.cancel=w,T.flush=_,T}function V6(t,e,r,n,i,a){var s;return ni(t)?s=t:s=k1[t]||k1.euclidean,e===0&&ni(t)?s(i,a):s(e,r,n,i,a)}function xKe(t,e){if(U6(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||mb(t)?!0:vKe.test(t)||!yKe.test(t)||e!=null&&t in Object(e)}function SKe(t){if(!X0(t))return!1;var e=Zme(t);return e==TKe||e==kKe||e==wKe||e==EKe}function _Ke(t){return!!Jpe&&Jpe in t}function RKe(t){if(t!=null){try{return NKe.call(t)}catch{}try{return t+""}catch{}}return""}function $Ke(t){if(!X0(t)||LKe(t))return!1;var e=CKe(t)?GKe:OKe;return e.test(MKe(t))}function UKe(t,e){return t?.[e]}function WKe(t,e){var r=HKe(t,e);return VKe(r)?r:void 0}function qKe(){this.__data__=lb?lb(null):{},this.size=0}function jKe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}function eQe(t){var e=this.__data__;if(lb){var r=e[t];return r===QKe?void 0:r}return JKe.call(e,t)?e[t]:void 0}function iQe(t){var e=this.__data__;return lb?e[t]!==void 0:nQe.call(e,t)}function oQe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=lb&&e===void 0?sQe:e,this}function A1(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1}function wQe(t,e){var r=this.__data__,n=H6(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}function _1(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1&&t%1==0&&t0;){var f=i.shift();e(f),a.add(f.id()),l&&n(i,a,f)}return t}function Nge(t,e,r){if(r.isParent())for(var n=r._private.children,i=0;i0&&arguments[0]!==void 0?arguments[0]:aJe,e=arguments.length>1?arguments[1]:void 0,r=0;r0?k=C:D=C;while(Math.abs(R)>s&&++O=a?b(I,O):N===0?O:_(I,D,D+h)}o(T,"getTForX");var E=!1;function L(){E=!0,(t!==e||r!==n)&&w()}o(L,"precompute");var S=o(function(D){return E||L(),t===e&&r===n?D:D===0?0:D===1?1:v(T(D),e,n)},"f");S.getControlPoints=function(){return[{x:t,y:e},{x:r,y:n}]};var A="generateBezier("+[t,e,r,n]+")";return S.toString=function(){return A},S}function vme(t,e,r,n,i){if(n===1||e===r)return r;var a=i(e,r,n);return t==null||((t.roundValue||t.color)&&(a=Math.round(a)),t.min!==void 0&&(a=Math.max(a,t.min)),t.max!==void 0&&(a=Math.min(a,t.max))),a}function xme(t,e){return t.pfValue!=null||t.value!=null?t.pfValue!=null&&(e==null||e.type.units!=="%")?t.pfValue:t.value:t}function h1(t,e,r,n,i){var a=i!=null?i.type:null;r<0?r=0:r>1&&(r=1);var s=xme(t,i),l=xme(e,i);if(xt(s)&&xt(l))return vme(a,s,l,r,n);if(kn(s)&&kn(l)){for(var u=[],h=0;h0?(m==="spring"&&g.push(s.duration),s.easingImpl=w6[m].apply(null,g)):s.easingImpl=w6[m]}var y=s.easingImpl,v;if(s.duration===0?v=1:v=(r-u)/s.duration,s.applying&&(v=s.progress),v<0?v=0:v>1&&(v=1),s.delay==null){var x=s.startPosition,b=s.position;if(b&&i&&!t.locked()){var w={};Xx(x.x,b.x)&&(w.x=h1(x.x,b.x,v,y)),Xx(x.y,b.y)&&(w.y=h1(x.y,b.y,v,y)),t.position(w)}var _=s.startPan,T=s.pan,E=a.pan,L=T!=null&&n;L&&(Xx(_.x,T.x)&&(E.x=h1(_.x,T.x,v,y)),Xx(_.y,T.y)&&(E.y=h1(_.y,T.y,v,y)),t.emit("pan"));var S=s.startZoom,A=s.zoom,I=A!=null&&n;I&&(Xx(S,A)&&(a.zoom=sb(a.minZoom,h1(S,A,v,y),a.maxZoom)),t.emit("zoom")),(L||I)&&t.emit("viewport");var D=s.style;if(D&&D.length>0&&i){for(var k=0;k=0;L--){var S=E[L];S()}E.splice(0,E.length)},"callbacks"),b=m.length-1;b>=0;b--){var w=m[b],_=w._private;if(_.stopped){m.splice(b,1),_.hooked=!1,_.playing=!1,_.started=!1,x(_.frames);continue}!_.playing&&!_.applying||(_.playing&&_.applying&&(_.applying=!1),_.started||xJe(f,w,t),vJe(f,w,t,d),_.applying&&(_.applying=!1),x(_.frames),_.step!=null&&_.step(t),w.completed()&&(m.splice(b,1),_.hooked=!1,_.playing=!1,_.started=!1,x(_.completes)),y=!0)}return!d&&m.length===0&&g.length===0&&n.push(f),y}o(i,"stepOne");for(var a=!1,s=0;s0?e.notify("draw",r):e.notify("draw")),r.unmerge(n),e.emit("step")}function Xge(t){this.options=ir({},AJe,_Je,t)}function jge(t){this.options=ir({},LJe,t)}function Kge(t){this.options=ir({},DJe,t)}function Z6(t){this.options=ir({},NJe,t),this.options.layout=this;var e=this.options.eles.nodes(),r=this.options.eles.edges(),n=r.filter(function(i){var a=i.source().data("id"),s=i.target().data("id"),l=e.some(function(h){return h.data("id")===a}),u=e.some(function(h){return h.data("id")===s});return!l||!u});this.options.eles=this.options.eles.not(n)}function Zge(t){this.options=ir({},XJe,t)}function bB(t){this.options=ir({},jJe,t)}function Jge(t){this.options=ir({},KJe,t)}function e1e(t){this.options=ir({},QJe,t)}function t1e(t){this.options=t,this.notifications=0}function i1e(t,e){e.radius===0?t.lineTo(e.cx,e.cy):t.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function TB(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return n===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(eet(t,e,r,n,i),{cx:qP,cy:XP,radius:W0,startX:r1e,startY:n1e,stopX:jP,stopY:KP,startAngle:Qc.ang+Math.PI/2*Y0,endAngle:cl.ang-Math.PI/2*Y0,counterClockwise:E6})}function a1e(t){var e=[];if(t!=null){for(var r=0;r5&&arguments[5]!==void 0?arguments[5]:5,s=arguments.length>6?arguments[6]:void 0;t.beginPath(),t.moveTo(e+a,r),t.lineTo(e+n-a,r),t.quadraticCurveTo(e+n,r,e+n,r+a),t.lineTo(e+n,r+i-a),t.quadraticCurveTo(e+n,r+i,e+n-a,r+i),t.lineTo(e+a,r+i),t.quadraticCurveTo(e,r+i,e,r+i-a),t.lineTo(e,r+a),t.quadraticCurveTo(e,r,e+a,r),t.closePath(),s?t.stroke():t.fill()}function Het(t,e){for(var r=atob(t),n=new ArrayBuffer(r.length),i=new Uint8Array(n),a=0;a{"use strict";o(Ki,"_typeof");o(tB,"_classCallCheck");o(Ape,"_defineProperties");o(rB,"_createClass");o($me,"_defineProperty$1");o(jl,"_slicedToArray");o(vqe,"_arrayWithHoles");o(xqe,"_iterableToArrayLimit");o(Vme,"_unsupportedIterableToArray");o(_pe,"_arrayLikeToArray");o(bqe,"_nonIterableRest");o(Ume,"_createForOfIteratorHelper");Xi=typeof window>"u"?null:window,Lpe=Xi?Xi.navigator:null;Xi&&Xi.document;wqe=Ki(""),Hme=Ki({}),Tqe=Ki(function(){}),kqe=typeof HTMLElement>"u"?"undefined":Ki(HTMLElement),db=o(function(e){return e&&e.instanceString&&ni(e.instanceString)?e.instanceString():null},"instanceStr"),Zt=o(function(e){return e!=null&&Ki(e)==wqe},"string"),ni=o(function(e){return e!=null&&Ki(e)===Tqe},"fn"),kn=o(function(e){return!wo(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},"array"),Ur=o(function(e){return e!=null&&Ki(e)===Hme&&!kn(e)&&e.constructor===Object},"plainObject"),Eqe=o(function(e){return e!=null&&Ki(e)===Hme},"object"),xt=o(function(e){return e!=null&&Ki(e)===Ki(1)&&!isNaN(e)},"number"),Sqe=o(function(e){return xt(e)&&Math.floor(e)===e},"integer"),C6=o(function(e){if(kqe!=="undefined")return e!=null&&e instanceof HTMLElement},"htmlElement"),wo=o(function(e){return pb(e)||Wme(e)},"elementOrCollection"),pb=o(function(e){return db(e)==="collection"&&e._private.single},"element"),Wme=o(function(e){return db(e)==="collection"&&!e._private.single},"collection"),nB=o(function(e){return db(e)==="core"},"core"),Yme=o(function(e){return db(e)==="stylesheet"},"stylesheet"),Cqe=o(function(e){return db(e)==="event"},"event"),If=o(function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},"emptyString"),Aqe=o(function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},"domElement"),_qe=o(function(e){return Ur(e)&&xt(e.x1)&&xt(e.x2)&&xt(e.y1)&&xt(e.y2)},"boundingBox"),Lqe=o(function(e){return Eqe(e)&&ni(e.then)},"promise"),Dqe=o(function(){return Lpe&&Lpe.userAgent.match(/msie|trident|edge/i)},"ms"),rb=o(function(e,r){r||(r=o(function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var a=[],s=0;sr?1:0},"ascending"),Bqe=o(function(e,r){return-1*Xme(e,r)},"descending"),ir=Object.assign!=null?Object.assign.bind(Object):function(t){for(var e=arguments,r=1;r1&&(v-=1),v<1/6?g+(y-g)*6*v:v<1/2?y:v<2/3?g+(y-g)*(2/3-v)*6:g}o(f,"hue2rgb");var d=new RegExp("^"+Mqe+"$").exec(e);if(d){if(n=parseInt(d[1]),n<0?n=(360- -1*n%360)%360:n>360&&(n=n%360),n/=360,i=parseFloat(d[2]),i<0||i>100||(i=i/100,a=parseFloat(d[3]),a<0||a>100)||(a=a/100,s=d[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(i===0)l=u=h=Math.round(a*255);else{var p=a<.5?a*(1+i):a+i-a*i,m=2*a-p;l=Math.round(255*f(m,p,n+1/3)),u=Math.round(255*f(m,p,n)),h=Math.round(255*f(m,p,n-1/3))}r=[l,u,h,s]}return r},"hsl2tuple"),Gqe=o(function(e){var r,n=new RegExp("^"+Nqe+"$").exec(e);if(n){r=[];for(var i=[],a=1;a<=3;a++){var s=n[a];if(s[s.length-1]==="%"&&(i[a]=!0),s=parseFloat(s),i[a]&&(s=s/100*255),s<0||s>255)return;r.push(Math.floor(s))}var l=i[1]||i[2]||i[3],u=i[1]&&i[2]&&i[3];if(l&&!u)return;var h=n[4];if(h!==void 0){if(h=parseFloat(h),h<0||h>1)return;r.push(h)}}return r},"rgb2tuple"),$qe=o(function(e){return Uqe[e.toLowerCase()]},"colorname2tuple"),Vqe=o(function(e){return(kn(e)?e:null)||$qe(e)||Fqe(e)||Gqe(e)||zqe(e)},"color2tuple"),Uqe={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},jme=o(function(e){for(var r=e.map,n=e.keys,i=n.length,a=0;a1&&arguments[1]!==void 0?arguments[1]:p1,n=r,i;i=e.next(),!i.done;)n=n*ege+i.value|0;return n},"hashIterableInts"),nb=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p1;return r*ege+e|0},"hashInt"),ib=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Kx;return(r<<5)+r+e|0},"hashIntAlt"),LXe=o(function(e,r){return e*2097152+r},"combineHashes"),_f=o(function(e){return e[0]*2097152+e[1]},"combineHashesArray"),a6=o(function(e,r){return[nb(e[0],r[0]),ib(e[1],r[1])]},"hashArrays"),DXe=o(function(e,r){var n={value:0,done:!1},i=0,a=e.length,s={next:o(function(){return i=0&&!(e[i]===r&&(e.splice(i,1),n));i--);},"removeFromArray"),oB=o(function(e){e.splice(0,e.length)},"clearArray"),BXe=o(function(e,r){for(var n=0;n"u"?"undefined":Ki(Set))!==zXe?Set:GXe,G6=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||r===void 0||!nB(e)){di("An element must have a core reference and parameters set");return}var i=r.group;if(i==null&&(r.data&&r.data.source!=null&&r.data.target!=null?i="edges":i="nodes"),i!=="nodes"&&i!=="edges"){di("An element must be of type `nodes` or `edges`; you specified `"+i+"`");return}this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:r.data||{},position:r.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:i,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!r.selected,selectable:r.selectable===void 0?!0:!!r.selectable,locked:!!r.locked,grabbed:!1,grabbable:r.grabbable===void 0?!0:!!r.grabbable,pannable:r.pannable===void 0?i==="edges":!!r.pannable,active:!1,classes:new S1,animation:{current:[],queue:[]},rscratch:{},scratch:r.scratch||{},edges:[],children:[],parent:r.parent&&r.parent.isNode()?r.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(a.position.x==null&&(a.position.x=0),a.position.y==null&&(a.position.y=0),r.renderedPosition){var s=r.renderedPosition,l=e.pan(),u=e.zoom();a.position={x:(s.x-l.x)/u,y:(s.y-l.y)/u}}var h=[];kn(r.classes)?h=r.classes:Zt(r.classes)&&(h=r.classes.split(/\s+/));for(var f=0,d=h.length;fb?1:0},"defaultCmp"),f=o(function(x,b,w,_,T){var E;if(w==null&&(w=0),T==null&&(T=n),w<0)throw new Error("lo must be non-negative");for(_==null&&(_=x.length);w<_;)E=i((w+_)/2),T(b,x[E])<0?_=E:w=E+1;return[].splice.apply(x,[w,w-w].concat(b)),b},"insort"),l=o(function(x,b,w){return w==null&&(w=n),x.push(b),y(x,0,x.length-1,w)},"heappush"),s=o(function(x,b){var w,_;return b==null&&(b=n),w=x.pop(),x.length?(_=x[0],x[0]=w,v(x,0,b)):_=w,_},"heappop"),h=o(function(x,b,w){var _;return w==null&&(w=n),_=x[0],x[0]=b,v(x,0,w),_},"heapreplace"),u=o(function(x,b,w){var _;return w==null&&(w=n),x.length&&w(x[0],b)<0&&(_=[x[0],b],b=_[0],x[0]=_[1],v(x,0,w)),b},"heappushpop"),a=o(function(x,b){var w,_,T,E,L,S;for(b==null&&(b=n),E=function(){S=[];for(var A=0,I=i(x.length/2);0<=I?AI;0<=I?A++:A--)S.push(A);return S}.apply(this).reverse(),L=[],_=0,T=E.length;_D;0<=D?++S:--S)k.push(s(x,w));return k},"nsmallest"),y=o(function(x,b,w,_){var T,E,L;for(_==null&&(_=n),T=x[w];w>b;){if(L=w-1>>1,E=x[L],_(T,E)<0){x[w]=E,w=L;continue}break}return x[w]=T},"_siftdown"),v=o(function(x,b,w){var _,T,E,L,S;for(w==null&&(w=n),T=x.length,S=b,E=x[b],_=2*b+1;_0;){var E=b.pop(),L=v(E),S=E.id();if(p[S]=L,L!==1/0)for(var A=E.neighborhood().intersect(g),I=0;I0)for(F.unshift(P);d[G];){var z=d[G];F.unshift(z.edge),F.unshift(z.node),B=z.node,G=B.id()}return l.spawn(F)},"pathTo")}},"dijkstra")},HXe={kruskal:o(function(e){e=e||function(w){return 1};for(var r=this.byGroup(),n=r.nodes,i=r.edges,a=n.length,s=new Array(a),l=n,u=o(function(_){for(var T=0;T0;){if(T(),L++,_===f){for(var S=[],A=a,I=f,D=x[I];S.unshift(A),D!=null&&S.unshift(D),A=v[I],A!=null;)I=A.id(),D=x[I];return{found:!0,distance:d[_],path:this.spawn(S),steps:L}}m[_]=!0;for(var k=w._private.edges,R=0;RD&&(g[I]=D,b[I]=A,w[I]=T),!a){var k=A*f+S;!a&&g[k]>D&&(g[k]=D,b[k]=S,w[k]=T)}}}for(var R=0;R1&&arguments[1]!==void 0?arguments[1]:s,Ce=w(ke),Pe=[],Ie=Ce;;){if(Ie==null)return r.spawn();var $e=b(Ie),ye=$e.edge,X=$e.pred;if(Pe.unshift(Ie[0]),Ie.same(Re)&&Pe.length>0)break;ye!=null&&Pe.unshift(ye),Ie=X}return u.spawn(Pe)},"pathTo"),E=0;E=0;f--){var d=h[f],p=d[1],m=d[2];(r[p]===l&&r[m]===u||r[p]===u&&r[m]===l)&&h.splice(f,1)}for(var g=0;gi;){var a=Math.floor(Math.random()*r.length);r=ZXe(a,e,r),n--}return r},"contractUntil"),JXe={kargerStein:o(function(){var e=this,r=this.byGroup(),n=r.nodes,i=r.edges;i.unmergeBy(function(F){return F.isLoop()});var a=n.length,s=i.length,l=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),u=Math.floor(a/QXe);if(a<2){di("At least 2 nodes are required for Karger-Stein algorithm");return}for(var h=[],f=0;f1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=-1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=0,a=0,s=r;s1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;i?e=e.slice(r,n):(n0&&e.splice(0,r));for(var l=0,u=e.length-1;u>=0;u--){var h=e[u];s?isFinite(h)||(e[u]=-1/0,l++):e.splice(u,1)}a&&e.sort(function(p,m){return p-m});var f=e.length,d=Math.floor(f/2);return f%2!==0?e[d+1+l]:(e[d-1+l]+e[d+l])/2},"median"),aje=o(function(e){return Math.PI*e/180},"deg2rad"),s6=o(function(e,r){return Math.atan2(r,e)-Math.PI/2},"getAngleFromDisp"),lB=Math.log2||function(t){return Math.log(t)/Math.log(2)},lge=o(function(e){return e>0?1:e<0?-1:0},"signum"),K0=o(function(e,r){return Math.sqrt(U0(e,r))},"dist"),U0=o(function(e,r){var n=r.x-e.x,i=r.y-e.y;return n*n+i*i},"sqdist"),sje=o(function(e){for(var r=e.length,n=0,i=0;i=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},"makeBoundingBox"),lje=o(function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},"copyBoundingBox"),cje=o(function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},"clearBoundingBox"),uje=o(function(e,r,n){return{x1:e.x1+r,x2:e.x2+r,y1:e.y1+n,y2:e.y2+n,w:e.w,h:e.h}},"shiftBoundingBox"),cge=o(function(e,r){e.x1=Math.min(e.x1,r.x1),e.x2=Math.max(e.x2,r.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,r.y1),e.y2=Math.max(e.y2,r.y2),e.h=e.y2-e.y1},"updateBoundingBox"),hje=o(function(e,r,n){e.x1=Math.min(e.x1,r),e.x2=Math.max(e.x2,r),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},"expandBoundingBoxByPoint"),y6=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=r,e.x2+=r,e.y1-=r,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBox"),v6=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],n,i,a,s;if(r.length===1)n=i=a=s=r[0];else if(r.length===2)n=a=r[0],s=i=r[1];else if(r.length===4){var l=jl(r,4);n=l[0],i=l[1],a=l[2],s=l[3]}return e.x1-=s,e.x2+=i,e.y1-=n,e.y2+=a,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBoxSides"),Bpe=o(function(e,r){e.x1=r.x1,e.y1=r.y1,e.x2=r.x2,e.y2=r.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},"assignBoundingBox"),cB=o(function(e,r){return!(e.x1>r.x2||r.x1>e.x2||e.x2r.y2||r.y1>e.y2)},"boundingBoxesIntersect"),T1=o(function(e,r,n){return e.x1<=r&&r<=e.x2&&e.y1<=n&&n<=e.y2},"inBoundingBox"),fje=o(function(e,r){return T1(e,r.x,r.y)},"pointInBoundingBox"),uge=o(function(e,r){return T1(e,r.x1,r.y1)&&T1(e,r.x2,r.y2)},"boundingBoxInBoundingBox"),hge=o(function(e,r,n,i,a,s,l){var u=arguments.length>7&&arguments[7]!==void 0?arguments[7]:"auto",h=u==="auto"?Q0(a,s):u,f=a/2,d=s/2;h=Math.min(h,f,d);var p=h!==f,m=h!==d,g;if(p){var y=n-f+h-l,v=i-d-l,x=n+f-h+l,b=v;if(g=Nf(e,r,n,i,y,v,x,b,!1),g.length>0)return g}if(m){var w=n+f+l,_=i-d+h-l,T=w,E=i+d-h+l;if(g=Nf(e,r,n,i,w,_,T,E,!1),g.length>0)return g}if(p){var L=n-f+h-l,S=i+d+l,A=n+f-h+l,I=S;if(g=Nf(e,r,n,i,L,S,A,I,!1),g.length>0)return g}if(m){var D=n-f-l,k=i-d+h-l,R=D,C=i+d-h+l;if(g=Nf(e,r,n,i,D,k,R,C,!1),g.length>0)return g}var O;{var N=n-f+h,P=i-d+h;if(O=Qx(e,r,n,i,N,P,h+l),O.length>0&&O[0]<=N&&O[1]<=P)return[O[0],O[1]]}{var F=n+f-h,B=i-d+h;if(O=Qx(e,r,n,i,F,B,h+l),O.length>0&&O[0]>=F&&O[1]<=B)return[O[0],O[1]]}{var G=n+f-h,z=i+d-h;if(O=Qx(e,r,n,i,G,z,h+l),O.length>0&&O[0]>=G&&O[1]>=z)return[O[0],O[1]]}{var W=n-f+h,Z=i+d-h;if(O=Qx(e,r,n,i,W,Z,h+l),O.length>0&&O[0]<=W&&O[1]>=Z)return[O[0],O[1]]}return[]},"roundRectangleIntersectLine"),dje=o(function(e,r,n,i,a,s,l){var u=l,h=Math.min(n,a),f=Math.max(n,a),d=Math.min(i,s),p=Math.max(i,s);return h-u<=e&&e<=f+u&&d-u<=r&&r<=p+u},"inLineVicinity"),pje=o(function(e,r,n,i,a,s,l,u,h){var f={x1:Math.min(n,l,a)-h,x2:Math.max(n,l,a)+h,y1:Math.min(i,u,s)-h,y2:Math.max(i,u,s)+h};return!(ef.x2||rf.y2)},"inBezierVicinity"),mje=o(function(e,r,n,i){n-=i;var a=r*r-4*e*n;if(a<0)return[];var s=Math.sqrt(a),l=2*e,u=(-r+s)/l,h=(-r-s)/l;return[u,h]},"solveQuadratic"),gje=o(function(e,r,n,i,a){var s=1e-5;e===0&&(e=s),r/=e,n/=e,i/=e;var l,u,h,f,d,p,m,g;if(u=(3*n-r*r)/9,h=-(27*i)+r*(9*n-2*(r*r)),h/=54,l=u*u*u+h*h,a[1]=0,m=r/3,l>0){d=h+Math.sqrt(l),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),p=h-Math.sqrt(l),p=p<0?-Math.pow(-p,1/3):Math.pow(p,1/3),a[0]=-m+d+p,m+=(d+p)/2,a[4]=a[2]=-m,m=Math.sqrt(3)*(-p+d)/2,a[3]=m,a[5]=-m;return}if(a[5]=a[3]=0,l===0){g=h<0?-Math.pow(-h,1/3):Math.pow(h,1/3),a[0]=-m+2*g,a[4]=a[2]=-(g+m);return}u=-u,f=u*u*u,f=Math.acos(h/Math.sqrt(f)),g=2*Math.sqrt(u),a[0]=-m+g*Math.cos(f/3),a[2]=-m+g*Math.cos((f+2*Math.PI)/3),a[4]=-m+g*Math.cos((f+4*Math.PI)/3)},"solveCubic"),yje=o(function(e,r,n,i,a,s,l,u){var h=1*n*n-4*n*a+2*n*l+4*a*a-4*a*l+l*l+i*i-4*i*s+2*i*u+4*s*s-4*s*u+u*u,f=1*9*n*a-3*n*n-3*n*l-6*a*a+3*a*l+9*i*s-3*i*i-3*i*u-6*s*s+3*s*u,d=1*3*n*n-6*n*a+n*l-n*e+2*a*a+2*a*e-l*e+3*i*i-6*i*s+i*u-i*r+2*s*s+2*s*r-u*r,p=1*n*a-n*n+n*e-a*e+i*s-i*i+i*r-s*r,m=[];gje(h,f,d,p,m);for(var g=1e-7,y=[],v=0;v<6;v+=2)Math.abs(m[v+1])=0&&m[v]<=1&&y.push(m[v]);y.push(1),y.push(0);for(var x=-1,b,w,_,T=0;T=0?_h?(e-a)*(e-a)+(r-s)*(r-s):f-p},"sqdistToFiniteLine"),js=o(function(e,r,n){for(var i,a,s,l,u,h=0,f=0;f=e&&e>=s||i<=e&&e<=s)u=(e-i)/(s-i)*(l-a)+a,u>r&&h++;else continue;return h%2!==0},"pointInsidePolygonPoints"),ah=o(function(e,r,n,i,a,s,l,u,h){var f=new Array(n.length),d;u[0]!=null?(d=Math.atan(u[1]/u[0]),u[0]<0?d=d+Math.PI/2:d=-d-Math.PI/2):d=u;for(var p=Math.cos(-d),m=Math.sin(-d),g=0;g0){var v=D6(f,-h);y=L6(v)}else y=f;return js(e,r,y)},"pointInsidePolygon"),xje=o(function(e,r,n,i,a,s,l,u){for(var h=new Array(n.length*2),f=0;f=0&&v<=1&&b.push(v),x>=0&&x<=1&&b.push(x),b.length===0)return[];var w=b[0]*u[0]+e,_=b[0]*u[1]+r;if(b.length>1){if(b[0]==b[1])return[w,_];var T=b[1]*u[0]+e,E=b[1]*u[1]+r;return[w,_,T,E]}else return[w,_]},"intersectLineCircle"),LP=o(function(e,r,n){return r<=e&&e<=n||n<=e&&e<=r?e:e<=r&&r<=n||n<=r&&r<=e?r:n},"midOfThree"),Nf=o(function(e,r,n,i,a,s,l,u,h){var f=e-a,d=n-e,p=l-a,m=r-s,g=i-r,y=u-s,v=p*m-y*f,x=d*m-g*f,b=y*d-p*g;if(b!==0){var w=v/b,_=x/b,T=.001,E=0-T,L=1+T;return E<=w&&w<=L&&E<=_&&_<=L?[e+w*d,r+w*g]:h?[e+w*d,r+w*g]:[]}else return v===0||x===0?LP(e,n,l)===l?[l,u]:LP(e,n,a)===a?[a,s]:LP(a,l,n)===n?[n,i]:[]:[]},"finiteLinesIntersect"),ob=o(function(e,r,n,i,a,s,l,u){var h=[],f,d=new Array(n.length),p=!0;s==null&&(p=!1);var m;if(p){for(var g=0;g0){var y=D6(d,-u);m=L6(y)}else m=d}else m=n;for(var v,x,b,w,_=0;_2){for(var g=[f[0],f[1]],y=Math.pow(g[0]-e,2)+Math.pow(g[1]-r,2),v=1;vf&&(f=_)},"set"),get:o(function(w){return h[w]},"get")},p=0;p0?N=O.edgesTo(C)[0]:N=C.edgesTo(O)[0];var P=i(N);C=C.id(),S[C]>S[k]+P&&(S[C]=S[k]+P,A.nodes.indexOf(C)<0?A.push(C):A.updateItem(C),L[C]=0,E[C]=[]),S[C]==S[k]+P&&(L[C]=L[C]+L[k],E[C].push(k))}else for(var F=0;F0;){for(var W=T.pop(),Z=0;Z0&&l.push(n[u]);l.length!==0&&a.push(i.collection(l))}return a},"assign"),Oje=o(function(e,r){for(var n=0;n5&&arguments[5]!==void 0?arguments[5]:Fje,l=i,u,h,f=0;f=2?Wx(e,r,n,0,Vpe,zje):Wx(e,r,n,0,$pe)},"euclidean"),squaredEuclidean:o(function(e,r,n){return Wx(e,r,n,0,Vpe)},"squaredEuclidean"),manhattan:o(function(e,r,n){return Wx(e,r,n,0,$pe)},"manhattan"),max:o(function(e,r,n){return Wx(e,r,n,-1/0,Gje)},"max")};k1["squared-euclidean"]=k1.squaredEuclidean;k1.squaredeuclidean=k1.squaredEuclidean;o(V6,"clusteringDistance");$je=_a({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),hB=o(function(e){return $je(e)},"setOptions"),N6=o(function(e,r,n,i,a){var s=a!=="kMedoids",l=s?function(d){return n[d]}:function(d){return i[d](n)},u=o(function(p){return i[p](r)},"getQ"),h=n,f=r;return V6(e,i.length,l,u,h,f)},"getDist"),DP=o(function(e,r,n){for(var i=n.length,a=new Array(i),s=new Array(i),l=new Array(r),u=null,h=0;hn)return!1}return!0},"haveMatricesConverged"),Hje=o(function(e,r,n){for(var i=0;il&&(l=r[h][f],u=f);a[u].push(e[h])}for(var d=0;d=a.threshold||a.mode==="dendrogram"&&e.length===1)return!1;var g=r[s],y=r[i[s]],v;a.mode==="dendrogram"?v={left:g,right:y,key:g.key}:v={value:g.value.concat(y.value),key:g.key},e[g.index]=v,e.splice(y.index,1),r[g.key]=v;for(var x=0;xn[y.key][b.key]&&(u=n[y.key][b.key])):a.linkage==="max"?(u=n[g.key][b.key],n[g.key][b.key]0&&i.push(a);return i},"findExemplars"),Xpe=o(function(e,r,n){for(var i=[],a=0;al&&(s=h,l=r[a*e+h])}s>0&&i.push(s)}for(var f=0;fh&&(u=f,h=d)}n[a]=s[u]}return i=Xpe(e,r,n),i},"assign"),jpe=o(function(e){for(var r=this.cy(),n=this.nodes(),i=iKe(e),a={},s=0;s=D?(k=D,D=C,R=O):C>k&&(k=C);for(var N=0;N0?1:0;L[A%i.minIterations*l+W]=Z,z+=Z}if(z>0&&(A>=i.minIterations-1||A==i.maxIterations-1)){for(var j=0,oe=0;oe1||E>1)&&(l=!0),d[w]=[],b.outgoers().forEach(function(S){S.isEdge()&&d[w].push(S.id())})}else p[w]=[void 0,b.target().id()]}):s.forEach(function(b){var w=b.id();if(b.isNode()){var _=b.degree(!0);_%2&&(u?h?l=!0:h=w:u=w),d[w]=[],b.connectedEdges().forEach(function(T){return d[w].push(T.id())})}else p[w]=[b.source().id(),b.target().id()]});var m={found:!1,trail:void 0};if(l)return m;if(h&&u)if(a){if(f&&h!=f)return m;f=h}else{if(f&&h!=f&&u!=f)return m;f||(f=h)}else f||(f=s[0].id());var g=o(function(w){for(var _=w,T=[w],E,L,S;d[_].length;)E=d[_].shift(),L=p[E][0],S=p[E][1],_!=S?(d[S]=d[S].filter(function(A){return A!=E}),_=S):!a&&_!=L&&(d[L]=d[L].filter(function(A){return A!=E}),_=L),T.unshift(E),T.unshift(_);return T},"walk"),y=[],v=[];for(v=g(f);v.length!=1;)d[v[0]].length==0?(y.unshift(s.getElementById(v.shift())),y.unshift(s.getElementById(v.shift()))):v=g(v.shift()).concat(v);y.unshift(s.getElementById(v.shift()));for(var x in d)if(d[x].length)return m;return m.found=!0,m.trail=this.spawn(y,!0),m},"hierholzer")},c6=o(function(){var e=this,r={},n=0,i=0,a=[],s=[],l={},u=o(function(p,m){for(var g=s.length-1,y=[],v=e.spawn();s[g].x!=p||s[g].y!=m;)y.push(s.pop().edge),g--;y.push(s.pop().edge),y.forEach(function(x){var b=x.connectedNodes().intersection(e);v.merge(x),b.forEach(function(w){var _=w.id(),T=w.connectedEdges().intersection(e);v.merge(w),r[_].cutVertex?v.merge(T.filter(function(E){return E.isLoop()})):v.merge(T)})}),a.push(v)},"buildComponent"),h=o(function d(p,m,g){p===g&&(i+=1),r[m]={id:n,low:n++,cutVertex:!1};var y=e.getElementById(m).connectedEdges().intersection(e);if(y.size()===0)a.push(e.spawn(e.getElementById(m)));else{var v,x,b,w;y.forEach(function(_){v=_.source().id(),x=_.target().id(),b=v===m?x:v,b!==g&&(w=_.id(),l[w]||(l[w]=!0,s.push({x:m,y:b,edge:_})),b in r?r[m].low=Math.min(r[m].low,r[b].id):(d(p,b,m),r[m].low=Math.min(r[m].low,r[b].low),r[m].id<=r[b].low&&(r[m].cutVertex=!0,u(m,b))))})}},"biconnectedSearch");e.forEach(function(d){if(d.isNode()){var p=d.id();p in r||(i=0,h(p,p),r[p].cutVertex=i>1)}});var f=Object.keys(r).filter(function(d){return r[d].cutVertex}).map(function(d){return e.getElementById(d)});return{cut:e.spawn(f),components:a}},"hopcroftTarjanBiconnected"),fKe={hopcroftTarjanBiconnected:c6,htbc:c6,htb:c6,hopcroftTarjanBiconnectedComponents:c6},u6=o(function(){var e=this,r={},n=0,i=[],a=[],s=e.spawn(e),l=o(function u(h){a.push(h),r[h]={index:n,low:n++,explored:!1};var f=e.getElementById(h).connectedEdges().intersection(e);if(f.forEach(function(y){var v=y.target().id();v!==h&&(v in r||u(v),r[v].explored||(r[h].low=Math.min(r[h].low,r[v].low)))}),r[h].index===r[h].low){for(var d=e.spawn();;){var p=a.pop();if(d.merge(e.getElementById(p)),r[p].low=r[h].index,r[p].explored=!0,p===h)break}var m=d.edgesWith(d),g=d.merge(m);i.push(g),s=s.difference(g)}},"stronglyConnectedSearch");return e.forEach(function(u){if(u.isNode()){var h=u.id();h in r||l(h)}}),{cut:s,components:i}},"tarjanStronglyConnected"),dKe={tarjanStronglyConnected:u6,tsc:u6,tscc:u6,tarjanStronglyConnectedComponents:u6},vge={};[ab,UXe,HXe,YXe,XXe,KXe,JXe,Eje,v1,x1,$P,Bje,Kje,rKe,cKe,hKe,fKe,dKe].forEach(function(t){ir(vge,t)});xge=0,bge=1,wge=2,sh=o(function t(e){if(!(this instanceof t))return new t(e);this.id="Thenable/1.0.7",this.state=xge,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))},"api");sh.prototype={fulfill:o(function(e){return Kpe(this,bge,"fulfillValue",e)},"fulfill"),reject:o(function(e){return Kpe(this,wge,"rejectReason",e)},"reject"),then:o(function(e,r){var n=this,i=new sh;return n.onFulfilled.push(Zpe(e,i,"fulfill")),n.onRejected.push(Zpe(r,i,"reject")),Tge(n),i.proxy},"then")};Kpe=o(function(e,r,n,i){return e.state===xge&&(e.state=r,e[n]=i,Tge(e)),e},"deliver"),Tge=o(function(e){e.state===bge?Qpe(e,"onFulfilled",e.fulfillValue):e.state===wge&&Qpe(e,"onRejected",e.rejectReason)},"execute"),Qpe=o(function(e,r,n){if(e[r].length!==0){var i=e[r];e[r]=[];var a=o(function(){for(var l=0;l0},"animatedImpl")},"animated"),clearQueue:o(function(){return o(function(){var r=this,n=r.length!==void 0,i=n?r:[r],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var s=0;s0&&this.spawn(i).updateStyle().emit("class"),r},"classes"),addClass:o(function(e){return this.toggleClass(e,!0)},"addClass"),hasClass:o(function(e){var r=this[0];return r!=null&&r._private.classes.has(e)},"hasClass"),toggleClass:o(function(e,r){kn(e)||(e=e.match(/\S+/g)||[]);for(var n=this,i=r===void 0,a=[],s=0,l=n.length;s0&&this.spawn(a).updateStyle().emit("class"),n},"toggleClass"),removeClass:o(function(e){return this.toggleClass(e,!1)},"removeClass"),flashClass:o(function(e,r){var n=this;if(r==null)r=250;else if(r===0)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},r),n},"flashClass")};x6.className=x6.classNames=x6.classes;Vr={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:ji,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Vr.variable="(?:[\\w-.]|(?:\\\\"+Vr.metaChar+"))+";Vr.className="(?:[\\w-]|(?:\\\\"+Vr.metaChar+"))+";Vr.value=Vr.string+"|"+Vr.number;Vr.id=Vr.variable;(function(){var t,e,r;for(t=Vr.comparatorOp.split("|"),r=0;r=0)&&e!=="="&&(Vr.comparatorOp+="|\\!"+e)})();pn=o(function(){return{checks:[]}},"newQuery"),Mt={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},UP=[{selector:":selected",matches:o(function(e){return e.selected()},"matches")},{selector:":unselected",matches:o(function(e){return!e.selected()},"matches")},{selector:":selectable",matches:o(function(e){return e.selectable()},"matches")},{selector:":unselectable",matches:o(function(e){return!e.selectable()},"matches")},{selector:":locked",matches:o(function(e){return e.locked()},"matches")},{selector:":unlocked",matches:o(function(e){return!e.locked()},"matches")},{selector:":visible",matches:o(function(e){return e.visible()},"matches")},{selector:":hidden",matches:o(function(e){return!e.visible()},"matches")},{selector:":transparent",matches:o(function(e){return e.transparent()},"matches")},{selector:":grabbed",matches:o(function(e){return e.grabbed()},"matches")},{selector:":free",matches:o(function(e){return!e.grabbed()},"matches")},{selector:":removed",matches:o(function(e){return e.removed()},"matches")},{selector:":inside",matches:o(function(e){return!e.removed()},"matches")},{selector:":grabbable",matches:o(function(e){return e.grabbable()},"matches")},{selector:":ungrabbable",matches:o(function(e){return!e.grabbable()},"matches")},{selector:":animated",matches:o(function(e){return e.animated()},"matches")},{selector:":unanimated",matches:o(function(e){return!e.animated()},"matches")},{selector:":parent",matches:o(function(e){return e.isParent()},"matches")},{selector:":childless",matches:o(function(e){return e.isChildless()},"matches")},{selector:":child",matches:o(function(e){return e.isChild()},"matches")},{selector:":orphan",matches:o(function(e){return e.isOrphan()},"matches")},{selector:":nonorphan",matches:o(function(e){return e.isChild()},"matches")},{selector:":compound",matches:o(function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()},"matches")},{selector:":loop",matches:o(function(e){return e.isLoop()},"matches")},{selector:":simple",matches:o(function(e){return e.isSimple()},"matches")},{selector:":active",matches:o(function(e){return e.active()},"matches")},{selector:":inactive",matches:o(function(e){return!e.active()},"matches")},{selector:":backgrounding",matches:o(function(e){return e.backgrounding()},"matches")},{selector:":nonbackgrounding",matches:o(function(e){return!e.backgrounding()},"matches")}].sort(function(t,e){return Bqe(t.selector,e.selector)}),CZe=function(){for(var t={},e,r=0;r0&&f.edgeCount>0)return on("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(f.edgeCount>1)return on("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;f.edgeCount===1&&on("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},"parse"),RZe=o(function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=o(function(f){return f??""},"clean"),r=o(function(f){return Zt(f)?'"'+f+'"':e(f)},"cleanVal"),n=o(function(f){return" "+f+" "},"space"),i=o(function(f,d){var p=f.type,m=f.value;switch(p){case Mt.GROUP:{var g=e(m);return g.substring(0,g.length-1)}case Mt.DATA_COMPARE:{var y=f.field,v=f.operator;return"["+y+n(e(v))+r(m)+"]"}case Mt.DATA_BOOL:{var x=f.operator,b=f.field;return"["+e(x)+b+"]"}case Mt.DATA_EXIST:{var w=f.field;return"["+w+"]"}case Mt.META_COMPARE:{var _=f.operator,T=f.field;return"[["+T+n(e(_))+r(m)+"]]"}case Mt.STATE:return m;case Mt.ID:return"#"+m;case Mt.CLASS:return"."+m;case Mt.PARENT:case Mt.CHILD:return a(f.parent,d)+n(">")+a(f.child,d);case Mt.ANCESTOR:case Mt.DESCENDANT:return a(f.ancestor,d)+" "+a(f.descendant,d);case Mt.COMPOUND_SPLIT:{var E=a(f.left,d),L=a(f.subject,d),S=a(f.right,d);return E+(E.length>0?" ":"")+L+S}case Mt.TRUE:return""}},"checkToString"),a=o(function(f,d){return f.checks.reduce(function(p,m,g){return p+(d===f&&g===0?"$":"")+i(m,d)},"")},"queryToString"),s="",l=0;l1&&l=0&&(r=r.replace("!",""),d=!0),r.indexOf("@")>=0&&(r=r.replace("@",""),f=!0),(a||l||f)&&(u=!a&&!s?"":""+e,h=""+n),f&&(e=u=u.toLowerCase(),n=h=h.toLowerCase()),r){case"*=":i=u.indexOf(h)>=0;break;case"$=":i=u.indexOf(h,u.length-h.length)>=0;break;case"^=":i=u.indexOf(h)===0;break;case"=":i=e===n;break;case">":p=!0,i=e>n;break;case">=":p=!0,i=e>=n;break;case"<":p=!0,i=e1&&arguments[1]!==void 0?arguments[1]:!0;return gB(this,t,e,Nge)};o(Rge,"addParent");E1.forEachUp=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return gB(this,t,e,Rge)};o(GZe,"addParentAndChildren");E1.forEachUpAndDown=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return gB(this,t,e,GZe)};E1.ancestors=E1.parents;cb=Mge={data:sn.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:sn.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:sn.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:sn.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:sn.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:sn.removeData({field:"rscratch",triggerEvent:!1}),id:o(function(){var e=this[0];if(e)return e._private.data.id},"id")};cb.attr=cb.data;cb.removeAttr=cb.removeData;$Ze=Mge,Y6={};o(RP,"defineDegreeFunction");ir(Y6,{degree:RP(function(t,e){return e.source().same(e.target())?2:1}),indegree:RP(function(t,e){return e.target().same(t)?1:0}),outdegree:RP(function(t,e){return e.source().same(t)?1:0})});o(u1,"defineDegreeBoundsFunction");ir(Y6,{minDegree:u1("degree",function(t,e){return te}),minIndegree:u1("indegree",function(t,e){return te}),minOutdegree:u1("outdegree",function(t,e){return te})});ir(Y6,{totalDegree:o(function(e){for(var r=0,n=this.nodes(),i=0;i0,p=d;d&&(f=f[0]);var m=p?f.position():{x:0,y:0};r!==void 0?h.position(e,r+m[e]):a!==void 0&&h.position({x:a.x+m.x,y:a.y+m.y})}else{var g=n.position(),y=l?n.parent():null,v=y&&y.length>0,x=v;v&&(y=y[0]);var b=x?y.position():{x:0,y:0};return a={x:g.x-b.x,y:g.y-b.y},e===void 0?a:a[e]}else if(!s)return;return this},"relativePosition")};Zl.modelPosition=Zl.point=Zl.position;Zl.modelPositions=Zl.points=Zl.positions;Zl.renderedPoint=Zl.renderedPosition;Zl.relativePoint=Zl.relativePosition;VZe=Ige;b1=zf={};zf.renderedBoundingBox=function(t){var e=this.boundingBox(t),r=this.cy(),n=r.zoom(),i=r.pan(),a=e.x1*n+i.x,s=e.x2*n+i.x,l=e.y1*n+i.y,u=e.y2*n+i.y;return{x1:a,x2:s,y1:l,y2:u,w:s-a,h:u-l}};zf.dirtyCompoundBoundsCache=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(r){if(r.isParent()){var n=r._private;n.compoundBoundsClean=!1,n.bbCache=null,t||r.emitAndNotify("bounds")}}),this)};zf.updateCompoundBounds=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!t&&e.batching())return this;function r(s){if(!s.isParent())return;var l=s._private,u=s.children(),h=s.pstyle("compound-sizing-wrt-labels").value==="include",f={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},d=u.boundingBox({includeLabels:h,includeOverlays:!1,useCache:!1}),p=l.position;(d.w===0||d.h===0)&&(d={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},d.x1=p.x-d.w/2,d.x2=p.x+d.w/2,d.y1=p.y-d.h/2,d.y2=p.y+d.h/2);function m(A,I,D){var k=0,R=0,C=I+D;return A>0&&C>0&&(k=I/C*A,R=D/C*A),{biasDiff:k,biasComplementDiff:R}}o(m,"computeBiasValues");function g(A,I,D,k){if(D.units==="%")switch(k){case"width":return A>0?D.pfValue*A:0;case"height":return I>0?D.pfValue*I:0;case"average":return A>0&&I>0?D.pfValue*(A+I)/2:0;case"min":return A>0&&I>0?A>I?D.pfValue*I:D.pfValue*A:0;case"max":return A>0&&I>0?A>I?D.pfValue*A:D.pfValue*I:0;default:return 0}else return D.units==="px"?D.pfValue:0}o(g,"computePaddingValues");var y=f.width.left.value;f.width.left.units==="px"&&f.width.val>0&&(y=y*100/f.width.val);var v=f.width.right.value;f.width.right.units==="px"&&f.width.val>0&&(v=v*100/f.width.val);var x=f.height.top.value;f.height.top.units==="px"&&f.height.val>0&&(x=x*100/f.height.val);var b=f.height.bottom.value;f.height.bottom.units==="px"&&f.height.val>0&&(b=b*100/f.height.val);var w=m(f.width.val-d.w,y,v),_=w.biasDiff,T=w.biasComplementDiff,E=m(f.height.val-d.h,x,b),L=E.biasDiff,S=E.biasComplementDiff;l.autoPadding=g(d.w,d.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),l.autoWidth=Math.max(d.w,f.width.val),p.x=(-_+d.x1+d.x2+T)/2,l.autoHeight=Math.max(d.h,f.height.val),p.y=(-L+d.y1+d.y2+S)/2}o(r,"update");for(var n=0;ne.x2?i:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},"updateBounds"),H0=o(function(e,r){return r==null?e:Kl(e,r.x1,r.y1,r.x2,r.y2)},"updateBoundsFromBox"),Yx=o(function(e,r,n){return Ql(e,r,n)},"prefixedProperty"),h6=o(function(e,r,n){if(!r.cy().headless()){var i=r._private,a=i.rstyle,s=a.arrowWidth/2,l=r.pstyle(n+"-arrow-shape").value,u,h;if(l!=="none"){n==="source"?(u=a.srcX,h=a.srcY):n==="target"?(u=a.tgtX,h=a.tgtY):(u=a.midX,h=a.midY);var f=i.arrowBounds=i.arrowBounds||{},d=f[n]=f[n]||{};d.x1=u-s,d.y1=h-s,d.x2=u+s,d.y2=h+s,d.w=d.x2-d.x1,d.h=d.y2-d.y1,y6(d,1),Kl(e,d.x1,d.y1,d.x2,d.y2)}}},"updateBoundsFromArrow"),MP=o(function(e,r,n){if(!r.cy().headless()){var i;n?i=n+"-":i="";var a=r._private,s=a.rstyle,l=r.pstyle(i+"label").strValue;if(l){var u=r.pstyle("text-halign"),h=r.pstyle("text-valign"),f=Yx(s,"labelWidth",n),d=Yx(s,"labelHeight",n),p=Yx(s,"labelX",n),m=Yx(s,"labelY",n),g=r.pstyle(i+"text-margin-x").pfValue,y=r.pstyle(i+"text-margin-y").pfValue,v=r.isEdge(),x=r.pstyle(i+"text-rotation"),b=r.pstyle("text-outline-width").pfValue,w=r.pstyle("text-border-width").pfValue,_=w/2,T=r.pstyle("text-background-padding").pfValue,E=2,L=d,S=f,A=S/2,I=L/2,D,k,R,C;if(v)D=p-A,k=p+A,R=m-I,C=m+I;else{switch(u.value){case"left":D=p-S,k=p;break;case"center":D=p-A,k=p+A;break;case"right":D=p,k=p+S;break}switch(h.value){case"top":R=m-L,C=m;break;case"center":R=m-I,C=m+I;break;case"bottom":R=m,C=m+L;break}}D+=g-Math.max(b,_)-T-E,k+=g+Math.max(b,_)+T+E,R+=y-Math.max(b,_)-T-E,C+=y+Math.max(b,_)+T+E;var O=n||"main",N=a.labelBounds,P=N[O]=N[O]||{};P.x1=D,P.y1=R,P.x2=k,P.y2=C,P.w=k-D,P.h=C-R;var F=v&&x.strValue==="autorotate",B=x.pfValue!=null&&x.pfValue!==0;if(F||B){var G=F?Yx(a.rstyle,"labelAngle",n):x.pfValue,z=Math.cos(G),W=Math.sin(G),Z=(D+k)/2,j=(R+C)/2;if(!v){switch(u.value){case"left":Z=k;break;case"right":Z=D;break}switch(h.value){case"top":j=C;break;case"bottom":j=R;break}}var oe=o(function(ue,ce){return ue=ue-Z,ce=ce-j,{x:ue*z-ce*W+Z,y:ue*W+ce*z+j}},"rotate"),K=oe(D,R),ee=oe(D,C),J=oe(k,R),H=oe(k,C);D=Math.min(K.x,ee.x,J.x,H.x),k=Math.max(K.x,ee.x,J.x,H.x),R=Math.min(K.y,ee.y,J.y,H.y),C=Math.max(K.y,ee.y,J.y,H.y)}var q=O+"Rot",Q=N[q]=N[q]||{};Q.x1=D,Q.y1=R,Q.x2=k,Q.y2=C,Q.w=k-D,Q.h=C-R,Kl(e,D,R,k,C),Kl(a.labelBounds.all,D,R,k,C)}return e}},"updateBoundsFromLabel"),UZe=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("outline-opacity").value,i=r.pstyle("outline-width").value;if(n>0&&i>0){var a=r.pstyle("outline-offset").value,s=r.pstyle("shape").value,l=i+a,u=(e.w+l*2)/e.w,h=(e.h+l*2)/e.h,f=0,d=0;["diamond","pentagon","round-triangle"].includes(s)?(u=(e.w+l*2.4)/e.w,d=-l/3.6):["concave-hexagon","rhomboid","right-rhomboid"].includes(s)?u=(e.w+l*2.4)/e.w:s==="star"?(u=(e.w+l*2.8)/e.w,h=(e.h+l*2.6)/e.h,d=-l/3.8):s==="triangle"?(u=(e.w+l*2.8)/e.w,h=(e.h+l*2.4)/e.h,d=-l/1.4):s==="vee"&&(u=(e.w+l*4.4)/e.w,h=(e.h+l*3.8)/e.h,d=-l*.5);var p=e.h*h-e.h,m=e.w*u-e.w;if(v6(e,[Math.ceil(p/2),Math.ceil(m/2)]),f!=0||d!==0){var g=uje(e,f,d);cge(e,g)}}}},"updateBoundsFromOutline"),HZe=o(function(e,r){var n=e._private.cy,i=n.styleEnabled(),a=n.headless(),s=Ks(),l=e._private,u=e.isNode(),h=e.isEdge(),f,d,p,m,g,y,v=l.rstyle,x=u&&i?e.pstyle("bounds-expansion").pfValue:[0],b=o(function(Ne){return Ne.pstyle("display").value!=="none"},"isDisplayed"),w=!i||b(e)&&(!h||b(e.source())&&b(e.target()));if(w){var _=0,T=0;i&&r.includeOverlays&&(_=e.pstyle("overlay-opacity").value,_!==0&&(T=e.pstyle("overlay-padding").value));var E=0,L=0;i&&r.includeUnderlays&&(E=e.pstyle("underlay-opacity").value,E!==0&&(L=e.pstyle("underlay-padding").value));var S=Math.max(T,L),A=0,I=0;if(i&&(A=e.pstyle("width").pfValue,I=A/2),u&&r.includeNodes){var D=e.position();g=D.x,y=D.y;var k=e.outerWidth(),R=k/2,C=e.outerHeight(),O=C/2;f=g-R,d=g+R,p=y-O,m=y+O,Kl(s,f,p,d,m),i&&r.includeOutlines&&UZe(s,e)}else if(h&&r.includeEdges)if(i&&!a){var N=e.pstyle("curve-style").strValue;if(f=Math.min(v.srcX,v.midX,v.tgtX),d=Math.max(v.srcX,v.midX,v.tgtX),p=Math.min(v.srcY,v.midY,v.tgtY),m=Math.max(v.srcY,v.midY,v.tgtY),f-=I,d+=I,p-=I,m+=I,Kl(s,f,p,d,m),N==="haystack"){var P=v.haystackPts;if(P&&P.length===2){if(f=P[0].x,p=P[0].y,d=P[1].x,m=P[1].y,f>d){var F=f;f=d,d=F}if(p>m){var B=p;p=m,m=B}Kl(s,f-I,p-I,d+I,m+I)}}else if(N==="bezier"||N==="unbundled-bezier"||N.endsWith("segments")||N.endsWith("taxi")){var G;switch(N){case"bezier":case"unbundled-bezier":G=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":G=v.linePts;break}if(G!=null)for(var z=0;zd){var ee=f;f=d,d=ee}if(p>m){var J=p;p=m,m=J}f-=I,d+=I,p-=I,m+=I,Kl(s,f,p,d,m)}if(i&&r.includeEdges&&h&&(h6(s,e,"mid-source"),h6(s,e,"mid-target"),h6(s,e,"source"),h6(s,e,"target")),i){var H=e.pstyle("ghost").value==="yes";if(H){var q=e.pstyle("ghost-offset-x").pfValue,Q=e.pstyle("ghost-offset-y").pfValue;Kl(s,s.x1+q,s.y1+Q,s.x2+q,s.y2+Q)}}var ae=l.bodyBounds=l.bodyBounds||{};Bpe(ae,s),v6(ae,x),y6(ae,1),i&&(f=s.x1,d=s.x2,p=s.y1,m=s.y2,Kl(s,f-S,p-S,d+S,m+S));var ue=l.overlayBounds=l.overlayBounds||{};Bpe(ue,s),v6(ue,x),y6(ue,1);var ce=l.labelBounds=l.labelBounds||{};ce.all!=null?cje(ce.all):ce.all=Ks(),i&&r.includeLabels&&(r.includeMainLabels&&MP(s,e,null),h&&(r.includeSourceLabels&&MP(s,e,"source"),r.includeTargetLabels&&MP(s,e,"target")))}return s.x1=ul(s.x1),s.y1=ul(s.y1),s.x2=ul(s.x2),s.y2=ul(s.y2),s.w=ul(s.x2-s.x1),s.h=ul(s.y2-s.y1),s.w>0&&s.h>0&&w&&(v6(s,x),y6(s,1)),s},"boundingBoxImpl"),Pge=o(function(e){var r=0,n=o(function(s){return(s?1:0)<=0;l--)s(l);return this};Ff.removeAllListeners=function(){return this.removeListener("*")};Ff.emit=Ff.trigger=function(t,e,r){var n=this.listeners,i=n.length;return this.emitting++,kn(e)||(e=[e]),sJe(this,function(a,s){r!=null&&(n=[{event:s.event,type:s.type,namespace:s.namespace,callback:r}],i=n.length);for(var l=o(function(f){var d=n[f];if(d.type===s.type&&(!d.namespace||d.namespace===s.namespace||d.namespace===iJe)&&a.eventMatches(a.context,d,s)){var p=[s];e!=null&&BXe(p,e),a.beforeEmit(a.context,d,s),d.conf&&d.conf.one&&(a.listeners=a.listeners.filter(function(y){return y!==d}));var m=a.callbackContext(a.context,d,s),g=d.callback.apply(m,p);a.afterEmit(a.context,d,s),g===!1&&(s.stopPropagation(),s.preventDefault())}},"_loop2"),u=0;u1&&!s){var l=this.length-1,u=this[l],h=u._private.data.id;this[l]=void 0,this[e]=u,a.set(h,{ele:u,index:e})}return this.length--,this},"unmergeAt"),unmergeOne:o(function(e){e=e[0];var r=this._private,n=e._private.data.id,i=r.map,a=i.get(n);if(!a)return this;var s=a.index;return this.unmergeAt(s),this},"unmergeOne"),unmerge:o(function(e){var r=this._private.cy;if(!e)return this;if(e&&Zt(e)){var n=e;e=r.mutableElements().filter(n)}for(var i=0;i=0;r--){var n=this[r];e(n)&&this.unmergeAt(r)}return this},"unmergeBy"),map:o(function(e,r){for(var n=[],i=this,a=0;an&&(n=u,i=l)}return{value:n,ele:i}},"max"),min:o(function(e,r){for(var n=1/0,i,a=this,s=0;s=0&&a"u"?"undefined":Ki(Symbol))!=e&&Ki(Symbol.iterator)!=e;r&&(R6[Symbol.iterator]=function(){var n=this,i={value:void 0,done:!1},a=0,s=this.length;return $me({next:o(function(){return a1&&arguments[1]!==void 0?arguments[1]:!0,n=this[0],i=n.cy();if(i.styleEnabled()&&n){this.cleanStyle();var a=n._private.style[e];return a??(r?i.style().getDefaultProperty(e):null)}},"parsedStyle"),numericStyle:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r){var n=r.pstyle(e);return n.pfValue!==void 0?n.pfValue:n.value}},"numericStyle"),numericStyleUnits:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r)return r.pstyle(e).units},"numericStyleUnits"),renderedStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=this[0];if(n)return r.style().getRenderedStyle(n,e)},"renderedStyle"),style:o(function(e,r){var n=this.cy();if(!n.styleEnabled())return this;var i=!1,a=n.style();if(Ur(e)){var s=e;a.applyBypass(this,s,i),this.emitAndNotify("style")}else if(Zt(e))if(r===void 0){var l=this[0];return l?a.getStylePropertyValue(l,e):void 0}else a.applyBypass(this,e,r,i),this.emitAndNotify("style");else if(e===void 0){var u=this[0];return u?a.getRawStyle(u):void 0}return this},"style"),removeStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,i=r.style(),a=this;if(e===void 0)for(var s=0;s0&&e.push(f[0]),e.push(l[0])}return this.spawn(e,!0).filter(t)},"neighborhood"),closedNeighborhood:o(function(e){return this.neighborhood().add(this).filter(e)},"closedNeighborhood"),openNeighborhood:o(function(e){return this.neighborhood(e)},"openNeighborhood")});Ha.neighbourhood=Ha.neighborhood;Ha.closedNeighbourhood=Ha.closedNeighborhood;Ha.openNeighbourhood=Ha.openNeighborhood;ir(Ha,{source:hl(o(function(e){var r=this[0],n;return r&&(n=r._private.source||r.cy().collection()),n&&e?n.filter(e):n},"sourceImpl"),"source"),target:hl(o(function(e){var r=this[0],n;return r&&(n=r._private.target||r.cy().collection()),n&&e?n.filter(e):n},"targetImpl"),"target"),sources:mme({attr:"source"}),targets:mme({attr:"target"})});o(mme,"defineSourceFunction");ir(Ha,{edgesWith:hl(gme(),"edgesWith"),edgesTo:hl(gme({thisIsSrc:!0}),"edgesTo")});o(gme,"defineEdgesWithFunction");ir(Ha,{connectedEdges:hl(function(t){for(var e=[],r=this,n=0;n0);return s},"components"),component:o(function(){var e=this[0];return e.cy().mutableElements().components(e)[0]},"component")});Ha.componentsOf=Ha.components;Aa=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){di("A collection must have a reference to the core");return}var a=new Jc,s=!1;if(!r)r=[];else if(r.length>0&&Ur(r[0])&&!pb(r[0])){s=!0;for(var l=[],u=new S1,h=0,f=r.length;h0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=r.cy(),i=n._private,a=[],s=[],l,u=0,h=r.length;u0){for(var B=l.length===r.length?r:new Aa(n,l),G=0;G0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=[],i={},a=r._private.cy;function s(C){for(var O=C._private.edges,N=0;N0&&(t?D.emitAndNotify("remove"):e&&D.emit("remove"));for(var k=0;kf&&Math.abs(g.v)>f;);return p?function(y){return u[y*(u.length-1)|0]}:h},"springRK4Factory")}(),Rn=o(function(e,r,n,i){var a=gJe(e,r,n,i);return function(s,l,u){return s+(l-s)*a(u)}},"cubicBezier"),w6={linear:o(function(e,r,n){return e+(r-e)*n},"linear"),ease:Rn(.25,.1,.25,1),"ease-in":Rn(.42,0,1,1),"ease-out":Rn(0,0,.58,1),"ease-in-out":Rn(.42,0,.58,1),"ease-in-sine":Rn(.47,0,.745,.715),"ease-out-sine":Rn(.39,.575,.565,1),"ease-in-out-sine":Rn(.445,.05,.55,.95),"ease-in-quad":Rn(.55,.085,.68,.53),"ease-out-quad":Rn(.25,.46,.45,.94),"ease-in-out-quad":Rn(.455,.03,.515,.955),"ease-in-cubic":Rn(.55,.055,.675,.19),"ease-out-cubic":Rn(.215,.61,.355,1),"ease-in-out-cubic":Rn(.645,.045,.355,1),"ease-in-quart":Rn(.895,.03,.685,.22),"ease-out-quart":Rn(.165,.84,.44,1),"ease-in-out-quart":Rn(.77,0,.175,1),"ease-in-quint":Rn(.755,.05,.855,.06),"ease-out-quint":Rn(.23,1,.32,1),"ease-in-out-quint":Rn(.86,0,.07,1),"ease-in-expo":Rn(.95,.05,.795,.035),"ease-out-expo":Rn(.19,1,.22,1),"ease-in-out-expo":Rn(1,0,0,1),"ease-in-circ":Rn(.6,.04,.98,.335),"ease-out-circ":Rn(.075,.82,.165,1),"ease-in-out-circ":Rn(.785,.135,.15,.86),spring:o(function(e,r,n){if(n===0)return w6.linear;var i=yJe(e,r,n);return function(a,s,l){return a+(s-a)*i(l)}},"spring"),"cubic-bezier":Rn};o(vme,"getEasedValue");o(xme,"getValue");o(h1,"ease");o(vJe,"step$1");o(Xx,"valid");o(xJe,"startAnimation");o(bme,"stepAll");bJe={animate:sn.animate(),animation:sn.animation(),animated:sn.animated(),clearQueue:sn.clearQueue(),delay:sn.delay(),delayAnimation:sn.delayAnimation(),stop:sn.stop(),addToAnimationPool:o(function(e){var r=this;r.styleEnabled()&&r._private.aniEles.merge(e)},"addToAnimationPool"),stopAnimationLoop:o(function(){this._private.animationsRunning=!1},"stopAnimationLoop"),startAnimationLoop:o(function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function r(){e._private.animationsRunning&&A6(o(function(a){bme(a,e),r()},"animationStep"))}o(r,"headlessStep");var n=e.renderer();n&&n.beforeRender?n.beforeRender(o(function(a,s){bme(s,e)},"rendererAnimationStep"),n.beforeRenderPriorities.animations):r()},"startAnimationLoop")},wJe={qualifierCompare:o(function(e,r){return e==null||r==null?e==null&&r==null:e.sameText(r)},"qualifierCompare"),eventMatches:o(function(e,r,n){var i=r.qualifier;return i!=null?e!==n.target&&pb(n.target)&&i.matches(n.target):!0},"eventMatches"),addEventFields:o(function(e,r){r.cy=e,r.target=e},"addEventFields"),callbackContext:o(function(e,r,n){return r.qualifier!=null?n.target:e},"callbackContext")},p6=o(function(e){return Zt(e)?new Pf(e):e},"argSelector"),qge={createEmitter:o(function(){var e=this._private;return e.emitter||(e.emitter=new q6(wJe,this)),this},"createEmitter"),emitter:o(function(){return this._private.emitter},"emitter"),on:o(function(e,r,n){return this.emitter().on(e,p6(r),n),this},"on"),removeListener:o(function(e,r,n){return this.emitter().removeListener(e,p6(r),n),this},"removeListener"),removeAllListeners:o(function(){return this.emitter().removeAllListeners(),this},"removeAllListeners"),one:o(function(e,r,n){return this.emitter().one(e,p6(r),n),this},"one"),once:o(function(e,r,n){return this.emitter().one(e,p6(r),n),this},"once"),emit:o(function(e,r){return this.emitter().emit(e,r),this},"emit"),emitAndNotify:o(function(e,r){return this.emit(e),this.notify(e,r),this},"emitAndNotify")};sn.eventAliasesOn(qge);WP={png:o(function(e){var r=this._private.renderer;return e=e||{},r.png(e)},"png"),jpg:o(function(e){var r=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",r.jpg(e)},"jpg")};WP.jpeg=WP.jpg;T6={layout:o(function(e){var r=this;if(e==null){di("Layout options must be specified to make a layout");return}if(e.name==null){di("A `name` must be specified to make a layout");return}var n=e.name,i=r.extension("layout",n);if(i==null){di("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var a;Zt(e.eles)?a=r.$(e.eles):a=e.eles!=null?e.eles:r.$();var s=new i(ir({},e,{cy:r,eles:a}));return s},"layout")};T6.createLayout=T6.makeLayout=T6.layout;TJe={notify:o(function(e,r){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var i=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();r!=null&&i.merge(r);return}if(n.notificationsEnabled){var a=this.renderer();this.destroyed()||!a||a.notify(e,r)}},"notify"),notifications:o(function(e){var r=this._private;return e===void 0?r.notificationsEnabled:(r.notificationsEnabled=!!e,this)},"notifications"),noNotifications:o(function(e){this.notifications(!1),e(),this.notifications(!0)},"noNotifications"),batching:o(function(){return this._private.batchCount>0},"batching"),startBatch:o(function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},"startBatch"),endBatch:o(function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var r=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var i=e.batchNotifications[n];i.empty()?r.notify(n):r.notify(n,i)})}return this},"endBatch"),batch:o(function(e){return this.startBatch(),e(),this.endBatch(),this},"batch"),batchData:o(function(e){var r=this;return this.batch(function(){for(var n=Object.keys(e),i=0;i0;)r.removeChild(r.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(n){var i=n._private;i.rscratch={},i.rstyle={},i.animation.current=[],i.animation.queue=[]})},"destroyRenderer"),onRender:o(function(e){return this.on("render",e)},"onRender"),offRender:o(function(e){return this.off("render",e)},"offRender")};YP.invalidateDimensions=YP.resize;k6={collection:o(function(e,r){return Zt(e)?this.$(e):wo(e)?e.collection():kn(e)?(r||(r={}),new Aa(this,e,r.unique,r.removed)):new Aa(this)},"collection"),nodes:o(function(e){var r=this.$(function(n){return n.isNode()});return e?r.filter(e):r},"nodes"),edges:o(function(e){var r=this.$(function(n){return n.isEdge()});return e?r.filter(e):r},"edges"),$:o(function(e){var r=this._private.elements;return e?r.filter(e):r.spawnSelf()},"$"),mutableElements:o(function(){return this._private.elements},"mutableElements")};k6.elements=k6.filter=k6.$;Ya={},eb="t",EJe="f";Ya.apply=function(t){for(var e=this,r=e._private,n=r.cy,i=n.collection(),a=0;a0;if(p||d&&m){var g=void 0;p&&m||p?g=h.properties:m&&(g=h.mappedProperties);for(var y=0;y1&&(_=1),l.color){var E=n.valueMin[0],L=n.valueMax[0],S=n.valueMin[1],A=n.valueMax[1],I=n.valueMin[2],D=n.valueMax[2],k=n.valueMin[3]==null?1:n.valueMin[3],R=n.valueMax[3]==null?1:n.valueMax[3],C=[Math.round(E+(L-E)*_),Math.round(S+(A-S)*_),Math.round(I+(D-I)*_),Math.round(k+(R-k)*_)];a={bypass:n.bypass,name:n.name,value:C,strValue:"rgb("+C[0]+", "+C[1]+", "+C[2]+")"}}else if(l.number){var O=n.valueMin+(n.valueMax-n.valueMin)*_;a=this.parse(n.name,O,n.bypass,p)}else return!1;if(!a)return y(),!1;a.mapping=n,n=a;break}case s.data:{for(var N=n.field.split("."),P=d.data,F=0;F0&&a>0){for(var l={},u=!1,h=0;h0?t.delayAnimation(s).play().promise().then(w):w()}).then(function(){return t.animation({style:l,duration:a,easing:t.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){r.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1})}else n.transitioning&&(this.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1)};Ya.checkTrigger=function(t,e,r,n,i,a){var s=this.properties[e],l=i(s);l!=null&&l(r,n)&&a(s)};Ya.checkZOrderTrigger=function(t,e,r,n){var i=this;this.checkTrigger(t,e,r,n,function(a){return a.triggersZOrder},function(){i._private.cy.notify("zorder",t)})};Ya.checkBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBounds},function(i){t.dirtyCompoundBoundsCache(),t.dirtyBoundingBoxCache(),i.triggersBoundsOfParallelBeziers&&e==="curve-style"&&(r==="bezier"||n==="bezier")&&t.parallelEdges().forEach(function(a){a.isBundledBezier()&&a.dirtyBoundingBoxCache()}),i.triggersBoundsOfConnectedEdges&&e==="display"&&(r==="none"||n==="none")&&t.connectedEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};Ya.checkTriggers=function(t,e,r,n){t.dirtyStyleCache(),this.checkZOrderTrigger(t,e,r,n),this.checkBoundsTrigger(t,e,r,n)};vb={};vb.applyBypass=function(t,e,r,n){var i=this,a=[],s=!0;if(e==="*"||e==="**"){if(r!==void 0)for(var l=0;li.length?n=n.substr(i.length):n=""}o(l,"removeSelAndBlockFromRemaining");function u(){a.length>s.length?a=a.substr(s.length):a=""}for(o(u,"removePropAndValFromRem");;){var h=n.match(/^\s*$/);if(h)break;var f=n.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!f){on("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+n);break}i=f[0];var d=f[1];if(d!=="core"){var p=new Pf(d);if(p.invalid){on("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),l();continue}}var m=f[2],g=!1;a=m;for(var y=[];;){var v=a.match(/^\s*$/);if(v)break;var x=a.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!x){on("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+m),g=!0;break}s=x[0];var b=x[1],w=x[2],_=e.properties[b];if(!_){on("Skipping property: Invalid property name in: "+s),u();continue}var T=r.parse(b,w);if(!T){on("Skipping property: Invalid property definition in: "+s),u();continue}y.push({name:b,val:w}),u()}if(g){l();break}r.selector(d);for(var E=0;E=7&&e[0]==="d"&&(f=new RegExp(l.data.regex).exec(e))){if(r)return!1;var p=l.data;return{name:t,value:f,strValue:""+e,mapped:p,field:f[1],bypass:r}}else if(e.length>=10&&e[0]==="m"&&(d=new RegExp(l.mapData.regex).exec(e))){if(r||h.multiple)return!1;var m=l.mapData;if(!(h.color||h.number))return!1;var g=this.parse(t,d[4]);if(!g||g.mapped)return!1;var y=this.parse(t,d[5]);if(!y||y.mapped)return!1;if(g.pfValue===y.pfValue||g.strValue===y.strValue)return on("`"+t+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+t+": "+g.strValue+"`"),this.parse(t,g.strValue);if(h.color){var v=g.value,x=y.value,b=v[0]===x[0]&&v[1]===x[1]&&v[2]===x[2]&&(v[3]===x[3]||(v[3]==null||v[3]===1)&&(x[3]==null||x[3]===1));if(b)return!1}return{name:t,value:d,strValue:""+e,mapped:m,field:d[1],fieldMin:parseFloat(d[2]),fieldMax:parseFloat(d[3]),valueMin:g.value,valueMax:y.value,bypass:r}}}if(h.multiple&&n!=="multiple"){var w;if(u?w=e.split(/\s+/):kn(e)?w=e:w=[e],h.evenMultiple&&w.length%2!==0)return null;for(var _=[],T=[],E=[],L="",S=!1,A=0;A0?" ":"")+I.strValue}return h.validate&&!h.validate(_,T)?null:h.singleEnum&&S?_.length===1&&Zt(_[0])?{name:t,value:_[0],strValue:_[0],bypass:r}:null:{name:t,value:_,pfValue:E,strValue:L,bypass:r,units:T}}var D=o(function(){for(var H=0;Hh.max||h.strictMax&&e===h.max))return null;var N={name:t,value:e,strValue:""+e+(k||""),units:k,bypass:r};return h.unitless||k!=="px"&&k!=="em"?N.pfValue=e:N.pfValue=k==="px"||!k?e:this.getEmSizeInPixels()*e,(k==="ms"||k==="s")&&(N.pfValue=k==="ms"?e:1e3*e),(k==="deg"||k==="rad")&&(N.pfValue=k==="rad"?e:aje(e)),k==="%"&&(N.pfValue=e/100),N}else if(h.propList){var P=[],F=""+e;if(F!=="none"){for(var B=F.split(/\s*,\s*|\s+/),G=0;G0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0){u=Math.min((s-2*r)/n.w,(l-2*r)/n.h),u=u>this._private.maxZoom?this._private.maxZoom:u,u=u=n.minZoom&&(n.maxZoom=r),this},"zoomRange"),minZoom:o(function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},"minZoom"),maxZoom:o(function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},"maxZoom"),getZoomedViewport:o(function(e){var r=this._private,n=r.pan,i=r.zoom,a,s,l=!1;if(r.zoomingEnabled||(l=!0),xt(e)?s=e:Ur(e)&&(s=e.level,e.position!=null?a=$6(e.position,i,n):e.renderedPosition!=null&&(a=e.renderedPosition),a!=null&&!r.panningEnabled&&(l=!0)),s=s>r.maxZoom?r.maxZoom:s,s=sr.maxZoom||!r.zoomingEnabled?s=!0:(r.zoom=u,a.push("zoom"))}if(i&&(!s||!e.cancelOnFailedZoom)&&r.panningEnabled){var h=e.pan;xt(h.x)&&(r.pan.x=h.x,l=!1),xt(h.y)&&(r.pan.y=h.y,l=!1),l||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},"viewport"),center:o(function(e){var r=this.getCenterPan(e);return r&&(this._private.pan=r,this.emit("pan viewport"),this.notify("viewport")),this},"center"),getCenterPan:o(function(e,r){if(this._private.panningEnabled){if(Zt(e)){var n=e;e=this.mutableElements().filter(n)}else wo(e)||(e=this.mutableElements());if(e.length!==0){var i=e.boundingBox(),a=this.width(),s=this.height();r=r===void 0?this._private.zoom:r;var l={x:(a-r*(i.x1+i.x2))/2,y:(s-r*(i.y1+i.y2))/2};return l}}},"getCenterPan"),reset:o(function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},"reset"),invalidateSize:o(function(){this._private.sizeCache=null},"invalidateSize"),size:o(function(){var e=this._private,r=e.container,n=this;return e.sizeCache=e.sizeCache||(r?function(){var i=n.window().getComputedStyle(r),a=o(function(l){return parseFloat(i.getPropertyValue(l))},"val");return{width:r.clientWidth-a("padding-left")-a("padding-right"),height:r.clientHeight-a("padding-top")-a("padding-bottom")}}():{width:1,height:1})},"size"),width:o(function(){return this.size().width},"width"),height:o(function(){return this.size().height},"height"),extent:o(function(){var e=this._private.pan,r=this._private.zoom,n=this.renderedExtent(),i={x1:(n.x1-e.x)/r,x2:(n.x2-e.x)/r,y1:(n.y1-e.y)/r,y2:(n.y2-e.y)/r};return i.w=i.x2-i.x1,i.h=i.y2-i.y1,i},"extent"),renderedExtent:o(function(){var e=this.width(),r=this.height();return{x1:0,y1:0,x2:e,y2:r,w:e,h:r}},"renderedExtent"),multiClickDebounceTime:o(function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this},"multiClickDebounceTime")};J0.centre=J0.center;J0.autolockNodes=J0.autolock;J0.autoungrabifyNodes=J0.autoungrabify;hb={data:sn.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:sn.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:sn.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:sn.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};hb.attr=hb.data;hb.removeAttr=hb.removeData;fb=o(function(e){var r=this;e=ir({},e);var n=e.container;n&&!C6(n)&&C6(n[0])&&(n=n[0]);var i=n?n._cyreg:null;i=i||{},i&&i.cy&&(i.cy.destroy(),i={});var a=i.readies=i.readies||[];n&&(n._cyreg=i),i.cy=r;var s=Xi!==void 0&&n!==void 0&&!e.headless,l=e;l.layout=ir({name:s?"grid":"null"},l.layout),l.renderer=ir({name:s?"canvas":"null"},l.renderer);var u=o(function(g,y,v){return y!==void 0?y:v!==void 0?v:g},"defVal"),h=this._private={container:n,ready:!1,options:l,elements:new Aa(this),listeners:[],aniEles:new Aa(this),data:l.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:u(!0,l.zoomingEnabled),userZoomingEnabled:u(!0,l.userZoomingEnabled),panningEnabled:u(!0,l.panningEnabled),userPanningEnabled:u(!0,l.userPanningEnabled),boxSelectionEnabled:u(!0,l.boxSelectionEnabled),autolock:u(!1,l.autolock,l.autolockNodes),autoungrabify:u(!1,l.autoungrabify,l.autoungrabifyNodes),autounselectify:u(!1,l.autounselectify),styleEnabled:l.styleEnabled===void 0?s:l.styleEnabled,zoom:xt(l.zoom)?l.zoom:1,pan:{x:Ur(l.pan)&&xt(l.pan.x)?l.pan.x:0,y:Ur(l.pan)&&xt(l.pan.y)?l.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:u(250,l.multiClickDebounceTime)};this.createEmitter(),this.selectionType(l.selectionType),this.zoomRange({min:l.minZoom,max:l.maxZoom});var f=o(function(g,y){var v=g.some(Lqe);if(v)return C1.all(g).then(y);y(g)},"loadExtData");h.styleEnabled&&r.setStyle([]);var d=ir({},l,l.renderer);r.initRenderer(d);var p=o(function(g,y,v){r.notifications(!1);var x=r.mutableElements();x.length>0&&x.remove(),g!=null&&(Ur(g)||kn(g))&&r.add(g),r.one("layoutready",function(w){r.notifications(!0),r.emit(w),r.one("load",y),r.emitAndNotify("load")}).one("layoutstop",function(){r.one("done",v),r.emit("done")});var b=ir({},r._private.options.layout);b.eles=r.elements(),r.layout(b).run()},"setElesAndLayout");f([l.style,l.elements],function(m){var g=m[0],y=m[1];h.styleEnabled&&r.style().append(g),p(y,function(){r.startAnimationLoop(),h.ready=!0,ni(l.ready)&&r.on("ready",l.ready);for(var v=0;v0,u=Ks(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),h;if(wo(e.roots))h=e.roots;else if(kn(e.roots)){for(var f=[],d=0;d0;){var O=C(),N=I(O,k);if(N)O.outgoers().filter(function(ce){return ce.isNode()&&n.has(ce)}).forEach(R);else if(N===null){on("Detected double maximal shift for node `"+O.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}A();var P=0;if(e.avoidOverlap)for(var F=0;F0&&x[0].length<=3?Ie/2:0),X=2*Math.PI/x[se].length*ke;return se===0&&x[0].length===1&&(ye=1),{x:Q.x+ye*Math.cos(X),y:Q.y+ye*Math.sin(X)}}else{var $e={x:Q.x+(ke+1-(Re+1)/2)*Ce,y:(se+1)*Pe};return $e}},"getPosition");return n.nodes().layoutPositions(this,e,ue),this};LJe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(jge,"CircleLayout");jge.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=n.nodes().not(":parent");e.sort&&(a=a.sort(e.sort));for(var s=Ks(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=e.sweep===void 0?2*Math.PI-2*Math.PI/a.length:e.sweep,h=u/Math.max(1,a.length-1),f,d=0,p=0;p1&&e.avoidOverlap){d*=1.75;var x=Math.cos(h)-Math.cos(0),b=Math.sin(h)-Math.sin(0),w=Math.sqrt(d*d/(x*x+b*b));f=Math.max(w,f)}var _=o(function(E,L){var S=e.startAngle+L*h*(i?1:-1),A=f*Math.cos(S),I=f*Math.sin(S),D={x:l.x+A,y:l.y+I};return D},"getPos");return n.nodes().layoutPositions(this,e,_),this};DJe={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:o(function(e){return e.degree()},"concentric"),levelWidth:o(function(e){return e.maxDegree()/4},"levelWidth"),animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(Kge,"ConcentricLayout");Kge.prototype.run=function(){for(var t=this.options,e=t,r=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,n=t.cy,i=e.eles,a=i.nodes().not(":parent"),s=Ks(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=[],h=0,f=0;f0){var T=Math.abs(b[0].value-_.value);T>=v&&(b=[],x.push(b))}b.push(_)}var E=h+e.minNodeSpacing;if(!e.avoidOverlap){var L=x.length>0&&x[0].length>1,S=Math.min(s.w,s.h)/2-E,A=S/(x.length+L?1:0);E=Math.min(E,A)}for(var I=0,D=0;D1&&e.avoidOverlap){var O=Math.cos(C)-Math.cos(0),N=Math.sin(C)-Math.sin(0),P=Math.sqrt(E*E/(O*O+N*N));I=Math.max(P,I)}k.r=I,I+=E}if(e.equidistant){for(var F=0,B=0,G=0;G=t.numIter||(FJe(n,t),n.temperature=n.temperature*t.coolingFactor,n.temperature=t.animationThreshold&&a(),A6(d)}},"frame");f()}else{for(;h;)h=s(u),u++;kme(n,t),l()}return this};Z6.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};Z6.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};RJe=o(function(e,r,n){for(var i=n.eles.edges(),a=n.eles.nodes(),s=Ks(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),l={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:i.size(),temperature:n.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},u=n.eles.components(),h={},f=0;f0){l.graphSet.push(S);for(var f=0;fi.count?0:i.graph},"findLCA"),IJe=o(function t(e,r,n,i){var a=i.graphSet[n];if(-10)var d=i.nodeOverlap*f,p=Math.sqrt(l*l+u*u),m=d*l/p,g=d*u/p;else var y=I6(e,l,u),v=I6(r,-1*l,-1*u),x=v.x-y.x,b=v.y-y.y,w=x*x+b*b,p=Math.sqrt(w),d=(e.nodeRepulsion+r.nodeRepulsion)/w,m=d*x/p,g=d*b/p;e.isLocked||(e.offsetX-=m,e.offsetY-=g),r.isLocked||(r.offsetX+=m,r.offsetY+=g)}},"nodeRepulsion"),$Je=o(function(e,r,n,i){if(n>0)var a=e.maxX-r.minX;else var a=r.maxX-e.minX;if(i>0)var s=e.maxY-r.minY;else var s=r.maxY-e.minY;return a>=0&&s>=0?Math.sqrt(a*a+s*s):0},"nodesOverlap"),I6=o(function(e,r,n){var i=e.positionX,a=e.positionY,s=e.height||1,l=e.width||1,u=n/r,h=s/l,f={};return r===0&&0n?(f.x=i,f.y=a+s/2,f):0r&&-1*h<=u&&u<=h?(f.x=i-l/2,f.y=a-l*n/2/r,f):0=h)?(f.x=i+s*r/2/n,f.y=a+s/2,f):(0>n&&(u<=-1*h||u>=h)&&(f.x=i-s*r/2/n,f.y=a-s/2),f)},"findClippingPoint"),VJe=o(function(e,r){for(var n=0;nn){var v=r.gravity*m/y,x=r.gravity*g/y;p.offsetX+=v,p.offsetY+=x}}}}},"calculateGravityForces"),HJe=o(function(e,r){var n=[],i=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;i<=a;){var s=n[i++],l=e.idToIndex[s],u=e.layoutNodes[l],h=u.children;if(0n)var a={x:n*e/i,y:n*r/i};else var a={x:e,y:r};return a},"limitForce"),qJe=o(function t(e,r){var n=e.parentId;if(n!=null){var i=r.layoutNodes[r.idToIndex[n]],a=!1;if((i.maxX==null||e.maxX+i.padRight>i.maxX)&&(i.maxX=e.maxX+i.padRight,a=!0),(i.minX==null||e.minX-i.padLefti.maxY)&&(i.maxY=e.maxY+i.padBottom,a=!0),(i.minY==null||e.minY-i.padTopx&&(g+=v+r.componentSpacing,m=0,y=0,v=0)}}},"separateComponents"),XJe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:o(function(e){},"position"),sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(Zge,"GridLayout");Zge.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=n.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));var a=Ks(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(a.h===0||a.w===0)n.nodes().layoutPositions(this,e,function(Z){return{x:a.x1,y:a.y1}});else{var s=i.size(),l=Math.sqrt(s*a.h/a.w),u=Math.round(l),h=Math.round(a.w/a.h*l),f=o(function(j){if(j==null)return Math.min(u,h);var oe=Math.min(u,h);oe==u?u=j:h=j},"small"),d=o(function(j){if(j==null)return Math.max(u,h);var oe=Math.max(u,h);oe==u?u=j:h=j},"large"),p=e.rows,m=e.cols!=null?e.cols:e.columns;if(p!=null&&m!=null)u=p,h=m;else if(p!=null&&m==null)u=p,h=Math.ceil(s/u);else if(p==null&&m!=null)h=m,u=Math.ceil(s/h);else if(h*u>s){var g=f(),y=d();(g-1)*y>=s?f(g-1):(y-1)*g>=s&&d(y-1)}else for(;h*u=s?d(x+1):f(v+1)}var b=a.w/h,w=a.h/u;if(e.condense&&(b=0,w=0),e.avoidOverlap)for(var _=0;_=h&&(O=0,C++)},"moveToNextCell"),P={},F=0;F(O=vje(t,e,N[P],N[P+1],N[P+2],N[P+3])))return v(L,O),!0}else if(A.edgeType==="bezier"||A.edgeType==="multibezier"||A.edgeType==="self"||A.edgeType==="compound"){for(var N=A.allpts,P=0;P+5(O=yje(t,e,N[P],N[P+1],N[P+2],N[P+3],N[P+4],N[P+5])))return v(L,O),!0}for(var F=F||S.source,B=B||S.target,G=i.getArrowWidth(I,D),z=[{name:"source",x:A.arrowStartX,y:A.arrowStartY,angle:A.srcArrowAngle},{name:"target",x:A.arrowEndX,y:A.arrowEndY,angle:A.tgtArrowAngle},{name:"mid-source",x:A.midX,y:A.midY,angle:A.midsrcArrowAngle},{name:"mid-target",x:A.midX,y:A.midY,angle:A.midtgtArrowAngle}],P=0;P0&&(x(F),x(B))}o(b,"checkEdge");function w(L,S,A){return Ql(L,S,A)}o(w,"preprop");function _(L,S){var A=L._private,I=p,D;S?D=S+"-":D="",L.boundingBox();var k=A.labelBounds[S||"main"],R=L.pstyle(D+"label").value,C=L.pstyle("text-events").strValue==="yes";if(!(!C||!R)){var O=w(A.rscratch,"labelX",S),N=w(A.rscratch,"labelY",S),P=w(A.rscratch,"labelAngle",S),F=L.pstyle(D+"text-margin-x").pfValue,B=L.pstyle(D+"text-margin-y").pfValue,G=k.x1-I-F,z=k.x2+I-F,W=k.y1-I-B,Z=k.y2+I-B;if(P){var j=Math.cos(P),oe=Math.sin(P),K=o(function(ue,ce){return ue=ue-O,ce=ce-N,{x:ue*j-ce*oe+O,y:ue*oe+ce*j+N}},"rotate"),ee=K(G,W),J=K(G,Z),H=K(z,W),q=K(z,Z),Q=[ee.x+F,ee.y+B,H.x+F,H.y+B,q.x+F,q.y+B,J.x+F,J.y+B];if(js(t,e,Q))return v(L),!0}else if(T1(k,t,e))return v(L),!0}}o(_,"checkLabel");for(var T=s.length-1;T>=0;T--){var E=s[T];E.isNode()?x(E)||_(E):b(E)||_(E)||_(E,"source")||_(E,"target")}return l};tp.getAllInBox=function(t,e,r,n){var i=this.getCachedZSortedEles().interactive,a=[],s=Math.min(t,r),l=Math.max(t,r),u=Math.min(e,n),h=Math.max(e,n);t=s,r=l,e=u,n=h;for(var f=Ks({x1:t,y1:e,x2:r,y2:n}),d=0;d0?-(Math.PI-e.ang):Math.PI+e.ang},"invertVec"),eet=o(function(e,r,n,i,a){if(e!==_me?Lme(r,e,Qc):JJe(cl,Qc),Lme(r,n,cl),Cme=Qc.nx*cl.ny-Qc.ny*cl.nx,Ame=Qc.nx*cl.nx-Qc.ny*-cl.ny,nh=Math.asin(Math.max(-1,Math.min(1,Cme))),Math.abs(nh)<1e-6){qP=r.x,XP=r.y,W0=d1=0;return}Y0=1,E6=!1,Ame<0?nh<0?nh=Math.PI+nh:(nh=Math.PI-nh,Y0=-1,E6=!0):nh>0&&(Y0=-1,E6=!0),r.radius!==void 0?d1=r.radius:d1=i,$0=nh/2,m6=Math.min(Qc.len/2,cl.len/2),a?(Kc=Math.abs(Math.cos($0)*d1/Math.sin($0)),Kc>m6?(Kc=m6,W0=Math.abs(Kc*Math.sin($0)/Math.cos($0))):W0=d1):(Kc=Math.min(m6,d1),W0=Math.abs(Kc*Math.sin($0)/Math.cos($0))),jP=r.x+cl.nx*Kc,KP=r.y+cl.ny*Kc,qP=jP-cl.ny*W0*Y0,XP=KP+cl.nx*W0*Y0,r1e=r.x+Qc.nx*Kc,n1e=r.y+Qc.ny*Kc,_me=r},"calcCornerArc");o(i1e,"drawPreparedRoundCorner");o(TB,"getRoundCorner");qa={};qa.findMidptPtsEtc=function(t,e){var r=e.posPts,n=e.intersectionPts,i=e.vectorNormInverse,a,s=t.pstyle("source-endpoint"),l=t.pstyle("target-endpoint"),u=s.units!=null&&l.units!=null,h=o(function(T,E,L,S){var A=S-E,I=L-T,D=Math.sqrt(I*I+A*A);return{x:-A/D,y:I/D}},"recalcVectorNormInverse"),f=t.pstyle("edge-distances").value;switch(f){case"node-position":a=r;break;case"intersection":a=n;break;case"endpoints":{if(u){var d=this.manualEndptToPx(t.source()[0],s),p=jl(d,2),m=p[0],g=p[1],y=this.manualEndptToPx(t.target()[0],l),v=jl(y,2),x=v[0],b=v[1],w={x1:m,y1:g,x2:x,y2:b};i=h(m,g,x,b),a=w}else on("Edge ".concat(t.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),a=n;break}}return{midptPts:a,vectorNormInverse:i}};qa.findHaystackPoints=function(t){for(var e=0;e0?Math.max(ie-Ee,0):Math.min(ie+Ee,0)},"subDWH"),R=k(I,S),C=k(D,A),O=!1;b===h?x=Math.abs(R)>Math.abs(C)?i:n:b===u||b===l?(x=n,O=!0):(b===a||b===s)&&(x=i,O=!0);var N=x===n,P=N?C:R,F=N?D:I,B=lge(F),G=!1;!(O&&(_||E))&&(b===l&&F<0||b===u&&F>0||b===a&&F>0||b===s&&F<0)&&(B*=-1,P=B*Math.abs(P),G=!0);var z;if(_){var W=T<0?1+T:T;z=W*P}else{var Z=T<0?P:0;z=Z+T*B}var j=o(function(ie){return Math.abs(ie)=Math.abs(P)},"getIsTooClose"),oe=j(z),K=j(Math.abs(P)-Math.abs(z)),ee=oe||K;if(ee&&!G)if(N){var J=Math.abs(F)<=p/2,H=Math.abs(I)<=m/2;if(J){var q=(f.x1+f.x2)/2,Q=f.y1,ae=f.y2;r.segpts=[q,Q,q,ae]}else if(H){var ue=(f.y1+f.y2)/2,ce=f.x1,te=f.x2;r.segpts=[ce,ue,te,ue]}else r.segpts=[f.x1,f.y2]}else{var Ne=Math.abs(F)<=d/2,se=Math.abs(D)<=g/2;if(Ne){var ke=(f.y1+f.y2)/2,Re=f.x1,Ce=f.x2;r.segpts=[Re,ke,Ce,ke]}else if(se){var Pe=(f.x1+f.x2)/2,Ie=f.y1,$e=f.y2;r.segpts=[Pe,Ie,Pe,$e]}else r.segpts=[f.x2,f.y1]}else if(N){var ye=f.y1+z+(v?p/2*B:0),X=f.x1,fe=f.x2;r.segpts=[X,ye,fe,ye]}else{var he=f.x1+z+(v?d/2*B:0),ge=f.y1,ne=f.y2;r.segpts=[he,ge,he,ne]}if(r.isRound){var ve=t.pstyle("taxi-radius").value,U=t.pstyle("radius-type").value[0]==="arc-radius";r.radii=new Array(r.segpts.length/2).fill(ve),r.isArcRadius=new Array(r.segpts.length/2).fill(U)}};qa.tryToCorrectInvalidPoints=function(t,e){var r=t._private.rscratch;if(r.edgeType==="bezier"){var n=e.srcPos,i=e.tgtPos,a=e.srcW,s=e.srcH,l=e.tgtW,u=e.tgtH,h=e.srcShape,f=e.tgtShape,d=e.srcCornerRadius,p=e.tgtCornerRadius,m=e.srcRs,g=e.tgtRs,y=!xt(r.startX)||!xt(r.startY),v=!xt(r.arrowStartX)||!xt(r.arrowStartY),x=!xt(r.endX)||!xt(r.endY),b=!xt(r.arrowEndX)||!xt(r.arrowEndY),w=3,_=this.getArrowWidth(t.pstyle("width").pfValue,t.pstyle("arrow-scale").value)*this.arrowShapeWidth,T=w*_,E=K0({x:r.ctrlpts[0],y:r.ctrlpts[1]},{x:r.startX,y:r.startY}),L=EC.poolIndex()){var O=R;R=C,C=O}var N=A.srcPos=R.position(),P=A.tgtPos=C.position(),F=A.srcW=R.outerWidth(),B=A.srcH=R.outerHeight(),G=A.tgtW=C.outerWidth(),z=A.tgtH=C.outerHeight(),W=A.srcShape=r.nodeShapes[e.getNodeShape(R)],Z=A.tgtShape=r.nodeShapes[e.getNodeShape(C)],j=A.srcCornerRadius=R.pstyle("corner-radius").value==="auto"?"auto":R.pstyle("corner-radius").pfValue,oe=A.tgtCornerRadius=C.pstyle("corner-radius").value==="auto"?"auto":C.pstyle("corner-radius").pfValue,K=A.tgtRs=C._private.rscratch,ee=A.srcRs=R._private.rscratch;A.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var J=0;J0){var ae=a,ue=U0(ae,m1(r)),ce=U0(ae,m1(Q)),te=ue;if(ce2){var Ne=U0(ae,{x:Q[2],y:Q[3]});Ne0){var ne=s,ve=U0(ne,m1(r)),U=U0(ne,m1(ge)),Te=ve;if(U2){var ie=U0(ne,{x:ge[2],y:ge[3]});ie=g||L){v={cp:_,segment:E};break}}if(v)break}var S=v.cp,A=v.segment,I=(g-x)/A.length,D=A.t1-A.t0,k=m?A.t0+D*I:A.t1-D*I;k=sb(0,k,1),e=y1(S.p0,S.p1,S.p2,k),p=ret(S.p0,S.p1,S.p2,k);break}case"straight":case"segments":case"haystack":{for(var R=0,C,O,N,P,F=n.allpts.length,B=0;B+3=g));B+=2);var G=g-O,z=G/C;z=sb(0,z,1),e=oje(N,P,z),p=o1e(N,P);break}}s("labelX",d,e.x),s("labelY",d,e.y),s("labelAutoAngle",d,p)}},"calculateEndProjection");h("source"),h("target"),this.applyLabelDimensions(t)}};tu.applyLabelDimensions=function(t){this.applyPrefixedLabelDimensions(t),t.isEdge()&&(this.applyPrefixedLabelDimensions(t,"source"),this.applyPrefixedLabelDimensions(t,"target"))};tu.applyPrefixedLabelDimensions=function(t,e){var r=t._private,n=this.getLabelText(t,e),i=this.calculateLabelDimensions(t,n),a=t.pstyle("line-height").pfValue,s=t.pstyle("text-wrap").strValue,l=Ql(r.rscratch,"labelWrapCachedLines",e)||[],u=s!=="wrap"?1:Math.max(l.length,1),h=i.height/u,f=h*a,d=i.width,p=i.height+(u-1)*(a-1)*h;Df(r.rstyle,"labelWidth",e,d),Df(r.rscratch,"labelWidth",e,d),Df(r.rstyle,"labelHeight",e,p),Df(r.rscratch,"labelHeight",e,p),Df(r.rscratch,"labelLineHeight",e,f)};tu.getLabelText=function(t,e){var r=t._private,n=e?e+"-":"",i=t.pstyle(n+"label").strValue,a=t.pstyle("text-transform").value,s=o(function(Z,j){return j?(Df(r.rscratch,Z,e,j),j):Ql(r.rscratch,Z,e)},"rscratch");if(!i)return"";a=="none"||(a=="uppercase"?i=i.toUpperCase():a=="lowercase"&&(i=i.toLowerCase()));var l=t.pstyle("text-wrap").value;if(l==="wrap"){var u=s("labelKey");if(u!=null&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var h="\u200B",f=i.split(` +`),d=t.pstyle("text-max-width").pfValue,p=t.pstyle("text-overflow-wrap").value,m=p==="anywhere",g=[],y=/[\s\u200b]+|$/g,v=0;vd){var T=x.matchAll(y),E="",L=0,S=Ume(T),A;try{for(S.s();!(A=S.n()).done;){var I=A.value,D=I[0],k=x.substring(L,I.index);L=I.index+D.length;var R=E.length===0?k:E+k+D,C=this.calculateLabelDimensions(t,R),O=C.width;O<=d?E+=k+D:(E&&g.push(E),E=k+D)}}catch(W){S.e(W)}finally{S.f()}E.match(/^[\s\u200b]+$/)||g.push(E)}else g.push(x)}s("labelWrapCachedLines",g),i=s("labelWrapCachedText",g.join(` +`)),s("labelWrapKey",u)}else if(l==="ellipsis"){var N=t.pstyle("text-max-width").pfValue,P="",F="\u2026",B=!1;if(this.calculateLabelDimensions(t,i).widthN)break;P+=i[G],G===i.length-1&&(B=!0)}return B||(P+=F),P}return i};tu.getLabelJustification=function(t){var e=t.pstyle("text-justification").strValue,r=t.pstyle("text-halign").strValue;if(e==="auto")if(t.isNode())switch(r){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};tu.calculateLabelDimensions=function(t,e){var r=this,n=r.cy.window(),i=n.document,a=j0(e,t._private.labelDimsKey),s=r.labelDimCache||(r.labelDimCache=[]),l=s[a];if(l!=null)return l;var u=0,h=t.pstyle("font-style").strValue,f=t.pstyle("font-size").pfValue,d=t.pstyle("font-family").strValue,p=t.pstyle("font-weight").strValue,m=this.labelCalcCanvas,g=this.labelCalcCanvasContext;if(!m){m=this.labelCalcCanvas=i.createElement("canvas"),g=this.labelCalcCanvasContext=m.getContext("2d");var y=m.style;y.position="absolute",y.left="-9999px",y.top="-9999px",y.zIndex="-1",y.visibility="hidden",y.pointerEvents="none"}g.font="".concat(h," ").concat(p," ").concat(f,"px ").concat(d);for(var v=0,x=0,b=e.split(` +`),w=0;w1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),l)for(var u=0;u=t.desktopTapThreshold2}var yt=i(X);Oe&&(t.hoverData.tapholdCancelled=!0);var Ue=o(function(){var Bt=t.hoverData.dragDelta=t.hoverData.dragDelta||[];Bt.length===0?(Bt.push(me[0]),Bt.push(me[1])):(Bt[0]+=me[0],Bt[1]+=me[1])},"updateDragDelta");he=!0,n(Ae,["mousemove","vmousemove","tapdrag"],X,{x:U[0],y:U[1]});var tt=o(function(){t.data.bgActivePosistion=void 0,t.hoverData.selecting||ge.emit({originalEvent:X,type:"boxstart",position:{x:U[0],y:U[1]}}),Ee[4]=1,t.hoverData.selecting=!0,t.redrawHint("select",!0),t.redraw()},"goIntoBoxMode");if(t.hoverData.which===3){if(Oe){var ht={originalEvent:X,type:"cxtdrag",position:{x:U[0],y:U[1]}};Be?Be.emit(ht):ge.emit(ht),t.hoverData.cxtDragged=!0,(!t.hoverData.cxtOver||Ae!==t.hoverData.cxtOver)&&(t.hoverData.cxtOver&&t.hoverData.cxtOver.emit({originalEvent:X,type:"cxtdragout",position:{x:U[0],y:U[1]}}),t.hoverData.cxtOver=Ae,Ae&&Ae.emit({originalEvent:X,type:"cxtdragover",position:{x:U[0],y:U[1]}}))}}else if(t.hoverData.dragging){if(he=!0,ge.panningEnabled()&&ge.userPanningEnabled()){var Et;if(t.hoverData.justStartedPan){var er=t.hoverData.mdownPos;Et={x:(U[0]-er[0])*ne,y:(U[1]-er[1])*ne},t.hoverData.justStartedPan=!1}else Et={x:me[0]*ne,y:me[1]*ne};ge.panBy(Et),ge.emit("dragpan"),t.hoverData.dragged=!0}U=t.projectIntoViewport(X.clientX,X.clientY)}else if(Ee[4]==1&&(Be==null||Be.pannable())){if(Oe){if(!t.hoverData.dragging&&ge.boxSelectionEnabled()&&(yt||!ge.panningEnabled()||!ge.userPanningEnabled()))tt();else if(!t.hoverData.selecting&&ge.panningEnabled()&&ge.userPanningEnabled()){var dt=a(Be,t.hoverData.downs);dt&&(t.hoverData.dragging=!0,t.hoverData.justStartedPan=!0,Ee[4]=0,t.data.bgActivePosistion=m1(Te),t.redrawHint("select",!0),t.redraw())}Be&&Be.pannable()&&Be.active()&&Be.unactivate()}}else{if(Be&&Be.pannable()&&Be.active()&&Be.unactivate(),(!Be||!Be.grabbed())&&Ae!=Ge&&(Ge&&n(Ge,["mouseout","tapdragout"],X,{x:U[0],y:U[1]}),Ae&&n(Ae,["mouseover","tapdragover"],X,{x:U[0],y:U[1]}),t.hoverData.last=Ae),Be)if(Oe){if(ge.boxSelectionEnabled()&&yt)Be&&Be.grabbed()&&(v(He),Be.emit("freeon"),He.emit("free"),t.dragData.didDrag&&(Be.emit("dragfreeon"),He.emit("dragfree"))),tt();else if(Be&&Be.grabbed()&&t.nodeIsDraggable(Be)){var Je=!t.dragData.didDrag;Je&&t.redrawHint("eles",!0),t.dragData.didDrag=!0,t.hoverData.draggingEles||g(He,{inDragLayer:!0});var ct={x:0,y:0};if(xt(me[0])&&xt(me[1])&&(ct.x+=me[0],ct.y+=me[1],Je)){var Ct=t.hoverData.dragDelta;Ct&&xt(Ct[0])&&xt(Ct[1])&&(ct.x+=Ct[0],ct.y+=Ct[1])}t.hoverData.draggingEles=!0,He.silentShift(ct).emit("position drag"),t.redrawHint("drag",!0),t.redraw()}}else Ue();he=!0}if(Ee[2]=U[0],Ee[3]=U[1],he)return X.stopPropagation&&X.stopPropagation(),X.preventDefault&&X.preventDefault(),!1}},"mousemoveHandler"),!1);var I,D,k;t.registerBinding(e,"mouseup",o(function(X){if(!(t.hoverData.which===1&&X.which!==1&&t.hoverData.capture)){var fe=t.hoverData.capture;if(fe){t.hoverData.capture=!1;var he=t.cy,ge=t.projectIntoViewport(X.clientX,X.clientY),ne=t.selection,ve=t.findNearestElement(ge[0],ge[1],!0,!1),U=t.dragData.possibleDragElements,Te=t.hoverData.down,ie=i(X);if(t.data.bgActivePosistion&&(t.redrawHint("select",!0),t.redraw()),t.hoverData.tapholdCancelled=!0,t.data.bgActivePosistion=void 0,Te&&Te.unactivate(),t.hoverData.which===3){var Ee={originalEvent:X,type:"cxttapend",position:{x:ge[0],y:ge[1]}};if(Te?Te.emit(Ee):he.emit(Ee),!t.hoverData.cxtDragged){var Ae={originalEvent:X,type:"cxttap",position:{x:ge[0],y:ge[1]}};Te?Te.emit(Ae):he.emit(Ae)}t.hoverData.cxtDragged=!1,t.hoverData.which=null}else if(t.hoverData.which===1){if(n(ve,["mouseup","tapend","vmouseup"],X,{x:ge[0],y:ge[1]}),!t.dragData.didDrag&&!t.hoverData.dragged&&!t.hoverData.selecting&&!t.hoverData.isOverThresholdDrag&&(n(Te,["click","tap","vclick"],X,{x:ge[0],y:ge[1]}),D=!1,X.timeStamp-k<=he.multiClickDebounceTime()?(I&&clearTimeout(I),D=!0,k=null,n(Te,["dblclick","dbltap","vdblclick"],X,{x:ge[0],y:ge[1]})):(I=setTimeout(function(){D||n(Te,["oneclick","onetap","voneclick"],X,{x:ge[0],y:ge[1]})},he.multiClickDebounceTime()),k=X.timeStamp)),Te==null&&!t.dragData.didDrag&&!t.hoverData.selecting&&!t.hoverData.dragged&&!i(X)&&(he.$(r).unselect(["tapunselect"]),U.length>0&&t.redrawHint("eles",!0),t.dragData.possibleDragElements=U=he.collection()),ve==Te&&!t.dragData.didDrag&&!t.hoverData.selecting&&ve!=null&&ve._private.selectable&&(t.hoverData.dragging||(he.selectionType()==="additive"||ie?ve.selected()?ve.unselect(["tapunselect"]):ve.select(["tapselect"]):ie||(he.$(r).unmerge(ve).unselect(["tapunselect"]),ve.select(["tapselect"]))),t.redrawHint("eles",!0)),t.hoverData.selecting){var Ge=he.collection(t.getAllInBox(ne[0],ne[1],ne[2],ne[3]));t.redrawHint("select",!0),Ge.length>0&&t.redrawHint("eles",!0),he.emit({type:"boxend",originalEvent:X,position:{x:ge[0],y:ge[1]}});var Be=o(function(Oe){return Oe.selectable()&&!Oe.selected()},"eleWouldBeSelected");he.selectionType()==="additive"||ie||he.$(r).unmerge(Ge).unselect(),Ge.emit("box").stdFilter(Be).select().emit("boxselect"),t.redraw()}if(t.hoverData.dragging&&(t.hoverData.dragging=!1,t.redrawHint("select",!0),t.redrawHint("eles",!0),t.redraw()),!ne[4]){t.redrawHint("drag",!0),t.redrawHint("eles",!0);var me=Te&&Te.grabbed();v(U),me&&(Te.emit("freeon"),U.emit("free"),t.dragData.didDrag&&(Te.emit("dragfreeon"),U.emit("dragfree")))}}ne[4]=0,t.hoverData.down=null,t.hoverData.cxtStarted=!1,t.hoverData.draggingEles=!1,t.hoverData.selecting=!1,t.hoverData.isOverThresholdDrag=!1,t.dragData.didDrag=!1,t.hoverData.dragged=!1,t.hoverData.dragDelta=[],t.hoverData.mdownPos=null,t.hoverData.mdownGPos=null,t.hoverData.which=null}}},"mouseupHandler"),!1);var R=o(function(X){if(!t.scrollingPage){var fe=t.cy,he=fe.zoom(),ge=fe.pan(),ne=t.projectIntoViewport(X.clientX,X.clientY),ve=[ne[0]*he+ge.x,ne[1]*he+ge.y];if(t.hoverData.draggingEles||t.hoverData.dragging||t.hoverData.cxtStarted||S()){X.preventDefault();return}if(fe.panningEnabled()&&fe.userPanningEnabled()&&fe.zoomingEnabled()&&fe.userZoomingEnabled()){X.preventDefault(),t.data.wheelZooming=!0,clearTimeout(t.data.wheelTimeout),t.data.wheelTimeout=setTimeout(function(){t.data.wheelZooming=!1,t.redrawHint("eles",!0),t.redraw()},150);var U;X.deltaY!=null?U=X.deltaY/-250:X.wheelDeltaY!=null?U=X.wheelDeltaY/1e3:U=X.wheelDelta/1e3,U=U*t.wheelSensitivity;var Te=X.deltaMode===1;Te&&(U*=33);var ie=fe.zoom()*Math.pow(10,U);X.type==="gesturechange"&&(ie=t.gestureStartZoom*X.scale),fe.zoom({level:ie,renderedPosition:{x:ve[0],y:ve[1]}}),fe.emit(X.type==="gesturechange"?"pinchzoom":"scrollzoom")}}},"wheelHandler");t.registerBinding(t.container,"wheel",R,!0),t.registerBinding(e,"scroll",o(function(X){t.scrollingPage=!0,clearTimeout(t.scrollingPageTimeout),t.scrollingPageTimeout=setTimeout(function(){t.scrollingPage=!1},250)},"scrollHandler"),!0),t.registerBinding(t.container,"gesturestart",o(function(X){t.gestureStartZoom=t.cy.zoom(),t.hasTouchStarted||X.preventDefault()},"gestureStartHandler"),!0),t.registerBinding(t.container,"gesturechange",function(ye){t.hasTouchStarted||R(ye)},!0),t.registerBinding(t.container,"mouseout",o(function(X){var fe=t.projectIntoViewport(X.clientX,X.clientY);t.cy.emit({originalEvent:X,type:"mouseout",position:{x:fe[0],y:fe[1]}})},"mouseOutHandler"),!1),t.registerBinding(t.container,"mouseover",o(function(X){var fe=t.projectIntoViewport(X.clientX,X.clientY);t.cy.emit({originalEvent:X,type:"mouseover",position:{x:fe[0],y:fe[1]}})},"mouseOverHandler"),!1);var C,O,N,P,F,B,G,z,W,Z,j,oe,K,ee=o(function(X,fe,he,ge){return Math.sqrt((he-X)*(he-X)+(ge-fe)*(ge-fe))},"distance"),J=o(function(X,fe,he,ge){return(he-X)*(he-X)+(ge-fe)*(ge-fe)},"distanceSq"),H;t.registerBinding(t.container,"touchstart",H=o(function(X){if(t.hasTouchStarted=!0,!!A(X)){b(),t.touchData.capture=!0,t.data.bgActivePosistion=void 0;var fe=t.cy,he=t.touchData.now,ge=t.touchData.earlier;if(X.touches[0]){var ne=t.projectIntoViewport(X.touches[0].clientX,X.touches[0].clientY);he[0]=ne[0],he[1]=ne[1]}if(X.touches[1]){var ne=t.projectIntoViewport(X.touches[1].clientX,X.touches[1].clientY);he[2]=ne[0],he[3]=ne[1]}if(X.touches[2]){var ne=t.projectIntoViewport(X.touches[2].clientX,X.touches[2].clientY);he[4]=ne[0],he[5]=ne[1]}if(X.touches[1]){t.touchData.singleTouchMoved=!0,v(t.dragData.touchDragEles);var ve=t.findContainerClientCoords();W=ve[0],Z=ve[1],j=ve[2],oe=ve[3],C=X.touches[0].clientX-W,O=X.touches[0].clientY-Z,N=X.touches[1].clientX-W,P=X.touches[1].clientY-Z,K=0<=C&&C<=j&&0<=N&&N<=j&&0<=O&&O<=oe&&0<=P&&P<=oe;var U=fe.pan(),Te=fe.zoom();F=ee(C,O,N,P),B=J(C,O,N,P),G=[(C+N)/2,(O+P)/2],z=[(G[0]-U.x)/Te,(G[1]-U.y)/Te];var ie=200,Ee=ie*ie;if(B=1){for(var bt=t.touchData.startPosition=[null,null,null,null,null,null],kt=0;kt=t.touchTapThreshold2}if(fe&&t.touchData.cxt){X.preventDefault();var bt=X.touches[0].clientX-W,kt=X.touches[0].clientY-Z,vt=X.touches[1].clientX-W,rt=X.touches[1].clientY-Z,yt=J(bt,kt,vt,rt),Ue=yt/B,tt=150,ht=tt*tt,Et=1.5,er=Et*Et;if(Ue>=er||yt>=ht){t.touchData.cxt=!1,t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var dt={originalEvent:X,type:"cxttapend",position:{x:ne[0],y:ne[1]}};t.touchData.start?(t.touchData.start.unactivate().emit(dt),t.touchData.start=null):ge.emit(dt)}}if(fe&&t.touchData.cxt){var dt={originalEvent:X,type:"cxtdrag",position:{x:ne[0],y:ne[1]}};t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.touchData.start?t.touchData.start.emit(dt):ge.emit(dt),t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxtDragged=!0;var Je=t.findNearestElement(ne[0],ne[1],!0,!0);(!t.touchData.cxtOver||Je!==t.touchData.cxtOver)&&(t.touchData.cxtOver&&t.touchData.cxtOver.emit({originalEvent:X,type:"cxtdragout",position:{x:ne[0],y:ne[1]}}),t.touchData.cxtOver=Je,Je&&Je.emit({originalEvent:X,type:"cxtdragover",position:{x:ne[0],y:ne[1]}}))}else if(fe&&X.touches[2]&&ge.boxSelectionEnabled())X.preventDefault(),t.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,t.touchData.selecting||ge.emit({originalEvent:X,type:"boxstart",position:{x:ne[0],y:ne[1]}}),t.touchData.selecting=!0,t.touchData.didSelect=!0,he[4]=1,!he||he.length===0||he[0]===void 0?(he[0]=(ne[0]+ne[2]+ne[4])/3,he[1]=(ne[1]+ne[3]+ne[5])/3,he[2]=(ne[0]+ne[2]+ne[4])/3+1,he[3]=(ne[1]+ne[3]+ne[5])/3+1):(he[2]=(ne[0]+ne[2]+ne[4])/3,he[3]=(ne[1]+ne[3]+ne[5])/3),t.redrawHint("select",!0),t.redraw();else if(fe&&X.touches[1]&&!t.touchData.didSelect&&ge.zoomingEnabled()&&ge.panningEnabled()&&ge.userZoomingEnabled()&&ge.userPanningEnabled()){X.preventDefault(),t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var ct=t.dragData.touchDragEles;if(ct){t.redrawHint("drag",!0);for(var Ct=0;Ct0&&!t.hoverData.draggingEles&&!t.swipePanning&&t.data.bgActivePosistion!=null&&(t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.redraw())}},"touchmoveHandler"),!1);var Q;t.registerBinding(e,"touchcancel",Q=o(function(X){var fe=t.touchData.start;t.touchData.capture=!1,fe&&fe.unactivate()},"touchcancelHandler"));var ae,ue,ce,te;if(t.registerBinding(e,"touchend",ae=o(function(X){var fe=t.touchData.start,he=t.touchData.capture;if(he)X.touches.length===0&&(t.touchData.capture=!1),X.preventDefault();else return;var ge=t.selection;t.swipePanning=!1,t.hoverData.draggingEles=!1;var ne=t.cy,ve=ne.zoom(),U=t.touchData.now,Te=t.touchData.earlier;if(X.touches[0]){var ie=t.projectIntoViewport(X.touches[0].clientX,X.touches[0].clientY);U[0]=ie[0],U[1]=ie[1]}if(X.touches[1]){var ie=t.projectIntoViewport(X.touches[1].clientX,X.touches[1].clientY);U[2]=ie[0],U[3]=ie[1]}if(X.touches[2]){var ie=t.projectIntoViewport(X.touches[2].clientX,X.touches[2].clientY);U[4]=ie[0],U[5]=ie[1]}fe&&fe.unactivate();var Ee;if(t.touchData.cxt){if(Ee={originalEvent:X,type:"cxttapend",position:{x:U[0],y:U[1]}},fe?fe.emit(Ee):ne.emit(Ee),!t.touchData.cxtDragged){var Ae={originalEvent:X,type:"cxttap",position:{x:U[0],y:U[1]}};fe?fe.emit(Ae):ne.emit(Ae)}t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxt=!1,t.touchData.start=null,t.redraw();return}if(!X.touches[2]&&ne.boxSelectionEnabled()&&t.touchData.selecting){t.touchData.selecting=!1;var Ge=ne.collection(t.getAllInBox(ge[0],ge[1],ge[2],ge[3]));ge[0]=void 0,ge[1]=void 0,ge[2]=void 0,ge[3]=void 0,ge[4]=0,t.redrawHint("select",!0),ne.emit({type:"boxend",originalEvent:X,position:{x:U[0],y:U[1]}});var Be=o(function(ht){return ht.selectable()&&!ht.selected()},"eleWouldBeSelected");Ge.emit("box").stdFilter(Be).select().emit("boxselect"),Ge.nonempty()&&t.redrawHint("eles",!0),t.redraw()}if(fe?.unactivate(),X.touches[2])t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);else if(!X.touches[1]){if(!X.touches[0]){if(!X.touches[0]){t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var me=t.dragData.touchDragEles;if(fe!=null){var He=fe._private.grabbed;v(me),t.redrawHint("drag",!0),t.redrawHint("eles",!0),He&&(fe.emit("freeon"),me.emit("free"),t.dragData.didDrag&&(fe.emit("dragfreeon"),me.emit("dragfree"))),n(fe,["touchend","tapend","vmouseup","tapdragout"],X,{x:U[0],y:U[1]}),fe.unactivate(),t.touchData.start=null}else{var Oe=t.findNearestElement(U[0],U[1],!0,!0);n(Oe,["touchend","tapend","vmouseup","tapdragout"],X,{x:U[0],y:U[1]})}var et=t.touchData.startPosition[0]-U[0],bt=et*et,kt=t.touchData.startPosition[1]-U[1],vt=kt*kt,rt=bt+vt,yt=rt*ve*ve;t.touchData.singleTouchMoved||(fe||ne.$(":selected").unselect(["tapunselect"]),n(fe,["tap","vclick"],X,{x:U[0],y:U[1]}),ue=!1,X.timeStamp-te<=ne.multiClickDebounceTime()?(ce&&clearTimeout(ce),ue=!0,te=null,n(fe,["dbltap","vdblclick"],X,{x:U[0],y:U[1]})):(ce=setTimeout(function(){ue||n(fe,["onetap","voneclick"],X,{x:U[0],y:U[1]})},ne.multiClickDebounceTime()),te=X.timeStamp)),fe!=null&&!t.dragData.didDrag&&fe._private.selectable&&yt"u"){var Ne=[],se=o(function(X){return{clientX:X.clientX,clientY:X.clientY,force:1,identifier:X.pointerId,pageX:X.pageX,pageY:X.pageY,radiusX:X.width/2,radiusY:X.height/2,screenX:X.screenX,screenY:X.screenY,target:X.target}},"makeTouch"),ke=o(function(X){return{event:X,touch:se(X)}},"makePointer"),Re=o(function(X){Ne.push(ke(X))},"addPointer"),Ce=o(function(X){for(var fe=0;fe0)return W[0]}return null},"getCurveT"),g=Object.keys(p),y=0;y0?m:hge(a,s,e,r,n,i,l,u)},"intersectLine"),checkPoint:o(function(e,r,n,i,a,s,l,u){u=u==="auto"?Q0(i,a):u;var h=2*u;if(ah(e,r,this.points,s,l,i,a-h,[0,-1],n)||ah(e,r,this.points,s,l,i-h,a,[0,-1],n))return!0;var f=i/2+2*n,d=a/2+2*n,p=[s-f,l-d,s-f,l,s+f,l,s+f,l-d];return!!(js(e,r,p)||q0(e,r,h,h,s+i/2-u,l+a/2-u,n)||q0(e,r,h,h,s-i/2+u,l+a/2-u,n))},"checkPoint")}};oh.registerNodeShapes=function(){var t=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",ms(3,0)),this.generateRoundPolygon("round-triangle",ms(3,0)),this.generatePolygon("rectangle",ms(4,0)),t.square=t.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var r=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",r),this.generateRoundPolygon("round-diamond",r)}this.generatePolygon("pentagon",ms(5,0)),this.generateRoundPolygon("round-pentagon",ms(5,0)),this.generatePolygon("hexagon",ms(6,0)),this.generateRoundPolygon("round-hexagon",ms(6,0)),this.generatePolygon("heptagon",ms(7,0)),this.generateRoundPolygon("round-heptagon",ms(7,0)),this.generatePolygon("octagon",ms(8,0)),this.generateRoundPolygon("round-octagon",ms(8,0));var n=new Array(20);{var i=zP(5,0),a=zP(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var l=0;l=e.deqFastCost*_)break}else if(h){if(b>=e.deqCost*m||b>=e.deqAvgCost*p)break}else if(w>=e.deqNoDrawCost*PP)break;var T=e.deq(n,v,y);if(T.length>0)for(var E=0;E0&&(e.onDeqd(n,g),!h&&e.shouldRedraw(n,g,v,y)&&a())},"dequeue"),l=e.priority||sB;i.beforeRender(s,l(n))}},"setupDequeueingImpl")},"setupDequeueing")},iet=function(){function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:_6;tB(this,t),this.idsByKey=new Jc,this.keyForId=new Jc,this.cachesByLvl=new Jc,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=r}return o(t,"ElementTextureCacheLookup"),rB(t,[{key:"getIdsFor",value:o(function(r){r==null&&di("Can not get id list for null key");var n=this.idsByKey,i=this.idsByKey.get(r);return i||(i=new S1,n.set(r,i)),i},"getIdsFor")},{key:"addIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).add(n)},"addIdForKey")},{key:"deleteIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).delete(n)},"deleteIdForKey")},{key:"getNumberOfIdsForKey",value:o(function(r){return r==null?0:this.getIdsFor(r).size},"getNumberOfIdsForKey")},{key:"updateKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);this.deleteIdForKey(i,n),this.addIdForKey(a,n),this.keyForId.set(n,a)},"updateKeyMappingFor")},{key:"deleteKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteIdForKey(i,n),this.keyForId.delete(n)},"deleteKeyMappingFor")},{key:"keyHasChangedFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);return i!==a},"keyHasChangedFor")},{key:"isInvalid",value:o(function(r){return this.keyHasChangedFor(r)||this.doesEleInvalidateKey(r)},"isInvalid")},{key:"getCachesAt",value:o(function(r){var n=this.cachesByLvl,i=this.lvls,a=n.get(r);return a||(a=new Jc,n.set(r,a),i.push(r)),a},"getCachesAt")},{key:"getCache",value:o(function(r,n){return this.getCachesAt(n).get(r)},"getCache")},{key:"get",value:o(function(r,n){var i=this.getKey(r),a=this.getCache(i,n);return a!=null&&this.updateKeyMappingFor(r),a},"get")},{key:"getForCachedKey",value:o(function(r,n){var i=this.keyForId.get(r.id()),a=this.getCache(i,n);return a},"getForCachedKey")},{key:"hasCache",value:o(function(r,n){return this.getCachesAt(n).has(r)},"hasCache")},{key:"has",value:o(function(r,n){var i=this.getKey(r);return this.hasCache(i,n)},"has")},{key:"setCache",value:o(function(r,n,i){i.key=r,this.getCachesAt(n).set(r,i)},"setCache")},{key:"set",value:o(function(r,n,i){var a=this.getKey(r);this.setCache(a,n,i),this.updateKeyMappingFor(r)},"set")},{key:"deleteCache",value:o(function(r,n){this.getCachesAt(n).delete(r)},"deleteCache")},{key:"delete",value:o(function(r,n){var i=this.getKey(r);this.deleteCache(i,n)},"_delete")},{key:"invalidateKey",value:o(function(r){var n=this;this.lvls.forEach(function(i){return n.deleteCache(r,i)})},"invalidateKey")},{key:"invalidate",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteKeyMappingFor(r);var a=this.doesEleInvalidateKey(r);return a&&this.invalidateKey(i),a||this.getNumberOfIdsForKey(i)===0},"invalidate")}]),t}(),Mme=25,g6=50,S6=-4,QP=3,aet=7.99,set=8,oet=1024,cet=1024,uet=1024,het=.2,fet=.8,det=10,pet=.15,met=.1,get=.9,yet=.9,vet=100,xet=1,g1={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},bet=_a({getKey:null,doesEleInvalidateKey:_6,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:nge,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),Jx=o(function(e,r){var n=this;n.renderer=e,n.onDequeues=[];var i=bet(r);ir(n,i),n.lookup=new iet(i.getKey,i.doesEleInvalidateKey),n.setupDequeueing()},"ElementTextureCache"),Qi=Jx.prototype;Qi.reasons=g1;Qi.getTextureQueue=function(t){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[t]=e.eleImgCaches[t]||[]};Qi.getRetiredTextureQueue=function(t){var e=this,r=e.eleImgCaches.retired=e.eleImgCaches.retired||{},n=r[t]=r[t]||[];return n};Qi.getElementQueue=function(){var t=this,e=t.eleCacheQueue=t.eleCacheQueue||new gb(function(r,n){return n.reqs-r.reqs});return e};Qi.getElementKeyToQueue=function(){var t=this,e=t.eleKeyToCacheQueue=t.eleKeyToCacheQueue||{};return e};Qi.getElement=function(t,e,r,n,i){var a=this,s=this.renderer,l=s.cy.zoom(),u=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!t.visible()||t.removed()||!a.allowEdgeTxrCaching&&t.isEdge()||!a.allowParentTxrCaching&&t.isParent())return null;if(n==null&&(n=Math.ceil(lB(l*r))),n=aet||n>QP)return null;var h=Math.pow(2,n),f=e.h*h,d=e.w*h,p=s.eleTextBiggerThanMin(t,h);if(!this.isVisible(t,p))return null;var m=u.get(t,n);if(m&&m.invalidated&&(m.invalidated=!1,m.texture.invalidatedWidth-=m.width),m)return m;var g;if(f<=Mme?g=Mme:f<=g6?g=g6:g=Math.ceil(f/g6)*g6,f>uet||d>cet)return null;var y=a.getTextureQueue(g),v=y[y.length-2],x=o(function(){return a.recycleTexture(g,d)||a.addTexture(g,d)},"addNewTxr");v||(v=y[y.length-1]),v||(v=x()),v.width-v.usedWidthn;D--)A=a.getElement(t,e,r,D,g1.downscale);I()}else return a.queueElement(t,E.level-1),E;else{var k;if(!w&&!_&&!T)for(var R=n-1;R>=S6;R--){var C=u.get(t,R);if(C){k=C;break}}if(b(k))return a.queueElement(t,n),k;v.context.translate(v.usedWidth,0),v.context.scale(h,h),this.drawElement(v.context,t,e,p,!1),v.context.scale(1/h,1/h),v.context.translate(-v.usedWidth,0)}return m={x:v.usedWidth,texture:v,level:n,scale:h,width:d,height:f,scaledLabelShown:p},v.usedWidth+=Math.ceil(d+set),v.eleCaches.push(m),u.set(t,n,m),a.checkTextureFullness(v),m};Qi.invalidateElements=function(t){for(var e=0;e=het*t.width&&this.retireTexture(t)};Qi.checkTextureFullness=function(t){var e=this,r=e.getTextureQueue(t.height);t.usedWidth/t.width>fet&&t.fullnessChecks>=det?Of(r,t):t.fullnessChecks++};Qi.retireTexture=function(t){var e=this,r=t.height,n=e.getTextureQueue(r),i=this.lookup;Of(n,t),t.retired=!0;for(var a=t.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,oB(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),Of(i,s),n.push(s),s}};Qi.queueElement=function(t,e){var r=this,n=r.getElementQueue(),i=r.getElementKeyToQueue(),a=this.getKey(t),s=i[a];if(s)s.level=Math.max(s.level,e),s.eles.merge(t),s.reqs++,n.updateItem(s);else{var l={eles:t.spawn().merge(t),level:e,reqs:1,key:a};n.push(l),i[a]=l}};Qi.dequeue=function(t){for(var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=[],a=e.lookup,s=0;s0;s++){var l=r.pop(),u=l.key,h=l.eles[0],f=a.hasCache(h,l.level);if(n[u]=null,f)continue;i.push(l);var d=e.getBoundingBox(h);e.getElement(h,d,t,l.level,g1.dequeue)}return i};Qi.removeFromQueue=function(t){var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=this.getKey(t),a=n[i];a!=null&&(a.eles.length===1?(a.reqs=aB,r.updateItem(a),r.pop(),n[i]=null):a.eles.unmerge(t))};Qi.onDequeue=function(t){this.onDequeues.push(t)};Qi.offDequeue=function(t){Of(this.onDequeues,t)};Qi.setupDequeueing=f1e.setupDequeueing({deqRedrawThreshold:vet,deqCost:pet,deqAvgCost:met,deqNoDrawCost:get,deqFastCost:yet,deq:o(function(e,r,n){return e.dequeue(r,n)},"deq"),onDeqd:o(function(e,r){for(var n=0;n=Tet||r>P6)return null}n.validateLayersElesOrdering(r,t);var u=n.layersByLevel,h=Math.pow(2,r),f=u[r]=u[r]||[],d,p=n.levelIsComplete(r,t),m,g=o(function(){var I=o(function(O){if(n.validateLayersElesOrdering(O,t),n.levelIsComplete(O,t))return m=u[O],!0},"canUseAsTmpLvl"),D=o(function(O){if(!m)for(var N=r+O;tb<=N&&N<=P6&&!I(N);N+=O);},"checkLvls");D(1),D(-1);for(var k=f.length-1;k>=0;k--){var R=f[k];R.invalid&&Of(f,R)}},"checkTempLevels");if(!p)g();else return f;var y=o(function(){if(!d){d=Ks();for(var I=0;INet)return null;var R=n.makeLayer(d,r);if(D!=null){var C=f.indexOf(D)+1;f.splice(C,0,R)}else(I.insert===void 0||I.insert)&&f.unshift(R);return R},"makeLayer");if(n.skipping&&!l)return null;for(var x=null,b=t.length/wet,w=!l,_=0;_=b||!uge(x.bb,T.boundingBox()))&&(x=v({insert:!0,after:x}),!x))return null;m||w?n.queueLayer(x,T):n.drawEleInLayer(x,T,r,e),x.eles.push(T),L[r]=x}return m||(w?null:f)};La.getEleLevelForLayerLevel=function(t,e){return t};La.drawEleInLayer=function(t,e,r,n){var i=this,a=this.renderer,s=t.context,l=e.boundingBox();l.w===0||l.h===0||!e.visible()||(r=i.getEleLevelForLayerLevel(r,n),a.setImgSmoothing(s,!1),a.drawCachedElement(s,e,null,null,r,Ret),a.setImgSmoothing(s,!0))};La.levelIsComplete=function(t,e){var r=this,n=r.layersByLevel[t];if(!n||n.length===0)return!1;for(var i=0,a=0;a0||s.invalid)return!1;i+=s.eles.length}return i===e.length};La.validateLayersElesOrdering=function(t,e){var r=this.layersByLevel[t];if(r)for(var n=0;n0){e=!0;break}}return e};La.invalidateElements=function(t){var e=this;t.length!==0&&(e.lastInvalidationTime=ih(),!(t.length===0||!e.haveLayers())&&e.updateElementsInLayers(t,o(function(n,i,a){e.invalidateLayer(n)},"invalAssocLayers")))};La.invalidateLayer=function(t){if(this.lastInvalidationTime=ih(),!t.invalid){var e=t.level,r=t.eles,n=this.layersByLevel[e];Of(n,t),t.elesQueue=[],t.invalid=!0,t.replacement&&(t.replacement.invalid=!0);for(var i=0;i3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l=e._private.rscratch;if(!(a&&!e.visible())&&!(l.badLine||l.allpts==null||isNaN(l.allpts[0]))){var u;r&&(u=r,t.translate(-u.x1,-u.y1));var h=a?e.pstyle("opacity").value:1,f=a?e.pstyle("line-opacity").value:1,d=e.pstyle("curve-style").value,p=e.pstyle("line-style").value,m=e.pstyle("width").pfValue,g=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,v=e.pstyle("line-outline-color").value,x=h*f,b=h*f,w=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;d==="straight-triangle"?(s.eleStrokeStyle(t,e,O),s.drawEdgeTrianglePath(e,t,l.allpts)):(t.lineWidth=m,t.lineCap=g,s.eleStrokeStyle(t,e,O),s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLine"),_=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;if(t.lineWidth=m+y,t.lineCap=g,y>0)s.colorStrokeStyle(t,v[0],v[1],v[2],O);else{t.lineCap="butt";return}d==="straight-triangle"?s.drawEdgeTrianglePath(e,t,l.allpts):(s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLineOutline"),T=o(function(){i&&s.drawEdgeOverlay(t,e)},"drawOverlay"),E=o(function(){i&&s.drawEdgeUnderlay(t,e)},"drawUnderlay"),L=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(t,e,O)},"drawArrows"),S=o(function(){s.drawElementText(t,e,null,n)},"drawText");t.lineJoin="round";var A=e.pstyle("ghost").value==="yes";if(A){var I=e.pstyle("ghost-offset-x").pfValue,D=e.pstyle("ghost-offset-y").pfValue,k=e.pstyle("ghost-opacity").value,R=x*k;t.translate(I,D),w(R),L(R),t.translate(-I,-D)}else _();E(),w(),L(),T(),S(),r&&t.translate(u.x1,u.y1)}};m1e=o(function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(r,n){if(n.visible()){var i=n.pstyle("".concat(e,"-opacity")).value;if(i!==0){var a=this,s=a.usePaths(),l=n._private.rscratch,u=n.pstyle("".concat(e,"-padding")).pfValue,h=2*u,f=n.pstyle("".concat(e,"-color")).value;r.lineWidth=h,l.edgeType==="self"&&!s?r.lineCap="butt":r.lineCap="round",a.colorStrokeStyle(r,f[0],f[1],f[2],i),a.drawEdgePath(n,r,l.allpts,"solid")}}}},"drawEdgeOverlayUnderlay");lh.drawEdgeOverlay=m1e("overlay");lh.drawEdgeUnderlay=m1e("underlay");lh.drawEdgePath=function(t,e,r,n){var i=t._private.rscratch,a=e,s,l=!1,u=this.usePaths(),h=t.pstyle("line-dash-pattern").pfValue,f=t.pstyle("line-dash-offset").pfValue;if(u){var d=r.join("$"),p=i.pathCacheKey&&i.pathCacheKey===d;p?(s=e=i.pathCache,l=!0):(s=e=new Path2D,i.pathCacheKey=d,i.pathCache=s)}if(a.setLineDash)switch(n){case"dotted":a.setLineDash([1,1]);break;case"dashed":a.setLineDash(h),a.lineDashOffset=f;break;case"solid":a.setLineDash([]);break}if(!l&&!i.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(r[0],r[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var m=2;m+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(n==null){if(a&&!s.eleTextBiggerThanMin(e))return}else if(n===!1)return;if(e.isNode()){var l=e.pstyle("label");if(!l||!l.value)return;var u=s.getLabelJustification(e);t.textAlign=u,t.textBaseline="bottom"}else{var h=e.element()._private.rscratch.badLine,f=e.pstyle("label"),d=e.pstyle("source-label"),p=e.pstyle("target-label");if(h||(!f||!f.value)&&(!d||!d.value)&&(!p||!p.value))return;t.textAlign="center",t.textBaseline="bottom"}var m=!r,g;r&&(g=r,t.translate(-g.x1,-g.y1)),i==null?(s.drawText(t,e,null,m,a),e.isEdge()&&(s.drawText(t,e,"source",m,a),s.drawText(t,e,"target",m,a))):s.drawText(t,e,i,m,a),r&&t.translate(g.x1,g.y1)};rp.getFontCache=function(t){var e;this.fontCaches=this.fontCaches||[];for(var r=0;r2&&arguments[2]!==void 0?arguments[2]:!0,n=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue+"px",a=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,l=r?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,u=e.pstyle("text-outline-opacity").value*l,h=e.pstyle("color").value,f=e.pstyle("text-outline-color").value;t.font=n+" "+s+" "+i+" "+a,t.lineJoin="round",this.colorFillStyle(t,h[0],h[1],h[2],l),this.colorStrokeStyle(t,f[0],f[1],f[2],u)};o(FP,"roundRect");rp.getTextAngle=function(t,e){var r,n=t._private,i=n.rscratch,a=e?e+"-":"",s=t.pstyle(a+"text-rotation"),l=Ql(i,"labelAngle",e);return s.strValue==="autorotate"?r=t.isEdge()?l:0:s.strValue==="none"?r=0:r=s.pfValue,r};rp.drawText=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=e._private,s=a.rscratch,l=i?e.effectiveOpacity():1;if(!(i&&(l===0||e.pstyle("text-opacity").value===0))){r==="main"&&(r=null);var u=Ql(s,"labelX",r),h=Ql(s,"labelY",r),f,d,p=this.getLabelText(e,r);if(p!=null&&p!==""&&!isNaN(u)&&!isNaN(h)){this.setupTextStyle(t,e,i);var m=r?r+"-":"",g=Ql(s,"labelWidth",r),y=Ql(s,"labelHeight",r),v=e.pstyle(m+"text-margin-x").pfValue,x=e.pstyle(m+"text-margin-y").pfValue,b=e.isEdge(),w=e.pstyle("text-halign").value,_=e.pstyle("text-valign").value;b&&(w="center",_="center"),u+=v,h+=x;var T;switch(n?T=this.getTextAngle(e,r):T=0,T!==0&&(f=u,d=h,t.translate(f,d),t.rotate(T),u=0,h=0),_){case"top":break;case"center":h+=y/2;break;case"bottom":h+=y;break}var E=e.pstyle("text-background-opacity").value,L=e.pstyle("text-border-opacity").value,S=e.pstyle("text-border-width").pfValue,A=e.pstyle("text-background-padding").pfValue,I=e.pstyle("text-background-shape").strValue,D=I.indexOf("round")===0,k=2;if(E>0||S>0&&L>0){var R=u-A;switch(w){case"left":R-=g;break;case"center":R-=g/2;break}var C=h-y-A,O=g+2*A,N=y+2*A;if(E>0){var P=t.fillStyle,F=e.pstyle("text-background-color").value;t.fillStyle="rgba("+F[0]+","+F[1]+","+F[2]+","+E*l+")",D?FP(t,R,C,O,N,k):t.fillRect(R,C,O,N),t.fillStyle=P}if(S>0&&L>0){var B=t.strokeStyle,G=t.lineWidth,z=e.pstyle("text-border-color").value,W=e.pstyle("text-border-style").value;if(t.strokeStyle="rgba("+z[0]+","+z[1]+","+z[2]+","+L*l+")",t.lineWidth=S,t.setLineDash)switch(W){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"double":t.lineWidth=S/4,t.setLineDash([]);break;case"solid":t.setLineDash([]);break}if(D?FP(t,R,C,O,N,k,"stroke"):t.strokeRect(R,C,O,N),W==="double"){var Z=S/2;D?FP(t,R+Z,C+Z,O-Z*2,N-Z*2,k,"stroke"):t.strokeRect(R+Z,C+Z,O-Z*2,N-Z*2)}t.setLineDash&&t.setLineDash([]),t.lineWidth=G,t.strokeStyle=B}}var j=2*e.pstyle("text-outline-width").pfValue;if(j>0&&(t.lineWidth=j),e.pstyle("text-wrap").value==="wrap"){var oe=Ql(s,"labelWrapCachedLines",r),K=Ql(s,"labelLineHeight",r),ee=g/2,J=this.getLabelJustification(e);switch(J==="auto"||(w==="left"?J==="left"?u+=-g:J==="center"&&(u+=-ee):w==="center"?J==="left"?u+=-ee:J==="right"&&(u+=ee):w==="right"&&(J==="center"?u+=ee:J==="right"&&(u+=g))),_){case"top":h-=(oe.length-1)*K;break;case"center":case"bottom":h-=(oe.length-1)*K;break}for(var H=0;H0&&t.strokeText(oe[H],u,h),t.fillText(oe[H],u,h),h+=K}else j>0&&t.strokeText(p,u,h),t.fillText(p,u,h);T!==0&&(t.rotate(-T),t.translate(-f,-d))}}};I1={};I1.drawNode=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l,u,h=e._private,f=h.rscratch,d=e.position();if(!(!xt(d.x)||!xt(d.y))&&!(a&&!e.visible())){var p=a?e.effectiveOpacity():1,m=s.usePaths(),g,y=!1,v=e.padding();l=e.width()+2*v,u=e.height()+2*v;var x;r&&(x=r,t.translate(-x.x1,-x.y1));for(var b=e.pstyle("background-image"),w=b.value,_=new Array(w.length),T=new Array(w.length),E=0,L=0;L0&&arguments[0]!==void 0?arguments[0]:R;s.eleFillStyle(t,e,ve)},"setupShapeColor"),H=o(function(){var ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:z;s.colorStrokeStyle(t,C[0],C[1],C[2],ve)},"setupBorderColor"),q=o(function(){var ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:oe;s.colorStrokeStyle(t,Z[0],Z[1],Z[2],ve)},"setupOutlineColor"),Q=o(function(ve,U,Te,ie){var Ee=s.nodePathCache=s.nodePathCache||[],Ae=rge(Te==="polygon"?Te+","+ie.join(","):Te,""+U,""+ve,""+ee),Ge=Ee[Ae],Be,me=!1;return Ge!=null?(Be=Ge,me=!0,f.pathCache=Be):(Be=new Path2D,Ee[Ae]=f.pathCache=Be),{path:Be,cacheHit:me}},"getPath"),ae=e.pstyle("shape").strValue,ue=e.pstyle("shape-polygon-points").pfValue;if(m){t.translate(d.x,d.y);var ce=Q(l,u,ae,ue);g=ce.path,y=ce.cacheHit}var te=o(function(){if(!y){var ve=d;m&&(ve={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(g||t,ve.x,ve.y,l,u,ee,f)}m?t.fill(g):t.fill()},"drawShape"),Ne=o(function(){for(var ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,U=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,Te=h.backgrounding,ie=0,Ee=0;Ee0&&arguments[0]!==void 0?arguments[0]:!1,U=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasPie(e)&&(s.drawPie(t,e,U),ve&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,ee,f)))},"drawPie"),ke=o(function(){var ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,U=(D>0?D:-D)*ve,Te=D>0?0:255;D!==0&&(s.colorFillStyle(t,Te,Te,Te,U),m?t.fill(g):t.fill())},"darken"),Re=o(function(){if(k>0){if(t.lineWidth=k,t.lineCap=P,t.lineJoin=N,t.setLineDash)switch(O){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash(B),t.lineDashOffset=G;break;case"solid":case"double":t.setLineDash([]);break}if(F!=="center"){if(t.save(),t.lineWidth*=2,F==="inside")m?t.clip(g):t.clip();else{var ve=new Path2D;ve.rect(-l/2-k,-u/2-k,l+2*k,u+2*k),ve.addPath(g),t.clip(ve,"evenodd")}m?t.stroke(g):t.stroke(),t.restore()}else m?t.stroke(g):t.stroke();if(O==="double"){t.lineWidth=k/3;var U=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",m?t.stroke(g):t.stroke(),t.globalCompositeOperation=U}t.setLineDash&&t.setLineDash([])}},"drawBorder"),Ce=o(function(){if(W>0){if(t.lineWidth=W,t.lineCap="butt",t.setLineDash)switch(j){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"solid":case"double":t.setLineDash([]);break}var ve=d;m&&(ve={x:0,y:0});var U=s.getNodeShape(e),Te=k;F==="inside"&&(Te=0),F==="outside"&&(Te*=2);var ie=(l+Te+(W+K))/l,Ee=(u+Te+(W+K))/u,Ae=l*ie,Ge=u*Ee,Be=s.nodeShapes[U].points,me;if(m){var He=Q(Ae,Ge,U,Be);me=He.path}if(U==="ellipse")s.drawEllipsePath(me||t,ve.x,ve.y,Ae,Ge);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(U)){var Oe=0,et=0,bt=0;U==="round-diamond"?Oe=(Te+K+W)*1.4:U==="round-heptagon"?(Oe=(Te+K+W)*1.075,bt=-(Te/2+K+W)/35):U==="round-hexagon"?Oe=(Te+K+W)*1.12:U==="round-pentagon"?(Oe=(Te+K+W)*1.13,bt=-(Te/2+K+W)/15):U==="round-tag"?(Oe=(Te+K+W)*1.12,et=(Te/2+W+K)*.07):U==="round-triangle"&&(Oe=(Te+K+W)*(Math.PI/2),bt=-(Te+K/2+W)/Math.PI),Oe!==0&&(ie=(l+Oe)/l,Ae=l*ie,["round-hexagon","round-tag"].includes(U)||(Ee=(u+Oe)/u,Ge=u*Ee)),ee=ee==="auto"?dge(Ae,Ge):ee;for(var kt=Ae/2,vt=Ge/2,rt=ee+(Te+W+K)/2,yt=new Array(Be.length/2),Ue=new Array(Be.length/2),tt=0;tt0){if(i=i||n.position(),a==null||s==null){var m=n.padding();a=n.width()+2*m,s=n.height()+2*m}l.colorFillStyle(r,f[0],f[1],f[2],h),l.nodeShapes[d].draw(r,i.x,i.y,a+u*2,s+u*2,p),r.fill()}}}},"drawNodeOverlayUnderlay");I1.drawNodeOverlay=g1e("overlay");I1.drawNodeUnderlay=g1e("underlay");I1.hasPie=function(t){return t=t[0],t._private.hasPie};I1.drawPie=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=e.pstyle("pie-size"),s=n.x,l=n.y,u=e.width(),h=e.height(),f=Math.min(u,h)/2,d=0,p=this.usePaths();p&&(s=0,l=0),a.units==="%"?f=f*a.pfValue:a.pfValue!==void 0&&(f=a.pfValue/2);for(var m=1;m<=i.pieBackgroundN;m++){var g=e.pstyle("pie-"+m+"-background-size").value,y=e.pstyle("pie-"+m+"-background-color").value,v=e.pstyle("pie-"+m+"-background-opacity").value*r,x=g/100;x+d>1&&(x=1-d);var b=1.5*Math.PI+2*Math.PI*d,w=2*Math.PI*x,_=b+w;g===0||d>=1||d+x>1||(t.beginPath(),t.moveTo(s,l),t.arc(s,l,f,b,_),t.closePath(),this.colorFillStyle(t,y[0],y[1],y[2],v),t.fill(),d+=x)}};To={},Uet=100;To.getPixelRatio=function(){var t=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),r=t.backingStorePixelRatio||t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/r};To.paintCache=function(t){for(var e=this.paintCaches=this.paintCaches||[],r=!0,n,i=0;is.minMbLowQualFrames&&(s.motionBlurPxRatio=s.mbPxRBlurry)),s.clearingMotionBlur&&(s.motionBlurPxRatio=1),s.textureDrawLastFrame&&!d&&(f[s.NODE]=!0,f[s.SELECT_BOX]=!0);var b=u.style(),w=u.zoom(),_=i!==void 0?i:w,T=u.pan(),E={x:T.x,y:T.y},L={zoom:w,pan:{x:T.x,y:T.y}},S=s.prevViewport,A=S===void 0||L.zoom!==S.zoom||L.pan.x!==S.pan.x||L.pan.y!==S.pan.y;!A&&!(y&&!g)&&(s.motionBlurPxRatio=1),a&&(E=a),_*=l,E.x*=l,E.y*=l;var I=s.getCachedZSortedEles();function D(ce,te,Ne,se,ke){var Re=ce.globalCompositeOperation;ce.globalCompositeOperation="destination-out",s.colorFillStyle(ce,255,255,255,s.motionBlurTransparency),ce.fillRect(te,Ne,se,ke),ce.globalCompositeOperation=Re}o(D,"mbclear");function k(ce,te){var Ne,se,ke,Re;!s.clearingMotionBlur&&(ce===h.bufferContexts[s.MOTIONBLUR_BUFFER_NODE]||ce===h.bufferContexts[s.MOTIONBLUR_BUFFER_DRAG])?(Ne={x:T.x*m,y:T.y*m},se=w*m,ke=s.canvasWidth*m,Re=s.canvasHeight*m):(Ne=E,se=_,ke=s.canvasWidth,Re=s.canvasHeight),ce.setTransform(1,0,0,1,0,0),te==="motionBlur"?D(ce,0,0,ke,Re):!e&&(te===void 0||te)&&ce.clearRect(0,0,ke,Re),r||(ce.translate(Ne.x,Ne.y),ce.scale(se,se)),a&&ce.translate(a.x,a.y),i&&ce.scale(i,i)}if(o(k,"setContextTransform"),d||(s.textureDrawLastFrame=!1),d){if(s.textureDrawLastFrame=!0,!s.textureCache){s.textureCache={},s.textureCache.bb=u.mutableElements().boundingBox(),s.textureCache.texture=s.data.bufferCanvases[s.TEXTURE_BUFFER];var R=s.data.bufferContexts[s.TEXTURE_BUFFER];R.setTransform(1,0,0,1,0,0),R.clearRect(0,0,s.canvasWidth*s.textureMult,s.canvasHeight*s.textureMult),s.render({forcedContext:R,drawOnlyNodeLayer:!0,forcedPxRatio:l*s.textureMult});var L=s.textureCache.viewport={zoom:u.zoom(),pan:u.pan(),width:s.canvasWidth,height:s.canvasHeight};L.mpan={x:(0-L.pan.x)/L.zoom,y:(0-L.pan.y)/L.zoom}}f[s.DRAG]=!1,f[s.NODE]=!1;var C=h.contexts[s.NODE],O=s.textureCache.texture,L=s.textureCache.viewport;C.setTransform(1,0,0,1,0,0),p?D(C,0,0,L.width,L.height):C.clearRect(0,0,L.width,L.height);var N=b.core("outside-texture-bg-color").value,P=b.core("outside-texture-bg-opacity").value;s.colorFillStyle(C,N[0],N[1],N[2],P),C.fillRect(0,0,L.width,L.height);var w=u.zoom();k(C,!1),C.clearRect(L.mpan.x,L.mpan.y,L.width/L.zoom/l,L.height/L.zoom/l),C.drawImage(O,L.mpan.x,L.mpan.y,L.width/L.zoom/l,L.height/L.zoom/l)}else s.textureOnViewport&&!e&&(s.textureCache=null);var F=u.extent(),B=s.pinching||s.hoverData.dragging||s.swipePanning||s.data.wheelZooming||s.hoverData.draggingEles||s.cy.animated(),G=s.hideEdgesOnViewport&&B,z=[];if(z[s.NODE]=!f[s.NODE]&&p&&!s.clearedForMotionBlur[s.NODE]||s.clearingMotionBlur,z[s.NODE]&&(s.clearedForMotionBlur[s.NODE]=!0),z[s.DRAG]=!f[s.DRAG]&&p&&!s.clearedForMotionBlur[s.DRAG]||s.clearingMotionBlur,z[s.DRAG]&&(s.clearedForMotionBlur[s.DRAG]=!0),f[s.NODE]||r||n||z[s.NODE]){var W=p&&!z[s.NODE]&&m!==1,C=e||(W?s.data.bufferContexts[s.MOTIONBLUR_BUFFER_NODE]:h.contexts[s.NODE]),Z=p&&!W?"motionBlur":void 0;k(C,Z),G?s.drawCachedNodes(C,I.nondrag,l,F):s.drawLayeredElements(C,I.nondrag,l,F),s.debug&&s.drawDebugPoints(C,I.nondrag),!r&&!p&&(f[s.NODE]=!1)}if(!n&&(f[s.DRAG]||r||z[s.DRAG])){var W=p&&!z[s.DRAG]&&m!==1,C=e||(W?s.data.bufferContexts[s.MOTIONBLUR_BUFFER_DRAG]:h.contexts[s.DRAG]);k(C,p&&!W?"motionBlur":void 0),G?s.drawCachedNodes(C,I.drag,l,F):s.drawCachedElements(C,I.drag,l,F),s.debug&&s.drawDebugPoints(C,I.drag),!r&&!p&&(f[s.DRAG]=!1)}if(s.showFps||!n&&f[s.SELECT_BOX]&&!r){var C=e||h.contexts[s.SELECT_BOX];if(k(C),s.selection[4]==1&&(s.hoverData.selecting||s.touchData.selecting)){var w=s.cy.zoom(),j=b.core("selection-box-border-width").value/w;C.lineWidth=j,C.fillStyle="rgba("+b.core("selection-box-color").value[0]+","+b.core("selection-box-color").value[1]+","+b.core("selection-box-color").value[2]+","+b.core("selection-box-opacity").value+")",C.fillRect(s.selection[0],s.selection[1],s.selection[2]-s.selection[0],s.selection[3]-s.selection[1]),j>0&&(C.strokeStyle="rgba("+b.core("selection-box-border-color").value[0]+","+b.core("selection-box-border-color").value[1]+","+b.core("selection-box-border-color").value[2]+","+b.core("selection-box-opacity").value+")",C.strokeRect(s.selection[0],s.selection[1],s.selection[2]-s.selection[0],s.selection[3]-s.selection[1]))}if(h.bgActivePosistion&&!s.hoverData.selecting){var w=s.cy.zoom(),oe=h.bgActivePosistion;C.fillStyle="rgba("+b.core("active-bg-color").value[0]+","+b.core("active-bg-color").value[1]+","+b.core("active-bg-color").value[2]+","+b.core("active-bg-opacity").value+")",C.beginPath(),C.arc(oe.x,oe.y,b.core("active-bg-size").pfValue/w,0,2*Math.PI),C.fill()}var K=s.lastRedrawTime;if(s.showFps&&K){K=Math.round(K);var ee=Math.round(1e3/K);C.setTransform(1,0,0,1,0,0),C.fillStyle="rgba(255, 0, 0, 0.75)",C.strokeStyle="rgba(255, 0, 0, 0.75)",C.lineWidth=1,C.fillText("1 frame = "+K+" ms = "+ee+" fps",0,20);var J=60;C.strokeRect(0,30,250,20),C.fillRect(0,30,250*Math.min(ee/J,1),20)}r||(f[s.SELECT_BOX]=!1)}if(p&&m!==1){var H=h.contexts[s.NODE],q=s.data.bufferCanvases[s.MOTIONBLUR_BUFFER_NODE],Q=h.contexts[s.DRAG],ae=s.data.bufferCanvases[s.MOTIONBLUR_BUFFER_DRAG],ue=o(function(te,Ne,se){te.setTransform(1,0,0,1,0,0),se||!x?te.clearRect(0,0,s.canvasWidth,s.canvasHeight):D(te,0,0,s.canvasWidth,s.canvasHeight);var ke=m;te.drawImage(Ne,0,0,s.canvasWidth*ke,s.canvasHeight*ke,0,0,s.canvasWidth,s.canvasHeight)},"drawMotionBlur");(f[s.NODE]||z[s.NODE])&&(ue(H,q,z[s.NODE]),f[s.NODE]=!1),(f[s.DRAG]||z[s.DRAG])&&(ue(Q,ae,z[s.DRAG]),f[s.DRAG]=!1)}s.prevViewport=L,s.clearingMotionBlur&&(s.clearingMotionBlur=!1,s.motionBlurCleared=!0,s.motionBlur=!0),p&&(s.motionBlurTimeout=setTimeout(function(){s.motionBlurTimeout=null,s.clearedForMotionBlur[s.NODE]=!1,s.clearedForMotionBlur[s.DRAG]=!1,s.motionBlur=!1,s.clearingMotionBlur=!d,s.mbFrames=0,f[s.NODE]=!0,f[s.DRAG]=!0,s.redraw()},Uet)),e||u.emit("render")};Gf={};Gf.drawPolygonPath=function(t,e,r,n,i,a){var s=n/2,l=i/2;t.beginPath&&t.beginPath(),t.moveTo(e+s*a[0],r+l*a[1]);for(var u=1;u0&&s>0){m.clearRect(0,0,a,s),m.globalCompositeOperation="source-over";var g=this.getCachedZSortedEles();if(t.full)m.translate(-n.x1*h,-n.y1*h),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(n.x1*h,n.y1*h);else{var y=e.pan(),v={x:y.x*h,y:y.y*h};h*=e.zoom(),m.translate(v.x,v.y),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(-v.x,-v.y)}t.bg&&(m.globalCompositeOperation="destination-over",m.fillStyle=t.bg,m.rect(0,0,a,s),m.fill())}return p};o(Het,"b64ToBlob");o(Gme,"b64UriToB64");o(v1e,"output");wb.png=function(t){return v1e(t,this.bufferCanvasImage(t),"image/png")};wb.jpg=function(t){return v1e(t,this.bufferCanvasImage(t),"image/jpeg")};x1e={};x1e.nodeShapeImpl=function(t,e,r,n,i,a,s,l){switch(t){case"ellipse":return this.drawEllipsePath(e,r,n,i,a);case"polygon":return this.drawPolygonPath(e,r,n,i,a,s);case"round-polygon":return this.drawRoundPolygonPath(e,r,n,i,a,s,l);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(e,r,n,i,a,l);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(e,r,n,i,a,s,l);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(e,r,n,i,a,l);case"barrel":return this.drawBarrelPath(e,r,n,i,a)}};Wet=b1e,Kr=b1e.prototype;Kr.CANVAS_LAYERS=3;Kr.SELECT_BOX=0;Kr.DRAG=1;Kr.NODE=2;Kr.BUFFER_COUNT=3;Kr.TEXTURE_BUFFER=0;Kr.MOTIONBLUR_BUFFER_NODE=1;Kr.MOTIONBLUR_BUFFER_DRAG=2;o(b1e,"CanvasRenderer");Kr.redrawHint=function(t,e){var r=this;switch(t){case"eles":r.data.canvasNeedsRedraw[Kr.NODE]=e;break;case"drag":r.data.canvasNeedsRedraw[Kr.DRAG]=e;break;case"select":r.data.canvasNeedsRedraw[Kr.SELECT_BOX]=e;break}};Yet=typeof Path2D<"u";Kr.path2dEnabled=function(t){if(t===void 0)return this.pathsEnabled;this.pathsEnabled=!!t};Kr.usePaths=function(){return Yet&&this.pathsEnabled};Kr.setImgSmoothing=function(t,e){t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled=e:(t.webkitImageSmoothingEnabled=e,t.mozImageSmoothingEnabled=e,t.msImageSmoothingEnabled=e)};Kr.getImgSmoothing=function(t){return t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled:t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled};Kr.makeOffscreenCanvas=function(t,e){var r;if((typeof OffscreenCanvas>"u"?"undefined":Ki(OffscreenCanvas))!=="undefined")r=new OffscreenCanvas(t,e);else{var n=this.cy.window(),i=n.document;r=i.createElement("canvas"),r.width=t,r.height=e}return r};[p1e,ru,lh,EB,rp,I1,To,Gf,wb,x1e].forEach(function(t){ir(Kr,t)});qet=[{name:"null",impl:t1e},{name:"base",impl:h1e},{name:"canvas",impl:Wet}],Xet=[{type:"layout",extensions:ZJe},{type:"renderer",extensions:qet}],w1e={},T1e={};o(k1e,"setExtension");o(E1e,"getExtension");o(jet,"setModule");o(Ket,"getModule");eB=o(function(){if(arguments.length===2)return E1e.apply(null,arguments);if(arguments.length===3)return k1e.apply(null,arguments);if(arguments.length===4)return Ket.apply(null,arguments);if(arguments.length===5)return jet.apply(null,arguments);di("Invalid extension access syntax")},"extension");fb.prototype.extension=eB;Xet.forEach(function(t){t.extensions.forEach(function(e){k1e(t.type,e.name,e.impl)})});S1e=o(function t(){if(!(this instanceof t))return new t;this.length=0},"Stylesheet"),ep=S1e.prototype;ep.instanceString=function(){return"stylesheet"};ep.selector=function(t){var e=this.length++;return this[e]={selector:t,properties:[]},this};ep.css=function(t,e){var r=this.length-1;if(Zt(t))this[r].properties.push({name:t,value:e});else if(Ur(t))for(var n=t,i=Object.keys(n),a=0;a{"use strict";o(function(e,r){typeof Tb=="object"&&typeof CB=="object"?CB.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Tb=="object"?Tb.layoutBase=r():e.layoutBase=r()},"webpackUniversalModuleDefinition")(Tb,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=26)}([function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(4);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp&&(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)),this.labelHeight>m&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-m)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-m),this.setHeight(this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(6),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,w=0;w-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(T,1),x.target!=x.source&&x.target.edges.splice(E,1);var _=x.source.owner.getEdges().indexOf(x);if(_==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(_,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,w=this.getNodes(),_=w.length,T=0;T<_;T++){var E=w[T];v=E.getTop(),x=E.getLeft(),g>v&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(w[0].getParent().paddingLeft!=null?b=w[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,w,_,T,E,L,S=this.nodes,A=S.length,I=0;Iw&&(y=w),v<_&&(v=_),x>T&&(x=T),bw&&(y=w),v<_&&(v=_),x>T&&(x=T),b=this.nodes.length){var A=0;v.forEach(function(I){I.owner==g&&A++}),A==this.nodes.length&&(this.isConnected=!0)}},t.exports=p},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(5),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=S,!1;if(hf)return l[0]=p,l[1]=h,l[2]=E,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,k=!0):(l[0]=g,l[1]=m,k=!0):C===N&&(u>f?(l[0]=p,l[1]=m,k=!0):(l[0]=x,l[1]=v,k=!0)),-O===N?f>u?(l[2]=L,l[3]=S,R=!0):(l[2]=E,l[3]=T,R=!0):O===N&&(f>u?(l[2]=_,l[3]=T,R=!0):(l[2]=A,l[3]=S,R=!0)),k&&R)return!1;if(u>f?h>d?(P=this.getCardinalDirection(C,N,4),F=this.getCardinalDirection(O,N,2)):(P=this.getCardinalDirection(-C,N,3),F=this.getCardinalDirection(-O,N,1)):h>d?(P=this.getCardinalDirection(-C,N,1),F=this.getCardinalDirection(-O,N,3)):(P=this.getCardinalDirection(C,N,2),F=this.getCardinalDirection(O,N,4)),!k)switch(P){case 1:G=m,B=u+-w/N,l[0]=B,l[1]=G;break;case 2:B=x,G=h+b*N,l[0]=B,l[1]=G;break;case 3:G=v,B=u+w/N,l[0]=B,l[1]=G;break;case 4:B=y,G=h+-b*N,l[0]=B,l[1]=G;break}if(!R)switch(F){case 1:W=T,z=f+-D/N,l[2]=z,l[3]=W;break;case 2:z=A,W=d+I*N,l[2]=z,l[3]=W;break;case 3:W=S,z=f+D/N,l[2]=z,l[3]=W;break;case 4:z=L,W=d+-I*N,l[2]=z,l[3]=W;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,w=void 0,_=void 0,T=void 0,E=void 0,L=void 0,S=void 0,A=void 0;return w=p-f,T=h-d,L=d*f-h*p,_=v-g,E=m-y,S=y*g-m*v,A=w*E-_*T,A===0?null:(x=(T*S-E*L)/A,b=(_*L-w*S)/A,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(w.push(T[0]);w.length>0&&g;){var E=w[0];w.splice(0,1),b.add(E);for(var L=E.getEdges(),x=0;x-1&&T.splice(D,1)}b=new Set,_=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(S,1);var A=_.getNeighborsList();A.forEach(function(k){if(y.indexOf(k)<0){var R=v.get(k),C=R-1;C==1&&E.push(k),v.set(k,C)}})}y=y.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p},function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(4);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mw||b>w)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(w=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>w||b>w)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||w>=x[0].length)){for(var _=0;_h},"_defaultCompareFunction")}]),l}();t.exports=s},function(t,e,r){"use strict";var n=function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o(function(e,r){typeof kb=="object"&&typeof _B=="object"?_B.exports=r(AB()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof kb=="object"?kb.coseBase=r(AB()):e.coseBase=r(e.layoutBase)},"webpackUniversalModuleDefinition")(kb,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=7)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).FDLayoutConstants;function a(){}o(a,"CoSEConstants");for(var s in i)a[s]=i[s];a.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,a.DEFAULT_RADIAL_SEPARATION=i.DEFAULT_EDGE_LENGTH,a.DEFAULT_COMPONENT_SEPERATION=60,a.TILE=!0,a.TILING_PADDING_VERTICAL=10,a.TILING_PADDING_HORIZONTAL=10,a.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutEdge;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEEdge"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraph;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEGraph"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraphManager;function a(l){i.call(this,l)}o(a,"CoSEGraphManager"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutNode,a=n(0).IMath;function s(u,h,f,d){i.call(this,u,h,f,d)}o(s,"CoSENode"),s.prototype=Object.create(i.prototype);for(var l in i)s[l]=i[l];s.prototype.move=function(){var u=this.graphManager.getLayout();this.displacementX=u.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=u.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementX=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementX)),Math.abs(this.displacementY)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementY=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),u.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},s.prototype.propogateDisplacementToChildren=function(u,h){for(var f=this.getChild().getNodes(),d,p=0;p0)this.positionNodesRadially(T);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var E=new Set(this.getAllNodes()),L=this.nodesWithGravity.filter(function(S){return E.has(S)});this.graphManager.setAllNodesToApplyGravitation(L),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},w.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%f.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var T=new Set(this.getAllNodes()),E=this.nodesWithGravity.filter(function(A){return T.has(A)});this.graphManager.setAllNodesToApplyGravitation(E),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var L=!this.isTreeGrowing&&!this.isGrowthFinished,S=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(L,S),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},w.prototype.getPositionsData=function(){for(var T=this.graphManager.getAllNodes(),E={},L=0;L1){var k;for(k=0;kS&&(S=Math.floor(D.y)),I=Math.floor(D.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new m(d.WORLD_CENTER_X-D.x/2,d.WORLD_CENTER_Y-D.y/2))},w.radialLayout=function(T,E,L){var S=Math.max(this.maxDiagonalInTree(T),h.DEFAULT_RADIAL_SEPARATION);w.branchRadialLayout(E,null,0,359,0,S);var A=x.calculateBounds(T),I=new b;I.setDeviceOrgX(A.getMinX()),I.setDeviceOrgY(A.getMinY()),I.setWorldOrgX(L.x),I.setWorldOrgY(L.y);for(var D=0;D1;){var Z=W[0];W.splice(0,1);var j=P.indexOf(Z);j>=0&&P.splice(j,1),G--,F--}E!=null?z=(P.indexOf(W[0])+1)%G:z=0;for(var oe=Math.abs(S-L)/F,K=z;B!=F;K=++K%G){var ee=P[K].getOtherEnd(T);if(ee!=E){var J=(L+B*oe)%360,H=(J+oe)%360;w.branchRadialLayout(ee,T,J,H,A+I,I),B++}}},w.maxDiagonalInTree=function(T){for(var E=y.MIN_VALUE,L=0;LE&&(E=A)}return E},w.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},w.prototype.groupZeroDegreeMembers=function(){var T=this,E={};this.memberGroups={},this.idToDummyNode={};for(var L=[],S=this.graphManager.getAllNodes(),A=0;A"u"&&(E[k]=[]),E[k]=E[k].concat(I)}Object.keys(E).forEach(function(R){if(E[R].length>1){var C="DummyCompound_"+R;T.memberGroups[C]=E[R];var O=E[R][0].getParent(),N=new l(T.graphManager);N.id=C,N.paddingLeft=O.paddingLeft||0,N.paddingRight=O.paddingRight||0,N.paddingBottom=O.paddingBottom||0,N.paddingTop=O.paddingTop||0,T.idToDummyNode[C]=N;var P=T.getGraphManager().add(T.newGraph(),N),F=O.getChild();F.add(N);for(var B=0;B=0;T--){var E=this.compoundOrder[T],L=E.id,S=E.paddingLeft,A=E.paddingTop;this.adjustLocations(this.tiledMemberPack[L],E.rect.x,E.rect.y,S,A)}},w.prototype.repopulateZeroDegreeMembers=function(){var T=this,E=this.tiledZeroDegreePack;Object.keys(E).forEach(function(L){var S=T.idToDummyNode[L],A=S.paddingLeft,I=S.paddingTop;T.adjustLocations(E[L],S.rect.x,S.rect.y,A,I)})},w.prototype.getToBeTiled=function(T){var E=T.id;if(this.toBeTiled[E]!=null)return this.toBeTiled[E];var L=T.getChild();if(L==null)return this.toBeTiled[E]=!1,!1;for(var S=L.getNodes(),A=0;A0)return this.toBeTiled[E]=!1,!1;if(I.getChild()==null){this.toBeTiled[I.id]=!1;continue}if(!this.getToBeTiled(I))return this.toBeTiled[E]=!1,!1}return this.toBeTiled[E]=!0,!0},w.prototype.getNodeDegree=function(T){for(var E=T.id,L=T.getEdges(),S=0,A=0;AR&&(R=O.rect.height)}L+=R+T.verticalPadding}},w.prototype.tileCompoundMembers=function(T,E){var L=this;this.tiledMemberPack=[],Object.keys(T).forEach(function(S){var A=E[S];L.tiledMemberPack[S]=L.tileNodes(T[S],A.paddingLeft+A.paddingRight),A.rect.width=L.tiledMemberPack[S].width,A.rect.height=L.tiledMemberPack[S].height})},w.prototype.tileNodes=function(T,E){var L=h.TILING_PADDING_VERTICAL,S=h.TILING_PADDING_HORIZONTAL,A={rows:[],rowWidth:[],rowHeight:[],width:0,height:E,verticalPadding:L,horizontalPadding:S};T.sort(function(k,R){return k.rect.width*k.rect.height>R.rect.width*R.rect.height?-1:k.rect.width*k.rect.height0&&(D+=T.horizontalPadding),T.rowWidth[L]=D,T.width0&&(k+=T.verticalPadding);var R=0;k>T.rowHeight[L]&&(R=T.rowHeight[L],T.rowHeight[L]=k,R=T.rowHeight[L]-R),T.height+=R,T.rows[L].push(E)},w.prototype.getShortestRowIndex=function(T){for(var E=-1,L=Number.MAX_VALUE,S=0;SL&&(E=S,L=T.rowWidth[S]);return E},w.prototype.canAddHorizontal=function(T,E,L){var S=this.getShortestRowIndex(T);if(S<0)return!0;var A=T.rowWidth[S];if(A+T.horizontalPadding+E<=T.width)return!0;var I=0;T.rowHeight[S]0&&(I=L+T.verticalPadding-T.rowHeight[S]);var D;T.width-A>=E+T.horizontalPadding?D=(T.height+I)/(A+E+T.horizontalPadding):D=(T.height+I)/T.width,I=L+T.verticalPadding;var k;return T.widthI&&E!=L){S.splice(-1,1),T.rows[L].push(A),T.rowWidth[E]=T.rowWidth[E]-I,T.rowWidth[L]=T.rowWidth[L]+I,T.width=T.rowWidth[instance.getLongestRowIndex(T)];for(var D=Number.MIN_VALUE,k=0;kD&&(D=S[k].height);E>0&&(D+=T.verticalPadding);var R=T.rowHeight[E]+T.rowHeight[L];T.rowHeight[E]=D,T.rowHeight[L]0)for(var F=A;F<=I;F++)P[0]+=this.grid[F][D-1].length+this.grid[F][D].length-1;if(I0)for(var F=D;F<=k;F++)P[3]+=this.grid[A-1][F].length+this.grid[A][F].length-1;for(var B=y.MAX_VALUE,G,z,W=0;W{"use strict";o(function(e,r){typeof Eb=="object"&&typeof DB=="object"?DB.exports=r(LB()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof Eb=="object"?Eb.cytoscapeCoseBilkent=r(LB()):e.cytoscapeCoseBilkent=r(e.coseBase)},"webpackUniversalModuleDefinition")(Eb,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=1)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).layoutBase.LayoutConstants,a=n(0).layoutBase.FDLayoutConstants,s=n(0).CoSEConstants,l=n(0).CoSELayout,u=n(0).CoSENode,h=n(0).layoutBase.PointD,f=n(0).layoutBase.DimensionD,d={ready:o(function(){},"ready"),stop:o(function(){},"stop"),quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function p(v,x){var b={};for(var w in v)b[w]=v[w];for(var w in x)b[w]=x[w];return b}o(p,"extend");function m(v){this.options=p(d,v),g(this.options)}o(m,"_CoSELayout");var g=o(function(x){x.nodeRepulsion!=null&&(s.DEFAULT_REPULSION_STRENGTH=a.DEFAULT_REPULSION_STRENGTH=x.nodeRepulsion),x.idealEdgeLength!=null&&(s.DEFAULT_EDGE_LENGTH=a.DEFAULT_EDGE_LENGTH=x.idealEdgeLength),x.edgeElasticity!=null&&(s.DEFAULT_SPRING_STRENGTH=a.DEFAULT_SPRING_STRENGTH=x.edgeElasticity),x.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=a.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=x.nestingFactor),x.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=a.DEFAULT_GRAVITY_STRENGTH=x.gravity),x.numIter!=null&&(s.MAX_ITERATIONS=a.MAX_ITERATIONS=x.numIter),x.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=a.DEFAULT_GRAVITY_RANGE_FACTOR=x.gravityRange),x.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=a.DEFAULT_COMPOUND_GRAVITY_STRENGTH=x.gravityCompound),x.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=a.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=x.gravityRangeCompound),x.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=a.DEFAULT_COOLING_FACTOR_INCREMENTAL=x.initialEnergyOnIncremental),x.quality=="draft"?i.QUALITY=0:x.quality=="proof"?i.QUALITY=2:i.QUALITY=1,s.NODE_DIMENSIONS_INCLUDE_LABELS=a.NODE_DIMENSIONS_INCLUDE_LABELS=i.NODE_DIMENSIONS_INCLUDE_LABELS=x.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=a.DEFAULT_INCREMENTAL=i.DEFAULT_INCREMENTAL=!x.randomize,s.ANIMATE=a.ANIMATE=i.ANIMATE=x.animate,s.TILE=x.tile,s.TILING_PADDING_VERTICAL=typeof x.tilingPaddingVertical=="function"?x.tilingPaddingVertical.call():x.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof x.tilingPaddingHorizontal=="function"?x.tilingPaddingHorizontal.call():x.tilingPaddingHorizontal},"getUserOptions");m.prototype.run=function(){var v,x,b=this.options,w=this.idToLNode={},_=this.layout=new l,T=this;T.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var E=_.newGraphManager();this.gm=E;var L=this.options.eles.nodes(),S=this.options.eles.edges();this.root=E.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(L),_);for(var A=0;A0){var k;k=b.getGraphManager().add(b.newGraph(),L),this.processChildrenList(k,E,b)}}},m.prototype.stop=function(){return this.stopped=!0,this};var y=o(function(x){x("layout","cose-bilkent",m)},"register");typeof cytoscape<"u"&&y(cytoscape),e.exports=y}])})});function itt(t,e,r,n,i){return t.insert("polygon",":first-child").attr("points",n.map(function(a){return a.x+","+a.y}).join(" ")).attr("transform","translate("+(i.width-e)/2+", "+r+")")}var Zet,Jet,ett,ttt,rtt,ntt,att,stt,A1e,_1e,L1e=M(()=>{"use strict";Pl();hr();Zet=12,Jet=o(function(t,e,r,n){e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 ${r.height-5} v${-r.height+2*5} q0,-5 5,-5 h${r.width-2*5} q5,0 5,5 v${r.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",r.height).attr("x2",r.width).attr("y2",r.height)},"defaultBkg"),ett=o(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("width",r.width)},"rectBkg"),ttt=o(function(t,e,r){let n=r.width,i=r.height,a=.15*n,s=.25*n,l=.35*n,u=.2*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 0 0,1 ${n*.25},${-1*n*.1} + a${l},${l} 1 0,1 ${n*.4},${-1*n*.1} + a${s},${s} 1 0,1 ${n*.35},${1*n*.2} + + a${a},${a} 1 0,1 ${n*.15},${1*i*.35} + a${u},${u} 1 0,1 ${-1*n*.15},${1*i*.65} + + a${s},${a} 1 0,1 ${-1*n*.25},${n*.15} + a${l},${l} 1 0,1 ${-1*n*.5},0 + a${a},${a} 1 0,1 ${-1*n*.25},${-1*n*.15} + + a${a},${a} 1 0,1 ${-1*n*.1},${-1*i*.35} + a${u},${u} 1 0,1 ${n*.1},${-1*i*.65} + + H0 V0 Z`)},"cloudBkg"),rtt=o(function(t,e,r){let n=r.width,i=r.height,a=.15*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 1 0,0 ${n*.25},${-1*i*.1} + a${a},${a} 1 0,0 ${n*.25},0 + a${a},${a} 1 0,0 ${n*.25},0 + a${a},${a} 1 0,0 ${n*.25},${1*i*.1} + + a${a},${a} 1 0,0 ${n*.15},${1*i*.33} + a${a*.8},${a*.8} 1 0,0 0,${1*i*.34} + a${a},${a} 1 0,0 ${-1*n*.15},${1*i*.33} + + a${a},${a} 1 0,0 ${-1*n*.25},${i*.15} + a${a},${a} 1 0,0 ${-1*n*.25},0 + a${a},${a} 1 0,0 ${-1*n*.25},0 + a${a},${a} 1 0,0 ${-1*n*.25},${-1*i*.15} + + a${a},${a} 1 0,0 ${-1*n*.1},${-1*i*.33} + a${a*.8},${a*.8} 1 0,0 0,${-1*i*.34} + a${a},${a} 1 0,0 ${n*.1},${-1*i*.33} + + H0 V0 Z`)},"bangBkg"),ntt=o(function(t,e,r){e.append("circle").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("r",r.width/2)},"circleBkg");o(itt,"insertPolygonShape");att=o(function(t,e,r){let n=r.height,a=n/4,s=r.width-r.padding+2*a,l=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-n/2},{x:s-a,y:-n},{x:a,y:-n},{x:0,y:-n/2}];itt(e,s,n,l,r)},"hexagonBkg"),stt=o(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("rx",r.padding).attr("ry",r.padding).attr("width",r.width)},"roundedRectBkg"),A1e=o(async function(t,e,r,n,i){let a=i.htmlLabels,s=n%(Zet-1),l=e.append("g");r.section=s;let u="section-"+s;s<0&&(u+=" section-root"),l.attr("class",(r.class?r.class+" ":"")+"mindmap-node "+u);let h=l.append("g"),f=l.append("g"),d=r.descr.replace(/()/g,` +`);await Li(f,d,{useHtmlLabels:a,width:r.width,classes:"mindmap-node-label"},i),a||f.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle");let p=f.node().getBBox(),[m]=Ho(i.fontSize);if(r.height=p.height+m*1.1*.5+r.padding,r.width=p.width+2*r.padding,r.icon)if(r.type===t.nodeType.CIRCLE)r.height+=50,r.width+=50,l.append("foreignObject").attr("height","50px").attr("width",r.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),f.attr("transform","translate("+r.width/2+", "+(r.height/2-1.5*r.padding)+")");else{r.width+=50;let g=r.height;r.height=Math.max(g,60);let y=Math.abs(r.height-g);l.append("foreignObject").attr("width","60px").attr("height",r.height).attr("style","text-align: center;margin-top:"+y/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),f.attr("transform","translate("+(25+r.width/2)+", "+(y/2+r.padding/2)+")")}else if(a){let g=(r.width-p.width)/2,y=(r.height-p.height)/2;f.attr("transform","translate("+g+", "+y+")")}else{let g=r.width/2,y=r.padding/2;f.attr("transform","translate("+g+", "+y+")")}switch(r.type){case t.nodeType.DEFAULT:Jet(t,h,r,s);break;case t.nodeType.ROUNDED_RECT:stt(t,h,r,s);break;case t.nodeType.RECT:ett(t,h,r,s);break;case t.nodeType.CIRCLE:h.attr("transform","translate("+r.width/2+", "+ +r.height/2+")"),ntt(t,h,r,s);break;case t.nodeType.CLOUD:ttt(t,h,r,s);break;case t.nodeType.BANG:rtt(t,h,r,s);break;case t.nodeType.HEXAGON:att(t,h,r,s);break}return t.setElementForId(r.id,l),r.height},"drawNode"),_1e=o(function(t,e){let r=t.getElementById(e.id),n=e.x||0,i=e.y||0;r.attr("transform","translate("+n+","+i+")")},"positionNode")});async function N1e(t,e,r,n,i){await A1e(t,e,r,n,i),r.children&&await Promise.all(r.children.map((a,s)=>N1e(t,e,a,n<0?s:n,i)))}function ott(t,e){e.edges().map((r,n)=>{let i=r.data();if(r[0]._private.bodyBounds){let a=r[0]._private.rscratch;Y.trace("Edge: ",n,i),t.insert("path").attr("d",`M ${a.startX},${a.startY} L ${a.midX},${a.midY} L${a.endX},${a.endY} `).attr("class","edge section-edge-"+i.section+" edge-depth-"+i.depth)}})}function R1e(t,e,r,n){e.add({group:"nodes",data:{id:t.id.toString(),labelText:t.descr,height:t.height,width:t.width,level:n,nodeId:t.id,padding:t.padding,type:t.type},position:{x:t.x,y:t.y}}),t.children&&t.children.forEach(i=>{R1e(i,e,r,n+1),e.add({group:"edges",data:{id:`${t.id}_${i.id}`,source:t.id,target:i.id,depth:n,section:i.section}})})}function ltt(t,e){return new Promise(r=>{let n=Ve("body").append("div").attr("id","cy").attr("style","display:none"),i=fl({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});n.remove(),R1e(t,i,e,0),i.nodes().forEach(function(a){a.layoutDimensions=()=>{let s=a.data();return{w:s.width,h:s.height}}}),i.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),i.ready(a=>{Y.info("Ready",a),r(i)})})}function ctt(t,e){e.nodes().map((r,n)=>{let i=r.data();i.x=r.position().x,i.y=r.position().y,_1e(t,i);let a=t.getElementById(i.nodeId);Y.info("Id:",n,"Position: (",r.position().x,", ",r.position().y,")",i),a.attr("transform",`translate(${r.position().x-i.width/2}, ${r.position().y-i.height/2})`),a.attr("attr",`apa-${n})`)})}var D1e,utt,M1e,I1e=M(()=>{"use strict";SB();D1e=Ji(C1e(),1);pr();Vt();ut();eh();ai();L1e();bs();fl.use(D1e.default);o(N1e,"drawNodes");o(ott,"drawEdges");o(R1e,"addNodes");o(ltt,"layoutMindmap");o(ctt,"positionNodes");utt=o(async(t,e,r,n)=>{Y.debug(`Rendering mindmap diagram +`+t);let i=n.db,a=i.getMindmap();if(!a)return;let s=pe();s.htmlLabels=!1;let l=Va(e),u=l.append("g");u.attr("class","mindmap-edges");let h=l.append("g");h.attr("class","mindmap-nodes"),await N1e(i,h,a,-1,s);let f=await ltt(a,s);ott(u,f),ctt(i,f),Io(void 0,l,s.mindmap?.padding??ur.mindmap.padding,s.mindmap?.useMaxWidth??ur.mindmap.useMaxWidth)},"draw"),M1e={draw:utt}});var htt,ftt,O1e,P1e=M(()=>{"use strict";Lo();htt=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${htt(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .mindmap-node-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`,"getStyles"),O1e=ftt});var B1e={};vr(B1e,{diagram:()=>dtt});var dtt,F1e=M(()=>{"use strict";kpe();Cpe();I1e();P1e();dtt={db:Spe,renderer:M1e,parser:Tpe,styles:O1e}});var NB,$1e,V1e=M(()=>{"use strict";NB=function(){var t=o(function(L,S,A,I){for(A=A||{},I=L.length;I--;A[L[I]]=S);return A},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,31],g=[6,7,11,24],y=[1,6,13,16,17,20,23],v=[1,35],x=[1,36],b=[1,6,7,11,13,16,17,20,23],w=[1,38],_={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(S,A,I,D,k,R,C){var O=R.length-1;switch(k){case 6:case 7:return D;case 8:D.getLogger().trace("Stop NL ");break;case 9:D.getLogger().trace("Stop EOF ");break;case 11:D.getLogger().trace("Stop NL2 ");break;case 12:D.getLogger().trace("Stop EOF2 ");break;case 15:D.getLogger().info("Node: ",R[O-1].id),D.addNode(R[O-2].length,R[O-1].id,R[O-1].descr,R[O-1].type,R[O]);break;case 16:D.getLogger().info("Node: ",R[O].id),D.addNode(R[O-1].length,R[O].id,R[O].descr,R[O].type);break;case 17:D.getLogger().trace("Icon: ",R[O]),D.decorateNode({icon:R[O]});break;case 18:case 23:D.decorateNode({class:R[O]});break;case 19:D.getLogger().trace("SPACELIST");break;case 20:D.getLogger().trace("Node: ",R[O-1].id),D.addNode(0,R[O-1].id,R[O-1].descr,R[O-1].type,R[O]);break;case 21:D.getLogger().trace("Node: ",R[O].id),D.addNode(0,R[O].id,R[O].descr,R[O].type);break;case 22:D.decorateNode({icon:R[O]});break;case 27:D.getLogger().trace("node found ..",R[O-2]),this.$={id:R[O-1],descr:R[O-1],type:D.getType(R[O-2],R[O])};break;case 28:this.$={id:R[O],descr:R[O],type:0};break;case 29:D.getLogger().trace("node found ..",R[O-3]),this.$={id:R[O-3],descr:R[O-1],type:D.getType(R[O-2],R[O])};break;case 30:this.$=R[O-1]+R[O];break;case 31:this.$=R[O];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:r,9:22,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:h,7:f,10:23,11:d},t(p,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:s,23:l}),t(p,[2,19]),t(p,[2,21],{15:30,24:m}),t(p,[2,22]),t(p,[2,23]),t(g,[2,25]),t(g,[2,26]),t(g,[2,28],{20:[1,32]}),{21:[1,33]},{6:h,7:f,10:34,11:d},{1:[2,7],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(y,[2,14],{7:v,11:x}),t(b,[2,8]),t(b,[2,9]),t(b,[2,10]),t(p,[2,16],{15:37,24:m}),t(p,[2,17]),t(p,[2,18]),t(p,[2,20],{24:w}),t(g,[2,31]),{21:[1,39]},{22:[1,40]},t(y,[2,13],{7:v,11:x}),t(b,[2,11]),t(b,[2,12]),t(p,[2,15],{24:w}),t(g,[2,30]),{22:[1,41]},t(g,[2,27]),t(g,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(S,A){if(A.recoverable)this.trace(S);else{var I=new Error(S);throw I.hash=A,I}},"parseError"),parse:o(function(S){var A=this,I=[0],D=[],k=[null],R=[],C=this.table,O="",N=0,P=0,F=0,B=2,G=1,z=R.slice.call(arguments,1),W=Object.create(this.lexer),Z={yy:{}};for(var j in this.yy)Object.prototype.hasOwnProperty.call(this.yy,j)&&(Z.yy[j]=this.yy[j]);W.setInput(S,Z.yy),Z.yy.lexer=W,Z.yy.parser=this,typeof W.yylloc>"u"&&(W.yylloc={});var oe=W.yylloc;R.push(oe);var K=W.options&&W.options.ranges;typeof Z.yy.parseError=="function"?this.parseError=Z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ee(Pe){I.length=I.length-2*Pe,k.length=k.length-Pe,R.length=R.length-Pe}o(ee,"popStack");function J(){var Pe;return Pe=D.pop()||W.lex()||G,typeof Pe!="number"&&(Pe instanceof Array&&(D=Pe,Pe=D.pop()),Pe=A.symbols_[Pe]||Pe),Pe}o(J,"lex");for(var H,q,Q,ae,ue,ce,te={},Ne,se,ke,Re;;){if(Q=I[I.length-1],this.defaultActions[Q]?ae=this.defaultActions[Q]:((H===null||typeof H>"u")&&(H=J()),ae=C[Q]&&C[Q][H]),typeof ae>"u"||!ae.length||!ae[0]){var Ce="";Re=[];for(Ne in C[Q])this.terminals_[Ne]&&Ne>B&&Re.push("'"+this.terminals_[Ne]+"'");W.showPosition?Ce="Parse error on line "+(N+1)+`: +`+W.showPosition()+` +Expecting `+Re.join(", ")+", got '"+(this.terminals_[H]||H)+"'":Ce="Parse error on line "+(N+1)+": Unexpected "+(H==G?"end of input":"'"+(this.terminals_[H]||H)+"'"),this.parseError(Ce,{text:W.match,token:this.terminals_[H]||H,line:W.yylineno,loc:oe,expected:Re})}if(ae[0]instanceof Array&&ae.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Q+", token: "+H);switch(ae[0]){case 1:I.push(H),k.push(W.yytext),R.push(W.yylloc),I.push(ae[1]),H=null,q?(H=q,q=null):(P=W.yyleng,O=W.yytext,N=W.yylineno,oe=W.yylloc,F>0&&F--);break;case 2:if(se=this.productions_[ae[1]][1],te.$=k[k.length-se],te._$={first_line:R[R.length-(se||1)].first_line,last_line:R[R.length-1].last_line,first_column:R[R.length-(se||1)].first_column,last_column:R[R.length-1].last_column},K&&(te._$.range=[R[R.length-(se||1)].range[0],R[R.length-1].range[1]]),ce=this.performAction.apply(te,[O,P,N,Z.yy,ae[1],k,R].concat(z)),typeof ce<"u")return ce;se&&(I=I.slice(0,-1*se*2),k=k.slice(0,-1*se),R=R.slice(0,-1*se)),I.push(this.productions_[ae[1]][0]),k.push(te.$),R.push(te._$),ke=C[I[I.length-2]][I[I.length-1]],I.push(ke);break;case 3:return!0}}return!0},"parse")},T=function(){var L={EOF:1,parseError:o(function(A,I){if(this.yy.parser)this.yy.parser.parseError(A,I);else throw new Error(A)},"parseError"),setInput:o(function(S,A){return this.yy=A||this.yy||{},this._input=S,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var S=this._input[0];this.yytext+=S,this.yyleng++,this.offset++,this.match+=S,this.matched+=S;var A=S.match(/(?:\r\n?|\n).*/g);return A?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),S},"input"),unput:o(function(S){var A=S.length,I=S.split(/(?:\r\n?|\n)/g);this._input=S+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-A),this.offset-=A;var D=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),I.length-1&&(this.yylineno-=I.length-1);var k=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:I?(I.length===D.length?this.yylloc.first_column:0)+D[D.length-I.length].length-I[0].length:this.yylloc.first_column-A},this.options.ranges&&(this.yylloc.range=[k[0],k[0]+this.yyleng-A]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(S){this.unput(this.match.slice(S))},"less"),pastInput:o(function(){var S=this.matched.substr(0,this.matched.length-this.match.length);return(S.length>20?"...":"")+S.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var S=this.match;return S.length<20&&(S+=this._input.substr(0,20-S.length)),(S.substr(0,20)+(S.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var S=this.pastInput(),A=new Array(S.length+1).join("-");return S+this.upcomingInput()+` +`+A+"^"},"showPosition"),test_match:o(function(S,A){var I,D,k;if(this.options.backtrack_lexer&&(k={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(k.yylloc.range=this.yylloc.range.slice(0))),D=S[0].match(/(?:\r\n?|\n).*/g),D&&(this.yylineno+=D.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:D?D[D.length-1].length-D[D.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+S[0].length},this.yytext+=S[0],this.match+=S[0],this.matches=S,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(S[0].length),this.matched+=S[0],I=this.performAction.call(this,this.yy,this,A,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),I)return I;if(this._backtrack){for(var R in k)this[R]=k[R];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var S,A,I,D;this._more||(this.yytext="",this.match="");for(var k=this._currentRules(),R=0;RA[0].length)){if(A=I,D=R,this.options.backtrack_lexer){if(S=this.test_match(I,k[R]),S!==!1)return S;if(this._backtrack){A=!1;continue}else return!1}else if(!this.options.flex)break}return A?(S=this.test_match(A,k[D]),S!==!1?S:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var A=this.next();return A||this.lex()},"lex"),begin:o(function(A){this.conditionStack.push(A)},"begin"),popState:o(function(){var A=this.conditionStack.length-1;return A>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(A){return A=this.conditionStack.length-1-Math.abs(A||0),A>=0?this.conditionStack[A]:"INITIAL"},"topState"),pushState:o(function(A){this.begin(A)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(A,I,D,k){var R=k;switch(D){case 0:return this.pushState("shapeData"),I.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let C=/\n\s*/g;return I.yytext=I.yytext.replace(C,"
    "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return A.getLogger().trace("Found comment",I.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:A.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return A.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:A.getLogger().trace("end icon"),this.popState();break;case 16:return A.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return A.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return A.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return A.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:A.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return A.getLogger().trace("description:",I.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),A.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),A.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),A.getLogger().trace("node end ...",I.yytext),"NODE_DEND";break;case 36:return this.popState(),A.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),A.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),A.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),A.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),A.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return A.getLogger().trace("Long description:",I.yytext),21;break;case 42:return A.getLogger().trace("Long description:",I.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return L}();_.lexer=T;function E(){this.yy={}}return o(E,"Parser"),E.prototype=_,_.Parser=E,new E}();NB.parser=NB;$1e=NB});var dl,MB,RB,IB,ytt,vtt,U1e,xtt,btt,Zi,wtt,Ttt,ktt,Ett,Stt,Ctt,Att,H1e,W1e=M(()=>{"use strict";Vt();fr();ut();bs();ew();dl=[],MB=[],RB=0,IB={},ytt=o(()=>{dl=[],MB=[],RB=0,IB={}},"clear"),vtt=o(t=>{if(dl.length===0)return null;let e=dl[0].level,r=null;for(let n=dl.length-1;n>=0;n--)if(dl[n].level===e&&!r&&(r=dl[n]),dl[n].levell.parentId===i.id);for(let l of s){let u={id:l.id,parentId:i.id,label:kr(l.label??"",n),isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};e.push(u)}}return{nodes:e,edges:t,other:{},config:pe()}},"getData"),btt=o((t,e,r,n,i)=>{let a=pe(),s=a.mindmap?.padding??ur.mindmap.padding;switch(n){case Zi.ROUNDED_RECT:case Zi.RECT:case Zi.HEXAGON:s*=2}let l={id:kr(e,a)||"kbn"+RB++,level:t,label:kr(r,a),width:a.mindmap?.maxNodeWidth??ur.mindmap.maxNodeWidth,padding:s,isGroup:!1};if(i!==void 0){let h;i.includes(` +`)?h=i+` +`:h=`{ +`+i+` +}`;let f=Sm(h,{schema:Em});if(f.shape&&(f.shape!==f.shape.toLowerCase()||f.shape.includes("_")))throw new Error(`No such shape: ${f.shape}. Shape names should be lowercase.`);f?.shape&&f.shape==="kanbanItem"&&(l.shape=f?.shape),f?.label&&(l.label=f?.label),f?.icon&&(l.icon=f?.icon),f?.assigned&&(l.assigned=f?.assigned),f?.ticket&&(l.ticket=f?.ticket),f?.priority&&(l.priority=f?.priority)}let u=vtt(t);u?l.parentId=u.id||"kbn"+RB++:MB.push(l),dl.push(l)},"addNode"),Zi={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},wtt=o((t,e)=>{switch(Y.debug("In get type",t,e),t){case"[":return Zi.RECT;case"(":return e===")"?Zi.ROUNDED_RECT:Zi.CLOUD;case"((":return Zi.CIRCLE;case")":return Zi.CLOUD;case"))":return Zi.BANG;case"{{":return Zi.HEXAGON;default:return Zi.DEFAULT}},"getType"),Ttt=o((t,e)=>{IB[t]=e},"setElementForId"),ktt=o(t=>{if(!t)return;let e=pe(),r=dl[dl.length-1];t.icon&&(r.icon=kr(t.icon,e)),t.class&&(r.cssClasses=kr(t.class,e))},"decorateNode"),Ett=o(t=>{switch(t){case Zi.DEFAULT:return"no-border";case Zi.RECT:return"rect";case Zi.ROUNDED_RECT:return"rounded-rect";case Zi.CIRCLE:return"circle";case Zi.CLOUD:return"cloud";case Zi.BANG:return"bang";case Zi.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),Stt=o(()=>Y,"getLogger"),Ctt=o(t=>IB[t],"getElementById"),Att={clear:ytt,addNode:btt,getSections:U1e,getData:xtt,nodeType:Zi,getType:wtt,setElementForId:Ttt,decorateNode:ktt,type2Str:Ett,getLogger:Stt,getElementById:Ctt},H1e=Att});var _tt,Y1e,q1e=M(()=>{"use strict";Vt();ut();eh();ai();bs();lw();vw();_tt=o(async(t,e,r,n)=>{Y.debug(`Rendering kanban diagram +`+t);let a=n.db.getData(),s=pe();s.htmlLabels=!1;let l=Va(e),u=l.append("g");u.attr("class","sections");let h=l.append("g");h.attr("class","items");let f=a.nodes.filter(v=>v.isGroup),d=0,p=10,m=[],g=25;for(let v of f){let x=s?.kanban?.sectionWidth||200;d=d+1,v.x=x*d+(d-1)*p/2,v.width=x,v.y=0,v.height=x*3,v.rx=5,v.ry=5,v.cssClasses=v.cssClasses+" section-"+d;let b=await _m(u,v);g=Math.max(g,b?.labelBBox?.height),m.push(b)}let y=0;for(let v of f){let x=m[y];y=y+1;let b=s?.kanban?.sectionWidth||200,w=-b*3/2+g,_=w,T=a.nodes.filter(S=>S.parentId===v.id);for(let S of T){if(S.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");S.x=v.x,S.width=b-1.5*p;let I=(await Lm(h,S,{config:s})).node().getBBox();S.y=_+I.height/2,await Uv(S),_=S.y+I.height/2+p/2}let E=x.cluster.select("rect"),L=Math.max(_-w+3*p,50)+(g-25);E.attr("height",L)}Io(void 0,l,s.mindmap?.padding??ur.kanban.padding,s.mindmap?.useMaxWidth??ur.kanban.useMaxWidth)},"draw"),Y1e={draw:_tt}});var Ltt,Dtt,X1e,j1e=M(()=>{"use strict";Lo();Ltt=o(t=>{let e="";for(let n=0;nt.darkMode?It(n,i):_t(n,i),"adjuster");for(let n=0;n` + .edge { + stroke-width: 3; + } + ${Ltt(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .cluster-label, .label { + color: ${t.textColor}; + fill: ${t.textColor}; + } + .kanban-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`,"getStyles"),X1e=Dtt});var K1e={};vr(K1e,{diagram:()=>Ntt});var Ntt,Q1e=M(()=>{"use strict";V1e();W1e();q1e();j1e();Ntt={db:H1e,renderer:Y1e,parser:$1e,styles:X1e}});var OB,Sb,eye=M(()=>{"use strict";OB=function(){var t=o(function(l,u,h,f){for(h=h||{},f=l.length;f--;h[l[f]]=u);return h},"o"),e=[1,9],r=[1,10],n=[1,5,10,12],i={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:o(function(u,h,f,d,p,m,g){var y=m.length-1;switch(p){case 7:let v=d.findOrCreateNode(m[y-4].trim().replaceAll('""','"')),x=d.findOrCreateNode(m[y-2].trim().replaceAll('""','"')),b=parseFloat(m[y].trim());d.addLink(v,x,b);break;case 8:case 9:case 11:this.$=m[y];break;case 10:this.$=m[y-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:e,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(n,[2,8]),t(n,[2,9]),{19:[1,16]},t(n,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:e,20:r},{15:18,16:7,17:8,18:e,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(n,[2,10]),{15:21,16:7,17:8,18:e,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:o(function(u,h){if(h.recoverable)this.trace(u);else{var f=new Error(u);throw f.hash=h,f}},"parseError"),parse:o(function(u){var h=this,f=[0],d=[],p=[null],m=[],g=this.table,y="",v=0,x=0,b=0,w=2,_=1,T=m.slice.call(arguments,1),E=Object.create(this.lexer),L={yy:{}};for(var S in this.yy)Object.prototype.hasOwnProperty.call(this.yy,S)&&(L.yy[S]=this.yy[S]);E.setInput(u,L.yy),L.yy.lexer=E,L.yy.parser=this,typeof E.yylloc>"u"&&(E.yylloc={});var A=E.yylloc;m.push(A);var I=E.options&&E.options.ranges;typeof L.yy.parseError=="function"?this.parseError=L.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function D(oe){f.length=f.length-2*oe,p.length=p.length-oe,m.length=m.length-oe}o(D,"popStack");function k(){var oe;return oe=d.pop()||E.lex()||_,typeof oe!="number"&&(oe instanceof Array&&(d=oe,oe=d.pop()),oe=h.symbols_[oe]||oe),oe}o(k,"lex");for(var R,C,O,N,P,F,B={},G,z,W,Z;;){if(O=f[f.length-1],this.defaultActions[O]?N=this.defaultActions[O]:((R===null||typeof R>"u")&&(R=k()),N=g[O]&&g[O][R]),typeof N>"u"||!N.length||!N[0]){var j="";Z=[];for(G in g[O])this.terminals_[G]&&G>w&&Z.push("'"+this.terminals_[G]+"'");E.showPosition?j="Parse error on line "+(v+1)+`: +`+E.showPosition()+` +Expecting `+Z.join(", ")+", got '"+(this.terminals_[R]||R)+"'":j="Parse error on line "+(v+1)+": Unexpected "+(R==_?"end of input":"'"+(this.terminals_[R]||R)+"'"),this.parseError(j,{text:E.match,token:this.terminals_[R]||R,line:E.yylineno,loc:A,expected:Z})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+O+", token: "+R);switch(N[0]){case 1:f.push(R),p.push(E.yytext),m.push(E.yylloc),f.push(N[1]),R=null,C?(R=C,C=null):(x=E.yyleng,y=E.yytext,v=E.yylineno,A=E.yylloc,b>0&&b--);break;case 2:if(z=this.productions_[N[1]][1],B.$=p[p.length-z],B._$={first_line:m[m.length-(z||1)].first_line,last_line:m[m.length-1].last_line,first_column:m[m.length-(z||1)].first_column,last_column:m[m.length-1].last_column},I&&(B._$.range=[m[m.length-(z||1)].range[0],m[m.length-1].range[1]]),F=this.performAction.apply(B,[y,x,v,L.yy,N[1],p,m].concat(T)),typeof F<"u")return F;z&&(f=f.slice(0,-1*z*2),p=p.slice(0,-1*z),m=m.slice(0,-1*z)),f.push(this.productions_[N[1]][0]),p.push(B.$),m.push(B._$),W=g[f[f.length-2]][f[f.length-1]],f.push(W);break;case 3:return!0}}return!0},"parse")},a=function(){var l={EOF:1,parseError:o(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:o(function(u,h){return this.yy=h||this.yy||{},this._input=u,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var u=this._input[0];this.yytext+=u,this.yyleng++,this.offset++,this.match+=u,this.matched+=u;var h=u.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),u},"input"),unput:o(function(u){var h=u.length,f=u.split(/(?:\r\n?|\n)/g);this._input=u+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===d.length?this.yylloc.first_column:0)+d[d.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(u){this.unput(this.match.slice(u))},"less"),pastInput:o(function(){var u=this.matched.substr(0,this.matched.length-this.match.length);return(u.length>20?"...":"")+u.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var u=this.match;return u.length<20&&(u+=this._input.substr(0,20-u.length)),(u.substr(0,20)+(u.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var u=this.pastInput(),h=new Array(u.length+1).join("-");return u+this.upcomingInput()+` +`+h+"^"},"showPosition"),test_match:o(function(u,h){var f,d,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),d=u[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+u[0].length},this.yytext+=u[0],this.match+=u[0],this.matches=u,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(u[0].length),this.matched+=u[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var m in p)this[m]=p[m];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var u,h,f,d;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),m=0;mh[0].length)){if(h=f,d=m,this.options.backtrack_lexer){if(u=this.test_match(f,p[m]),u!==!1)return u;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(u=this.test_match(h,p[d]),u!==!1?u:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var h=this.next();return h||this.lex()},"lex"),begin:o(function(h){this.conditionStack.push(h)},"begin"),popState:o(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:o(function(h){this.begin(h)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(h,f,d,p){var m=p;switch(d){case 0:return this.pushState("csv"),4;break;case 1:return 10;case 2:return 5;case 3:return 12;case 4:return this.pushState("escaped_text"),18;break;case 5:return 20;case 6:return this.popState("escaped_text"),18;break;case 7:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[1,2,3,4,5,6,7],inclusive:!1},escaped_text:{rules:[6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return l}();i.lexer=a;function s(){this.yy={}}return o(s,"Parser"),s.prototype=i,i.Parser=s,new s}();OB.parser=OB;Sb=OB});var rS,nS,tS,Ott,PB,Ptt,BB,Btt,Ftt,ztt,Gtt,tye,rye=M(()=>{"use strict";Vt();fr();Ai();rS=[],nS=[],tS=new Map,Ott=o(()=>{rS=[],nS=[],tS=new Map,Lr()},"clear"),PB=class{constructor(e,r,n=0){this.source=e;this.target=r;this.value=n}static{o(this,"SankeyLink")}},Ptt=o((t,e,r)=>{rS.push(new PB(t,e,r))},"addLink"),BB=class{constructor(e){this.ID=e}static{o(this,"SankeyNode")}},Btt=o(t=>{t=qe.sanitizeText(t,pe());let e=tS.get(t);return e===void 0&&(e=new BB(t),tS.set(t,e),nS.push(e)),e},"findOrCreateNode"),Ftt=o(()=>nS,"getNodes"),ztt=o(()=>rS,"getLinks"),Gtt=o(()=>({nodes:nS.map(t=>({id:t.ID})),links:rS.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),tye={nodesMap:tS,getConfig:o(()=>pe().sankey,"getConfig"),getNodes:Ftt,getLinks:ztt,getGraph:Gtt,addLink:Ptt,findOrCreateNode:Btt,getAccTitle:Br,setAccTitle:Mr,getAccDescription:zr,setAccDescription:Fr,getDiagramTitle:Jr,setDiagramTitle:cn,clear:Ott}});function Cb(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var nye=M(()=>{"use strict";o(Cb,"max")});function O1(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var iye=M(()=>{"use strict";o(O1,"min")});function P1(t,e){let r=0;if(e===void 0)for(let n of t)(n=+n)&&(r+=n);else{let n=-1;for(let i of t)(i=+e(i,++n,t))&&(r+=i)}return r}var aye=M(()=>{"use strict";o(P1,"sum")});var FB=M(()=>{"use strict";nye();iye();aye()});function $tt(t){return t.target.depth}function zB(t){return t.depth}function GB(t,e){return e-1-t.height}function Ab(t,e){return t.sourceLinks.length?t.depth:e-1}function $B(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?O1(t.sourceLinks,$tt)-1:0}var VB=M(()=>{"use strict";FB();o($tt,"targetDepth");o(zB,"left");o(GB,"right");o(Ab,"justify");o($B,"center")});function B1(t){return function(){return t}}var sye=M(()=>{"use strict";o(B1,"constant")});function oye(t,e){return iS(t.source,e.source)||t.index-e.index}function lye(t,e){return iS(t.target,e.target)||t.index-e.index}function iS(t,e){return t.y0-e.y0}function UB(t){return t.value}function Vtt(t){return t.index}function Utt(t){return t.nodes}function Htt(t){return t.links}function cye(t,e){let r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function uye({nodes:t}){for(let e of t){let r=e.y0,n=r;for(let i of e.sourceLinks)i.y0=r+i.width/2,r+=i.width;for(let i of e.targetLinks)i.y1=n+i.width/2,n+=i.width}}function aS(){let t=0,e=0,r=1,n=1,i=24,a=8,s,l=Vtt,u=Ab,h,f,d=Utt,p=Htt,m=6;function g(){let O={nodes:d.apply(null,arguments),links:p.apply(null,arguments)};return y(O),v(O),x(O),b(O),T(O),uye(O),O}o(g,"sankey"),g.update=function(O){return uye(O),O},g.nodeId=function(O){return arguments.length?(l=typeof O=="function"?O:B1(O),g):l},g.nodeAlign=function(O){return arguments.length?(u=typeof O=="function"?O:B1(O),g):u},g.nodeSort=function(O){return arguments.length?(h=O,g):h},g.nodeWidth=function(O){return arguments.length?(i=+O,g):i},g.nodePadding=function(O){return arguments.length?(a=s=+O,g):a},g.nodes=function(O){return arguments.length?(d=typeof O=="function"?O:B1(O),g):d},g.links=function(O){return arguments.length?(p=typeof O=="function"?O:B1(O),g):p},g.linkSort=function(O){return arguments.length?(f=O,g):f},g.size=function(O){return arguments.length?(t=e=0,r=+O[0],n=+O[1],g):[r-t,n-e]},g.extent=function(O){return arguments.length?(t=+O[0][0],r=+O[1][0],e=+O[0][1],n=+O[1][1],g):[[t,e],[r,n]]},g.iterations=function(O){return arguments.length?(m=+O,g):m};function y({nodes:O,links:N}){for(let[F,B]of O.entries())B.index=F,B.sourceLinks=[],B.targetLinks=[];let P=new Map(O.map((F,B)=>[l(F,B,O),F]));for(let[F,B]of N.entries()){B.index=F;let{source:G,target:z}=B;typeof G!="object"&&(G=B.source=cye(P,G)),typeof z!="object"&&(z=B.target=cye(P,z)),G.sourceLinks.push(B),z.targetLinks.push(B)}if(f!=null)for(let{sourceLinks:F,targetLinks:B}of O)F.sort(f),B.sort(f)}o(y,"computeNodeLinks");function v({nodes:O}){for(let N of O)N.value=N.fixedValue===void 0?Math.max(P1(N.sourceLinks,UB),P1(N.targetLinks,UB)):N.fixedValue}o(v,"computeNodeValues");function x({nodes:O}){let N=O.length,P=new Set(O),F=new Set,B=0;for(;P.size;){for(let G of P){G.depth=B;for(let{target:z}of G.sourceLinks)F.add(z)}if(++B>N)throw new Error("circular link");P=F,F=new Set}}o(x,"computeNodeDepths");function b({nodes:O}){let N=O.length,P=new Set(O),F=new Set,B=0;for(;P.size;){for(let G of P){G.height=B;for(let{source:z}of G.targetLinks)F.add(z)}if(++B>N)throw new Error("circular link");P=F,F=new Set}}o(b,"computeNodeHeights");function w({nodes:O}){let N=Cb(O,B=>B.depth)+1,P=(r-t-i)/(N-1),F=new Array(N);for(let B of O){let G=Math.max(0,Math.min(N-1,Math.floor(u.call(null,B,N))));B.layer=G,B.x0=t+G*P,B.x1=B.x0+i,F[G]?F[G].push(B):F[G]=[B]}if(h)for(let B of F)B.sort(h);return F}o(w,"computeNodeLayers");function _(O){let N=O1(O,P=>(n-e-(P.length-1)*s)/P1(P,UB));for(let P of O){let F=e;for(let B of P){B.y0=F,B.y1=F+B.value*N,F=B.y1+s;for(let G of B.sourceLinks)G.width=G.value*N}F=(n-F+s)/(P.length+1);for(let B=0;BP.length)-1)),_(N);for(let P=0;P0))continue;let j=(W/Z-z.y0)*N;z.y0+=j,z.y1+=j,D(z)}h===void 0&&G.sort(iS),S(G,P)}}o(E,"relaxLeftToRight");function L(O,N,P){for(let F=O.length,B=F-2;B>=0;--B){let G=O[B];for(let z of G){let W=0,Z=0;for(let{target:oe,value:K}of z.sourceLinks){let ee=K*(oe.layer-z.layer);W+=C(z,oe)*ee,Z+=ee}if(!(Z>0))continue;let j=(W/Z-z.y0)*N;z.y0+=j,z.y1+=j,D(z)}h===void 0&&G.sort(iS),S(G,P)}}o(L,"relaxRightToLeft");function S(O,N){let P=O.length>>1,F=O[P];I(O,F.y0-s,P-1,N),A(O,F.y1+s,P+1,N),I(O,n,O.length-1,N),A(O,e,0,N)}o(S,"resolveCollisions");function A(O,N,P,F){for(;P1e-6&&(B.y0+=G,B.y1+=G),N=B.y1+s}}o(A,"resolveCollisionsTopToBottom");function I(O,N,P,F){for(;P>=0;--P){let B=O[P],G=(B.y1-N)*F;G>1e-6&&(B.y0-=G,B.y1-=G),N=B.y0-s}}o(I,"resolveCollisionsBottomToTop");function D({sourceLinks:O,targetLinks:N}){if(f===void 0){for(let{source:{sourceLinks:P}}of N)P.sort(lye);for(let{target:{targetLinks:P}}of O)P.sort(oye)}}o(D,"reorderNodeLinks");function k(O){if(f===void 0)for(let{sourceLinks:N,targetLinks:P}of O)N.sort(lye),P.sort(oye)}o(k,"reorderLinks");function R(O,N){let P=O.y0-(O.sourceLinks.length-1)*s/2;for(let{target:F,width:B}of O.sourceLinks){if(F===N)break;P+=B+s}for(let{source:F,width:B}of N.targetLinks){if(F===O)break;P-=B}return P}o(R,"targetTop");function C(O,N){let P=N.y0-(N.targetLinks.length-1)*s/2;for(let{source:F,width:B}of N.targetLinks){if(F===O)break;P+=B+s}for(let{target:F,width:B}of O.sourceLinks){if(F===N)break;P-=B}return P}return o(C,"sourceTop"),g}var hye=M(()=>{"use strict";FB();VB();sye();o(oye,"ascendingSourceBreadth");o(lye,"ascendingTargetBreadth");o(iS,"ascendingBreadth");o(UB,"value");o(Vtt,"defaultId");o(Utt,"defaultNodes");o(Htt,"defaultLinks");o(cye,"find");o(uye,"computeLinkBreadths");o(aS,"Sankey")});function YB(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function fye(){return new YB}var HB,WB,np,Wtt,qB,dye=M(()=>{"use strict";HB=Math.PI,WB=2*HB,np=1e-6,Wtt=WB-np;o(YB,"Path");o(fye,"path");YB.prototype=fye.prototype={constructor:YB,moveTo:o(function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},"moveTo"),closePath:o(function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},"closePath"),lineTo:o(function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},"lineTo"),quadraticCurveTo:o(function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},"quadraticCurveTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},"bezierCurveTo"),arcTo:o(function(t,e,r,n,i){t=+t,e=+e,r=+r,n=+n,i=+i;var a=this._x1,s=this._y1,l=r-t,u=n-e,h=a-t,f=s-e,d=h*h+f*f;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(d>np)if(!(Math.abs(f*l-u*h)>np)||!i)this._+="L"+(this._x1=t)+","+(this._y1=e);else{var p=r-a,m=n-s,g=l*l+u*u,y=p*p+m*m,v=Math.sqrt(g),x=Math.sqrt(d),b=i*Math.tan((HB-Math.acos((g+d-y)/(2*v*x)))/2),w=b/x,_=b/v;Math.abs(w-1)>np&&(this._+="L"+(t+w*h)+","+(e+w*f)),this._+="A"+i+","+i+",0,0,"+ +(f*p>h*m)+","+(this._x1=t+_*l)+","+(this._y1=e+_*u)}},"arcTo"),arc:o(function(t,e,r,n,i,a){t=+t,e=+e,r=+r,a=!!a;var s=r*Math.cos(n),l=r*Math.sin(n),u=t+s,h=e+l,f=1^a,d=a?n-i:i-n;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+u+","+h:(Math.abs(this._x1-u)>np||Math.abs(this._y1-h)>np)&&(this._+="L"+u+","+h),r&&(d<0&&(d=d%WB+WB),d>Wtt?this._+="A"+r+","+r+",0,1,"+f+","+(t-s)+","+(e-l)+"A"+r+","+r+",0,1,"+f+","+(this._x1=u)+","+(this._y1=h):d>np&&(this._+="A"+r+","+r+",0,"+ +(d>=HB)+","+f+","+(this._x1=t+r*Math.cos(i))+","+(this._y1=e+r*Math.sin(i))))},"arc"),rect:o(function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},"rect"),toString:o(function(){return this._},"toString")};qB=fye});var pye=M(()=>{"use strict";dye()});function sS(t){return o(function(){return t},"constant")}var mye=M(()=>{"use strict";o(sS,"default")});function gye(t){return t[0]}function yye(t){return t[1]}var vye=M(()=>{"use strict";o(gye,"x");o(yye,"y")});var xye,bye=M(()=>{"use strict";xye=Array.prototype.slice});function Ytt(t){return t.source}function qtt(t){return t.target}function Xtt(t){var e=Ytt,r=qtt,n=gye,i=yye,a=null;function s(){var l,u=xye.call(arguments),h=e.apply(this,u),f=r.apply(this,u);if(a||(a=l=qB()),t(a,+n.apply(this,(u[0]=h,u)),+i.apply(this,u),+n.apply(this,(u[0]=f,u)),+i.apply(this,u)),l)return a=null,l+""||null}return o(s,"link"),s.source=function(l){return arguments.length?(e=l,s):e},s.target=function(l){return arguments.length?(r=l,s):r},s.x=function(l){return arguments.length?(n=typeof l=="function"?l:sS(+l),s):n},s.y=function(l){return arguments.length?(i=typeof l=="function"?l:sS(+l),s):i},s.context=function(l){return arguments.length?(a=l??null,s):a},s}function jtt(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function XB(){return Xtt(jtt)}var wye=M(()=>{"use strict";pye();bye();mye();vye();o(Ytt,"linkSource");o(qtt,"linkTarget");o(Xtt,"link");o(jtt,"curveHorizontal");o(XB,"linkHorizontal")});var Tye=M(()=>{"use strict";wye()});function Ktt(t){return[t.source.x1,t.y0]}function Qtt(t){return[t.target.x0,t.y1]}function oS(){return XB().source(Ktt).target(Qtt)}var kye=M(()=>{"use strict";Tye();o(Ktt,"horizontalSource");o(Qtt,"horizontalTarget");o(oS,"default")});var Eye=M(()=>{"use strict";hye();VB();kye()});var _b,Sye=M(()=>{"use strict";_b=class t{static{o(this,"Uid")}static{this.count=0}static next(e){return new t(e+ ++t.count)}constructor(e){this.id=e,this.href=`#${e}`}toString(){return"url("+this.href+")"}}});var Ztt,Jtt,Cye,Aye=M(()=>{"use strict";Vt();pr();Eye();ai();Sye();Ztt={left:zB,right:GB,center:$B,justify:Ab},Jtt=o(function(t,e,r,n){let{securityLevel:i,sankey:a}=pe(),s=B4.sankey,l;i==="sandbox"&&(l=Ve("#i"+e));let u=i==="sandbox"?Ve(l.nodes()[0].contentDocument.body):Ve("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):Ve(`[id="${e}"]`),f=a?.width??s.width,d=a?.height??s.width,p=a?.useMaxWidth??s.useMaxWidth,m=a?.nodeAlignment??s.nodeAlignment,g=a?.prefix??s.prefix,y=a?.suffix??s.suffix,v=a?.showValues??s.showValues,x=n.db.getGraph(),b=Ztt[m];aS().nodeId(I=>I.id).nodeWidth(10).nodePadding(10+(v?15:0)).nodeAlign(b).extent([[0,0],[f,d]])(x);let T=ku(e_);h.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",I=>(I.uid=_b.next("node-")).id).attr("transform",function(I){return"translate("+I.x0+","+I.y0+")"}).attr("x",I=>I.x0).attr("y",I=>I.y0).append("rect").attr("height",I=>I.y1-I.y0).attr("width",I=>I.x1-I.x0).attr("fill",I=>T(I.id));let E=o(({id:I,value:D})=>v?`${I} +${g}${Math.round(D*100)/100}${y}`:I,"getText");h.append("g").attr("class","node-labels").attr("font-family","sans-serif").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",I=>I.x0(I.y1+I.y0)/2).attr("dy",`${v?"0":"0.35"}em`).attr("text-anchor",I=>I.x0(D.uid=_b.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",D=>D.source.x1).attr("x2",D=>D.target.x0);I.append("stop").attr("offset","0%").attr("stop-color",D=>T(D.source.id)),I.append("stop").attr("offset","100%").attr("stop-color",D=>T(D.target.id))}let A;switch(S){case"gradient":A=o(I=>I.uid,"coloring");break;case"source":A=o(I=>T(I.source.id),"coloring");break;case"target":A=o(I=>T(I.target.id),"coloring");break;default:A=S}L.append("path").attr("d",oS()).attr("stroke",A).attr("stroke-width",I=>Math.max(1,I.width)),Io(void 0,h,0,p)},"draw"),Cye={draw:Jtt}});var _ye,Lye=M(()=>{"use strict";_ye=o(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` +`).trim(),"prepareTextForParsing")});var Dye={};vr(Dye,{diagram:()=>trt});var ert,trt,Nye=M(()=>{"use strict";eye();rye();Aye();Lye();ert=Sb.parse.bind(Sb);Sb.parse=t=>ert(_ye(t));trt={parser:Sb,db:tye,renderer:Cye}});var Iye,jB,art,srt,ort,lrt,crt,$f,KB=M(()=>{"use strict";Za();bs();hr();Ai();Iye={packet:[]},jB=structuredClone(Iye),art=ur.packet,srt=o(()=>{let t=Ds({...art,...Cr().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),ort=o(()=>jB.packet,"getPacket"),lrt=o(t=>{t.length>0&&jB.packet.push(t)},"pushWord"),crt=o(()=>{Lr(),jB=structuredClone(Iye)},"clear"),$f={pushWord:lrt,getPacket:ort,getConfig:srt,clear:crt,setAccTitle:Mr,getAccTitle:Br,setDiagramTitle:cn,getDiagramTitle:Jr,getAccDescription:zr,setAccDescription:Fr}});var urt,hrt,frt,Oye,Pye=M(()=>{"use strict";Hg();ut();Tx();KB();urt=1e4,hrt=o(t=>{yf(t,$f);let e=-1,r=[],n=1,{bitsPerRow:i}=$f.getConfig();for(let{start:a,end:s,label:l}of t.blocks){if(s&&s{if(t.end===void 0&&(t.end=t.start),t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);return t.end+1<=e*r?[t,void 0]:[{start:t.start,end:e*r-1,label:t.label},{start:e*r,end:t.end,label:t.label}]},"getNextFittingBlock"),Oye={parse:o(async t=>{let e=await Yl("packet",t);Y.debug(e),hrt(e)},"parse")}});var drt,prt,Bye,Fye=M(()=>{"use strict";eh();ai();drt=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),{rowHeight:s,paddingY:l,bitWidth:u,bitsPerRow:h}=a,f=i.getPacket(),d=i.getDiagramTitle(),p=s+l,m=p*(f.length+1)-(d?0:s),g=u*h+2,y=Va(e);y.attr("viewbox",`0 0 ${g} ${m}`),Zr(y,m,g,a.useMaxWidth);for(let[v,x]of f.entries())prt(y,x,v,a);y.append("text").text(d).attr("x",g/2).attr("y",m-p/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),prt=o((t,e,r,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:s,bitsPerRow:l,showBits:u})=>{let h=t.append("g"),f=r*(n+a)+a;for(let d of e){let p=d.start%l*s+1,m=(d.end-d.start+1)*s-i;if(h.append("rect").attr("x",p).attr("y",f).attr("width",m).attr("height",n).attr("class","packetBlock"),h.append("text").attr("x",p+m/2).attr("y",f+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(d.label),!u)continue;let g=d.end===d.start,y=f-2;h.append("text").attr("x",p+(g?m/2:0)).attr("y",y).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",g?"middle":"start").text(d.start),g||h.append("text").attr("x",p+m).attr("y",y).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(d.end)}},"drawWord"),Bye={draw:drt}});var mrt,zye,Gye=M(()=>{"use strict";hr();mrt={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},zye=o(({packet:t}={})=>{let e=Ds(mrt,t);return` + .packetByte { + font-size: ${e.byteFontSize}; + } + .packetByte.start { + fill: ${e.startByteColor}; + } + .packetByte.end { + fill: ${e.endByteColor}; + } + .packetLabel { + fill: ${e.labelColor}; + font-size: ${e.labelFontSize}; + } + .packetTitle { + fill: ${e.titleColor}; + font-size: ${e.titleFontSize}; + } + .packetBlock { + stroke: ${e.blockStrokeColor}; + stroke-width: ${e.blockStrokeWidth}; + fill: ${e.blockFillColor}; + } + `},"styles")});var $ye={};vr($ye,{diagram:()=>grt});var grt,Vye=M(()=>{"use strict";KB();Pye();Fye();Gye();grt={parser:Oye,db:$f,renderer:Bye,styles:zye}});var QB,Wye,Yye=M(()=>{"use strict";QB=function(){var t=o(function(w,_,T,E){for(T=T||{},E=w.length;E--;T[w[E]]=_);return T},"o"),e=[1,7],r=[1,13],n=[1,14],i=[1,15],a=[1,19],s=[1,16],l=[1,17],u=[1,18],h=[8,30],f=[8,21,28,29,30,31,32,40,44,47],d=[1,23],p=[1,24],m=[8,15,16,21,28,29,30,31,32,40,44,47],g=[8,15,16,21,27,28,29,30,31,32,40,44,47],y=[1,49],v={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,block:31,NODE_ID:32,nodeShapeNLabel:33,dirList:34,DIR:35,NODE_DSTART:36,NODE_DEND:37,BLOCK_ARROW_START:38,BLOCK_ARROW_END:39,classDef:40,CLASSDEF_ID:41,CLASSDEF_STYLEOPTS:42,DEFAULT:43,class:44,CLASSENTITY_IDS:45,STYLECLASS:46,style:47,STYLE_ENTITY_IDS:48,STYLE_DEFINITION_DATA:49,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"block",32:"NODE_ID",35:"DIR",36:"NODE_DSTART",37:"NODE_DEND",38:"BLOCK_ARROW_START",39:"BLOCK_ARROW_END",40:"classDef",41:"CLASSDEF_ID",42:"CLASSDEF_STYLEOPTS",43:"DEFAULT",44:"class",45:"CLASSENTITY_IDS",46:"STYLECLASS",47:"style",48:"STYLE_ENTITY_IDS",49:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[34,1],[34,2],[33,3],[33,4],[23,3],[23,3],[24,3],[25,3]],performAction:o(function(_,T,E,L,S,A,I){var D=A.length-1;switch(S){case 4:L.getLogger().debug("Rule: separator (NL) ");break;case 5:L.getLogger().debug("Rule: separator (Space) ");break;case 6:L.getLogger().debug("Rule: separator (EOF) ");break;case 7:L.getLogger().debug("Rule: hierarchy: ",A[D-1]),L.setHierarchy(A[D-1]);break;case 8:L.getLogger().debug("Stop NL ");break;case 9:L.getLogger().debug("Stop EOF ");break;case 10:L.getLogger().debug("Stop NL2 ");break;case 11:L.getLogger().debug("Stop EOF2 ");break;case 12:L.getLogger().debug("Rule: statement: ",A[D]),typeof A[D].length=="number"?this.$=A[D]:this.$=[A[D]];break;case 13:L.getLogger().debug("Rule: statement #2: ",A[D-1]),this.$=[A[D-1]].concat(A[D]);break;case 14:L.getLogger().debug("Rule: link: ",A[D],_),this.$={edgeTypeStr:A[D],label:""};break;case 15:L.getLogger().debug("Rule: LABEL link: ",A[D-3],A[D-1],A[D]),this.$={edgeTypeStr:A[D],label:A[D-1]};break;case 18:let k=parseInt(A[D]),R=L.generateId();this.$={id:R,type:"space",label:"",width:k,children:[]};break;case 23:L.getLogger().debug("Rule: (nodeStatement link node) ",A[D-2],A[D-1],A[D]," typestr: ",A[D-1].edgeTypeStr);let C=L.edgeStrToEdgeData(A[D-1].edgeTypeStr);this.$=[{id:A[D-2].id,label:A[D-2].label,type:A[D-2].type,directions:A[D-2].directions},{id:A[D-2].id+"-"+A[D].id,start:A[D-2].id,end:A[D].id,label:A[D-1].label,type:"edge",directions:A[D].directions,arrowTypeEnd:C,arrowTypeStart:"arrow_open"},{id:A[D].id,label:A[D].label,type:L.typeStr2Type(A[D].typeStr),directions:A[D].directions}];break;case 24:L.getLogger().debug("Rule: nodeStatement (abc88 node size) ",A[D-1],A[D]),this.$={id:A[D-1].id,label:A[D-1].label,type:L.typeStr2Type(A[D-1].typeStr),directions:A[D-1].directions,widthInColumns:parseInt(A[D],10)};break;case 25:L.getLogger().debug("Rule: nodeStatement (node) ",A[D]),this.$={id:A[D].id,label:A[D].label,type:L.typeStr2Type(A[D].typeStr),directions:A[D].directions,widthInColumns:1};break;case 26:L.getLogger().debug("APA123",this?this:"na"),L.getLogger().debug("COLUMNS: ",A[D]),this.$={type:"column-setting",columns:A[D]==="auto"?-1:parseInt(A[D])};break;case 27:L.getLogger().debug("Rule: id-block statement : ",A[D-2],A[D-1]);let O=L.generateId();this.$={...A[D-2],type:"composite",children:A[D-1]};break;case 28:L.getLogger().debug("Rule: blockStatement : ",A[D-2],A[D-1],A[D]);let N=L.generateId();this.$={id:N,type:"composite",label:"",children:A[D-1]};break;case 29:L.getLogger().debug("Rule: node (NODE_ID separator): ",A[D]),this.$={id:A[D]};break;case 30:L.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",A[D-1],A[D]),this.$={id:A[D-1],label:A[D].label,typeStr:A[D].typeStr,directions:A[D].directions};break;case 31:L.getLogger().debug("Rule: dirList: ",A[D]),this.$=[A[D]];break;case 32:L.getLogger().debug("Rule: dirList: ",A[D-1],A[D]),this.$=[A[D-1]].concat(A[D]);break;case 33:L.getLogger().debug("Rule: nodeShapeNLabel: ",A[D-2],A[D-1],A[D]),this.$={typeStr:A[D-2]+A[D],label:A[D-1]};break;case 34:L.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",A[D-3],A[D-2]," #3:",A[D-1],A[D]),this.$={typeStr:A[D-3]+A[D],label:A[D-2],directions:A[D-1]};break;case 35:case 36:this.$={type:"classDef",id:A[D-1].trim(),css:A[D].trim()};break;case 37:this.$={type:"applyClass",id:A[D-1].trim(),styleClass:A[D].trim()};break;case 38:this.$={type:"applyStyles",id:A[D-1].trim(),stylesStr:A[D].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{11:3,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{8:[1,20]},t(h,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,21:e,28:r,29:n,31:i,32:a,40:s,44:l,47:u}),t(f,[2,16],{14:22,15:d,16:p}),t(f,[2,17]),t(f,[2,18]),t(f,[2,19]),t(f,[2,20]),t(f,[2,21]),t(f,[2,22]),t(m,[2,25],{27:[1,25]}),t(f,[2,26]),{19:26,26:12,32:a},{11:27,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{41:[1,28],43:[1,29]},{45:[1,30]},{48:[1,31]},t(g,[2,29],{33:32,36:[1,33],38:[1,34]}),{1:[2,7]},t(h,[2,13]),{26:35,32:a},{32:[2,14]},{17:[1,36]},t(m,[2,24]),{11:37,13:4,14:22,15:d,16:p,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{30:[1,38]},{42:[1,39]},{42:[1,40]},{46:[1,41]},{49:[1,42]},t(g,[2,30]),{18:[1,43]},{18:[1,44]},t(m,[2,23]),{18:[1,45]},{30:[1,46]},t(f,[2,28]),t(f,[2,35]),t(f,[2,36]),t(f,[2,37]),t(f,[2,38]),{37:[1,47]},{34:48,35:y},{15:[1,50]},t(f,[2,27]),t(g,[2,33]),{39:[1,51]},{34:52,35:y,39:[2,31]},{32:[2,15]},t(g,[2,34]),{39:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:o(function(_,T){if(T.recoverable)this.trace(_);else{var E=new Error(_);throw E.hash=T,E}},"parseError"),parse:o(function(_){var T=this,E=[0],L=[],S=[null],A=[],I=this.table,D="",k=0,R=0,C=0,O=2,N=1,P=A.slice.call(arguments,1),F=Object.create(this.lexer),B={yy:{}};for(var G in this.yy)Object.prototype.hasOwnProperty.call(this.yy,G)&&(B.yy[G]=this.yy[G]);F.setInput(_,B.yy),B.yy.lexer=F,B.yy.parser=this,typeof F.yylloc>"u"&&(F.yylloc={});var z=F.yylloc;A.push(z);var W=F.options&&F.options.ranges;typeof B.yy.parseError=="function"?this.parseError=B.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Z(se){E.length=E.length-2*se,S.length=S.length-se,A.length=A.length-se}o(Z,"popStack");function j(){var se;return se=L.pop()||F.lex()||N,typeof se!="number"&&(se instanceof Array&&(L=se,se=L.pop()),se=T.symbols_[se]||se),se}o(j,"lex");for(var oe,K,ee,J,H,q,Q={},ae,ue,ce,te;;){if(ee=E[E.length-1],this.defaultActions[ee]?J=this.defaultActions[ee]:((oe===null||typeof oe>"u")&&(oe=j()),J=I[ee]&&I[ee][oe]),typeof J>"u"||!J.length||!J[0]){var Ne="";te=[];for(ae in I[ee])this.terminals_[ae]&&ae>O&&te.push("'"+this.terminals_[ae]+"'");F.showPosition?Ne="Parse error on line "+(k+1)+`: +`+F.showPosition()+` +Expecting `+te.join(", ")+", got '"+(this.terminals_[oe]||oe)+"'":Ne="Parse error on line "+(k+1)+": Unexpected "+(oe==N?"end of input":"'"+(this.terminals_[oe]||oe)+"'"),this.parseError(Ne,{text:F.match,token:this.terminals_[oe]||oe,line:F.yylineno,loc:z,expected:te})}if(J[0]instanceof Array&&J.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ee+", token: "+oe);switch(J[0]){case 1:E.push(oe),S.push(F.yytext),A.push(F.yylloc),E.push(J[1]),oe=null,K?(oe=K,K=null):(R=F.yyleng,D=F.yytext,k=F.yylineno,z=F.yylloc,C>0&&C--);break;case 2:if(ue=this.productions_[J[1]][1],Q.$=S[S.length-ue],Q._$={first_line:A[A.length-(ue||1)].first_line,last_line:A[A.length-1].last_line,first_column:A[A.length-(ue||1)].first_column,last_column:A[A.length-1].last_column},W&&(Q._$.range=[A[A.length-(ue||1)].range[0],A[A.length-1].range[1]]),q=this.performAction.apply(Q,[D,R,k,B.yy,J[1],S,A].concat(P)),typeof q<"u")return q;ue&&(E=E.slice(0,-1*ue*2),S=S.slice(0,-1*ue),A=A.slice(0,-1*ue)),E.push(this.productions_[J[1]][0]),S.push(Q.$),A.push(Q._$),ce=I[E[E.length-2]][E[E.length-1]],E.push(ce);break;case 3:return!0}}return!0},"parse")},x=function(){var w={EOF:1,parseError:o(function(T,E){if(this.yy.parser)this.yy.parser.parseError(T,E);else throw new Error(T)},"parseError"),setInput:o(function(_,T){return this.yy=T||this.yy||{},this._input=_,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var _=this._input[0];this.yytext+=_,this.yyleng++,this.offset++,this.match+=_,this.matched+=_;var T=_.match(/(?:\r\n?|\n).*/g);return T?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),_},"input"),unput:o(function(_){var T=_.length,E=_.split(/(?:\r\n?|\n)/g);this._input=_+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-T),this.offset-=T;var L=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),E.length-1&&(this.yylineno-=E.length-1);var S=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:E?(E.length===L.length?this.yylloc.first_column:0)+L[L.length-E.length].length-E[0].length:this.yylloc.first_column-T},this.options.ranges&&(this.yylloc.range=[S[0],S[0]+this.yyleng-T]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(_){this.unput(this.match.slice(_))},"less"),pastInput:o(function(){var _=this.matched.substr(0,this.matched.length-this.match.length);return(_.length>20?"...":"")+_.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var _=this.match;return _.length<20&&(_+=this._input.substr(0,20-_.length)),(_.substr(0,20)+(_.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var _=this.pastInput(),T=new Array(_.length+1).join("-");return _+this.upcomingInput()+` +`+T+"^"},"showPosition"),test_match:o(function(_,T){var E,L,S;if(this.options.backtrack_lexer&&(S={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(S.yylloc.range=this.yylloc.range.slice(0))),L=_[0].match(/(?:\r\n?|\n).*/g),L&&(this.yylineno+=L.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:L?L[L.length-1].length-L[L.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+_[0].length},this.yytext+=_[0],this.match+=_[0],this.matches=_,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(_[0].length),this.matched+=_[0],E=this.performAction.call(this,this.yy,this,T,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),E)return E;if(this._backtrack){for(var A in S)this[A]=S[A];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var _,T,E,L;this._more||(this.yytext="",this.match="");for(var S=this._currentRules(),A=0;AT[0].length)){if(T=E,L=A,this.options.backtrack_lexer){if(_=this.test_match(E,S[A]),_!==!1)return _;if(this._backtrack){T=!1;continue}else return!1}else if(!this.options.flex)break}return T?(_=this.test_match(T,S[L]),_!==!1?_:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var T=this.next();return T||this.lex()},"lex"),begin:o(function(T){this.conditionStack.push(T)},"begin"),popState:o(function(){var T=this.conditionStack.length-1;return T>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(T){return T=this.conditionStack.length-1-Math.abs(T||0),T>=0?this.conditionStack[T]:"INITIAL"},"topState"),pushState:o(function(T){this.begin(T)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(T,E,L,S){var A=S;switch(L){case 0:return 10;case 1:return T.getLogger().debug("Found space-block"),31;break;case 2:return T.getLogger().debug("Found nl-block"),31;break;case 3:return T.getLogger().debug("Found space-block"),29;break;case 4:T.getLogger().debug(".",E.yytext);break;case 5:T.getLogger().debug("_",E.yytext);break;case 6:return 5;case 7:return E.yytext=-1,28;break;case 8:return E.yytext=E.yytext.replace(/columns\s+/,""),T.getLogger().debug("COLUMNS (LEX)",E.yytext),28;break;case 9:this.pushState("md_string");break;case 10:return"MD_STR";case 11:this.popState();break;case 12:this.pushState("string");break;case 13:T.getLogger().debug("LEX: POPPING STR:",E.yytext),this.popState();break;case 14:return T.getLogger().debug("LEX: STR end:",E.yytext),"STR";break;case 15:return E.yytext=E.yytext.replace(/space\:/,""),T.getLogger().debug("SPACE NUM (LEX)",E.yytext),21;break;case 16:return E.yytext="1",T.getLogger().debug("COLUMNS (LEX)",E.yytext),21;break;case 17:return 43;case 18:return"LINKSTYLE";case 19:return"INTERPOLATE";case 20:return this.pushState("CLASSDEF"),40;break;case 21:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 22:return this.popState(),this.pushState("CLASSDEFID"),41;break;case 23:return this.popState(),42;break;case 24:return this.pushState("CLASS"),44;break;case 25:return this.popState(),this.pushState("CLASS_STYLE"),45;break;case 26:return this.popState(),46;break;case 27:return this.pushState("STYLE_STMNT"),47;break;case 28:return this.popState(),this.pushState("STYLE_DEFINITION"),48;break;case 29:return this.popState(),49;break;case 30:return this.pushState("acc_title"),"acc_title";break;case 31:return this.popState(),"acc_title_value";break;case 32:return this.pushState("acc_descr"),"acc_descr";break;case 33:return this.popState(),"acc_descr_value";break;case 34:this.pushState("acc_descr_multiline");break;case 35:this.popState();break;case 36:return"acc_descr_multiline_value";case 37:return 30;case 38:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 40:return this.popState(),T.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 41:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 43:return this.popState(),T.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 44:return this.popState(),T.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 45:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 46:return this.popState(),T.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 47:return this.popState(),T.getLogger().debug("Lex: ("),"NODE_DEND";break;case 48:return this.popState(),T.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 49:return this.popState(),T.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),T.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 51:return this.popState(),T.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 52:return this.popState(),T.getLogger().debug("Lex: )"),"NODE_DEND";break;case 53:return this.popState(),T.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 54:return this.popState(),T.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 55:return T.getLogger().debug("Lexa: -)"),this.pushState("NODE"),36;break;case 56:return T.getLogger().debug("Lexa: (-"),this.pushState("NODE"),36;break;case 57:return T.getLogger().debug("Lexa: ))"),this.pushState("NODE"),36;break;case 58:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 59:return T.getLogger().debug("Lex: ((("),this.pushState("NODE"),36;break;case 60:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 61:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 62:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 63:return T.getLogger().debug("Lexc: >"),this.pushState("NODE"),36;break;case 64:return T.getLogger().debug("Lexa: (["),this.pushState("NODE"),36;break;case 65:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 66:return this.pushState("NODE"),36;break;case 67:return this.pushState("NODE"),36;break;case 68:return this.pushState("NODE"),36;break;case 69:return this.pushState("NODE"),36;break;case 70:return this.pushState("NODE"),36;break;case 71:return this.pushState("NODE"),36;break;case 72:return this.pushState("NODE"),36;break;case 73:return T.getLogger().debug("Lexa: ["),this.pushState("NODE"),36;break;case 74:return this.pushState("BLOCK_ARROW"),T.getLogger().debug("LEX ARR START"),38;break;case 75:return T.getLogger().debug("Lex: NODE_ID",E.yytext),32;break;case 76:return T.getLogger().debug("Lex: EOF",E.yytext),8;break;case 77:this.pushState("md_string");break;case 78:this.pushState("md_string");break;case 79:return"NODE_DESCR";case 80:this.popState();break;case 81:T.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 82:T.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 83:return T.getLogger().debug("LEX: NODE_DESCR:",E.yytext),"NODE_DESCR";break;case 84:T.getLogger().debug("LEX POPPING"),this.popState();break;case 85:T.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 86:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (right): dir:",E.yytext),"DIR";break;case 87:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (left):",E.yytext),"DIR";break;case 88:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (x):",E.yytext),"DIR";break;case 89:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (y):",E.yytext),"DIR";break;case 90:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (up):",E.yytext),"DIR";break;case 91:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (down):",E.yytext),"DIR";break;case 92:return E.yytext="]>",T.getLogger().debug("Lex (ARROW_DIR end):",E.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 93:return T.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 94:return T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 95:return T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 96:return T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 97:return T.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 98:return T.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 99:return T.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 100:this.pushState("md_string");break;case 101:return T.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 102:return this.popState(),T.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 103:return this.popState(),T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 104:return this.popState(),T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 105:return T.getLogger().debug("Lex: COLON",E.yytext),E.yytext=E.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block\s+)/,/^(?:block\n+)/,/^(?:block:)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[29],inclusive:!1},STYLE_STMNT:{rules:[28],inclusive:!1},CLASSDEFID:{rules:[23],inclusive:!1},CLASSDEF:{rules:[21,22],inclusive:!1},CLASS_STYLE:{rules:[26],inclusive:!1},CLASS:{rules:[25],inclusive:!1},LLABEL:{rules:[100,101,102,103,104],inclusive:!1},ARROW_DIR:{rules:[86,87,88,89,90,91,92],inclusive:!1},BLOCK_ARROW:{rules:[77,82,85],inclusive:!1},NODE:{rules:[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,78,81],inclusive:!1},md_string:{rules:[10,11,79,80],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[13,14,83,84],inclusive:!1},acc_descr_multiline:{rules:[35,36],inclusive:!1},acc_descr:{rules:[33],inclusive:!1},acc_title:{rules:[31],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,12,15,16,17,18,19,20,24,27,30,32,34,37,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,93,94,95,96,97,98,99,105],inclusive:!0}}};return w}();v.lexer=x;function b(){this.yy={}}return o(b,"Parser"),b.prototype=v,v.Parser=b,new b}();QB.parser=QB;Wye=QB});function Crt(t){switch(Y.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return Y.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function Art(t){switch(Y.debug("typeStr2Type",t),t){case"==":return"thick";default:return"normal"}}function _rt(t){switch(t.trim()){case"--x":return"arrow_cross";case"--o":return"arrow_circle";default:return"arrow_point"}}var Jl,JB,ZB,qye,Xye,xrt,Kye,brt,lS,wrt,Trt,krt,Ert,Qye,eF,Lb,Srt,jye,Lrt,Drt,Nrt,Rrt,Mrt,Irt,Ort,Prt,Brt,Frt,zrt,Zye,Jye=M(()=>{"use strict";AL();Za();Vt();ut();fr();Ai();Jl=new Map,JB=[],ZB=new Map,qye="color",Xye="fill",xrt="bgFill",Kye=",",brt=pe(),lS=new Map,wrt=o(t=>qe.sanitizeText(t,brt),"sanitizeText"),Trt=o(function(t,e=""){let r=lS.get(t);r||(r={id:t,styles:[],textStyles:[]},lS.set(t,r)),e?.split(Kye).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(qye).exec(n)){let s=i.replace(Xye,xrt).replace(qye,Xye);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),krt=o(function(t,e=""){let r=Jl.get(t);e!=null&&(r.styles=e.split(Kye))},"addStyle2Node"),Ert=o(function(t,e){t.split(",").forEach(function(r){let n=Jl.get(r);if(n===void 0){let i=r.trim();n={id:i,type:"na",children:[]},Jl.set(i,n)}n.classes||(n.classes=[]),n.classes.push(e)})},"setCssClass"),Qye=o((t,e)=>{let r=t.flat(),n=[];for(let i of r){if(i.label&&(i.label=wrt(i.label)),i.type==="classDef"){Trt(i.id,i.css);continue}if(i.type==="applyClass"){Ert(i.id,i?.styleClass??"");continue}if(i.type==="applyStyles"){i?.stylesStr&&krt(i.id,i?.stylesStr);continue}if(i.type==="column-setting")e.columns=i.columns??-1;else if(i.type==="edge"){let a=(ZB.get(i.id)??0)+1;ZB.set(i.id,a),i.id=a+"-"+i.id,JB.push(i)}else{i.label||(i.type==="composite"?i.label="":i.label=i.id);let a=Jl.get(i.id);if(a===void 0?Jl.set(i.id,i):(i.type!=="na"&&(a.type=i.type),i.label!==i.id&&(a.label=i.label)),i.children&&Qye(i.children,i),i.type==="space"){let s=i.width??1;for(let l=0;l{Y.debug("Clear called"),Lr(),Lb={id:"root",type:"composite",children:[],columns:-1},Jl=new Map([["root",Lb]]),eF=[],lS=new Map,JB=[],ZB=new Map},"clear");o(Crt,"typeStr2Type");o(Art,"edgeTypeStr2Type");o(_rt,"edgeStrToEdgeData");jye=0,Lrt=o(()=>(jye++,"id-"+Math.random().toString(36).substr(2,12)+"-"+jye),"generateId"),Drt=o(t=>{Lb.children=t,Qye(t,Lb),eF=Lb.children},"setHierarchy"),Nrt=o(t=>{let e=Jl.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),Rrt=o(()=>[...Jl.values()],"getBlocksFlat"),Mrt=o(()=>eF||[],"getBlocks"),Irt=o(()=>JB,"getEdges"),Ort=o(t=>Jl.get(t),"getBlock"),Prt=o(t=>{Jl.set(t.id,t)},"setBlock"),Brt=o(()=>console,"getLogger"),Frt=o(function(){return lS},"getClasses"),zrt={getConfig:o(()=>Cr().block,"getConfig"),typeStr2Type:Crt,edgeTypeStr2Type:Art,edgeStrToEdgeData:_rt,getLogger:Brt,getBlocksFlat:Rrt,getBlocks:Mrt,getEdges:Irt,setHierarchy:Drt,getBlock:Ort,setBlock:Prt,getColumns:Nrt,getClasses:Frt,clear:Srt,generateId:Lrt},Zye=zrt});var cS,Grt,eve,tve=M(()=>{"use strict";Lo();cS=o((t,e)=>{let r=ay,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Zs(n,i,a,e)},"fade"),Grt=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span,p { + color: ${t.titleColor}; + } + + + + .label text,span,p { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${cS(t.edgeLabelBackground,.5)}; + // background-color: + } + + .node .cluster { + // fill: ${cS(t.mainBkg,.5)}; + fill: ${cS(t.clusterBkg,.5)}; + stroke: ${cS(t.clusterBorder,.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span,p { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } +`,"getStyles"),eve=Grt});var $rt,Vrt,Urt,Hrt,Wrt,Yrt,qrt,Xrt,jrt,Krt,Qrt,rve,nve=M(()=>{"use strict";ut();$rt=o((t,e,r,n)=>{e.forEach(i=>{Qrt[i](t,r,n)})},"insertMarkers"),Vrt=o((t,e,r)=>{Y.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),Urt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),Hrt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),Wrt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),Yrt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),qrt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Xrt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),jrt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Krt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),Qrt={extension:Vrt,composition:Urt,aggregation:Hrt,dependency:Wrt,lollipop:Yrt,point:qrt,circle:Xrt,cross:jrt,barb:Krt},rve=$rt});function Zrt(t,e){if(t===0||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(t===1)return{px:0,py:e};let r=e%t,n=Math.floor(e/t);return{px:r,py:n}}function tF(t,e,r=0,n=0){Y.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"sieblingWidth",r),t?.size?.width||(t.size={width:r,height:n,x:0,y:0});let i=0,a=0;if(t.children?.length>0){for(let m of t.children)tF(m,e);let s=Jrt(t);i=s.width,a=s.height,Y.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",i,a);for(let m of t.children)m.size&&(Y.debug(`abc95 Setting size of children of ${t.id} id=${m.id} ${i} ${a} ${JSON.stringify(m.size)}`),m.size.width=i*(m.widthInColumns??1)+Ti*((m.widthInColumns??1)-1),m.size.height=a,m.size.x=0,m.size.y=0,Y.debug(`abc95 updating size of ${t.id} children child:${m.id} maxWidth:${i} maxHeight:${a}`));for(let m of t.children)tF(m,e,i,a);let l=t.columns??-1,u=0;for(let m of t.children)u+=m.widthInColumns??1;let h=t.children.length;l>0&&l0?Math.min(t.children.length,l):t.children.length;if(m>0){let g=(d-m*Ti-Ti)/m;Y.debug("abc95 (growing to fit) width",t.id,d,t.size?.width,g);for(let y of t.children)y.size&&(y.size.width=g)}}t.size={width:d,height:p,x:0,y:0}}Y.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function ive(t,e){Y.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);let r=t.columns??-1;if(Y.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){let n=t?.children[0]?.size?.width??0,i=t.children.length*n+(t.children.length-1)*Ti;Y.debug("widthOfChildren 88",i,"posX");let a=0;Y.debug("abc91 block?.size?.x",t.id,t?.size?.x);let s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-Ti,l=0;for(let u of t.children){let h=t;if(!u.size)continue;let{width:f,height:d}=u.size,{px:p,py:m}=Zrt(r,a);if(m!=l&&(l=m,s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-Ti,Y.debug("New row in layout for block",t.id," and child ",u.id,l)),Y.debug(`abc89 layout blocks (child) id: ${u.id} Pos: ${a} (px, py) ${p},${m} (${h?.size?.x},${h?.size?.y}) parent: ${h.id} width: ${f}${Ti}`),h.size){let g=f/2;u.size.x=s+Ti+g,Y.debug(`abc91 layout blocks (calc) px, pyid:${u.id} startingPos=X${s} new startingPosX${u.size.x} ${g} padding=${Ti} width=${f} halfWidth=${g} => x:${u.size.x} y:${u.size.y} ${u.widthInColumns} (width * (child?.w || 1)) / 2 ${f*(u?.widthInColumns??1)/2}`),s=u.size.x+g,u.size.y=h.size.y-h.size.height/2+m*(d+Ti)+d/2+Ti,Y.debug(`abc88 layout blocks (calc) px, pyid:${u.id}startingPosX${s}${Ti}${g}=>x:${u.size.x}y:${u.size.y}${u.widthInColumns}(width * (child?.w || 1)) / 2${f*(u?.widthInColumns??1)/2}`)}u.children&&ive(u,e),a+=u?.widthInColumns??1,Y.debug("abc88 columnsPos",u,a)}}Y.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function ave(t,{minX:e,minY:r,maxX:n,maxY:i}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&t.id!=="root"){let{x:a,y:s,width:l,height:u}=t.size;a-l/2n&&(n=a+l/2),s+u/2>i&&(i=s+u/2)}if(t.children)for(let a of t.children)({minX:e,minY:r,maxX:n,maxY:i}=ave(a,{minX:e,minY:r,maxX:n,maxY:i}));return{minX:e,minY:r,maxX:n,maxY:i}}function sve(t){let e=t.getBlock("root");if(!e)return;tF(e,t,0,0),ive(e,t),Y.debug("getBlocks",JSON.stringify(e,null,2));let{minX:r,minY:n,maxX:i,maxY:a}=ave(e),s=a-n,l=i-r;return{x:r,y:n,width:l,height:s}}var Ti,Jrt,ove=M(()=>{"use strict";ut();Vt();Ti=pe()?.block?.padding??8;o(Zrt,"calculateBlockPosition");Jrt=o(t=>{let e=0,r=0;for(let n of t.children){let{width:i,height:a,x:s,y:l}=n.size??{width:0,height:0,x:0,y:0};Y.debug("getMaxChildSize abc95 child:",n.id,"width:",i,"height:",a,"x:",s,"y:",l,n.type),n.type!=="space"&&(i>e&&(e=i/(t.widthInColumns??1)),a>r&&(r=a))}return{width:e,height:r}},"getMaxChildSize");o(tF,"setBlockSizes");o(ive,"layoutBlocks");o(ave,"findBounds");o(sve,"layout")});function lve(t,e){e&&t.attr("style",e)}function ent(t){let e=Ve(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=t.label,i=t.isNode?"nodeLabel":"edgeLabel",a=r.append("span");return a.html(n),lve(a,t.labelStyle),a.attr("class",i),lve(r,t.labelStyle),r.style("display","inline-block"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var tnt,gs,uS=M(()=>{"use strict";pr();ut();Vt();fr();hr();Pl();o(lve,"applyStyle");o(ent,"addHtmlLabel");tnt=o((t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),xr(pe().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),Y.debug("vertexText"+i);let a={isNode:n,label:w9(Ma(i)),labelStyle:e.replace("fill:","color:")};return ent(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),gs=tnt});var uve,rnt,cve,hve=M(()=>{"use strict";ut();uve=o((t,e,r,n,i)=>{e.arrowTypeStart&&cve(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&cve(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),rnt={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},cve=o((t,e,r,n,i,a)=>{let s=rnt[r];if(!s){Y.warn(`Unknown arrow type: ${r}`);return}let l=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${l})`)},"addEdgeMarker")});function hS(t,e){pe().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}var rF,Xa,dve,pve,nnt,int,fve,mve,gve=M(()=>{"use strict";ut();uS();Pl();pr();Vt();hr();fr();uL();$v();hve();rF={},Xa={},dve=o((t,e)=>{let r=pe(),n=xr(r.flowchart.htmlLabels),i=e.labelType==="markdown"?Li(t,e.label,{style:e.labelStyle,useHtmlLabels:n,addSvgBackground:!0},r):gs(e.label,e.labelStyle),a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label");s.node().appendChild(i);let l=i.getBBox();if(n){let h=i.children[0],f=Ve(i);l=h.getBoundingClientRect(),f.attr("width",l.width),f.attr("height",l.height)}s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),rF[e.id]=a,e.width=l.width,e.height=l.height;let u;if(e.startLabelLeft){let h=gs(e.startLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].startLeft=f,hS(u,e.startLabelLeft)}if(e.startLabelRight){let h=gs(e.startLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=f.node().appendChild(h),d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].startRight=f,hS(u,e.startLabelRight)}if(e.endLabelLeft){let h=gs(e.endLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].endLeft=f,hS(u,e.endLabelLeft)}if(e.endLabelRight){let h=gs(e.endLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].endRight=f,hS(u,e.endLabelRight)}return i},"insertEdgeLabel");o(hS,"setTerminalWidth");pve=o((t,e)=>{Y.debug("Moving label abc88 ",t.id,t.label,rF[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=pe(),{subGraphTitleTotalMargin:i}=Fu(n);if(t.label){let a=rF[t.id],s=t.x,l=t.y;if(r){let u=Ut.calcLabelPosition(r);Y.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=Xa[t.id].startLeft,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=Xa[t.id].startRight,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=Xa[t.id].endLeft,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=Xa[t.id].endRight,s=t.x,l=t.y;if(r){let u=Ut.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),nnt=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),int=o((t,e,r)=>{Y.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{Y.debug("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(!nnt(e,a)&&!i){let s=int(e,n,a),l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)||r.push(s),i=!0}else n=a,i||r.push(a)}),r},"cutPathAtIntersect"),mve=o(function(t,e,r,n,i,a,s){let l=r.points;Y.debug("abc88 InsertEdge: edge=",r,"e=",e);let u=!1,h=a.node(e.v);var f=a.node(e.w);f?.intersect&&h?.intersect&&(l=l.slice(1,r.points.length-1),l.unshift(h.intersect(l[0])),l.push(f.intersect(l[l.length-1]))),r.toCluster&&(Y.debug("to cluster abc88",n[r.toCluster]),l=fve(r.points,n[r.toCluster].node),u=!0),r.fromCluster&&(Y.debug("from cluster abc88",n[r.fromCluster]),l=fve(l.reverse(),n[r.fromCluster].node).reverse(),u=!0);let d=l.filter(_=>!Number.isNaN(_.y)),p=Po;r.curve&&(i==="graph"||i==="flowchart")&&(p=r.curve);let{x:m,y:g}=uw(r),y=ns().x(m).y(g).curve(p),v;switch(r.thickness){case"normal":v="edge-thickness-normal";break;case"thick":v="edge-thickness-thick";break;case"invisible":v="edge-thickness-thick";break;default:v=""}switch(r.pattern){case"solid":v+=" edge-pattern-solid";break;case"dotted":v+=" edge-pattern-dotted";break;case"dashed":v+=" edge-pattern-dashed";break}let x=t.append("path").attr("d",y(d)).attr("id",r.id).attr("class"," "+v+(r.classes?" "+r.classes:"")).attr("style",r.style),b="";(pe().flowchart.arrowMarkerAbsolute||pe().state.arrowMarkerAbsolute)&&(b=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,b=b.replace(/\(/g,"\\("),b=b.replace(/\)/g,"\\)")),uve(x,r,b,s,i);let w={};return u&&(w.updatedPath=l),w.originalPath=r.points,w},"insertEdge")});var ant,yve,vve=M(()=>{"use strict";ant=o(t=>{let e=new Set;for(let r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r);break}return e},"expandAndDeduplicateDirections"),yve=o((t,e,r)=>{let n=ant(t),i=2,a=e.height+2*r.padding,s=a/i,l=e.width+2*s+r.padding,u=r.padding/2;return n.has("right")&&n.has("left")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:s,y:0},{x:l/2,y:2*u},{x:l-s,y:0},{x:l,y:0},{x:l,y:-a/3},{x:l+2*u,y:-a/2},{x:l,y:-2*a/3},{x:l,y:-a},{x:l-s,y:-a},{x:l/2,y:-a-2*u},{x:s,y:-a},{x:0,y:-a},{x:0,y:-2*a/3},{x:-2*u,y:-a/2},{x:0,y:-a/3}]:n.has("right")&&n.has("left")&&n.has("up")?[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}]:n.has("right")&&n.has("left")&&n.has("down")?[{x:0,y:0},{x:s,y:-a},{x:l-s,y:-a},{x:l,y:0}]:n.has("right")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:l,y:-s},{x:l,y:-a+s},{x:0,y:-a}]:n.has("left")&&n.has("up")&&n.has("down")?[{x:l,y:0},{x:0,y:-s},{x:0,y:-a+s},{x:l,y:-a}]:n.has("right")&&n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")&&n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:n.has("right")&&n.has("up")?[{x:0,y:0},{x:l,y:-s},{x:0,y:-a}]:n.has("right")&&n.has("down")?[{x:0,y:0},{x:l,y:0},{x:0,y:-a}]:n.has("left")&&n.has("up")?[{x:l,y:0},{x:0,y:-s},{x:l,y:-a}]:n.has("left")&&n.has("down")?[{x:l,y:0},{x:0,y:0},{x:l,y:-a}]:n.has("right")?[{x:s,y:-u},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a+u}]:n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")?[{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u}]:n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:[{x:0,y:0}]},"getArrowPoints")});function snt(t,e){return t.intersect(e)}var xve,bve=M(()=>{"use strict";o(snt,"intersectNode");xve=snt});function ont(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(ont,"intersectEllipse");fS=ont});function lnt(t,e,r){return fS(t,e,e,r)}var wve,Tve=M(()=>{"use strict";nF();o(lnt,"intersectCircle");wve=lnt});function cnt(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&kve(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&kve(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function kve(t,e){return t*e>0}var Eve,Sve=M(()=>{"use strict";o(cnt,"intersectLine");o(kve,"sameSign");Eve=cnt});function unt(t,e,r){var n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(g){s=Math.min(s,g.x),l=Math.min(l,g.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));for(var u=n-t.width/2-s,h=i-t.height/2-l,f=0;f1&&a.sort(function(g,y){var v=g.x-r.x,x=g.y-r.y,b=Math.sqrt(v*v+x*x),w=y.x-r.x,_=y.y-r.y,T=Math.sqrt(w*w+_*_);return b{"use strict";Sve();Cve=unt;o(unt,"intersectPolygon")});var hnt,_ve,Lve=M(()=>{"use strict";hnt=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),_ve=hnt});var In,iF=M(()=>{"use strict";bve();Tve();nF();Ave();Lve();In={node:xve,circle:wve,ellipse:fS,polygon:Cve,rect:_ve}});function ec(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Ri,jn,aF=M(()=>{"use strict";uS();Pl();Vt();pr();fr();hr();Ri=o(async(t,e,r,n)=>{let i=pe(),a,s=e.useHtmlLabels||xr(i.flowchart.htmlLabels);r?a=r:a="node default";let l=t.insert("g").attr("class",a).attr("id",e.domId||e.id),u=l.insert("g").attr("class","label").attr("style",e.labelStyle),h;e.labelText===void 0?h="":h=typeof e.labelText=="string"?e.labelText:e.labelText[0];let f=u.node(),d;e.labelType==="markdown"?d=Li(u,kr(Ma(h),i),{useHtmlLabels:s,width:e.width||i.flowchart.wrappingWidth,classes:"markdown-node-label"},i):d=f.appendChild(gs(kr(Ma(h),i),e.labelStyle,!1,n));let p=d.getBBox(),m=e.padding/2;if(xr(i.flowchart.htmlLabels)){let g=d.children[0],y=Ve(d),v=g.getElementsByTagName("img");if(v){let x=h.replace(/]*>/g,"").trim()==="";await Promise.all([...v].map(b=>new Promise(w=>{function _(){if(b.style.display="flex",b.style.flexDirection="column",x){let T=i.fontSize?i.fontSize:window.getComputedStyle(document.body).fontSize,L=parseInt(T,10)*5+"px";b.style.minWidth=L,b.style.maxWidth=L}else b.style.width="100%";w(b)}o(_,"setupImage"),setTimeout(()=>{b.complete&&_()}),b.addEventListener("error",_),b.addEventListener("load",_)})))}p=g.getBoundingClientRect(),y.attr("width",p.width),y.attr("height",p.height)}return s?u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"):u.attr("transform","translate(0, "+-p.height/2+")"),e.centerLabel&&u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),u.insert("rect",":first-child"),{shapeSvg:l,bbox:p,halfPadding:m,label:u}},"labelHelper"),jn=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");o(ec,"insertPolygonShape")});var fnt,Dve,Nve=M(()=>{"use strict";aF();ut();Vt();iF();fnt=o(async(t,e)=>{e.useHtmlLabels||pe().flowchart.htmlLabels||(e.centerLabel=!0);let{shapeSvg:n,bbox:i,halfPadding:a}=await Ri(t,e,"node "+e.classes,!0);Y.info("Classes = ",e.classes);let s=n.insert("rect",":first-child");return s.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),jn(e,s),e.intersect=function(l){return In.rect(e,l)},n},"note"),Dve=fnt});function sF(t,e,r,n){let i=[],a=o(l=>{i.push(l,0)},"addBorder"),s=o(l=>{i.push(0,l)},"skipBorder");e.includes("t")?(Y.debug("add top border"),a(r)):s(r),e.includes("r")?(Y.debug("add right border"),a(n)):s(n),e.includes("b")?(Y.debug("add bottom border"),a(r)):s(r),e.includes("l")?(Y.debug("add left border"),a(n)):s(n),t.attr("stroke-dasharray",i.join(" "))}var Rve,ko,Mve,dnt,pnt,mnt,gnt,ynt,vnt,xnt,bnt,wnt,Tnt,knt,Ent,Snt,Cnt,Ant,_nt,Lnt,Dnt,Nnt,Ive,Rnt,Mnt,Ove,dS,oF,Pve,Bve=M(()=>{"use strict";pr();Vt();fr();ut();vve();uS();iF();Nve();aF();Rve=o(t=>t?" "+t:"","formatClass"),ko=o((t,e)=>`${e||"node default"}${Rve(t.classes)} ${Rve(t.class)}`,"getClassesFromNode"),Mve=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=i+a,l=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];Y.info("Question main (Circle)");let u=ec(r,s,s,l);return u.attr("style",e.style),jn(e,u),e.intersect=function(h){return Y.warn("Intersect called"),In.polygon(e,l,h)},r},"question"),dnt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=28,i=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return r.insert("polygon",":first-child").attr("points",i.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(s){return In.circle(e,14,s)},r},"choice"),pnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=4,a=n.height+e.padding,s=a/i,l=n.width+2*s+e.padding,u=[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}],h=ec(r,l,a,u);return h.attr("style",e.style),jn(e,h),e.intersect=function(f){return In.polygon(e,u,f)},r},"hexagon"),mnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,void 0,!0),i=2,a=n.height+2*e.padding,s=a/i,l=n.width+2*s+e.padding,u=yve(e.directions,n,e),h=ec(r,l,a,u);return h.attr("style",e.style),jn(e,h),e.intersect=function(f){return In.polygon(e,u,f)},r},"block_arrow"),gnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-a/2,y:0},{x:i,y:0},{x:i,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return ec(r,i,a,s).attr("style",e.style),e.width=i+a,e.height=a,e.intersect=function(u){return In.polygon(e,s,u)},r},"rect_left_inv_arrow"),ynt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:a/6,y:-a}],l=ec(r,i,a,s);return l.attr("style",e.style),jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"lean_right"),vnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:2*a/6,y:0},{x:i+a/6,y:0},{x:i-2*a/6,y:-a},{x:-a/6,y:-a}],l=ec(r,i,a,s);return l.attr("style",e.style),jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"lean_left"),xnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i+2*a/6,y:0},{x:i-a/6,y:-a},{x:a/6,y:-a}],l=ec(r,i,a,s);return l.attr("style",e.style),jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"trapezoid"),bnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:-2*a/6,y:-a}],l=ec(r,i,a,s);return l.attr("style",e.style),jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"inv_trapezoid"),wnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i+a/2,y:0},{x:i,y:-a/2},{x:i+a/2,y:-a},{x:0,y:-a}],l=ec(r,i,a,s);return l.attr("style",e.style),jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"rect_right_inv_arrow"),Tnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=i/2,s=a/(2.5+i/50),l=n.height+s+e.padding,u="M 0,"+s+" a "+a+","+s+" 0,0,0 "+i+" 0 a "+a+","+s+" 0,0,0 "+-i+" 0 l 0,"+l+" a "+a+","+s+" 0,0,0 "+i+" 0 l 0,"+-l,h=r.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",u).attr("transform","translate("+-i/2+","+-(l/2+s)+")");return jn(e,h),e.intersect=function(f){let d=In.rect(e,f),p=d.x-e.x;if(a!=0&&(Math.abs(p)e.height/2-s)){let m=s*s*(1-p*p/(a*a));m!=0&&(m=Math.sqrt(m)),m=s-m,f.y-e.y>0&&(m=-m),d.y+=m}return d},r},"cylinder"),knt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ri(t,e,"node "+e.classes+" "+e.class,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(sF(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{Y.warn(`Unknown node property ${d}`)})}return jn(e,a),e.intersect=function(f){return In.rect(e,f)},r},"rect"),Ent=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ri(t,e,"node "+e.classes,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(sF(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{Y.warn(`Unknown node property ${d}`)})}return jn(e,a),e.intersect=function(f){return In.rect(e,f)},r},"composite"),Snt=o(async(t,e)=>{let{shapeSvg:r}=await Ri(t,e,"label",!0);Y.trace("Classes = ",e.class);let n=r.insert("rect",":first-child"),i=0,a=0;if(n.attr("width",i).attr("height",a),r.attr("class","label edgeLabel"),e.props){let s=new Set(Object.keys(e.props));e.props.borders&&(sF(n,e.props.borders,i,a),s.delete("borders")),s.forEach(l=>{Y.warn(`Unknown node property ${l}`)})}return jn(e,n),e.intersect=function(s){return In.rect(e,s)},r},"labelRect");o(sF,"applyNodePropertyBorders");Cnt=o((t,e)=>{let r;e.classes?r="node "+e.classes:r="node default";let n=t.insert("g").attr("class",r).attr("id",e.domId||e.id),i=n.insert("rect",":first-child"),a=n.insert("line"),s=n.insert("g").attr("class","label"),l=e.labelText.flat?e.labelText.flat():e.labelText,u="";typeof l=="object"?u=l[0]:u=l,Y.info("Label text abc79",u,l,typeof l=="object");let h=s.node().appendChild(gs(u,e.labelStyle,!0,!0)),f={width:0,height:0};if(xr(pe().flowchart.htmlLabels)){let y=h.children[0],v=Ve(h);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}Y.info("Text 2",l);let d=l.slice(1,l.length),p=h.getBBox(),m=s.node().appendChild(gs(d.join?d.join("
    "):d,e.labelStyle,!0,!0));if(xr(pe().flowchart.htmlLabels)){let y=m.children[0],v=Ve(m);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}let g=e.padding/2;return Ve(m).attr("transform","translate( "+(f.width>p.width?0:(p.width-f.width)/2)+", "+(p.height+g+5)+")"),Ve(h).attr("transform","translate( "+(f.width{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.height+e.padding,a=n.width+i/4+e.padding,s=r.insert("rect",":first-child").attr("style",e.style).attr("rx",i/2).attr("ry",i/2).attr("x",-a/2).attr("y",-i/2).attr("width",a).attr("height",i);return jn(e,s),e.intersect=function(l){return In.rect(e,l)},r},"stadium"),_nt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ri(t,e,ko(e,void 0),!0),a=r.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),Y.info("Circle main"),jn(e,a),e.intersect=function(s){return Y.info("Circle intersect",e,n.width/2+i,s),In.circle(e,n.width/2+i,s)},r},"circle"),Lnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ri(t,e,ko(e,void 0),!0),a=5,s=r.insert("g",":first-child"),l=s.insert("circle"),u=s.insert("circle");return s.attr("class",e.class),l.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i+a).attr("width",n.width+e.padding+a*2).attr("height",n.height+e.padding+a*2),u.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),Y.info("DoubleCircle main"),jn(e,l),e.intersect=function(h){return Y.info("DoubleCircle intersect",e,n.width/2+i+a,h),In.circle(e,n.width/2+i+a,h)},r},"doublecircle"),Dnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ri(t,e,ko(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i,y:0},{x:i,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:i+8,y:0},{x:i+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],l=ec(r,i,a,s);return l.attr("style",e.style),jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"subroutine"),Nnt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),jn(e,n),e.intersect=function(i){return In.circle(e,7,i)},r},"start"),Ive=o((t,e,r)=>{let n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;r==="LR"&&(i=10,a=70);let s=n.append("rect").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return jn(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(l){return In.rect(e,l)},n},"forkJoin"),Rnt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child"),i=r.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),jn(e,i),e.intersect=function(a){return In.circle(e,7,a)},r},"end"),Mnt=o((t,e)=>{let r=e.padding/2,n=4,i=8,a;e.classes?a="node "+e.classes:a="node default";let s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),l=s.insert("rect",":first-child"),u=s.insert("line"),h=s.insert("line"),f=0,d=n,p=s.insert("g").attr("class","label"),m=0,g=e.classData.annotations?.[0],y=e.classData.annotations[0]?"\xAB"+e.classData.annotations[0]+"\xBB":"",v=p.node().appendChild(gs(y,e.labelStyle,!0,!0)),x=v.getBBox();if(xr(pe().flowchart.htmlLabels)){let S=v.children[0],A=Ve(v);x=S.getBoundingClientRect(),A.attr("width",x.width),A.attr("height",x.height)}e.classData.annotations[0]&&(d+=x.height+n,f+=x.width);let b=e.classData.label;e.classData.type!==void 0&&e.classData.type!==""&&(pe().flowchart.htmlLabels?b+="<"+e.classData.type+">":b+="<"+e.classData.type+">");let w=p.node().appendChild(gs(b,e.labelStyle,!0,!0));Ve(w).attr("class","classTitle");let _=w.getBBox();if(xr(pe().flowchart.htmlLabels)){let S=w.children[0],A=Ve(w);_=S.getBoundingClientRect(),A.attr("width",_.width),A.attr("height",_.height)}d+=_.height+n,_.width>f&&(f=_.width);let T=[];e.classData.members.forEach(S=>{let A=S.getDisplayDetails(),I=A.displayText;pe().flowchart.htmlLabels&&(I=I.replace(//g,">"));let D=p.node().appendChild(gs(I,A.cssStyle?A.cssStyle:e.labelStyle,!0,!0)),k=D.getBBox();if(xr(pe().flowchart.htmlLabels)){let R=D.children[0],C=Ve(D);k=R.getBoundingClientRect(),C.attr("width",k.width),C.attr("height",k.height)}k.width>f&&(f=k.width),d+=k.height+n,T.push(D)}),d+=i;let E=[];if(e.classData.methods.forEach(S=>{let A=S.getDisplayDetails(),I=A.displayText;pe().flowchart.htmlLabels&&(I=I.replace(//g,">"));let D=p.node().appendChild(gs(I,A.cssStyle?A.cssStyle:e.labelStyle,!0,!0)),k=D.getBBox();if(xr(pe().flowchart.htmlLabels)){let R=D.children[0],C=Ve(D);k=R.getBoundingClientRect(),C.attr("width",k.width),C.attr("height",k.height)}k.width>f&&(f=k.width),d+=k.height+n,E.push(D)}),d+=i,g){let S=(f-x.width)/2;Ve(v).attr("transform","translate( "+(-1*f/2+S)+", "+-1*d/2+")"),m=x.height+n}let L=(f-_.width)/2;return Ve(w).attr("transform","translate( "+(-1*f/2+L)+", "+(-1*d/2+m)+")"),m+=_.height+n,u.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,T.forEach(S=>{Ve(S).attr("transform","translate( "+-f/2+", "+(-1*d/2+m+i/2)+")");let A=S?.getBBox();m+=(A?.height??0)+n}),m+=i,h.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,E.forEach(S=>{Ve(S).attr("transform","translate( "+-f/2+", "+(-1*d/2+m)+")");let A=S?.getBBox();m+=(A?.height??0)+n}),l.attr("style",e.style).attr("class","outer title-state").attr("x",-f/2-r).attr("y",-(d/2)-r).attr("width",f+e.padding).attr("height",d+e.padding),jn(e,l),e.intersect=function(S){return In.rect(e,S)},s},"class_box"),Ove={rhombus:Mve,composite:Ent,question:Mve,rect:knt,labelRect:Snt,rectWithTitle:Cnt,choice:dnt,circle:_nt,doublecircle:Lnt,stadium:Ant,hexagon:pnt,block_arrow:mnt,rect_left_inv_arrow:gnt,lean_right:ynt,lean_left:vnt,trapezoid:xnt,inv_trapezoid:bnt,rect_right_inv_arrow:wnt,cylinder:Tnt,start:Nnt,end:Rnt,note:Dve,subroutine:Dnt,fork:Ive,join:Ive,class_box:Mnt},dS={},oF=o(async(t,e,r)=>{let n,i;if(e.link){let a;pe().securityLevel==="sandbox"?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),i=await Ove[e.shape](n,e,r)}else i=await Ove[e.shape](t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),dS[e.id]=n,e.haveCallback&&dS[e.id].attr("class",dS[e.id].attr("class")+" clickable"),n},"insertNode"),Pve=o(t=>{let e=dS[t.id];Y.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});function Fve(t,e,r=!1){let n=t,i="default";(n?.classes?.length||0)>0&&(i=(n?.classes??[]).join(" ")),i=i+" flowchart-label";let a=0,s="",l;switch(n.type){case"round":a=5,s="rect";break;case"composite":a=0,s="composite",l=0;break;case"square":s="rect";break;case"diamond":s="question";break;case"hexagon":s="hexagon";break;case"block_arrow":s="block_arrow";break;case"odd":s="rect_left_inv_arrow";break;case"lean_right":s="lean_right";break;case"lean_left":s="lean_left";break;case"trapezoid":s="trapezoid";break;case"inv_trapezoid":s="inv_trapezoid";break;case"rect_left_inv_arrow":s="rect_left_inv_arrow";break;case"circle":s="circle";break;case"ellipse":s="ellipse";break;case"stadium":s="stadium";break;case"subroutine":s="subroutine";break;case"cylinder":s="cylinder";break;case"group":s="rect";break;case"doublecircle":s="doublecircle";break;default:s="rect"}let u=t9(n?.styles??[]),h=n.label,f=n.size??{width:0,height:0,x:0,y:0};return{labelStyle:u.labelStyle,shape:s,labelText:h,rx:a,ry:a,class:i,style:u.style,id:n.id,directions:n.directions,width:f.width,height:f.height,x:f.x,y:f.y,positioned:r,intersect:void 0,type:n.type,padding:l??Cr()?.block?.padding??0}}async function Int(t,e,r){let n=Fve(e,r,!1);if(n.type==="group")return;let i=Cr(),a=await oF(t,n,{config:i}),s=a.node().getBBox(),l=r.getBlock(n.id);l.size={width:s.width,height:s.height,x:0,y:0,node:a},r.setBlock(l),a.remove()}async function Ont(t,e,r){let n=Fve(e,r,!0);if(r.getBlock(n.id).type!=="space"){let a=Cr();await oF(t,n,{config:a}),e.intersect=n?.intersect,Pve(n)}}async function lF(t,e,r,n){for(let i of e)await n(t,i,r),i.children&&await lF(t,i.children,r,n)}async function zve(t,e,r){await lF(t,e,r,Int)}async function Gve(t,e,r){await lF(t,e,r,Ont)}async function $ve(t,e,r,n,i){let a=new Ir({multigraph:!0,compound:!0});a.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let s of r)s.size&&a.setNode(s.id,{width:s.size.width,height:s.size.height,intersect:s.intersect});for(let s of e)if(s.start&&s.end){let l=n.getBlock(s.start),u=n.getBlock(s.end);if(l?.size&&u?.size){let h=l.size,f=u.size,d=[{x:h.x,y:h.y},{x:h.x+(f.x-h.x)/2,y:h.y+(f.y-h.y)/2},{x:f.x,y:f.y}];mve(t,{v:s.start,w:s.end,name:s.id},{...s,arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",a,i),s.label&&(await dve(t,{...s,label:s.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),pve({...s,x:d[1].x,y:d[1].y},{originalPath:d}))}}}var Vve=M(()=>{"use strict";Gs();Za();gve();Bve();hr();o(Fve,"getNodeFromBlock");o(Int,"calculateBlockSize");o(Ont,"insertBlockPositioned");o(lF,"performOperations");o(zve,"calculateBlockSizes");o(Gve,"insertBlocks");o($ve,"insertEdges")});var Pnt,Bnt,Uve,Hve=M(()=>{"use strict";pr();Za();nve();ut();ai();ove();Vve();Pnt=o(function(t,e){return e.db.getClasses()},"getClasses"),Bnt=o(async function(t,e,r,n){let{securityLevel:i,block:a}=Cr(),s=n.db,l;i==="sandbox"&&(l=Ve("#i"+e));let u=i==="sandbox"?Ve(l.nodes()[0].contentDocument.body):Ve("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):Ve(`[id="${e}"]`);rve(h,["point","circle","cross"],n.type,e);let d=s.getBlocks(),p=s.getBlocksFlat(),m=s.getEdges(),g=h.insert("g").attr("class","block");await zve(g,d,s);let y=sve(s);if(await Gve(g,d,s),await $ve(g,m,p,s,e),y){let v=y,x=Math.max(1,Math.round(.125*(v.width/v.height))),b=v.height+x+10,w=v.width+10,{useMaxWidth:_}=a;Zr(h,b,w,!!_),Y.debug("Here Bounds",y,v),h.attr("viewBox",`${v.x-5} ${v.y-5} ${v.width+10} ${v.height+10}`)}},"draw"),Uve={draw:Bnt,getClasses:Pnt}});var Wve={};vr(Wve,{diagram:()=>Fnt});var Fnt,Yve=M(()=>{"use strict";Yye();Jye();tve();Hve();Fnt={parser:Wye,db:Zye,renderer:Uve,styles:eve}});var cF,uF,Db,jve,hF,ys,nu,pS,Kve,Vnt,Nb,Qve,Zve,Jve,e2e,mS,Vf,gS=M(()=>{"use strict";cF={L:"left",R:"right",T:"top",B:"bottom"},uF={L:o(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:o(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:o(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:o(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},Db={L:o((t,e)=>t-e+2,"L"),R:o((t,e)=>t-2,"R"),T:o((t,e)=>t-e+2,"T"),B:o((t,e)=>t-2,"B")},jve=o(function(t){return ys(t)?t==="L"?"R":"L":t==="T"?"B":"T"},"getOppositeArchitectureDirection"),hF=o(function(t){let e=t;return e==="L"||e==="R"||e==="T"||e==="B"},"isArchitectureDirection"),ys=o(function(t){let e=t;return e==="L"||e==="R"},"isArchitectureDirectionX"),nu=o(function(t){let e=t;return e==="T"||e==="B"},"isArchitectureDirectionY"),pS=o(function(t,e){let r=ys(t)&&nu(e),n=nu(t)&&ys(e);return r||n},"isArchitectureDirectionXY"),Kve=o(function(t){let e=t[0],r=t[1],n=ys(e)&&nu(r),i=nu(e)&&ys(r);return n||i},"isArchitecturePairXY"),Vnt=o(function(t){return t!=="LL"&&t!=="RR"&&t!=="TT"&&t!=="BB"},"isValidArchitectureDirectionPair"),Nb=o(function(t,e){let r=`${t}${e}`;return Vnt(r)?r:void 0},"getArchitectureDirectionPair"),Qve=o(function([t,e],r){let n=r[0],i=r[1];return ys(n)?nu(i)?[t+(n==="L"?-1:1),e+(i==="T"?1:-1)]:[t+(n==="L"?-1:1),e]:ys(i)?[t+(i==="L"?1:-1),e+(n==="T"?1:-1)]:[t,e+(n==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),Zve=o(function(t){return t==="LT"||t==="TL"?[1,1]:t==="BL"||t==="LB"?[1,-1]:t==="BR"||t==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),Jve=o(function(t){return t.type==="service"},"isArchitectureService"),e2e=o(function(t){return t.type==="junction"},"isArchitectureJunction"),mS=o(t=>t.data(),"edgeData"),Vf=o(t=>t.data(),"nodeData")});function Mi(t){let e=pe().architecture;return e?.[t]?e[t]:t2e[t]}var t2e,mr,Unt,Hnt,Wnt,Ynt,qnt,Xnt,jnt,Knt,Qnt,Znt,Jnt,eit,tit,rit,ip,Rb=M(()=>{"use strict";bs();Vt();dE();Ai();gS();t2e=ur.architecture,mr=new vf(()=>({nodes:{},groups:{},edges:[],registeredIds:{},config:t2e,dataStructures:void 0,elements:{}})),Unt=o(()=>{mr.reset(),Lr()},"clear"),Hnt=o(function({id:t,icon:e,in:r,title:n,iconText:i}){if(mr.records.registeredIds[t]!==void 0)throw new Error(`The service id [${t}] is already in use by another ${mr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The service [${t}] cannot be placed within itself`);if(mr.records.registeredIds[r]===void 0)throw new Error(`The service [${t}]'s parent does not exist. Please make sure the parent is created before this service`);if(mr.records.registeredIds[r]==="node")throw new Error(`The service [${t}]'s parent is not a group`)}mr.records.registeredIds[t]="node",mr.records.nodes[t]={id:t,type:"service",icon:e,iconText:i,title:n,edges:[],in:r}},"addService"),Wnt=o(()=>Object.values(mr.records.nodes).filter(Jve),"getServices"),Ynt=o(function({id:t,in:e}){mr.records.registeredIds[t]="node",mr.records.nodes[t]={id:t,type:"junction",edges:[],in:e}},"addJunction"),qnt=o(()=>Object.values(mr.records.nodes).filter(e2e),"getJunctions"),Xnt=o(()=>Object.values(mr.records.nodes),"getNodes"),jnt=o(t=>mr.records.nodes[t],"getNode"),Knt=o(function({id:t,icon:e,in:r,title:n}){if(mr.records.registeredIds[t]!==void 0)throw new Error(`The group id [${t}] is already in use by another ${mr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The group [${t}] cannot be placed within itself`);if(mr.records.registeredIds[r]===void 0)throw new Error(`The group [${t}]'s parent does not exist. Please make sure the parent is created before this group`);if(mr.records.registeredIds[r]==="node")throw new Error(`The group [${t}]'s parent is not a group`)}mr.records.registeredIds[t]="group",mr.records.groups[t]={id:t,icon:e,title:n,in:r}},"addGroup"),Qnt=o(()=>Object.values(mr.records.groups),"getGroups"),Znt=o(function({lhsId:t,rhsId:e,lhsDir:r,rhsDir:n,lhsInto:i,rhsInto:a,lhsGroup:s,rhsGroup:l,title:u}){if(!hF(r))throw new Error(`Invalid direction given for left hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${r}`);if(!hF(n))throw new Error(`Invalid direction given for right hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${n}`);if(mr.records.nodes[t]===void 0&&mr.records.groups[t]===void 0)throw new Error(`The left-hand id [${t}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(mr.records.nodes[e]===void 0&&mr.records.groups[t]===void 0)throw new Error(`The right-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);let h=mr.records.nodes[t].in,f=mr.records.nodes[e].in;if(s&&h&&f&&h==f)throw new Error(`The left-hand id [${t}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(l&&h&&f&&h==f)throw new Error(`The right-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let d={lhsId:t,lhsDir:r,lhsInto:i,lhsGroup:s,rhsId:e,rhsDir:n,rhsInto:a,rhsGroup:l,title:u};mr.records.edges.push(d),mr.records.nodes[t]&&mr.records.nodes[e]&&(mr.records.nodes[t].edges.push(mr.records.edges[mr.records.edges.length-1]),mr.records.nodes[e].edges.push(mr.records.edges[mr.records.edges.length-1]))},"addEdge"),Jnt=o(()=>mr.records.edges,"getEdges"),eit=o(()=>{if(mr.records.dataStructures===void 0){let t=Object.entries(mr.records.nodes).reduce((s,[l,u])=>(s[l]=u.edges.reduce((h,f)=>{if(f.lhsId===l){let d=Nb(f.lhsDir,f.rhsDir);d&&(h[d]=f.rhsId)}else{let d=Nb(f.rhsDir,f.lhsDir);d&&(h[d]=f.lhsId)}return h},{}),s),{}),e=Object.keys(t)[0],r={[e]:1},n=Object.keys(t).reduce((s,l)=>l===e?s:{...s,[l]:1},{}),i=o(s=>{let l={[s]:[0,0]},u=[s];for(;u.length>0;){let h=u.shift();if(h){r[h]=1,delete n[h];let f=t[h],[d,p]=l[h];Object.entries(f).forEach(([m,g])=>{r[g]||(l[g]=Qve([d,p],m),u.push(g))})}}return l},"BFS"),a=[i(e)];for(;Object.keys(n).length>0;)a.push(i(Object.keys(n)[0]));mr.records.dataStructures={adjList:t,spatialMaps:a}}return mr.records.dataStructures},"getDataStructures"),tit=o((t,e)=>{mr.records.elements[t]=e},"setElementForId"),rit=o(t=>mr.records.elements[t],"getElementById"),ip={clear:Unt,setDiagramTitle:cn,getDiagramTitle:Jr,setAccTitle:Mr,getAccTitle:Br,setAccDescription:Fr,getAccDescription:zr,addService:Hnt,getServices:Wnt,addJunction:Ynt,getJunctions:qnt,getNodes:Xnt,getNode:jnt,addGroup:Knt,getGroups:Qnt,addEdge:Znt,getEdges:Jnt,setElementForId:tit,getElementById:rit,getDataStructures:eit};o(Mi,"getConfigField")});var nit,r2e,n2e=M(()=>{"use strict";Hg();ut();Tx();Rb();nit=o((t,e)=>{yf(t,e),t.groups.map(e.addGroup),t.services.map(r=>e.addService({...r,type:"service"})),t.junctions.map(r=>e.addJunction({...r,type:"junction"})),t.edges.map(e.addEdge)},"populateDb"),r2e={parse:o(async t=>{let e=await Yl("architecture",t);Y.debug(e),nit(e,ip)},"parse")}});var iit,i2e,a2e=M(()=>{"use strict";iit=o(t=>` + .edge { + stroke-width: ${t.archEdgeWidth}; + stroke: ${t.archEdgeColor}; + fill: none; + } + + .arrow { + fill: ${t.archEdgeArrowColor}; + } + + .node-bkg { + fill: none; + stroke: ${t.archGroupBorderColor}; + stroke-width: ${t.archGroupBorderWidth}; + stroke-dasharray: 8; + } + .node-icon-text { + display: flex; + align-items: center; + } + + .node-icon-text > div { + color: #fff; + margin: 1px; + height: fit-content; + text-align: center; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } +`,"getStyles"),i2e=iit});var dF=Ei((Mb,fF)=>{"use strict";o(function(e,r){typeof Mb=="object"&&typeof fF=="object"?fF.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mb=="object"?Mb.layoutBase=r():e.layoutBase=r()},"webpackUniversalModuleDefinition")(Mb,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=28)}([function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(5);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp?(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(p+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(m+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>m?(this.rect.y-=(this.labelHeight-m)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(m+this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h},function(t,e,r){"use strict";var n=r(0);function i(){}o(i,"FDLayoutConstants");for(var a in n)i[a]=n[a];i.MAX_ITERATIONS=2500,i.DEFAULT_EDGE_LENGTH=50,i.DEFAULT_SPRING_STRENGTH=.45,i.DEFAULT_REPULSION_STRENGTH=4500,i.DEFAULT_GRAVITY_STRENGTH=.4,i.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,i.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,i.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,i.COOLING_ADAPTATION_FACTOR=.33,i.ADAPTATION_LOWER_NODE_LIMIT=1e3,i.ADAPTATION_UPPER_NODE_LIMIT=5e3,i.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,i.MAX_NODE_DISPLACEMENT=i.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,i.MIN_REPULSION_DIST=i.DEFAULT_EDGE_LENGTH/10,i.CONVERGENCE_CHECK_PERIOD=100,i.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,i.MIN_EDGE_LENGTH=1,i.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=i},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(7),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,w=0;w-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(T,1),x.target!=x.source&&x.target.edges.splice(E,1);var _=x.source.owner.getEdges().indexOf(x);if(_==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(_,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,w=this.getNodes(),_=w.length,T=0;T<_;T++){var E=w[T];v=E.getTop(),x=E.getLeft(),g>v&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(w[0].getParent().paddingLeft!=null?b=w[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,w,_,T,E,L,S=this.nodes,A=S.length,I=0;Iw&&(y=w),v<_&&(v=_),x>T&&(x=T),bw&&(y=w),v<_&&(v=_),x>T&&(x=T),b=this.nodes.length){var A=0;v.forEach(function(I){I.owner==g&&A++}),A==this.nodes.length&&(this.isConnected=!0)}},t.exports=p},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(6),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=S,!1;if(hf)return l[0]=p,l[1]=h,l[2]=E,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,k=!0):(l[0]=g,l[1]=m,k=!0):C===N&&(u>f?(l[0]=p,l[1]=m,k=!0):(l[0]=x,l[1]=v,k=!0)),-O===N?f>u?(l[2]=L,l[3]=S,R=!0):(l[2]=E,l[3]=T,R=!0):O===N&&(f>u?(l[2]=_,l[3]=T,R=!0):(l[2]=A,l[3]=S,R=!0)),k&&R)return!1;if(u>f?h>d?(P=this.getCardinalDirection(C,N,4),F=this.getCardinalDirection(O,N,2)):(P=this.getCardinalDirection(-C,N,3),F=this.getCardinalDirection(-O,N,1)):h>d?(P=this.getCardinalDirection(-C,N,1),F=this.getCardinalDirection(-O,N,3)):(P=this.getCardinalDirection(C,N,2),F=this.getCardinalDirection(O,N,4)),!k)switch(P){case 1:G=m,B=u+-w/N,l[0]=B,l[1]=G;break;case 2:B=x,G=h+b*N,l[0]=B,l[1]=G;break;case 3:G=v,B=u+w/N,l[0]=B,l[1]=G;break;case 4:B=y,G=h+-b*N,l[0]=B,l[1]=G;break}if(!R)switch(F){case 1:W=T,z=f+-D/N,l[2]=z,l[3]=W;break;case 2:z=A,W=d+I*N,l[2]=z,l[3]=W;break;case 3:W=S,z=f+D/N,l[2]=z,l[3]=W;break;case 4:z=L,W=d+-I*N,l[2]=z,l[3]=W;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,w=void 0,_=void 0,T=void 0,E=void 0,L=void 0,S=void 0,A=void 0;return w=p-f,T=h-d,L=d*f-h*p,_=v-g,E=m-y,S=y*g-m*v,A=w*E-_*T,A===0?null:(x=(T*S-E*L)/A,b=(_*L-w*S)/A,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l=0){var v=(-m+Math.sqrt(m*m-4*p*g))/(2*p),x=(-m-Math.sqrt(m*m-4*p*g))/(2*p),b=null;return v>=0&&v<=1?[v]:x>=0&&x<=1?[x]:b}else return null},i.HALF_PI=.5*Math.PI,i.ONE_AND_HALF_PI=1.5*Math.PI,i.TWO_PI=2*Math.PI,i.THREE_PI=3*Math.PI,t.exports=i},function(t,e,r){"use strict";function n(){}o(n,"IMath"),n.sign=function(i){return i>0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(w.push(T[0]);w.length>0&&g;){var E=w[0];w.splice(0,1),b.add(E);for(var L=E.getEdges(),x=0;x-1&&T.splice(D,1)}b=new Set,_=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(S,1);var A=_.getNeighborsList();A.forEach(function(k){if(y.indexOf(k)<0){var R=v.get(k),C=R-1;C==1&&E.push(k),v.set(k,C)}})}y=y.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p},function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(5);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mw||b>w)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(w=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>w||b>w)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||w>=x[0].length)){for(var _=0;_h},"_defaultCompareFunction")}]),l}();t.exports=s},function(t,e,r){"use strict";function n(){}o(n,"SVD"),n.svd=function(i){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=i.length,this.n=i[0].length;var a=Math.min(this.m,this.n);this.s=function(dt){for(var Je=[];dt-- >0;)Je.push(0);return Je}(Math.min(this.m+1,this.n)),this.U=function(dt){var Je=o(function ct(Ct){if(Ct.length==0)return 0;for(var pt=[],Bt=0;Bt0;)Je.push(0);return Je}(this.n),l=function(dt){for(var Je=[];dt-- >0;)Je.push(0);return Je}(this.m),u=!0,h=!0,f=Math.min(this.m-1,this.n),d=Math.max(0,Math.min(this.n-2,this.m)),p=0;p=0;N--)if(this.s[N]!==0){for(var P=N+1;P=0;j--){if(function(dt,Je){return dt&&Je}(j0;){var ce=void 0,te=void 0;for(ce=R-2;ce>=-1&&ce!==-1;ce--)if(Math.abs(s[ce])<=ue+ae*(Math.abs(this.s[ce])+Math.abs(this.s[ce+1]))){s[ce]=0;break}if(ce===R-2)te=4;else{var Ne=void 0;for(Ne=R-1;Ne>=ce&&Ne!==ce;Ne--){var se=(Ne!==R?Math.abs(s[Ne]):0)+(Ne!==ce+1?Math.abs(s[Ne-1]):0);if(Math.abs(this.s[Ne])<=ue+ae*se){this.s[Ne]=0;break}}Ne===ce?te=3:Ne===R-1?te=1:(te=2,ce=Ne)}switch(ce++,te){case 1:{var ke=s[R-2];s[R-2]=0;for(var Re=R-2;Re>=ce;Re--){var Ce=n.hypot(this.s[Re],ke),Pe=this.s[Re]/Ce,Ie=ke/Ce;if(this.s[Re]=Ce,Re!==ce&&(ke=-Ie*s[Re-1],s[Re-1]=Pe*s[Re-1]),h)for(var $e=0;$e=this.s[ce+1]);){var tt=this.s[ce];if(this.s[ce]=this.s[ce+1],this.s[ce+1]=tt,h&&ceMath.abs(a)?(s=a/i,s=Math.abs(i)*Math.sqrt(1+s*s)):a!=0?(s=i/a,s=Math.abs(a)*Math.sqrt(1+s*s)):s=0,s},t.exports=n},function(t,e,r){"use strict";var n=function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o(function(e,r){typeof Ib=="object"&&typeof pF=="object"?pF.exports=r(dF()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof Ib=="object"?Ib.coseBase=r(dF()):e.coseBase=r(e.layoutBase)},"webpackUniversalModuleDefinition")(Ib,function(t){return(()=>{"use strict";var e={45:(a,s,l)=>{var u={};u.layoutBase=l(551),u.CoSEConstants=l(806),u.CoSEEdge=l(767),u.CoSEGraph=l(880),u.CoSEGraphManager=l(578),u.CoSELayout=l(765),u.CoSENode=l(991),u.ConstraintHandler=l(902),a.exports=u},806:(a,s,l)=>{var u=l(551).FDLayoutConstants;function h(){}o(h,"CoSEConstants");for(var f in u)h[f]=u[f];h.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,h.DEFAULT_RADIAL_SEPARATION=u.DEFAULT_EDGE_LENGTH,h.DEFAULT_COMPONENT_SEPERATION=60,h.TILE=!0,h.TILING_PADDING_VERTICAL=10,h.TILING_PADDING_HORIZONTAL=10,h.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,h.ENFORCE_CONSTRAINTS=!0,h.APPLY_LAYOUT=!0,h.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,h.TREE_REDUCTION_ON_INCREMENTAL=!0,h.PURE_INCREMENTAL=h.DEFAULT_INCREMENTAL,a.exports=h},767:(a,s,l)=>{var u=l(551).FDLayoutEdge;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEEdge"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},880:(a,s,l)=>{var u=l(551).LGraph;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEGraph"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},578:(a,s,l)=>{var u=l(551).LGraphManager;function h(d){u.call(this,d)}o(h,"CoSEGraphManager"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},765:(a,s,l)=>{var u=l(551).FDLayout,h=l(578),f=l(880),d=l(991),p=l(767),m=l(806),g=l(902),y=l(551).FDLayoutConstants,v=l(551).LayoutConstants,x=l(551).Point,b=l(551).PointD,w=l(551).DimensionD,_=l(551).Layout,T=l(551).Integer,E=l(551).IGeometry,L=l(551).LGraph,S=l(551).Transform,A=l(551).LinkedList;function I(){u.call(this),this.toBeTiled={},this.constraints={}}o(I,"CoSELayout"),I.prototype=Object.create(u.prototype);for(var D in u)I[D]=u[D];I.prototype.newGraphManager=function(){var k=new h(this);return this.graphManager=k,k},I.prototype.newGraph=function(k){return new f(null,this.graphManager,k)},I.prototype.newNode=function(k){return new d(this.graphManager,k)},I.prototype.newEdge=function(k){return new p(null,null,k)},I.prototype.initParameters=function(){u.prototype.initParameters.call(this,arguments),this.isSubLayout||(m.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=m.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=m.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=y.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=y.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=y.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},I.prototype.initSpringEmbedder=function(){u.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/y.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},I.prototype.layout=function(){var k=v.DEFAULT_CREATE_BENDS_AS_NEEDED;return k&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},I.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(m.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var R=new Set(this.getAllNodes()),C=this.nodesWithGravity.filter(function(P){return R.has(P)});this.graphManager.setAllNodesToApplyGravitation(C)}}else{var k=this.getFlatForest();if(k.length>0)this.positionNodesRadially(k);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var R=new Set(this.getAllNodes()),C=this.nodesWithGravity.filter(function(O){return R.has(O)});this.graphManager.setAllNodesToApplyGravitation(C),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),m.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},I.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%y.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var k=new Set(this.getAllNodes()),R=this.nodesWithGravity.filter(function(N){return k.has(N)});this.graphManager.setAllNodesToApplyGravitation(R),this.graphManager.updateBounds(),this.updateGrid(),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var C=!this.isTreeGrowing&&!this.isGrowthFinished,O=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(C,O),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},I.prototype.getPositionsData=function(){for(var k=this.graphManager.getAllNodes(),R={},C=0;C0&&this.updateDisplacements();for(var C=0;C0&&(O.fixedNodeWeight=P)}}if(this.constraints.relativePlacementConstraint){var F=new Map,B=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(ee){k.fixedNodesOnHorizontal.add(ee),k.fixedNodesOnVertical.add(ee)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var G=this.constraints.alignmentConstraint.vertical,C=0;C=2*ee.length/3;q--)J=Math.floor(Math.random()*(q+1)),H=ee[q],ee[q]=ee[J],ee[J]=H;return ee},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(ee){if(ee.left){var J=F.has(ee.left)?F.get(ee.left):ee.left,H=F.has(ee.right)?F.get(ee.right):ee.right;k.nodesInRelativeHorizontal.includes(J)||(k.nodesInRelativeHorizontal.push(J),k.nodeToRelativeConstraintMapHorizontal.set(J,[]),k.dummyToNodeForVerticalAlignment.has(J)?k.nodeToTempPositionMapHorizontal.set(J,k.idToNodeMap.get(k.dummyToNodeForVerticalAlignment.get(J)[0]).getCenterX()):k.nodeToTempPositionMapHorizontal.set(J,k.idToNodeMap.get(J).getCenterX())),k.nodesInRelativeHorizontal.includes(H)||(k.nodesInRelativeHorizontal.push(H),k.nodeToRelativeConstraintMapHorizontal.set(H,[]),k.dummyToNodeForVerticalAlignment.has(H)?k.nodeToTempPositionMapHorizontal.set(H,k.idToNodeMap.get(k.dummyToNodeForVerticalAlignment.get(H)[0]).getCenterX()):k.nodeToTempPositionMapHorizontal.set(H,k.idToNodeMap.get(H).getCenterX())),k.nodeToRelativeConstraintMapHorizontal.get(J).push({right:H,gap:ee.gap}),k.nodeToRelativeConstraintMapHorizontal.get(H).push({left:J,gap:ee.gap})}else{var q=B.has(ee.top)?B.get(ee.top):ee.top,Q=B.has(ee.bottom)?B.get(ee.bottom):ee.bottom;k.nodesInRelativeVertical.includes(q)||(k.nodesInRelativeVertical.push(q),k.nodeToRelativeConstraintMapVertical.set(q,[]),k.dummyToNodeForHorizontalAlignment.has(q)?k.nodeToTempPositionMapVertical.set(q,k.idToNodeMap.get(k.dummyToNodeForHorizontalAlignment.get(q)[0]).getCenterY()):k.nodeToTempPositionMapVertical.set(q,k.idToNodeMap.get(q).getCenterY())),k.nodesInRelativeVertical.includes(Q)||(k.nodesInRelativeVertical.push(Q),k.nodeToRelativeConstraintMapVertical.set(Q,[]),k.dummyToNodeForHorizontalAlignment.has(Q)?k.nodeToTempPositionMapVertical.set(Q,k.idToNodeMap.get(k.dummyToNodeForHorizontalAlignment.get(Q)[0]).getCenterY()):k.nodeToTempPositionMapVertical.set(Q,k.idToNodeMap.get(Q).getCenterY())),k.nodeToRelativeConstraintMapVertical.get(q).push({bottom:Q,gap:ee.gap}),k.nodeToRelativeConstraintMapVertical.get(Q).push({top:q,gap:ee.gap})}});else{var W=new Map,Z=new Map;this.constraints.relativePlacementConstraint.forEach(function(ee){if(ee.left){var J=F.has(ee.left)?F.get(ee.left):ee.left,H=F.has(ee.right)?F.get(ee.right):ee.right;W.has(J)?W.get(J).push(H):W.set(J,[H]),W.has(H)?W.get(H).push(J):W.set(H,[J])}else{var q=B.has(ee.top)?B.get(ee.top):ee.top,Q=B.has(ee.bottom)?B.get(ee.bottom):ee.bottom;Z.has(q)?Z.get(q).push(Q):Z.set(q,[Q]),Z.has(Q)?Z.get(Q).push(q):Z.set(Q,[q])}});var j=o(function(J,H){var q=[],Q=[],ae=new A,ue=new Set,ce=0;return J.forEach(function(te,Ne){if(!ue.has(Ne)){q[ce]=[],Q[ce]=!1;var se=Ne;for(ae.push(se),ue.add(se),q[ce].push(se);ae.length!=0;){se=ae.shift(),H.has(se)&&(Q[ce]=!0);var ke=J.get(se);ke.forEach(function(Re){ue.has(Re)||(ae.push(Re),ue.add(Re),q[ce].push(Re))})}ce++}}),{components:q,isFixed:Q}},"constructComponents"),oe=j(W,k.fixedNodesOnHorizontal);this.componentsOnHorizontal=oe.components,this.fixedComponentsOnHorizontal=oe.isFixed;var K=j(Z,k.fixedNodesOnVertical);this.componentsOnVertical=K.components,this.fixedComponentsOnVertical=K.isFixed}}},I.prototype.updateDisplacements=function(){var k=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(K){var ee=k.idToNodeMap.get(K.nodeId);ee.displacementX=0,ee.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var R=this.constraints.alignmentConstraint.vertical,C=0;C1){var B;for(B=0;BO&&(O=Math.floor(F.y)),P=Math.floor(F.x+m.DEFAULT_COMPONENT_SEPERATION)}this.transform(new b(v.WORLD_CENTER_X-F.x/2,v.WORLD_CENTER_Y-F.y/2))},I.radialLayout=function(k,R,C){var O=Math.max(this.maxDiagonalInTree(k),m.DEFAULT_RADIAL_SEPARATION);I.branchRadialLayout(R,null,0,359,0,O);var N=L.calculateBounds(k),P=new S;P.setDeviceOrgX(N.getMinX()),P.setDeviceOrgY(N.getMinY()),P.setWorldOrgX(C.x),P.setWorldOrgY(C.y);for(var F=0;F1;){var q=H[0];H.splice(0,1);var Q=j.indexOf(q);Q>=0&&j.splice(Q,1),ee--,oe--}R!=null?J=(j.indexOf(H[0])+1)%ee:J=0;for(var ae=Math.abs(O-C)/oe,ue=J;K!=oe;ue=++ue%ee){var ce=j[ue].getOtherEnd(k);if(ce!=R){var te=(C+K*ae)%360,Ne=(te+ae)%360;I.branchRadialLayout(ce,k,te,Ne,N+P,P),K++}}},I.maxDiagonalInTree=function(k){for(var R=T.MIN_VALUE,C=0;CR&&(R=N)}return R},I.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},I.prototype.groupZeroDegreeMembers=function(){var k=this,R={};this.memberGroups={},this.idToDummyNode={};for(var C=[],O=this.graphManager.getAllNodes(),N=0;N"u"&&(R[B]=[]),R[B]=R[B].concat(P)}Object.keys(R).forEach(function(G){if(R[G].length>1){var z="DummyCompound_"+G;k.memberGroups[z]=R[G];var W=R[G][0].getParent(),Z=new d(k.graphManager);Z.id=z,Z.paddingLeft=W.paddingLeft||0,Z.paddingRight=W.paddingRight||0,Z.paddingBottom=W.paddingBottom||0,Z.paddingTop=W.paddingTop||0,k.idToDummyNode[z]=Z;var j=k.getGraphManager().add(k.newGraph(),Z),oe=W.getChild();oe.add(Z);for(var K=0;KN?(O.rect.x-=(O.labelWidth-N)/2,O.setWidth(O.labelWidth),O.labelMarginLeft=(O.labelWidth-N)/2):O.labelPosHorizontal=="right"&&O.setWidth(N+O.labelWidth)),O.labelHeight&&(O.labelPosVertical=="top"?(O.rect.y-=O.labelHeight,O.setHeight(P+O.labelHeight),O.labelMarginTop=O.labelHeight):O.labelPosVertical=="center"&&O.labelHeight>P?(O.rect.y-=(O.labelHeight-P)/2,O.setHeight(O.labelHeight),O.labelMarginTop=(O.labelHeight-P)/2):O.labelPosVertical=="bottom"&&O.setHeight(P+O.labelHeight))}})},I.prototype.repopulateCompounds=function(){for(var k=this.compoundOrder.length-1;k>=0;k--){var R=this.compoundOrder[k],C=R.id,O=R.paddingLeft,N=R.paddingTop,P=R.labelMarginLeft,F=R.labelMarginTop;this.adjustLocations(this.tiledMemberPack[C],R.rect.x,R.rect.y,O,N,P,F)}},I.prototype.repopulateZeroDegreeMembers=function(){var k=this,R=this.tiledZeroDegreePack;Object.keys(R).forEach(function(C){var O=k.idToDummyNode[C],N=O.paddingLeft,P=O.paddingTop,F=O.labelMarginLeft,B=O.labelMarginTop;k.adjustLocations(R[C],O.rect.x,O.rect.y,N,P,F,B)})},I.prototype.getToBeTiled=function(k){var R=k.id;if(this.toBeTiled[R]!=null)return this.toBeTiled[R];var C=k.getChild();if(C==null)return this.toBeTiled[R]=!1,!1;for(var O=C.getNodes(),N=0;N0)return this.toBeTiled[R]=!1,!1;if(P.getChild()==null){this.toBeTiled[P.id]=!1;continue}if(!this.getToBeTiled(P))return this.toBeTiled[R]=!1,!1}return this.toBeTiled[R]=!0,!0},I.prototype.getNodeDegree=function(k){for(var R=k.id,C=k.getEdges(),O=0,N=0;NW&&(W=j.rect.height)}C+=W+k.verticalPadding}},I.prototype.tileCompoundMembers=function(k,R){var C=this;this.tiledMemberPack=[],Object.keys(k).forEach(function(O){var N=R[O];if(C.tiledMemberPack[O]=C.tileNodes(k[O],N.paddingLeft+N.paddingRight),N.rect.width=C.tiledMemberPack[O].width,N.rect.height=C.tiledMemberPack[O].height,N.setCenter(C.tiledMemberPack[O].centerX,C.tiledMemberPack[O].centerY),N.labelMarginLeft=0,N.labelMarginTop=0,m.NODE_DIMENSIONS_INCLUDE_LABELS){var P=N.rect.width,F=N.rect.height;N.labelWidth&&(N.labelPosHorizontal=="left"?(N.rect.x-=N.labelWidth,N.setWidth(P+N.labelWidth),N.labelMarginLeft=N.labelWidth):N.labelPosHorizontal=="center"&&N.labelWidth>P?(N.rect.x-=(N.labelWidth-P)/2,N.setWidth(N.labelWidth),N.labelMarginLeft=(N.labelWidth-P)/2):N.labelPosHorizontal=="right"&&N.setWidth(P+N.labelWidth)),N.labelHeight&&(N.labelPosVertical=="top"?(N.rect.y-=N.labelHeight,N.setHeight(F+N.labelHeight),N.labelMarginTop=N.labelHeight):N.labelPosVertical=="center"&&N.labelHeight>F?(N.rect.y-=(N.labelHeight-F)/2,N.setHeight(N.labelHeight),N.labelMarginTop=(N.labelHeight-F)/2):N.labelPosVertical=="bottom"&&N.setHeight(F+N.labelHeight))}})},I.prototype.tileNodes=function(k,R){var C=this.tileNodesByFavoringDim(k,R,!0),O=this.tileNodesByFavoringDim(k,R,!1),N=this.getOrgRatio(C),P=this.getOrgRatio(O),F;return PB&&(B=K.getWidth())});var G=P/N,z=F/N,W=Math.pow(C-O,2)+4*(G+O)*(z+C)*N,Z=(O-C+Math.sqrt(W))/(2*(G+O)),j;R?(j=Math.ceil(Z),j==Z&&j++):j=Math.floor(Z);var oe=j*(G+O)-O;return B>oe&&(oe=B),oe+=O*2,oe},I.prototype.tileNodesByFavoringDim=function(k,R,C){var O=m.TILING_PADDING_VERTICAL,N=m.TILING_PADDING_HORIZONTAL,P=m.TILING_COMPARE_BY,F={rows:[],rowWidth:[],rowHeight:[],width:0,height:R,verticalPadding:O,horizontalPadding:N,centerX:0,centerY:0};P&&(F.idealRowWidth=this.calcIdealRowWidth(k,C));var B=o(function(ee){return ee.rect.width*ee.rect.height},"getNodeArea"),G=o(function(ee,J){return B(J)-B(ee)},"areaCompareFcn");k.sort(function(K,ee){var J=G;return F.idealRowWidth?(J=P,J(K.id,ee.id)):J(K,ee)});for(var z=0,W=0,Z=0;Z0&&(F+=k.horizontalPadding),k.rowWidth[C]=F,k.width0&&(B+=k.verticalPadding);var G=0;B>k.rowHeight[C]&&(G=k.rowHeight[C],k.rowHeight[C]=B,G=k.rowHeight[C]-G),k.height+=G,k.rows[C].push(R)},I.prototype.getShortestRowIndex=function(k){for(var R=-1,C=Number.MAX_VALUE,O=0;OC&&(R=O,C=k.rowWidth[O]);return R},I.prototype.canAddHorizontal=function(k,R,C){if(k.idealRowWidth){var O=k.rows.length-1,N=k.rowWidth[O];return N+R+k.horizontalPadding<=k.idealRowWidth}var P=this.getShortestRowIndex(k);if(P<0)return!0;var F=k.rowWidth[P];if(F+k.horizontalPadding+R<=k.width)return!0;var B=0;k.rowHeight[P]0&&(B=C+k.verticalPadding-k.rowHeight[P]);var G;k.width-F>=R+k.horizontalPadding?G=(k.height+B)/(F+R+k.horizontalPadding):G=(k.height+B)/k.width,B=C+k.verticalPadding;var z;return k.widthP&&R!=C){O.splice(-1,1),k.rows[C].push(N),k.rowWidth[R]=k.rowWidth[R]-P,k.rowWidth[C]=k.rowWidth[C]+P,k.width=k.rowWidth[instance.getLongestRowIndex(k)];for(var F=Number.MIN_VALUE,B=0;BF&&(F=O[B].height);R>0&&(F+=k.verticalPadding);var G=k.rowHeight[R]+k.rowHeight[C];k.rowHeight[R]=F,k.rowHeight[C]0)for(var oe=N;oe<=P;oe++)j[0]+=this.grid[oe][F-1].length+this.grid[oe][F].length-1;if(P0)for(var oe=F;oe<=B;oe++)j[3]+=this.grid[N-1][oe].length+this.grid[N][oe].length-1;for(var K=T.MAX_VALUE,ee,J,H=0;H{var u=l(551).FDLayoutNode,h=l(551).IMath;function f(p,m,g,y){u.call(this,p,m,g,y)}o(f,"CoSENode"),f.prototype=Object.create(u.prototype);for(var d in u)f[d]=u[d];f.prototype.calculateDisplacement=function(){var p=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementX=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementX)),Math.abs(this.displacementY)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementY=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},f.prototype.propogateDisplacementToChildren=function(p,m){for(var g=this.getChild().getNodes(),y,v=0;v{function u(g){if(Array.isArray(g)){for(var y=0,v=Array(g.length);y0){var yt=0;rt.forEach(function(tt){Te=="horizontal"?(me.set(tt,x.has(tt)?b[x.get(tt)]:Ee.get(tt)),yt+=me.get(tt)):(me.set(tt,x.has(tt)?w[x.get(tt)]:Ee.get(tt)),yt+=me.get(tt))}),yt=yt/rt.length,vt.forEach(function(tt){ie.has(tt)||me.set(tt,yt)})}else{var Ue=0;vt.forEach(function(tt){Te=="horizontal"?Ue+=x.has(tt)?b[x.get(tt)]:Ee.get(tt):Ue+=x.has(tt)?w[x.get(tt)]:Ee.get(tt)}),Ue=Ue/vt.length,vt.forEach(function(tt){me.set(tt,Ue)})}});for(var et=o(function(){var rt=Oe.shift(),yt=U.get(rt);yt.forEach(function(Ue){if(me.get(Ue.id)tt&&(tt=pt),Btht&&(ht=Bt)}}catch(On){er=!0,dt=On}finally{try{!Et&&Je.return&&Je.return()}finally{if(er)throw dt}}var Tr=(yt+tt)/2-(Ue+ht)/2,yr=!0,or=!1,ln=void 0;try{for(var Or=vt[Symbol.iterator](),ii;!(yr=(ii=Or.next()).done);yr=!0){var mn=ii.value;me.set(mn,me.get(mn)+Tr)}}catch(On){or=!0,ln=On}finally{try{!yr&&Or.return&&Or.return()}finally{if(or)throw ln}}})}return me},"findAppropriatePositionForRelativePlacement"),D=o(function(U){var Te=0,ie=0,Ee=0,Ae=0;if(U.forEach(function(He){He.left?b[x.get(He.left)]-b[x.get(He.right)]>=0?Te++:ie++:w[x.get(He.top)]-w[x.get(He.bottom)]>=0?Ee++:Ae++}),Te>ie&&Ee>Ae)for(var Ge=0;Geie)for(var Be=0;BeAe)for(var me=0;me1)y.fixedNodeConstraint.forEach(function(ve,U){O[U]=[ve.position.x,ve.position.y],N[U]=[b[x.get(ve.nodeId)],w[x.get(ve.nodeId)]]}),P=!0;else if(y.alignmentConstraint)(function(){var ve=0;if(y.alignmentConstraint.vertical){for(var U=y.alignmentConstraint.vertical,Te=o(function(me){var He=new Set;U[me].forEach(function(bt){He.add(bt)});var Oe=new Set([].concat(u(He)).filter(function(bt){return B.has(bt)})),et=void 0;Oe.size>0?et=b[x.get(Oe.values().next().value)]:et=A(He).x,U[me].forEach(function(bt){O[ve]=[et,w[x.get(bt)]],N[ve]=[b[x.get(bt)],w[x.get(bt)]],ve++})},"_loop2"),ie=0;ie0?et=b[x.get(Oe.values().next().value)]:et=A(He).y,Ee[me].forEach(function(bt){O[ve]=[b[x.get(bt)],et],N[ve]=[b[x.get(bt)],w[x.get(bt)]],ve++})},"_loop3"),Ge=0;GeZ&&(Z=W[oe].length,j=oe);if(Z0){var Pe={x:0,y:0};y.fixedNodeConstraint.forEach(function(ve,U){var Te={x:b[x.get(ve.nodeId)],y:w[x.get(ve.nodeId)]},ie=ve.position,Ee=S(ie,Te);Pe.x+=Ee.x,Pe.y+=Ee.y}),Pe.x/=y.fixedNodeConstraint.length,Pe.y/=y.fixedNodeConstraint.length,b.forEach(function(ve,U){b[U]+=Pe.x}),w.forEach(function(ve,U){w[U]+=Pe.y}),y.fixedNodeConstraint.forEach(function(ve){b[x.get(ve.nodeId)]=ve.position.x,w[x.get(ve.nodeId)]=ve.position.y})}if(y.alignmentConstraint){if(y.alignmentConstraint.vertical)for(var Ie=y.alignmentConstraint.vertical,$e=o(function(U){var Te=new Set;Ie[U].forEach(function(Ae){Te.add(Ae)});var ie=new Set([].concat(u(Te)).filter(function(Ae){return B.has(Ae)})),Ee=void 0;ie.size>0?Ee=b[x.get(ie.values().next().value)]:Ee=A(Te).x,Te.forEach(function(Ae){B.has(Ae)||(b[x.get(Ae)]=Ee)})},"_loop4"),ye=0;ye0?Ee=w[x.get(ie.values().next().value)]:Ee=A(Te).y,Te.forEach(function(Ae){B.has(Ae)||(w[x.get(Ae)]=Ee)})},"_loop5"),he=0;he{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(45);return i})()})});var s2e=Ei((Ob,gF)=>{"use strict";o(function(e,r){typeof Ob=="object"&&typeof gF=="object"?gF.exports=r(mF()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof Ob=="object"?Ob.cytoscapeFcose=r(mF()):e.cytoscapeFcose=r(e.coseBase)},"webpackUniversalModuleDefinition")(Ob,function(t){return(()=>{"use strict";var e={658:a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(s){for(var l=arguments.length,u=Array(l>1?l-1:0),h=1;h{var u=function(){function d(p,m){var g=[],y=!0,v=!1,x=void 0;try{for(var b=p[Symbol.iterator](),w;!(y=(w=b.next()).done)&&(g.push(w.value),!(m&&g.length===m));y=!0);}catch(_){v=!0,x=_}finally{try{!y&&b.return&&b.return()}finally{if(v)throw x}}return g}return o(d,"sliceIterator"),function(p,m){if(Array.isArray(p))return p;if(Symbol.iterator in Object(p))return d(p,m);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=l(140).layoutBase.LinkedList,f={};f.getTopMostNodes=function(d){for(var p={},m=0;m0&&P.merge(z)});for(var F=0;F1){w=x[0],_=w.connectedEdges().length,x.forEach(function(N){N.connectedEdges().length<_&&(_=N.connectedEdges().length,w=N)}),L.push(w.id());var O=d.collection();O.merge(x[0]),x.forEach(function(N){O.merge(N)}),x=[],m=m.difference(O),E++}},"_loop");do A();while(!T);return g&&L.length>0&&g.set("dummy"+(g.size+1),L),S},f.relocateComponent=function(d,p,m){if(!m.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY;if(m.quality=="draft"){var b=!0,w=!1,_=void 0;try{for(var T=p.nodeIndexes[Symbol.iterator](),E;!(b=(E=T.next()).done);b=!0){var L=E.value,S=u(L,2),A=S[0],I=S[1],D=m.cy.getElementById(A);if(D){var k=D.boundingBox(),R=p.xCoords[I]-k.w/2,C=p.xCoords[I]+k.w/2,O=p.yCoords[I]-k.h/2,N=p.yCoords[I]+k.h/2;Ry&&(y=C),Ox&&(x=N)}}}catch(z){w=!0,_=z}finally{try{!b&&T.return&&T.return()}finally{if(w)throw _}}var P=d.x-(y+g)/2,F=d.y-(x+v)/2;p.xCoords=p.xCoords.map(function(z){return z+P}),p.yCoords=p.yCoords.map(function(z){return z+F})}else{Object.keys(p).forEach(function(z){var W=p[z],Z=W.getRect().x,j=W.getRect().x+W.getRect().width,oe=W.getRect().y,K=W.getRect().y+W.getRect().height;Zy&&(y=j),oex&&(x=K)});var B=d.x-(y+g)/2,G=d.y-(x+v)/2;Object.keys(p).forEach(function(z){var W=p[z];W.setCenter(W.getCenterX()+B,W.getCenterY()+G)})}}},f.calcBoundingBox=function(d,p,m,g){for(var y=Number.MAX_SAFE_INTEGER,v=Number.MIN_SAFE_INTEGER,x=Number.MAX_SAFE_INTEGER,b=Number.MIN_SAFE_INTEGER,w=void 0,_=void 0,T=void 0,E=void 0,L=d.descendants().not(":parent"),S=L.length,A=0;Aw&&(y=w),v<_&&(v=_),x>T&&(x=T),b{var u=l(548),h=l(140).CoSELayout,f=l(140).CoSENode,d=l(140).layoutBase.PointD,p=l(140).layoutBase.DimensionD,m=l(140).layoutBase.LayoutConstants,g=l(140).layoutBase.FDLayoutConstants,y=l(140).CoSEConstants,v=o(function(b,w){var _=b.cy,T=b.eles,E=T.nodes(),L=T.edges(),S=void 0,A=void 0,I=void 0,D={};b.randomize&&(S=w.nodeIndexes,A=w.xCoords,I=w.yCoords);var k=o(function(z){return typeof z=="function"},"isFn"),R=o(function(z,W){return k(z)?z(W):z},"optFn"),C=u.calcParentsWithoutChildren(_,T),O=o(function G(z,W,Z,j){for(var oe=W.length,K=0;K0){var ae=void 0;ae=Z.getGraphManager().add(Z.newGraph(),H),G(ae,J,Z,j)}}},"processChildrenList"),N=o(function(z,W,Z){for(var j=0,oe=0,K=0;K0?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=j/oe:k(b.idealEdgeLength)?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=b.idealEdgeLength,y.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,y.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},"processEdges"),P=o(function(z,W){W.fixedNodeConstraint&&(z.constraints.fixedNodeConstraint=W.fixedNodeConstraint),W.alignmentConstraint&&(z.constraints.alignmentConstraint=W.alignmentConstraint),W.relativePlacementConstraint&&(z.constraints.relativePlacementConstraint=W.relativePlacementConstraint)},"processConstraints");b.nestingFactor!=null&&(y.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=b.nestingFactor),b.gravity!=null&&(y.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=b.gravity),b.numIter!=null&&(y.MAX_ITERATIONS=g.MAX_ITERATIONS=b.numIter),b.gravityRange!=null&&(y.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=b.gravityRange),b.gravityCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=b.gravityCompound),b.gravityRangeCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=b.gravityRangeCompound),b.initialEnergyOnIncremental!=null&&(y.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=b.initialEnergyOnIncremental),b.tilingCompareBy!=null&&(y.TILING_COMPARE_BY=b.tilingCompareBy),b.quality=="proof"?m.QUALITY=2:m.QUALITY=0,y.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=m.NODE_DIMENSIONS_INCLUDE_LABELS=b.nodeDimensionsIncludeLabels,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!b.randomize,y.ANIMATE=g.ANIMATE=m.ANIMATE=b.animate,y.TILE=b.tile,y.TILING_PADDING_VERTICAL=typeof b.tilingPaddingVertical=="function"?b.tilingPaddingVertical.call():b.tilingPaddingVertical,y.TILING_PADDING_HORIZONTAL=typeof b.tilingPaddingHorizontal=="function"?b.tilingPaddingHorizontal.call():b.tilingPaddingHorizontal,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!0,y.PURE_INCREMENTAL=!b.randomize,m.DEFAULT_UNIFORM_LEAF_NODE_SIZES=b.uniformNodeDimensions,b.step=="transformed"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!1),b.step=="enforced"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!1),b.step=="cose"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!0),b.step=="all"&&(b.randomize?y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!0),b.fixedNodeConstraint||b.alignmentConstraint||b.relativePlacementConstraint?y.TREE_REDUCTION_ON_INCREMENTAL=!1:y.TREE_REDUCTION_ON_INCREMENTAL=!0;var F=new h,B=F.newGraphManager();return O(B.addRoot(),u.getTopMostNodes(E),F,b),N(F,B,L),P(F,b),F.runLayout(),D},"coseLayout");a.exports={coseLayout:v}},212:(a,s,l)=>{var u=function(){function b(w,_){for(var T=0;T<_.length;T++){var E=_[T];E.enumerable=E.enumerable||!1,E.configurable=!0,"value"in E&&(E.writable=!0),Object.defineProperty(w,E.key,E)}}return o(b,"defineProperties"),function(w,_,T){return _&&b(w.prototype,_),T&&b(w,T),w}}();function h(b,w){if(!(b instanceof w))throw new TypeError("Cannot call a class as a function")}o(h,"_classCallCheck");var f=l(658),d=l(548),p=l(657),m=p.spectralLayout,g=l(816),y=g.coseLayout,v=Object.freeze({quality:"default",randomize:!0,animate:!0,animationDuration:1e3,animationEasing:void 0,fit:!0,padding:30,nodeDimensionsIncludeLabels:!1,uniformNodeDimensions:!1,packComponents:!0,step:"all",samplingType:!0,sampleSize:25,nodeSeparation:75,piTol:1e-7,nodeRepulsion:o(function(w){return 4500},"nodeRepulsion"),idealEdgeLength:o(function(w){return 50},"idealEdgeLength"),edgeElasticity:o(function(w){return .45},"edgeElasticity"),nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,tilingCompareBy:void 0,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.3,fixedNodeConstraint:void 0,alignmentConstraint:void 0,relativePlacementConstraint:void 0,ready:o(function(){},"ready"),stop:o(function(){},"stop")}),x=function(){function b(w){h(this,b),this.options=f({},v,w)}return o(b,"Layout"),u(b,[{key:"run",value:o(function(){var _=this,T=this.options,E=T.cy,L=T.eles,S=[],A=void 0,I=void 0,D=[],k=void 0,R=[];T.fixedNodeConstraint&&(!Array.isArray(T.fixedNodeConstraint)||T.fixedNodeConstraint.length==0)&&(T.fixedNodeConstraint=void 0),T.alignmentConstraint&&(T.alignmentConstraint.vertical&&(!Array.isArray(T.alignmentConstraint.vertical)||T.alignmentConstraint.vertical.length==0)&&(T.alignmentConstraint.vertical=void 0),T.alignmentConstraint.horizontal&&(!Array.isArray(T.alignmentConstraint.horizontal)||T.alignmentConstraint.horizontal.length==0)&&(T.alignmentConstraint.horizontal=void 0)),T.relativePlacementConstraint&&(!Array.isArray(T.relativePlacementConstraint)||T.relativePlacementConstraint.length==0)&&(T.relativePlacementConstraint=void 0);var C=T.fixedNodeConstraint||T.alignmentConstraint||T.relativePlacementConstraint;C&&(T.tile=!1,T.packComponents=!1);var O=void 0,N=!1;if(E.layoutUtilities&&T.packComponents&&(O=E.layoutUtilities("get"),O||(O=E.layoutUtilities()),N=!0),L.nodes().length>0)if(N){var B=d.getTopMostNodes(T.eles.nodes());if(k=d.connectComponents(E,T.eles,B),k.forEach(function(se){var ke=se.boundingBox();R.push({x:ke.x1+ke.w/2,y:ke.y1+ke.h/2})}),T.randomize&&k.forEach(function(se){T.eles=se,S.push(m(T))}),T.quality=="default"||T.quality=="proof"){var G=E.collection();if(T.tile){var z=new Map,W=[],Z=[],j=0,oe={nodeIndexes:z,xCoords:W,yCoords:Z},K=[];if(k.forEach(function(se,ke){se.edges().length==0&&(se.nodes().forEach(function(Re,Ce){G.merge(se.nodes()[Ce]),Re.isParent()||(oe.nodeIndexes.set(se.nodes()[Ce].id(),j++),oe.xCoords.push(se.nodes()[0].position().x),oe.yCoords.push(se.nodes()[0].position().y))}),K.push(ke))}),G.length>1){var ee=G.boundingBox();R.push({x:ee.x1+ee.w/2,y:ee.y1+ee.h/2}),k.push(G),S.push(oe);for(var J=K.length-1;J>=0;J--)k.splice(K[J],1),S.splice(K[J],1),R.splice(K[J],1)}}k.forEach(function(se,ke){T.eles=se,D.push(y(T,S[ke])),d.relocateComponent(R[ke],D[ke],T)})}else k.forEach(function(se,ke){d.relocateComponent(R[ke],S[ke],T)});var H=new Set;if(k.length>1){var q=[],Q=L.filter(function(se){return se.css("display")=="none"});k.forEach(function(se,ke){var Re=void 0;if(T.quality=="draft"&&(Re=S[ke].nodeIndexes),se.nodes().not(Q).length>0){var Ce={};Ce.edges=[],Ce.nodes=[];var Pe=void 0;se.nodes().not(Q).forEach(function(Ie){if(T.quality=="draft")if(!Ie.isParent())Pe=Re.get(Ie.id()),Ce.nodes.push({x:S[ke].xCoords[Pe]-Ie.boundingbox().w/2,y:S[ke].yCoords[Pe]-Ie.boundingbox().h/2,width:Ie.boundingbox().w,height:Ie.boundingbox().h});else{var $e=d.calcBoundingBox(Ie,S[ke].xCoords,S[ke].yCoords,Re);Ce.nodes.push({x:$e.topLeftX,y:$e.topLeftY,width:$e.width,height:$e.height})}else D[ke][Ie.id()]&&Ce.nodes.push({x:D[ke][Ie.id()].getLeft(),y:D[ke][Ie.id()].getTop(),width:D[ke][Ie.id()].getWidth(),height:D[ke][Ie.id()].getHeight()})}),se.edges().forEach(function(Ie){var $e=Ie.source(),ye=Ie.target();if($e.css("display")!="none"&&ye.css("display")!="none")if(T.quality=="draft"){var X=Re.get($e.id()),fe=Re.get(ye.id()),he=[],ge=[];if($e.isParent()){var ne=d.calcBoundingBox($e,S[ke].xCoords,S[ke].yCoords,Re);he.push(ne.topLeftX+ne.width/2),he.push(ne.topLeftY+ne.height/2)}else he.push(S[ke].xCoords[X]),he.push(S[ke].yCoords[X]);if(ye.isParent()){var ve=d.calcBoundingBox(ye,S[ke].xCoords,S[ke].yCoords,Re);ge.push(ve.topLeftX+ve.width/2),ge.push(ve.topLeftY+ve.height/2)}else ge.push(S[ke].xCoords[fe]),ge.push(S[ke].yCoords[fe]);Ce.edges.push({startX:he[0],startY:he[1],endX:ge[0],endY:ge[1]})}else D[ke][$e.id()]&&D[ke][ye.id()]&&Ce.edges.push({startX:D[ke][$e.id()].getCenterX(),startY:D[ke][$e.id()].getCenterY(),endX:D[ke][ye.id()].getCenterX(),endY:D[ke][ye.id()].getCenterY()})}),Ce.nodes.length>0&&(q.push(Ce),H.add(ke))}});var ae=O.packComponents(q,T.randomize).shifts;if(T.quality=="draft")S.forEach(function(se,ke){var Re=se.xCoords.map(function(Pe){return Pe+ae[ke].dx}),Ce=se.yCoords.map(function(Pe){return Pe+ae[ke].dy});se.xCoords=Re,se.yCoords=Ce});else{var ue=0;H.forEach(function(se){Object.keys(D[se]).forEach(function(ke){var Re=D[se][ke];Re.setCenter(Re.getCenterX()+ae[ue].dx,Re.getCenterY()+ae[ue].dy)}),ue++})}}}else{var P=T.eles.boundingBox();if(R.push({x:P.x1+P.w/2,y:P.y1+P.h/2}),T.randomize){var F=m(T);S.push(F)}T.quality=="default"||T.quality=="proof"?(D.push(y(T,S[0])),d.relocateComponent(R[0],D[0],T)):d.relocateComponent(R[0],S[0],T)}var ce=o(function(ke,Re){if(T.quality=="default"||T.quality=="proof"){typeof ke=="number"&&(ke=Re);var Ce=void 0,Pe=void 0,Ie=ke.data("id");return D.forEach(function(ye){Ie in ye&&(Ce={x:ye[Ie].getRect().getCenterX(),y:ye[Ie].getRect().getCenterY()},Pe=ye[Ie])}),T.nodeDimensionsIncludeLabels&&(Pe.labelWidth&&(Pe.labelPosHorizontal=="left"?Ce.x+=Pe.labelWidth/2:Pe.labelPosHorizontal=="right"&&(Ce.x-=Pe.labelWidth/2)),Pe.labelHeight&&(Pe.labelPosVertical=="top"?Ce.y+=Pe.labelHeight/2:Pe.labelPosVertical=="bottom"&&(Ce.y-=Pe.labelHeight/2))),Ce==null&&(Ce={x:ke.position("x"),y:ke.position("y")}),{x:Ce.x,y:Ce.y}}else{var $e=void 0;return S.forEach(function(ye){var X=ye.nodeIndexes.get(ke.id());X!=null&&($e={x:ye.xCoords[X],y:ye.yCoords[X]})}),$e==null&&($e={x:ke.position("x"),y:ke.position("y")}),{x:$e.x,y:$e.y}}},"getPositions");if(T.quality=="default"||T.quality=="proof"||T.randomize){var te=d.calcParentsWithoutChildren(E,L),Ne=L.filter(function(se){return se.css("display")=="none"});T.eles=L.not(Ne),L.nodes().not(":parent").not(Ne).layoutPositions(_,T,ce),te.length>0&&te.forEach(function(se){se.position(ce(se))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")},"run")}]),b}();a.exports=x},657:(a,s,l)=>{var u=l(548),h=l(140).layoutBase.Matrix,f=l(140).layoutBase.SVD,d=o(function(m){var g=m.cy,y=m.eles,v=y.nodes(),x=y.nodes(":parent"),b=new Map,w=new Map,_=new Map,T=[],E=[],L=[],S=[],A=[],I=[],D=[],k=[],R=void 0,C=void 0,O=1e8,N=1e-9,P=m.piTol,F=m.samplingType,B=m.nodeSeparation,G=void 0,z=o(function(){for(var Te=0,ie=0,Ee=!1;ie=Ge;){me=Ae[Ge++];for(var vt=T[me],rt=0;rtet&&(et=A[Ue],bt=Ue)}return bt},"BFS"),Z=o(function(Te){var ie=void 0;if(Te){ie=Math.floor(Math.random()*C),R=ie;for(var Ae=0;Ae=1)break;et=Oe}for(var vt=0;vt=1)break;et=Oe}for(var yt=0;yt0&&(ie.isParent()?T[Te].push(_.get(ie.id())):T[Te].push(ie.id()))})});var te=o(function(Te){var ie=w.get(Te),Ee=void 0;b.get(Te).forEach(function(Ae){g.getElementById(Ae).isParent()?Ee=_.get(Ae):Ee=Ae,T[ie].push(Ee),T[w.get(Ee)].push(Te)})},"_loop"),Ne=!0,se=!1,ke=void 0;try{for(var Re=b.keys()[Symbol.iterator](),Ce;!(Ne=(Ce=Re.next()).done);Ne=!0){var Pe=Ce.value;te(Pe)}}catch(U){se=!0,ke=U}finally{try{!Ne&&Re.return&&Re.return()}finally{if(se)throw ke}}C=w.size;var Ie=void 0;if(C>2){G=C{var u=l(212),h=o(function(d){d&&d("layout","fcose",u)},"register");typeof cytoscape<"u"&&h(cytoscape),a.exports=h},140:a=>{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(579);return i})()})});var F1,ap,yF=M(()=>{"use strict";su();F1=o(t=>`${t}`,"wrapIcon"),ap={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:F1('')},server:{body:F1('')},disk:{body:F1('')},internet:{body:F1('')},cloud:{body:F1('')},unknown:zS,blank:{body:F1("")}}}});var o2e,l2e,c2e,u2e,h2e=M(()=>{"use strict";su();Vt();Pl();Rb();yF();gS();o2e=o(async function(t,e){let r=Mi("padding"),n=Mi("iconSize"),i=n/2,a=n/6,s=a/2;await Promise.all(e.edges().map(async l=>{let{source:u,sourceDir:h,sourceArrow:f,sourceGroup:d,target:p,targetDir:m,targetArrow:g,targetGroup:y,label:v}=mS(l),{x,y:b}=l[0].sourceEndpoint(),{x:w,y:_}=l[0].midpoint(),{x:T,y:E}=l[0].targetEndpoint(),L=r+4;if(d&&(ys(h)?x+=h==="L"?-L:L:b+=h==="T"?-L:L+18),y&&(ys(m)?T+=m==="L"?-L:L:E+=m==="T"?-L:L+18),!d&&ip.getNode(u)?.type==="junction"&&(ys(h)?x+=h==="L"?i:-i:b+=h==="T"?i:-i),!y&&ip.getNode(p)?.type==="junction"&&(ys(m)?T+=m==="L"?i:-i:E+=m==="T"?i:-i),l[0]._private.rscratch){let S=t.insert("g");if(S.insert("path").attr("d",`M ${x},${b} L ${w},${_} L${T},${E} `).attr("class","edge"),f){let A=ys(h)?Db[h](x,a):x-s,I=nu(h)?Db[h](b,a):b-s;S.insert("polygon").attr("points",uF[h](a)).attr("transform",`translate(${A},${I})`).attr("class","arrow")}if(g){let A=ys(m)?Db[m](T,a):T-s,I=nu(m)?Db[m](E,a):E-s;S.insert("polygon").attr("points",uF[m](a)).attr("transform",`translate(${A},${I})`).attr("class","arrow")}if(v){let A=pS(h,m)?"XY":ys(h)?"X":"Y",I=0;A==="X"?I=Math.abs(x-T):A==="Y"?I=Math.abs(b-E)/1.5:I=Math.abs(x-T)/2;let D=S.append("g");if(await Li(D,v,{useHtmlLabels:!1,width:I,classes:"architecture-service-label"},pe()),D.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),A==="X")D.attr("transform","translate("+w+", "+_+")");else if(A==="Y")D.attr("transform","translate("+w+", "+_+") rotate(-90)");else if(A==="XY"){let k=Nb(h,m);if(k&&Kve(k)){let R=D.node().getBoundingClientRect(),[C,O]=Zve(k);D.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*C*O*45})`);let N=D.node().getBoundingClientRect();D.attr("transform",` + translate(${w}, ${_-R.height/2}) + translate(${C*N.width/2}, ${O*N.height/2}) + rotate(${-1*C*O*45}, 0, ${R.height/2}) + `)}}}}}))},"drawEdges"),l2e=o(async function(t,e){let n=Mi("padding")*.75,i=Mi("fontSize"),s=Mi("iconSize")/2;await Promise.all(e.nodes().map(async l=>{let u=Vf(l);if(u.type==="group"){let{h,w:f,x1:d,y1:p}=l.boundingBox();t.append("rect").attr("x",d+s).attr("y",p+s).attr("width",f).attr("height",h).attr("class","node-bkg");let m=t.append("g"),g=d,y=p;if(u.icon){let v=m.append("g");v.html(`${await _o(u.icon,{height:n,width:n,fallbackPrefix:ap.prefix})}`),v.attr("transform","translate("+(g+s+1)+", "+(y+s+1)+")"),g+=n,y+=i/2-1-2}if(u.label){let v=m.append("g");await Li(v,u.label,{useHtmlLabels:!1,width:f,classes:"architecture-service-label"},pe()),v.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),v.attr("transform","translate("+(g+s+4)+", "+(y+s+2)+")")}}}))},"drawGroups"),c2e=o(async function(t,e,r){for(let n of r){let i=e.append("g"),a=Mi("iconSize");if(n.title){let h=i.append("g");await Li(h,n.title,{useHtmlLabels:!1,width:a*1.5,classes:"architecture-service-label"},pe()),h.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),h.attr("transform","translate("+a/2+", "+a+")")}let s=i.append("g");if(n.icon)s.html(`${await _o(n.icon,{height:a,width:a,fallbackPrefix:ap.prefix})}`);else if(n.iconText){s.html(`${await _o("blank",{height:a,width:a,fallbackPrefix:ap.prefix})}`);let d=s.append("g").append("foreignObject").attr("width",a).attr("height",a).append("div").attr("class","node-icon-text").attr("style",`height: ${a}px;`).append("div").html(n.iconText),p=parseInt(window.getComputedStyle(d.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;d.attr("style",`-webkit-line-clamp: ${Math.floor((a-2)/p)};`)}else s.append("path").attr("class","node-bkg").attr("id","node-"+n.id).attr("d",`M0 ${a} v${-a} q0,-5 5,-5 h${a} q5,0 5,5 v${a} H0 Z`);i.attr("class","architecture-service");let{width:l,height:u}=i._groups[0][0].getBBox();n.width=l,n.height=u,t.setElementForId(n.id,i)}return 0},"drawServices"),u2e=o(function(t,e,r){r.forEach(n=>{let i=e.append("g"),a=Mi("iconSize");i.append("g").append("rect").attr("id","node-"+n.id).attr("fill-opacity","0").attr("width",a).attr("height",a),i.attr("class","architecture-junction");let{width:l,height:u}=i._groups[0][0].getBBox();i.width=l,i.height=u,t.setElementForId(n.id,i)})},"drawJunctions")});function ait(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"service",id:r.id,icon:r.icon,label:r.title,parent:r.in,width:Mi("iconSize"),height:Mi("iconSize")},classes:"node-service"})})}function sit(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"junction",id:r.id,parent:r.in,width:Mi("iconSize"),height:Mi("iconSize")},classes:"node-junction"})})}function oit(t,e){e.nodes().map(r=>{let n=Vf(r);if(n.type==="group")return;n.x=r.position().x,n.y=r.position().y,t.getElementById(n.id).attr("transform","translate("+(n.x||0)+","+(n.y||0)+")")})}function lit(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"group",id:r.id,icon:r.icon,label:r.title,parent:r.in},classes:"node-group"})})}function cit(t,e){t.forEach(r=>{let{lhsId:n,rhsId:i,lhsInto:a,lhsGroup:s,rhsInto:l,lhsDir:u,rhsDir:h,rhsGroup:f,title:d}=r,p=pS(r.lhsDir,r.rhsDir)?"segments":"straight",m={id:`${n}-${i}`,label:d,source:n,sourceDir:u,sourceArrow:a,sourceGroup:s,sourceEndpoint:u==="L"?"0 50%":u==="R"?"100% 50%":u==="T"?"50% 0":"50% 100%",target:i,targetDir:h,targetArrow:l,targetGroup:f,targetEndpoint:h==="L"?"0 50%":h==="R"?"100% 50%":h==="T"?"50% 0":"50% 100%"};e.add({group:"edges",data:m,classes:p})})}function uit(t){let e=t.map(i=>{let a={},s={};return Object.entries(i).forEach(([l,[u,h]])=>{a[h]||(a[h]=[]),s[u]||(s[u]=[]),a[h].push(l),s[u].push(l)}),{horiz:Object.values(a).filter(l=>l.length>1),vert:Object.values(s).filter(l=>l.length>1)}}),[r,n]=e.reduce(([i,a],{horiz:s,vert:l})=>[[...i,...s],[...a,...l]],[[],[]]);return{horizontal:r,vertical:n}}function hit(t){let e=[],r=o(i=>`${i[0]},${i[1]}`,"posToStr"),n=o(i=>i.split(",").map(a=>parseInt(a)),"strToPos");return t.forEach(i=>{let a=Object.fromEntries(Object.entries(i).map(([h,f])=>[r(f),h])),s=[r([0,0])],l={},u={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;s.length>0;){let h=s.shift();if(h){l[h]=1;let f=a[h];if(f){let d=n(h);Object.entries(u).forEach(([p,m])=>{let g=r([d[0]+m[0],d[1]+m[1]]),y=a[g];y&&!l[g]&&(s.push(g),e.push({[cF[p]]:y,[cF[jve(p)]]:f,gap:1.5*Mi("iconSize")}))})}}}}),e}function fit(t,e,r,n,{spatialMaps:i}){return new Promise(a=>{let s=Ve("body").append("div").attr("id","cy").attr("style","display:none"),l=fl({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${Mi("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${Mi("padding")}px`}}]});s.remove(),lit(r,l),ait(t,l),sit(e,l),cit(n,l);let u=uit(i),h=hit(i),f=l.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(d){let[p,m]=d.connectedNodes(),{parent:g}=Vf(p),{parent:y}=Vf(m);return g===y?1.5*Mi("iconSize"):.5*Mi("iconSize")},edgeElasticity(d){let[p,m]=d.connectedNodes(),{parent:g}=Vf(p),{parent:y}=Vf(m);return g===y?.45:.001},alignmentConstraint:u,relativePlacementConstraint:h});f.one("layoutstop",()=>{function d(p,m,g,y){let v,x,{x:b,y:w}=p,{x:_,y:T}=m;x=(y-w+(b-g)*(w-T)/(b-_))/Math.sqrt(1+Math.pow((w-T)/(b-_),2)),v=Math.sqrt(Math.pow(y-w,2)+Math.pow(g-b,2)-Math.pow(x,2));let E=Math.sqrt(Math.pow(_-b,2)+Math.pow(T-w,2));v=v/E;let L=(_-b)*(y-w)-(T-w)*(g-b);switch(!0){case L>=0:L=1;break;case L<0:L=-1;break}let S=(_-b)*(g-b)+(T-w)*(y-w);switch(!0){case S>=0:S=1;break;case S<0:S=-1;break}return x=Math.abs(x)*L,v=v*S,{distances:x,weights:v}}o(d,"getSegmentWeights"),l.startBatch();for(let p of Object.values(l.edges()))if(p.data?.()){let{x:m,y:g}=p.source().position(),{x:y,y:v}=p.target().position();if(m!==y&&g!==v){let x=p.sourceEndpoint(),b=p.targetEndpoint(),{sourceDir:w}=mS(p),[_,T]=nu(w)?[x.x,b.y]:[b.x,x.y],{weights:E,distances:L}=d(x,b,_,T);p.style("segment-distances",L),p.style("segment-weights",E)}}l.endBatch(),f.run()}),f.run(),l.ready(d=>{Y.info("Ready",d),a(l)})})}var f2e,dit,d2e,p2e=M(()=>{"use strict";su();SB();f2e=Ji(s2e(),1);pr();ut();eh();ai();Rb();yF();gS();h2e();Xb([{name:ap.prefix,icons:ap}]);fl.use(f2e.default);o(ait,"addServices");o(sit,"addJunctions");o(oit,"positionNodes");o(lit,"addGroups");o(cit,"addEdges");o(uit,"getAlignments");o(hit,"getRelativeConstraints");o(fit,"layoutArchitecture");dit=o(async(t,e,r,n)=>{let i=n.db,a=i.getServices(),s=i.getJunctions(),l=i.getGroups(),u=i.getEdges(),h=i.getDataStructures(),f=Va(e),d=f.append("g");d.attr("class","architecture-edges");let p=f.append("g");p.attr("class","architecture-services");let m=f.append("g");m.attr("class","architecture-groups"),await c2e(i,p,a),u2e(i,p,s);let g=await fit(a,s,l,u,h);await o2e(d,g),await l2e(m,g),oit(i,g),Io(void 0,f,Mi("padding"),Mi("useMaxWidth"))},"draw"),d2e={draw:dit}});var m2e={};vr(m2e,{diagram:()=>pit});var pit,g2e=M(()=>{"use strict";n2e();Rb();a2e();p2e();pit={parser:r2e,db:ip,renderer:d2e,styles:i2e}});var eat={};vr(eat,{default:()=>Jit});su();GS();Zf();var VX="c4",PCe=o(t=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),BCe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>($X(),GX));return{id:VX,diagram:t}},"loader"),FCe={id:VX,detector:PCe,loader:BCe},UX=FCe;var Yie="flowchart",UOe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(t),"detector"),HOe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ET(),kT));return{id:Yie,diagram:t}},"loader"),WOe={id:Yie,detector:UOe,loader:HOe},qie=WOe;var Xie="flowchart-v2",YOe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(t)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(t)),"detector"),qOe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ET(),kT));return{id:Xie,diagram:t}},"loader"),XOe={id:Xie,detector:YOe,loader:qOe},jie=XOe;var Eae="er",kPe=o(t=>/^\s*erDiagram/.test(t),"detector"),EPe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(kae(),Tae));return{id:Eae,diagram:t}},"loader"),SPe={id:Eae,detector:kPe,loader:EPe},Sae=SPe;var Oue="gitGraph",jGe=o(t=>/^\s*gitGraph/.test(t),"detector"),KGe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Iue(),Mue));return{id:Oue,diagram:t}},"loader"),QGe={id:Oue,detector:jGe,loader:KGe},Pue=QGe;var fhe="gantt",F$e=o(t=>/^\s*gantt/.test(t),"detector"),z$e=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(hhe(),uhe));return{id:fhe,diagram:t}},"loader"),G$e={id:fhe,detector:F$e,loader:z$e},dhe=G$e;var The="info",Y$e=o(t=>/^\s*info/.test(t),"detector"),q$e=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(whe(),bhe));return{id:The,diagram:t}},"loader"),khe={id:The,detector:Y$e,loader:q$e};var Mhe="pie",sVe=o(t=>/^\s*pie/.test(t),"detector"),oVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Rhe(),Nhe));return{id:Mhe,diagram:t}},"loader"),Ihe={id:Mhe,detector:sVe,loader:oVe};var qhe="quadrantChart",SVe=o(t=>/^\s*quadrantChart/.test(t),"detector"),CVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Yhe(),Whe));return{id:qhe,diagram:t}},"loader"),AVe={id:qhe,detector:SVe,loader:CVe},Xhe=AVe;var wfe="xychart",UVe=o(t=>/^\s*xychart-beta/.test(t),"detector"),HVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(bfe(),xfe));return{id:wfe,diagram:t}},"loader"),WVe={id:wfe,detector:UVe,loader:HVe},Tfe=WVe;var Ffe="requirement",xUe=o(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),bUe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Bfe(),Pfe));return{id:Ffe,diagram:t}},"loader"),wUe={id:Ffe,detector:xUe,loader:bUe},zfe=wUe;var fde="sequence",EHe=o(t=>/^\s*sequenceDiagram/.test(t),"detector"),SHe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(hde(),ude));return{id:fde,diagram:t}},"loader"),CHe={id:fde,detector:EHe,loader:SHe},dde=CHe;var Cde="class",iWe=o((t,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(t),"detector"),aWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Sde(),Ede));return{id:Cde,diagram:t}},"loader"),sWe={id:Cde,detector:iWe,loader:aWe},Ade=sWe;var Dde="classDiagram",lWe=o((t,e)=>/^\s*classDiagram/.test(t)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(t),"detector"),cWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Lde(),_de));return{id:Dde,diagram:t}},"loader"),uWe={id:Dde,detector:lWe,loader:cWe},Nde=uWe;var T0e="state",aYe=o((t,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(t),"detector"),sYe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(w0e(),b0e));return{id:T0e,diagram:t}},"loader"),oYe={id:T0e,detector:aYe,loader:sYe},k0e=oYe;var C0e="stateDiagram",cYe=o((t,e)=>!!(/^\s*stateDiagram-v2/.test(t)||/^\s*stateDiagram/.test(t)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),uYe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(S0e(),E0e));return{id:C0e,diagram:t}},"loader"),hYe={id:C0e,detector:cYe,loader:uYe},A0e=hYe;var U0e="journey",RYe=o(t=>/^\s*journey/.test(t),"detector"),MYe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(V0e(),$0e));return{id:U0e,diagram:t}},"loader"),IYe={id:U0e,detector:RYe,loader:MYe},H0e=IYe;ut();eh();ai();var OYe=o((t,e,r)=>{Y.debug(`rendering svg for syntax error +`);let n=Va(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),Zr(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw"),xP={draw:OYe},W0e=xP;var PYe={db:{},renderer:xP,parser:{parse:o(()=>{},"parse")}},Y0e=PYe;var q0e="flowchart-elk",BYe=o((t,e={})=>/^\s*flowchart-elk/.test(t)||/^\s*flowchart|graph/.test(t)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),FYe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ET(),kT));return{id:q0e,diagram:t}},"loader"),zYe={id:q0e,detector:BYe,loader:FYe},X0e=zYe;var bpe="timeline",iqe=o(t=>/^\s*timeline/.test(t),"detector"),aqe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(xpe(),vpe));return{id:bpe,diagram:t}},"loader"),sqe={id:bpe,detector:iqe,loader:aqe},wpe=sqe;var z1e="mindmap",ptt=o(t=>/^\s*mindmap/.test(t),"detector"),mtt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(F1e(),B1e));return{id:z1e,diagram:t}},"loader"),gtt={id:z1e,detector:ptt,loader:mtt},G1e=gtt;var Z1e="kanban",Rtt=o(t=>/^\s*kanban/.test(t),"detector"),Mtt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Q1e(),K1e));return{id:Z1e,diagram:t}},"loader"),Itt={id:Z1e,detector:Rtt,loader:Mtt},J1e=Itt;var Rye="sankey",rrt=o(t=>/^\s*sankey-beta/.test(t),"detector"),nrt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Nye(),Dye));return{id:Rye,diagram:t}},"loader"),irt={id:Rye,detector:rrt,loader:nrt},Mye=irt;var Uye="packet",yrt=o(t=>/^\s*packet-beta/.test(t),"detector"),vrt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Vye(),$ye));return{id:Uye,diagram:t}},"loader"),Hye={id:Uye,detector:yrt,loader:vrt};var qve="block",znt=o(t=>/^\s*block-beta/.test(t),"detector"),Gnt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Yve(),Wve));return{id:qve,diagram:t}},"loader"),$nt={id:qve,detector:znt,loader:Gnt},Xve=$nt;var y2e="architecture",mit=o(t=>/^\s*architecture/.test(t),"detector"),git=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(g2e(),m2e));return{id:y2e,diagram:t}},"loader"),yit={id:y2e,detector:mit,loader:git},v2e=yit;Zf();Vt();var x2e=!1,z1=o(()=>{x2e||(x2e=!0,od("error",Y0e,t=>t.toLowerCase().trim()==="error"),od("---",{db:{clear:o(()=>{},"clear")},styles:{},renderer:{draw:o(()=>{},"draw")},parser:{parse:o(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:o(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),Zb(UX,J1e,Nde,Ade,Sae,dhe,khe,Ihe,zfe,dde,X0e,jie,qie,G1e,wpe,Pue,A0e,k0e,H0e,Xhe,Mye,Hye,Tfe,Xve,v2e))},"addDiagrams");ut();Zf();Vt();var b2e=o(async()=>{Y.debug("Loading registered diagrams");let e=(await Promise.allSettled(Object.entries(Qf).map(async([r,{detector:n,loader:i}])=>{if(i)try{by(r)}catch{try{let{diagram:a,id:s}=await i();od(s,a,n)}catch(a){throw Y.error(`Failed to load external diagram with key ${r}. Removing from detectors.`),delete Qf[r],a}}}))).filter(r=>r.status==="rejected");if(e.length>0){Y.error(`Failed to load ${e.length} external diagrams`);for(let r of e)Y.error(r);throw new Error(`Failed to load ${e.length} external diagrams`)}},"loadRegisteredDiagrams");ut();pr();var yS="comm",vS="rule",xS="decl";var w2e="@import";var T2e="@keyframes";var k2e="@layer";var vF=Math.abs,Pb=String.fromCharCode;function bS(t){return t.trim()}o(bS,"trim");function Bb(t,e,r){return t.replace(e,r)}o(Bb,"replace");function E2e(t,e,r){return t.indexOf(e,r)}o(E2e,"indexof");function sp(t,e){return t.charCodeAt(e)|0}o(sp,"charat");function Uf(t,e,r){return t.slice(e,r)}o(Uf,"substr");function Eo(t){return t.length}o(Eo,"strlen");function S2e(t){return t.length}o(S2e,"sizeof");function G1(t,e){return e.push(t),t}o(G1,"append");var wS=1,$1=1,C2e=0,pl=0,Ii=0,U1="";function TS(t,e,r,n,i,a,s,l){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:wS,column:$1,length:s,return:"",siblings:l}}o(TS,"node");function A2e(){return Ii}o(A2e,"char");function _2e(){return Ii=pl>0?sp(U1,--pl):0,$1--,Ii===10&&($1=1,wS--),Ii}o(_2e,"prev");function ml(){return Ii=pl2||V1(Ii)>3?"":" "}o(N2e,"whitespace");function R2e(t,e){for(;--e&&ml()&&!(Ii<48||Ii>102||Ii>57&&Ii<65||Ii>70&&Ii<97););return kS(t,Fb()+(e<6&&ch()==32&&ml()==32))}o(R2e,"escaping");function xF(t){for(;ml();)switch(Ii){case t:return pl;case 34:case 39:t!==34&&t!==39&&xF(Ii);break;case 40:t===41&&xF(t);break;case 92:ml();break}return pl}o(xF,"delimiter");function M2e(t,e){for(;ml()&&t+Ii!==57;)if(t+Ii===84&&ch()===47)break;return"/*"+kS(e,pl-1)+"*"+Pb(t===47?t:ml())}o(M2e,"commenter");function I2e(t){for(;!V1(ch());)ml();return kS(t,pl)}o(I2e,"identifier");function B2e(t){return D2e(SS("",null,null,null,[""],t=L2e(t),0,[0],t))}o(B2e,"compile");function SS(t,e,r,n,i,a,s,l,u){for(var h=0,f=0,d=s,p=0,m=0,g=0,y=1,v=1,x=1,b=0,w="",_=i,T=a,E=n,L=w;v;)switch(g=b,b=ml()){case 40:if(g!=108&&sp(L,d-1)==58){E2e(L+=Bb(ES(b),"&","&\f"),"&\f",vF(h?l[h-1]:0))!=-1&&(x=-1);break}case 34:case 39:case 91:L+=ES(b);break;case 9:case 10:case 13:case 32:L+=N2e(g);break;case 92:L+=R2e(Fb()-1,7);continue;case 47:switch(ch()){case 42:case 47:G1(vit(M2e(ml(),Fb()),e,r,u),u),(V1(g||1)==5||V1(ch()||1)==5)&&Eo(L)&&Uf(L,-1,void 0)!==" "&&(L+=" ");break;default:L+="/"}break;case 123*y:l[h++]=Eo(L)*x;case 125*y:case 59:case 0:switch(b){case 0:case 125:v=0;case 59+f:x==-1&&(L=Bb(L,/\f/g,"")),m>0&&(Eo(L)-d||y===0&&g===47)&&G1(m>32?P2e(L+";",n,r,d-1,u):P2e(Bb(L," ","")+";",n,r,d-2,u),u);break;case 59:L+=";";default:if(G1(E=O2e(L,e,r,h,f,i,l,w,_=[],T=[],d,a),a),b===123)if(f===0)SS(L,e,E,E,_,a,d,l,T);else switch(p===99&&sp(L,3)===110?100:p){case 100:case 108:case 109:case 115:SS(t,E,E,n&&G1(O2e(t,E,E,0,0,i,l,w,i,_=[],d,T),T),i,T,d,l,n?_:T);break;default:SS(L,E,E,E,[""],T,0,l,T)}}h=f=m=0,y=x=1,w=L="",d=s;break;case 58:d=1+Eo(L),m=g;default:if(y<1){if(b==123)--y;else if(b==125&&y++==0&&_2e()==125)continue}switch(L+=Pb(b),b*y){case 38:x=f>0?1:(L+="\f",-1);break;case 44:l[h++]=(Eo(L)-1)*x,x=1;break;case 64:ch()===45&&(L+=ES(ml())),p=ch(),f=d=Eo(w=L+=I2e(Fb())),b++;break;case 45:g===45&&Eo(L)==2&&(y=0)}}return a}o(SS,"parse");function O2e(t,e,r,n,i,a,s,l,u,h,f,d){for(var p=i-1,m=i===0?a:[""],g=S2e(m),y=0,v=0,x=0;y0?m[b]+" "+w:Bb(w,/&\f/g,m[b])))&&(u[x++]=_);return TS(t,e,r,i===0?vS:l,u,h,f,d)}o(O2e,"ruleset");function vit(t,e,r,n){return TS(t,e,r,yS,Pb(A2e()),Uf(t,2,-2),0,n)}o(vit,"comment");function P2e(t,e,r,n,i){return TS(t,e,r,xS,Uf(t,0,n),Uf(t,n+1,-1),n,i)}o(P2e,"declaration");function CS(t,e){for(var r="",n=0;n{$2e.forEach(t=>{t()}),$2e=[]},"attachFunctions");ut();var U2e=o(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");Qb();ew();function H2e(t){let e=t.match(Kb);if(!e)return{text:t,metadata:{}};let r=Sm(e[1],{schema:Em})??{};r=typeof r=="object"&&!Array.isArray(r)?r:{};let n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}o(H2e,"extractFrontMatter");hr();var bit=o(t=>t.replace(/\r\n?/g,` +`).replace(/<(\w+)([^>]*)>/g,(e,r,n)=>"<"+r+n.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),wit=o(t=>{let{text:e,metadata:r}=H2e(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),Tit=o(t=>{let e=Ut.detectInit(t)??{},r=Ut.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:n})=>n==="wrap"):r?.type==="wrap"&&(e.wrap=!0),{text:LX(t),directive:e}},"processDirectives");function bF(t){let e=bit(t),r=wit(e),n=Tit(r.text),i=Ds(r.config,n.directive);return t=U2e(n.text),{code:t,title:r.title,config:i}}o(bF,"preprocessDiagram");JC();a4();hr();function W2e(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCodePoint(n)).join("");return btoa(r)}o(W2e,"toBase64");var kit=5e4,Eit="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",Sit="sandbox",Cit="loose",Ait="http://www.w3.org/2000/svg",_it="http://www.w3.org/1999/xlink",Lit="http://www.w3.org/1999/xhtml",Dit="100%",Nit="100%",Rit="border:0;margin:0;",Mit="margin:0",Iit="allow-top-navigation-by-user-activation allow-popups",Oit='The "iframe" tag is not supported by your browser.',Pit=["foreignobject"],Bit=["dominant-baseline"];function K2e(t){let e=bF(t);return ly(),eG(e.config??{}),e}o(K2e,"processAndSetConfigs");async function Fit(t,e){z1();try{let{code:r,config:n}=K2e(t);return{diagramType:(await Q2e(r)).type,config:n}}catch(r){if(e?.suppressErrors)return!1;throw r}}o(Fit,"parse");var Y2e=o((t,e,r=[])=>` +.${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),zit=o((t,e=new Map)=>{let r="";if(t.themeCSS!==void 0&&(r+=` +${t.themeCSS}`),t.fontFamily!==void 0&&(r+=` +:root { --mermaid-font-family: ${t.fontFamily}}`),t.altFontFamily!==void 0&&(r+=` +:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){let s=t.htmlLabels??t.flowchart?.htmlLabels?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(l=>{cr(l.styles)||s.forEach(u=>{r+=Y2e(l.id,u,l.styles)}),cr(l.textStyles)||(r+=Y2e(l.id,"tspan",(l?.textStyles||[]).map(u=>u.replace("color","fill"))))})}return r},"createCssStyles"),Git=o((t,e,r,n)=>{let i=zit(t,r),a=O$(e,i,t.themeVariables);return CS(B2e(`${n}{${a}}`),F2e)},"createUserStyles"),$it=o((t="",e,r)=>{let n=t;return!r&&!e&&(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=Ma(n),n=n.replace(/
    /g,"
    "),n},"cleanUpSvgCode"),Vit=o((t="",e)=>{let r=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":Nit,n=W2e(`${t}`);return``},"putIntoIFrame"),q2e=o((t,e,r,n,i)=>{let a=t.append("div");a.attr("id",r),n&&a.attr("style",n);let s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns",Ait);return i&&s.attr("xmlns:xlink",i),s.append("g"),t},"appendDivSvgG");function X2e(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}o(X2e,"sandboxedIframe");var Uit=o((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),Hit=o(async function(t,e,r){z1();let n=K2e(e);e=n.code;let i=Cr();Y.debug(i),e.length>(i?.maxTextSize??kit)&&(e=Eit);let a="#"+t,s="i"+t,l="#"+s,u="d"+t,h="#"+u,f=o(()=>{let R=Ve(p?l:h).node();R&&"remove"in R&&R.remove()},"removeTempElements"),d=Ve("body"),p=i.securityLevel===Sit,m=i.securityLevel===Cit,g=i.fontFamily;if(r!==void 0){if(r&&(r.innerHTML=""),p){let k=X2e(Ve(r),s);d=Ve(k.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=Ve(r);q2e(d,t,u,`font-family: ${g}`,_it)}else{if(Uit(document,t,u,s),p){let k=X2e(Ve("body"),s);d=Ve(k.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=Ve("body");q2e(d,t,u)}let y,v;try{y=await H1.fromText(e,{title:n.title})}catch(k){if(i.suppressErrorRendering)throw f(),k;y=await H1.fromText("error"),v=k}let x=d.select(h).node(),b=y.type,w=x.firstChild,_=w.firstChild,T=y.renderer.getClasses?.(e,y),E=Git(i,b,T,a),L=document.createElement("style");L.innerHTML=E,w.insertBefore(L,_);try{await y.renderer.draw(e,t,_x,y)}catch(k){throw i.suppressErrorRendering?f():W0e.draw(e,t,_x),k}let S=d.select(`${h} svg`),A=y.db.getAccTitle?.(),I=y.db.getAccDescription?.();Yit(b,S,A,I),d.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",Lit);let D=d.select(h).node().innerHTML;if(Y.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),D=$it(D,p,xr(i.arrowMarkerAbsolute)),p){let k=d.select(h+" svg").node();D=Vit(D,k)}else m||(D=j2e.default.sanitize(D,{ADD_TAGS:Pit,ADD_ATTR:Bit}));if(V2e(),v)throw v;return f(),{diagramType:b,svg:D,bindFunctions:y.db.bindFunctions}},"render");function Wit(t={}){let e=Vn({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),Qz(e),e?.theme&&e.theme in Do?e.themeVariables=Do[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=Do.default.getThemeVariables(e.themeVariables));let r=typeof e=="object"?iC(e):aC();J1(r.logLevel),z1()}o(Wit,"initialize");var Q2e=o((t,e={})=>{let{code:r}=bF(t);return H1.fromText(r,e)},"getDiagramFromText");function Yit(t,e,r,n){z2e(e,t),G2e(e,r,n,e.attr("id"))}o(Yit,"addA11yInfo");var Hf=Object.freeze({render:Hit,parse:Fit,getDiagramFromText:Q2e,initialize:Wit,getConfig:Cr,setConfig:o4,getSiteConfig:aC,updateSiteConfig:Zz,reset:o(()=>{ly()},"reset"),globalReset:o(()=>{ly(ph)},"globalReset"),defaultConfig:ph});J1(Cr().logLevel);ly(Cr());Jv();hr();var qit=o((t,e,r)=>{Y.warn(t),s9(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),Z2e=o(async function(t={querySelector:".mermaid"}){try{await Xit(t)}catch(e){if(s9(e)&&Y.error(e.str),uh.parseError&&uh.parseError(e),!t.suppressErrors)throw Y.error("Use the suppressErrors option to suppress these errors"),e}},"run"),Xit=o(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){let n=Hf.getConfig();Y.debug(`${t?"":"No "}Callback function found`);let i;if(r)i=r;else if(e)i=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");Y.debug(`Found ${i.length} diagrams`),n?.startOnLoad!==void 0&&(Y.debug("Start On Load: "+n?.startOnLoad),Hf.updateSiteConfig({startOnLoad:n?.startOnLoad}));let a=new Ut.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed),s,l=[];for(let u of Array.from(i)){Y.info("Rendering diagram: "+u.id);if(u.getAttribute("data-processed"))continue;u.setAttribute("data-processed","true");let h=`mermaid-${a.next()}`;s=u.innerHTML,s=jb(Ut.entityDecode(s)).trim().replace(//gi,"
    ");let f=Ut.detectInit(s);f&&Y.debug("Detected early reinit: ",f);try{let{svg:d,bindFunctions:p}=await rxe(h,s,u);u.innerHTML=d,t&&await t(h),p&&p(u)}catch(d){qit(d,l,uh.parseError)}}if(l.length>0)throw l[0]},"runThrowsErrors"),J2e=o(function(t){Hf.initialize(t)},"initialize"),jit=o(async function(t,e,r){Y.warn("mermaid.init is deprecated. Please use run instead."),t&&J2e(t);let n={postRenderCallback:r,querySelector:".mermaid"};typeof e=="string"?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await Z2e(n)},"init"),Kit=o(async(t,{lazyLoad:e=!0}={})=>{z1(),Zb(...t),e===!1&&await b2e()},"registerExternalDiagrams"),exe=o(function(){if(uh.startOnLoad){let{startOnLoad:t}=Hf.getConfig();t&&uh.run().catch(e=>Y.error("Mermaid failed to initialize",e))}},"contentLoaded");if(typeof document<"u"){window.addEventListener("load",exe,!1)}var Qit=o(function(t){uh.parseError=t},"setParseErrorHandler"),AS=[],wF=!1,txe=o(async()=>{if(!wF){for(wF=!0;AS.length>0;){let t=AS.shift();if(t)try{await t()}catch(e){Y.error("Error executing queue",e)}}wF=!1}},"executeQueue"),Zit=o(async(t,e)=>new Promise((r,n)=>{let i=o(()=>new Promise((a,s)=>{Hf.parse(t,e).then(l=>{a(l),r(l)},l=>{Y.error("Error parsing",l),uh.parseError?.(l),s(l),n(l)})}),"performCall");AS.push(i),txe().catch(n)}),"parse"),rxe=o((t,e,r)=>new Promise((n,i)=>{let a=o(()=>new Promise((s,l)=>{Hf.render(t,e,r).then(u=>{s(u),n(u)},u=>{Y.error("Error parsing",u),uh.parseError?.(u),l(u),i(u)})}),"performCall");AS.push(a),txe().catch(i)}),"render"),uh={startOnLoad:!0,mermaidAPI:Hf,parse:Zit,render:rxe,init:jit,run:Z2e,registerExternalDiagrams:Kit,registerLayoutLoaders:_D,initialize:J2e,parseError:void 0,contentLoaded:exe,setParseErrorHandler:Qit,detectType:mp,registerIconPacks:Xb},Jit=uh;return cxe(eat);})(); +/*! Check if previously processed */ +/*! + * Wait for document loaded before starting the execution + */ +/*! Bundled license information: + +dompurify/dist/purify.js: + (*! @license DOMPurify 3.1.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.6/LICENSE *) + +js-yaml/dist/js-yaml.mjs: + (*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *) + +lodash-es/lodash.js: + (** + * @license + * Lodash (Custom Build) + * Build: `lodash modularize exports="es" -o ./` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + *) + +cytoscape/dist/cytoscape.esm.mjs: + (*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + *) + (*! + Event object based on jQuery events, MIT license + + https://jquery.org/license/ + https://tldrlegal.com/license/mit-license + https://github.com/jquery/jquery/blob/master/src/event.js + *) + (*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License *) + (*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License *) +*/ +globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default; diff --git a/docs/libs/python.min.js b/docs/libs/python.min.js new file mode 100644 index 0000000..2f53bd3 --- /dev/null +++ b/docs/libs/python.min.js @@ -0,0 +1,42 @@ +/*! `python` grammar compiled for Highlight.js 11.10.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,s=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:t,illegal:/#/},l={begin:/\{\{/,relevance:0},o={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},b="[0-9](_?[0-9])*",c=`(\\b(${b}))?\\.(${b})|\\b(${b})\\.`,d="\\b|"+s.join("|"),g={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${b})|(${c}))[eE][+-]?(${b})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${b})[jJ](?=${d})` +}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:t, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t, +contains:["self",i,g,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,g,i],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t, +illegal:/(<\/|\?)|=>/,contains:[i,g,{scope:"variable.language",match:/\bself\b/ +},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword" +},o,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{1:"keyword", +3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,o]}]}}})() +;hljs.registerLanguage("python",e)})(); \ No newline at end of file