schematex 0.4.2 → 0.4.3
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/dist/ai/ai-sdk.cjs +16 -14
- package/dist/ai/ai-sdk.cjs.map +1 -1
- package/dist/ai/ai-sdk.d.cts +1 -1
- package/dist/ai/ai-sdk.d.ts +1 -1
- package/dist/ai/ai-sdk.js +11 -9
- package/dist/ai/ai-sdk.js.map +1 -1
- package/dist/ai/index.cjs +19 -17
- package/dist/ai/index.d.cts +1 -1
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.js +11 -9
- package/dist/browser.cjs +13 -11
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +11 -9
- package/dist/browser.js.map +1 -1
- package/dist/chunk-2KTQ75LN.js +67 -0
- package/dist/chunk-2KTQ75LN.js.map +1 -0
- package/dist/chunk-3KRL2EGN.cjs +70 -0
- package/dist/chunk-3KRL2EGN.cjs.map +1 -0
- package/dist/{chunk-YWDODCW2.js → chunk-3M6T7KB4.js} +60 -14
- package/dist/chunk-3M6T7KB4.js.map +1 -0
- package/dist/{chunk-OIZ4MYSF.cjs → chunk-3M6WB62Y.cjs} +43 -9
- package/dist/chunk-3M6WB62Y.cjs.map +1 -0
- package/dist/{chunk-KVP7AORH.js → chunk-6IGSKU6D.js} +61 -12
- package/dist/chunk-6IGSKU6D.js.map +1 -0
- package/dist/{chunk-JDBG5DU2.js → chunk-6OSUNBZY.js} +43 -9
- package/dist/chunk-6OSUNBZY.js.map +1 -0
- package/dist/{chunk-O5POCPXZ.cjs → chunk-EGSUMHCS.cjs} +21 -10
- package/dist/chunk-EGSUMHCS.cjs.map +1 -0
- package/dist/{chunk-5FF2IT3C.js → chunk-IBRW3UOA.js} +51 -10
- package/dist/chunk-IBRW3UOA.js.map +1 -0
- package/dist/{chunk-LPKVIRYT.js → chunk-JHDR56XO.js} +18 -9
- package/dist/chunk-JHDR56XO.js.map +1 -0
- package/dist/{chunk-Z5NGIM4Z.js → chunk-KWQTF6ZL.js} +30 -13
- package/dist/chunk-KWQTF6ZL.js.map +1 -0
- package/dist/{chunk-Z5UECSNM.cjs → chunk-N3SLYVNW.cjs} +47 -1785
- package/dist/chunk-N3SLYVNW.cjs.map +1 -0
- package/dist/{chunk-GZY4CJ23.cjs → chunk-N7W5KZK7.cjs} +51 -10
- package/dist/chunk-N7W5KZK7.cjs.map +1 -0
- package/dist/chunk-PIV2A3HG.js +55 -0
- package/dist/chunk-PIV2A3HG.js.map +1 -0
- package/dist/chunk-SBB6C4OP.cjs +57 -0
- package/dist/chunk-SBB6C4OP.cjs.map +1 -0
- package/dist/{chunk-DHHVYSQX.cjs → chunk-SMXU3KYA.cjs} +38 -21
- package/dist/chunk-SMXU3KYA.cjs.map +1 -0
- package/dist/{chunk-K6RAUXRQ.cjs → chunk-TZTCIAYW.cjs} +7 -6
- package/dist/chunk-TZTCIAYW.cjs.map +1 -0
- package/dist/{chunk-YTLGK5BZ.js → chunk-UBTKM2TB.js} +45 -1783
- package/dist/chunk-UBTKM2TB.js.map +1 -0
- package/dist/{chunk-6WORZSL3.cjs → chunk-VFZOPRQP.cjs} +60 -14
- package/dist/chunk-VFZOPRQP.cjs.map +1 -0
- package/dist/{chunk-E2EJRVWS.cjs → chunk-VITE3MZQ.cjs} +61 -12
- package/dist/chunk-VITE3MZQ.cjs.map +1 -0
- package/dist/{chunk-WHNIK4LK.js → chunk-VJGMEGMR.js} +7 -6
- package/dist/chunk-VJGMEGMR.js.map +1 -0
- package/dist/{chunk-3MJKJX27.cjs → chunk-VZ5LDNHK.cjs} +18 -9
- package/dist/chunk-VZ5LDNHK.cjs.map +1 -0
- package/dist/{chunk-6XGSEG3K.js → chunk-ZL5RB4UV.js} +21 -10
- package/dist/chunk-ZL5RB4UV.js.map +1 -0
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.cjs +7 -6
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -1
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.cjs +8 -7
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -1
- package/dist/diagrams/flowchart/index.cjs +8 -7
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -1
- package/dist/diagrams/genogram/index.cjs +9 -8
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -1
- package/dist/diagrams/ladder/index.cjs +7 -5
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +3 -1
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.cjs +7 -6
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -1
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/sld/index.cjs +7 -5
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +3 -1
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/{index-CGK0xVls.d.ts → index-BeUVaQiD.d.ts} +1 -2
- package/dist/{index-OW8eDrKj.d.cts → index-DYpJXJcy.d.cts} +1 -2
- package/dist/index.cjs +23 -21
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +10 -8
- package/dist/react.cjs +11 -9
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +10 -8
- package/dist/react.js.map +1 -1
- package/dist/{types-Gkyab1sL.d.ts → types-DKdo-Ua_.d.cts} +1 -1
- package/dist/{types-Gkyab1sL.d.cts → types-DKdo-Ua_.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-3MJKJX27.cjs.map +0 -1
- package/dist/chunk-5FF2IT3C.js.map +0 -1
- package/dist/chunk-6WORZSL3.cjs.map +0 -1
- package/dist/chunk-6XGSEG3K.js.map +0 -1
- package/dist/chunk-DHHVYSQX.cjs.map +0 -1
- package/dist/chunk-E2EJRVWS.cjs.map +0 -1
- package/dist/chunk-GZY4CJ23.cjs.map +0 -1
- package/dist/chunk-JDBG5DU2.js.map +0 -1
- package/dist/chunk-K6RAUXRQ.cjs.map +0 -1
- package/dist/chunk-KVP7AORH.js.map +0 -1
- package/dist/chunk-LPKVIRYT.js.map +0 -1
- package/dist/chunk-O5POCPXZ.cjs.map +0 -1
- package/dist/chunk-OIZ4MYSF.cjs.map +0 -1
- package/dist/chunk-WHNIK4LK.js.map +0 -1
- package/dist/chunk-YTLGK5BZ.js.map +0 -1
- package/dist/chunk-YWDODCW2.js.map +0 -1
- package/dist/chunk-Z5NGIM4Z.js.map +0 -1
- package/dist/chunk-Z5UECSNM.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/sld/parser.ts","../src/diagrams/sld/symbols.ts","../src/diagrams/sld/layout.ts","../src/diagrams/sld/renderer.ts","../src/diagrams/sld/index.ts"],"names":["line","text","title","maxX","lines"],"mappings":"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","file":"chunk-6OSUNBZY.js","sourcesContent":["import type {\n SLDAST,\n SLDNode,\n SLDNodeType,\n SLDConnection,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\nimport { didYouMean } from \"../../core/dsl-suggest\";\n\nexport class SLDParseError extends Error {\n public line?: number;\n public source?: string;\n constructor(message: string, line?: number, source?: string) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"SLDParseError\";\n this.line = line;\n this.source = source;\n }\n}\n\nconst NODE_TYPES = new Set<SLDNodeType>([\n \"utility\", \"generator\", \"solar\", \"wind\", \"ups\",\n \"transformer\", \"transformer_dy\", \"transformer_yd\", \"transformer_yy\",\n \"transformer_dd\", \"autotransformer\", \"transformer_3winding\",\n \"bus\", \"bus_tie\", \"hub\",\n \"breaker\", \"breaker_vacuum\", \"switch\", \"switch_load\", \"ground_switch\",\n \"ats\", \"recloser\", \"sectionalizer\", \"fuse\", \"fuse_cl\",\n \"ct\", \"pt\", \"relay\", \"surge_arrester\", \"ground_fault\",\n \"motor\", \"load\", \"capacitor_bank\", \"harmonic_filter\", \"vfd\",\n \"watthour_meter\", \"demand_meter\",\n]);\n\n// IEC 60364 / BS 7671 / REBT residential vocabulary. These map onto existing\n// IEEE-315 visual primitives until issue 02 Fix C ships a typed `rcd` node\n// and per-curve breaker glyph. The mapping is conservative: every alias\n// renders as a recognisable breaker/RCD variant, no information loss beyond\n// the label-string fidelity LLMs already rely on.\nconst TYPE_ALIASES: Record<string, SLDNodeType> = {\n mcb: \"breaker\",\n mccb: \"breaker\",\n miniature_circuit_breaker: \"breaker\",\n rcd: \"ground_fault\",\n rcbo: \"ground_fault\",\n rccb: \"ground_fault\",\n differential: \"ground_fault\",\n diferencial: \"ground_fault\",\n pia: \"breaker\",\n iga: \"breaker\",\n main_switch: \"switch_load\",\n isolator: \"switch_load\",\n disconnector: \"switch_load\",\n consumer_unit: \"bus\",\n distribution_board: \"bus\",\n panel: \"bus\",\n panelboard: \"bus\",\n};\n\nfunction stripComment(s: string): string {\n // Strip `#`, `//`, or Mermaid `%%` comments. Quoted regions are respected\n // so `\"#fff\"` (a CSS color) and `\"https://…\"` survive.\n let out = \"\";\n let inQuote = false;\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]!;\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"#\") break;\n if (ch === \"/\" && s[i + 1] === \"/\") break;\n if (ch === \"%\" && s[i + 1] === \"%\") break;\n }\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) {\n return t.slice(1, -1);\n }\n return t;\n}\n\nfunction splitAttrs(inside: string): Array<[string, string]> {\n // split by commas (respecting quotes) → \"key: value\" pairs\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n\n const out: Array<[string, string]> = [];\n for (const p of parts) {\n const s = p.trim();\n if (!s) continue;\n const colon = s.indexOf(\":\");\n if (colon < 0) {\n throw new SLDParseError(`Invalid attribute \"${s}\" (missing \":\")`);\n }\n const k = s.slice(0, colon).trim();\n const v = stripQuotes(s.slice(colon + 1));\n out.push([k, v]);\n }\n return out;\n}\n\nfunction applyAttrs(node: SLDNode, attrs: Array<[string, string]>): void {\n for (const [k, v] of attrs) {\n const key = k.toLowerCase();\n if (key === \"label\") node.label = v;\n else if (key === \"voltage\") node.voltage = v;\n else if (key === \"rating\") node.rating = v;\n else if (key === \"device\") node.deviceNumber = v;\n else {\n // stash everything else as nameplate\n if (!node.nameplate) node.nameplate = {};\n node.nameplate[k] = v;\n }\n }\n}\n\n/** Join lines so that a bracketed attribute block spans a single logical line. */\nfunction joinBrackets(lines: string[]): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depth = 0;\n for (const raw of lines) {\n const line = stripComment(raw);\n if (!line.trim() && depth === 0) {\n if (buf) {\n out.push(buf);\n buf = \"\";\n }\n out.push(\"\");\n continue;\n }\n for (const ch of line) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth = Math.max(0, depth - 1);\n }\n buf = buf ? buf + \" \" + line.trim() : line;\n if (depth === 0) {\n out.push(buf);\n buf = \"\";\n }\n }\n if (buf) out.push(buf);\n return out;\n}\n\nexport function parseSLDDSL(text: string): SLDAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n const lines = joinBrackets(rawLines);\n\n let title: string | undefined;\n const nodes: SLDNode[] = [];\n const nodeMap = new Map<string, SLDNode>();\n const connections: SLDConnection[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n const line = raw.trim();\n if (!line) continue;\n\n // Header: sld \"title\"\n if (/^sld\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // Connection: A -> B [cable: \"...\", label: \"...\"]\n const connMatch = line.match(\n /^([A-Za-z][A-Za-z0-9_-]*)\\s*->\\s*([A-Za-z][A-Za-z0-9_-]*)(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (connMatch) {\n const from = connMatch[1];\n const to = connMatch[2];\n const c: SLDConnection = { from, to };\n if (connMatch[3]) {\n for (const [k, v] of splitAttrs(connMatch[3])) {\n const key = k.toLowerCase();\n if (key === \"cable\") c.cable = v;\n else if (key === \"label\") c.label = v;\n }\n }\n connections.push(c);\n continue;\n }\n\n // Node definition: ID = type [attrs]\n const nodeMatch = line.match(\n /^([A-Za-z][A-Za-z0-9_-]*)\\s*=\\s*([a-zA-Z_][a-zA-Z0-9_]*)(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (nodeMatch) {\n const id = nodeMatch[1];\n const rawType = nodeMatch[2].toLowerCase();\n // Resolve REBT/IEC residential aliases (mcb → breaker, rcbo → ground_fault…)\n // before the canonical-type check.\n const canonical = (TYPE_ALIASES[rawType] ?? rawType) as SLDNodeType;\n if (!NODE_TYPES.has(canonical)) {\n const candidates = [\n ...NODE_TYPES,\n ...Object.keys(TYPE_ALIASES),\n ];\n throw new SLDParseError(\n `Unknown node type \"${nodeMatch[2]}\" for \"${id}\"${didYouMean(rawType, candidates)}`,\n i + 1,\n line\n );\n }\n if (nodeMap.has(id)) {\n throw new SLDParseError(`Duplicate node id \"${id}\"`, i + 1, line);\n }\n const node: SLDNode = { id, nodeType: canonical };\n // If the user wrote an alias (mcb/rcbo/iga…), preserve the original word\n // as the visible label unless an explicit `label:` attribute overrides\n // it below. This keeps \"MCB\" / \"IGA\" markings on the rendered SVG.\n if (TYPE_ALIASES[rawType]) {\n node.label = rawType.toUpperCase();\n }\n if (nodeMatch[3]) {\n applyAttrs(node, splitAttrs(nodeMatch[3]));\n }\n nodes.push(node);\n nodeMap.set(id, node);\n continue;\n }\n\n throw new SLDParseError(`Cannot parse line`, i + 1, line);\n }\n\n // Validate connections\n for (const c of connections) {\n if (!nodeMap.has(c.from)) {\n throw new SLDParseError(`Connection references unknown node \"${c.from}\"`);\n }\n if (!nodeMap.has(c.to)) {\n throw new SLDParseError(`Connection references unknown node \"${c.to}\"`);\n }\n }\n\n if (nodes.length === 0) {\n throw new SLDParseError(\"SLD diagram has no nodes\");\n }\n\n return { type: \"sld\", title, nodes, connections };\n}\n","import type { SLDNodeType } from \"../../core/types\";\nimport { el, group, line, path as pathEl, text as textEl } from \"../../core/svg\";\n\n/**\n * Symbol renderers — each returns SVG markup centered at (0,0)\n * Used by the renderer after applying transform=\"translate(cx,cy)\".\n *\n * Every symbol exposes a conceptual top/bottom terminal on the vertical axis,\n * so the layout only needs to draw vertical wires between them.\n */\n\nexport interface SymbolGeometry {\n /** Bounding half-width for layout */\n halfWidth: number;\n /** Y-offset of the top terminal (negative = above center) */\n topY: number;\n /** Y-offset of the bottom terminal (positive = below center) */\n bottomY: number;\n}\n\nexport const DEFAULT_GEOMETRY: SymbolGeometry = {\n halfWidth: 20,\n topY: -20,\n bottomY: 20,\n};\n\nexport function geometryFor(type: SLDNodeType): SymbolGeometry {\n switch (type) {\n case \"utility\":\n case \"generator\":\n case \"solar\":\n case \"wind\":\n return { halfWidth: 18, topY: -24, bottomY: 18 };\n case \"transformer\":\n case \"transformer_dy\":\n case \"transformer_yd\":\n case \"transformer_yy\":\n case \"transformer_dd\":\n case \"autotransformer\":\n case \"transformer_3winding\":\n return { halfWidth: 22, topY: -24, bottomY: 24 };\n case \"breaker\":\n case \"breaker_vacuum\":\n case \"recloser\":\n case \"switch\":\n case \"switch_load\":\n case \"ground_switch\":\n case \"sectionalizer\":\n return { halfWidth: 18, topY: -18, bottomY: 18 };\n case \"fuse\":\n case \"fuse_cl\":\n return { halfWidth: 14, topY: -18, bottomY: 18 };\n case \"motor\":\n return { halfWidth: 16, topY: -16, bottomY: 22 };\n case \"load\":\n case \"capacitor_bank\":\n case \"harmonic_filter\":\n return { halfWidth: 20, topY: -14, bottomY: 14 };\n case \"vfd\":\n case \"ups\":\n return { halfWidth: 24, topY: -18, bottomY: 18 };\n case \"ats\":\n return { halfWidth: 22, topY: -18, bottomY: 18 };\n case \"ct\":\n case \"pt\":\n return { halfWidth: 10, topY: -16, bottomY: 16 };\n case \"relay\":\n return { halfWidth: 12, topY: -12, bottomY: 12 };\n case \"surge_arrester\":\n return { halfWidth: 12, topY: -16, bottomY: 26 };\n case \"watthour_meter\":\n case \"demand_meter\":\n case \"ground_fault\":\n return { halfWidth: 14, topY: -14, bottomY: 14 };\n case \"bus\":\n return DEFAULT_GEOMETRY;\n case \"hub\":\n return { halfWidth: 52, topY: -20, bottomY: 20 };\n case \"bus_tie\":\n return { halfWidth: 16, topY: -10, bottomY: 10 };\n default:\n return DEFAULT_GEOMETRY;\n }\n}\n\nfunction lineEl(x1: number, y1: number, x2: number, y2: number, cls = \"lt-sld-stroke\"): string {\n return line({ x1, y1, x2, y2, class: cls });\n}\n\nfunction utilitySymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 16, class: \"lt-sld-fill\" }),\n pathEl({ d: \"M -8 0 Q -4 -8 0 0 Q 4 8 8 0\", class: \"lt-sld-stroke\", fill: \"none\" }),\n // lead wires in/out\n lineEl(0, -24, 0, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction generatorSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 16, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: -2, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"14\" }, \"G\"),\n pathEl({ d: \"M -6 6 Q -3 1 0 6 Q 3 11 6 6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -24, 0, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction solarSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -18, y: -12, width: 36, height: 24, class: \"lt-sld-fill\" }),\n lineEl(-18, -4, 18, -4),\n lineEl(-18, 4, 18, 4),\n lineEl(-6, -12, -6, 12),\n lineEl(6, -12, 6, 12),\n lineEl(0, 12, 0, 18),\n ]);\n}\n\nfunction windSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 6, class: \"lt-sld-fill\" }),\n lineEl(0, -6, 0, -22),\n pathEl({ d: \"M 0 -6 L 14 -2 L 0 0 Z\", class: \"lt-sld-fill-dark\" }),\n pathEl({ d: \"M 0 -6 L -10 8 L 0 2 Z\", class: \"lt-sld-fill-dark\" }),\n pathEl({ d: \"M 0 -6 L -6 -18 L 2 -6 Z\", class: \"lt-sld-fill-dark\" }),\n lineEl(0, 6, 0, 18),\n ]);\n}\n\nfunction upsSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -22, y: -16, width: 44, height: 32, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"11\" }, \"UPS\"),\n ]);\n}\n\n/**\n * Transformer: two coil groups (three humps each) + polarity dots.\n * Optional winding labels (Δ or Y) are overlaid as compact glyphs.\n */\nfunction transformerSymbol(type: SLDNodeType): string {\n const pieces: string[] = [];\n // primary coil (top)\n pieces.push(\n pathEl({\n d: \"M -12 -18 A 4 4 0 0 1 -4 -18 A 4 4 0 0 1 4 -18 A 4 4 0 0 1 12 -18\",\n class: \"lt-sld-stroke\",\n fill: \"none\",\n })\n );\n // core lines\n pieces.push(lineEl(-14, -8, 14, -8));\n pieces.push(lineEl(-14, -4, 14, -4));\n // secondary coil (bottom, mirrored)\n pieces.push(\n pathEl({\n d: \"M -12 18 A 4 4 0 0 0 -4 18 A 4 4 0 0 0 4 18 A 4 4 0 0 0 12 18\",\n class: \"lt-sld-stroke\",\n fill: \"none\",\n })\n );\n // polarity dots\n pieces.push(el(\"circle\", { cx: -10, cy: -14, r: 2, class: \"lt-sld-dot\" }));\n pieces.push(el(\"circle\", { cx: 10, cy: 14, r: 2, class: \"lt-sld-dot\" }));\n // leads\n pieces.push(lineEl(0, -24, 0, -22));\n pieces.push(lineEl(0, 22, 0, 24));\n\n // Winding designators (Δ / Y / Yg)\n const { primary, secondary } = windingGlyphs(type);\n if (primary) pieces.push(textEl({ x: 20, y: -14, class: \"lt-sld-wdg\", \"text-anchor\": \"start\" }, primary));\n if (secondary) pieces.push(textEl({ x: 20, y: 18, class: \"lt-sld-wdg\", \"text-anchor\": \"start\" }, secondary));\n return group({}, pieces);\n}\n\nfunction windingGlyphs(type: SLDNodeType): { primary?: string; secondary?: string } {\n switch (type) {\n case \"transformer_dy\": return { primary: \"Δ\", secondary: \"Y\" };\n case \"transformer_yd\": return { primary: \"Y\", secondary: \"Δ\" };\n case \"transformer_yy\": return { primary: \"Y\", secondary: \"Y\" };\n case \"transformer_dd\": return { primary: \"Δ\", secondary: \"Δ\" };\n default: return {};\n }\n}\n\nfunction autotransformerSymbol(): string {\n return group({}, [\n pathEl({\n d: \"M 0 -20 A 6 6 0 0 1 0 -10 A 6 6 0 0 1 0 0 A 6 6 0 0 1 0 10 A 6 6 0 0 1 0 20\",\n class: \"lt-sld-stroke\",\n fill: \"none\",\n }),\n lineEl(6, 0, 14, 0),\n lineEl(0, -24, 0, -20),\n lineEl(0, 20, 0, 24),\n ]);\n}\n\nfunction threeWindingSymbol(): string {\n return group({}, [\n // top coil\n pathEl({ d: \"M -10 -18 A 3 3 0 0 1 -4 -18 A 3 3 0 0 1 2 -18 A 3 3 0 0 1 8 -18\", class: \"lt-sld-stroke\", fill: \"none\" }),\n // left-bottom coil\n pathEl({ d: \"M -18 6 A 3 3 0 0 1 -12 6 A 3 3 0 0 1 -6 6 A 3 3 0 0 1 0 6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n // right-bottom coil\n pathEl({ d: \"M 0 6 A 3 3 0 0 1 6 6 A 3 3 0 0 1 12 6 A 3 3 0 0 1 18 6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(-14, -8, 14, -8),\n lineEl(0, -24, 0, -18),\n lineEl(-9, 10, -9, 24),\n lineEl(9, 10, 9, 24),\n ]);\n}\n\n/** Circuit breaker: diagonal line + top arc. */\nfunction breakerSymbol(): string {\n return group({}, [\n lineEl(0, -14, 0, -10, \"lt-sld-stroke\"),\n lineEl(0, 10, 0, 14, \"lt-sld-stroke\"),\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n pathEl({ d: \"M 8 -10 Q 14 -12 12 -18\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -18, 0, -14),\n lineEl(0, 14, 0, 18),\n ]);\n}\n\nfunction vacuumBreakerSymbol(): string {\n return group({}, [\n el(\"ellipse\", { cx: 0, cy: 0, rx: 10, ry: 14, class: \"lt-sld-fill\" }),\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n textEl({ x: -2, y: -4, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-size\": \"8\" }, \"V\"),\n lineEl(0, -18, 0, -14),\n lineEl(0, 14, 0, 18),\n ]);\n}\n\nfunction recloserSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n pathEl({ d: \"M 8 -10 Q 14 -12 12 -18\", class: \"lt-sld-stroke\", fill: \"none\" }),\n pathEl({ d: \"M 14 -6 A 5 5 0 1 1 18 -4\", class: \"lt-sld-stroke\", fill: \"none\" }),\n el(\"polygon\", { points: \"18,-4 20,-8 15,-7\", class: \"lt-sld-dot\" }),\n lineEl(0, -18, 0, -14),\n lineEl(0, 14, 0, 18),\n ]);\n}\n\nfunction switchSymbol(open = false): string {\n const pieces: string[] = [];\n if (open) {\n pieces.push(line({ x1: -6, y1: 10, x2: 10, y2: -8, class: \"lt-sld-stroke-thick\" }));\n pieces.push(el(\"circle\", { cx: 10, cy: -8, r: 2, class: \"lt-sld-fill\" }));\n } else {\n pieces.push(line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }));\n }\n pieces.push(lineEl(0, -18, 0, -10));\n pieces.push(lineEl(0, 10, 0, 18));\n return group({}, pieces);\n}\n\nfunction loadSwitchSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n el(\"rect\", { x: 6, y: -14, width: 6, height: 6, class: \"lt-sld-fill\" }),\n lineEl(0, -18, 0, -10),\n lineEl(0, 10, 0, 18),\n ]);\n}\n\nfunction groundSwitchSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 0, x2: 8, y2: -14, class: \"lt-sld-stroke-thick\" }),\n lineEl(0, -18, 0, -4),\n // ground symbol\n lineEl(-8, 6, 8, 6),\n lineEl(-5, 10, 5, 10),\n lineEl(-2, 14, 2, 14),\n lineEl(0, 0, 0, 6),\n ]);\n}\n\nfunction sectionalizerSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 10, x2: 10, y2: -8, class: \"lt-sld-stroke-thick\" }),\n el(\"circle\", { cx: 10, cy: -8, r: 2, class: \"lt-sld-fill\" }),\n textEl({ x: 14, y: -4, class: \"lt-sld-wdg\", \"text-anchor\": \"start\" }, \"S\"),\n lineEl(0, -18, 0, -10),\n lineEl(0, 10, 0, 18),\n ]);\n}\n\nfunction fuseSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -5, y: -10, width: 10, height: 20, class: \"lt-sld-fill\" }),\n lineEl(0, -18, 0, -10),\n lineEl(0, 10, 0, 18),\n ]);\n}\n\nfunction fuseCLSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -6, y: -12, width: 12, height: 24, class: \"lt-sld-fill\" }),\n lineEl(-6, 0, 6, 0),\n lineEl(0, -18, 0, -12),\n lineEl(0, 12, 0, 18),\n ]);\n}\n\nfunction motorSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 14, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 5, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"13\" }, \"M\"),\n lineEl(0, -16, 0, -14),\n // 3-phase dots at bottom\n el(\"circle\", { cx: -6, cy: 12, r: 1.5, class: \"lt-sld-dot\" }),\n el(\"circle\", { cx: 0, cy: 14, r: 1.5, class: \"lt-sld-dot\" }),\n el(\"circle\", { cx: 6, cy: 12, r: 1.5, class: \"lt-sld-dot\" }),\n ]);\n}\n\nfunction loadSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -16, y: -12, width: 32, height: 24, class: \"lt-sld-fill\" }),\n ]);\n}\n\nfunction capacitorBankSymbol(): string {\n return group({}, [\n lineEl(-10, -6, 10, -6, \"lt-sld-stroke-thick\"),\n lineEl(-10, -2, 10, -2, \"lt-sld-stroke-thick\"),\n lineEl(-10, 4, 10, 4, \"lt-sld-stroke-thick\"),\n lineEl(-10, 8, 10, 8, \"lt-sld-stroke-thick\"),\n lineEl(0, -14, 0, -6),\n lineEl(0, 8, 0, 14),\n ]);\n}\n\nfunction harmonicFilterSymbol(): string {\n return group({}, [\n // L + C chained\n pathEl({ d: \"M -14 -4 A 3 3 0 0 1 -8 -4 A 3 3 0 0 1 -2 -4 A 3 3 0 0 1 4 -4\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(4, -8, 14, -8),\n lineEl(4, 0, 14, 0),\n lineEl(0, -14, 0, -4),\n lineEl(0, 4, 0, 14),\n ]);\n}\n\nfunction vfdSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -22, y: -16, width: 44, height: 32, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: -2, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"11\" }, \"VFD\"),\n pathEl({ d: \"M -10 8 Q -5 2 0 8 Q 5 14 10 8\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -18, 0, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction atsSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -22, y: -16, width: 44, height: 32, class: \"lt-sld-fill\" }),\n line({ x1: -14, y1: -8, x2: -2, y2: 6, class: \"lt-sld-stroke-thick\" }),\n line({ x1: 14, y1: -8, x2: 2, y2: 6, class: \"lt-sld-stroke-thick\" }),\n textEl({ x: 0, y: 14, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"9\" }, \"ATS\"),\n lineEl(-12, -18, -12, -16),\n lineEl(12, -18, 12, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction ctSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 7, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 3, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"7\" }, \"CT\"),\n lineEl(0, -16, 0, -7),\n lineEl(0, 7, 0, 16),\n ]);\n}\n\nfunction ptSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 7, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 3, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"7\" }, \"PT\"),\n lineEl(0, -16, 0, -7),\n lineEl(0, 7, 0, 16),\n ]);\n}\n\nfunction relaySymbol(deviceNumber?: string): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 11, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"10\" }, deviceNumber ?? \"R\"),\n ]);\n}\n\nfunction surgeArresterSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -7, y: -6, width: 14, height: 14, class: \"lt-sld-fill\" }),\n pathEl({ d: \"M -4 2 Q 0 -4 4 2\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -16, 0, -6),\n lineEl(0, 8, 0, 14),\n lineEl(-8, 14, 8, 14),\n lineEl(-5, 18, 5, 18),\n lineEl(-2, 22, 2, 22),\n ]);\n}\n\nfunction groundFaultSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 12, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"9\" }, \"GFI\"),\n lineEl(0, -14, 0, -12),\n lineEl(0, 12, 0, 14),\n ]);\n}\n\nfunction hubSymbol(label?: string): string {\n return group({}, [\n el(\"rect\", {\n x: -50, y: -18, width: 100, height: 36,\n rx: 4, ry: 4,\n class: \"lt-sld-fill\",\n \"stroke-width\": 2,\n }),\n textEl(\n { x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"11\" },\n label ?? \"HUB\"\n ),\n lineEl(0, -20, 0, -18),\n lineEl(0, 18, 0, 20),\n // left/right lead stubs for lateral ports\n lineEl(-50, 0, -54, 0),\n lineEl(50, 0, 54, 0),\n ]);\n}\n\nfunction busTieSymbol(): string {\n // Horizontal breaker: two stubs + diagonal switch bar + arc above\n return group({}, [\n lineEl(-16, 0, -4, 0),\n lineEl(4, 0, 16, 0),\n pathEl({ d: \"M -4 0 L 4 -6\", class: \"lt-sld-stroke-thick\" }),\n pathEl({ d: \"M -4 -6 Q 0 -10 4 -6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n ]);\n}\n\nfunction meterSymbol(label: string): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 12, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"9\" }, label),\n lineEl(0, -14, 0, -12),\n lineEl(0, 12, 0, 14),\n ]);\n}\n\n/** Main entry — render a node symbol at origin. */\nexport function renderSymbol(type: SLDNodeType, detail?: string): string {\n switch (type) {\n case \"utility\": return utilitySymbol();\n case \"generator\": return generatorSymbol();\n case \"solar\": return solarSymbol();\n case \"wind\": return windSymbol();\n case \"ups\": return upsSymbol();\n case \"transformer\":\n case \"transformer_dy\":\n case \"transformer_yd\":\n case \"transformer_yy\":\n case \"transformer_dd\":\n return transformerSymbol(type);\n case \"autotransformer\": return autotransformerSymbol();\n case \"transformer_3winding\": return threeWindingSymbol();\n case \"breaker\": return breakerSymbol();\n case \"breaker_vacuum\": return vacuumBreakerSymbol();\n case \"recloser\": return recloserSymbol();\n case \"switch\": return switchSymbol(true);\n case \"switch_load\": return loadSwitchSymbol();\n case \"ground_switch\": return groundSwitchSymbol();\n case \"sectionalizer\": return sectionalizerSymbol();\n case \"fuse\": return fuseSymbol();\n case \"fuse_cl\": return fuseCLSymbol();\n case \"motor\": return motorSymbol();\n case \"load\": return loadSymbol();\n case \"capacitor_bank\": return capacitorBankSymbol();\n case \"harmonic_filter\": return harmonicFilterSymbol();\n case \"vfd\": return vfdSymbol();\n case \"ats\": return atsSymbol();\n case \"ct\": return ctSymbol();\n case \"pt\": return ptSymbol();\n case \"relay\": return relaySymbol(detail);\n case \"surge_arrester\": return surgeArresterSymbol();\n case \"ground_fault\": return groundFaultSymbol();\n case \"watthour_meter\": return meterSymbol(\"Wh\");\n case \"demand_meter\": return meterSymbol(\"D\");\n case \"bus\": return \"\";\n case \"hub\": return hubSymbol(detail);\n case \"bus_tie\": return busTieSymbol();\n default: return loadSymbol();\n }\n}\n","import type { SLDAST, SLDConnection, SLDNode, SLDNodeType } from \"../../core/types\";\nimport { geometryFor } from \"./symbols\";\n\n/**\n * Top-down hierarchical layout:\n * level 0 = sources (top)\n * each edge forces child.level >= parent.level + 1\n * Bus nodes expand horizontally to span their children.\n * Other nodes are positioned in a tidy tree-like layout.\n */\n\nexport interface SLDLayoutNode {\n node: SLDNode;\n nodeType: SLDNodeType;\n /** center x */\n x: number;\n /** center y */\n y: number;\n /** Terminal y (top and bottom) after symbol geometry */\n topY: number;\n bottomY: number;\n level: number;\n /** Half width for spacing */\n halfWidth: number;\n /** For bus nodes: left and right extent (x min/max) */\n busLeft?: number;\n busRight?: number;\n}\n\nexport interface SLDLayoutEdge {\n from: string;\n to: string;\n path: string;\n cable?: string;\n label?: string;\n midX: number;\n midY: number;\n}\n\nexport interface SLDLayoutBand {\n level: number;\n voltage?: string;\n y: number;\n height: number;\n}\n\nexport interface SLDLayoutResult {\n width: number;\n height: number;\n nodes: SLDLayoutNode[];\n edges: SLDLayoutEdge[];\n bands: SLDLayoutBand[];\n nodeById: Map<string, SLDLayoutNode>;\n}\n\nconst LEVEL_SPACING = 100;\nconst H_SPACING = 90;\nconst LEFT_PADDING = 80;\nconst TOP_PADDING = 40;\nconst BUS_OVERHANG = 20;\n\nfunction computeLevels(ast: SLDAST): Map<string, number> {\n const levels = new Map<string, number>();\n const inEdges = new Map<string, SLDConnection[]>();\n const outEdges = new Map<string, SLDConnection[]>();\n for (const n of ast.nodes) {\n inEdges.set(n.id, []);\n outEdges.set(n.id, []);\n }\n for (const c of ast.connections) {\n inEdges.get(c.to)?.push(c);\n outEdges.get(c.from)?.push(c);\n }\n\n // Sources: no incoming edges\n const roots = ast.nodes.filter((n) => (inEdges.get(n.id) ?? []).length === 0);\n for (const r of roots) levels.set(r.id, 0);\n\n // Identify bus_tie nodes — they are lateral at the same level as their source.\n const typeById = new Map<string, SLDNodeType>();\n for (const n of ast.nodes) typeById.set(n.id, n.nodeType);\n const isTieEdge = (c: SLDConnection): boolean =>\n typeById.get(c.from) === \"bus_tie\" || typeById.get(c.to) === \"bus_tie\";\n\n // Relaxation: level(to) = max(level(from)+1); iterate until stable.\n // Skip edges touching bus_tie (those are lateral).\n const maxIter = ast.nodes.length + 2;\n for (let iter = 0; iter < maxIter; iter++) {\n let changed = false;\n for (const c of ast.connections) {\n if (isTieEdge(c)) continue;\n const fromLvl = levels.get(c.from);\n if (fromLvl === undefined) continue;\n const want = fromLvl + 1;\n const curr = levels.get(c.to);\n if (curr === undefined || want > curr) {\n levels.set(c.to, want);\n changed = true;\n }\n }\n if (!changed) break;\n }\n\n // Tie edges: force both endpoints and the tie node itself to share level\n // with any already-leveled participant.\n for (let iter = 0; iter < maxIter; iter++) {\n let changed = false;\n for (const c of ast.connections) {\n if (!isTieEdge(c)) continue;\n const fromLvl = levels.get(c.from);\n const toLvl = levels.get(c.to);\n const shared = fromLvl ?? toLvl;\n if (shared === undefined) continue;\n if (fromLvl === undefined || fromLvl !== shared) {\n levels.set(c.from, shared);\n changed = true;\n }\n if (toLvl === undefined || toLvl !== shared) {\n levels.set(c.to, shared);\n changed = true;\n }\n }\n if (!changed) break;\n }\n\n // Any orphaned nodes: put at level 0\n for (const n of ast.nodes) {\n if (!levels.has(n.id)) levels.set(n.id, 0);\n }\n return levels;\n}\n\nfunction orderWithinLevel(\n ast: SLDAST,\n levels: Map<string, number>\n): Map<number, string[]> {\n const byLevel = new Map<number, string[]>();\n for (const n of ast.nodes) {\n const lvl = levels.get(n.id) ?? 0;\n if (!byLevel.has(lvl)) byLevel.set(lvl, []);\n byLevel.get(lvl)!.push(n.id);\n }\n\n // Order: DFS from sources preserving declaration order.\n const visited = new Set<string>();\n const order = new Map<string, number>();\n let idx = 0;\n\n const adj = new Map<string, string[]>();\n for (const n of ast.nodes) adj.set(n.id, []);\n for (const c of ast.connections) adj.get(c.from)?.push(c.to);\n\n function dfs(id: string): void {\n if (visited.has(id)) return;\n visited.add(id);\n order.set(id, idx++);\n for (const child of adj.get(id) ?? []) dfs(child);\n }\n\n // Start from sources in declaration order\n const inEdgeCount = new Map<string, number>();\n for (const n of ast.nodes) inEdgeCount.set(n.id, 0);\n for (const c of ast.connections) {\n inEdgeCount.set(c.to, (inEdgeCount.get(c.to) ?? 0) + 1);\n }\n for (const n of ast.nodes) {\n if ((inEdgeCount.get(n.id) ?? 0) === 0) dfs(n.id);\n }\n // Fallback for any remaining nodes\n for (const n of ast.nodes) dfs(n.id);\n\n // Sort each level by the DFS order\n for (const [lvl, ids] of byLevel.entries()) {\n ids.sort((a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0));\n byLevel.set(lvl, ids);\n }\n return byLevel;\n}\n\nexport function layoutSLD(ast: SLDAST): SLDLayoutResult {\n const levels = computeLevels(ast);\n const byLevel = orderWithinLevel(ast, levels);\n const nodeMap = new Map<string, SLDNode>();\n for (const n of ast.nodes) nodeMap.set(n.id, n);\n\n // First pass: x position for all non-bus nodes.\n // Buses get x later after their children are placed.\n const layoutNodes: SLDLayoutNode[] = [];\n const byIdLayout = new Map<string, SLDLayoutNode>();\n\n const parents = new Map<string, string[]>();\n const children = new Map<string, string[]>();\n for (const n of ast.nodes) {\n parents.set(n.id, []);\n children.set(n.id, []);\n }\n for (const c of ast.connections) {\n parents.get(c.to)?.push(c.from);\n children.get(c.from)?.push(c.to);\n }\n\n const sortedLevels = Array.from(byLevel.keys()).sort((a, b) => a - b);\n const maxLevel = sortedLevels.length ? sortedLevels[sortedLevels.length - 1] : 0;\n\n // Assign sequential X for non-bus leaf-like nodes within each level.\n // Then propagate bus positions by averaging their children.\n let nextX = LEFT_PADDING;\n // x assignment helper: if children already placed, center above them; else nextX\n function placeNode(id: string): SLDLayoutNode {\n const existing = byIdLayout.get(id);\n if (existing) return existing;\n const node = nodeMap.get(id)!;\n const lvl = levels.get(id) ?? 0;\n const geom = geometryFor(node.nodeType);\n const y = TOP_PADDING + lvl * LEVEL_SPACING;\n const ln: SLDLayoutNode = {\n node,\n nodeType: node.nodeType,\n x: 0,\n y,\n topY: y + geom.topY,\n bottomY: y + geom.bottomY,\n level: lvl,\n halfWidth: geom.halfWidth,\n };\n byIdLayout.set(id, ln);\n layoutNodes.push(ln);\n return ln;\n }\n\n // Walk levels top-to-bottom placing non-bus nodes sequentially; buses get centered on children\n // We do this in two passes: first place everything sequentially, then re-center buses.\n for (const lvl of sortedLevels) {\n for (const id of byLevel.get(lvl)!) {\n const ln = placeNode(id);\n if (ln.nodeType === \"bus\") {\n // defer\n ln.x = nextX; // placeholder\n } else {\n ln.x = nextX;\n nextX += H_SPACING;\n }\n }\n }\n\n // Center buses over their children (or parents if no children)\n // Iterate multiple times to stabilize.\n for (let iter = 0; iter < 4; iter++) {\n for (const lvl of sortedLevels) {\n for (const id of byLevel.get(lvl)!) {\n const ln = byIdLayout.get(id)!;\n if (ln.nodeType !== \"bus\") continue;\n const childrenIds = children.get(id) ?? [];\n const parentIds = parents.get(id) ?? [];\n const relatedXs: number[] = [];\n for (const cid of childrenIds) {\n const c = byIdLayout.get(cid);\n if (c && c.nodeType !== \"bus_tie\") relatedXs.push(c.x);\n }\n if (relatedXs.length === 0) {\n for (const pid of parentIds) {\n const p = byIdLayout.get(pid);\n if (p && p.nodeType !== \"bus_tie\") relatedXs.push(p.x);\n }\n }\n if (relatedXs.length > 0) {\n const minX = Math.min(...relatedXs);\n const maxX = Math.max(...relatedXs);\n ln.x = (minX + maxX) / 2;\n ln.busLeft = minX - BUS_OVERHANG;\n ln.busRight = maxX + BUS_OVERHANG;\n } else {\n ln.busLeft = ln.x - 40;\n ln.busRight = ln.x + 40;\n }\n }\n }\n }\n\n // Center non-bus nodes over their child(ren), bottom-up.\n // For convergence (child has multiple parents at same level), spread\n // parents horizontally around the child instead of collapsing them to one x.\n const CONVERGENCE_SPREAD = Math.max(H_SPACING, 110);\n for (let iter = 0; iter < 4; iter++) {\n for (const lvl of [...sortedLevels].reverse()) {\n for (const id of byLevel.get(lvl)!) {\n const ln = byIdLayout.get(id)!;\n if (ln.nodeType === \"bus\" || ln.nodeType === \"bus_tie\") continue;\n const childIds = children.get(id) ?? [];\n if (childIds.length === 1) {\n const child = byIdLayout.get(childIds[0]);\n if (!child) continue;\n // Only the convergence child's parents are spread\n const siblingParents = (parents.get(child.node.id) ?? [])\n .map((pid) => byIdLayout.get(pid))\n .filter((p): p is SLDLayoutNode => !!p && p.level === lvl && p.nodeType !== \"bus\");\n if (siblingParents.length > 1) {\n // Sort by original sequential x to preserve declared order\n siblingParents.sort((a, b) => a.x - b.x);\n const n = siblingParents.length;\n const spread = Math.max(\n CONVERGENCE_SPREAD,\n (child.halfWidth * 2 + 40) / Math.max(1, n - 1)\n );\n const idx = siblingParents.indexOf(ln);\n ln.x = child.x + (idx - (n - 1) / 2) * spread;\n } else {\n ln.x = child.x;\n }\n } else if (childIds.length > 1) {\n const xs = childIds\n .map((c) => byIdLayout.get(c)?.x)\n .filter((v): v is number => v !== undefined);\n if (xs.length > 0) {\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n }\n }\n }\n\n // Bus-tie lateral placement: place tie and its \"second bus\" to the right\n // of the \"first bus\" at the same level. Shift the entire busB cluster\n // (all nodes reachable from busB excluding busA/tie) so the whole\n // right-side subtree moves together.\n for (const ln of layoutNodes) {\n if (ln.nodeType !== \"bus_tie\") continue;\n const inIds = parents.get(ln.node.id) ?? [];\n const outIds = children.get(ln.node.id) ?? [];\n const busA = inIds.map((id) => byIdLayout.get(id)).find((n) => n?.nodeType === \"bus\");\n const busB = outIds.map((id) => byIdLayout.get(id)).find((n) => n?.nodeType === \"bus\");\n if (!busA || !busB) continue;\n\n const busAChildren = (children.get(busA.node.id) ?? [])\n .map((id) => byIdLayout.get(id))\n .filter((c): c is SLDLayoutNode => !!c && c.nodeType !== \"bus_tie\");\n const busAMaxX = busAChildren.length\n ? Math.max(...busAChildren.map((c) => c.x))\n : busA.x;\n ln.y = busA.y;\n ln.x = busAMaxX + 60;\n\n // Cluster of busB: BFS in both directions excluding busA and tie itself\n const cluster = new Set<string>([busB.node.id]);\n const queue = [busB.node.id];\n const excluded = new Set<string>([busA.node.id, ln.node.id]);\n while (queue.length) {\n const cur = queue.shift()!;\n const neighbors = [...(children.get(cur) ?? []), ...(parents.get(cur) ?? [])];\n for (const nb of neighbors) {\n if (cluster.has(nb) || excluded.has(nb)) continue;\n cluster.add(nb);\n queue.push(nb);\n }\n }\n\n // Shift whole cluster so its leftmost member sits just right of the tie\n let minClusterX = Infinity;\n for (const id of cluster) {\n const n = byIdLayout.get(id);\n if (!n) continue;\n const left = n.nodeType === \"bus\" ? (n.busLeft ?? n.x) : n.x - n.halfWidth;\n if (left < minClusterX) minClusterX = left;\n }\n const desiredLeft = ln.x + 30;\n const shift = desiredLeft - minClusterX;\n if (shift > 0) {\n for (const id of cluster) {\n const n = byIdLayout.get(id);\n if (!n) continue;\n n.x += shift;\n if (n.busLeft !== undefined) n.busLeft += shift;\n if (n.busRight !== undefined) n.busRight += shift;\n }\n }\n }\n\n // Label-aware collision resolution within each level.\n // For each non-bus node, estimate displayed label width so sibling\n // placement respects text, not just symbol geometry.\n const labelHalfWidth = (ln: SLDLayoutNode): number => {\n if (ln.nodeType === \"bus\" || ln.nodeType === \"bus_tie\") return 0;\n const node = ln.node;\n const txtParts: string[] = [node.label ?? node.id];\n if (node.rating) txtParts.push(node.rating);\n const longest = txtParts.reduce((m, s) => Math.max(m, s.length), 0);\n // Bold 11px sans-serif id is ~6.2px per char at widest; pad a bit.\n return (longest * 6.2) / 2 + 4;\n };\n\n for (const lvl of sortedLevels) {\n const ids = byLevel.get(lvl)!;\n const sorted = ids.map((id) => byIdLayout.get(id)!).sort((a, b) => a.x - b.x);\n for (let i = 1; i < sorted.length; i++) {\n const prev = sorted[i - 1];\n const cur = sorted[i];\n if (prev.nodeType === \"bus\" && cur.nodeType !== \"bus\") continue;\n if (cur.nodeType === \"bus\" && prev.nodeType !== \"bus\") continue;\n const symGap =\n (prev.nodeType === \"bus\" ? 0 : prev.halfWidth) +\n (cur.nodeType === \"bus\" ? 0 : cur.halfWidth) +\n 16;\n const labelGap = labelHalfWidth(prev) + labelHalfWidth(cur) + 8;\n const minGap = Math.max(symGap, labelGap);\n if (cur.x - prev.x < minGap) {\n cur.x = prev.x + minGap;\n }\n }\n }\n\n // Bus nodes: re-update extent after collision resolution\n for (const ln of layoutNodes) {\n if (ln.nodeType !== \"bus\") continue;\n const childrenIds = children.get(ln.node.id) ?? [];\n const parentIds = parents.get(ln.node.id) ?? [];\n const xs: number[] = [];\n for (const cid of [...childrenIds, ...parentIds]) {\n const rel = byIdLayout.get(cid);\n if (rel && rel.nodeType !== \"bus_tie\") xs.push(rel.x);\n }\n // Include tie x so bus stretches up to the tie (but doesn't center on it)\n const tieXs: number[] = [];\n for (const cid of [...childrenIds, ...parentIds]) {\n const rel = byIdLayout.get(cid);\n if (rel && rel.nodeType === \"bus_tie\") tieXs.push(rel.x);\n }\n if (xs.length > 0) {\n let left = Math.min(...xs) - BUS_OVERHANG;\n let right = Math.max(...xs) + BUS_OVERHANG;\n for (const tx of tieXs) {\n if (tx < left) left = tx;\n if (tx > right) right = tx;\n }\n ln.busLeft = left;\n ln.busRight = right;\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n\n // Update terminal Ys\n for (const ln of layoutNodes) {\n const geom = geometryFor(ln.nodeType);\n ln.topY = ln.y + geom.topY;\n ln.bottomY = ln.y + geom.bottomY;\n }\n\n // Build edges\n const edges: SLDLayoutEdge[] = [];\n for (const c of ast.connections) {\n const from = byIdLayout.get(c.from);\n const to = byIdLayout.get(c.to);\n if (!from || !to) continue;\n\n const fx = from.x;\n const tx = to.x;\n const lateralTie =\n from.nodeType === \"bus_tie\" ||\n to.nodeType === \"bus_tie\" ||\n (from.level === to.level && (from.nodeType === \"bus\" || to.nodeType === \"bus\"));\n\n let startY: number;\n let endY: number;\n if (lateralTie) {\n startY = from.y;\n endY = to.y;\n } else {\n startY = from.nodeType === \"bus\" ? from.y : from.bottomY;\n endY = to.nodeType === \"bus\" ? to.y : to.topY;\n }\n\n let pathD: string;\n if (lateralTie) {\n // Horizontal segment at common y; small stubs if tie sits on bus y\n pathD = `M ${fx} ${startY} L ${tx} ${endY}`;\n } else if (Math.abs(fx - tx) < 0.5) {\n pathD = `M ${fx} ${startY} L ${tx} ${endY}`;\n } else {\n // L-path: go down halfway, then horizontal, then vertical\n const midY = (startY + endY) / 2;\n pathD = `M ${fx} ${startY} L ${fx} ${midY} L ${tx} ${midY} L ${tx} ${endY}`;\n }\n\n edges.push({\n from: c.from,\n to: c.to,\n path: pathD,\n cable: c.cable,\n label: c.label,\n midX: (fx + tx) / 2,\n midY: (startY + endY) / 2,\n });\n }\n\n // Compute bands (voltage regions)\n const bands: SLDLayoutBand[] = [];\n for (const lvl of sortedLevels) {\n // Find a representative voltage label for this band\n let voltage: string | undefined;\n for (const id of byLevel.get(lvl)!) {\n const n = nodeMap.get(id)!;\n if (n.voltage) {\n voltage = n.voltage;\n break;\n }\n }\n bands.push({\n level: lvl,\n voltage,\n y: TOP_PADDING + lvl * LEVEL_SPACING - LEVEL_SPACING / 2 + 10,\n height: LEVEL_SPACING,\n });\n }\n\n // Normalize X so the leftmost content sits at LEFT_PADDING (no empty left gutter).\n let contentMinX = Infinity;\n for (const ln of layoutNodes) {\n const left = ln.nodeType === \"bus\"\n ? (ln.busLeft ?? ln.x)\n : ln.x - ln.halfWidth;\n if (left < contentMinX) contentMinX = left;\n }\n if (!Number.isFinite(contentMinX)) contentMinX = 0;\n const xShift = LEFT_PADDING - contentMinX;\n if (Math.abs(xShift) > 0.5) {\n for (const ln of layoutNodes) {\n ln.x += xShift;\n if (ln.busLeft !== undefined) ln.busLeft += xShift;\n if (ln.busRight !== undefined) ln.busRight += xShift;\n }\n for (const e of edges) {\n e.midX += xShift;\n // Shift every \"x\" coord in the path string (M / L tokens are \"x y\" pairs).\n e.path = e.path.replace(\n /([ML])\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)/g,\n (_m, cmd, x, y) => `${cmd} ${Number(x) + xShift} ${y}`\n );\n }\n }\n\n // Compute canvas size\n let maxX = 0;\n for (const ln of layoutNodes) {\n const right = (ln.busRight ?? (ln.x + ln.halfWidth)) + 60;\n if (right > maxX) maxX = right;\n }\n const width = Math.max(400, maxX + 40);\n const height = TOP_PADDING + maxLevel * LEVEL_SPACING + 120;\n\n return {\n width,\n height,\n nodes: layoutNodes,\n edges,\n bands,\n nodeById: byIdLayout,\n };\n}\n","import type { SLDAST, SLDNode, RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n defs,\n} from \"../../core/svg\";\nimport { resolveIndustrialTheme, type IndustrialTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { layoutSLD, type SLDLayoutNode } from \"./layout\";\nimport { renderSymbol } from \"./symbols\";\n\ntype IT = ResolvedTheme<IndustrialTokens>;\n\n// Zebra-band fills for grouped rows. Local to SLD — no other diagram uses\n// alternating row backgrounds, so they don't need to live in IndustrialTokens.\nconst BAND_ODD_LIGHT = \"#f7f7f7\";\nconst BAND_EVEN_LIGHT = \"#fbfbfb\";\nconst BAND_ODD_DARK = \"#2a2b3c\";\nconst BAND_EVEN_DARK = \"#313244\";\n\nfunction buildCss(t: IT): string {\n const isDark = t.bg !== \"#ffffff\";\n const bandOdd = isDark ? BAND_ODD_DARK : BAND_ODD_LIGHT;\n const bandEven = isDark ? BAND_EVEN_DARK : BAND_EVEN_LIGHT;\n return `\n.lt-sld { font-family: system-ui, -apple-system, sans-serif; }\n.lt-sld-stroke { stroke: ${t.stroke}; stroke-width: 1.8; fill: none; }\n.lt-sld-stroke-thick { stroke: ${t.stroke}; stroke-width: 2.4; fill: none; stroke-linecap: round; }\n.lt-sld-fill { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 2; }\n.lt-sld-fill-dark { fill: ${t.stroke}; stroke: ${t.stroke}; stroke-width: 1; }\n.lt-sld-dot { fill: ${t.stroke}; stroke: none; }\n.lt-sld-wire { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-sld-bus { stroke: ${t.strokeHeavy}; stroke-width: 6; stroke-linecap: square; }\n.lt-sld-band-odd { fill: ${bandOdd}; stroke: none; }\n.lt-sld-band-even { fill: ${bandEven}; stroke: none; }\n.lt-sld-band-label { font: bold 11px sans-serif; fill: ${t.textMuted}; }\n.lt-sld-title { font: bold 16px sans-serif; fill: ${t.text}; }\n.lt-sld-id { font: bold 11px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-sld-rating { font: 9px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-sld-voltage { font: bold 10px sans-serif; fill: ${t.textMuted}; }\n.lt-sld-nameplate { font: 9px sans-serif; fill: ${t.textMuted}; }\n.lt-sld-cable { font: 9px ui-monospace, SFMono-Regular, Menlo, monospace; fill: ${t.textMuted}; }\n.lt-sld-symbol-text { font: 11px sans-serif; fill: ${t.text}; dominant-baseline: middle; }\n.lt-sld-wdg { font: bold 10px sans-serif; fill: ${t.stroke}; dominant-baseline: middle; }\n.lt-sld-bus-label { font: bold 11px sans-serif; fill: ${t.accent}; }\n`.trim();\n}\n\nfunction renderLabels(ln: SLDLayoutNode): string[] {\n const pieces: string[] = [];\n const { node } = ln;\n if (ln.nodeType === \"bus\") {\n // Bus label + voltage sits above the bus bar\n const label = node.label ?? node.id;\n pieces.push(\n textEl(\n { x: (ln.busLeft ?? ln.x - 40) + 4, y: ln.y - 8, class: \"lt-sld-bus-label\" },\n node.voltage ? `${node.voltage} · ${label}` : label\n )\n );\n return pieces;\n }\n\n if (ln.nodeType === \"hub\") {\n // Label rendered inside the hub rect; skip external ID.\n if (node.rating || node.voltage) {\n const lines: string[] = [];\n if (node.rating) lines.push(node.rating);\n if (node.voltage) lines.push(node.voltage);\n lines.forEach((l, i) => {\n pieces.push(\n textEl(\n { x: ln.x, y: ln.bottomY + 14 + i * 11, class: \"lt-sld-rating\" },\n l\n )\n );\n });\n }\n return pieces;\n }\n\n if (ln.nodeType === \"bus_tie\") {\n // Tie breaker label to the side\n pieces.push(\n textEl(\n { x: ln.x, y: ln.topY - 6, class: \"lt-sld-rating\" },\n node.label ?? node.id\n )\n );\n return pieces;\n }\n\n // ID above\n const idY = ln.topY - 22;\n pieces.push(\n textEl({ x: ln.x, y: idY, class: \"lt-sld-id\" }, node.label ?? node.id)\n );\n\n // Rating below\n const lines: string[] = [];\n if (node.rating) lines.push(node.rating);\n if (node.voltage) lines.push(node.voltage);\n if (node.deviceNumber && ln.nodeType === \"relay\") {\n // deviceNumber is shown inside the relay glyph; skip here\n }\n lines.forEach((l, i) => {\n pieces.push(\n textEl(\n { x: ln.x, y: ln.bottomY + 14 + i * 11, class: \"lt-sld-rating\" },\n l\n )\n );\n });\n\n // Transformer nameplate\n if (\n (ln.nodeType === \"transformer\" ||\n ln.nodeType === \"transformer_dy\" ||\n ln.nodeType === \"transformer_yd\" ||\n ln.nodeType === \"transformer_yy\" ||\n ln.nodeType === \"transformer_dd\" ||\n ln.nodeType === \"autotransformer\" ||\n ln.nodeType === \"transformer_3winding\") &&\n node.nameplate\n ) {\n const np = node.nameplate;\n const keys = Object.keys(np);\n let offset = -12;\n const x = ln.x + ln.halfWidth + 28;\n for (const k of keys) {\n pieces.push(\n textEl(\n { x, y: ln.y + offset, class: \"lt-sld-nameplate\" },\n `${k}: ${np[k]}`\n )\n );\n offset += 11;\n }\n }\n\n return pieces;\n}\n\nexport function renderSLD(ast: SLDAST, config?: RenderConfig): string {\n const layout = layoutSLD(ast);\n const t = resolveIndustrialTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 34 : 12;\n const width = Math.ceil(layout.width);\n const height = Math.ceil(layout.height + titleOffset);\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Single-Line Diagram\"));\n children.push(\n desc(\n `Single-line diagram with ${ast.nodes.length} nodes and ${ast.connections.length} connections`\n )\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n // Arrow marker\n children.push(\n defs([\n el(\n \"marker\",\n {\n id: \"lt-sld-arrow\",\n markerWidth: 8,\n markerHeight: 8,\n refX: 6,\n refY: 3,\n orient: \"auto\",\n markerUnits: \"strokeWidth\",\n },\n [el(\"path\", { d: \"M 0 0 L 6 3 L 0 6 z\", fill: t.textMuted })]\n ),\n ])\n );\n\n if (ast.title) {\n children.push(\n textEl({ x: 20, y: 22, class: \"lt-sld-title\" }, ast.title)\n );\n }\n\n const inner: string[] = [];\n\n // Voltage bands (alternating background)\n layout.bands.forEach((b, i) => {\n inner.push(\n el(\"rect\", {\n x: 0,\n y: b.y,\n width: layout.width,\n height: b.height,\n class: i % 2 === 0 ? \"lt-sld-band-odd\" : \"lt-sld-band-even\",\n })\n );\n if (b.voltage) {\n inner.push(\n textEl(\n { x: 14, y: b.y + 18, class: \"lt-sld-band-label\" },\n b.voltage\n )\n );\n }\n });\n\n // Connection wires (draw before symbols so symbols sit on top)\n for (const e of layout.edges) {\n inner.push(pathEl({ d: e.path, class: \"lt-sld-wire\" }));\n if (e.cable) {\n // Position cable label near midpoint, slightly offset\n inner.push(\n textEl(\n { x: e.midX + 6, y: e.midY - 2, class: \"lt-sld-cable\" },\n e.cable\n )\n );\n }\n if (e.label) {\n inner.push(\n textEl(\n { x: e.midX + 6, y: e.midY + 10, class: \"lt-sld-cable\" },\n e.label\n )\n );\n }\n }\n\n // Nodes\n for (const ln of layout.nodes) {\n if (ln.nodeType === \"bus\") {\n const left = ln.busLeft ?? ln.x - 40;\n const right = ln.busRight ?? ln.x + 40;\n inner.push(\n el(\"line\", {\n x1: left,\n y1: ln.y,\n x2: right,\n y2: ln.y,\n class: \"lt-sld-bus\",\n \"data-id\": ln.node.id,\n })\n );\n for (const piece of renderLabels(ln)) inner.push(piece);\n continue;\n }\n const attrs = {\n transform: `translate(${ln.x}, ${ln.y})`,\n \"data-type\": ln.nodeType,\n \"data-id\": ln.node.id,\n };\n inner.push(\n group(attrs, [\n renderSymbol(\n ln.nodeType,\n ln.nodeType === \"hub\"\n ? ln.node.label ?? ln.node.id\n : (ln.node as SLDNode).deviceNumber\n ),\n ])\n );\n for (const piece of renderLabels(ln)) inner.push(piece);\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-sld\",\n role: \"img\",\n \"aria-labelledby\": \"lt-sld-title lt-sld-desc\",\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseSLDDSL } from \"./parser\";\nimport { renderSLD } from \"./renderer\";\n\nexport const sld: DiagramPlugin = {\n type: \"sld\",\n detect(text: string): boolean {\n const first = firstContentLine(text)?.toLowerCase() ?? \"\";\n return first.startsWith(\"sld\");\n },\n parse: parseSLDDSL,\n\n render(text: string, config): string {\n const ast = parseSLDDSL(text);\n return renderSLD(ast, config);\n },\n};\n\nexport { parseSLDDSL } from \"./parser\";\nexport { renderSLD } from \"./renderer\";\nexport { layoutSLD } from \"./layout\";\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunk3KRL2EGN_cjs = require('./chunk-3KRL2EGN.cjs');
|
|
3
4
|
var chunk5UCXMYE7_cjs = require('./chunk-5UCXMYE7.cjs');
|
|
4
5
|
var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
|
|
5
6
|
var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
|
|
@@ -33,13 +34,23 @@ var VALID_STATUS = /* @__PURE__ */ new Set(["deceased", "stillborn", "pregnancy"
|
|
|
33
34
|
function parsePedigree(text2) {
|
|
34
35
|
const rawLines = text2.split("\n");
|
|
35
36
|
let i = 0;
|
|
36
|
-
while (i < rawLines.length && rawLines[i].trim() === "") i
|
|
37
|
+
while (i < rawLines.length && (rawLines[i].trim() === "" || rawLines[i].trim().startsWith("#") || rawLines[i].trim().startsWith("//") || rawLines[i].trim().startsWith("%%"))) {
|
|
38
|
+
i++;
|
|
39
|
+
}
|
|
37
40
|
if (i >= rawLines.length) throw new PedigreeParseError("Empty input", 1);
|
|
38
41
|
const headerLine = rawLines[i].trim();
|
|
39
|
-
const headerMatch = headerLine.match(
|
|
40
|
-
|
|
42
|
+
const headerMatch = headerLine.match(
|
|
43
|
+
/^pedigree(?::([a-zA-Z][\w-]*))?\s*(?:"([^"]*)")?\s*$/i
|
|
44
|
+
);
|
|
45
|
+
if (!headerMatch) {
|
|
46
|
+
throw new PedigreeParseError(
|
|
47
|
+
`Expected 'pedigree' header (got '${headerLine}')`,
|
|
48
|
+
i + 1
|
|
49
|
+
);
|
|
50
|
+
}
|
|
41
51
|
const metadata = {};
|
|
42
|
-
if (headerMatch[1]) metadata.
|
|
52
|
+
if (headerMatch[1]) metadata.mode = headerMatch[1].toLowerCase();
|
|
53
|
+
if (headerMatch[2]) metadata.title = headerMatch[2];
|
|
43
54
|
i++;
|
|
44
55
|
const legend = [];
|
|
45
56
|
const legendOverrides = {};
|
|
@@ -49,7 +60,7 @@ function parsePedigree(text2) {
|
|
|
49
60
|
while (i < rawLines.length) {
|
|
50
61
|
const raw = rawLines[i];
|
|
51
62
|
const trimmed = raw.trim();
|
|
52
|
-
if (trimmed === "" || trimmed.startsWith("#") || trimmed.startsWith("//")) {
|
|
63
|
+
if (trimmed === "" || trimmed.startsWith("#") || trimmed.startsWith("//") || trimmed.startsWith("%%")) {
|
|
53
64
|
i++;
|
|
54
65
|
continue;
|
|
55
66
|
}
|
|
@@ -91,7 +102,7 @@ function parsePedigree(text2) {
|
|
|
91
102
|
while (i < rawLines.length) {
|
|
92
103
|
const childLine = rawLines[i];
|
|
93
104
|
const childTrimmed = childLine.trim();
|
|
94
|
-
if (childTrimmed === "" || childTrimmed.startsWith("#")) {
|
|
105
|
+
if (childTrimmed === "" || childTrimmed.startsWith("#") || childTrimmed.startsWith("//") || childTrimmed.startsWith("%%")) {
|
|
95
106
|
i++;
|
|
96
107
|
continue;
|
|
97
108
|
}
|
|
@@ -1229,8 +1240,8 @@ function toRoman(n) {
|
|
|
1229
1240
|
var pedigree = {
|
|
1230
1241
|
type: "pedigree",
|
|
1231
1242
|
detect(text2) {
|
|
1232
|
-
const firstLine =
|
|
1233
|
-
return firstLine === "pedigree" || firstLine.startsWith("pedigree ");
|
|
1243
|
+
const firstLine = chunk3KRL2EGN_cjs.firstContentLine(text2)?.toLowerCase() ?? "";
|
|
1244
|
+
return firstLine === "pedigree" || firstLine.startsWith("pedigree ") || firstLine.startsWith("pedigree:");
|
|
1234
1245
|
},
|
|
1235
1246
|
parse: parsePedigree,
|
|
1236
1247
|
render(text2, config) {
|
|
@@ -1257,5 +1268,5 @@ exports.layoutPedigree = layoutPedigree;
|
|
|
1257
1268
|
exports.parsePedigree = parsePedigree;
|
|
1258
1269
|
exports.pedigree = pedigree;
|
|
1259
1270
|
exports.renderPedigree = renderPedigree;
|
|
1260
|
-
//# sourceMappingURL=chunk-
|
|
1261
|
-
//# sourceMappingURL=chunk-
|
|
1271
|
+
//# sourceMappingURL=chunk-EGSUMHCS.cjs.map
|
|
1272
|
+
//# sourceMappingURL=chunk-EGSUMHCS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/pedigree/parser.ts","../src/diagrams/pedigree/layout.ts","../src/diagrams/pedigree/legend.ts","../src/diagrams/pedigree/renderer.ts","../src/diagrams/pedigree/index.ts"],"names":["line","text","parseLegendDirective","propsStr","resolvePersonTheme","title","desc","applyLegendOverrides","renderLegend","group","svgRoot","el","rect","path","defs","cssCustomProperties","STROKE_WIDTH","polygon","circle","firstContentLine"],"mappings":";;;;;;;;AAeO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CAAY,SAAwBA,KAAAA,EAAc;AAChD,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AADE,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AAAA,EAHoC,IAAA;AAItC;AAIA,IAAM,UAAA,GAA+D;AAAA,EACnE,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,WAAA,EAAY;AAAA,EAClC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAiB;AAAA,EACtC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,YAAA;AACtB,CAAA;AAEA,IAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,UAAU,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC/E,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,0BAAU,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,YAAA,EAAc,WAAW,CAAC,CAAA;AAC9D,IAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,aAAa,WAAA,EAAa,KAAA,EAAO,KAAA,EAAO,SAAS,CAAC,CAAA;AAIrF,SAAS,cAAcC,KAAAA,EAA0B;AACtD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OACE,CAAA,GAAI,QAAA,CAAS,MAAA,KACZ,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK,KAAM,EAAA,IACtB,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,GAAO,UAAA,CAAW,GAAG,CAAA,IACjC,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,WAAW,IAAI,CAAA,IAClC,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,UAAA,CAAW,IAAI,CAAA,CAAA,EACpC;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAK,QAAA,CAAS,MAAA,QAAc,IAAI,kBAAA,CAAmB,eAAe,CAAC,CAAA;AAEvE,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AAKpC,EAAA,MAAM,cAAc,UAAA,CAAW,KAAA;AAAA,IAC7B;AAAA,GACF;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,oCAAoC,UAAU,CAAA,EAAA,CAAA;AAAA,MAC9C,CAAA,GAAI;AAAA,KACN;AAAA,EACF;AAEA,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG,QAAA,CAAS,OAAO,WAAA,CAAY,CAAC,EAAE,WAAA,EAAY;AAC/D,EAAA,IAAI,YAAY,CAAC,CAAA,EAAG,QAAA,CAAS,KAAA,GAAQ,YAAY,CAAC,CAAA;AAClD,EAAA,CAAA,EAAA;AAEA,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,MAAM,kBAAmC,EAAC;AAC1C,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAwB;AACnD,EAAA,MAAM,gBAAgC,EAAC;AAEvC,EAAA,OAAO,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AAEzB,IAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACrG,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAMA,IAAA,IAAIC,sCAAA,CAAqB,OAAA,EAAS,eAAe,CAAA,EAAG;AAClD,MAAA,kBAAA,GAAqB,IAAA;AACrB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAc,OAAA,CAAQ,KAAA;AAAA,MAC1B;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,EAAA,EAAI,YAAY,CAAC,CAAA;AAAA,QACjB,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,QACpB,IAAA,EAAO,WAAA,CAAY,CAAC,CAAA,IAAuB;AAAA,OAC5C,CAAA;AACD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,eAAe,OAAO,CAAA;AAC1C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAA,EAAS,GAAI,WAAA;AACjC,MAAA,MAAM,UAAU,CAAA,GAAI,CAAA;AAEpB,MAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,UAAU,UAAA,EAAW,GAAI,iBAAiB,QAAQ,CAAA;AACvE,MAAA,MAAM,OAAA,GAAU,OAAO,WAAA,EAAY;AACnC,MAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AAErC,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,oBAAA,EAAuB,MAAM,KAAK,OAAO,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,cAAA,CAAe,IAAI,QAAA,EAAU,eAAA,CAAgB,OAAA,EAAS,UAAmB,CAAC,CAAA;AAAA,MAC5E,CAAA,MAAA,IAAW,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AACxC,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,oBAAA,EAAuB,OAAO,KAAK,OAAO,CAAA;AAAA,MACzE;AAEA,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,EAAA,CAAG,MAAM,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,QAAA,EAAU,CAAA;AAEjE,MAAA,MAAM,YAAA,GAAe,cAAc,GAAG,CAAA;AACtC,MAAA,CAAA,EAAA;AAGA,MAAA,OAAO,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,QAAA,MAAM,YAAA,GAAe,UAAU,IAAA,EAAK;AAEpC,QAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,YAAA,CAAa,UAAA,CAAW,GAAG,CAAA,IAAK,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,IAAK,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,EAAG;AACzH,UAAA,CAAA,EAAA;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,IAAK,YAAA,EAAc;AAG9C,QAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,UAAAC,SAAAA,EAAS,GAAI,iBAAiB,YAAY,CAAA;AAC/D,QAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AAErC,QAAA,cAAA,CAAe,IAAI,QAAA,EAAU,eAAA,CAAgB,OAAA,EAASA,SAAsB,CAAC,CAAA;AAE7E,QAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACxC,QAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,SAAA,EAAW,EAAA,EAAI,UAAU,CAAA;AAE1E,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAS,GAAI,iBAAiB,OAAO,CAAA;AACjD,IAAA,MAAM,GAAA,GAAM,GAAG,WAAA,EAAY;AAC3B,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,EAAA,EAAI,QAAe,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,eAAA,CAAgB,QAAA,EAAU,GAAG,CAAC,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IAC7B;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAAA,IAC/C,aAAA;AAAA,IACA,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,MAAA;AAAA,IACxD,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AAAA,IACrC,eAAA,EAAiB,qBAAqB,eAAA,GAAkB;AAAA,GAC1D;AACF;AAIA,SAAS,cAAcH,KAAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC7B,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAC3B;AAEA,SAAS,eAAe,OAAA,EAAwF;AAC9G,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK,YAAA,EAAA;AACxB,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK,YAAA,EAAA;AACxB,MAAA,IAAI,eAAe,CAAA,EAAG;AAEtB,MAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG,CAAA,GAAI,GAAG,KAAA,CAAM,MAAM,CAAA,KAAM,EAAA,CAAG,KAAA,EAAO;AAC1D,QAAA,MAAM,OAAO,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAC,EAAE,IAAA,EAAK;AAC1C,QAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,CAAU,CAAA,GAAI,GAAG,KAAA,CAAM,MAAM,EAAE,IAAA,EAAK;AAC1D,QAAA,IAAI,IAAA,IAAQ,KAAA,IAAS,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1D,UAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,UAAU,KAAA,EAAM;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAiB,GAAA,EAAsD;AAC9E,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,UAAA,KAAe,IAAI,OAAO,EAAE,IAAI,GAAA,CAAI,IAAA,EAAK,EAAG,QAAA,EAAU,IAAA,EAAK;AAC/D,EAAA,MAAM,KAAK,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,UAAU,EAAE,IAAA,EAAK;AAC7C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,UAAA,GAAa,GAAG,UAAA,KAAe,EAAA,GAAK,GAAA,CAAI,MAAA,GAAS,UAAU,CAAA;AAC1F,EAAA,OAAO,EAAE,IAAI,QAAA,EAAS;AACxB;AAEA,SAAS,WAAW,QAAA,EAA4B;AAC9C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,IAAI,OAAO,GAAA,EAAK,UAAA,EAAA;AAChB,IAAA,IAAI,OAAO,GAAA,EAAK,UAAA,EAAA;AAChB,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,UAAA,KAAe,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,OAAA,IAAW,EAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,EAAG,MAAA,CAAO,KAAK,OAAO,CAAA;AACvC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,EAAA,EAAY,QAAA,EAAyB,QAAA,EAA8B;AAC1F,EAAA,MAAM,GAAA,GAAkB;AAAA,IACtB,EAAA,EAAI,GAAG,WAAA,EAAY;AAAA,IACnB,KAAA,EAAO,EAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,GAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA;AAClC,EAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAS,IAAA,EAAK;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAEhC,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,MAAA,GAAA,CAAI,GAAA,GAAM,UAAU,MAAA,GAAS,MAAA,GAAS,UAAU,MAAA,GAAS,QAAA,GAAW,KAAA,KAAU,MAAA,GAAS,SAAA,GAAY,KAAA;AAAA,IACrG,CAAA,MAAA,IAAW,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,MAAA,GAAA,CAAI,MAAA,GAAS,KAAA;AAAA,IACf,CAAA,MAAA,IAAW,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA,EAAG;AACtC,MAAA,GAAA,CAAI,aAAA,GAAgB,KAAA;AAAA,IACtB,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,UAAU,EAAC;AACjC,MAAA,GAAA,CAAI,OAAA,CAAQ,KAAK,KAAyB,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AAChC,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AACxC,MAAA,GAAA,CAAI,aAAA,GAAgB,UAAA;AACpB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,WAAA,CAAY,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AACtF,MAAA,GAAA,CAAI,UAAA,GAAa,OAAO,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAwB,CAAE,CAAA;AAAA,IAChF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC5D,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvE,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,aAAa,EAAC;AACvC,QAAA,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAA,CAAgB,UAAsB,QAAA,EAAkC;AAC/E,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,KAAK,QAAA,CAAS,GAAA,KAAQ,SAAA,GAAY,QAAA,CAAS,MAAM,QAAA,CAAS,GAAA;AAAA,IAC1D,QAAQ,QAAA,CAAS,MAAA,KAAW,OAAA,GAAU,QAAA,CAAS,SAAS,QAAA,CAAS,MAAA;AAAA,IACjE,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IAC1C,aAAA,EAAe,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,aAAA;AAAA,IAClD,OAAA,EAAS,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACtC,UAAA,EAAY,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA;AAAA,IAC5C,YAAY,EAAE,GAAG,SAAS,UAAA,EAAY,GAAG,SAAS,UAAA;AAAW,GAC/D;AACF;;;ACnRA,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,gBAAA,GAAmB,EAAA;AAIlB,SAAS,cAAA,CACd,KACA,MAAA,EACc;AACd,EAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,EAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,wBAAwB,KAAK,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AACnD,EAAA,OAAO,aAAA,CAAc,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AACtD;AAIA,SAAS,WAAW,GAAA,EAA8B;AAChD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAwB;AAChD,EAAA,KAAA,MAAW,OAAO,GAAA,CAAI,WAAA,cAAyB,GAAA,CAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AAE9D,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AAExC,EAAA,MAAM,UAAA,GAAa,IAAI,aAAA,CAAc,MAAA;AAAA,IACnC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,WAAA,IACnC,CAAA,CAAE,IAAA,KAAS,gBAAA,IAAoB,CAAA,CAAE,IAAA,KAAS;AAAA,GACnD;AAEA,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AAEnC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAU,IAAA,CAAK,QAAQ,QAAA,EAAU;AAChD,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,MAC9B,WAAW,IAAA,CAAK,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvD,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,aAAA,EAAe;AACjC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,cAAA,IAAkB,CAAA,CAAE,SAAS,IAAA,EAAM;AAChD,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,EAAE,CAAA;AAClB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAC5B,MAAA,OAAA,CAAQ,EAAA,EAAI,SAAA,IAAa,IAAA,KAAS,EAAA,EAAI,SAAA,IAAa,IAAA,CAAA;AAAA,IACrD,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,UAAU,YAAA,EAAc,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,6BAAa,IAAI,GAAA,IAAO,OAAA,EAAQ;AACrE;AAIA,SAAS,kBAAkB,KAAA,EAA0B;AACnD,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAa,OAAA,EAAS,aAAY,GAAI,KAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,CAAC,OAAO,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAEpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3C,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,YAAY,GAAA,CAAI,IAAI,GAAG,WAAA,CAAY,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3C,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW;AAC5C,QAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAChC,QAAA,IAAI,SAAS,UAAA,EAAY;AAAE,UAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,UAAA,OAAA,GAAU,IAAA;AAAA,QAAM;AACxF,QAAA,IAAI,SAAS,UAAA,EAAY;AAAE,UAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,UAAA,OAAA,GAAU,IAAA;AAAA,QAAM;AAAA,MAC1F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAW;AAC7B,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,QAAA,OAAA,GAAU,IAAA;AAAA,MACzD,CAAA,MAAA,IAAW,SAAS,MAAA,EAAW;AAC7B,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,QAAA,OAAA,GAAU,IAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,GAAG,QAAA,EAAU;AACjC,QAAA,MAAM,WAAW,UAAA,GAAa,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AACxC,QAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,GAAW,QAAA,EAAU;AACjD,UAAA,WAAA,CAAY,GAAA,CAAI,SAAS,QAAQ,CAAA;AACjC,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,CAAC,YAAY,GAAA,CAAI,EAAE,GAAG,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACjD;AACF;AASA,SAAS,wBAAwB,KAAA,EAAyC;AACxE,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,MAAM,WAAA,EAAa;AACzC,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,GAAG,KAAK,EAAC;AACnC,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,IAAA,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,EAAA,MAAM,SAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AAC1C,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA,EAAG,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,SAAmB,KAAA,EAA8B;AACxE,EAAA,IAAI,QAAQ,MAAA,IAAU,CAAA,EAAG,OAAO,CAAC,GAAG,OAAO,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAC/B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,MAAA;AAAA,IAChC,CAAC,EAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,QAAA,CAAS,CAAC,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC;AAAA,GACnE;AAEA,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,MAAA,IAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG;AACpC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,QAAA,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACnB,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAWA,SAAS,eAAA,CACP,WAAA,EACA,KAAA,EACA,MAAA,EAC2B;AAC3B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,MAAA;AACpC,EAAA,MAAM,OAAO,SAAA,GAAY,CAAA;AACzB,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,GAAe,GAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,GAAe,GAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,GAAa,YAAA,GAAe,YAAY,MAAA,CAAO,YAAA;AAEvE,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,QAAA,GAAW,IAAA;AACjC,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAEjD,IAAA,IAAI,UAAU,gBAAA,GAAmB,IAAA;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,MAAA,IAAI,CAAA,GAAI,GAAG,OAAA,IAAW,SAAA;AAEtB,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAClF,QAAA,OAAA,IAAW,SAAA;AACX,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAAA,MACpF,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAA,CAAgB,SAAA,EAAW,aAAa,MAAM,CAAA;AAC9C,EAAA,0BAAA,CAA2B,SAAA,EAAW,OAAO,MAAM,CAAA;AACnD,EAAA,eAAA,CAAgB,SAAA,EAAW,aAAa,MAAM,CAAA;AAE9C,EAAA,OAAO,SAAA;AACT;AAOA,SAAS,aAAA,CAAc,SAAmB,KAAA,EAA+B;AACvE,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAC/B,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AAEpB,IAAA,MAAM,EAAA,GAAK,MAAM,WAAA,CAAY,IAAA;AAAA,MAC3B,CAAC,CAAA,KAAA,CACE,CAAA,CAAE,SAAS,CAAC,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,KAAM,OAC3C,CAAC,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,CAAC,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,QAAQ,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC;AAAA,KAC7B;AAEA,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,GAAG,CAAA;AACvE,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,EAAE,GAAG,CAAA;AAC3C,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,0BAAA,CACP,SAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAA;AAE/C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA0B;AAClD,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,CAAC,KAAK,EAAC;AACnC,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,WAAA,CAAY,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAE9B,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAEpB,MAAA,MAAM,UAAA,GAAA,CAAc,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA;AACvC,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAA;AAElD,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,EAAA,CAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrD,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAClC,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAClC,QAAA,OAAA,CAAQ,EAAA,EAAI,SAAA,IAAa,IAAA,KAAS,EAAA,EAAI,SAAA,IAAa,IAAA,CAAA;AAAA,MACrD,CAAC,CAAA;AAED,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAE7B,QAAA,MAAM,OAAiB,EAAC;AACxB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAClD,UAAA,IAAI,GAAA,GAAM,YAAA;AAGV,UAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA;AACtC,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AAC5E,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC5C,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACtC,YAAA,IAAI,EAAE,MAAM,GAAA,KAAQ,MAAA,IAAW,MAAM,GAAA,KAAQ,QAAA,IAAY,IAAA,EAAM,GAAA,KAAQ,QAAA,CAAA,EAAY;AACjF,cAAA,GAAA,IAAO,SAAA;AAAA,YACT;AAAA,UACF;AAGA,UAAA,MAAM,SAAA,GAAY,eAAe,CAAC,CAAA;AAClC,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AAC5E,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC5C,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACtC,YAAA,IAAI,IAAA,EAAM,QAAQ,MAAA,IAAW,IAAA,EAAM,QAAQ,QAAA,IAAY,IAAA,EAAM,QAAQ,QAAA,EAAW;AAC9E,cAAA,GAAA,IAAO,SAAA;AAAA,YACT;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACf;AAEA,QAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACjD,QAAA,MAAM,MAAA,GAAS,aAAa,UAAA,GAAa,CAAA;AACzC,QAAA,IAAI,EAAA,GAAK,MAAA;AACT,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC3C,UAAA,IAAI,GAAA,MAAS,CAAA,GAAI,EAAA;AACjB,UAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,EAAA,IAAM,KAAK,CAAC,CAAA;AAAA,QACnC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC3C,QAAA,IAAI,GAAA,MAAS,CAAA,GAAI,UAAA;AAAA,MACnB;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,GAAG,QAAA,EAAU;AACjC,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACtC,QAAA,IAAI,CAAC,QAAA,EAAU;AACf,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,OAAO,KAAK,EAAC;AAC9C,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,KAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAC5F,UAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAC1C,UAAA,IAAI,CAAC,UAAA,EAAY;AACjB,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC9C,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAClD,UAAA,IAAI,QAAA,EAAU,QAAQ,MAAA,IAAW,QAAA,EAAU,QAAQ,QAAA,IAAY,UAAA,EAAY,QAAQ,QAAA,EAAW;AAC5F,YAAA,UAAA,CAAW,CAAA,GAAI,SAAS,CAAA,GAAI,SAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,CAAA,GAAI,SAAS,CAAA,GAAI,SAAA;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAA,CACP,SAAA,EACA,WAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,YAAA;AAEzC,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAClB,GAAA,CAAI,CAAC,EAAA,KAAO,SAAA,CAAU,GAAA,CAAI,EAAE,CAAC,CAAA,CAC7B,MAAA,CAAO,CAAC,CAAA,KAAyB,MAAM,MAAS,CAAA;AACnD,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAEjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA,CAAE,IAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAC5C,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,MAAM,QAAQ,MAAA,GAAS,GAAA;AACvB,QAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,IAAK,KAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,EAAG;AACpC,IAAA,IAAI,GAAA,CAAI,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,UAAA,GAAa,gBAAA,GAAmB,MAAA,CAAO,SAAA,GAAY,CAAA;AACzD,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,MAAM,QAAQ,UAAA,GAAa,IAAA;AAC3B,IAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,MAAO,CAAA,IAAK,KAAA;AAAA,EACjD;AACF;AAIA,SAAS,YAAA,CACP,KAAA,EACA,SAAA,EACA,MAAA,EACc;AACd,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAO,SAAA,GAAY,CAAA;AAChC,EAAA,MAAM,eAAe,MAAA,CAAO,UAAA,GAAa,IAAI,YAAA,GAAe,SAAA,GAAY,OAAO,YAAA,GAAe,IAAA;AAE9F,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,IAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAEpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAEhE,IAAA,MAAM,SAAA,GAA0B,EAAE,IAAA,EAAM,EAAA,CAAG,cAAc,IAAA,EAAM,MAAA,EAAQ,IAAI,OAAA,EAAQ;AACnF,IAAA,MAAM,UAAA,GAAa,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,GAAA,EAAM,QAAA,CAAS,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,SAAS,CAAC,CAAA,CAAA;AAC1F,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,SAAS,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,CAAA;AAGnF,IAAA,IAAI,EAAA,CAAG,iBAAiB,gBAAA,EAAkB;AACxC,MAAA,MAAM,MAAA,GAAS,CAAA;AACf,MAAA,MAAM,WAAW,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAA,GAAI,IAAI,IAAI,OAAA,CAAQ,CAAA,GAAI,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,QAAA,CAAS,IAAI,MAAM,CAAA,CAAA;AAC1G,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QAAQ,EAAA,EAAI,OAAA;AAAA,QAClB,YAAA,EAAc,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAM,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,SAAA,EAAU;AAAA,QACpF,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA;AACjC,MAAA,MAAM,UAAU,IAAA,CAAK,CAAA;AACrB,MAAA,MAAM,QAAQ,OAAA,GAAU,YAAA;AAExB,MAAA,MAAM,cAAA,GAAiB,GAAG,QAAA,CACvB,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,IAAI,GAAA,EAAK,GAAA,EAAK,UAAU,GAAA,CAAI,GAAG,GAAE,CAAE,CAAA,CACnD,OAAO,CAAC,CAAA,KAA8C,CAAA,CAAE,GAAA,KAAQ,MAAS,CAAA;AAE5E,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AACjC,MAAA,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA;AACpC,MAAA,MAAM,SAAS,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,EAAE,GAAA,CAAI,CAAA;AAE7D,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,QAAG,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,QACvC,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,IAAI,OAAA,EAAQ;AAAA,QAC/D,IAAA,EAAM,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,EAAM,IAAI,IAAI,KAAK,CAAA;AAAA,OAC9C,CAAA;AAED,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,UAAG,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,UACvC,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,IAAI,UAAA,EAAW;AAAA,UAClE,IAAA,EAAM,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,MAAM,IAAI,KAAK,CAAA;AAAA,SAC/C,CAAA;AAAA,MACH;AAEA,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,OAAO,UAAA,GAAa,CAAA;AACnD,QAAA,MAAM,SAAA,GAAY,cAAA,CAAe,MAAA,KAAW,CAAA,GACxC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,QAAQ,KAC1C,CAAA,EAAA,EAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,KAAK,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAE1D,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,MAAM,EAAA,CAAG,EAAA;AAAA,UAAI,IAAI,KAAA,CAAM,EAAA;AAAA,UACvB,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,EAAA,EAAI,KAAA,CAAM,EAAA,EAAG;AAAA,UAChE,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,aAAA,CACP,SAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,SAAA,EAAW;AACjC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA;AAAA,MACA,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA,GAAI,OAAA;AAAA,MAClC,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,aAAa,CAAA,GAAI,OAAA;AAAA,MACnC,OAAO,MAAA,CAAO,SAAA;AAAA,MACd,QAAQ,MAAA,CAAO,UAAA;AAAA,MACf,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACrC,GAAG,CAAA;AAAA,IACH,IAAA,EAAM,SAAA,CAAU,CAAA,CAAE,IAAA,EAAM,SAAS,OAAO;AAAA,GAC1C,CAAE,CAAA;AAEF,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,IAAS,KAAK,UAAA,CAAW,EAAA;AAC3D,IAAA,MAAM,cAAA,GAAiB,UAAU,MAAA,GAAS,GAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,EAAO,KAAK,cAAc,CAAA;AAC/D,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,KAAK,cAAc,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA;AAC7B,IAAA,IAAI,KAAA,GAAQ,MAAM,IAAA,GAAO,KAAA;AACzB,IAAA,IAAI,MAAA,GAAS,MAAM,IAAA,GAAO,MAAA;AAC1B,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,QAAQ,CAAC,IAAA;AACf,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,CAAA,IAAK,KAAA;AAAA,IACZ;AACA,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,IAAA,CAAK,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,IAAQ,KAAA;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,GAAO,OAAA;AAAA,IACd,MAAA,EAAQ,IAAA,GAAO,OAAA,GAAU,SAAA,GAAY,YAAA,GAAe,EAAA;AAAA,IACpD,KAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;AAEA,SAAS,SAAA,CAAU,QAAA,EAAkB,EAAA,EAAY,EAAA,EAAoB;AACnE,EAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IACd,iCAAA;AAAA,IACA,CAAC,MAAA,EAAQ,GAAA,EAAa,IAAA,EAAc,IAAA,KAAiB;AACnD,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,GAAI,EAAA;AAC7B,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,GAAI,EAAA;AAC7B,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AC9iBA,IAAM,QAAA,GAA4B;AAAA,EAChC,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACxC,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EAChC,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA;AAC1B,CAAA;AAEA,IAAM,8BAAgC,IAAI,GAAA,CAAS,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAE9D,SAAS,mBAAA,CACd,KACA,KAAA,EACY;AACZ,EAAA,MAAM,QAAsB,EAAC;AAI7B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAmB;AAC1C,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,WAAA,EAAa;AACjC,IAAA,IAAI,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,aAAA,KAAkB,YAAA,EAAc;AAC3D,MAAA,UAAA,CAAW,GAAA,CAAI,IAAI,aAAa,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,UAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACvC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,CAAM,IAAA,IAAQ,MAAM,IAAA,KAAS,MAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,KAAK,KAAA,CAAM,EAAA;AAAA,QACX,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,IAAA,EAAM,SAAS,MAAA,GAAS,cAAA;AAAA,QACxB,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,aAAA;AAAA,QAC5B,KAAA,EAAO,MAAA,GAAS,MAAA,GAAY,KAAA,CAAM,IAAA;AAAA,QAClC,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAS;AAC7B,EAAA,KAAA,MAAW,OAAO,GAAA,CAAI,WAAA,EAAa,OAAA,CAAQ,GAAA,CAAI,IAAI,GAAG,CAAA;AACtD,EAAA,MAAM,QAAA,GAAkB,CAAC,SAAA,EAAW,OAAA,EAAS,aAAa,UAAU,CAAA;AACpE,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,QAAQ,GAAA,CAAI,CAAC,KAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,EAAG;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,OAAO,CAAC,CAAA,CAAA;AAAA,MACb,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,MACjB,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,MAAM,KAAA,CAAM,WAAA;AAAA,MACZ,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,UAAU,CAAA;AACvE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,iBAAA;AAAA,MACL,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,OAAA;AAAA,MACR,OAAO,KAAA,CAAM,YAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,EAAS,QAAA,CAAS,SAAS,CAAC,CAAA;AAC7E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,gBAAA;AAAA,MACL,KAAA,EAAO,mDAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACA,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,EAAS,QAAA,CAAS,YAAY,CAAC,CAAA;AACnF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,mBAAA;AAAA,MACL,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA,IACV;AAAA,GACF;AACF;AAEA,SAAS,iBAAA,CACP,GACA,KAAA,EACY;AACZ,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,SAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,KAAA,EAAO,WAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,kBAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACR,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,kBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,kBAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACR,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,gBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,gBAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS,OAAA;AAAA,QACT,WAAA,EAAa,CAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,QACjB,IAAA,EAAM,MAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA;AAEN;AAEA,SAAS,SAAS,CAAA,EAAgB;AAChC,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,SAAA;AAAW,MAAA,OAAO,aAAA;AAAA,IACvB,KAAK,OAAA;AAAS,MAAA,OAAO,OAAA;AAAA,IACrB,KAAK,WAAA;AAAa,MAAA,OAAO,YAAA;AAAA,IACzB,KAAK,UAAA;AAAY,MAAA,OAAO,UAAA;AAAA,IACxB;AAAS,MAAA,OAAO,CAAA;AAAA;AAEpB;AAEA,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AACzE;;;AClLO,SAAS,cAAA,CACd,MAAA,EACA,MAAA,EACA,GAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAII,oCAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,CAAC,CAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,YAAY,SAAS,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,WAAW,MAAM,CAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,SAAiB,CAAA;AAE1D,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,MAAA;AAC/B,EAAA,MAAM,WAAW,SAAA,CAAU,IAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,GAAA,EAAK,QAAA,EAAU,KAAA,IAAS,UAAA;AAE7C,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvBC,wBAAM,YAAY,CAAA;AAAA,IAClBC,sBAAA,CAAK,CAAA,oBAAA,EAAuB,SAAS,CAAA,oBAAA,EAAuB,QAAQ,CAAA,YAAA,CAAc,CAAA;AAAA,IAClF,OAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,eAAe,CAAC,SAAA,EAAW,UAAA,EAAY,GAAG,YAAY,UAAU,CAAA;AAEtE,EAAA,IAAI,aAAa,MAAA,CAAO,KAAA;AACxB,EAAA,IAAI,cAAc,MAAA,CAAO,MAAA;AACzB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,GAAA,EAAK,CAAC,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAYC,sCAAA,CAAqB,QAAA,EAAU,GAAA,CAAI,eAAe,CAAA;AACpE,IAAA,IAAI,UAAU,IAAA,KAAS,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA,EAAG;AACzD,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,EAAA,EAAG,GAAIC,8BAAA;AAAA,QACxB,SAAA;AAAA,QACA;AAAA,UACE,aAAa,MAAA,CAAO,KAAA;AAAA,UACpB,cAAc,MAAA,CAAO,MAAA;AAAA,UACrB,OAAA,EAAS;AAAA,SACX;AAAA,QACA,CAAA;AAAA,QACA,EAAE,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,QAAA,EAAU,OAAO,QAAA;AAAS,OAC7D;AACA,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,SAAA,GAAY,GAAA;AACZ,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AAChC,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AAChC,QAAA,IAAI,SAAA,GAAY,YAAY,UAAA,GAAa,SAAA;AACzC,QAAA,IAAI,SAAA,GAAY,aAAa,WAAA,GAAc,SAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,IAAI,UAAA,GAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AAChE,EAAA,MAAA,CAAO,IAAA;AAAA,IACLC,uBAAA;AAAA,MACE,EAAE,SAAA,EAAW,YAAA,GAAe,IAAI,CAAA,UAAA,EAAa,YAAY,SAAS,MAAA,EAAU;AAAA,MAC5E;AAAA;AACF,GACF;AACA,EAAA,IAAI,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAEpC,EAAA,OAAOC,yBAAA;AAAA,IACL;AAAA,MACE,OAAA,EAAS,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,MACzC,KAAA,EAAO,sCAAA;AAAA,MACP,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,SAAA,CAAU,OAAqB,CAAA,EAAwC;AAC9E,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,EAAA,GAAK,EAAE,UAAA,CAAW,aAAA;AACxB,IAAA,IAAI,EAAA,EAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EACtB;AAEA,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AACxB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPC,oBAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,wCAAuC,EAAG;AAAA,QAC7DC,sBAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ;AAAA,OACtD,CAAA;AAAA,MACDD,oBAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/DC,sBAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO;AAAA,OACxD;AAAA,KACH;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,IAAA;AAAA,IACPD,qBAAG,QAAA,EAAU;AAAA,MACX,EAAA,EAAI,kCAAA;AAAA,MACJ,OAAA,EAAS,WAAA;AAAA,MACT,IAAA,EAAM,GAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa,GAAA;AAAA,MACb,YAAA,EAAc,GAAA;AAAA,MACd,MAAA,EAAQ;AAAA,KACV,EAAG;AAAA,MACDE,uBAAK,EAAE,CAAA,EAAG,yBAAyB,IAAA,EAAM,CAAA,CAAE,QAAQ;AAAA,KACpD;AAAA,GACH;AAEA,EAAA,OAAOC,uBAAK,QAAQ,CAAA;AACtB;AAIA,SAAS,WAAA,CAAY,QAAsB,CAAA,EAAwC;AACjF,EAAA,MAAM,GAAA,GAAM;AAAA,qBAAA,EACSC,qCAAA,CAAoB,CAAC,CAAC;AAAA;AAAA,kCAAA,EAET,EAAE,IAAI,CAAA,UAAA,EAAa,EAAE,MAAM,CAAA,gBAAA,EAAmBC,+BAAa,MAAM,CAAA;AAAA,yCAAA,EAC1D,OAAO,UAAU,CAAA,aAAA,EAAgB,OAAO,QAAQ,CAAA,+BAAA,EAAkC,EAAE,IAAI,CAAA;AAAA,6CAAA,EACpF,MAAA,CAAO,UAAU,CAAA,4CAAA,EAA+C,CAAA,CAAE,IAAI,CAAA;AAAA,mCAAA,EAChF,CAAA,CAAE,MAAM,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,4CAAA,EACrC,CAAA,CAAE,YAAY,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,0CAAA,EACtD,EAAE,aAAa,CAAA;AAAA,yCAAA,EAChB,EAAE,aAAa,CAAA;AAAA,0CAAA,EACd,EAAE,aAAa,CAAA;AAAA,kDAAA,EACP,CAAA,CAAE,aAAa,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,iDAAA,EACtD,CAAA,CAAE,MAAM,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,iDAAA,EAC9C,MAAA,CAAO,UAAU,CAAA,4CAAA,EAA+C,CAAA,CAAE,MAAM,CAAA;AAAA,uCAAA,EAClF,EAAE,MAAM,CAAA,UAAA,EAAa,EAAE,MAAM,CAAA,gBAAA,EAAmBA,+BAAa,MAAM,CAAA;AAAA,wCAAA,EAClE,CAAA,CAAE,YAAY,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,gDAAA,EAC5C,MAAA,CAAO,UAAU,CAAA,4CAAA,EAA+C,CAAA,CAAE,IAAI,CAAA;AAAA,0CAAA,EAC5E,MAAA,CAAO,UAAU,CAAA,yBAAA,EAA4B,CAAA,CAAE,IAAI,CAAA;AAAA,uCAAA,EACtD,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,CAAA;AAEnE,EAAA,OAAOL,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAG,GAAG,CAAA;AAC5B;AAIA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,IAAA;AAClC,IAAA,MAAM,QAAA,GAAW,mDAAmD,OAAO,CAAA,CAAA;AAE3E,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzBA,oBAAA,CAAG,QAAQ,EAAE,CAAA,EAAG,KAAK,IAAA,EAAM,KAAA,EAAO,gCAAgC;AAAA,KACpE;AAEA,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,QAAA,CAAS,IAAA;AAAA,UACPX,sBAAA,CAAK;AAAA,YACH,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAAG,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAC3B,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAAG,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAC3B,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA;AAAA,MACPS,uBAAA,CAAM,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,EAAA,EAAG,EAAG,QAAQ;AAAA,KACjF;AAAA,EACF;AAEA,EAAA,OAAOA,uBAAA,CAAM,EAAE,KAAA,EAAO,0BAAA,IAA8B,QAAQ,CAAA;AAC9D;AAEA,SAAS,aAAa,QAAA,EAAmD;AACvE,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,GAAG,OAAO,IAAA;AACzC,EAAA,OAAO;AAAA,IACL,CAAA,EAAA,CAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK,CAAA;AAAA,IACrD,CAAA,EAAA,CAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK;AAAA,GACvD;AACF;AAIA,SAAS,kBAAkB,KAAA,EAAgD;AACzE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,UAAU,KAAK,EAAC;AAC5C,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,GAAG,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,SAAA,EAAgD;AACnE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAEpE,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AACxC,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,MAAA,YAAA,CAAa,IAAA,CAAK,qBAAqB,IAAA,CAAK,UAAA,EAAY,IAAI,EAAA,EAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IAC7E;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACLA,uBAAA;AAAA,QACE,EAAE,KAAA,EAAO,CAAA,4DAAA,EAA+D,MAAM,CAAA,CAAA,EAAI,mBAAmB,MAAA,EAAO;AAAA,QAC5G;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAA,CACP,GAAA,EACA,CAAA,EACA,CAAA,EACA,IAAA,EACQ;AACR,EAAA,MAAM,OAAO,IAAA,GAAO,CAAA;AACpB,EAAA,MAAM,OAAA,GAAU,CAAC,yBAAA,EAA2B,CAAA,mBAAA,EAAsB,GAAA,CAAI,QAAQ,OAAA,GAAU,SAAA,GAAY,GAAA,CAAI,GAAG,CAAA,CAAE,CAAA;AAC7G,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AACzE,EAAA,IAAI,IAAI,aAAA,EAAe,OAAA,CAAQ,KAAK,CAAA,mBAAA,EAAsB,GAAA,CAAI,aAAa,CAAA,CAAE,CAAA;AAE7E,EAAA,MAAM,SAAA,GAAY,YAAY,GAAG,CAAA;AACjC,EAAA,MAAM,QAAA,GAAqB,CAACJ,uBAAA,CAAM,SAAS,CAAC,CAAA;AAG5C,EAAA,MAAM,QAAA,GAAW,IAAI,MAAA,KAAW,KAAA,IAAS,IAAI,MAAA,KAAW,KAAA,IAAS,IAAI,MAAA,KAAW,SAAA;AAChF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAC/C,IAAA,MAAM,IAAI,IAAA,GAAO,GAAA;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPY,yBAAA,CAAQ;AAAA,QACN,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,MAAM,CAAC,CAAA,CAAA;AAAA,QACrC,KAAA,EAAO,CAAA,iDAAA,EAAoD,GAAA,CAAI,MAAM,CAAA,MAAA;AAAA,OACtE;AAAA,KACH;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,MAAA,QAAA,CAAS,IAAA;AAAA,QACPjB,sBAAA,CAAK;AAAA,UACH,EAAA,EAAI,CAAC,CAAA,GAAI,GAAA;AAAA,UAAK,IAAI,CAAA,GAAI,GAAA;AAAA,UAAK,IAAI,CAAA,GAAI,GAAA;AAAA,UAAK,EAAA,EAAI,CAAC,CAAA,GAAI,GAAA;AAAA,UACjD,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,QAAA,CAAS,IAAA;AAAA,QACPC,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,KAAA,EAAO,iCAAA,EAAmC,aAAA,EAAe,QAAA,EAAS;AAAA,UACrF;AAAA;AACF,OACF;AAAA,IACF;AAEA,IAAA,OAAOQ,uBAAA;AAAA,MACL;AAAA,QACE,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,QACvB,sBAAsB,GAAA,CAAI,EAAA;AAAA,QAC1B,SAAA,EAAW,CAAA,UAAA,EAAa,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA;AAAA,OACjC;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAGtC,EAAA,IAAI,GAAA,CAAI,WAAW,WAAA,EAAa;AAC9B,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,QAAA,CAAS,IAAA;AAAA,MACPR,sBAAA;AAAA,QACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,OAAO,EAAA,EAAI,KAAA,EAAO,iCAAA,EAAmC,aAAA,EAAe,QAAA,EAAS;AAAA,QACxF;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAK,GAAA,CAAI,aAAA;AACf,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAC3C,CAAA,MAAA,IAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAC1C,CAAA,MAAA,IAAW,EAAA,KAAO,WAAA,IAAe,EAAA,KAAO,kBAAA,EAAoB;AAC1D,IAAA,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAChC;AAGA,EAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,IAAA,QAAA,CAAS,IAAA;AAAA,MACPD,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAC,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,0CAA0C;AAAA,KAC7F;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,WAAW,UAAA,EAAY;AAC7B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,KAAQ,QAAA,GAAW,OAAO,KAAA,GAAQ,IAAA;AAClD,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA,CAAK,EAAE,EAAA,EAAI,GAAA,EAAK,IAAI,CAAC,GAAA,EAAK,EAAA,EAAI,CAAC,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,oCAAoC;AAAA,KAC1F;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA,CAAK;AAAA,QACH,EAAA,EAAI,CAAC,IAAA,GAAO,QAAA;AAAA,QAAU,IAAI,IAAA,GAAO,QAAA;AAAA,QACjC,EAAA,EAAI,CAAC,IAAA,GAAO,CAAA;AAAA,QAAG,IAAI,IAAA,GAAO,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDC,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAC,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,KAAA,EAAO,kCAAA,EAAoC,eAAe,KAAA,EAAM;AAAA,QACnH;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AACvC,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPD,sBAAA,CAAK;AAAA,QACH,EAAA,EAAI,CAAC,IAAA,GAAO,QAAA;AAAA,QAAU,IAAI,IAAA,GAAO,QAAA;AAAA,QACjC,EAAA,EAAI,CAAC,IAAA,GAAO,CAAA;AAAA,QAAG,IAAI,IAAA,GAAO,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDC,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAC,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,KAAA,EAAO,kCAAA,EAAoC,eAAe,KAAA,EAAM;AAAA,QACnH;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,WAAW,CAAA,EAAG;AACtC,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,OAAO,CAAA,EAAG,KAAA,EAAO,kCAAA,EAAoC,aAAA,EAAe,QAAA,EAAS;AAAA,QACzF;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOQ,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MACvB,sBAAsB,GAAA,CAAI,EAAA;AAAA,MAC1B,SAAA,EAAW,CAAA,UAAA,EAAa,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA;AAAA,KACjC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CAAU,KAAwB,IAAA,EAAsB;AAC/D,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAOG,uBAAK,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,GAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,EAAG,KAAA,EAAO,4BAA4B,CAAA;AAAA,IAC1G,KAAK,QAAA;AACH,MAAA,OAAOM,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,0BAAA,EAA4B,CAAA;AAAA,IAC5E;AACE,MAAA,OAAOD,0BAAQ,EAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAC,IAAI,CAAA,EAAA,CAAA,EAAM,KAAA,EAAO,4BAA4B,CAAA;AAAA;AAE/G;AAEA,SAAS,YAAA,CAAa,KAAwB,IAAA,EAAsB;AAClE,EAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,kCAAA,EAAmC;AAC1D,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAOL,uBAAK,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,GAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,EAAG,GAAG,OAAO,CAAA;AAAA,IACjF,KAAK,QAAA;AACH,MAAA,OAAOM,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA;AAAA,IACnD;AACE,MAAA,OAAOD,0BAAQ,EAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAC,IAAI,CAAA,EAAA,CAAA,EAAM,GAAG,OAAO,CAAA;AAAA;AAEtF;AAEA,SAAS,WAAA,CAAY,KAAwB,IAAA,EAAsB;AACjE,EAAA,MAAM,UAAA,GAAa,GAAA,KAAQ,QAAA,GAAW,QAAA,GAAW,MAAA;AACjD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA,EAAO,iCAAA;AAAA,IACP,WAAA,EAAa,wCAAwC,UAAU,CAAA,CAAA;AAAA,GACjE;AACA,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAOL,uBAAK,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,GAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,EAAG,GAAG,OAAO,CAAA;AAAA,IACjF,KAAK,QAAA;AACH,MAAA,OAAOM,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA;AAAA,IACnD;AACE,MAAA,OAAOD,0BAAQ,EAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAC,IAAI,CAAA,EAAA,CAAA,EAAM,GAAG,OAAO,CAAA;AAAA;AAEtF;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAOC,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,KAAA,EAAO,kCAAA,EAAoC,CAAA;AAC3F;AAEA,SAAS,YAAY,GAAA,EAAyB;AAC5C,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAClE,EAAA,IAAI,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,aAAA,KAAkB,YAAA,EAAc;AAC3D,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,aAAa,CAAA,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,YAAA,CACP,KAAA,EACA,SAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AAC3C,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,EAAA,EAAI,GAAG,QAAQ,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,QAAA;AAEjD,IAAA,MAAM,aAAa,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,EAAE,KAAK,GAAA,CAAI,EAAA;AACnD,IAAA,MAAM,eAAe,GAAA,CAAI,KAAA,KAAU,GAAA,CAAI,EAAA,GAAK,IAAI,KAAA,GAAQ,UAAA;AAExD,IAAA,MAAA,CAAO,IAAA;AAAA,MACLjB,sBAAA;AAAA,QACE,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,QAAQ,KAAA,EAAO,0BAAA,EAA4B,oBAAA,EAAsB,GAAA,CAAI,EAAA,EAAG;AAAA,QACpF;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOQ,uBAAA,CAAM,EAAE,KAAA,EAAO,2BAAA,IAA+B,MAAM,CAAA;AAC7D;AAIA,SAAS,sBAAA,CACP,WACA,OAAA,EACQ;AACR,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAEpE,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AACxC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA,CAAE,IAAI,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAEhC,IAAA,MAAA,CAAO,IAAA;AAAA,MACLR,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,IAAA,GAAO,CAAA,EAAG,OAAO,8BAAA,EAA+B;AAAA,QAC5D;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOQ,uBAAA,CAAM,EAAE,KAAA,EAAO,sCAAA,IAA0C,MAAM,CAAA;AACxE;AAOA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAM,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAClE,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,MAAM,GAAG,CAAA;AACnF,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,OAAO,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AACnB,MAAA,MAAA,IAAU,KAAK,CAAC,CAAA;AAChB,MAAA,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;AC3gBO,IAAM,QAAA,GAA0B;AAAA,EACrC,IAAA,EAAM,UAAA;AAAA,EAEN,OAAOR,KAAAA,EAAuB;AAC5B,IAAA,MAAM,SAAA,GAAYkB,kCAAA,CAAiBlB,KAAI,CAAA,EAAG,aAAY,IAAK,EAAA;AAC3D,IAAA,OACE,SAAA,KAAc,cACd,SAAA,CAAU,UAAA,CAAW,WAAW,CAAA,IAChC,SAAA,CAAU,WAAW,WAAW,CAAA;AAAA,EAEpC,CAAA;AAAA,EAEA,KAAA,EAAO,aAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,MAAM,GAAA,GAAM,cAAcA,KAAI,CAAA;AAC9B,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,YAAA,EAAc,EAAA;AAAA,MACd,YAAA,EAAc,GAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AACA,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,YAAY,CAAA;AAC/C,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,UAAA,EAAY,QAAQ,UAAA,IAAc,sCAAA;AAAA,MAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,MAC9B,KAAA,EAAO,QAAQ,KAAA,IAAS,SAAA;AAAA,MACxB,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AACA,IAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,YAAA,EAAc,GAAG,CAAA;AAAA,EACjD;AACF","file":"chunk-EGSUMHCS.cjs","sourcesContent":["import type {\n DiagramAST,\n Individual,\n LegendOverrides,\n Relationship,\n RelationshipType,\n GeneticStatus,\n IndividualMarker,\n LegendEntry,\n ConditionFill,\n} from \"../../core/types\";\nimport { parseLegendDirective } from \"../../core/legend-parser\";\n\n// ─── ParseError ─────────────────────────────────────────────\n\nexport class PedigreeParseError extends Error {\n constructor(message: string, public line: number) {\n super(`Line ${line}: ${message}`);\n this.name = \"PedigreeParseError\";\n }\n}\n\n// ─── Couple operators ───────────────────────────────────────\n\nconst COUPLE_OPS: Array<{ token: string; type: RelationshipType }> = [\n { token: \"-/-\", type: \"separated\" },\n { token: \"==\", type: \"consanguineous\" },\n { token: \"--\", type: \"married\" },\n { token: \"~\", type: \"cohabiting\" },\n];\n\nconst VALID_SEX = new Set([\"male\", \"female\", \"unknown\", \"amab\", \"afab\", \"uaab\"]);\nconst GENETIC_STATUSES = new Set([\n \"affected\",\n \"carrier\",\n \"carrier-x\",\n \"obligate-carrier\",\n \"presymptomatic\",\n \"unaffected\",\n]);\nconst MARKERS = new Set([\"proband\", \"consultand\", \"evaluated\"]);\nconst VALID_STATUS = new Set([\"deceased\", \"stillborn\", \"pregnancy\", \"sab\", \"tab\", \"ectopic\"]);\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function parsePedigree(text: string): DiagramAST {\n const rawLines = text.split(\"\\n\");\n let i = 0;\n\n while (\n i < rawLines.length &&\n (rawLines[i].trim() === \"\" ||\n rawLines[i].trim().startsWith(\"#\") ||\n rawLines[i].trim().startsWith(\"//\") ||\n rawLines[i].trim().startsWith(\"%%\"))\n ) {\n i++;\n }\n if (i >= rawLines.length) throw new PedigreeParseError(\"Empty input\", 1);\n\n const headerLine = rawLines[i].trim();\n // Mermaid-style header tolerance: `pedigree`, `pedigree \"Title\"`,\n // `pedigree:autosomal-dominant`, `pedigree:autosomal-dominant \"Title\"`.\n // The `:mode` suffix is captured into metadata so future renderers can\n // act on it (taxonomy mode, etc.); ignored downstream if unsupported.\n const headerMatch = headerLine.match(\n /^pedigree(?::([a-zA-Z][\\w-]*))?\\s*(?:\"([^\"]*)\")?\\s*$/i\n );\n if (!headerMatch) {\n throw new PedigreeParseError(\n `Expected 'pedigree' header (got '${headerLine}')`,\n i + 1\n );\n }\n\n const metadata: Record<string, string> = {};\n if (headerMatch[1]) metadata.mode = headerMatch[1].toLowerCase();\n if (headerMatch[2]) metadata.title = headerMatch[2];\n i++;\n\n const legend: LegendEntry[] = [];\n const legendOverrides: LegendOverrides = {};\n let hasLegendOverrides = false;\n const individualsMap = new Map<string, Individual>();\n const relationships: Relationship[] = [];\n\n while (i < rawLines.length) {\n const raw = rawLines[i];\n const trimmed = raw.trim();\n\n if (trimmed === \"\" || trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\") || trimmed.startsWith(\"%%\")) {\n i++;\n continue;\n }\n\n // Unified legend directives (legend.title / .position / .label / .hide /\n // .section / .item / `legend: on|off|<position>`). Legacy `legend: id =\n // \"...\"` falls through to the regex below — applyMaster() returns false\n // for the trait-id form, so parseLegendDirective hands it back to us.\n if (parseLegendDirective(trimmed, legendOverrides)) {\n hasLegendOverrides = true;\n i++;\n continue;\n }\n\n // Legend definition (legacy trait-fill DSL).\n const legendMatch = trimmed.match(\n /^legend:\\s*([a-zA-Z][a-zA-Z0-9_-]*)\\s*=\\s*\"([^\"]*)\"\\s*(?:\\(\\s*fill:\\s*([a-zA-Z-]+)\\s*\\))?$/\n );\n if (legendMatch) {\n legend.push({\n id: legendMatch[1],\n label: legendMatch[2],\n fill: (legendMatch[3] as ConditionFill) ?? \"full\",\n });\n i++;\n continue;\n }\n\n // Couple line\n const coupleMatch = detectCoupleOp(trimmed);\n if (coupleMatch) {\n const { leftId, op, rightRaw } = coupleMatch;\n const lineNum = i + 1;\n\n const { id: rightId, propsStr: rightProps } = parseIdWithProps(rightRaw);\n const leftKey = leftId.toLowerCase();\n const rightKey = rightId.toLowerCase();\n\n if (!individualsMap.has(leftKey)) {\n throw new PedigreeParseError(`Unknown individual '${leftId}'`, lineNum);\n }\n\n if (rightProps) {\n individualsMap.set(rightKey, buildIndividual(rightId, rightProps, lineNum));\n } else if (!individualsMap.has(rightKey)) {\n throw new PedigreeParseError(`Unknown individual '${rightId}'`, lineNum);\n }\n\n relationships.push({ type: op.type, from: leftKey, to: rightKey });\n\n const coupleIndent = leadingSpaces(raw);\n i++;\n\n // Children (indented under couple)\n while (i < rawLines.length) {\n const childLine = rawLines[i];\n const childTrimmed = childLine.trim();\n\n if (childTrimmed === \"\" || childTrimmed.startsWith(\"#\") || childTrimmed.startsWith(\"//\") || childTrimmed.startsWith(\"%%\")) {\n i++;\n continue;\n }\n\n if (leadingSpaces(childLine) <= coupleIndent) break;\n\n const childLineNum = i + 1;\n const { id: childId, propsStr } = parseIdWithProps(childTrimmed);\n const childKey = childId.toLowerCase();\n\n individualsMap.set(childKey, buildIndividual(childId, propsStr, childLineNum));\n\n const coupleKey = `${leftKey}+${rightKey}`;\n relationships.push({ type: \"parent-child\", from: coupleKey, to: childKey });\n\n i++;\n }\n continue;\n }\n\n // Individual definition\n const { id, propsStr } = parseIdWithProps(trimmed);\n const key = id.toLowerCase();\n const ind = buildIndividual(id, propsStr, i + 1);\n const existing = individualsMap.get(key);\n if (existing) {\n individualsMap.set(key, mergeIndividual(existing, ind));\n } else {\n individualsMap.set(key, ind);\n }\n i++;\n }\n\n return {\n type: \"pedigree\",\n individuals: Array.from(individualsMap.values()),\n relationships,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n legend: legend.length > 0 ? legend : undefined,\n legendOverrides: hasLegendOverrides ? legendOverrides : undefined,\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nfunction leadingSpaces(line: string): number {\n const m = line.match(/^(\\s*)/);\n return m ? m[1].length : 0;\n}\n\nfunction detectCoupleOp(trimmed: string): { leftId: string; op: typeof COUPLE_OPS[0]; rightRaw: string } | null {\n for (const op of COUPLE_OPS) {\n let bracketDepth = 0;\n for (let j = 0; j < trimmed.length; j++) {\n if (trimmed[j] === \"[\") bracketDepth++;\n if (trimmed[j] === \"]\") bracketDepth--;\n if (bracketDepth > 0) continue;\n\n if (trimmed.substring(j, j + op.token.length) === op.token) {\n const left = trimmed.substring(0, j).trim();\n const right = trimmed.substring(j + op.token.length).trim();\n if (left && right && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(left)) {\n return { leftId: left, op, rightRaw: right };\n }\n }\n }\n }\n return null;\n}\n\nfunction parseIdWithProps(raw: string): { id: string; propsStr: string | null } {\n const bracketIdx = raw.indexOf(\"[\");\n if (bracketIdx === -1) return { id: raw.trim(), propsStr: null };\n const id = raw.substring(0, bracketIdx).trim();\n const endBracket = raw.lastIndexOf(\"]\");\n const propsStr = raw.substring(bracketIdx + 1, endBracket === -1 ? raw.length : endBracket);\n return { id, propsStr };\n}\n\nfunction splitProps(propsStr: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n for (const ch of propsStr) {\n if (ch === \"(\") parenDepth++;\n if (ch === \")\") parenDepth--;\n if (ch === \",\" && parenDepth === 0) {\n result.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n if (current.trim()) result.push(current);\n return result;\n}\n\nfunction buildIndividual(id: string, propsStr: string | null, _lineNum: number): Individual {\n const ind: Individual = {\n id: id.toLowerCase(),\n label: id,\n sex: \"unknown\",\n status: \"alive\",\n };\n\n if (!propsStr) return ind;\n\n const tokens = splitProps(propsStr);\n for (const rawToken of tokens) {\n const token = rawToken.trim();\n const lower = token.toLowerCase();\n\n if (VALID_SEX.has(lower)) {\n ind.sex = lower === \"amab\" ? \"male\" : lower === \"afab\" ? \"female\" : lower === \"uaab\" ? \"unknown\" : lower as Individual[\"sex\"];\n } else if (VALID_STATUS.has(lower)) {\n ind.status = lower as Individual[\"status\"];\n } else if (GENETIC_STATUSES.has(lower)) {\n ind.geneticStatus = lower as GeneticStatus;\n } else if (MARKERS.has(lower)) {\n if (!ind.markers) ind.markers = [];\n ind.markers.push(lower as IndividualMarker);\n } else if (/^\\d{4}$/.test(lower)) {\n ind.birthYear = parseInt(token, 10);\n } else if (lower.startsWith(\"affected:\")) {\n ind.geneticStatus = \"affected\";\n const traits = token.substring(\"affected:\".length).trim().split(\"+\").map(t => t.trim());\n ind.conditions = traits.map(t => ({ label: t, fill: \"full\" as ConditionFill }));\n } else if (token.includes(\":\")) {\n const colonIdx = token.indexOf(\":\");\n const key = token.substring(0, colonIdx).trim().toLowerCase();\n const value = token.substring(colonIdx + 1).trim().replace(/^\"|\"$/g, \"\");\n if (key === \"label\") {\n ind.label = value;\n } else {\n if (!ind.properties) ind.properties = {};\n ind.properties[key] = value;\n }\n }\n }\n\n return ind;\n}\n\nfunction mergeIndividual(existing: Individual, incoming: Individual): Individual {\n return {\n ...existing,\n sex: incoming.sex !== \"unknown\" ? incoming.sex : existing.sex,\n status: incoming.status !== \"alive\" ? incoming.status : existing.status,\n birthYear: incoming.birthYear ?? existing.birthYear,\n geneticStatus: incoming.geneticStatus ?? existing.geneticStatus,\n markers: incoming.markers ?? existing.markers,\n conditions: incoming.conditions ?? existing.conditions,\n properties: { ...existing.properties, ...incoming.properties },\n };\n}\n","import type {\n DiagramAST,\n Individual,\n Relationship,\n RelationshipType,\n LayoutConfig,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n} from \"../../core/types\";\n\n// ─── Internal types ─────────────────────────────────────────\n\ninterface FamilyUnit {\n id: string;\n partners: [string, string];\n relationship: RelationshipType;\n children: string[];\n}\n\ninterface LayoutGraph {\n individuals: Map<string, Individual>;\n familyUnits: FamilyUnit[];\n generations: Map<string, number>;\n childOf: Map<string, string>;\n}\n\n// ─── Constants ─────────────────────────────────────────────\n\nconst LABEL_HEIGHT = 20;\nconst LABEL_GAP = 6;\nconst GEN_LABEL_MARGIN = 50;\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function layoutPedigree(\n ast: DiagramAST,\n config: LayoutConfig\n): LayoutResult {\n const graph = buildGraph(ast);\n assignGenerations(graph);\n const ordered = orderNodesInGenerations(graph);\n const positions = assignPositions(ordered, graph, config);\n const edges = computeEdges(graph, positions, config);\n return packageResult(positions, edges, graph, config);\n}\n\n// ─── Step 1: Build graph ────────────────────────────────────\n\nfunction buildGraph(ast: DiagramAST): LayoutGraph {\n const individuals = new Map<string, Individual>();\n for (const ind of ast.individuals) individuals.set(ind.id, ind);\n\n const familyUnits: FamilyUnit[] = [];\n const childOf = new Map<string, string>();\n\n const coupleRels = ast.relationships.filter(\n (r) => r.type === \"married\" || r.type === \"separated\" ||\n r.type === \"consanguineous\" || r.type === \"cohabiting\"\n );\n\n for (const rel of coupleRels) {\n const fuId = `${rel.from}+${rel.to}`;\n const indA = individuals.get(rel.from);\n const indB = individuals.get(rel.to);\n\n let partners: [string, string];\n if (indA && indB) {\n if (indA.sex === \"male\" && indB.sex === \"female\") {\n partners = [rel.from, rel.to];\n } else if (indA.sex === \"female\" && indB.sex === \"male\") {\n partners = [rel.to, rel.from];\n } else {\n partners = [rel.from, rel.to];\n }\n } else {\n partners = [rel.from, rel.to];\n }\n\n const children: string[] = [];\n for (const r of ast.relationships) {\n if (r.type === \"parent-child\" && r.from === fuId) {\n children.push(r.to);\n childOf.set(r.to, fuId);\n }\n }\n\n children.sort((a, b) => {\n const ia = individuals.get(a);\n const ib = individuals.get(b);\n return (ia?.birthYear ?? 9999) - (ib?.birthYear ?? 9999);\n });\n\n familyUnits.push({ id: fuId, partners, relationship: rel.type, children });\n }\n\n return { individuals, familyUnits, generations: new Map(), childOf };\n}\n\n// ─── Step 2: Assign generations ─────────────────────────────\n\nfunction assignGenerations(graph: LayoutGraph): void {\n const { individuals, familyUnits, childOf, generations } = graph;\n const allIds = Array.from(individuals.keys());\n const roots = allIds.filter((id) => !childOf.has(id));\n\n if (roots.length === 0 && allIds.length > 0) {\n for (const id of allIds) generations.set(id, 0);\n return;\n }\n\n for (const root of roots) {\n if (!generations.has(root)) generations.set(root, 0);\n }\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const fu of familyUnits) {\n const gen0 = generations.get(fu.partners[0]);\n const gen1 = generations.get(fu.partners[1]);\n\n let partnerGen: number;\n if (gen0 !== undefined && gen1 !== undefined) {\n partnerGen = Math.max(gen0, gen1);\n if (gen0 !== partnerGen) { generations.set(fu.partners[0], partnerGen); changed = true; }\n if (gen1 !== partnerGen) { generations.set(fu.partners[1], partnerGen); changed = true; }\n } else if (gen0 !== undefined) {\n partnerGen = gen0;\n generations.set(fu.partners[1], partnerGen); changed = true;\n } else if (gen1 !== undefined) {\n partnerGen = gen1;\n generations.set(fu.partners[0], partnerGen); changed = true;\n } else {\n continue;\n }\n\n for (const childId of fu.children) {\n const childGen = partnerGen + 1;\n const existing = generations.get(childId);\n if (existing === undefined || existing < childGen) {\n generations.set(childId, childGen);\n changed = true;\n }\n }\n }\n }\n\n for (const id of allIds) {\n if (!generations.has(id)) generations.set(id, 0);\n }\n}\n\n// ─── Step 3: Order nodes ───────────────────────────────────\n\ninterface OrderedGeneration {\n index: number;\n nodeIds: string[];\n}\n\nfunction orderNodesInGenerations(graph: LayoutGraph): OrderedGeneration[] {\n const genGroups = new Map<number, string[]>();\n for (const [id, gen] of graph.generations) {\n const grp = genGroups.get(gen) ?? [];\n grp.push(id);\n genGroups.set(gen, grp);\n }\n\n const genIndices = Array.from(genGroups.keys()).sort((a, b) => a - b);\n const result: OrderedGeneration[] = [];\n\n for (const genIdx of genIndices) {\n const nodeIds = genGroups.get(genIdx) ?? [];\n result.push({ index: genIdx, nodeIds: orderGeneration(nodeIds, graph) });\n }\n\n return result;\n}\n\nfunction orderGeneration(nodeIds: string[], graph: LayoutGraph): string[] {\n if (nodeIds.length <= 1) return [...nodeIds];\n\n const nodeSet = new Set(nodeIds);\n const placed = new Set<string>();\n const ordered: string[] = [];\n\n const fuInGen = graph.familyUnits.filter(\n (fu) => nodeSet.has(fu.partners[0]) || nodeSet.has(fu.partners[1])\n );\n\n for (const fu of fuInGen) {\n for (const p of fu.partners) {\n if (nodeSet.has(p) && !placed.has(p)) {\n ordered.push(p);\n placed.add(p);\n }\n }\n }\n\n for (const id of nodeIds) {\n if (!placed.has(id)) {\n ordered.push(id);\n placed.add(id);\n }\n }\n\n return ordered;\n}\n\n// ─── Step 4: Assign positions ──────────────────────────────\n\ninterface NodePosition {\n id: string;\n x: number;\n y: number;\n generation: number;\n}\n\nfunction assignPositions(\n orderedGens: OrderedGeneration[],\n graph: LayoutGraph,\n config: LayoutConfig\n): Map<string, NodePosition> {\n const positions = new Map<string, NodePosition>();\n const { nodeWidth, nodeSpacingX } = config;\n const half = nodeWidth / 2;\n const coupleGap = nodeWidth + nodeSpacingX * 0.6;\n const familyGap = nodeWidth + nodeSpacingX * 1.5;\n const genStepY = config.nodeHeight + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY;\n\n for (const gen of orderedGens) {\n const y = gen.index * genStepY + half;\n const segments = buildSegments(gen.nodeIds, graph);\n\n let xCursor = GEN_LABEL_MARGIN + half;\n for (let s = 0; s < segments.length; s++) {\n const seg = segments[s];\n if (s > 0) xCursor += familyGap;\n\n if (seg.type === \"couple\") {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n xCursor += coupleGap;\n positions.set(seg.ids[1], { id: seg.ids[1], x: xCursor, y, generation: gen.index });\n } else {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n }\n }\n }\n\n resolveOverlaps(positions, orderedGens, config);\n centerChildrenUnderParents(positions, graph, config);\n resolveOverlaps(positions, orderedGens, config);\n\n return positions;\n}\n\ninterface Segment {\n type: \"couple\" | \"single\";\n ids: string[];\n}\n\nfunction buildSegments(nodeIds: string[], graph: LayoutGraph): Segment[] {\n const nodeSet = new Set(nodeIds);\n const segments: Segment[] = [];\n const placed = new Set<string>();\n\n for (const id of nodeIds) {\n if (placed.has(id)) continue;\n\n const fu = graph.familyUnits.find(\n (f) =>\n (f.partners[0] === id || f.partners[1] === id) &&\n !placed.has(f.partners[0]) &&\n !placed.has(f.partners[1]) &&\n nodeSet.has(f.partners[0]) &&\n nodeSet.has(f.partners[1])\n );\n\n if (fu) {\n segments.push({ type: \"couple\", ids: [fu.partners[0], fu.partners[1]] });\n placed.add(fu.partners[0]);\n placed.add(fu.partners[1]);\n } else {\n segments.push({ type: \"single\", ids: [id] });\n placed.add(id);\n }\n }\n\n return segments;\n}\n\nfunction centerChildrenUnderParents(\n positions: Map<string, NodePosition>,\n graph: LayoutGraph,\n config: LayoutConfig\n): void {\n const coupleGap = config.nodeSpacingX + config.nodeWidth;\n\n const personToFUs = new Map<string, FamilyUnit[]>();\n for (const fu of graph.familyUnits) {\n for (const p of fu.partners) {\n const arr = personToFUs.get(p) ?? [];\n arr.push(fu);\n personToFUs.set(p, arr);\n }\n }\n\n for (let pass = 0; pass < 3; pass++) {\n for (const fu of graph.familyUnits) {\n if (fu.children.length === 0) continue;\n\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const parentMidX = (posA.x + posB.x) / 2;\n const childSpacing = config.nodeSpacingX + config.nodeWidth;\n\n const sortedChildren = [...fu.children].sort((a, b) => {\n const ia = graph.individuals.get(a);\n const ib = graph.individuals.get(b);\n return (ia?.birthYear ?? 9999) - (ib?.birthYear ?? 9999);\n });\n\n if (sortedChildren.length > 1) {\n // Calculate per-gap spacing: add room for married-in spouses\n const gaps: number[] = [];\n for (let j = 0; j < sortedChildren.length - 1; j++) {\n let gap = childSpacing;\n\n // If the RIGHT child has a spouse placed to their LEFT\n const nextChild = sortedChildren[j + 1];\n const nextFUs = personToFUs.get(nextChild) ?? [];\n for (const cfu of nextFUs) {\n const pid = cfu.partners[0] === nextChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(nextChild);\n const pInd = graph.individuals.get(pid);\n if (!(cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\"))) {\n gap += coupleGap;\n }\n }\n\n // If the LEFT child has a spouse placed to their RIGHT\n const currChild = sortedChildren[j];\n const currFUs = personToFUs.get(currChild) ?? [];\n for (const cfu of currFUs) {\n const pid = cfu.partners[0] === currChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(currChild);\n const pInd = graph.individuals.get(pid);\n if (cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\")) {\n gap += coupleGap;\n }\n }\n\n gaps.push(gap);\n }\n\n const totalWidth = gaps.reduce((s, g) => s + g, 0);\n const startX = parentMidX - totalWidth / 2;\n let cx = startX;\n for (let j = 0; j < sortedChildren.length; j++) {\n const pos = positions.get(sortedChildren[j]);\n if (pos) pos.x = cx;\n if (j < gaps.length) cx += gaps[j];\n }\n } else {\n const pos = positions.get(sortedChildren[0]);\n if (pos) pos.x = parentMidX;\n }\n\n for (const childId of fu.children) {\n const childPos = positions.get(childId);\n if (!childPos) continue;\n const childFUs = personToFUs.get(childId) ?? [];\n for (const childFU of childFUs) {\n const partnerId = childFU.partners[0] === childId ? childFU.partners[1] : childFU.partners[0];\n const partnerPos = positions.get(partnerId);\n if (!partnerPos) continue;\n const childInd = graph.individuals.get(childId);\n const partnerInd = graph.individuals.get(partnerId);\n if (childInd?.sex === \"male\" || (childInd?.sex !== \"female\" && partnerInd?.sex === \"female\")) {\n partnerPos.x = childPos.x + coupleGap;\n } else {\n partnerPos.x = childPos.x - coupleGap;\n }\n }\n }\n }\n }\n}\n\nfunction resolveOverlaps(\n positions: Map<string, NodePosition>,\n orderedGens: OrderedGeneration[],\n config: LayoutConfig\n): void {\n const minGap = config.nodeWidth + config.nodeSpacingX;\n\n for (const gen of orderedGens) {\n const genNodes = gen.nodeIds\n .map((id) => positions.get(id))\n .filter((p): p is NodePosition => p !== undefined);\n genNodes.sort((a, b) => a.x - b.x);\n\n for (let j = 1; j < genNodes.length; j++) {\n const gap = genNodes[j].x - genNodes[j - 1].x;\n if (gap < minGap) {\n const shift = minGap - gap;\n for (let k = j; k < genNodes.length; k++) genNodes[k].x += shift;\n }\n }\n }\n\n let minX = Infinity;\n for (const pos of positions.values()) {\n if (pos.x < minX) minX = pos.x;\n }\n const minAllowed = GEN_LABEL_MARGIN + config.nodeWidth / 2;\n if (minX < minAllowed) {\n const shift = minAllowed - minX;\n for (const pos of positions.values()) pos.x += shift;\n }\n}\n\n// ─── Step 5: Compute edges ─────────────────────────────────\n\nfunction computeEdges(\n graph: LayoutGraph,\n positions: Map<string, NodePosition>,\n config: LayoutConfig\n): LayoutEdge[] {\n const edges: LayoutEdge[] = [];\n const half = config.nodeWidth / 2;\n const dropY_offset = config.nodeHeight / 2 + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY * 0.35;\n\n for (const fu of graph.familyUnits) {\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const leftPos = posA.x < posB.x ? posA : posB;\n const rightPos = posA.x < posB.x ? posB : posA;\n const leftId = posA.x < posB.x ? fu.partners[0] : fu.partners[1];\n const rightId = posA.x < posB.x ? fu.partners[1] : fu.partners[0];\n\n const coupleRel: Relationship = { type: fu.relationship, from: leftId, to: rightId };\n const couplePath = `M ${leftPos.x + half} ${leftPos.y} L ${rightPos.x - half} ${rightPos.y}`;\n edges.push({ from: leftId, to: rightId, relationship: coupleRel, path: couplePath });\n\n // Consanguinity: add second parallel line\n if (fu.relationship === \"consanguineous\") {\n const offset = 3;\n const consPath = `M ${leftPos.x + half} ${leftPos.y + offset} L ${rightPos.x - half} ${rightPos.y + offset}`;\n edges.push({\n from: leftId, to: rightId,\n relationship: { type: \"consanguineous\", from: leftId, to: rightId, label: \"_double\" },\n path: consPath,\n });\n }\n\n if (fu.children.length > 0) {\n const midX = (posA.x + posB.x) / 2;\n const coupleY = posA.y;\n const dropY = coupleY + dropY_offset;\n\n const childPositions = fu.children\n .map((cid) => ({ id: cid, pos: positions.get(cid) }))\n .filter((c): c is { id: string; pos: NodePosition } => c.pos !== undefined);\n\n if (childPositions.length === 0) continue;\n childPositions.sort((a, b) => a.pos.x - b.pos.x);\n\n const leftX = childPositions[0].pos.x;\n const rightX = childPositions[childPositions.length - 1].pos.x;\n\n edges.push({\n from: fu.partners[0], to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_drop\" },\n path: `M ${midX} ${coupleY} L ${midX} ${dropY}`,\n });\n\n if (childPositions.length > 1) {\n edges.push({\n from: fu.partners[0], to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_sibship\" },\n path: `M ${leftX} ${dropY} L ${rightX} ${dropY}`,\n });\n }\n\n for (const child of childPositions) {\n const childTop = child.pos.y - config.nodeHeight / 2;\n const childPath = childPositions.length === 1\n ? `M ${midX} ${coupleY} L ${midX} ${childTop}`\n : `M ${child.pos.x} ${dropY} L ${child.pos.x} ${childTop}`;\n\n edges.push({\n from: fu.id, to: child.id,\n relationship: { type: \"parent-child\", from: fu.id, to: child.id },\n path: childPath,\n });\n }\n }\n }\n\n return edges;\n}\n\n// ─── Step 6: Package result ─────────────────────────────────\n\nfunction packageResult(\n positions: Map<string, NodePosition>,\n edges: LayoutEdge[],\n graph: LayoutGraph,\n config: LayoutConfig\n): LayoutResult {\n const padding = 40;\n const nodes: LayoutNode[] = [];\n\n for (const [id, pos] of positions) {\n const ind = graph.individuals.get(id);\n if (!ind) continue;\n nodes.push({\n id,\n x: pos.x - config.nodeWidth / 2 + padding,\n y: pos.y - config.nodeHeight / 2 + padding,\n width: config.nodeWidth,\n height: config.nodeHeight,\n generation: pos.generation,\n individual: ind,\n });\n }\n\n const shiftedEdges = edges.map((e) => ({\n ...e,\n path: shiftPath(e.path, padding, padding),\n }));\n\n let maxX = 0;\n let maxY = 0;\n let minX = Infinity;\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const labelText = node.individual.label || node.individual.id;\n const labelHalfWidth = labelText.length * 3.8;\n const right = Math.max(node.x + node.width, cx + labelHalfWidth);\n const left = Math.min(node.x, cx - labelHalfWidth);\n const bottom = node.y + node.height;\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n if (left < minX) minX = left;\n }\n\n if (minX < 0) {\n const shift = -minX;\n for (const node of nodes) {\n node.x += shift;\n }\n for (const edge of shiftedEdges) {\n edge.path = shiftPath(edge.path, shift, 0);\n }\n maxX += shift;\n }\n\n return {\n width: maxX + padding,\n height: maxY + padding + LABEL_GAP + LABEL_HEIGHT + 10,\n nodes,\n edges: shiftedEdges,\n };\n}\n\nfunction shiftPath(pathData: string, dx: number, dy: number): string {\n return pathData.replace(\n /([ML])\\s*([\\d.-]+)\\s+([\\d.-]+)/g,\n (_match, cmd: string, xStr: string, yStr: string) => {\n const x = parseFloat(xStr) + dx;\n const y = parseFloat(yStr) + dy;\n return `${cmd} ${x} ${y}`;\n }\n );\n}\n","/**\n * Auto-derive a LegendSpec from a pedigree AST.\n *\n * Pedigree-specific encodings:\n * 1. Trait fills (the legacy `legend: trait_id = \"Label\" (fill: ...)`\n * directive) — merged into the unified system as a TRAITS section.\n * 2. Symbols (carriers, deceased, proband, etc.) — only when used.\n *\n * The standard square=Male / circle=Female convention is universal McGoldrick\n * and is excluded by default (matches genogram behavior).\n */\n\nimport type {\n DiagramAST,\n GeneticStatus,\n LegendItem,\n LegendSection,\n LegendSpec,\n Sex,\n} from \"../../core/types\";\nimport type { ResolvedTheme, PersonTokens } from \"../../core/theme\";\n\nconst SECTIONS: LegendSection[] = [\n { id: \"status\", title: \"Genetic status\" },\n { id: \"traits\", title: \"Traits\" },\n { id: \"symbols\", title: \"Symbols\" },\n];\n\nconst OBVIOUS_SEX: ReadonlySet<Sex> = new Set<Sex>([\"male\", \"female\"]);\n\nexport function buildPedigreeLegend(\n ast: DiagramAST,\n theme: ResolvedTheme<PersonTokens>\n): LegendSpec {\n const items: LegendItem[] = [];\n\n // Genetic status: standard pedigree-chart encoding (unaffected omitted —\n // it's the universal default).\n const statusUsed = new Set<GeneticStatus>();\n for (const ind of ast.individuals) {\n if (ind.geneticStatus && ind.geneticStatus !== \"unaffected\") {\n statusUsed.add(ind.geneticStatus);\n }\n }\n const statusOrder: GeneticStatus[] = [\n \"affected\",\n \"carrier\",\n \"carrier-x\",\n \"obligate-carrier\",\n \"presymptomatic\",\n ];\n for (const s of statusOrder) {\n if (!statusUsed.has(s)) continue;\n items.push(geneticStatusItem(s, theme));\n }\n\n // Legacy trait legend entries (when DSL uses `legend: cf = \"Cystic Fibrosis\"`).\n if (ast.legend && ast.legend.length > 0) {\n for (const entry of ast.legend) {\n const isFull = !entry.fill || entry.fill === \"full\";\n items.push({\n key: entry.id,\n label: entry.label,\n kind: isFull ? \"fill\" : \"fill-pattern\",\n color: entry.color ?? theme.conditionFill,\n shape: isFull ? undefined : entry.fill,\n section: \"traits\",\n });\n }\n }\n\n // Non-obvious sex shapes (unknown / nonbinary / intersex).\n const sexUsed = new Set<Sex>();\n for (const ind of ast.individuals) sexUsed.add(ind.sex);\n const sexOrder: Sex[] = [\"unknown\", \"other\", \"nonbinary\", \"intersex\"];\n for (const s of sexOrder) {\n if (!sexUsed.has(s) || OBVIOUS_SEX.has(s)) continue;\n items.push({\n key: `sex.${s}`,\n label: sexLabel(s),\n kind: \"shape\",\n shape: \"diamond\",\n fill: theme.unknownFill,\n color: theme.stroke,\n section: \"symbols\",\n });\n }\n\n // Deceased\n const hasDeceased = ast.individuals.some((i) => i.status === \"deceased\");\n if (hasDeceased) {\n items.push({\n key: \"status.deceased\",\n label: \"Deceased\",\n kind: \"marker\",\n marker: \"slash\",\n color: theme.deceasedMark,\n section: \"symbols\",\n });\n }\n\n // Proband / consultand markers\n const hasProband = ast.individuals.some((i) => i.markers?.includes(\"proband\"));\n if (hasProband) {\n items.push({\n key: \"marker.proband\",\n label: \"Proband (P) — first affected case identified\",\n kind: \"marker\",\n marker: \"P\",\n section: \"symbols\",\n });\n }\n const hasConsultand = ast.individuals.some((i) => i.markers?.includes(\"consultand\"));\n if (hasConsultand) {\n items.push({\n key: \"marker.consultand\",\n label: \"Consultand (C)\",\n kind: \"marker\",\n marker: \"C\",\n section: \"symbols\",\n });\n }\n\n return {\n mode: \"auto\",\n title: \"Legend\",\n position: \"bottom-inline\",\n columns: 1,\n sections: SECTIONS,\n items,\n };\n}\n\nfunction geneticStatusItem(\n s: GeneticStatus,\n theme: ResolvedTheme<PersonTokens>\n): LegendItem {\n switch (s) {\n case \"affected\":\n return {\n key: `status.${s}`,\n label: \"Affected\",\n kind: \"fill\",\n color: theme.conditionFill,\n section: \"status\",\n };\n case \"carrier\":\n return {\n key: `status.${s}`,\n label: \"Carrier\",\n kind: \"fill-pattern\",\n color: theme.conditionFill,\n shape: \"half-left\",\n section: \"status\",\n };\n case \"carrier-x\":\n return {\n key: `status.${s}`,\n label: \"X-linked carrier\",\n kind: \"marker\",\n marker: \"dot\",\n color: theme.conditionFill,\n section: \"status\",\n };\n case \"obligate-carrier\":\n return {\n key: `status.${s}`,\n label: \"Obligate carrier\",\n kind: \"marker\",\n marker: \"dot\",\n color: theme.conditionFill,\n section: \"status\",\n };\n case \"presymptomatic\":\n return {\n key: `status.${s}`,\n label: \"Presymptomatic\",\n kind: \"line\",\n color: theme.conditionFill,\n pattern: \"solid\",\n strokeWidth: 2,\n section: \"status\",\n };\n default:\n return {\n key: `status.${s}`,\n label: humanize(s),\n kind: \"fill\",\n color: theme.conditionFill,\n section: \"status\",\n };\n }\n}\n\nfunction sexLabel(s: Sex): string {\n switch (s) {\n case \"unknown\": return \"Unknown sex\";\n case \"other\": return \"Other\";\n case \"nonbinary\": return \"Non-binary\";\n case \"intersex\": return \"Intersex\";\n default: return s;\n }\n}\n\nfunction humanize(s: string): string {\n return s.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","import type {\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n RenderConfig,\n Individual,\n DiagramAST,\n} from \"../../core/types\";\nimport {\n svgRoot,\n el,\n group,\n rect,\n circle,\n polygon,\n line,\n text,\n title,\n desc,\n defs,\n path,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolvePersonTheme, STROKE_WIDTH, type ResolvedTheme, type PersonTokens } from \"../../core/theme\";\nimport { applyLegendOverrides, renderLegend as renderLegendCore } from \"../../core/legend\";\nimport { buildPedigreeLegend } from \"./legend\";\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function renderPedigree(\n layout: LayoutResult,\n config: RenderConfig,\n ast?: DiagramAST\n): string {\n const t = resolvePersonTheme(config.theme);\n const defsStr = buildDefs(layout.nodes, t);\n const styleStr = buildStyles(config, t);\n\n const genGroups = groupByGeneration(layout.nodes);\n const edgeLayers = renderEdges(layout.edges);\n const nodeLayers = renderNodes(genGroups);\n const labelLayer = renderLabels(layout.nodes, genGroups, config);\n const genLabels = renderGenerationLabels(genGroups, config);\n\n const nodeCount = layout.nodes.length;\n const genCount = genGroups.size;\n\n const diagramTitle = ast?.metadata?.title ?? \"Pedigree\";\n\n const layers: string[] = [\n title(diagramTitle),\n desc(`Pedigree chart with ${nodeCount} individuals across ${genCount} generations`),\n defsStr,\n styleStr,\n ];\n\n // Defer chart-content push until legend bbox is known so we can center.\n const chartContent = [genLabels, edgeLayers, ...nodeLayers, labelLayer];\n\n let finalWidth = layout.width;\n let finalHeight = layout.height;\n let legendSvg = \"\";\n\n if (ast) {\n const autoSpec = buildPedigreeLegend(ast, t);\n const finalSpec = applyLegendOverrides(autoSpec, ast.legendOverrides);\n if (finalSpec.mode === \"on\" && finalSpec.items.length > 0) {\n const { svg, bbox: lb } = renderLegendCore(\n finalSpec,\n {\n canvasWidth: layout.width,\n canvasHeight: layout.height,\n padding: 16,\n },\n t,\n { fontFamily: config.fontFamily, fontSize: config.fontSize }\n );\n if (svg) {\n legendSvg = svg;\n const overflowX = lb.x + lb.w + 8;\n const overflowY = lb.y + lb.h + 8;\n if (overflowX > finalWidth) finalWidth = overflowX;\n if (overflowY > finalHeight) finalHeight = overflowY;\n }\n }\n }\n\n const chartXOffset = Math.max(0, (finalWidth - layout.width) / 2);\n layers.push(\n group(\n { transform: chartXOffset > 0 ? `translate(${chartXOffset}, 0)` : undefined },\n chartContent\n )\n );\n if (legendSvg) layers.push(legendSvg);\n\n return svgRoot(\n {\n viewBox: `0 0 ${finalWidth} ${finalHeight}`,\n class: \"schematex-diagram schematex-pedigree\",\n width: finalWidth,\n height: finalHeight,\n },\n layers\n );\n}\n\n// ─── Defs ──────────────────────────────────────────────────\n\nfunction buildDefs(nodes: LayoutNode[], t: ResolvedTheme<PersonTokens>): string {\n const children: string[] = [];\n const needs = new Set<string>();\n\n for (const n of nodes) {\n const gs = n.individual.geneticStatus;\n if (gs) needs.add(gs);\n }\n\n if (needs.has(\"carrier\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-pedigree-clip-carrier-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"100%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-pedigree-clip-carrier-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"100\" }),\n ])\n );\n }\n\n // Proband arrow marker\n children.push(\n el(\"marker\", {\n id: \"schematex-pedigree-proband-arrow\",\n viewBox: \"0 0 10 10\",\n refX: \"0\",\n refY: \"5\",\n markerWidth: \"8\",\n markerHeight: \"8\",\n orient: \"auto-start-reverse\",\n }, [\n path({ d: \"M 0 0 L 10 5 L 0 10 z\", fill: t.stroke }),\n ])\n );\n\n return defs(children);\n}\n\n// ─── Styles ────────────────────────────────────────────────\n\nfunction buildStyles(config: RenderConfig, t: ResolvedTheme<PersonTokens>): string {\n const css = `\n.schematex-pedigree {${cssCustomProperties(t)}\n}\n.schematex-pedigree-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linejoin: round; }\n.schematex-pedigree-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize}px; text-anchor: middle; fill: ${t.text}; }\n.schematex-pedigree-gen-label { font-family: ${config.fontFamily}; font-size: 14px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-pedigree-edge { stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; stroke-linejoin: round; }\n.schematex-pedigree-deceased-mark { stroke: ${t.deceasedMark}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-pedigree-affected-fill { fill: ${t.conditionFill}; }\n.schematex-pedigree-carrier-fill { fill: ${t.conditionFill}; }\n.schematex-pedigree-carrier-x-dot { fill: ${t.conditionFill}; }\n.schematex-pedigree-presymptomatic-mark { stroke: ${t.conditionFill}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-pedigree-proband-arrow-line { stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; marker-end: url(#schematex-pedigree-proband-arrow); }\n.schematex-pedigree-proband-label { font-family: ${config.fontFamily}; font-size: 10px; font-weight: bold; fill: ${t.stroke}; }\n.schematex-pedigree-loss-shape { fill: ${t.stroke}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linejoin: round; }\n.schematex-pedigree-tab-slash { stroke: ${t.deceasedMark}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-pedigree-status-label { font-family: ${config.fontFamily}; font-size: 10px; font-weight: bold; fill: ${t.text}; }\n.schematex-pedigree-legend { font-family: ${config.fontFamily}; font-size: 11px; fill: ${t.text}; }\n.schematex-pedigree-legend-box { fill: ${t.fill}; stroke: ${t.neutral}; stroke-width: 1; }\n`;\n return el(\"style\", {}, css);\n}\n\n// ─── Edges ─────────────────────────────────────────────────\n\nfunction renderEdges(edges: LayoutEdge[]): string {\n const children: string[] = [];\n\n for (const edge of edges) {\n const relType = edge.relationship.type;\n const cssClass = `schematex-pedigree-edge schematex-pedigree-edge-${relType}`;\n\n const elements: string[] = [\n el(\"path\", { d: edge.path, class: \"schematex-pedigree-edge-path\" }),\n ];\n\n if (relType === \"separated\") {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n line({\n x1: mid.x - 4, y1: mid.y - 6,\n x2: mid.x + 4, y2: mid.y + 6,\n class: \"schematex-pedigree-edge\",\n })\n );\n }\n }\n\n children.push(\n group({ class: cssClass, \"data-from\": edge.from, \"data-to\": edge.to }, elements)\n );\n }\n\n return group({ class: \"schematex-pedigree-edges\" }, children);\n}\n\nfunction pathMidpoint(pathData: string): { x: number; y: number } | null {\n const coords = pathData.match(/[\\d.-]+/g);\n if (!coords || coords.length < 4) return null;\n return {\n x: (parseFloat(coords[0]) + parseFloat(coords[2])) / 2,\n y: (parseFloat(coords[1]) + parseFloat(coords[3])) / 2,\n };\n}\n\n// ─── Nodes ─────────────────────────────────────────────────\n\nfunction groupByGeneration(nodes: LayoutNode[]): Map<number, LayoutNode[]> {\n const groups = new Map<number, LayoutNode[]>();\n for (const node of nodes) {\n const grp = groups.get(node.generation) ?? [];\n grp.push(node);\n groups.set(node.generation, grp);\n }\n return groups;\n}\n\nfunction renderNodes(genGroups: Map<number, LayoutNode[]>): string[] {\n const layers: string[] = [];\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n\n for (const genIdx of sortedGens) {\n const nodes = genGroups.get(genIdx) ?? [];\n const nodeElements: string[] = [];\n\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n nodeElements.push(renderPedigreeSymbol(node.individual, cx, cy, node.width));\n }\n\n layers.push(\n group(\n { class: `schematex-pedigree-generation schematex-pedigree-generation-${genIdx}`, \"data-generation\": genIdx },\n nodeElements\n )\n );\n }\n\n return layers;\n}\n\nfunction renderPedigreeSymbol(\n ind: Individual,\n x: number,\n y: number,\n size: number\n): string {\n const half = size / 2;\n const classes = [\"schematex-pedigree-node\", `schematex-pedigree-${ind.sex === \"other\" ? \"unknown\" : ind.sex}`];\n if (ind.status === \"deceased\") classes.push(\"schematex-pedigree-deceased\");\n if (ind.geneticStatus) classes.push(`schematex-pedigree-${ind.geneticStatus}`);\n\n const titleText = formatTitle(ind);\n const children: string[] = [title(titleText)];\n\n // NSGC pregnancy-loss: filled point-down triangle (~60% size). TAB adds slash; Ectopic adds \"ECT\".\n const pregLoss = ind.status === \"sab\" || ind.status === \"tab\" || ind.status === \"ectopic\";\n if (pregLoss) {\n classes.push(`schematex-pedigree-${ind.status}`);\n const t = half * 0.6;\n children.push(\n polygon({\n points: `${-t},${-t} ${t},${-t} 0,${t}`,\n class: `schematex-pedigree-loss-shape schematex-pedigree-${ind.status}-shape`,\n })\n );\n if (ind.status === \"tab\") {\n children.push(\n line({\n x1: -t * 1.1, y1: t * 1.1, x2: t * 1.1, y2: -t * 1.1,\n class: \"schematex-pedigree-tab-slash\",\n })\n );\n }\n if (ind.status === \"ectopic\") {\n children.push(\n text(\n { x: 0, y: t + 14, class: \"schematex-pedigree-status-label\", \"text-anchor\": \"middle\" },\n \"ECT\"\n )\n );\n }\n // Skip regular shape + genetic-status fills — not applicable.\n return group(\n {\n class: classes.join(\" \"),\n \"data-individual-id\": ind.id,\n transform: `translate(${x}, ${y})`,\n },\n children\n );\n }\n\n // Base shape\n children.push(baseShape(ind.sex, half));\n\n // Stillborn: keep the sex-based shape, add an \"SB\" label below.\n if (ind.status === \"stillborn\") {\n classes.push(\"schematex-pedigree-stillborn\");\n children.push(\n text(\n { x: 0, y: half + 14, class: \"schematex-pedigree-status-label\", \"text-anchor\": \"middle\" },\n \"SB\"\n )\n );\n }\n\n // Genetic status fills\n const gs = ind.geneticStatus;\n if (gs === \"affected\") {\n children.push(affectedFill(ind.sex, half));\n } else if (gs === \"carrier\") {\n children.push(carrierFill(ind.sex, half));\n } else if (gs === \"carrier-x\" || gs === \"obligate-carrier\") {\n children.push(carrierDot(half));\n }\n\n // Presymptomatic vertical line\n if (gs === \"presymptomatic\") {\n children.push(\n line({ x1: 0, y1: -half, x2: 0, y2: half, class: \"schematex-pedigree-presymptomatic-mark\" })\n );\n }\n\n // Deceased: diagonal slash (pedigree uses / not X)\n if (ind.status === \"deceased\") {\n const ext = ind.sex === \"female\" ? half * 0.707 : half;\n children.push(\n line({ x1: ext, y1: -ext, x2: -ext, y2: ext, class: \"schematex-pedigree-deceased-mark\" })\n );\n }\n\n // Proband arrow\n if (ind.markers?.includes(\"proband\")) {\n const arrowLen = 20;\n children.push(\n line({\n x1: -half - arrowLen, y1: half + arrowLen,\n x2: -half - 2, y2: half + 2,\n class: \"schematex-pedigree-proband-arrow-line\",\n }),\n text(\n { x: -half - arrowLen - 4, y: half + arrowLen + 4, class: \"schematex-pedigree-proband-label\", \"text-anchor\": \"end\" },\n \"P\"\n )\n );\n }\n\n // Consultand arrow\n if (ind.markers?.includes(\"consultand\")) {\n const arrowLen = 20;\n children.push(\n line({\n x1: -half - arrowLen, y1: half + arrowLen,\n x2: -half - 2, y2: half + 2,\n class: \"schematex-pedigree-proband-arrow-line\",\n }),\n text(\n { x: -half - arrowLen - 4, y: half + arrowLen + 4, class: \"schematex-pedigree-proband-label\", \"text-anchor\": \"end\" },\n \"C\"\n )\n );\n }\n\n // Evaluated marker\n if (ind.markers?.includes(\"evaluated\")) {\n children.push(\n text(\n { x: 0, y: -half - 4, class: \"schematex-pedigree-proband-label\", \"text-anchor\": \"middle\" },\n \"E\"\n )\n );\n }\n\n return group(\n {\n class: classes.join(\" \"),\n \"data-individual-id\": ind.id,\n transform: `translate(${x}, ${y})`,\n },\n children\n );\n}\n\nfunction baseShape(sex: Individual[\"sex\"], half: number): string {\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, class: \"schematex-pedigree-shape\" });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, class: \"schematex-pedigree-shape\" });\n default:\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, class: \"schematex-pedigree-shape\" });\n }\n}\n\nfunction affectedFill(sex: Individual[\"sex\"], half: number): string {\n const attrs = { class: \"schematex-pedigree-affected-fill\" };\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, ...attrs });\n default:\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, ...attrs });\n }\n}\n\nfunction carrierFill(sex: Individual[\"sex\"], half: number): string {\n const clipSuffix = sex === \"female\" ? \"circle\" : \"rect\";\n const attrs = {\n class: \"schematex-pedigree-carrier-fill\",\n \"clip-path\": `url(#schematex-pedigree-clip-carrier-${clipSuffix})`,\n };\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, ...attrs });\n default:\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, ...attrs });\n }\n}\n\nfunction carrierDot(half: number): string {\n return circle({ cx: 0, cy: 0, r: half * 0.15, class: \"schematex-pedigree-carrier-x-dot\" });\n}\n\nfunction formatTitle(ind: Individual): string {\n const name = ind.label.charAt(0).toUpperCase() + ind.label.slice(1);\n if (ind.geneticStatus && ind.geneticStatus !== \"unaffected\") {\n return `${name} (${ind.geneticStatus})`;\n }\n return name;\n}\n\n// ─── Labels ────────────────────────────────────────────────\n\nfunction renderLabels(\n nodes: LayoutNode[],\n genGroups: Map<number, LayoutNode[]>,\n config: RenderConfig\n): string {\n const labels: string[] = [];\n\n // Build per-generation numbering\n const genNumbering = new Map<string, string>();\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n for (const genIdx of sortedGens) {\n const genNodes = genGroups.get(genIdx) ?? [];\n const sorted = [...genNodes].sort((a, b) => a.x - b.x);\n const romanNum = toRoman(genIdx + 1);\n for (let i = 0; i < sorted.length; i++) {\n genNumbering.set(sorted[i].id, `${romanNum}-${i + 1}`);\n }\n }\n\n for (const node of nodes) {\n const ind = node.individual;\n const cx = node.x + node.width / 2;\n const labelY = node.y + node.height + 6 + config.fontSize;\n\n const pedigreeId = genNumbering.get(ind.id) ?? ind.id;\n const displayLabel = ind.label !== ind.id ? ind.label : pedigreeId;\n\n labels.push(\n text(\n { x: cx, y: labelY, class: \"schematex-pedigree-label\", \"data-individual-id\": ind.id },\n displayLabel\n )\n );\n }\n\n return group({ class: \"schematex-pedigree-labels\" }, labels);\n}\n\n// ─── Generation Labels ─────────────────────────────────────\n\nfunction renderGenerationLabels(\n genGroups: Map<number, LayoutNode[]>,\n _config: RenderConfig\n): string {\n const labels: string[] = [];\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n\n for (const genIdx of sortedGens) {\n const nodes = genGroups.get(genIdx) ?? [];\n if (nodes.length === 0) continue;\n\n const midY = nodes[0].y + nodes[0].height / 2;\n const roman = toRoman(genIdx + 1);\n\n labels.push(\n text(\n { x: 25, y: midY + 5, class: \"schematex-pedigree-gen-label\" },\n roman\n )\n );\n }\n\n return group({ class: \"schematex-pedigree-generation-labels\" }, labels);\n}\n\n// ─── Legend ────────────────────────────────────────────────\n// (moved to ./legend.ts; rendered via core/legend)\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction toRoman(n: number): string {\n const vals = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];\n const syms = [\"M\", \"CM\", \"D\", \"CD\", \"C\", \"XC\", \"L\", \"XL\", \"X\", \"IX\", \"V\", \"IV\", \"I\"];\n let result = \"\";\n for (let i = 0; i < vals.length; i++) {\n while (n >= vals[i]) {\n result += syms[i];\n n -= vals[i];\n }\n }\n return result;\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parsePedigree, PedigreeParseError } from \"./parser\";\nimport { layoutPedigree } from \"./layout\";\nimport { renderPedigree } from \"./renderer\";\n\nexport const pedigree: DiagramPlugin = {\n type: \"pedigree\",\n\n detect(text: string): boolean {\n const firstLine = firstContentLine(text)?.toLowerCase() ?? \"\";\n return (\n firstLine === \"pedigree\" ||\n firstLine.startsWith(\"pedigree \") ||\n firstLine.startsWith(\"pedigree:\")\n );\n },\n\n parse: parsePedigree,\n\n render(text: string, config?: RenderConfig): string {\n const ast = parsePedigree(text);\n const layoutConfig = {\n nodeSpacingX: 80,\n nodeSpacingY: 100,\n nodeWidth: 40,\n nodeHeight: 40,\n };\n const layout = layoutPedigree(ast, layoutConfig);\n const renderConfig: RenderConfig = {\n fontFamily: config?.fontFamily ?? \"system-ui, -apple-system, sans-serif\",\n fontSize: config?.fontSize ?? 12,\n theme: config?.theme ?? \"default\",\n padding: config?.padding ?? 20,\n };\n return renderPedigree(layout, renderConfig, ast);\n },\n};\n\nexport { parsePedigree, PedigreeParseError, layoutPedigree, renderPedigree };\n"]}
|