ggn-layout 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +106 -0
- package/LICENSE +36 -0
- package/LICENSES/EPL-2.0.txt +80 -0
- package/README.md +93 -2
- package/THIRD_PARTY_NOTICES.md +69 -0
- package/dist/algorithms-CndAU_xu.js +10 -0
- package/dist/algorithms-gBJvJ1vu.cjs +10 -0
- package/dist/api/index.cjs +10 -0
- package/dist/api/index.d.cts +13 -0
- package/dist/api/index.d.ts +13 -0
- package/dist/api/index.js +10 -0
- package/dist/api/layered.cjs +10 -0
- package/dist/api/layered.d.cts +12 -0
- package/dist/api/layered.d.ts +12 -0
- package/dist/api/layered.js +10 -0
- package/dist/api-CJOvh1wF.js +13 -0
- package/dist/api-D6wZ8K92.cjs +13 -0
- package/dist/elk-json-Bli8UvHo.js +10 -0
- package/dist/elk-json-Cf5biFF7.d.cts +604 -0
- package/dist/elk-json-Cf5biFF7.d.ts +604 -0
- package/dist/elk-json-Ow0_ujWC.cjs +10 -0
- package/dist/index-9-rJw6UF.d.cts +133 -0
- package/dist/index-CC3PKvJ0.d.ts +133 -0
- package/dist/index.cjs +10 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +10 -0
- package/dist/internal-CbM3qPZx.d.ts +351 -0
- package/dist/internal-TOWD-Rww.d.cts +351 -0
- package/dist/internal.cjs +10 -0
- package/dist/internal.d.cts +13 -0
- package/dist/internal.d.ts +13 -0
- package/dist/internal.js +10 -0
- package/dist/layered-options-BsoOG6Wx.d.ts +15 -0
- package/dist/layered-options-CJRS7cIk.d.cts +15 -0
- package/dist/layout-worker.cjs +10 -0
- package/dist/layout-worker.d.cts +16 -0
- package/dist/layout-worker.d.ts +16 -0
- package/dist/layout-worker.js +10 -0
- package/dist/options.cjs +10 -0
- package/dist/options.d.cts +25 -0
- package/dist/options.d.ts +25 -0
- package/dist/options.js +10 -0
- package/dist/validate-CcKdG1RG.d.cts +71 -0
- package/dist/validate-CcKdG1RG.d.ts +71 -0
- package/docs/API-QUICKREF.md +66 -0
- package/docs/API.md +159 -0
- package/docs/reference/README.md +20 -0
- package/docs/reference/elk-algorithm-catalog.md +153 -0
- package/docs/reference/elk-algorithm-guide.md +160 -0
- package/docs/reference/elk-edge-routing-investigation.md +212 -0
- package/docs/reference/elk-json-format.md +119 -0
- package/docs/reference/elk-layout-options-mechanism.md +103 -0
- package/docs/reference/elk-layout-options.md +300 -0
- package/docs/reference/elk-node-labels.md +69 -0
- package/docs/reference/elk-spacing-options.md +93 -0
- package/docs/reference/elkjs-feature-coverage.md +99 -0
- package/examples/basic.ts +14 -0
- package/examples/coords-modes.ts +23 -0
- package/examples/nested.ts +21 -0
- package/llms.txt +29 -0
- package/package.json +166 -4
- package/src/api/layout-input.schema.json +165 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
本文件记录 `ggn-layout` 面向使用者的变更。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
|
4
|
+
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)(0.x 期间仍可能出 breaking change,会在下方标注)。
|
|
5
|
+
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [0.1.1]
|
|
9
|
+
|
|
10
|
+
### 变更
|
|
11
|
+
|
|
12
|
+
- **许可口径修正**:`package.json` 的 `license` 由 `MIT` 改为 `(MIT AND EPL-2.0)`。本包是
|
|
13
|
+
ELK 的衍生作品,此前只标 MIT 与事实不符。落地方式:`src/**` 与 `shared/**` 的全部 315 个
|
|
14
|
+
`.ts` 文件统一加 `SPDX-License-Identifier: EPL-2.0` 头 + ELK 归属行(**不再逐文件混标** ——
|
|
15
|
+
首版整改把 `src/api/**` 一律当 GGN 自有标 MIT,其中 `src/api/core-providers.ts` 实为 ELK
|
|
16
|
+
`org.eclipse.elk.core.util` 的 fixed/random/box provider 移植,属错标);`dist` 每个产物加
|
|
17
|
+
归属 banner;`LICENSE`、`README.md`、`THIRD_PARTY_NOTICES.md` 与 `package.json` 统一到同一口径;
|
|
18
|
+
新增 `check:license` 门禁(源码 SPDX 头 + 非 `.ts` 文件登记 + dist banner + 四份口径文件一致性)
|
|
19
|
+
并接入 CI 与 `prepublishOnly`。
|
|
20
|
+
- 补齐 EPL-2.0 的源码可得性与归属义务:`THIRD_PARTY_NOTICES.md` 增加 §3.1(a) 源码可得性声明
|
|
21
|
+
(每个发布 tag 的对应源码以 EPL-2.0 提供于本仓),不再只指向上游 `eclipse/elk`;并停止把
|
|
22
|
+
294 个文件的上游版权年代统一改写成 `2010, 2015`(上游逐文件不同),改为声明持有人 + 来源登记。
|
|
23
|
+
- 补 `shared/**` 的归属登记与门禁覆盖:`shared/elkgraph-builder.ts`(ELK `ElkGraphImporter` /
|
|
24
|
+
`LGraphUtil` 建图逻辑移植)此前既无 SPDX 头也不在 CI 扫描范围内,而它确实进入发布产物。
|
|
25
|
+
- **发布链路加固(复审整改)**:
|
|
26
|
+
- npm 工具链固定为 `NPM_VERSION`(CI 与 `release.yml` 同步),不再用浮动 `npm@latest` ——
|
|
27
|
+
发布 job 持有 `id-token` / `contents` 写权限,工具链必须可复现。
|
|
28
|
+
- 「版本已发布则跳过 publish」的分支新增一致性校验:registry 记录的 `gitHead` 必须等于当前
|
|
29
|
+
提交,否则拒绝创建 GitHub Release,避免产出与 npm 内容不符的发布记录。
|
|
30
|
+
- `concurrency.group` 由 `github.ref` 改为 `github.repository`:tag push 与 main 上的
|
|
31
|
+
`workflow_dispatch` 属于不同 ref,原先可能并发发布同一版本。
|
|
32
|
+
- 仓库侧配套:`v*` tag 加 ruleset(禁移动/删除)、开启 `sha_pinning_required`、
|
|
33
|
+
`npm` environment 增加必审 reviewer 与分支策略(`main` + `v*`)。
|
|
34
|
+
- **随包文档清理与门禁**:`docs/reference/**` 中残留的宿主 monorepo 内部路径与开发者本机
|
|
35
|
+
绝对路径改为中性表述(如「宿主应用」、`<input.json>`);`check:doc-links` 增加这两类
|
|
36
|
+
模式的门禁(具体匹配规则写在脚本里),防止再次混进 npm 包。
|
|
37
|
+
- 治理文件补齐:新增 feature request issue 模板与 `config.yml`;`CONTRIBUTING.md` 的发布说明
|
|
38
|
+
改写为与 `release.yml` 实际行为一致,并写明 Trusted Publisher 的登记项与 dry-run 的能力边界
|
|
39
|
+
(dry-run 不校验 OIDC 绑定、不产生 attestation)。
|
|
40
|
+
- 发布工程加固:`prepublishOnly` 末尾追加打包产物冒烟(`smoke:pack`);显式声明
|
|
41
|
+
`publishConfig`(`registry=https://registry.npmjs.org/`、`access=public`);CI 中的
|
|
42
|
+
`publint` 与 `@arethetypeswrong/cli` 锁定到具体版本。
|
|
43
|
+
- 第三方许可声明补全:`THIRD_PARTY_NOTICES.md` 增加 ELK 版权归属、SPDX 标识
|
|
44
|
+
(`EPL-2.0 OR GPL-3.0-or-later`)与 `elkt` 测试数据的来源与版权。
|
|
45
|
+
- CI/发布链路加固:GitHub Actions 由可变 tag 改为 **pin commit SHA**;`prepublishOnly`
|
|
46
|
+
追加 `check:pkg`(`publint` + 严格版类型解析门禁),手工发布不再绕过包元数据检查。
|
|
47
|
+
- 类型解析门禁改为 `scripts/check-attw.mjs`:只豁免 `node10`(EOL)列的 `NoResolution`,
|
|
48
|
+
此前用 `--ignore-rules no-resolution` 属于整体抑制,会让真实子路径错误一并变绿。
|
|
49
|
+
- 补齐仓库治理文件:`SECURITY.md`(私密漏洞上报 + 威胁模型)、`CONTRIBUTING.md`、
|
|
50
|
+
`.github/CODEOWNERS`、PR 模板与 Bug issue 模板。
|
|
51
|
+
- 修复随包文档的 14 处包内断链:`docs/reference/**` 的 `../README.md` 实际指向不存在的
|
|
52
|
+
`docs/README.md`(改为 `../../README.md`)、`../docs/API.md` 改为 `../API.md`、两个指向本仓不存在的
|
|
53
|
+
`docs/design/*` 的链接改为纯文本、README 里的 `release.yml` 改为绝对 GitHub URL。
|
|
54
|
+
新增 `check:docs` 门禁:以 `npm pack` 的真实清单校验随包文档的相对链接,防止回归。
|
|
55
|
+
- **修复发布链路阻断缺陷**:`npm pack --json` 在 npm 12 由**数组**改为**按包名索引的对象**,
|
|
56
|
+
而 `smoke:pack` 仍按数组解构,导致 `release.yml`(Node 24 + `npm@latest`)在冒烟步骤直接失败。
|
|
57
|
+
新增 `scripts/npm-utils.mjs` 的 `parsePackJson()` 归一化两种结构,并在 CI 增加 `pack-npm-latest` 作业用
|
|
58
|
+
「发布同款环境」复跑产物门禁,避免 CI 绿而 release 红。
|
|
59
|
+
- `release.yml` 的「该版本尚未发布」守卫改为只在真正发布时生效:`workflow_dispatch` 的
|
|
60
|
+
`dry-run` 现在能完整演练到 `npm publish --dry-run --provenance` 这一步。
|
|
61
|
+
- **修复 `npm publish` 下嵌套 npm 调用的环境泄漏**:npm 会把自身配置以 `npm_config_*` 注入子进程,
|
|
62
|
+
于是 `prepublishOnly` 里嵌套的 `npm pack` 在 `--dry-run` 下**静默不产出 tarball**,
|
|
63
|
+
连带 `smoke:pack` / `check:pkg` 失败。新增 `scripts/npm-utils.mjs` 的 `npmEnv()`
|
|
64
|
+
隔离 `npm_config_dry_run` / `npm_config_provenance` 后再嵌套调用 npm。
|
|
65
|
+
- **修复 `check:pkg` 的同类环境泄漏**:`check:pkg` 里裸写的 `npx --yes publint` 同样继承
|
|
66
|
+
`npm_config_dry_run=true`,导致 `npm publish --dry-run` 的 `prepublishOnly` 卡在
|
|
67
|
+
`ENOENT .../_npx/<hash>/package.json`(npx 只建目录不装包)。改为 `scripts/check-publint.mjs`,
|
|
68
|
+
与其余三处统一走 `npmEnv()`。
|
|
69
|
+
- **修复 `check:attw` 的 64 KiB 截断偶发**:Node 同步 spawn 在输出超过管道容量时可能截断 stdout,
|
|
70
|
+
attw 的 `--format json` 约 130 KB,实测 20 次挂 5 次且总是恰好截到 65536 字节。新增
|
|
71
|
+
`captureStdout()` 把子进程 stdout 直接重定向到文件、绕开管道,`check-attw` / `check-doc-links` /
|
|
72
|
+
`smoke:pack` 三处统一改用。
|
|
73
|
+
- **发布工作流不再因重复版本变红**:`release.yml` 探测到该版本已在 registry 时跳过 `npm publish`、
|
|
74
|
+
但仍创建 GitHub Release;`workflow_dispatch` 的 dry-run 改用一次性版本号
|
|
75
|
+
`0.0.0-dryrun.<run_id>` 演练,使演练可以真正跑完。
|
|
76
|
+
- 仓库清理:内部开发过程文档(`PROGRESS.md`、`AGENTS.md`、`plans/`、`docs/clusters/` 等)移出公开仓,
|
|
77
|
+
并清除文档里泄漏的本机绝对路径。`docs/PORTING.md`、`docs/reference/**`、`SKILL.md` 等
|
|
78
|
+
面向使用者/贡献者的文档保留。
|
|
79
|
+
|
|
80
|
+
## [0.1.0]
|
|
81
|
+
|
|
82
|
+
首个公开发布(从 GGN monorepo 拆出的独立包)。
|
|
83
|
+
|
|
84
|
+
### 新增
|
|
85
|
+
|
|
86
|
+
- `layoutElkJson(input, options?)`:标准图 JSON → 带节点几何与边 `sections` 的新 JSON;纯函数、默认 `randomSeed` 为 1。
|
|
87
|
+
- 复合能力:`layoutJsonBatch`(批量 + 逐项隔离)、`diffLayout` / `layoutJsonDiff`(布局差异)、
|
|
88
|
+
`control: { signal, onProgress }`(进度 + 合作式取消)。
|
|
89
|
+
- `responseFormat` 三档输出:`full` / `concise` / `summary`;`pick` 追加保留节点字段。
|
|
90
|
+
- 子路径入口:`ggn-layout/api`、`ggn-layout/core`、`ggn-layout/options`、`ggn-layout/layered`、`ggn-layout/layout-worker`;
|
|
91
|
+
每个入口提供 ESM + CJS 产物与各自的 `.d.ts`/`.d.cts`。
|
|
92
|
+
- `ggn-layout/layout-input.schema.json`:`LayoutInput` 的 JSON Schema (draft-07)。
|
|
93
|
+
- 结构化错误:`LayoutError` / `LayoutErrorCode` / `validateLayoutInput` / `assertValidLayoutInput`。
|
|
94
|
+
- 已移植 14 个 ELK Java 0.12.0 布局算法:layered(默认)+ box/fixed/random/stress/force/rectpacking/
|
|
95
|
+
topdownpacking/sporeoverlap/sporecompaction/radial/vertiflex/disco/mrtree(完整入口注册)。
|
|
96
|
+
|
|
97
|
+
### 说明
|
|
98
|
+
|
|
99
|
+
- 本包是 Eclipse Layout Kernel (ELK) Layered 的 TypeScript 1:1 移植;第三方许可与来源范围见
|
|
100
|
+
[`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md),EPL-2.0 全文见 [`LICENSES/EPL-2.0.txt`](LICENSES/EPL-2.0.txt)。
|
|
101
|
+
- 已知有意差异:为消除比较器不自洽导致的层内顺序跨 JS 引擎漂移,
|
|
102
|
+
`ModelOrderBarycenterHeuristic` 的传递关联记录方向与 ELK Java 相反(见 `docs/PORTING.md` §6.17)。
|
|
103
|
+
|
|
104
|
+
[Unreleased]: https://github.com/0xlxx/ggn-layout/compare/v0.1.0...HEAD
|
|
105
|
+
[0.1.1]: https://github.com/0xlxx/ggn-layout/compare/v0.1.0...v0.1.1
|
|
106
|
+
[0.1.0]: https://github.com/0xlxx/ggn-layout/releases/tag/v0.1.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
ggn-layout is distributed under the SPDX expression `(MIT AND EPL-2.0)`.
|
|
2
|
+
|
|
3
|
+
- Portions derived from the Eclipse Layout Kernel (ELK) -- every file under `src/` and
|
|
4
|
+
`shared/` -- are licensed under the Eclipse Public License 2.0 (EPL-2.0).
|
|
5
|
+
Full text: LICENSES/EPL-2.0.txt
|
|
6
|
+
- All other content (build/release engineering, documentation, examples, package metadata)
|
|
7
|
+
is licensed under the MIT License, whose full text follows below.
|
|
8
|
+
- EPL-2.0 source-availability statement: the Source Code Form corresponding to each
|
|
9
|
+
published release is available under EPL-2.0 in the source repository at
|
|
10
|
+
https://github.com/0xlxx/ggn-layout (tag `v<version>` of the release).
|
|
11
|
+
|
|
12
|
+
See THIRD_PARTY_NOTICES.md for the full attribution and the exact source range.
|
|
13
|
+
|
|
14
|
+
--------------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
MIT License
|
|
17
|
+
|
|
18
|
+
Copyright (c) 2026 GGN contributors
|
|
19
|
+
|
|
20
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
21
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
22
|
+
in the Software without restriction, including without limitation the rights
|
|
23
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
24
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
25
|
+
furnished to do so, subject to the following conditions:
|
|
26
|
+
|
|
27
|
+
The above copyright notice and this permission notice shall be included in all
|
|
28
|
+
copies or substantial portions of the Software.
|
|
29
|
+
|
|
30
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
31
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
32
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
33
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
34
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
35
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
36
|
+
SOFTWARE.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
Eclipse Public License - v 2.0
|
|
2
|
+
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (“AGREEMENT”). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
|
3
|
+
|
|
4
|
+
1. DEFINITIONS
|
|
5
|
+
“Contribution” means:
|
|
6
|
+
|
|
7
|
+
a) in the case of the initial Contributor, the initial content Distributed under this Agreement, and
|
|
8
|
+
b) in the case of each subsequent Contributor:
|
|
9
|
+
i) changes to the Program, and
|
|
10
|
+
ii) additions to the Program;
|
|
11
|
+
where such changes and/or additions to the Program originate from and are Distributed by that particular Contributor. A Contribution “originates” from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include changes or additions to the Program that are not Modified Works.
|
|
12
|
+
“Contributor” means any person or entity that Distributes the Program.
|
|
13
|
+
|
|
14
|
+
“Licensed Patents” mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
|
|
15
|
+
|
|
16
|
+
“Program” means the Contributions Distributed in accordance with this Agreement.
|
|
17
|
+
|
|
18
|
+
“Recipient” means anyone who receives the Program under this Agreement or any Secondary License (as applicable), including Contributors.
|
|
19
|
+
|
|
20
|
+
“Derivative Works” shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.
|
|
21
|
+
|
|
22
|
+
“Modified Works” shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof.
|
|
23
|
+
|
|
24
|
+
“Distribute” means the acts of a) distributing or b) making available in any manner that enables the transfer of a copy.
|
|
25
|
+
|
|
26
|
+
“Source Code” means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files.
|
|
27
|
+
|
|
28
|
+
“Secondary License” means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor.
|
|
29
|
+
|
|
30
|
+
2. GRANT OF RIGHTS
|
|
31
|
+
a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, Distribute and sublicense the Contribution of such Contributor, if any, and such Derivative Works.
|
|
32
|
+
b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in Source Code or other form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
|
|
33
|
+
c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to Distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
|
|
34
|
+
d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
|
|
35
|
+
e) Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3).
|
|
36
|
+
3. REQUIREMENTS
|
|
37
|
+
3.1 If a Contributor Distributes the Program in any form, then:
|
|
38
|
+
|
|
39
|
+
a) the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and
|
|
40
|
+
b) the Contributor may Distribute the Program under a license different than this Agreement, provided that such license:
|
|
41
|
+
i) effectively disclaims on behalf of all other Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
|
|
42
|
+
ii) effectively excludes on behalf of all other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
|
|
43
|
+
iii) does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and
|
|
44
|
+
iv) requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3.
|
|
45
|
+
3.2 When the Program is Distributed as Source Code:
|
|
46
|
+
|
|
47
|
+
a) it must be made available under this Agreement, or if the Program (i) is combined with other material in a separate file or files made available under a Secondary License, and (ii) the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and
|
|
48
|
+
b) a copy of this Agreement must be included with each copy of the Program.
|
|
49
|
+
3.3 Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability (‘notices’) contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices.
|
|
50
|
+
|
|
51
|
+
4. COMMERCIAL DISTRIBUTION
|
|
52
|
+
Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (“Commercial Contributor”) hereby agrees to defend and indemnify every other Contributor (“Indemnified Contributor”) against any losses, damages and costs (collectively “Losses”) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
|
|
53
|
+
|
|
54
|
+
For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
|
|
55
|
+
|
|
56
|
+
5. NO WARRANTY
|
|
57
|
+
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
|
|
58
|
+
|
|
59
|
+
6. DISCLAIMER OF LIABILITY
|
|
60
|
+
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
61
|
+
|
|
62
|
+
7. GENERAL
|
|
63
|
+
If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
|
|
64
|
+
|
|
65
|
+
If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
|
|
66
|
+
|
|
67
|
+
All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
|
|
68
|
+
|
|
69
|
+
Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be Distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to Distribute the Program (including its Contributions) under the new version.
|
|
70
|
+
|
|
71
|
+
Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement.
|
|
72
|
+
|
|
73
|
+
Exhibit A – Form of Secondary Licenses Notice
|
|
74
|
+
“This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), version(s), and exceptions or additional permissions here}.”
|
|
75
|
+
|
|
76
|
+
Simply including a copy of this Agreement, including this Exhibit A is not sufficient to license the Source Code under Secondary Licenses.
|
|
77
|
+
|
|
78
|
+
If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.
|
|
79
|
+
|
|
80
|
+
You may add additional accurate notices of copyright ownership.
|
package/README.md
CHANGED
|
@@ -1,3 +1,94 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ggn-layout
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
把标准图 JSON 布局成带节点几何、端口位置和边 `sections` 的新 JSON;普通消费方只需要一个纯函数入口。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install ggn-layout
|
|
9
|
+
# 或
|
|
10
|
+
pnpm add ggn-layout
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 最小示例
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { layoutElkJson } from 'ggn-layout'
|
|
17
|
+
const input = { id: 'root', children: [{ id: 'A' }, { id: 'B' }], edges: [{ id: 'A-to-B', sources: ['A'], targets: ['B'] }] }
|
|
18
|
+
const output = layoutElkJson(input)
|
|
19
|
+
console.log(output.children, output.edges?.[0]?.sections)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 文档导航
|
|
23
|
+
|
|
24
|
+
- [`docs/API-QUICKREF.md`](docs/API-QUICKREF.md):单页速查,适合首次调用和 AI agent。
|
|
25
|
+
- [`docs/API.md`](docs/API.md):完整输入、输出、坐标模式和验证说明。
|
|
26
|
+
- [`llms.txt`](llms.txt):机器优先的入口、路径和错误契约索引。
|
|
27
|
+
- [`examples/`](examples/):可用 `bun examples/basic.ts` 直接运行的 basic、nested、coords-modes 示例。
|
|
28
|
+
|
|
29
|
+
## API 契约要点
|
|
30
|
+
|
|
31
|
+
- **主入口**:`layoutElkJson(input, options?)` 是面向消费方的高层 API;输入是标准图 JSON,返回全新对象。复合能力:`layoutJsonBatch`(批量+逐项隔离)、`diffLayout`/`layoutJsonDiff`(布局差异)、`control: { signal, onProgress }`(进度+合作式取消)。
|
|
32
|
+
- **纯函数**:不会修改传入的 `input`;同一输入与同一选项在同一版本下结果确定,默认 `randomSeed` 为 `1`。
|
|
33
|
+
CI 在 V8(Node 20/22)与 JavaScriptCore(Bun)双引擎上复跑纯算法单测,用于拦截「结果依赖引擎排序实现」的顺序漂移;跨引擎断言的范围是那批纯算法用例,不等同于对全部输出做逐位比对。
|
|
34
|
+
- **失败方式**:非法输入或不支持的算法抛出结构化 `LayoutError`,可读取 `code`、`path`、`retryable` 和可选 `phase/details`。
|
|
35
|
+
- **输出形态**:`responseFormat` 三档——`full`(默认,完整保真 JSON)、`concise`(只留节点几何 + 边端点,省 token)、`summary`(扁平摘要 `{nodes, edges}`,不含 root 自身、只含已路由边)。`pick` 仅在 `full` 下追加保留的节点字段。
|
|
36
|
+
- **类型收紧**:`direction` 为 `'RIGHT'|'LEFT'|'DOWN'|'UP'` 字面量联合(持 `string` 变量的旧调用需收窄类型);新增 `LayoutInput`/`LayoutOutput`/`LayoutSummary` 类型(命名不含 ELK)。
|
|
37
|
+
- **命名说明**:公共入口沿用标准 JSON 生态中的 `layoutElkJson` 与相关类型;新增公共符号、文件名和技能名不使用 `ELK`/`Elk`,以避免把实现来源误当成调用层级。
|
|
38
|
+
- **边界**:内部 `LGraph`、`LNode`、provider 和属性模型不属于消费方公共契约;历史 `src/index.ts` 仅作为仓库兼容入口保留。
|
|
39
|
+
|
|
40
|
+
## 子路径导入
|
|
41
|
+
|
|
42
|
+
按使用层级选择发布入口:
|
|
43
|
+
|
|
44
|
+
- ggn-layout:兼容根入口,包含高层 API 与历史内部导出。
|
|
45
|
+
- ggn-layout/api:高层布局 API、校验、错误和布局输入/输出类型。
|
|
46
|
+
- ggn-layout/core:引擎内部模型与低层组装原语。
|
|
47
|
+
- ggn-layout/options:稳定选项类型、HIERARCHY_HANDLING 以及算法识别工具。
|
|
48
|
+
- ggn-layout/layered:仅分层算法(ELK Layered)入口,不打包其余算法。
|
|
49
|
+
- ggn-layout/layout-worker:Web Worker 外壳,`import` 即自动接管 `self.onmessage`。
|
|
50
|
+
- ggn-layout/layout-input.schema.json:机器可读的 LayoutInput JSON Schema(draft-07)。
|
|
51
|
+
|
|
52
|
+
普通消费方优先使用 ggn-layout 或 ggn-layout/api;只有需要引擎级能力时才使用 core。
|
|
53
|
+
六个 JS 入口都提供 ESM + CJS 双份产物与各自的 `.d.ts`/`.d.cts` 类型。
|
|
54
|
+
|
|
55
|
+
## 开发
|
|
56
|
+
|
|
57
|
+
构建需要 Node ≥ 22.18(`tsdown` 的 engines 要求);库本身运行在 Node ≥ 20,CI 在 Node 20/22 上跑测试。
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
bun install
|
|
61
|
+
bun run typecheck
|
|
62
|
+
bun run test:ci
|
|
63
|
+
bun run build
|
|
64
|
+
bun run smoke:pack # 打包产物门禁: 装进临时消费方跑完整/layered 双入口 (ESM+CJS)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`test:ci` 会跳过体量很大的 `tests/oracle/generated/**` 批次,但覆盖其余单元、BDD
|
|
68
|
+
和契约测试。完整测试可用 `bun run test:run`。第二套引擎(JavaScriptCore/Bun)用
|
|
69
|
+
`bun run test:cross-engine`;包元数据用 `npx publint` 与 `npx @arethetypeswrong/cli --pack .` 检查。
|
|
70
|
+
|
|
71
|
+
## 发布
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
bun run build
|
|
75
|
+
npm publish
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`prepublishOnly` 会依次执行类型检查、测试、构建、打包产物冒烟(`smoke:pack`)与包元数据门禁
|
|
79
|
+
(`check:pkg`:`publint` + 子路径类型解析 + 随包文档链接)。正式发布会走
|
|
80
|
+
[`.github/workflows/release.yml`](https://github.com/0xlxx/ggn-layout/blob/main/.github/workflows/release.yml)
|
|
81
|
+
(该文件不随包发布):打 `v*` tag 后由 GitHub Actions 以 npm Trusted Publishing(OIDC)发布并附带
|
|
82
|
+
provenance 证明。
|
|
83
|
+
手工发布仅在 Actions 不可用时使用。
|
|
84
|
+
|
|
85
|
+
## 许可证
|
|
86
|
+
|
|
87
|
+
本包以 **`(MIT AND EPL-2.0)`** 分发(SPDX 表达式,与 `package.json` 的 `license` 一致):
|
|
88
|
+
|
|
89
|
+
- `src/**` 与 `shared/**` 的实现是 Eclipse Layout Kernel (ELK) v0.12.0 的 1:1 TypeScript 移植,
|
|
90
|
+
以 **EPL-2.0** 授权;全文见 [`LICENSES/EPL-2.0.txt`](LICENSES/EPL-2.0.txt)。
|
|
91
|
+
- 其余内容(构建/发布工程、文档、示例、包元数据)为 GGN 原创,以 **MIT** 授权;
|
|
92
|
+
全文见 [`LICENSE`](LICENSE)。
|
|
93
|
+
- 包内同时含两种许可的代码,消费方需**同时**满足 MIT 与 EPL-2.0 的义务。
|
|
94
|
+
移植来源、测试数据与逐项归属见 [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md)。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Third-Party Notices
|
|
2
|
+
|
|
3
|
+
This project is a TypeScript port of the layered graph layout implementation
|
|
4
|
+
from the Eclipse Layout Kernel (ELK).
|
|
5
|
+
|
|
6
|
+
## Eclipse Layout Kernel
|
|
7
|
+
|
|
8
|
+
- Project: Eclipse Layout Kernel (ELK)
|
|
9
|
+
- Website: https://www.eclipse.org/elk/
|
|
10
|
+
- Source: https://github.com/eclipse/elk
|
|
11
|
+
- License: Eclipse Public License 2.0 (EPL-2.0);SPDX 标识 `EPL-2.0 OR GPL-3.0-or-later`
|
|
12
|
+
- Copyright: 版权归各上游作者/雇主所有(上游 [NOTICE.md](https://github.com/eclipse/elk/blob/master/NOTICE.md):
|
|
13
|
+
"All content is the property of the respective authors or their employers.")。
|
|
14
|
+
上游各文件头部的版权年代/持有人并不相同(例如 `LGraph.java` 为 `2010, 2019`、
|
|
15
|
+
`BoxLayoutProvider.java` 为 `2009, 2020`、`MedianHeuristic.java` 为 `2024`)。
|
|
16
|
+
本仓库**不**把来源文件的年代改写成统一值,而是在每个衍生文件头声明持有人
|
|
17
|
+
(`Copyright (c) Kiel University and others`)并在此登记来源;
|
|
18
|
+
精确到文件的原始通知以上游 v0.12.0 对应源码头为准。
|
|
19
|
+
|
|
20
|
+
EPL-2.0 全文见 [`LICENSES/EPL-2.0.txt`](LICENSES/EPL-2.0.txt)。
|
|
21
|
+
|
|
22
|
+
**源码可得性声明(EPL-2.0 §3.1(a))**:与本包每个发布版本对应的 Source Code Form
|
|
23
|
+
以 EPL-2.0 提供于 <https://github.com/0xlxx/ggn-layout>(对应发布 tag `v<version>`)。
|
|
24
|
+
|
|
25
|
+
**来源范围**(哪些内容源自 ELK):
|
|
26
|
+
|
|
27
|
+
- `src/**` 的算法实现:`org.eclipse.elk.alg.layered`(`p1..p5` 各阶段处理器)与
|
|
28
|
+
`org.eclipse.elk.alg.{force,rectpacking,topdownpacking,spore,radial,vertiflex,disco,mrtree}`、
|
|
29
|
+
`org.eclipse.elk.core.util`(box/fixed/random)的 1:1 TypeScript 移植;
|
|
30
|
+
移植保持类名、方法名、变量名与算法结构一致,以便逐行对照。
|
|
31
|
+
- `shared/**`:`shared/elkgraph-builder.ts`(ELK `ElkGraphImporter` / `LGraphUtil` 建图逻辑的
|
|
32
|
+
1:1 移植)与 `shared/opt-map.ts`(ELK 选项 id / 类型映射的对照表)。
|
|
33
|
+
- `src/options/**`:ELK `CoreOptions` / `LayeredOptions` 等选项定义(选项 id、类型、默认值)的对照表。
|
|
34
|
+
- `tests/oracle/**`、`test-resources/**`:ELK 官方测试用例与公开模型集合派生/校验的图模型与期望输出。
|
|
35
|
+
- `docs/reference/**`:ELK 官方文档(算法结构、选项机制、JSON 格式、间距选项等)的移植/导读。
|
|
36
|
+
|
|
37
|
+
**本仓库自有内容**:构建/发布工程(`scripts/**`、`.github/**`、`tsdown.config.ts` 等)、
|
|
38
|
+
文档与示例、`package.json` 等包元数据,均为 GGN 项目新增,以 MIT 授权(见 [`LICENSE`](LICENSE))。
|
|
39
|
+
|
|
40
|
+
`src/**` 与 `shared/**` 的实现代码一律按 ELK 衍生作品以 **EPL-2.0** 授权。这些文件里也含
|
|
41
|
+
GGN 新增的整合代码(例如对外 API 组装、worker 外壳),但它们与移植代码同在编译单元内,
|
|
42
|
+
按文件统一以 EPL-2.0 分发可以消除「同一文件混标两种许可」的错标风险。
|
|
43
|
+
|
|
44
|
+
### 声明落在哪里
|
|
45
|
+
|
|
46
|
+
- **源文件**:`src/**` 与 `shared/**` 的每个 `.ts` 文件首部都带
|
|
47
|
+
`SPDX-License-Identifier: EPL-2.0` 与 ELK 归属行;无法承载注释头的
|
|
48
|
+
`src/api/layout-input.schema.json` 在上文「来源范围」登记。
|
|
49
|
+
`scripts/check-license-headers.mjs` 在 CI 中强制校验(漏标、错标、未登记的非 `.ts`
|
|
50
|
+
文件都会让 CI 变红),并顺带校验 `dist/**` 产物 banner 与许可口径文件的一致性。
|
|
51
|
+
- **发布产物**:`dist/**` 每个 chunk 顶部带归属 banner(由 `tsdown.config.ts` 的 `banner`
|
|
52
|
+
注入,`minify` 不会吃掉它)。
|
|
53
|
+
- **包元数据**:`package.json` 的 `license` 为 `(MIT AND EPL-2.0)` —— 由于本包把两种许可的
|
|
54
|
+
代码打在一起分发,消费方需要**同时**满足 MIT 与 EPL-2.0 的义务。
|
|
55
|
+
|
|
56
|
+
> 注意:`src/**` 中的算法实现属 ELK 的**衍生作品**,因此对这些文件的重新分发需满足 EPL-2.0 的
|
|
57
|
+
> 义务(保留版权与许可声明、以 EPL-2.0 授权该等文件、提供获取源码的途径等)。EPL-2.0 允许
|
|
58
|
+
> 与其他许可(此处为 MIT)的独立模块组合分发("Secondary License"/separate module 机制)。
|
|
59
|
+
> 下游使用者如要再分发,请自行复核 EPL-2.0 义务。
|
|
60
|
+
|
|
61
|
+
## Test Models
|
|
62
|
+
|
|
63
|
+
Some files under `test-resources/` are graph models and expected outputs that
|
|
64
|
+
originate from ELK test suites or public research/industry model collections.
|
|
65
|
+
Their original attribution and license terms remain with the upstream sources.
|
|
66
|
+
|
|
67
|
+
具体地,`tests/oracle/**` 的 `elkt` 测试图数据源自 ELK 官方测试集
|
|
68
|
+
(Copyright (c) 2018 Kiel University 及贡献者),该数据集未随 `elkjs` 或
|
|
69
|
+
ELK v0.12.0 发布包分发;期望坐标由 `elkjs` 0.12.0 运行时生成并校验。
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ggn-layout — TypeScript port of the Eclipse Layout Kernel (ELK) layered layout algorithms.
|
|
3
|
+
*
|
|
4
|
+
* Portions derived from ELK (https://github.com/eclipse/elk) are licensed under the
|
|
5
|
+
* Eclipse Public License 2.0 (EPL-2.0); GGN-original portions are licensed under MIT.
|
|
6
|
+
* See LICENSES/EPL-2.0.txt, LICENSE and THIRD_PARTY_NOTICES.md.
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0 AND MIT
|
|
9
|
+
*/
|
|
10
|
+
const e=[],t=/* @__PURE__ */ new Map;function n(n){let r=n.getId(),i=t.get(r);i===void 0&&(i={id:r,slot:e.length,defaultValue:n.getDefault()},e.push(i),t.set(r,i)),n.slot=i.slot}function r(n,r=void 0){if(t.has(n))return;let i={id:n,slot:e.length,defaultValue:r};e.push(i),t.set(n,i)}var i=class e{id;defaultValue;slot=-1;constructor(e,t){this.id=e,this.defaultValue=t}getId(){return this.id}getDefault(){return this.defaultValue}equals(t){return t instanceof e&&this.id===t.id}toString(){return this.id}},a=class{propertyMap=null;fast=null;setProperty(e,n){if(typeof e==`string`){let r=t.get(e);if(r!==void 0)return this.setFast(r.slot,n),this}else{let t=e.slot;if(t>=0)return this.setFast(t,n),this}let r=typeof e==`string`?e:e.getId();return n==null?this.getProperties().delete(r):this.getProperties().set(r,n),this}getProperty(n){let r=-1;if(typeof n==`string`){let e=t.get(n);e!==void 0&&(r=e.slot)}else r=n.slot;if(r>=0){let t=this.fast;if(t!==null){let e=t[r];if(e!==void 0)return e}let n=e[r].defaultValue;return typeof n==`object`&&n&&((this.fast??=[])[r]=n),n}let i=this.propertyMap;if(i){let e=i.get(typeof n==`string`?n:n.getId());if(e!==void 0)return e}if(typeof n==`string`)return;let a=n.getDefault();return typeof a==`object`&&a&&this.getProperties().set(n.getId(),a),a}hasProperty(e){if(typeof e==`string`){let n=t.get(e);if(n!==void 0)return this.fast!==null&&this.fast[n.slot]!==void 0}else{let t=e.slot;if(t>=0)return this.fast!==null&&this.fast[t]!==void 0}return this.propertyMap!==null&&this.propertyMap.has(typeof e==`string`?e:e.getId())}copyProperties(t){if(!t)return this;let n=t.getAllProperties();if(n.size>0)for(let[e,t]of n)this.setProperty(e,t);let r=t.fast;if(r!==null)for(let t=0;t<r.length;t++){let n=r[t];n!==void 0&&e[t]!==void 0&&((this.fast??=[])[t]=n)}return this}getAllProperties(){return this.propertyMap??ee}setFast(e,t){if(t==null){let t=this.fast;t!==null&&(t[e]=void 0)}else(this.fast??=[])[e]=t}getProperties(){return this.propertyMap||=/* @__PURE__ */ new Map,this.propertyMap}};const ee=/* @__PURE__ */ new Map;function o(e){return e}const s={padding:o({id:`org.eclipse.elk.padding`,shortKey:`padding`,type:`object`,default:{top:12,left:12,right:12,bottom:12},algorithm:`core`}),margins:o({id:`org.eclipse.elk.margins`,shortKey:`margins`,type:`num`,default:0,algorithm:`core`}),spacingNodeNode:o({id:`org.eclipse.elk.spacing.nodeNode`,shortKey:`spacing.nodeNode`,type:`num`,default:20,algorithm:`core`}),spacingEdgeNode:o({id:`org.eclipse.elk.spacing.edgeNode`,shortKey:`spacing.edgeNode`,type:`num`,default:10,algorithm:`core`}),spacingEdgeEdge:o({id:`org.eclipse.elk.spacing.edgeEdge`,shortKey:`spacing.edgeEdge`,type:`num`,default:10,algorithm:`core`}),spacingEdgeLabel:o({id:`org.eclipse.elk.spacing.edgeLabel`,shortKey:`spacing.edgeLabel`,type:`num`,default:2,algorithm:`core`}),spacingComponentComponent:o({id:`org.eclipse.elk.spacing.componentComponent`,shortKey:`spacing.componentComponent`,type:`num`,default:20,algorithm:`core`}),aspectRatio:o({id:`org.eclipse.elk.aspectRatio`,shortKey:`aspectRatio`,type:`num`,default:1.6,algorithm:`core`}),priority:o({id:`org.eclipse.elk.priority`,shortKey:`priority`,type:`num`,default:1,algorithm:`core`}),separateConnectedComponents:o({id:`org.eclipse.elk.separateConnectedComponents`,shortKey:`separateConnectedComponents`,type:`bool`,default:!0,algorithm:`core`}),omitNodeMicroLayout:o({id:`org.eclipse.elk.omitNodeMicroLayout`,shortKey:`omitNodeMicroLayout`,type:`bool`,default:!1,algorithm:`core`}),nodeSizeFixedGraphSize:o({id:`org.eclipse.elk.nodeSize.fixedGraphSize`,shortKey:`nodeSize.fixedGraphSize`,type:`bool`,default:!1,algorithm:`core`}),position:o({id:`org.eclipse.elk.position`,shortKey:`position`,type:`str`,default:`UNDEFINED`,algorithm:`core`}),direction:o({id:`org.eclipse.elk.direction`,shortKey:`direction`,type:`str`,default:`UNDEFINED`,algorithm:`core`}),debugMode:o({id:`org.eclipse.elk.debugMode`,shortKey:`debugMode`,type:`bool`,default:!1,algorithm:`core`}),interactive:o({id:`org.eclipse.elk.interactive`,shortKey:`interactive`,type:`bool`,default:!1,algorithm:`core`}),randomSeed:o({id:`org.eclipse.elk.randomSeed`,shortKey:`randomSeed`,type:`num`,default:1,algorithm:`core`}),edgeThickness:o({id:`org.eclipse.elk.edge.thickness`,shortKey:`edge.thickness`,type:`num`,default:1,algorithm:`core`}),edgeLabelsInline:o({id:`org.eclipse.elk.edgeLabels.inline`,shortKey:`edgeLabels.inline`,type:`bool`,default:!1,algorithm:`core`}),nodeSizeConstraints:o({id:`org.eclipse.elk.nodeSize.constraints`,shortKey:`nodeSize.constraints`,type:`enumset`,default:[],values:[`PORTS`,`PORT_LABELS`,`NODE_LABELS`,`MINIMUM_SIZE`],algorithm:`core`}),nodeSizeMinimum:o({id:`org.eclipse.elk.nodeSize.minimum`,shortKey:`nodeSize.minimum`,type:`str`,default:`UNDEFINED`,algorithm:`core`}),contentAlignment:o({id:`org.eclipse.elk.contentAlignment`,shortKey:`contentAlignment`,type:`enumset`,default:[],values:[`V_TOP`,`V_CENTER`,`V_BOTTOM`,`H_LEFT`,`H_CENTER`,`H_RIGHT`],algorithm:`core`}),underlyingLayoutAlgorithm:o({id:`org.eclipse.elk.underlyingLayoutAlgorithm`,shortKey:`underlyingLayoutAlgorithm`,type:`str`,default:`UNDEFINED`,algorithm:`core`}),structureExtractionStrategy:o({id:`org.eclipse.elk.structure.structureExtractionStrategy`,shortKey:`structure.structureExtractionStrategy`,type:`str`,default:`UNDEFINED`,algorithm:`core`}),childAreaWidth:o({id:`org.eclipse.elk.childArea.width`,shortKey:`childArea.width`,type:`num`,default:0,algorithm:`core`}),childAreaHeight:o({id:`org.eclipse.elk.childArea.height`,shortKey:`childArea.height`,type:`num`,default:0,algorithm:`core`}),spacingIndividual:o({id:`org.eclipse.elk.spacing.individual`,shortKey:`spacing.individual`,type:`str`,default:`UNDEFINED`,algorithm:`core`}),portConstraints:o({id:`org.eclipse.elk.portConstraints`,shortKey:`portConstraints`,type:`str`,default:`UNDEFINED`,values:[`UNDEFINED`,`FREE`,`FIXED_SIDE`,`FIXED_SIDES`,`FIXED_ORDER`,`FIXED_RATIO`,`FIXED_POS`],algorithm:`core`})},c={radial:{centerOnRoot:o({id:`org.eclipse.elk.radial.centerOnRoot`,shortKey:`radial.centerOnRoot`,type:`bool`,default:!1,algorithm:`radial`}),orderId:o({id:`org.eclipse.elk.radial.orderId`,shortKey:`radial.orderId`,type:`num`,default:0,algorithm:`radial`}),radius:o({id:`org.eclipse.elk.radial.radius`,shortKey:`radial.radius`,type:`num`,default:0,algorithm:`radial`}),rotate:o({id:`org.eclipse.elk.radial.rotate`,shortKey:`radial.rotate`,type:`bool`,default:!1,algorithm:`radial`}),rotationTargetAngle:o({id:`org.eclipse.elk.radial.rotation.targetAngle`,shortKey:`radial.rotation.targetAngle`,type:`num`,default:0,algorithm:`radial`}),rotationComputeAdditionalWedgeSpace:o({id:`org.eclipse.elk.radial.rotation.computeAdditionalWedgeSpace`,shortKey:`radial.rotation.computeAdditionalWedgeSpace`,type:`bool`,default:!1,algorithm:`radial`}),rotationOutgoingEdgeAngles:o({id:`org.eclipse.elk.radial.rotation.outgoingEdgeAngles`,shortKey:`radial.rotation.outgoingEdgeAngles`,type:`bool`,default:!1,algorithm:`radial`}),compactor:o({id:`org.eclipse.elk.radial.compactor`,shortKey:`radial.compactor`,type:`str`,default:`NONE`,values:[`NONE`,`RADIAL_COMPACTION`,`WEDGE_COMPACTION`],algorithm:`radial`}),compactionStepSize:o({id:`org.eclipse.elk.radial.compactionStepSize`,shortKey:`radial.compactionStepSize`,type:`num`,default:1,algorithm:`radial`}),sorter:o({id:`org.eclipse.elk.radial.sorter`,shortKey:`radial.sorter`,type:`str`,default:`NONE`,values:[`NONE`,`POLAR_COORDINATE`,`ID`],algorithm:`radial`}),wedgeCriteria:o({id:`org.eclipse.elk.radial.wedgeCriteria`,shortKey:`radial.wedgeCriteria`,type:`str`,default:`NODE_SIZE`,values:[`LEAF_NUMBER`,`NODE_SIZE`],algorithm:`radial`}),optimizationCriteria:o({id:`org.eclipse.elk.radial.optimizationCriteria`,shortKey:`radial.optimizationCriteria`,type:`str`,default:`NONE`,values:[`NONE`,`EDGE_LENGTH`,`EDGE_LENGTH_BY_POSITION`,`CROSSING_MINIMIZATION_BY_POSITION`],algorithm:`radial`})},mrtree:{weighting:o({id:`org.eclipse.elk.mrtree.weighting`,shortKey:`mrtree.weighting`,type:`str`,default:`MODEL_ORDER`,values:[`MODEL_ORDER`,`DESCENDANTS`,`FAN`,`CONSTRAINT`],algorithm:`mrtree`}),searchOrder:o({id:`org.eclipse.elk.mrtree.searchOrder`,shortKey:`mrtree.searchOrder`,type:`str`,default:`DFS`,values:[`DFS`,`BFS`],algorithm:`mrtree`}),positionConstraint:o({id:`org.eclipse.elk.mrtree.positionConstraint`,shortKey:`mrtree.positionConstraint`,type:`num`,default:-1,algorithm:`mrtree`}),edgeRoutingMode:o({id:`org.eclipse.elk.mrtree.edgeRoutingMode`,shortKey:`mrtree.edgeRoutingMode`,type:`str`,default:`AVOID_OVERLAP`,values:[`NONE`,`MIDDLE_TO_MIDDLE`,`AVOID_OVERLAP`],algorithm:`mrtree`}),treeLevel:o({id:`org.eclipse.elk.mrtree.treeLevel`,shortKey:`mrtree.treeLevel`,type:`num`,default:0,algorithm:`mrtree`}),compaction:o({id:`org.eclipse.elk.mrtree.compaction`,shortKey:`mrtree.compaction`,type:`bool`,default:!1,algorithm:`mrtree`}),edgeEndTextureLength:o({id:`org.eclipse.elk.mrtree.edgeEndTextureLength`,shortKey:`mrtree.edgeEndTextureLength`,type:`num`,default:7,algorithm:`mrtree`})},disco:{componentCompactionStrategy:o({id:`org.eclipse.elk.disco.componentCompaction.strategy`,shortKey:`disco.componentCompaction.strategy`,type:`str`,default:`POLYOMINO`,values:[`POLYOMINO`],algorithm:`disco`}),componentLayoutAlgorithm:o({id:`org.eclipse.elk.disco.componentCompaction.componentLayoutAlgorithm`,shortKey:`disco.componentCompaction.componentLayoutAlgorithm`,type:`str`,default:`UNDEFINED`,algorithm:`disco`}),debugDiscoGraph:o({id:`org.eclipse.elk.disco.debug.discoGraph`,shortKey:`disco.debug.discoGraph`,type:`bool`,default:!1,algorithm:`disco`}),debugDiscoPolys:o({id:`org.eclipse.elk.disco.debug.discoPolys`,shortKey:`disco.debug.discoPolys`,type:`bool`,default:!1,algorithm:`disco`}),polyominoFill:o({id:`org.eclipse.elk.alg.common.compaction.polyomino.fill`,shortKey:`alg.common.compaction.polyomino.fill`,type:`bool`,default:!0,algorithm:`disco`}),polyominoLowLevelSort:o({id:`org.eclipse.elk.alg.common.compaction.polyomino.lowLevelSort`,shortKey:`alg.common.compaction.polyomino.lowLevelSort`,type:`str`,default:`BY_SIZE_AND_SHAPE`,values:[`BY_SIZE`,`BY_SIZE_AND_SHAPE`],algorithm:`disco`}),polyominoHighLevelSort:o({id:`org.eclipse.elk.alg.common.compaction.polyomino.highLevelSort`,shortKey:`alg.common.compaction.polyomino.highLevelSort`,type:`str`,default:`NUM_OF_EXTERNAL_SIDES_THAN_NUM_OF_EXTENSIONS_LAST`,values:[`CORNER_CASES_THAN_SINGLE_SIDE_LAST`,`NUM_OF_EXTERNAL_SIDES_THAN_NUM_OF_EXTENSIONS_LAST`],algorithm:`disco`}),polyominoTraversalStrategy:o({id:`org.eclipse.elk.alg.common.compaction.polyomino.traversalStrategy`,shortKey:`alg.common.compaction.polyomino.traversalStrategy`,type:`str`,default:`QUADRANTS_LINE_BY_LINE`,values:[`SPIRAL`,`LINE_BY_LINE`,`MANHATTAN`,`JITTER`,`QUADRANTS_MANHATTAN`,`QUADRANTS_LINE_BY_LINE`,`COMBINE_LINE_BY_LINE_MANHATTAN`,`COMBINE_JITTER_MANHATTAN`,`QUADRANTS_JITTER`],algorithm:`disco`})},force:{forceModel:o({id:`org.eclipse.elk.force.model`,shortKey:`force.model`,type:`str`,default:`FRUCHTERMAN_REINGOLD`,values:[`FRUCHTERMAN_REINGOLD`,`EADES`],algorithm:`force`}),forceIterations:o({id:`org.eclipse.elk.force.iterations`,shortKey:`force.iterations`,type:`num`,default:300,algorithm:`force`}),forceRepulsivePower:o({id:`org.eclipse.elk.force.repulsivePower`,shortKey:`force.repulsivePower`,type:`num`,default:0,algorithm:`force`}),forceTemperature:o({id:`org.eclipse.elk.force.temperature`,shortKey:`force.temperature`,type:`num`,default:.001,algorithm:`force`}),forceRepulsion:o({id:`org.eclipse.elk.force.repulsion`,shortKey:`force.repulsion`,type:`num`,default:5,algorithm:`force`}),stressFixed:o({id:`org.eclipse.elk.stress.fixed`,shortKey:`stress.fixed`,type:`bool`,default:!1,algorithm:`force`}),stressDesiredEdgeLength:o({id:`org.eclipse.elk.stress.desiredEdgeLength`,shortKey:`stress.desiredEdgeLength`,type:`num`,default:100,algorithm:`force`}),stressDimension:o({id:`org.eclipse.elk.stress.dimension`,shortKey:`stress.dimension`,type:`str`,default:`XY`,values:[`X`,`Y`,`XY`],algorithm:`force`}),stressEpsilon:o({id:`org.eclipse.elk.stress.epsilon`,shortKey:`stress.epsilon`,type:`num`,default:.001,algorithm:`force`}),stressIterationLimit:o({id:`org.eclipse.elk.stress.iterationLimit`,shortKey:`stress.iterationLimit`,type:`num`,default:2147483647,algorithm:`force`})},rectpacking:{widthApproximationStrategy:o({id:`org.eclipse.elk.rectpacking.widthApproximation.strategy`,shortKey:`rectpacking.widthApproximation.strategy`,type:`str`,default:`GREEDY`,values:[`GREEDY`,`TARGET_WIDTH`],algorithm:`rectpacking`}),widthApproximationTargetWidth:o({id:`org.eclipse.elk.rectpacking.widthApproximation.targetWidth`,shortKey:`rectpacking.widthApproximation.targetWidth`,type:`num`,default:-1,algorithm:`rectpacking`}),widthApproximationOptimizationGoal:o({id:`org.eclipse.elk.rectpacking.widthApproximation.optimizationGoal`,shortKey:`rectpacking.widthApproximation.optimizationGoal`,type:`str`,default:`MAX_SCALE_DRIVEN`,values:[`ASPECT_RATIO_DRIVEN`,`MAX_SCALE_DRIVEN`,`AREA_DRIVEN`],algorithm:`rectpacking`}),widthApproximationLastPlaceShift:o({id:`org.eclipse.elk.rectpacking.widthApproximation.lastPlaceShift`,shortKey:`rectpacking.widthApproximation.lastPlaceShift`,type:`bool`,default:!0,algorithm:`rectpacking`}),packingStrategy:o({id:`org.eclipse.elk.rectpacking.packing.strategy`,shortKey:`rectpacking.packing.strategy`,type:`str`,default:`COMPACTION`,values:[`COMPACTION`,`SIMPLE`,`NONE`],algorithm:`rectpacking`}),packingCompactionRowHeightReevaluation:o({id:`org.eclipse.elk.rectpacking.packing.compaction.rowHeightReevaluation`,shortKey:`rectpacking.packing.compaction.rowHeightReevaluation`,type:`bool`,default:!1,algorithm:`rectpacking`}),packingCompactionIterations:o({id:`org.eclipse.elk.rectpacking.packing.compaction.iterations`,shortKey:`rectpacking.packing.compaction.iterations`,type:`num`,default:1,algorithm:`rectpacking`}),whiteSpaceEliminationStrategy:o({id:`org.eclipse.elk.rectpacking.whiteSpaceElimination.strategy`,shortKey:`rectpacking.whiteSpaceElimination.strategy`,type:`str`,default:`NONE`,values:[`NONE`,`EQUAL_BETWEEN_STRUCTURES`,`TO_ASPECT_RATIO`],algorithm:`rectpacking`}),trybox:o({id:`org.eclipse.elk.rectpacking.trybox`,shortKey:`rectpacking.trybox`,type:`bool`,default:!1,algorithm:`rectpacking`}),orderBySize:o({id:`org.eclipse.elk.rectpacking.orderBySize`,shortKey:`rectpacking.orderBySize`,type:`bool`,default:!1,algorithm:`rectpacking`}),desiredPosition:o({id:`org.eclipse.elk.rectpacking.desiredPosition`,shortKey:`rectpacking.desiredPosition`,type:`num`,default:-1,algorithm:`rectpacking`}),currentPosition:o({id:`org.eclipse.elk.rectpacking.currentPosition`,shortKey:`rectpacking.currentPosition`,type:`num`,default:-1,algorithm:`rectpacking`}),inNewRow:o({id:`org.eclipse.elk.rectpacking.inNewRow`,shortKey:`rectpacking.inNewRow`,type:`bool`,default:!1,algorithm:`rectpacking`})},spore:{processingOrderTreeConstruction:o({id:`org.eclipse.elk.processingOrder.treeConstruction`,shortKey:`processingOrder.treeConstruction`,type:`str`,default:`MINIMUM_SPANNING_TREE`,values:[`MINIMUM_SPANNING_TREE`,`MAXIMUM_SPANNING_TREE`],algorithm:`spore`}),processingOrderSpanningTreeCostFunction:o({id:`org.eclipse.elk.processingOrder.spanningTreeCostFunction`,shortKey:`processingOrder.spanningTreeCostFunction`,type:`str`,default:`CIRCLE_UNDERLAP`,values:[`CENTER_DISTANCE`,`CIRCLE_UNDERLAP`,`RECTANGLE_UNDERLAP`,`INVERTED_OVERLAP`,`MINIMUM_ROOT_DISTANCE`],algorithm:`spore`}),processingOrderPreferredRoot:o({id:`org.eclipse.elk.processingOrder.preferredRoot`,shortKey:`processingOrder.preferredRoot`,type:`str`,default:`UNDEFINED`,algorithm:`spore`}),processingOrderRootSelection:o({id:`org.eclipse.elk.processingOrder.rootSelection`,shortKey:`processingOrder.rootSelection`,type:`str`,default:`CENTER_NODE`,values:[`FIXED`,`CENTER_NODE`],algorithm:`spore`}),compactionStrategy:o({id:`org.eclipse.elk.compaction.compactionStrategy`,shortKey:`compaction.compactionStrategy`,type:`str`,default:`DEPTH_FIRST`,values:[`DEPTH_FIRST`],algorithm:`spore`}),compactionOrthogonal:o({id:`org.eclipse.elk.compaction.orthogonal`,shortKey:`compaction.orthogonal`,type:`bool`,default:!1,algorithm:`spore`}),overlapRemovalMaxIterations:o({id:`org.eclipse.elk.overlapRemoval.maxIterations`,shortKey:`overlapRemoval.maxIterations`,type:`num`,default:64,algorithm:`spore`}),overlapRemovalRunScanline:o({id:`org.eclipse.elk.overlapRemoval.runScanline`,shortKey:`overlapRemoval.runScanline`,type:`bool`,default:!0,algorithm:`spore`})},topdownpacking:{hierarchicalNodeWidth:o({id:`org.eclipse.elk.topdown.hierarchicalNodeWidth`,shortKey:`topdown.hierarchicalNodeWidth`,type:`num`,default:150,algorithm:`topdownpacking`}),hierarchicalNodeAspectRatio:o({id:`org.eclipse.elk.topdown.hierarchicalNodeAspectRatio`,shortKey:`topdown.hierarchicalNodeAspectRatio`,type:`num`,default:1.414,algorithm:`topdownpacking`}),nodeArrangementStrategy:o({id:`org.eclipse.elk.topdownpacking.nodeArrangement.strategy`,shortKey:`topdownpacking.nodeArrangement.strategy`,type:`str`,default:`LEFT_RIGHT_TOP_DOWN_NODE_PLACER`,values:[`LEFT_RIGHT_TOP_DOWN_NODE_PLACER`],algorithm:`topdownpacking`}),whitespaceEliminationStrategy:o({id:`org.eclipse.elk.topdownpacking.whitespaceElimination.strategy`,shortKey:`topdownpacking.whitespaceElimination.strategy`,type:`str`,default:`BOTTOM_ROW_EQUAL_WHITESPACE_ELIMINATOR`,values:[`BOTTOM_ROW_EQUAL_WHITESPACE_ELIMINATOR`],algorithm:`topdownpacking`})},vertiflex:{verticalConstraint:o({id:`org.eclipse.elk.vertiflex.verticalConstraint`,shortKey:`vertiflex.verticalConstraint`,type:`num`,default:0,algorithm:`vertiflex`}),layoutStrategy:o({id:`org.eclipse.elk.vertiflex.layoutStrategy`,shortKey:`vertiflex.layoutStrategy`,type:`str`,default:`STRAIGHT`,values:[`STRAIGHT`,`BEND`],algorithm:`vertiflex`}),layerDistance:o({id:`org.eclipse.elk.vertiflex.layerDistance`,shortKey:`vertiflex.layerDistance`,type:`num`,default:50,algorithm:`vertiflex`}),considerNodeModelOrder:o({id:`org.eclipse.elk.vertiflex.considerNodeModelOrder`,shortKey:`vertiflex.considerNodeModelOrder`,type:`bool`,default:!0,algorithm:`vertiflex`})}};[...Object.values(s),...Object.values(c.radial),...Object.values(c.mrtree),...Object.values(c.disco),...Object.values(c.force),...Object.values(c.rectpacking),...Object.values(c.spore),...Object.values(c.topdownpacking),...Object.values(c.vertiflex)];let te=/* @__PURE__ */ function(e){return e.NORMAL=`NORMAL`,e.LONG_EDGE=`LONG_EDGE`,e.EXTERNAL_PORT=`EXTERNAL_PORT`,e.NORTH_SOUTH_PORT=`NORTH_SOUTH_PORT`,e.LABEL=`LABEL`,e.BREAKING_POINT=`BREAKING_POINT`,e.PLACEHOLDER=`PLACEHOLDER`,e.NONSHIFTING_PLACEHOLDER=`NONSHIFTING_PLACEHOLDER`,e}({}),l=/* @__PURE__ */ function(e){return e.UNDEFINED=`UNDEFINED`,e.NORTH=`NORTH`,e.EAST=`EAST`,e.SOUTH=`SOUTH`,e.WEST=`WEST`,e}({});const ne=[`NORTH`],re=[`EAST`],ie=[`SOUTH`],ae=[`WEST`],oe=[`EAST`,`WEST`],se=[`NORTH`,`SOUTH`],ce=[`NORTH`,`EAST`],le=[`EAST`,`SOUTH`],ue=[`SOUTH`,`WEST`],de=[`NORTH`,`WEST`],fe=[`NORTH`,`EAST`,`SOUTH`],pe=[`EAST`,`SOUTH`,`WEST`],me=[`SOUTH`,`WEST`,`NORTH`],he=[`WEST`,`NORTH`,`EAST`],ge=[`NORTH`,`EAST`,`SOUTH`,`WEST`];let _e=/* @__PURE__ */ function(e){return e.UNDEFINED=`UNDEFINED`,e.INPUT=`INPUT`,e.OUTPUT=`OUTPUT`,e}({}),ve=/* @__PURE__ */ function(e){return e.UNDEFINED=`UNDEFINED`,e.RIGHT=`RIGHT`,e.LEFT=`LEFT`,e.DOWN=`DOWN`,e.UP=`UP`,e}({}),u=/* @__PURE__ */ function(e){return e.UNDEFINED=`UNDEFINED`,e.FREE=`FREE`,e.FIXED_SIDE=`FIXED_SIDE`,e.FIXED_ORDER=`FIXED_ORDER`,e.FIXED_RATIO=`FIXED_RATIO`,e.FIXED_POS=`FIXED_POS`,e}({});(function(e){function t(e){return e===`FIXED_SIDE`||e===`FIXED_ORDER`||e===`FIXED_RATIO`||e===`FIXED_POS`}e.isSideFixed=t;function n(e){return e===`FIXED_POS`}e.isPosFixed=n;function r(e){return e===`FIXED_RATIO`}e.isRatioFixed=r;function i(e){return e===`FIXED_ORDER`||e===`FIXED_RATIO`||e===`FIXED_POS`}e.isOrderFixed=i})(u||={});let ye=/* @__PURE__ */ function(e){return e.NONE=`NONE`,e.FIRST=`FIRST`,e.FIRST_SEPARATE=`FIRST_SEPARATE`,e.LAST=`LAST`,e.LAST_SEPARATE=`LAST_SEPARATE`,e}({}),be=/* @__PURE__ */ function(e){return e.NONE=`NONE`,e.TOP=`TOP`,e.BOTTOM=`BOTTOM`,e}({}),xe=/* @__PURE__ */ function(e){return e.NONE=`NONE`,e.OUTGOING_ONLY=`OUTGOING_ONLY`,e.INCOMING_ONLY=`INCOMING_ONLY`,e}({});function Se(e=0,t=0){return{x:e,y:t}}(function(e){function t(e){switch(e){case`NORTH`:return`SOUTH`;case`SOUTH`:return`NORTH`;case`EAST`:return`WEST`;case`WEST`:return`EAST`;default:return`UNDEFINED`}}e.opposed=t;function n(e){return e===`NORTH`||e===`SOUTH`}e.isVertical=n;function r(e){return e===`EAST`||e===`WEST`}e.isHorizontal=r})(l||={});let Ce;(function(e){e.PORT_CONSTRAINTS_KEY=s.portConstraints.id})(Ce||={});let we=/* @__PURE__ */ function(e){return e.EXTERNAL_PORTS=`EXTERNAL_PORTS`,e.NON_FREE_PORTS=`NON_FREE_PORTS`,e.NORTH_SOUTH_PORTS=`NORTH_SOUTH_PORTS`,e.SELF_LOOPS=`SELF_LOOPS`,e.CENTER_LABELS=`CENTER_LABELS`,e.HYPEREDGES=`HYPEREDGES`,e.END_LABELS=`END_LABELS`,e.COMMENTS=`COMMENTS`,e.PARTITIONS=`PARTITIONS`,e.HYPERNODES=`HYPERNODES`,e}({});const Te=new i(`org.eclipse.elk.layered.internal.origin`),Ee=new i(`org.eclipse.elk.layered.internal.topComments`),De=new i(`org.eclipse.elk.layered.internal.bottomComments`),Oe=new i(`org.eclipse.elk.layered.internal.commentConnPort`),ke=new i(`org.eclipse.elk.layered.internal.extPortSide`,`UNDEFINED`),Ae=new i(`org.eclipse.elk.layered.internal.extPortSize`),je=new i(`org.eclipse.elk.layered.internal.portDummy`),Me=new i(`org.eclipse.elk.layered.internal.insideConnections`,!1),Ne=new i(`org.eclipse.elk.layered.internal.portRatioOrPosition`,0),d=new i(`org.eclipse.elk.layered.internal.crossHierarchyMap`),f=new i(`org.eclipse.elk.layered.internal.splineRouteStart`,null),p=new i(`org.eclipse.elk.layered.internal.splineEdgeChain`,null),m=new i(`org.eclipse.elk.layered.internal.splineSurvivingEdge`,null),h=new i(`org.eclipse.elk.layered.internal.splineNsPortYCoord`,null),g=new i(`org.eclipse.elk.layered.internal.random`),_=new i(`org.eclipse.elk.layered.internal.greedySwitchActive`,!1),v=new i(`org.eclipse.elk.layered.internal.reversed`,!1),y=new i(`org.eclipse.elk.layered.internal.cyclic`,!1),b=new i(`org.eclipse.elk.layered.internal.breakingPointInfo`,null),Pe=new i(`org.eclipse.elk.layered.internal.partitionDummy`,!1),Fe=new i(`org.eclipse.elk.layered.internal.inputCollect`,!1),Ie=new i(`org.eclipse.elk.layered.internal.outputCollect`,!1),Le=new i(`org.eclipse.elk.layered.internal.hiddenNodes`),Re=new i(`org.eclipse.elk.layered.internal.originalOppositePort`),ze=new i(`org.eclipse.elk.layered.internal.originalLabelEdge`),Be=new i(`org.eclipse.elk.layered.internal.extPortConnections`),Ve=new i(`org.eclipse.elk.layered.internal.modelOrder`,0),He=new i(`org.eclipse.elk.layered.internal.maxModelOrderNodes`,0),Ue=new i(`org.eclipse.elk.layered.internal.modelOrderGroups.cb.number`,0),We=new i(`org.eclipse.elk.layered.internal.targetNodeModelOrder`),Ge=new i(`org.eclipse.elk.layered.internal.longEdgeTargetNode`),Ke=new i(`org.eclipse.elk.layered.internal.extPortReplacedDummy`),qe=new i(`org.eclipse.elk.layered.internal.extPortReplacedDummies`),Je=new i(`org.eclipse.elk.layered.internal.targetOffset`),Ye=new i(`org.eclipse.elk.layered.internal.graphProperties`,/* @__PURE__ */ new Set),Xe=new i(`org.eclipse.elk.layered.internal.inLayerLayoutUnit`),Ze=new i(`org.eclipse.elk.layered.internal.barycenterAssociates`),Qe=new i(`org.eclipse.elk.layered.internal.inLayerSuccessorConstraints`),$e=new i(`org.eclipse.elk.layered.internal.inLayerSuccessorConstraintsBetweenNonDummies`,!1),et=new i(`org.eclipse.elk.layered.internal.crossingHint`,0),tt=new i(`org.eclipse.elk.layered.internal.representedLabels`,[]),nt=new i(`org.eclipse.elk.layered.internal.labelSide`,`BELOW`),rt=new i(`org.eclipse.elk.layered.internal.portIsOutput`,!1),it=new i(`org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder`,!1),at=new i(`org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness`,.1),ot=new i(`org.eclipse.elk.layered.internal.spacings`),st=new i(`org.eclipse.elk.layered.internal.longEdgeSource`),ct=new i(`org.eclipse.elk.layered.internal.longEdgeTarget`),lt=new i(`org.eclipse.elk.layered.internal.longEdgeHasLabelDummies`,!1),ut=new i(`org.eclipse.elk.layered.internal.longEdgeBeforeLabelDummy`,!1),dt=new i(`org.eclipse.elk.layered.internal.endLabelEdge`),ft=new i(`org.eclipse.elk.layered.internal.selfLoopHolder`),pt=new i(`org.eclipse.elk.layered.internal.originalPortConstraints`),mt=new i(`org.eclipse.elk.layered.internal.originalDummyNodePosition`),ht=new i(`org.eclipse.elk.layered.internal.originalBendPoints`),gt=new i(`org.eclipse.elk.layered.internal.endLabels`),_t=new i(`org.eclipse.elk.layered.internal.maxEdgeThickness`,0),x={NONE:`NONE`,INSIDE_PORT_SIDE_GROUPS:`INSIDE_PORT_SIDE_GROUPS`,GROUP_MODEL_ORDER:`GROUP_MODEL_ORDER`,MODEL_ORDER:`MODEL_ORDER`};x.NONE,x.INSIDE_PORT_SIDE_GROUPS,x.GROUP_MODEL_ORDER,x.MODEL_ORDER;const vt=new i(`org.eclipse.elk.layered.priority.direction`,0),yt=new i(`org.eclipse.elk.direction`,`UNDEFINED`),bt=new i(`org.eclipse.elk.aspectRatio`,1.6),S=new i(`org.eclipse.elk.port.borderOffset`,0),xt=new i(`org.eclipse.elk.port.index`,null),St=new i(`org.eclipse.elk.layered.portSortingStrategy`,`INPUT_ORDER`),Ct=new i(`org.eclipse.elk.port.side`,`UNDEFINED`),wt=new i(`org.eclipse.elk.port.anchor`),Tt=new i(`org.eclipse.elk.layered.layering.layerConstraint`),Et=new i(`org.eclipse.elk.layered.internal.edgeConstraint`);new i(`org.eclipse.elk.layered.internal.inLayerConstraint`);const C=new i(`org.eclipse.elk.portConstraints`,`UNDEFINED`),Dt=new i(`org.eclipse.elk.layered.feedbackEdges`,!1),Ot=new i(`org.eclipse.elk.layered.mergeHierarchyEdges`,!0),kt=new i(`org.eclipse.elk.layered.mergeEdges`,!1),At=new i(`org.eclipse.elk.layered.compaction.postCompaction.strategy`,`NONE`),jt=new i(`org.eclipse.elk.layered.compaction.postCompaction.constraints`,`SCANLINE`),Mt=new i(`org.eclipse.elk.layered.unnecessaryBendpoints`,!1),w=new i(`org.eclipse.elk.insideSelfLoops.activate`,!1),Nt=new i(`org.eclipse.elk.insideSelfLoops.yo`,!1),T=new i(`org.eclipse.elk.spacing.portsSurrounding`,{top:0,left:0,bottom:0,right:0}),Pt=new i(`org.eclipse.elk.spacing.individual`,null),Ft=new i(`org.eclipse.elk.spacing.edgeEdge`,10),It=new i(`org.eclipse.elk.spacing.nodeNode`,20),Lt=new i(`org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers`,20),Rt=new i(`org.eclipse.elk.randomSeed`,1),zt=new i(`org.eclipse.elk.layered.priority.shortness`,0),Bt=new i(`org.eclipse.elk.layered.thoroughness`,7),Vt=new i(`org.eclipse.elk.hierarchyHandling`,null),Ht=new i(`org.eclipse.elk.layered.crossingMinimization.strategy`,`LAYER_SWEEP`),Ut=new i(`org.eclipse.elk.separateConnectedComponents`,!0),E=new i(`org.eclipse.elk.interactiveLayout`,!1),Wt=new i(`org.eclipse.elk.layered.generatePositionAndLayerIds`,!1),Gt=new i(`org.eclipse.elk.layered.layering.strategy`,`NETWORK_SIMPLEX`),Kt=new i(`org.eclipse.elk.layered.nodePlacement.strategy`,`BRANDES_KOEPF`),qt=new i(`org.eclipse.elk.layered.considerModelOrder.strategy`,`NONE`),Jt=new i(`org.eclipse.elk.layered.considerModelOrder.portModelOrder`,!1),Yt=new i(`org.eclipse.elk.layered.considerModelOrder.longEdgeOrderingStrategy`,`EQUAL`),Xt=new i(`org.eclipse.elk.layered.considerModelOrder.groupModelOrder.cmGroupOrderStrategy`,`MODEL_ORDER`),Zt=new i(`org.eclipse.elk.layered.considerModelOrder.groupModelOrder.cmEnforcedGroupOrders`,[]),Qt=new i(`org.eclipse.elk.layered.considerModelOrder.groupModelOrder.crossingMinimizationId`,null),$t=new i(`org.eclipse.elk.layered.considerModelOrder.noModelOrder`,!1),en=new i(`org.eclipse.elk.layered.considerModelOrder.components`,x.NONE),tn=new i(`org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides`,!1),nn=new i(`org.eclipse.elk.layered.considerModelOrder.groupModelOrder.cycleBreakingId`,0),rn=new i(`org.eclipse.elk.layered.considerModelOrder.groupModelOrder.cbGroupOrderStrategy`,`ONLY_WITHIN_GROUP`),an=new i(`org.eclipse.elk.layered.cycleBreaking.strategy`,`GREEDY`),on=new i(`org.eclipse.elk.layered.layering.nodePromotion.strategy`,`NONE`);new i(`org.eclipse.elk.layered.layering.nodePromotion.maxIterations`,0);const sn=new i(`org.eclipse.elk.layered.layering.coffmanGraham.layerBound`,2147483647),cn=new i(`org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth`,4),ln=new i(`org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor`,2),D=new i(`org.eclipse.elk.nodeLabels.padding`,{top:5,right:5,bottom:5,left:5}),O=new i(`org.eclipse.elk.nodeSize.constraints`,[]),un=new i(`org.eclipse.elk.position`,null),dn=new i(`org.eclipse.elk.partitioning.activate`,!1),fn=new i(`org.eclipse.elk.partitioning.partition`,null),pn=new i(`org.eclipse.elk.layered.highDegreeNodes.treatment`,!1),mn=new i(`org.eclipse.elk.layered.highDegreeNodes.threshold`,16),hn=new i(`org.eclipse.elk.layered.highDegreeNodes.treeHeight`,5),k=new i(`org.eclipse.elk.nodeSize.minimum`,{x:0,y:0}),A=new i(`org.eclipse.elk.nodeSize.options`,[]);new i(`org.eclipse.elk.nodeSize.fixedGraphSize`,!1);const j=new i(`org.eclipse.elk.nodeLabels.placement`,[]),M=new i(`org.eclipse.elk.portLabels.placement`,[`OUTSIDE`]),N=new i(`org.eclipse.elk.portAlignment.default`,`DISTRIBUTED`),P=new i(`org.eclipse.elk.portAlignment.north`,`DISTRIBUTED`),F=new i(`org.eclipse.elk.portAlignment.south`,`DISTRIBUTED`),I=new i(`org.eclipse.elk.portAlignment.east`,`DISTRIBUTED`),L=new i(`org.eclipse.elk.portAlignment.west`,`DISTRIBUTED`),gn=new i(`org.eclipse.elk.layered.layerUnzipping.strategy`,`NONE`),_n=new i(`org.eclipse.elk.layered.layerUnzipping.layerSplit`,2),vn=new i(`org.eclipse.elk.layered.layerUnzipping.minimizeEdgeLength`,!1),yn=new i(`org.eclipse.elk.layered.layerUnzipping.resetOnLongEdges`,!0),bn=new i(`org.eclipse.elk.layered.nodePlacement.favorStraightEdges`,null),xn=new i(`org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment`,`NONE`),Sn=new i(`org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening`,`IMPROVE_STRAIGHTNESS`),Cn=new i(`org.eclipse.elk.layered.priority.straightness`,0),R=new i(`org.eclipse.elk.spacing.portPort`,10),wn=new i(`org.eclipse.elk.spacing.edgeNode`,10),Tn=new i(`org.eclipse.elk.edgeRouting`,`ORTHOGONAL`),En=new i(`org.eclipse.elk.commentBox`,!1),Dn=new i(`org.eclipse.elk.spacing.commentComment`,10),On=new i(`org.eclipse.elk.spacing.commentNode`,10),kn=new i(`org.eclipse.elk.layered.edgeRouting.splines.mode`,`SLOPPY`),An=new i(`org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor`,.2),jn=new i(`org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers`,10),Mn=new i(`org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers`,10),Nn=new i(`org.eclipse.elk.edge.thickness`,1),Pn=new i(`org.eclipse.elk.spacing.edgeLabel`,2),Fn=new i(`org.eclipse.elk.spacing.nodeSelfLoop`,10),z=new i(`org.eclipse.elk.spacing.labelLabel`,0),B=new i(`org.eclipse.elk.spacing.labelNode`,5),V=new i(`org.eclipse.elk.spacing.labelPortHorizontal`,1),H=new i(`org.eclipse.elk.spacing.labelPortVertical`,1),In=new i(`org.eclipse.elk.spacing.componentComponent`,20),Ln=new i(`org.eclipse.elk.layered.edgeRouting.selfLoopDistribution`,`NORTH`),Rn=new i(`org.eclipse.elk.layered.edgeRouting.selfLoopOrdering`,`STACKED`),zn=new i(`org.eclipse.elk.layered.directionCongruency`,`READING_DIRECTION`),Bn=new i(`org.eclipse.elk.junctionPoints`,null);new i(`org.eclipse.elk.edgeLabels.placement`,`UNDEFINED`);const Vn=new i(`org.eclipse.elk.layered.edgeLabels.sideSelection`,`SMART_DOWN`),Hn=new i(`org.eclipse.elk.layered.interactiveReferencePoint`,`CENTER`),Un=new i(`org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth`,2),Wn=new i(`org.eclipse.elk.layered.crossingMinimization.greedySwitch.type`,`TWO_SIDED`),Gn=new i(`org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold`,40);new i(`org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type`,`OFF`);const Kn=new i(`org.eclipse.elk.layered.crossingMinimization.semiInteractive`,!1),qn=new i(`org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility`,`NONE`),Jn=new i(`org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default`,`NONE`),Yn=new i(`org.eclipse.elk.alignment`,`AUTOMATIC`),Xn=new i(`org.eclipse.elk.layered.edgeLabels.centerLabelPlacementStrategy`,`MEDIAN_LAYER`),Zn=new i(`org.eclipse.elk.layered.layering.layerId`,-1),Qn=new i(`org.eclipse.elk.layered.crossingMinimization.positionId`,-1),$n=new i(`org.eclipse.elk.hypernode`,!1),er=new i(`org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.recomputeNodePlacement`,null),tr=new i(`org.eclipse.elk.layered.wrapping.strategy`,`OFF`),nr=new i(`org.eclipse.elk.layered.wrapping.additionalEdgeSpacing`,10),rr=new i(`org.eclipse.elk.layered.wrapping.correctionFactor`,1),ir=new i(`org.eclipse.elk.layered.wrapping.cutting.strategy`,`MSD`),ar=new i(`org.eclipse.elk.layered.wrapping.cutting.cuts`,null),or=new i(`org.eclipse.elk.layered.wrapping.cutting.msd.freedom`,1),sr=new i(`org.eclipse.elk.layered.wrapping.validify.strategy`,`GREEDY`),cr=new i(`org.eclipse.elk.layered.wrapping.validify.forbiddenIndices`,null),lr=new i(`org.eclipse.elk.layered.wrapping.multiEdge.improveCuts`,!0),ur=new i(`org.eclipse.elk.layered.wrapping.multiEdge.distancePenalty`,2),dr=new i(`org.eclipse.elk.layered.wrapping.multiEdge.improveWrappedEdges`,!0);n(S),n(C),n(w),n(T),n(D),n(O),n(A),n(k),n(j),n(M),n(N),n(P),n(F),n(I),n(L),n(R),n(z),n(B),n(V),n(H),r(`org.eclipse.elk.portLabels.treatAsGroup`);function U(e){return e.trim().toLowerCase().replace(/^org\.eclipse\.elk\./,``).replace(/^elk\./,``)}const W=/* @__PURE__ */ new Set([`layered`,`elk.layered`,`org.eclipse.elk.layered`]),G=/* @__PURE__ */ new Set([`box`,`elk.box`,`org.eclipse.elk.box`,`fixed`,`elk.fixed`,`org.eclipse.elk.fixed`,`random`,`elk.random`,`org.eclipse.elk.random`]),K=/* @__PURE__ */ new Set([`stress`,`elk.stress`,`org.eclipse.elk.stress`,`force`,`elk.force`,`org.eclipse.elk.force`]),q=/* @__PURE__ */ new Set([`rectpacking`,`elk.rectpacking`,`org.eclipse.elk.rectpacking`]),J=/* @__PURE__ */ new Set([`topdownpacking`,`elk.topdownpacking`,`org.eclipse.elk.topdownpacking`]),Y=/* @__PURE__ */ new Set([`sporeoverlap`,`elk.sporeoverlap`,`org.eclipse.elk.sporeoverlap`,`sporecompaction`,`elk.sporecompaction`,`org.eclipse.elk.sporecompaction`]),X=/* @__PURE__ */ new Set([`radial`,`elk.radial`,`org.eclipse.elk.radial`]),Z=/* @__PURE__ */ new Set([`vertiflex`,`elk.vertiflex`,`org.eclipse.elk.vertiflex`,`org.eclipse.elk.alg.vertiflex`]),Q=/* @__PURE__ */ new Set([`disco`,`elk.disco`,`org.eclipse.elk.disco`]),$=/* @__PURE__ */ new Set([`mrtree`,`elk.mrtree`,`org.eclipse.elk.mrtree`,`org.eclipse.elk.alg.mrtree`]),fr=/* @__PURE__ */ new Set([.../* @__PURE__ */ new Set([...[...W,...G,...K,...q,...J,...Y,...X,...Z,...Q,...$].map(U)])]);function pr(e){return typeof e==`string`&&e.trim()!==``&&fr.has(U(e))}export{Nt as $,$e as $n,ae as $r,Ft as $t,Wn as A,b as An,Je as Ar,N as At,Tn as B,Be as Bn,re as Br,Ct as Bt,Qt as C,dr as Cn,ft as Cr,er as Ct,Jt as D,x as Dn,f as Dr,A as Dt,$t as E,sr as En,h as Er,k as Et,yt as F,at as Fn,ye as Fr,wt as Ft,Dt as G,Ye as Gn,ce as Gr,Cn as Gt,kn as H,Ke as Hn,pe as Hr,un as Ht,zn as I,d as In,te as Ir,S as It,mn as J,Le as Jn,se as Jr,Rn as Jt,Wt as K,_ as Kn,fe as Kr,Rt as Kt,Et as L,y as Ln,u as Lr,C as Lt,Kn as M,Oe as Mn,ve as Mr,P as Mt,Ht as N,et as Nn,xe as Nr,F as Nt,qt as O,Ze as On,m as Or,dn as Ot,an as P,it as Pn,be as Pr,L as Pt,w as Q,Qe as Qn,me as Qr,In as Qt,Xn as R,gt as Rn,l as Rr,xt as Rt,Xt as S,lr as Sn,v as Sr,Jn as St,Yt as T,cr as Tn,p as Tr,O as Tt,An as U,ke as Un,oe as Ur,vt as Ut,Un as V,qe as Vn,le as Vr,St as Vt,Nn as W,Ae as Wn,ne as Wr,zt as Wt,hn as X,Me as Xn,ie as Xr,Dn as Xt,pn as Y,Fe as Yn,de as Yr,Ut as Yt,$n as Z,Xe as Zn,ue as Zr,On as Zt,jt as _,rr as _n,je as _r,j as _t,$ as a,i as ai,z as an,Ge as ar,Zn as at,rn as b,ir as bn,g as br,bn as bt,Y as c,H as cn,Ve as cr,on as ct,pr as d,Fn as dn,mt as dr,vn as dt,he as ei,jn as en,nt as er,E as et,U as f,T as fn,ze as fr,yn as ft,En as g,nr as gn,Pe as gr,D as gt,bt as h,Mt as hn,Ie as hr,Ot as ht,W as i,a as ii,Pt as in,ct as ir,Tt as it,Qn as j,Ue as jn,Ee as jr,I as jt,Gn as k,De as kn,We as kr,fn as kt,J as l,It as ln,Te as lr,Gt as lt,tn as m,Bt as mn,pt as mr,kt as mt,Q as n,c as ni,wn as nn,lt as nr,Bn as nt,X as o,B as on,_t as or,cn as ot,Yn as p,R as pn,Re as pr,gn as pt,Vt as q,we as qn,ge as qr,Ln as qt,K as r,s as ri,Mn as rn,st as rr,sn as rt,q as s,V as sn,He as sr,ln as st,G as t,Se as ti,Pn as tn,ut as tr,Hn as tt,Z as u,Lt as un,ht as ur,_n as ut,At as v,ar as vn,rt as vr,Sn as vt,nn as w,tr as wn,ot as wr,Kt as wt,Zt as x,ur as xn,tt as xr,qn as xt,en as y,or as yn,Ne as yr,xn as yt,Vn as z,dt as zn,_e as zr,M as zt};
|