@p10node/plantuml 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +207 -203
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["DiagramError","SIZE","lines","MARGIN","DiagramError","DiagramError","MARGIN","r2","DiagramError","DiagramError","layered","N","nodes","C","clusters","outs","isSource","i","reversed","edges","state","starts","k","s","stack","top","v","ei","w","sameGroup","g","E","flat","inE","outE","topo","deg","l","queue","rank","propagate","it","moved","order","lo","hi","win","wout","r","o","changed","minRank","a","b","maxRank","chain","out","c","lca","ca","cb","W","n","H","kind","cl","rk","loopX","owner","add","h","up","down","link","budget","chains","labelAt","span","lab","labelRank","dc","at","d","f","cMin","cMax","bl","br","borderChain","V","layers","seen","roots","pos","setPos","key","globalOrder","computeGlobal","sortLayer","layer","root","groups","group","settle","sum","cnt","slots","cs","j","flatten","crossings","total","ls","pairs","tree","le","bary","u","wt","nb","best","bestCross","goingDown","rankH","kids","startExt","endExt","extraStart","extraEnd","ry","height","half","sep","ka","kb","x","pav","off","bs","both","use","uw","L0","varOf","NV","val","adj","indeg","edge","done","pushed","minX","maxX","centre","portX","sides","step","outEdges","dir","t","p","q","pts","straight","band","slope","sec","s1","s2","h1","h2","segs","label","back","boxes","x0","x1","y0","y1","ASCII","charWidth","cp","textWidth","mono","ch","text","size","bold","lineHeight","measure","lines","wrap","line","max","cur","word","next","esc","NAMED","color","THEME","paint","Svg","y","rx","cx","cy","x2","y2","points","closed","lh","attrs","bg","pathData","cmds","labelText","name","m","e","DiagramError$1","GraphBuilder","defShape","id","patch","cluster","SIZE$1","SMALL","PX","PY","LH","lines$1","sectionSize","cols","row","nodeBox","across","ss","tw","th","nodePaint","drawNode","txt","svg","tx","ty","poly","rt","b2","drawSections","HEAD_LEN","unit","dx","dy","drawHead","nx","ny","side","col","head","many","trimEnd","last","end","start","len","c2","edgeColor","MARGIN$2","MAX_NODES","MAX_EDGES","renderGraph","clusterIdx","nodeIdx","parentOf","inCluster","resolve","leaving","labelled","loops","lnodes","spread","SPREAD","ledges","pad","lclusters","same","grp","titleH","LW","LH2","tr","depth","clusterBox","titles","z","cw","st","labels","geom","c1","lp","g2","cv","sample","clip","tail","dHead","first","dTail","tailStart","tl","midpoint","inside","list","atStart","tokenize","src","lineStart","prev","plus","SHAPES","ARROWS","arrow","dflt","dotColor","hsv","htmlLabel","plainLabel","graph","recordRows","parseDot","toks","peek","isP","eat","kw","graphs","directed","nodeAttrs","anon","graphAttrs","clusterAttrs","attrList","nodeRef","scope","stmts","which","setGraph","ends","subgraph","from","to","sname","isCluster","parent","cid","style","applyEdge","applyNode","shapeName","rows","MARGIN$1","r2$1","renderPie","slices","a0","frac","a1","p0","p1","ly","lw","fmt","HOUR","DAY","pad2","renderGantt","tasks","t0","t1","sectW","chartW","scale","X","bottom","xa","fill","GAP_X","GAP_Y","renderTree","fs","circle","build","right","left","acc","place","yTop","sideSpan","ks","spanR","spanL","minY","maxY","all","walk","title","ox","oy","P","shape","tint","ink","r2","SequenceBuilder","SIZE","MSG","MLH","MARGIN","pbox","drawParticipant","textBelow","arrowHead","renderSequence","ps","idx","gap","leftExtra","rightExtra","need","have","num","count","deepest","frameRoom","width","headH","svgBack","svgMid","svgFront","active","bars","frames","open","ended","touch","actX","activate","deactivate","nw","numberBadge","footer","tab","frameP","el","lifeTop","renderModel","plantUmlBlocks","re","parsePlantUml","parseBlock","renderPlantUml","raw","clean","umlKind","activity","sequence","description","pText","skip","titleLines","inComment","has","KIND","calls","noteLines","note","rest","pid","as1","as2","who","msg","seqMessage","act","ARROW","dashed","headOf","ELEMENT","CLASSES","MARKS","END","LINK","info","ns","stackKinds","body","noteTarget","noteId","notes","element","ensure","target","nid","generic","stereo","ra","la","lm","l1","dirWord","l2","rm","lb","rz","hl","mem","ins","header","sections","desc","noteFor","sid","asTarget","rev","node","pendingLabel","exits","cond","block","put","stop","d2","bm","fork","wbs","clear","svgToPng","img","canvas","reject","show","svgs","DiagramError","message","renderEach","source","render","renderTo","ds","toPng"],"sources":["../../../src/core/diagram/layout.ts","../../../src/core/diagram/svg.ts","../../../src/core/diagram/graph.ts","../../../src/core/diagram/dot.ts","../../../src/core/diagram/charts.ts","../../../src/core/diagram/sequence.ts","../../../src/core/diagram/model.ts","../../../src/core/diagram/plantuml.ts","../../diagram/src/dom.ts","../src/index.ts"],"sourcesContent":["/**\n * Layered (\"hierarchical\") graph layout, in the spirit of Sugiyama's method:\n * cycles broken by reversing DFS back edges → ranks (longest path, then each node moved to where its edges are\n * shortest) → long edges split by dummy nodes (edge labels ride on one) → crossings reduced by barycenter sweeps\n * that keep clusters contiguous → coordinates by weighted isotonic regression per rank (long edges pulled straight)\n * → clusters legalised so no foreign node falls inside a cluster's box.\n *\n * Works in \"layout space\": ranks go down (y), the order within a rank goes right (x). The caller turns LR / BT / RL\n * graphs by swapping or mirroring axes (and node sizes) on the way in and out.\n */\nimport type { Pt } from './svg'\n\nexport interface LNode {\n /** size across the rank (x) and along the rank axis (y) */\n w: number\n h: number\n /** innermost cluster, -1 for none */\n cluster: number\n /** extra room after the node in its rank (self loops) */\n loop?: number\n /** edges meeting a flat side spread out along it (boxes) instead of meeting at its middle */\n spread?: boolean\n}\n\nexport interface LEdge {\n v: number\n w: number\n minlen: number\n weight: number\n label?: { w: number; h: number }\n}\n\nexport interface LCluster {\n parent: number\n /** padding: cross start (left), cross end (right), rank start (top), rank end (bottom) */\n pad: [number, number, number, number]\n /** least width (the title) */\n minW: number\n}\n\nexport interface LayoutOpts {\n nodesep: number\n ranksep: number\n edgesep: number\n /** groups of nodes put on one rank (Graphviz rank=same) */\n sameRank?: number[][]\n}\n\nexport interface Seg {\n c: 'L' | 'C'\n p: Pt[]\n}\n\nexport interface EdgeGeom {\n start: Pt\n segs: Seg[]\n label?: Pt\n}\n\nexport interface Box {\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface LayoutOut {\n nodes: Pt[]\n /** null for self loops (the caller draws them) */\n edges: (EdgeGeom | null)[]\n /** null for a cluster without nodes */\n clusters: (Box | null)[]\n w: number\n h: number\n}\n\nconst REAL = 0\nconst DUMMY = 1\nconst LEFT = 2\nconst RIGHT = 3\n\ninterface Item {\n node: number\n cluster: number\n key: number\n idx: number\n items: Item[]\n}\n\nexport function layered(nodes: LNode[], edges: LEdge[], clusters: LCluster[], o: LayoutOpts): LayoutOut {\n const N = nodes.length\n const C = clusters.length\n\n // ---------------------------------------------------------------- 1. break cycles\n const outs: number[][] = Array.from({ length: N }, () => [])\n const isSource = new Array(N).fill(true)\n edges.forEach((e, i) => {\n if (e.v === e.w) return\n outs[e.v].push(i)\n isSource[e.w] = false\n })\n const reversed = new Array(edges.length).fill(false)\n const state = new Uint8Array(N)\n const starts = [...Array.from({ length: N }, (_, k) => k).filter((k) => isSource[k]), ...Array.from({ length: N }, (_, k) => k)]\n for (const s of starts) {\n if (state[s]) continue\n state[s] = 1\n const stack: [number, number][] = [[s, 0]]\n while (stack.length) {\n const top = stack[stack.length - 1]\n const v = top[0]\n if (top[1] < outs[v].length) {\n const ei = outs[v][top[1]++]\n const w = edges[ei].w\n if (state[w] === 1) reversed[ei] = true\n else if (!state[w]) {\n state[w] = 1\n stack.push([w, 0])\n }\n } else {\n state[v] = 2\n stack.pop()\n }\n }\n }\n const sameGroup = new Map<number, number>()\n o.sameRank?.forEach((g, k) => g.forEach((v) => sameGroup.set(v, k)))\n const E = edges.map((e, i) => {\n const flat = sameGroup.has(e.v) && sameGroup.get(e.v) === sameGroup.get(e.w)\n return reversed[i] ? { v: e.w, w: e.v, minlen: flat ? 0 : e.minlen, weight: e.weight } : { v: e.v, w: e.w, minlen: flat ? 0 : e.minlen, weight: e.weight }\n })\n\n // ---------------------------------------------------------------- 2. ranks\n const inE: number[][] = Array.from({ length: N }, () => [])\n const outE: number[][] = Array.from({ length: N }, () => [])\n E.forEach((e, i) => {\n if (e.v === e.w) return\n outE[e.v].push(i)\n inE[e.w].push(i)\n })\n const topo: number[] = []\n {\n const deg = inE.map((l) => l.length)\n const queue = Array.from({ length: N }, (_, k) => k).filter((k) => !deg[k])\n while (queue.length) {\n const v = queue.shift()!\n topo.push(v)\n for (const ei of outE[v]) if (!--deg[E[ei].w]) queue.push(E[ei].w)\n }\n // (a cycle left by minlen-0 edges between same-rank nodes: keep the rest in input order)\n if (topo.length < N) for (let k = 0; k < N; k++) if (!topo.includes(k)) topo.push(k)\n }\n const rank = new Array(N).fill(0)\n const propagate = () => {\n for (const v of topo) for (const ei of outE[v]) rank[E[ei].w] = Math.max(rank[E[ei].w], rank[v] + E[ei].minlen)\n }\n propagate()\n for (let it = 0; it < 60; it++) {\n let moved = false\n const order = it % 2 ? [...topo].reverse() : topo\n for (const v of order) {\n if (sameGroup.has(v)) continue\n let lo = -Infinity\n let hi = Infinity\n let win = 0\n let wout = 0\n for (const ei of inE[v]) {\n lo = Math.max(lo, rank[E[ei].v] + E[ei].minlen)\n win += E[ei].weight\n }\n for (const ei of outE[v]) {\n hi = Math.min(hi, rank[E[ei].w] - E[ei].minlen)\n wout += E[ei].weight\n }\n let r = rank[v]\n if (win > wout && lo > -Infinity) r = lo\n else if (wout > win && hi < Infinity) r = hi\n if (r !== rank[v]) {\n rank[v] = r\n moved = true\n }\n }\n if (!moved) break\n }\n if (o.sameRank?.length) {\n for (let it = 0; it < 12; it++) {\n let changed = false\n for (const g of o.sameRank) {\n const r = Math.max(...g.map((v) => rank[v]))\n for (const v of g) if (rank[v] !== r) {\n rank[v] = r\n changed = true\n }\n }\n propagate()\n if (!changed) break\n }\n }\n const minRank = rank.reduce((a, b) => Math.min(a, b), 0)\n for (let v = 0; v < N; v++) rank[v] -= minRank\n let maxRank = rank.reduce((a, b) => Math.max(a, b), 0)\n\n // ---------------------------------------------------------------- 3. dummies, cluster borders\n const chain = (c: number) => {\n const out: number[] = []\n for (let k = c; k >= 0; k = clusters[k].parent) out.unshift(k)\n return out\n }\n const lca = (a: number, b: number) => {\n const ca = chain(a)\n const cb = chain(b)\n let k = 0\n while (k < ca.length && k < cb.length && ca[k] === cb[k]) k++\n return k ? ca[k - 1] : -1\n }\n const W: number[] = nodes.map((n) => n.w)\n const H: number[] = nodes.map((n) => n.h)\n const kind: number[] = nodes.map(() => REAL)\n const cl: number[] = nodes.map((n) => n.cluster)\n const rk: number[] = [...rank]\n const loopX: number[] = nodes.map((n) => n.loop ?? 0)\n const owner: number[] = nodes.map(() => -1)\n const add = (w: number, h: number, k: number, c: number, r: number) => {\n W.push(w)\n H.push(h)\n kind.push(k)\n cl.push(c)\n rk.push(r)\n loopX.push(0)\n owner.push(k === LEFT || k === RIGHT ? c : -1)\n return W.length - 1\n }\n /** neighbours with weights: up (rank - 1) and down (rank + 1) */\n const up: [number, number][][] = []\n const down: [number, number][][] = []\n const link = (a: number, b: number, w: number) => {\n while (up.length < W.length) {\n up.push([])\n down.push([])\n }\n down[a].push([b, w])\n up[b].push([a, w])\n }\n // long edges cost a node per rank they cross: past this the picture is unreadable anyway\n let budget = 60000\n for (const e of E) budget -= Math.max(0, Math.abs(rank[e.w] - rank[e.v]) - 1)\n if (budget < 0) throw new Error('The diagram is too large to draw')\n const chains: (number[] | null)[] = []\n const labelAt: number[] = []\n E.forEach((e, i) => {\n if (e.v === e.w) {\n chains.push(null)\n labelAt.push(-1)\n return\n }\n const c = [e.v]\n const span = rank[e.w] - rank[e.v]\n const lab = edges[i].label\n const labelRank = lab && span >= 2 ? rank[e.v] + Math.floor(span / 2) : -1\n const dc = lca(cl[e.v], cl[e.w])\n let at = -1\n for (let r = rank[e.v] + 1; r < rank[e.w]; r++) {\n const d = r === labelRank ? add(lab!.w, lab!.h, DUMMY, dc, r) : add(0, 0, DUMMY, dc, r)\n if (r === labelRank) at = d\n c.push(d)\n }\n c.push(e.w)\n chains.push(span > 0 ? c : null)\n labelAt.push(at)\n for (let k = 0; k + 1 < c.length; k++) {\n if (span <= 0) break\n const a = c[k]\n const b = c[k + 1]\n const f = (kind[a] === DUMMY ? 1 : 0) + (kind[b] === DUMMY ? 1 : 0)\n link(a, b, e.weight * (f === 2 ? 8 : f === 1 ? 2 : 1))\n }\n })\n // flat edges (same rank): not part of the layering\n const flat = E.map((e, i) => e.v !== e.w && rank[e.v] === rank[e.w] && !chains[i])\n\n const cMin = new Array(C).fill(Infinity)\n const cMax = new Array(C).fill(-Infinity)\n for (let v = 0; v < W.length; v++) {\n for (const c of chain(cl[v])) {\n cMin[c] = Math.min(cMin[c], rk[v])\n cMax[c] = Math.max(cMax[c], rk[v])\n }\n }\n const bl: number[][] = Array.from({ length: C }, () => [])\n const br: number[][] = Array.from({ length: C }, () => [])\n const borderChain: [number, number][][] = []\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n for (let r = cMin[c]; r <= cMax[c]; r++) {\n bl[c][r] = add(0, 0, LEFT, c, r)\n br[c][r] = add(0, 0, RIGHT, c, r)\n }\n }\n while (up.length < W.length) {\n up.push([])\n down.push([])\n }\n for (let v = 0; v < W.length; v++) borderChain.push([])\n for (let c = 0; c < C; c++) {\n for (let r = cMin[c]; r < cMax[c]; r++) {\n borderChain[bl[c][r]].push([bl[c][r + 1], 1])\n borderChain[bl[c][r + 1]].push([bl[c][r], 1])\n borderChain[br[c][r]].push([br[c][r + 1], 1])\n borderChain[br[c][r + 1]].push([br[c][r], 1])\n }\n }\n const V = W.length\n maxRank = rk.reduce((a, b) => Math.max(a, b), maxRank)\n\n // ---------------------------------------------------------------- 4. order within ranks\n let layers: number[][] = Array.from({ length: maxRank + 1 }, () => [])\n {\n const seen = new Uint8Array(V)\n const roots = Array.from({ length: V }, (_, k) => k)\n .filter((k) => kind[k] !== LEFT && kind[k] !== RIGHT)\n .sort((a, b) => rk[a] - rk[b] || a - b)\n for (const s of roots) {\n if (seen[s]) continue\n const stack = [s]\n while (stack.length) {\n const v = stack.pop()!\n if (seen[v]) continue\n seen[v] = 1\n layers[rk[v]].push(v)\n for (let k = down[v].length - 1; k >= 0; k--) if (!seen[down[v][k][0]]) stack.push(down[v][k][0])\n }\n }\n for (let v = 0; v < V; v++) if (kind[v] === LEFT || kind[v] === RIGHT) layers[rk[v]].push(v)\n }\n const pos = new Float64Array(V)\n const setPos = () => layers.forEach((l) => l.forEach((v, k) => (pos[v] = k)))\n setPos()\n const key = new Float64Array(V)\n const globalOrder = new Float64Array(C)\n const computeGlobal = () => {\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n let s = 0\n for (let r = cMin[c]; r <= cMax[c]; r++) s += pos[bl[c][r]] / Math.max(1, layers[r].length)\n globalOrder[c] = s / (cMax[c] - cMin[c] + 1)\n }\n }\n const sortLayer = (layer: number[], r: number): number[] => {\n if (!C) return [...layer].sort((a, b) => key[a] - key[b] || pos[a] - pos[b])\n const root: Item = { node: -1, cluster: -1, key: 0, idx: 0, items: [] }\n const groups = new Map<number, Item>()\n const group = (c: number): Item => {\n if (c < 0) return root\n let g = groups.get(c)\n if (!g) {\n g = { node: -1, cluster: c, key: 0, idx: pos[bl[c][r]] ?? 0, items: [] }\n groups.set(c, g)\n group(clusters[c].parent).items.push(g)\n }\n return g\n }\n for (const v of layer) {\n if (kind[v] === LEFT) group(owner[v])\n else if (kind[v] !== RIGHT) group(cl[v]).items.push({ node: v, cluster: -1, key: key[v], idx: pos[v], items: [] })\n }\n const settle = (g: Item): [number, number] => {\n let sum = 0\n let cnt = 0\n for (const it of g.items) {\n if (it.node >= 0) {\n sum += it.key\n cnt++\n } else {\n const [s, n] = settle(it)\n sum += s\n cnt += n\n }\n }\n if (g.cluster >= 0) g.key = cnt ? sum / cnt : key[bl[g.cluster][r]]\n g.items.sort((a, b) => a.key - b.key || a.idx - b.idx)\n // sibling clusters keep one left-to-right order on every rank\n const slots = g.items.map((it, k) => (it.cluster >= 0 ? k : -1)).filter((k) => k >= 0)\n const cs = slots.map((k) => g.items[k]).sort((a, b) => globalOrder[a.cluster] - globalOrder[b.cluster])\n slots.forEach((k, j) => (g.items[k] = cs[j]))\n return [sum, cnt]\n }\n settle(root)\n const out: number[] = []\n const flatten = (g: Item) => {\n for (const it of g.items) {\n if (it.node >= 0) out.push(it.node)\n else {\n out.push(bl[it.cluster][r])\n flatten(it)\n out.push(br[it.cluster][r])\n }\n }\n }\n flatten(root)\n return out\n }\n const crossings = (ls: number[][]): number => {\n let total = 0\n for (let r = 0; r + 1 < ls.length; r++) {\n const pairs: [number, number][] = []\n for (const v of ls[r]) for (const [w] of down[v]) pairs.push([pos[v], pos[w]])\n pairs.sort((a, b) => a[0] - b[0] || a[1] - b[1])\n const n = ls[r + 1].length + 1\n const tree = new Float64Array(n + 1)\n for (let k = 0; k < pairs.length; k++) {\n // count earlier pairs with a larger bottom position\n let le = 0\n for (let i = pairs[k][1] + 1; i > 0; i -= i & -i) le += tree[i]\n total += k - le\n for (let i = pairs[k][1] + 1; i <= n; i += i & -i) tree[i]++\n }\n }\n return total\n }\n const bary = (v: number, nb: [number, number][][]) => {\n let s = 0\n let w = 0\n for (const [u, wt] of nb[v]) {\n s += pos[u] * wt\n w += wt\n }\n return w ? s / w : pos[v]\n }\n for (const l of layers) {\n for (const v of l) key[v] = pos[v]\n }\n computeGlobal()\n layers = layers.map((l, r) => sortLayer(l, r))\n setPos()\n let best = layers.map((l) => [...l])\n let bestCross = crossings(layers)\n for (let it = 0; it < 24 && bestCross > 0; it++) {\n computeGlobal()\n const goingDown = it % 2 === 0\n for (let k = 1; k <= maxRank; k++) {\n const r = goingDown ? k : maxRank - k\n const nb = goingDown ? up : down\n for (const v of layers[r]) key[v] = bary(v, nb)\n layers[r] = sortLayer(layers[r], r)\n layers[r].forEach((v, j) => (pos[v] = j))\n }\n const c = crossings(layers)\n if (c < bestCross) {\n bestCross = c\n best = layers.map((l) => [...l])\n }\n }\n layers = best\n setPos()\n\n // ---------------------------------------------------------------- 5. rank positions\n const rankH = layers.map((l) => l.reduce((a, v) => Math.max(a, H[v]), 0))\n const kids: number[][] = Array.from({ length: C }, () => [])\n clusters.forEach((c, k) => c.parent >= 0 && kids[c.parent].push(k))\n const startExt = (c: number): number => clusters[c].pad[2] + Math.max(0, ...kids[c].filter((k) => cMin[k] === cMin[c]).map(startExt))\n const endExt = (c: number): number => clusters[c].pad[3] + Math.max(0, ...kids[c].filter((k) => cMax[k] === cMax[c]).map(endExt))\n const extraStart = new Array(maxRank + 1).fill(0)\n const extraEnd = new Array(maxRank + 1).fill(0)\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n extraStart[cMin[c]] = Math.max(extraStart[cMin[c]], startExt(c))\n extraEnd[cMax[c]] = Math.max(extraEnd[cMax[c]], endExt(c))\n }\n const ry: number[] = []\n for (let r = 0; r <= maxRank; r++) {\n ry[r] = r === 0 ? rankH[0] / 2 + extraStart[0] : ry[r - 1] + rankH[r - 1] / 2 + extraEnd[r - 1] + o.ranksep + extraStart[r] + rankH[r] / 2\n }\n const height = ry[maxRank] + rankH[maxRank] / 2 + extraEnd[maxRank]\n\n // ---------------------------------------------------------------- 6. coordinates across ranks\n const half = (v: number) => (kind[v] === LEFT || kind[v] === RIGHT ? 0 : W[v] / 2)\n const sep = (a: number, b: number) => {\n let g = loopX[a]\n const ka = kind[a]\n const kb = kind[b]\n if (ka === LEFT) g += clusters[owner[a]].pad[0]\n if (ka === RIGHT) g += o.nodesep / 2\n if (kb === RIGHT) g += clusters[owner[b]].pad[1]\n if (kb === LEFT) g += o.nodesep / 2\n if (ka < LEFT && kb < LEFT) g += ka === DUMMY && kb === DUMMY ? o.edgesep : ka === DUMMY || kb === DUMMY ? (o.nodesep + o.edgesep) / 2 : o.nodesep\n return half(a) + half(b) + g\n }\n const x = new Float64Array(V)\n for (const l of layers) for (let k = 1; k < l.length; k++) x[l[k]] = x[l[k - 1]] + sep(l[k - 1], l[k])\n const pav = (layer: number[], d: number[], wt: number[]) => {\n const n = layer.length\n const off = [0]\n for (let k = 1; k < n; k++) off[k] = off[k - 1] + sep(layer[k - 1], layer[k])\n const bs: { s: number; e: number; w: number; wt: number }[] = []\n for (let k = 0; k < n; k++) {\n bs.push({ s: k, e: k, w: wt[k], wt: wt[k] * (d[k] - off[k]) })\n while (bs.length > 1) {\n const a = bs[bs.length - 2]\n const b = bs[bs.length - 1]\n if (a.wt / a.w < b.wt / b.w) break\n a.e = b.e\n a.w += b.w\n a.wt += b.wt\n bs.pop()\n }\n }\n for (const b of bs) for (let k = b.s; k <= b.e; k++) x[layer[k]] = b.wt / b.w + off[k]\n }\n const ITER = 10\n for (let it = 0; it < ITER; it++) {\n const both = it >= ITER - 2\n const goingDown = it % 2 === 0\n for (let k = 0; k <= maxRank; k++) {\n const r = goingDown ? k : maxRank - k\n const l = layers[r]\n if (!l.length) continue\n const d: number[] = []\n const wt: number[] = []\n for (const v of l) {\n let s = 0\n let w = 0\n const use = (nb: [number, number][]) => {\n for (const [u, uw] of nb) {\n s += x[u] * uw\n w += uw\n }\n }\n if (both || goingDown) use(up[v])\n if (both || !goingDown) use(down[v])\n use(borderChain[v])\n d.push(w ? s / w : x[v])\n wt.push(w || 0.01)\n }\n pav(l, d, wt)\n }\n }\n // legalise clusters: one left and one right border per cluster on every rank it spans\n const L0 = V\n const varOf = (v: number) => (kind[v] === LEFT ? L0 + 2 * owner[v] : kind[v] === RIGHT ? L0 + 2 * owner[v] + 1 : v)\n if (C) {\n const NV = V + 2 * C\n const val = new Float64Array(NV)\n for (let v = 0; v < V; v++) val[v] = x[v]\n for (let c = 0; c < C; c++) {\n val[L0 + 2 * c] = Infinity\n val[L0 + 2 * c + 1] = -Infinity\n }\n for (let v = 0; v < V; v++) {\n if (kind[v] === LEFT) val[varOf(v)] = Math.min(val[varOf(v)], x[v])\n if (kind[v] === RIGHT) val[varOf(v)] = Math.max(val[varOf(v)], x[v])\n }\n const adj: [number, number][][] = Array.from({ length: NV }, () => [])\n const indeg = new Int32Array(NV)\n const edge = (a: number, b: number, s: number) => {\n adj[a].push([b, s])\n indeg[b]++\n }\n for (const l of layers) for (let k = 1; k < l.length; k++) edge(varOf(l[k - 1]), varOf(l[k]), sep(l[k - 1], l[k]))\n for (let c = 0; c < C; c++) if (cMin[c] <= cMax[c]) edge(L0 + 2 * c, L0 + 2 * c + 1, Math.max(clusters[c].minW, clusters[c].pad[0] + clusters[c].pad[1]))\n const queue: number[] = []\n for (let v = 0; v < NV; v++) if (!indeg[v]) queue.push(v)\n let done = 0\n const pushed = new Float64Array(val)\n while (queue.length) {\n const v = queue.pop()!\n done++\n for (const [w, s] of adj[v]) {\n if (Number.isFinite(pushed[v])) pushed[w] = Math.max(pushed[w], pushed[v] + s)\n if (!--indeg[w]) queue.push(w)\n }\n }\n if (done === NV) for (let v = 0; v < V; v++) x[v] = pushed[varOf(v)]\n }\n let minX = Infinity\n let maxX = -Infinity\n for (let v = 0; v < V; v++) {\n minX = Math.min(minX, x[v] - half(v))\n maxX = Math.max(maxX, x[v] + half(v) + loopX[v])\n }\n if (!Number.isFinite(minX)) minX = maxX = 0\n for (let v = 0; v < V; v++) x[v] -= minX\n\n // ---------------------------------------------------------------- 7. output\n const centre = (v: number): Pt => ({ x: x[v], y: ry[rk[v]] })\n // where each edge meets its end nodes: the middle of the side, or spread along a box's side by the order of what\n // the edges lead to (the next point on the edge)\n const portX = new Map<string, number>()\n {\n const sides = new Map<string, { i: number; nx: number }[]>()\n const at = (key: string, i: number, nx: number) => {\n let l = sides.get(key)\n if (!l) sides.set(key, (l = []))\n l.push({ i, nx })\n }\n E.forEach((_, i) => {\n const c = chains[i]\n if (!c || flat[i]) return\n if (nodes[c[0]]?.spread) at(`${c[0]}:b`, i, x[c[1]])\n if (nodes[c[c.length - 1]]?.spread) at(`${c[c.length - 1]}:t`, i, x[c[c.length - 2]])\n })\n for (const [key, l] of sides) {\n if (l.length < 2) continue\n const v = Number(key.split(':')[0])\n l.sort((a, b) => a.nx - b.nx || a.i - b.i)\n const step = Math.min(36, (W[v] * 0.7) / (l.length - 1))\n l.forEach((it, k) => portX.set(`${key}:${it.i}`, x[v] + (k - (l.length - 1) / 2) * step))\n }\n }\n const outEdges: (EdgeGeom | null)[] = E.map((e, i) => {\n if (e.v === e.w) return null\n if (flat[i]) {\n const a = centre(e.v)\n const b = centre(e.w)\n const dir = Math.sign(b.x - a.x) || 1\n const s = { x: a.x + (dir * W[e.v]) / 2, y: a.y }\n const t = { x: b.x - (dir * W[e.w]) / 2, y: b.y }\n const [p, q] = reversed[i] ? [t, s] : [s, t]\n return { start: p, segs: [{ c: 'L', p: [q] }], label: edges[i].label ? { x: (p.x + q.x) / 2, y: p.y - 10 } : undefined }\n }\n const c = chains[i]\n if (!c) return null\n const pts: Pt[] = []\n const straight: boolean[] = []\n const a = centre(c[0])\n pts.push({ x: portX.get(`${c[0]}:b:${i}`) ?? a.x, y: a.y + H[c[0]] / 2 })\n for (let k = 1; k + 1 < c.length; k++) {\n const p = centre(c[k])\n const band = rankH[rk[c[k]]] / 2\n if (band > 0.5) {\n pts.push({ x: p.x, y: p.y - band }, { x: p.x, y: p.y + band })\n straight.push(false, true)\n } else {\n pts.push(p)\n straight.push(false)\n }\n }\n const b = centre(c[c.length - 1])\n pts.push({ x: portX.get(`${c[c.length - 1]}:t:${i}`) ?? b.x, y: b.y - H[c[c.length - 1]] / 2 })\n straight.push(false)\n // one smooth curve through the waypoints, the across coordinate a function of the rank coordinate: square-on at\n // the ports and at a straight piece, a monotone (Fritsch–Carlson) slope at the other waypoints, so the curve never\n // swings out past one (a dummy next to an end would otherwise bend the whole offset into a short piece)\n const n = pts.length\n const slope = new Array<number>(n).fill(0)\n const sec = (k: number) => (pts[k + 1].x - pts[k].x) / Math.max(0.5, pts[k + 1].y - pts[k].y)\n for (let k = 1; k + 1 < n; k++) {\n if (straight[k - 1] || straight[k]) continue\n const s1 = sec(k - 1)\n const s2 = sec(k)\n if (s1 * s2 <= 0) continue\n const h1 = pts[k].y - pts[k - 1].y\n const h2 = pts[k + 1].y - pts[k].y\n slope[k] = (3 * (h1 + h2)) / ((2 * h2 + h1) / s1 + (h2 + 2 * h1) / s2)\n }\n const segs: Seg[] = []\n for (let k = 1; k < n; k++) {\n const p = pts[k - 1]\n const q = pts[k]\n const h = (q.y - p.y) / 3\n if (straight[k - 1] || (Math.abs(p.x - q.x) < 0.5 && !slope[k - 1] && !slope[k])) segs.push({ c: 'L', p: [q] })\n else segs.push({ c: 'C', p: [{ x: p.x + slope[k - 1] * h, y: p.y + h }, { x: q.x - slope[k] * h, y: q.y - h }, q] })\n }\n const label = labelAt[i] >= 0 ? centre(labelAt[i]) : undefined\n if (!reversed[i]) return { start: pts[0], segs, label }\n // drawn from the other end: the pieces in reverse, each cubic's control points swapped\n const back: Seg[] = []\n for (let k = n - 1; k >= 1; k--) {\n const s = segs[k - 1]\n back.push(s.c === 'C' ? { c: 'C', p: [s.p[1], s.p[0], pts[k - 1]] } : { c: 'L', p: [pts[k - 1]] })\n }\n return { start: pts[n - 1], segs: back, label }\n })\n const boxes: (Box | null)[] = clusters.map((_, c) => {\n if (cMin[c] > cMax[c]) return null\n let x0 = Infinity\n let x1 = -Infinity\n for (let r = cMin[c]; r <= cMax[c]; r++) {\n x0 = Math.min(x0, x[bl[c][r]])\n x1 = Math.max(x1, x[br[c][r]])\n }\n const y0 = ry[cMin[c]] - rankH[cMin[c]] / 2 - startExt(c)\n const y1 = ry[cMax[c]] + rankH[cMax[c]] / 2 + endExt(c)\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 }\n })\n return {\n nodes: Array.from({ length: N }, (_, v) => centre(v)),\n edges: outEdges,\n clusters: boxes,\n w: maxX - minX,\n h: height,\n }\n}\n","/**\n * SVG output for the diagram renderers: text metrics (no DOM: the worker has none), escaping, colors and a small\n * builder. Pictures are self-contained (no scripts, links, external references, markers or CSS) so they show the\n * same in an <img>, in Word and in a PDF export.\n */\n\nexport const FONT = 'Helvetica, Arial, sans-serif'\nexport const MONO = 'Menlo, Consolas, \"Courier New\", monospace'\n\n/** Helvetica advance widths (1/1000 em), U+0020 to U+007E */\nconst ASCII = [\n 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556,\n 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556,\n 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584,\n]\n\nfunction charWidth(cp: number): number {\n if (cp >= 0x20 && cp <= 0x7e) return ASCII[cp - 0x20]\n // combining marks (Vietnamese tones…), zero-width characters\n if ((cp >= 0x300 && cp <= 0x36f) || (cp >= 0x200b && cp <= 0x200f) || cp === 0xfe0f) return 0\n // CJK, Hangul, kana, full-width forms, emoji\n if ((cp >= 0x1100 && cp <= 0x115f) || (cp >= 0x2e80 && cp <= 0xa4cf) || (cp >= 0xac00 && cp <= 0xd7a3) || (cp >= 0xf900 && cp <= 0xfaff) || (cp >= 0xfe30 && cp <= 0xfe4f) || (cp >= 0xff00 && cp <= 0xff60) || cp >= 0x1f000) return 1000\n return 580\n}\n\n/** Width in px of one line of text at `size` px. */\nexport function textWidth(text: string, size = 14, bold = false, mono = false): number {\n let w = 0\n if (mono) {\n for (const ch of text) w += charWidth(ch.codePointAt(0)!) ? 600 : 0\n } else for (const ch of text) w += charWidth(ch.codePointAt(0)!)\n return (w * size * (bold ? 1.08 : 1)) / 1000\n}\n\nexport const lineHeight = (size: number) => Math.round(size * 1.3)\n\n/** Size of a block of lines. */\nexport function measure(lines: string[], size = 14, bold = false): { w: number; h: number } {\n let w = 0\n for (const l of lines) w = Math.max(w, textWidth(l, size, bold))\n return { w, h: lines.length * lineHeight(size) }\n}\n\n/** Breaks lines longer than `max` px at spaces. */\nexport function wrap(lines: string[], max: number, size = 14, bold = false): string[] {\n const out: string[] = []\n for (const line of lines) {\n if (textWidth(line, size, bold) <= max) {\n out.push(line)\n continue\n }\n let cur = ''\n for (const word of line.split(/ +/)) {\n const next = cur ? cur + ' ' + word : word\n if (cur && textWidth(next, size, bold) > max) {\n out.push(cur)\n cur = word\n } else cur = next\n }\n out.push(cur)\n }\n return out\n}\n\nexport const esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n\nconst NAMED = /^[a-z]{3,24}$/\n\n/** A color from the source, or undefined when it is not one a picture can carry safely (#rgb, rgb(), a name). */\nexport function color(c: string | undefined): string | undefined {\n if (!c) return undefined\n const v = c.trim().toLowerCase()\n if (/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(v)) return v\n if (/^[0-9a-f]{6}$/.test(v)) return '#' + v\n if (/^rgba?\\(\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*(,\\s*[\\d.]+%?\\s*)?\\)$/.test(v)) return v\n if (/^rgba?\\(\\s*[\\d.]+%?\\s+[\\d.]+%?\\s+[\\d.]+%?\\s*(\\/\\s*[\\d.]+%?\\s*)?\\)$/.test(v)) return v\n if (NAMED.test(v)) return v === 'transparent' ? 'none' : v\n return undefined\n}\n\nexport const THEME = {\n ink: '#1f2937',\n line: '#4b5563',\n fill: '#eef2fb',\n stroke: '#5b6f9a',\n muted: '#6b7280',\n cluster: '#f7f8fb',\n clusterStroke: '#a3adc2',\n note: '#fff6c8',\n noteStroke: '#c9a227',\n label: '#ffffff',\n dark: '#2d3748',\n /** categorical series: pie slices, gantt sections */\n series: ['#5b8def', '#f2994a', '#3fb68b', '#e5596b', '#9b6be0', '#d4b33a', '#3bb3c9', '#e07bb8', '#8c9aaf', '#7cbd4a'],\n}\n\nexport interface Paint {\n fill?: string\n stroke?: string\n sw?: number\n dash?: string\n opacity?: number\n}\n\nconst n = (v: number) => (Number.isFinite(v) ? Math.round(v * 100) / 100 : 0)\n\nfunction paint(p: Paint): string {\n let a = ` fill=\"${p.fill ?? 'none'}\"`\n if (p.stroke) a += ` stroke=\"${p.stroke}\" stroke-width=\"${n(p.sw ?? 1)}\"`\n if (p.stroke && p.dash) a += ` stroke-dasharray=\"${p.dash}\"`\n if (p.opacity !== undefined) a += ` opacity=\"${n(p.opacity)}\"`\n return a\n}\n\nexport interface TextOpts {\n size?: number\n anchor?: 'start' | 'middle' | 'end'\n bold?: boolean\n italic?: boolean\n underline?: boolean\n color?: string\n mono?: boolean\n}\n\nexport class Svg {\n private out: string[] = []\n\n rect(x: number, y: number, w: number, h: number, p: Paint, rx = 0): this {\n this.out.push(`<rect x=\"${n(x)}\" y=\"${n(y)}\" width=\"${n(w)}\" height=\"${n(h)}\"${rx ? ` rx=\"${n(rx)}\"` : ''}${paint(p)}/>`)\n return this\n }\n\n circle(cx: number, cy: number, r: number, p: Paint): this {\n this.out.push(`<circle cx=\"${n(cx)}\" cy=\"${n(cy)}\" r=\"${n(r)}\"${paint(p)}/>`)\n return this\n }\n\n ellipse(cx: number, cy: number, rx: number, ry: number, p: Paint): this {\n this.out.push(`<ellipse cx=\"${n(cx)}\" cy=\"${n(cy)}\" rx=\"${n(rx)}\" ry=\"${n(ry)}\"${paint(p)}/>`)\n return this\n }\n\n line(x1: number, y1: number, x2: number, y2: number, p: Paint): this {\n this.out.push(`<line x1=\"${n(x1)}\" y1=\"${n(y1)}\" x2=\"${n(x2)}\" y2=\"${n(y2)}\"${paint(p)}/>`)\n return this\n }\n\n poly(points: [number, number][], p: Paint, closed = true): this {\n const pts = points.map(([x, y]) => `${n(x)},${n(y)}`).join(' ')\n this.out.push(`<${closed ? 'polygon' : 'polyline'} points=\"${pts}\"${paint(p)}/>`)\n return this\n }\n\n /** `d` uses numbers rounded by the caller (see `pathData`) */\n path(d: string, p: Paint): this {\n this.out.push(`<path d=\"${d}\"${paint(p)}/>`)\n return this\n }\n\n /** Lines of text, the block centered vertically on `y`. */\n text(x: number, y: number, lines: string[] | string, o: TextOpts = {}): this {\n const ls = typeof lines === 'string' ? [lines] : lines\n const size = o.size ?? 14\n const lh = lineHeight(size)\n const top = y - (ls.length * lh) / 2\n let attrs = ` font-family=\"${esc(o.mono ? MONO : FONT)}\" font-size=\"${size}\" fill=\"${o.color ?? THEME.ink}\"`\n if (o.anchor && o.anchor !== 'start') attrs += ` text-anchor=\"${o.anchor}\"`\n if (o.bold) attrs += ' font-weight=\"bold\"'\n if (o.italic) attrs += ' font-style=\"italic\"'\n if (o.underline) attrs += ' text-decoration=\"underline\"'\n ls.forEach((l, k) => {\n if (!l) return\n // baseline: the middle of the line box plus about a third of the font size\n this.out.push(`<text x=\"${n(x)}\" y=\"${n(top + k * lh + lh / 2 + size * 0.35)}\"${attrs}>${esc(l)}</text>`)\n })\n return this\n }\n\n raw(s: string): this {\n this.out.push(s)\n return this\n }\n\n /** the elements drawn so far */\n body(): string {\n return this.out.join('')\n }\n\n /** The picture; `bg` paints the canvas. */\n toString(w: number, h: number, bg = '#ffffff'): string {\n const W = Math.ceil(w)\n const H = Math.ceil(h)\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${W}\" height=\"${H}\" viewBox=\"0 0 ${W} ${H}\">` +\n (bg ? `<rect x=\"0\" y=\"0\" width=\"${W}\" height=\"${H}\" fill=\"${bg}\"/>` : '') +\n this.out.join('') +\n '</svg>'\n )\n }\n}\n\nexport type Pt = { x: number; y: number }\n\nexport function pathData(cmds: { c: 'M' | 'L' | 'C' | 'Q'; p: Pt[] }[]): string {\n return cmds.map((k) => k.c + k.p.map((q) => `${n(q.x)} ${n(q.y)}`).join(' ')).join(' ')\n}\n\n/** Mermaid / PlantUML / DOT label text: entity codes, <br>, markdown-string quotes, tags dropped. */\nexport function labelText(s: string): string {\n return s\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/\\\\n/g, '\\n')\n .replace(/<\\/?[a-z][^>]*>/gi, '')\n .replace(/#(\\d+);/g, (_, d: string) => String.fromCodePoint(Math.min(Number(d), 0x10ffff)))\n .replace(/#([a-z]+);/gi, (m, name: string) => ({ quot: '\"', amp: '&', lt: '<', gt: '>', nbsp: ' ', apos: \"'\" })[name.toLowerCase()] ?? m)\n .replace(/&(quot|amp|lt|gt|nbsp|apos|#\\d+);/g, (m, e: string) =>\n e[0] === '#' ? String.fromCodePoint(Math.min(Number(e.slice(1)), 0x10ffff)) : (({ quot: '\"', amp: '&', lt: '<', gt: '>', nbsp: ' ', apos: \"'\" }) as Record<string, string>)[e] ?? m,\n )\n}\n\n/** Mermaid \"`markdown string`\": the text without the markup */\nexport const unMarkdown = (s: string) => s.replace(/\\*\\*(.+?)\\*\\*|__(.+?)__/g, '$1$2').replace(/(^|\\W)[*_](\\S.*?\\S|\\S)[*_](?=\\W|$)/g, '$1$2')\n\nexport class DiagramError extends Error {}\n","/**\n * Node-and-edge diagrams (flowcharts, class, state, ER, use case, component diagrams, Graphviz graphs): the model the\n * parsers build, node sizes and shapes, and the picture from the layered layout.\n */\nimport { layered, type EdgeGeom, type LCluster, type LEdge, type LNode, type Seg } from './layout'\nimport { DiagramError, lineHeight, measure, pathData, Svg, textWidth, THEME, wrap, type Pt } from './svg'\n\nexport type Dir = 'TB' | 'BT' | 'LR' | 'RL'\n\nexport type Shape =\n | 'rect'\n | 'round'\n | 'stadium'\n | 'subroutine'\n | 'cylinder'\n | 'circle'\n | 'doublecircle'\n | 'ellipse'\n | 'diamond'\n | 'hexagon'\n | 'lean-r'\n | 'lean-l'\n | 'trap-b'\n | 'trap-t'\n | 'flag'\n | 'note'\n | 'folder'\n | 'component'\n | 'box3d'\n | 'cloud'\n | 'octagon'\n | 'triangle'\n | 'actor'\n | 'start'\n | 'end'\n | 'bar'\n | 'point'\n | 'none'\n\nexport type Head = 'none' | 'arrow' | 'open' | 'triangle' | 'diamond' | 'odiamond' | 'circle' | 'ocircle' | 'cross' | 'one' | 'zero-one' | 'one-many' | 'zero-many' | 'many'\n\nexport interface NodeStyle {\n fill?: string\n stroke?: string\n color?: string\n dash?: string\n sw?: number\n bold?: boolean\n italic?: boolean\n hidden?: boolean\n}\n\n/** A compartment of a class / entity / record box: rows of cells (cells line up in columns) */\nexport interface Section {\n rows: string[][]\n bold?: boolean\n italic?: boolean\n center?: boolean\n}\n\nexport interface GNode {\n id: string\n label: string\n shape: Shape\n style?: NodeStyle\n sections?: Section[]\n cluster?: string\n}\n\nexport interface GEdge {\n from: string\n to: string\n label?: string\n head?: Head\n tail?: Head\n line?: 'solid' | 'dashed' | 'dotted' | 'thick' | 'hidden'\n minlen?: number\n headLabel?: string\n tailLabel?: string\n color?: string\n sw?: number\n}\n\nexport interface GCluster {\n id: string\n label: string\n parent?: string\n style?: NodeStyle\n}\n\nexport interface Graph {\n dir: Dir\n nodes: GNode[]\n edges: GEdge[]\n clusters: GCluster[]\n sameRank?: string[][]\n title?: string\n}\n\nexport interface Rendered {\n svg: string\n w: number\n h: number\n}\n\n/** Builds a graph: nodes are created on first mention and refined by later ones. */\nexport class GraphBuilder {\n readonly g: Graph\n private byId = new Map<string, GNode>()\n private clusterIds = new Map<string, GCluster>()\n\n constructor(dir: Dir = 'TB', private defShape: Shape = 'rect') {\n this.g = { dir, nodes: [], edges: [], clusters: [] }\n }\n\n has(id: string) {\n return this.byId.has(id)\n }\n\n get(id: string) {\n return this.byId.get(id)\n }\n\n node(id: string, patch: Partial<GNode> = {}, cluster?: string): GNode {\n let n = this.byId.get(id)\n if (!n) {\n n = { id, label: id, shape: this.defShape, cluster }\n this.byId.set(id, n)\n this.g.nodes.push(n)\n }\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) (n as unknown as Record<string, unknown>)[k] = v\n return n\n }\n\n edge(e: GEdge, cluster?: string): GEdge {\n if (!this.clusterIds.has(e.from)) this.node(e.from, {}, cluster)\n if (!this.clusterIds.has(e.to)) this.node(e.to, {}, cluster)\n this.g.edges.push(e)\n return e\n }\n\n cluster(id: string, label: string, parent?: string): GCluster {\n let c = this.clusterIds.get(id)\n if (!c) {\n c = { id, label, parent }\n this.clusterIds.set(id, c)\n this.g.clusters.push(c)\n } else if (label) c.label = label\n // a node of that name (mentioned before) is the cluster\n const n = this.byId.get(id)\n if (n) {\n this.byId.delete(id)\n this.g.nodes.splice(this.g.nodes.indexOf(n), 1)\n }\n return c\n }\n\n isCluster(id: string) {\n return this.clusterIds.has(id)\n }\n}\n\n// ---------------------------------------------------------------- sizes\n\nconst SIZE = 14\nconst SMALL = 13\nconst PX = 14\nconst PY = 9\nconst LH = lineHeight(SIZE)\n\nconst lines = (s: string) => s.split('\\n')\nconst r = (v: number) => Math.round(v * 100) / 100\n\ninterface Box {\n w: number\n h: number\n text: string[]\n}\n\nfunction sectionSize(s: Section): { w: number; h: number; cols: number[] } {\n const cols: number[] = []\n for (const row of s.rows) row.forEach((c, k) => (cols[k] = Math.max(cols[k] ?? 0, textWidth(c, SMALL, s.bold))))\n const w = cols.reduce((a, b) => a + b, 0) + Math.max(0, cols.length - 1) * 12\n return { w, h: s.rows.length ? s.rows.length * lineHeight(SMALL) + 10 : 8, cols }\n}\n\nfunction nodeBox(n: GNode, dir: Dir): Box {\n const text = n.shape === 'none' || n.label === '' ? lines(n.label) : wrap(lines(n.label), 260, SIZE, n.style?.bold)\n const t = n.label === '' ? { w: 0, h: 0 } : measure(text, SIZE, n.style?.bold)\n const across = dir === 'TB' || dir === 'BT'\n if (n.sections?.length) {\n const ss = n.sections.map(sectionSize)\n return { w: Math.max(90, ...ss.map((s) => s.w + 2 * PX)), h: ss.reduce((a, s) => a + s.h, 0), text }\n }\n const tw = t.w + 2 * PX\n const th = t.h + 2 * PY\n switch (n.shape) {\n case 'start':\n return { w: 20, h: 20, text: [] }\n case 'end':\n return { w: 22, h: 22, text: [] }\n case 'point':\n return { w: 8, h: 8, text: [] }\n case 'bar':\n return across ? { w: 80, h: 7, text: [] } : { w: 7, h: 80, text: [] }\n case 'none':\n return { w: t.w + 8, h: t.h + 6, text }\n case 'circle': {\n const d = Math.max(t.w, t.h) + 2 * PY + 4\n return { w: d, h: d, text }\n }\n case 'doublecircle': {\n const d = Math.max(t.w, t.h) + 2 * PY + 14\n return { w: d, h: d, text }\n }\n case 'ellipse':\n return { w: Math.max(50, (t.w + PX) * 1.42), h: Math.max(36, (t.h + PY) * 1.42), text }\n case 'diamond': {\n const w = tw + th / 0.6\n return { w, h: 0.6 * w, text }\n }\n case 'stadium':\n return { w: t.w + th + PX, h: th, text }\n case 'hexagon':\n case 'octagon':\n return { w: tw + th / 2, h: th, text }\n case 'lean-r':\n case 'lean-l':\n return { w: tw + th / 2, h: th, text }\n case 'trap-b':\n case 'trap-t':\n return { w: tw + th * 0.7, h: th, text }\n case 'flag':\n return { w: tw + th / 3, h: th, text }\n case 'cylinder':\n return { w: Math.max(tw, 50), h: th + 16, text }\n case 'subroutine':\n case 'component':\n return { w: tw + 16, h: th, text }\n case 'note':\n case 'folder':\n return { w: tw + 8, h: th + (n.shape === 'folder' ? 8 : 0), text }\n case 'box3d':\n return { w: tw + 8, h: th + 8, text }\n case 'triangle':\n return { w: tw * 1.6, h: th * 1.7, text }\n case 'actor':\n return { w: Math.max(36, t.w + 8), h: 46 + t.h, text }\n default:\n return { w: Math.max(tw, 40), h: th, text }\n }\n}\n\n// ---------------------------------------------------------------- shapes\n\nfunction nodePaint(n: GNode) {\n const s = n.style ?? {}\n const p = { fill: s.fill ?? THEME.fill, stroke: s.stroke ?? THEME.stroke, sw: s.sw ?? 1.3, dash: s.dash }\n return p\n}\n\nfunction drawNode(svg: Svg, n: GNode, b: Box, cx: number, cy: number) {\n const { w, h } = b\n const x = cx - w / 2\n const y = cy - h / 2\n const p = nodePaint(n)\n const color = n.style?.color ?? THEME.ink\n const txt = (tx = cx, ty = cy) => svg.text(tx, ty, b.text, { anchor: 'middle', color, bold: n.style?.bold, italic: n.style?.italic })\n const poly = (pts: [number, number][]) => svg.poly(pts, p)\n switch (n.shape) {\n case 'start':\n svg.circle(cx, cy, w / 2, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'end':\n svg.circle(cx, cy, w / 2, { fill: '#ffffff', stroke: n.style?.stroke ?? THEME.dark, sw: 1.5 }).circle(cx, cy, w / 2 - 4, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'point':\n svg.circle(cx, cy, w / 2, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'bar':\n svg.rect(x, y, w, h, { fill: n.style?.fill ?? THEME.dark }, 2)\n return\n case 'none':\n return void txt()\n case 'round':\n svg.rect(x, y, w, h, p, 6)\n break\n case 'stadium':\n svg.rect(x, y, w, h, p, h / 2)\n break\n case 'subroutine':\n svg.rect(x, y, w, h, p).line(x + 8, y, x + 8, y + h, p).line(x + w - 8, y, x + w - 8, y + h, p)\n break\n case 'component':\n svg.rect(x + 6, y, w - 6, h, p)\n svg.rect(x, y + h / 2 - 11, 12, 7, p).rect(x, y + h / 2 + 4, 12, 7, p)\n return void txt(cx + 4)\n case 'cylinder': {\n const ry = 7\n svg.path(`M${r(x)} ${r(y + ry)} A${r(w / 2)} ${ry} 0 0 1 ${r(x + w)} ${r(y + ry)} L${r(x + w)} ${r(y + h - ry)} A${r(w / 2)} ${ry} 0 0 1 ${r(x)} ${r(y + h - ry)} Z`, p)\n svg.path(`M${r(x)} ${r(y + ry)} A${r(w / 2)} ${ry} 0 0 0 ${r(x + w)} ${r(y + ry)}`, { ...p, fill: 'none' })\n return void txt(cx, cy + ry / 2)\n }\n case 'circle':\n svg.circle(cx, cy, w / 2, p)\n break\n case 'doublecircle':\n svg.circle(cx, cy, w / 2, p).circle(cx, cy, w / 2 - 5, { ...p, fill: 'none' })\n break\n case 'ellipse':\n svg.ellipse(cx, cy, w / 2, h / 2, p)\n break\n case 'diamond':\n poly([\n [cx, y],\n [x + w, cy],\n [cx, y + h],\n [x, cy],\n ])\n break\n case 'hexagon': {\n const s = h / 4\n poly([\n [x + s, y],\n [x + w - s, y],\n [x + w, cy],\n [x + w - s, y + h],\n [x + s, y + h],\n [x, cy],\n ])\n break\n }\n case 'octagon': {\n const s = h / 4\n poly([\n [x + s, y],\n [x + w - s, y],\n [x + w, y + s],\n [x + w, y + h - s],\n [x + w - s, y + h],\n [x + s, y + h],\n [x, y + h - s],\n [x, y + s],\n ])\n break\n }\n case 'lean-r':\n case 'lean-l': {\n const s = h / 2\n const rt = n.shape === 'lean-r'\n poly([\n [rt ? x + s : x, y],\n [rt ? x + w : x + w - s, y],\n [rt ? x + w - s : x + w, y + h],\n [rt ? x : x + s, y + h],\n ])\n break\n }\n case 'trap-b':\n case 'trap-t': {\n const s = h * 0.35\n const b2 = n.shape === 'trap-b'\n poly([\n [b2 ? x + s : x, y],\n [b2 ? x + w - s : x + w, y],\n [b2 ? x + w : x + w - s, y + h],\n [b2 ? x : x + s, y + h],\n ])\n break\n }\n case 'flag': {\n const s = h / 3\n poly([\n [x, y],\n [x + w, y],\n [x + w, y + h],\n [x, y + h],\n [x + s, cy],\n ])\n return void txt(cx + s / 2)\n }\n case 'note': {\n const f = 10\n poly([\n [x, y],\n [x + w - f, y],\n [x + w, y + f],\n [x + w, y + h],\n [x, y + h],\n ])\n svg.poly(\n [\n [x + w - f, y],\n [x + w - f, y + f],\n [x + w, y + f],\n ],\n { ...p, fill: 'none' },\n false,\n )\n break\n }\n case 'folder':\n svg.rect(x, y, Math.min(w * 0.4, 40), 10, p, 2).rect(x, y + 8, w, h - 8, p)\n return void txt(cx, cy + 4)\n case 'box3d':\n poly([\n [x, y + 8],\n [x + 8, y],\n [x + w, y],\n [x + w, y + h - 8],\n [x + w - 8, y + h],\n [x, y + h],\n ])\n svg.poly(\n [\n [x, y + 8],\n [x + w - 8, y + 8],\n [x + w, y],\n ],\n { ...p, fill: 'none' },\n false,\n ).line(x + w - 8, y + 8, x + w - 8, y + h, p)\n return void txt(cx - 4, cy + 4)\n case 'cloud':\n svg.rect(x, y, w, h, p, Math.min(h / 2, 20))\n break\n case 'triangle':\n poly([\n [cx, y],\n [x + w, y + h],\n [x, y + h],\n ])\n return void txt(cx, cy + h / 6)\n case 'actor': {\n const s = { fill: 'none', stroke: n.style?.stroke ?? THEME.dark, sw: 1.5 }\n const top = y + 2\n svg.circle(cx, top + 7, 7, { ...s, fill: n.style?.fill ?? THEME.fill })\n svg.line(cx, top + 14, cx, top + 28, s).line(cx - 11, top + 19, cx + 11, top + 19, s)\n svg.line(cx, top + 28, cx - 9, top + 40, s).line(cx, top + 28, cx + 9, top + 40, s)\n svg.text(cx, top + 44 + (b.text.length * LH) / 2, b.text, { anchor: 'middle', color })\n return\n }\n default:\n if (n.sections?.length) return drawSections(svg, n, x, y, w)\n svg.rect(x, y, w, h, p)\n }\n txt()\n}\n\nfunction drawSections(svg: Svg, n: GNode, x: number, y: number, w: number) {\n const p = nodePaint(n)\n const ss = n.sections!.map(sectionSize)\n const total = ss.reduce((a, s) => a + s.h, 0)\n svg.rect(x, y, w, total, p, n.shape === 'round' ? 6 : 0)\n let top = y\n n.sections!.forEach((s, k) => {\n if (k) svg.line(x, top, x + w, top, { stroke: p.stroke, sw: 1 })\n const lh = lineHeight(SMALL)\n s.rows.forEach((row, r) => {\n const ty = top + 5 + r * lh + lh / 2\n if (s.center || (row.length === 1 && k === 0)) {\n svg.text(x + w / 2, ty, row.join(' '), { anchor: 'middle', size: SMALL, bold: s.bold, italic: s.italic, color: n.style?.color })\n return\n }\n let cx = x + PX\n row.forEach((c, j) => {\n svg.text(cx, ty, c, { size: SMALL, bold: s.bold, italic: s.italic, color: n.style?.color })\n cx += ss[k].cols[j] + 12\n })\n })\n top += ss[k].h\n })\n}\n\n// ---------------------------------------------------------------- edges\n\nconst HEAD_LEN: Partial<Record<Head, number>> = { arrow: 10, triangle: 13, diamond: 15, odiamond: 15, circle: 8, ocircle: 8 }\n\nfunction unit(a: Pt, b: Pt): Pt {\n const dx = b.x - a.x\n const dy = b.y - a.y\n const l = Math.hypot(dx, dy) || 1\n return { x: dx / l, y: dy / l }\n}\n\n/** marker at `p`, `d` the direction the edge arrives in */\nfunction drawHead(svg: Svg, head: Head, p: Pt, d: Pt, col: string) {\n const nx = -d.y\n const ny = d.x\n const at = (back: number, side: number): [number, number] => [p.x - d.x * back + nx * side, p.y - d.y * back + ny * side]\n const line = (a: [number, number], b: [number, number]) => svg.line(a[0], a[1], b[0], b[1], { stroke: col, sw: 1.3 })\n switch (head) {\n case 'arrow':\n svg.poly([at(0, 0), at(10, 4.5), at(10, -4.5)], { fill: col, stroke: col, sw: 1 })\n break\n case 'open':\n svg.poly([at(10, 5), at(0, 0), at(10, -5)], { stroke: col, sw: 1.4 }, false)\n break\n case 'triangle':\n svg.poly([at(0, 0), at(13, 7), at(13, -7)], { fill: '#ffffff', stroke: col, sw: 1.2 })\n break\n case 'diamond':\n case 'odiamond':\n svg.poly([at(0, 0), at(7.5, 5), at(15, 0), at(7.5, -5)], { fill: head === 'diamond' ? col : '#ffffff', stroke: col, sw: 1.2 })\n break\n case 'circle':\n case 'ocircle': {\n const [cx, cy] = at(4, 0)\n svg.circle(cx, cy, 4, { fill: head === 'circle' ? col : '#ffffff', stroke: col, sw: 1.2 })\n break\n }\n case 'cross':\n line(at(1, 5), at(11, -5))\n line(at(1, -5), at(11, 5))\n break\n case 'one':\n case 'zero-one':\n case 'one-many':\n case 'zero-many':\n case 'many': {\n const many = head.endsWith('many')\n if (many) {\n line(at(0, 7), at(12, 0))\n line(at(0, -7), at(12, 0))\n }\n if (head === 'one' || head === 'one-many') line(at(many ? 16 : 7, 6), at(many ? 16 : 7, -6))\n if (head === 'one') line(at(12, 6), at(12, -6))\n if (head === 'zero-one' || head === 'zero-many') {\n const [cx, cy] = at(many ? 20 : 17, 0)\n svg.circle(cx, cy, 4.5, { fill: '#ffffff', stroke: col, sw: 1.2 })\n }\n if (head === 'zero-one') line(at(7, 6), at(7, -6))\n break\n }\n }\n}\n\n/** shortens the path at its end by `len` along the arriving direction */\nfunction trimEnd(start: Pt, segs: Seg[], len: number): Pt {\n const last = segs[segs.length - 1]\n const end = last.p[last.p.length - 1]\n const prev = last.c === 'C' ? last.p[1] : segs.length > 1 ? segs[segs.length - 2].p[segs[segs.length - 2].p.length - 1] : start\n const d = unit(prev, end)\n if (len) {\n const q = { x: end.x - d.x * len, y: end.y - d.y * len }\n last.p[last.p.length - 1] = q\n if (last.c === 'C') {\n const c2 = { x: last.p[1].x - d.x * Math.min(len, 6), y: last.p[1].y - d.y * Math.min(len, 6) }\n // a short last piece: the control point stays ahead of the first one, or the curve would loop back\n const k = Math.min(0, (c2.x - last.p[0].x) * d.x + (c2.y - last.p[0].y) * d.y)\n last.p[1] = { x: c2.x - d.x * k, y: c2.y - d.y * k }\n }\n }\n return d\n}\n\nfunction edgeColor(e: GEdge) {\n return e.color ?? THEME.line\n}\n\n// ---------------------------------------------------------------- render\n\nconst MARGIN = 16\n\nconst MAX_NODES = 3000\nconst MAX_EDGES = 6000\n\nexport function renderGraph(g: Graph): Rendered {\n if (!g.nodes.length) throw new DiagramError('The diagram has no nodes')\n if (g.nodes.length > MAX_NODES || g.edges.length > MAX_EDGES) throw new DiagramError(`The diagram is too large to draw (${g.nodes.length} nodes, ${g.edges.length} edges)`)\n const dir = g.dir\n const across = dir === 'TB' || dir === 'BT'\n const svg = new Svg()\n // edges to a cluster go to one of its nodes\n const clusterIdx = new Map(g.clusters.map((c, k) => [c.id, k]))\n const nodeIdx = new Map(g.nodes.map((n, k) => [n.id, k]))\n const parentOf = (c: number) => (g.clusters[c].parent !== undefined ? clusterIdx.get(g.clusters[c].parent!) ?? -1 : -1)\n const inCluster = (v: number, c: number) => {\n for (let k = g.nodes[v].cluster !== undefined ? clusterIdx.get(g.nodes[v].cluster!) ?? -1 : -1; k >= 0; k = parentOf(k)) if (k === c) return true\n return false\n }\n /** an edge's end: its node, or for a cluster the member it is laid out to (the first one entering, the last leaving) */\n const resolve = (id: string, leaving: boolean): number => {\n const v = nodeIdx.get(id)\n if (v !== undefined) return v\n const c = clusterIdx.get(id)\n if (c === undefined) return -1\n if (!leaving) return g.nodes.findIndex((_, k) => inCluster(k, c))\n for (let k = g.nodes.length - 1; k >= 0; k--) if (inCluster(k, c)) return k\n return -1\n }\n\n const boxes = g.nodes.map((n) => nodeBox(n, dir))\n const edges = g.edges\n .map((e) => ({ e, v: resolve(e.from, true), w: resolve(e.to, false), cv: nodeIdx.has(e.from) ? -1 : clusterIdx.get(e.from) ?? -1, cw: nodeIdx.has(e.to) ? -1 : clusterIdx.get(e.to) ?? -1 }))\n .filter((x) => x.v >= 0 && x.w >= 0)\n const labelled = edges.some((x) => x.e.label)\n const lab = (s: string | undefined) => (s ? measure(lines(s), SMALL) : undefined)\n const loops = new Map<number, number>()\n for (const { e, v, w } of edges) {\n if (v !== w) continue\n const l = lab(e.label)\n loops.set(v, Math.max(loops.get(v) ?? 0, 40 + (l ? (across ? l.w : l.h) + 6 : 0)))\n }\n const lnodes: LNode[] = g.nodes.map((n, k) => {\n const b = boxes[k]\n const c = n.cluster !== undefined ? clusterIdx.get(n.cluster) ?? -1 : -1\n const spread = !!n.sections?.length || SPREAD.has(n.shape)\n return across ? { w: b.w, h: b.h, cluster: c, loop: loops.get(k), spread } : { w: b.h, h: b.w, cluster: c, loop: loops.get(k), spread }\n })\n const ledges: LEdge[] = edges.map(({ e, v, w }) => {\n const l = lab(e.label)\n const pad = l ? { w: l.w + 8, h: l.h + 4 } : undefined\n return {\n v,\n w,\n minlen: (e.minlen ?? 1) * (labelled ? 2 : 1),\n weight: 1,\n label: pad ? (across ? pad : { w: pad.h, h: pad.w }) : undefined,\n }\n })\n const TITLE_H = 22\n const lclusters: LCluster[] = g.clusters.map((c, k) => {\n const t = c.label ? measure(lines(c.label), SMALL, true) : { w: 0, h: 0 }\n const top = 12 + (c.label ? t.h + 6 : 0)\n const side = 12\n // [cross start, cross end, rank start, rank end] in layout space\n const pad: [number, number, number, number] =\n dir === 'TB' ? [side, side, top, side] : dir === 'BT' ? [side, side, side, top] : dir === 'LR' ? [top, side, side, side] : [top, side, side, side]\n return { parent: parentOf(k), pad, minW: across ? t.w + 2 * side : t.h + top + side }\n })\n const same = g.sameRank?.map((grp) => grp.map((id) => nodeIdx.get(id)).filter((v): v is number => v !== undefined)).filter((grp) => grp.length > 1)\n const out = layered(lnodes, ledges, lclusters, {\n nodesep: across ? 40 : 28,\n ranksep: (across ? 50 : 60) / (labelled ? 2 : 1),\n edgesep: 14,\n sameRank: same,\n })\n\n // layout space → picture\n const titleH = g.title ? TITLE_H + 10 : 0\n const LW = out.w\n const LH2 = out.h\n const tr = (p: Pt): Pt => {\n const q = dir === 'TB' ? p : dir === 'BT' ? { x: p.x, y: LH2 - p.y } : dir === 'LR' ? { x: p.y, y: p.x } : { x: LH2 - p.y, y: p.x }\n return { x: q.x + MARGIN, y: q.y + MARGIN + titleH }\n }\n let W = (across ? LW : LH2) + 2 * MARGIN\n const H = (across ? LH2 : LW) + 2 * MARGIN + titleH\n\n // clusters, outermost first\n const depth = (k: number) => {\n let d = 0\n for (let c = parentOf(k); c >= 0; c = parentOf(c)) d++\n return d\n }\n const order = g.clusters.map((_, k) => k).sort((a, b) => depth(a) - depth(b))\n const clusterBox: ({ x: number; y: number; w: number; h: number } | null)[] = g.clusters.map(() => null)\n // cluster titles go over the edges that cross them\n const titles: { x: number; y: number; text: string[]; color: string; bg: string }[] = []\n for (const k of order) {\n const b = out.clusters[k]\n if (!b) continue\n const c = g.clusters[k]\n const a = tr({ x: b.x, y: b.y })\n const z = tr({ x: b.x + b.w, y: b.y + b.h })\n const x0 = Math.min(a.x, z.x)\n const y0 = Math.min(a.y, z.y)\n const cw = Math.abs(z.x - a.x)\n const ch = Math.abs(z.y - a.y)\n const st = c.style ?? {}\n clusterBox[k] = { x: x0, y: y0, w: cw, h: ch }\n svg.rect(x0, y0, cw, ch, { fill: st.fill ?? THEME.cluster, stroke: st.stroke ?? THEME.clusterStroke, sw: st.sw ?? 1, dash: st.dash }, 4)\n if (c.label) {\n const t = lines(c.label)\n const top = dir === 'BT' ? y0 + ch - 8 - (t.length * lineHeight(SMALL)) / 2 : y0 + 8 + (t.length * lineHeight(SMALL)) / 2\n titles.push({ x: x0 + cw / 2, y: top, text: t, color: st.color ?? THEME.ink, bg: st.fill && st.fill !== 'none' ? st.fill : THEME.cluster })\n }\n }\n\n // edges\n const labels: { p: Pt; text: string[]; color?: string; plain?: boolean }[] = []\n edges.forEach(({ e, v }, i) => {\n if (e.line === 'hidden') return\n const col = edgeColor(e)\n const paint = { stroke: col, sw: e.sw ?? (e.line === 'thick' ? 3 : 1.4), dash: e.line === 'dashed' ? '6 4' : e.line === 'dotted' ? '2 3' : undefined }\n const geom = out.edges[i]\n if (!geom) {\n if (edges[i].v !== edges[i].w) return\n // self loop, on the far side of the rank\n const c = tr(out.nodes[v])\n const b = boxes[v]\n let s: Pt, c1: Pt, c2: Pt, t: Pt, lp: Pt\n if (across) {\n s = { x: c.x + b.w / 2, y: c.y - b.h / 4 }\n t = { x: c.x + b.w / 2, y: c.y + b.h / 4 }\n c1 = { x: s.x + 34, y: s.y - 12 }\n c2 = { x: t.x + 34, y: t.y + 12 }\n lp = { x: c.x + b.w / 2 + 34, y: c.y }\n } else {\n s = { x: c.x - b.w / 4, y: c.y + b.h / 2 }\n t = { x: c.x + b.w / 4, y: c.y + b.h / 2 }\n c1 = { x: s.x - 12, y: s.y + 34 }\n c2 = { x: t.x + 12, y: t.y + 34 }\n lp = { x: c.x, y: c.y + b.h / 2 + 34 }\n }\n const segs: Seg[] = [{ c: 'C', p: [c1, c2, t] }]\n const head = e.head ?? 'arrow'\n const d = trimEnd(s, segs, HEAD_LEN[head] ?? 0)\n svg.path(pathData([{ c: 'M', p: [s] }, ...segs.map((k) => ({ c: k.c, p: k.p }))]), paint)\n drawHead(svg, head, t, d, col)\n if (e.label) {\n const l = measure(lines(e.label), SMALL)\n labels.push({ p: across ? { x: lp.x + l.w / 2 + 4, y: lp.y } : { x: lp.x, y: lp.y + l.h / 2 + 4 }, text: lines(e.label) })\n }\n return\n }\n let g2: EdgeGeom = { start: tr(geom.start), segs: geom.segs.map((s) => ({ c: s.c, p: s.p.map(tr) })), label: geom.label && tr(geom.label) }\n // an edge to / from a cluster stops at the cluster's border\n const { cv, cw } = edges[i]\n if ((cv >= 0 && !inCluster(edges[i].w, cv)) || (cw >= 0 && !inCluster(edges[i].v, cw))) {\n let pts = sample(g2.start, g2.segs)\n if (cv >= 0 && clusterBox[cv]) pts = clip(pts, clusterBox[cv]!, true)\n if (cw >= 0 && clusterBox[cw]) pts = clip(pts, clusterBox[cw]!, false)\n if (pts.length > 1) g2 = { start: pts[0], segs: pts.slice(1).map((p) => ({ c: 'L' as const, p: [p] })), label: g2.label }\n }\n const head = e.head ?? 'none'\n const tail = e.tail ?? 'none'\n const end = g2.segs[g2.segs.length - 1].p[g2.segs[g2.segs.length - 1].p.length - 1]\n const dHead = trimEnd(g2.start, g2.segs, HEAD_LEN[head] ?? 0)\n // the tail: reverse the first segment's direction\n const first = g2.segs[0]\n const toward = first.c === 'C' ? first.p[0] : first.p[0]\n const dTail = unit(toward, g2.start)\n const tailStart = g2.start\n const tl = HEAD_LEN[tail] ?? 0\n const start = tl ? { x: g2.start.x - dTail.x * tl, y: g2.start.y - dTail.y * tl } : g2.start\n if (tl && first.c === 'C') {\n const c1 = { x: first.p[0].x - dTail.x * Math.min(tl, 6), y: first.p[0].y - dTail.y * Math.min(tl, 6) }\n const k = Math.max(0, (first.p[1].x - c1.x) * dTail.x + (first.p[1].y - c1.y) * dTail.y)\n first.p[0] = { x: c1.x + dTail.x * k, y: c1.y + dTail.y * k }\n }\n svg.path(pathData([{ c: 'M', p: [start] }, ...g2.segs.map((k) => ({ c: k.c, p: k.p }))]), paint)\n if (head !== 'none') drawHead(svg, head, end, dHead, col)\n if (tail !== 'none') drawHead(svg, tail, tailStart, dTail, col)\n if (e.label) {\n const p = g2.label ?? midpoint(g2.start, end)\n labels.push({ p, text: lines(e.label) })\n }\n // multiplicities: beside the line, near its end\n const side = (p: Pt, d: Pt, text: string) => {\n const l = measure(lines(text), SMALL)\n const nx = -d.y\n const ny = d.x\n const off = Math.abs(nx) * (l.w / 2 + 5) + Math.abs(ny) * (l.h / 2 + 3)\n labels.push({ p: { x: p.x - d.x * (16 + l.h / 2) + nx * off, y: p.y - d.y * (14 + l.h / 2) + ny * off }, text: lines(text), plain: true })\n }\n if (e.headLabel) side(end, dHead, e.headLabel)\n if (e.tailLabel) side(tailStart, dTail, e.tailLabel)\n })\n\n for (const t of titles) {\n const m = measure(t.text, SMALL, true)\n svg.rect(t.x - m.w / 2 - 4, t.y - m.h / 2 - 1, m.w + 8, m.h + 2, { fill: t.bg }, 2)\n svg.text(t.x, t.y, t.text, { anchor: 'middle', size: SMALL, bold: true, color: t.color })\n }\n\n // nodes\n g.nodes.forEach((n, k) => {\n if (n.style?.hidden) return\n const c = tr(out.nodes[k])\n drawNode(svg, n, boxes[k], c.x, c.y)\n })\n\n for (const l of labels) {\n const m = measure(l.text, SMALL)\n if (!l.plain) svg.rect(l.p.x - m.w / 2 - 3, l.p.y - m.h / 2 - 1, m.w + 6, m.h + 2, { fill: THEME.label, opacity: 0.92 }, 2)\n svg.text(l.p.x, l.p.y, l.text, { anchor: 'middle', size: SMALL, color: l.color ?? THEME.ink })\n }\n if (g.title) {\n W = Math.max(W, textWidth(g.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + TITLE_H / 2, g.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\nconst midpoint = (a: Pt, b: Pt): Pt => ({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 })\n\n/** shapes whose flat top / bottom edges can take several edges side by side */\nconst SPREAD = new Set<Shape>(['rect', 'round', 'subroutine', 'component', 'note', 'folder', 'box3d', 'cylinder', 'stadium', 'cloud'])\n\n/** the path as a polyline */\nfunction sample(start: Pt, segs: Seg[]): Pt[] {\n const out = [start]\n let cur = start\n for (const s of segs) {\n if (s.c === 'L') out.push(s.p[0])\n else {\n const [c1, c2, e] = s.p\n for (let k = 1; k <= 12; k++) {\n const t = k / 12\n const u = 1 - t\n out.push({\n x: u * u * u * cur.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * e.x,\n y: u * u * u * cur.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * e.y,\n })\n }\n }\n cur = out[out.length - 1]\n }\n return out\n}\n\n/** cuts the part of a polyline inside `b` off its start (or end) */\nfunction clip(pts: Pt[], b: { x: number; y: number; w: number; h: number }, atStart: boolean): Pt[] {\n const inside = (p: Pt) => p.x > b.x && p.x < b.x + b.w && p.y > b.y && p.y < b.y + b.h\n const list = atStart ? pts : [...pts].reverse()\n const k = list.findIndex((p) => !inside(p))\n if (k <= 0) return pts\n const a = list[k - 1]\n const z = list[k]\n // where a→z leaves the box\n let t = 1\n const dx = z.x - a.x\n const dy = z.y - a.y\n if (dx > 0) t = Math.min(t, (b.x + b.w - a.x) / dx)\n if (dx < 0) t = Math.min(t, (b.x - a.x) / dx)\n if (dy > 0) t = Math.min(t, (b.y + b.h - a.y) / dy)\n if (dy < 0) t = Math.min(t, (b.y - a.y) / dy)\n const out = [{ x: a.x + dx * t, y: a.y + dy * t }, ...list.slice(k)]\n return atStart ? out : out.reverse()\n}\n","/**\n * Graphviz DOT: graphs, digraphs, subgraphs and clusters, default attributes, edge chains, rank=same, record and\n * HTML-like labels (as text). Laid out by the layered layout, like `dot`.\n * https://graphviz.org/doc/info/lang.html\n */\nimport { GraphBuilder, renderGraph, type Dir, type GEdge, type GNode, type Graph, type Head, type NodeStyle, type Rendered, type Section, type Shape } from './graph'\nimport { color, DiagramError, labelText } from './svg'\n\ntype Tok = { t: 'id' | 'str' | 'html' | 'p'; v: string }\n\nfunction tokenize(src: string): Tok[] {\n const out: Tok[] = []\n const n = src.length\n let i = 0\n let lineStart = true\n while (i < n) {\n const c = src[i]\n if (c === '\\n') {\n lineStart = true\n i++\n continue\n }\n if (c === ' ' || c === '\\t' || c === '\\r' || c === '') {\n i++\n continue\n }\n if (lineStart && c === '#') {\n while (i < n && src[i] !== '\\n') i++\n continue\n }\n lineStart = false\n if (c === '/' && src[i + 1] === '/') {\n while (i < n && src[i] !== '\\n') i++\n continue\n }\n if (c === '/' && src[i + 1] === '*') {\n const e = src.indexOf('*/', i + 2)\n i = e < 0 ? n : e + 2\n continue\n }\n if (c === '\"') {\n let v = ''\n i++\n while (i < n && src[i] !== '\"') {\n if (src[i] === '\\\\' && src[i + 1] === '\"') {\n v += '\"'\n i += 2\n } else if (src[i] === '\\\\' && src[i + 1] === '\\n') i += 2\n else v += src[i++]\n }\n i++\n // \"a\" + \"b\"\n const prev = out[out.length - 1]\n const plus = out[out.length - 2]\n if (prev?.t === 'p' && prev.v === '+' && plus?.t === 'str') {\n out.pop()\n plus.v += v\n } else out.push({ t: 'str', v })\n continue\n }\n if (c === '<') {\n let depth = 0\n const s = i\n for (; i < n; i++) {\n if (src[i] === '<') depth++\n else if (src[i] === '>' && --depth === 0) break\n }\n out.push({ t: 'html', v: src.slice(s + 1, i) })\n i++\n continue\n }\n if (c === '-' && (src[i + 1] === '>' || src[i + 1] === '-')) {\n out.push({ t: 'p', v: src.slice(i, i + 2) })\n i += 2\n continue\n }\n if ('{}[]=;,:+'.includes(c)) {\n out.push({ t: 'p', v: c })\n i++\n continue\n }\n const m = /^(-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)|[A-Za-z_\\u0080-][\\w\\u0080-]*)/.exec(src.slice(i, i + 256))\n if (!m) {\n i++\n continue\n }\n out.push({ t: 'id', v: m[0] })\n i += m[0].length\n }\n return out\n}\n\ninterface Scope {\n node: Record<string, string>\n edge: Record<string, string>\n cluster?: string\n members: Set<string>\n name?: string\n}\n\nconst SHAPES: Record<string, Shape> = {\n box: 'rect', rect: 'rect', rectangle: 'rect', square: 'rect', msquare: 'rect', ellipse: 'ellipse', oval: 'ellipse', egg: 'ellipse', circle: 'circle',\n doublecircle: 'doublecircle', point: 'point', plaintext: 'none', plain: 'none', none: 'none', underline: 'none', diamond: 'diamond', mdiamond: 'diamond',\n hexagon: 'hexagon', octagon: 'octagon', doubleoctagon: 'octagon', tripleoctagon: 'octagon', triangle: 'triangle', invtriangle: 'triangle', parallelogram: 'lean-r',\n trapezium: 'trap-b', invtrapezium: 'trap-t', house: 'trap-b', invhouse: 'trap-t', cylinder: 'cylinder', note: 'note', tab: 'folder', folder: 'folder', box3d: 'box3d',\n component: 'component', cds: 'flag', larrow: 'flag', rarrow: 'flag', lpromoter: 'flag', rpromoter: 'flag', star: 'circle', record: 'rect', mrecord: 'round', underlinebox: 'rect',\n}\n\nconst ARROWS: Record<string, Head> = {\n normal: 'arrow', inv: 'arrow', empty: 'triangle', onormal: 'triangle', invempty: 'triangle', oinv: 'triangle', vee: 'open', open: 'open', halfopen: 'open',\n diamond: 'diamond', odiamond: 'odiamond', ediamond: 'odiamond', box: 'diamond', obox: 'odiamond', dot: 'circle', odot: 'ocircle', invdot: 'circle', invodot: 'ocircle',\n none: 'none', crow: 'many', tee: 'one', curve: 'open', icurve: 'open',\n}\n\nfunction arrow(v: string | undefined, dflt: Head): Head {\n if (!v) return dflt\n const k = v.toLowerCase().replace(/^[lr](?=[a-z])/, '')\n return ARROWS[k] ?? ARROWS[k.replace(/^o/, '')] ?? dflt\n}\n\n/** a Graphviz color: names, #rgb(a), \"H S V\" or \"H,S,V\"; the first of a color list */\nfunction dotColor(v: string | undefined): string | undefined {\n if (!v) return undefined\n const first = v.split(/[:;]/)[0].trim()\n const hsv = /^([\\d.]+)[ ,]+([\\d.]+)[ ,]+([\\d.]+)$/.exec(first)\n if (hsv) {\n const [h, s, b] = [Number(hsv[1]), Number(hsv[2]), Number(hsv[3])]\n const f = (k: number) => {\n const x = (k + h * 6) % 6\n return Math.round((b - b * s * Math.max(0, Math.min(x, 4 - x, 1))) * 255)\n }\n return '#' + [f(5), f(3), f(1)].map((x) => x.toString(16).padStart(2, '0')).join('')\n }\n const name = first.replace(/^\\/\\w+\\//, '').toLowerCase()\n // X11 grey levels (gray0 … gray100); numbered variants (red3) as their base color\n const g = /^gr[ae]y(\\d{1,3})$/.exec(name)\n if (g) {\n const x = Math.round((Math.min(100, Number(g[1])) * 255) / 100)\n .toString(16)\n .padStart(2, '0')\n return `#${x}${x}${x}`\n }\n return color(/^[a-z]+\\d+$/.test(name) ? name.replace(/\\d+$/, '') : name)\n}\n\nfunction htmlLabel(v: string): string {\n return labelText(\n v\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/tr>/gi, '\\n')\n .replace(/<\\/td>\\s*<td/gi, ' <td')\n .replace(/<[^>]+>/g, '')\n .replace(/\\n\\s*\\n/g, '\\n'),\n )\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n .join('\\n')\n}\n\n/** text of a plain label: \\n \\l \\r line breaks, \\N the node name */\nfunction plainLabel(v: string, id: string, graph = ''): string {\n return v\n .replace(/\\\\[nlr]/g, '\\n')\n .replace(/\\\\N/g, id)\n .replace(/\\\\G/g, graph)\n .replace(/\\\\(.)/g, '$1')\n .replace(/\\n$/, '')\n}\n\n/** record fields \"{a|<p> b|{c|d}}\" as rows */\nfunction recordRows(v: string, id: string): string[] {\n return plainLabel(v, id)\n .replace(/<[^>]*>/g, '')\n .split(/[|{}]/)\n .map((x) => x.trim())\n .filter(Boolean)\n}\n\nexport function parseDot(src: string): Graph[] {\n const toks = tokenize(src)\n let p = 0\n const peek = (k = 0) => toks[p + k]\n const isP = (v: string, k = 0) => peek(k)?.t === 'p' && peek(k).v === v\n const eat = (v: string) => {\n if (isP(v)) {\n p++\n return true\n }\n return false\n }\n const kw = (v: string) => peek()?.t === 'id' && peek().v.toLowerCase() === v\n const graphs: Graph[] = []\n while (p < toks.length) {\n if (kw('strict')) p++\n if (!kw('graph') && !kw('digraph')) {\n p++\n continue\n }\n const directed = peek().v.toLowerCase() === 'digraph'\n p++\n const name = peek()?.t !== 'p' ? toks[p++].v : ''\n if (!eat('{')) throw new DiagramError('Graphviz: “{” expected after the graph name')\n const b = new GraphBuilder('TB', 'ellipse')\n const nodeAttrs = new Map<string, Record<string, string>>()\n const edges: { e: GEdge; attrs: Record<string, string> }[] = []\n const same: string[][] = []\n let anon = 0\n const graphAttrs: Record<string, string> = {}\n const clusterAttrs = new Map<string, Record<string, string>>()\n\n const attrList = (): Record<string, string> => {\n const a: Record<string, string> = {}\n while (eat('[')) {\n while (p < toks.length && !isP(']')) {\n const k = toks[p++]\n if (k.t === 'p') continue\n if (eat('=')) {\n const v = toks[p++]\n if (v) a[k.v.toLowerCase()] = v.t === 'html' ? '<' + v.v + '>' : v.v\n } else a[k.v.toLowerCase()] = 'true'\n }\n eat(']')\n }\n return a\n }\n const nodeRef = (scope: Scope): string => {\n const id = toks[p++].v\n // port: a:p or a:p:n\n while (isP(':')) p += 2\n if (!nodeAttrs.has(id)) {\n nodeAttrs.set(id, { ...scope.node })\n b.node(id, {}, scope.cluster)\n } else if (scope.cluster && b.get(id) && b.get(id)!.cluster === undefined) b.get(id)!.cluster = scope.cluster\n scope.members.add(id)\n return id\n }\n const stmts = (scope: Scope) => {\n while (p < toks.length && !isP('}')) {\n if (eat(';') || eat(',')) continue\n const t = peek()\n if (t.t === 'id' && ['graph', 'node', 'edge'].includes(t.v.toLowerCase()) && isP('[', 1)) {\n p++\n const a = attrList()\n const which = t.v.toLowerCase()\n if (which === 'node') Object.assign(scope.node, a)\n else if (which === 'edge') Object.assign(scope.edge, a)\n else setGraph(scope, a)\n continue\n }\n if (t.t !== 'p' && isP('=', 1)) {\n const k = t.v.toLowerCase()\n p += 2\n const v = toks[p++]\n setGraph(scope, { [k]: v ? (v.t === 'html' ? '<' + v.v + '>' : v.v) : '' })\n continue\n }\n // a chain of node ids / subgraphs joined by edge operators\n const ends: string[][] = []\n for (;;) {\n if (kw('subgraph') || isP('{')) ends.push([...subgraph(scope)])\n else if (peek() && peek().t !== 'p') ends.push([nodeRef(scope)])\n else {\n p++\n break\n }\n if (isP('->') || isP('--')) p++\n else break\n }\n const a = attrList()\n if (ends.length === 1) {\n for (const id of ends[0]) if (Object.keys(a).length && nodeAttrs.has(id)) Object.assign(nodeAttrs.get(id)!, a)\n continue\n }\n const attrs = { ...scope.edge, ...a }\n for (let k = 0; k + 1 < ends.length; k++) for (const from of ends[k]) for (const to of ends[k + 1]) edges.push({ e: { from, to }, attrs })\n }\n }\n const setGraph = (scope: Scope, a: Record<string, string>) => {\n if (scope.cluster) Object.assign(clusterAttrs.get(scope.cluster)!, a)\n else if (!scope.name) Object.assign(graphAttrs, a)\n if (a.rank && scope.name !== undefined) (scope as Scope & { rank?: string }).rank = a.rank\n }\n const subgraph = (parent: Scope): Set<string> => {\n let sname: string | undefined\n if (kw('subgraph')) {\n p++\n if (peek() && peek().t !== 'p') sname = toks[p++].v\n }\n const isCluster = !!sname && /^cluster/i.test(sname)\n const scope: Scope & { rank?: string } = { node: { ...parent.node }, edge: { ...parent.edge }, cluster: parent.cluster, members: new Set(), name: sname ?? `__anon${anon++}` }\n if (isCluster) {\n const cid = `${sname}`\n b.cluster(cid, '', parent.cluster)\n clusterAttrs.set(cid, {})\n scope.cluster = cid\n }\n if (eat('{')) {\n stmts(scope)\n eat('}')\n }\n if (scope.rank && /^(same|min|max|source|sink)$/.test(scope.rank) && scope.members.size > 1) same.push([...scope.members])\n for (const m of scope.members) parent.members.add(m)\n return scope.members\n }\n const root: Scope = { node: {}, edge: {}, members: new Set() }\n stmts(root)\n eat('}')\n\n // attributes → model\n const dir: Dir = ({ LR: 'LR', RL: 'RL', BT: 'BT', TB: 'TB' } as Record<string, Dir>)[(graphAttrs.rankdir ?? 'TB').toUpperCase()] ?? 'TB'\n b.g.dir = dir\n if (graphAttrs.label) b.g.title = graphAttrs.label.startsWith('<') ? htmlLabel(graphAttrs.label.slice(1, -1)) : plainLabel(graphAttrs.label, '', name)\n for (const n of b.g.nodes) applyNode(n, nodeAttrs.get(n.id) ?? {})\n for (const c of b.g.clusters) {\n const a = clusterAttrs.get(c.id) ?? {}\n c.label = a.label ? (a.label.startsWith('<') ? htmlLabel(a.label.slice(1, -1)) : plainLabel(a.label, '', c.id)) : ''\n const st: NodeStyle = {}\n const style = (a.style ?? '').toLowerCase()\n if (style.includes('filled')) st.fill = dotColor(a.fillcolor ?? a.color ?? a.bgcolor) ?? '#d3d3d3'\n else if (a.bgcolor) st.fill = dotColor(a.bgcolor)\n if (a.color || a.pencolor) st.stroke = dotColor(a.pencolor ?? a.color)\n if (style.includes('dashed')) st.dash = '6 4'\n if (style.includes('dotted')) st.dash = '2 3'\n if (a.fontcolor) st.color = dotColor(a.fontcolor)\n if (style.includes('invis')) st.stroke = st.fill = 'none'\n c.style = st\n }\n for (const { e, attrs } of edges) b.g.edges.push(applyEdge(e, attrs, directed))\n b.g.sameRank = same\n graphs.push(b.g)\n }\n if (!graphs.length) throw new DiagramError('No “graph” or “digraph” found')\n return graphs\n}\n\nfunction applyNode(n: GNode, a: Record<string, string>) {\n const shapeName = (a.shape ?? 'ellipse').toLowerCase()\n n.shape = SHAPES[shapeName] ?? 'ellipse'\n const lab = a.label\n if (lab !== undefined) {\n if (lab.startsWith('<') && lab.endsWith('>')) n.label = htmlLabel(lab.slice(1, -1))\n else if (shapeName === 'record' || shapeName === 'mrecord') {\n const rows = recordRows(lab, n.id)\n n.label = rows.join('\\n')\n if (rows.length > 1) n.sections = rows.map((r) => ({ rows: [[r]], center: true }) as Section)\n } else n.label = plainLabel(lab, n.id)\n }\n if (n.shape === 'point') n.label = ''\n const st: NodeStyle = {}\n const style = (a.style ?? '').toLowerCase()\n if (style.includes('filled') || a.fillcolor) st.fill = dotColor(a.fillcolor ?? a.color) ?? '#d3d3d3'\n else if (n.shape !== 'point') st.fill = '#ffffff'\n if (a.color) st.stroke = dotColor(a.color)\n else st.stroke = '#000000'\n if (a.fontcolor) st.color = dotColor(a.fontcolor)\n if (style.includes('dashed')) st.dash = '6 4'\n if (style.includes('dotted')) st.dash = '2 3'\n if (style.includes('bold')) st.sw = 2.4\n if (a.penwidth) st.sw = Math.min(8, Number(a.penwidth) || 1)\n if (style.includes('invis')) st.hidden = true\n if (style.includes('rounded') && n.shape === 'rect') n.shape = 'round'\n if (n.shape === 'none') st.fill = undefined\n n.style = st\n}\n\nfunction applyEdge(e: GEdge, a: Record<string, string>, directed: boolean): GEdge {\n const style = (a.style ?? '').toLowerCase()\n const dir = (a.dir ?? (directed ? 'forward' : 'none')).toLowerCase()\n const head = arrow(a.arrowhead, 'arrow')\n const tail = arrow(a.arrowtail, 'arrow')\n e.head = dir === 'forward' || dir === 'both' ? head : 'none'\n e.tail = dir === 'back' || dir === 'both' ? tail : 'none'\n const lab = a.label ?? a.xlabel\n if (lab) e.label = lab.startsWith('<') && lab.endsWith('>') ? htmlLabel(lab.slice(1, -1)) : plainLabel(lab, '')\n if (a.headlabel) e.headLabel = plainLabel(a.headlabel, '')\n if (a.taillabel) e.tailLabel = plainLabel(a.taillabel, '')\n e.line = style.includes('invis') ? 'hidden' : style.includes('dashed') ? 'dashed' : style.includes('dotted') ? 'dotted' : style.includes('bold') ? 'thick' : 'solid'\n e.color = dotColor(a.color) ?? '#000000'\n if (a.penwidth) e.sw = Math.min(8, Number(a.penwidth) || 1)\n if (a.minlen) e.minlen = Math.max(1, Math.min(6, Math.round(Number(a.minlen)) || 1))\n return e\n}\n\nexport function renderDot(src: string): Rendered {\n return renderGraph(parseDot(src)[0])\n}\n\nexport function renderDotAll(src: string): Rendered[] {\n return parseDot(src).map(renderGraph)\n}\n","/** Pie charts, Gantt charts and mind maps / work breakdown trees. */\nimport type { Rendered } from './graph'\nimport { measure, pathData, Svg, textWidth, THEME, wrap, type Pt } from './svg'\n\nconst MARGIN = 16\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\n// ---------------------------------------------------------------- pie\n\nexport interface Pie {\n title?: string\n showData?: boolean\n slices: { label: string; value: number }[]\n}\n\nexport function renderPie(p: Pie): Rendered {\n const slices = p.slices.filter((s) => s.value > 0 && Number.isFinite(s.value))\n if (!slices.length) throw new Error('The pie chart has no values')\n const total = slices.reduce((a, s) => a + s.value, 0)\n const R = 130\n const svg = new Svg()\n const titleH = p.title ? 36 : 0\n const cx = MARGIN + R\n const cy = MARGIN + titleH + R\n const color = (k: number) => THEME.series[k % THEME.series.length]\n let a0 = -Math.PI / 2\n const at = (a: number, r: number): Pt => ({ x: cx + Math.cos(a) * r, y: cy + Math.sin(a) * r })\n slices.forEach((s, k) => {\n const frac = s.value / total\n const a1 = a0 + frac * 2 * Math.PI\n if (frac >= 0.9999) svg.circle(cx, cy, R, { fill: color(k), stroke: '#ffffff', sw: 2 })\n else {\n const p0 = at(a0, R)\n const p1 = at(a1, R)\n svg.path(`M${r2(cx)} ${r2(cy)} L${r2(p0.x)} ${r2(p0.y)} A${R} ${R} 0 ${frac > 0.5 ? 1 : 0} 1 ${r2(p1.x)} ${r2(p1.y)} Z`, { fill: color(k), stroke: '#ffffff', sw: 2 })\n }\n if (frac >= 0.06) {\n const m = at((a0 + a1) / 2, R * 0.66)\n svg.text(m.x, m.y, `${Math.round(frac * 1000) / 10}%`, { anchor: 'middle', size: 13, bold: true, color: '#ffffff' })\n }\n a0 = a1\n })\n // legend\n const lx = cx + R + 30\n const lh = 24\n const ly = cy - (slices.length * lh) / 2 + lh / 2\n let lw = 0\n slices.forEach((s, k) => {\n const text = p.showData ? `${s.label} [${fmt(s.value)}]` : s.label\n svg.rect(lx, ly + k * lh - 8, 16, 16, { fill: color(k) }, 3)\n svg.text(lx + 24, ly + k * lh, text)\n lw = Math.max(lw, textWidth(text, 14))\n })\n let W = lx + 24 + lw + MARGIN\n const H = Math.max(cy + R, ly + slices.length * lh) + MARGIN\n if (p.title) {\n W = Math.max(W, textWidth(p.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, p.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\nconst fmt = (v: number) => (Number.isInteger(v) ? String(v) : String(Math.round(v * 100) / 100))\n\n// ---------------------------------------------------------------- gantt\n\nexport interface GanttTask {\n name: string\n start: number\n end: number\n done?: boolean\n active?: boolean\n crit?: boolean\n milestone?: boolean\n}\n\nexport interface Gantt {\n title?: string\n sections: { name: string; tasks: GanttTask[] }[]\n}\n\nconst HOUR = 3600e3\nconst DAY = 24 * HOUR\n\nconst pad2 = (v: number) => String(v).padStart(2, '0')\n\nexport function renderGantt(g: Gantt): Rendered {\n const tasks = g.sections.flatMap((s) => s.tasks)\n if (!tasks.length) throw new Error('The Gantt chart has no tasks')\n const t0 = Math.min(...tasks.map((t) => t.start))\n const t1 = Math.max(...tasks.map((t) => Math.max(t.end, t.start)))\n const span = Math.max(t1 - t0, HOUR)\n const sectW = Math.min(180, Math.max(0, ...g.sections.map((s) => textWidth(s.name, 13, true))) + 24)\n const chartW = Math.max(560, Math.min(1100, tasks.length * 60))\n const scale = chartW / span\n const titleH = g.title ? 36 : 0\n const ROW = 28\n const axisH = 24\n const x0 = MARGIN + sectW\n const y0 = MARGIN + titleH\n const X = (t: number) => x0 + (t - t0) * scale\n const svg = new Svg()\n const H = y0 + tasks.length * ROW + axisH + MARGIN + 6\n // ticks\n const steps = [HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR, DAY, 2 * DAY, 7 * DAY, 14 * DAY, 30 * DAY, 91 * DAY, 365 * DAY]\n const step = steps.find((st) => span / st <= 12) ?? 365 * DAY\n const first = Math.ceil(t0 / step) * step\n const label = (t: number) => {\n const d = new Date(t)\n if (step < DAY) return `${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`\n if (step >= 365 * DAY) return String(d.getUTCFullYear())\n if (step >= 30 * DAY) return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}`\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`\n }\n const bottom = y0 + tasks.length * ROW + 4\n for (let t = first; t <= t1; t += step) {\n const x = X(t)\n svg.line(x, y0, x, bottom, { stroke: '#e3e6ec', sw: 1 })\n svg.text(x, bottom + 12, label(t), { anchor: 'middle', size: 11, color: THEME.muted })\n }\n let row = 0\n g.sections.forEach((s, k) => {\n const color = THEME.series[k % THEME.series.length]\n const top = y0 + row * ROW\n if (k % 2 === 0) svg.rect(MARGIN, top, sectW + chartW, s.tasks.length * ROW, { fill: '#f6f7fa' })\n if (s.name) svg.text(MARGIN + 6, top + (s.tasks.length * ROW) / 2, wrap([s.name], sectW - 12, 13, true), { size: 13, bold: true })\n for (const t of s.tasks) {\n const y = y0 + row * ROW + ROW / 2\n if (t.milestone) {\n const x = X(t.start)\n svg.poly(\n [\n [x, y - 8],\n [x + 8, y],\n [x, y + 8],\n [x - 8, y],\n ],\n { fill: t.crit ? '#e5596b' : THEME.dark },\n )\n svg.text(x + 14, y, t.name, { size: 12 })\n } else {\n const xa = X(t.start)\n const w = Math.max(3, X(t.end) - xa)\n const fill = t.done ? '#c7ccd6' : color\n svg.rect(xa, y - 9, w, 18, { fill, stroke: t.crit ? '#c0392b' : t.active ? THEME.dark : undefined, sw: t.crit || t.active ? 2 : 0 }, 3)\n const tw = textWidth(t.name, 12)\n if (tw + 10 < w) svg.text(xa + w / 2, y, t.name, { anchor: 'middle', size: 12, color: t.done ? THEME.ink : '#ffffff' })\n else if (xa + w + 6 + tw < x0 + chartW + 200) svg.text(xa + w + 6, y, t.name, { size: 12 })\n else svg.text(xa - 6, y, t.name, { anchor: 'end', size: 12 })\n }\n row++\n }\n })\n let W = x0 + chartW + MARGIN\n // labels to the right of the last bars\n for (const t of tasks) W = Math.max(W, X(t.end) + 12 + textWidth(t.name, 12) + MARGIN)\n if (g.title) {\n W = Math.max(W, textWidth(g.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, g.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\n// ---------------------------------------------------------------- mind maps / trees\n\nexport interface TreeNode {\n label: string\n shape?: 'rect' | 'round' | 'circle' | 'cloud' | 'hexagon' | 'none'\n side?: 'left' | 'right'\n children: TreeNode[]\n}\n\ninterface Placed {\n n: TreeNode\n w: number\n h: number\n text: string[]\n x: number\n y: number\n color: string\n depth: number\n kids: Placed[]\n span: number\n}\n\nconst GAP_X = 44\nconst GAP_Y = 12\n\nexport function renderTree(root: TreeNode, title?: string): Rendered {\n const svg = new Svg()\n const size = (n: TreeNode, depth: number) => {\n const fs = depth === 0 ? 16 : depth === 1 ? 14 : 13\n const text = wrap(n.label.split('\\n'), 220, fs, depth === 0)\n const t = measure(text, fs, depth === 0)\n const circle = n.shape === 'circle'\n const d = Math.max(t.w, t.h) + 20\n return { text, w: circle ? d : t.w + (n.shape === 'none' ? 8 : 24), h: circle ? d : t.h + (n.shape === 'none' ? 6 : 14), fs }\n }\n const build = (n: TreeNode, depth: number, color: string): Placed => {\n const s = size(n, depth)\n const kids = n.children.map((c, k) => build(c, depth + 1, depth === 0 ? THEME.series[k % THEME.series.length] : color))\n const span = Math.max(s.h, kids.reduce((a, c) => a + c.span, 0) + Math.max(0, kids.length - 1) * GAP_Y)\n return { n, w: s.w, h: s.h, text: s.text, x: 0, y: 0, color, depth, kids, span }\n }\n const top = build(root, 0, THEME.dark)\n // sides: explicit, else balanced by size\n let right: Placed[] = []\n let left: Placed[] = []\n if (top.kids.some((k) => k.n.side)) {\n right = top.kids.filter((k) => k.n.side !== 'left')\n left = top.kids.filter((k) => k.n.side === 'left')\n } else if (top.kids.length > 3) {\n const total = top.kids.reduce((a, k) => a + k.span, 0)\n let acc = 0\n for (const k of top.kids) {\n if (acc < total / 2) right.push(k)\n else left.push(k)\n acc += k.span\n }\n } else right = top.kids\n const place = (p: Placed, x: number, yTop: number, dir: number) => {\n p.x = x\n let y = yTop + (p.span - (p.kids.reduce((a, c) => a + c.span, 0) + Math.max(0, p.kids.length - 1) * GAP_Y)) / 2\n for (const c of p.kids) {\n place(c, x + dir * (p.w / 2 + GAP_X + c.w / 2), y, dir)\n y += c.span + GAP_Y\n }\n p.y = p.kids.length ? (p.kids[0].y + p.kids[p.kids.length - 1].y) / 2 : yTop + p.span / 2\n }\n const sideSpan = (ks: Placed[]) => ks.reduce((a, c) => a + c.span, 0) + Math.max(0, ks.length - 1) * GAP_Y\n const spanR = sideSpan(right)\n const spanL = sideSpan(left)\n const height = Math.max(top.h, spanR, spanL)\n let y = (height - spanR) / 2\n for (const c of right) {\n place(c, top.w / 2 + GAP_X + c.w / 2, y, 1)\n y += c.span + GAP_Y\n }\n y = (height - spanL) / 2\n for (const c of left) {\n place(c, -(top.w / 2 + GAP_X + c.w / 2), y, -1)\n y += c.span + GAP_Y\n }\n top.x = 0\n top.y = height / 2\n // bounds\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n const all: Placed[] = []\n const walk = (p: Placed) => {\n all.push(p)\n minX = Math.min(minX, p.x - p.w / 2)\n maxX = Math.max(maxX, p.x + p.w / 2)\n minY = Math.min(minY, p.y - p.h / 2)\n maxY = Math.max(maxY, p.y + p.h / 2)\n p.kids.forEach(walk)\n }\n walk(top)\n const titleH = title ? 36 : 0\n const ox = MARGIN - minX\n const oy = MARGIN + titleH - minY\n const P = (p: Placed): Pt => ({ x: p.x + ox, y: p.y + oy })\n for (const p of all) {\n for (const c of p.kids) {\n const a = P(p)\n const b = P(c)\n const dir = Math.sign(b.x - a.x) || 1\n const s = { x: a.x + (dir * p.w) / 2, y: a.y }\n const t = { x: b.x - (dir * c.w) / 2, y: b.y }\n const m = (s.x + t.x) / 2\n svg.path(pathData([{ c: 'M', p: [s] }, { c: 'C', p: [{ x: m, y: s.y }, { x: m, y: t.y }, t] }]), { stroke: c.color, sw: Math.max(1.2, 3.2 - c.depth * 0.6) })\n }\n }\n for (const p of all) {\n const c = P(p)\n const fs = p.depth === 0 ? 16 : p.depth === 1 ? 14 : 13\n const x = c.x - p.w / 2\n const y = c.y - p.h / 2\n const shape = p.n.shape ?? (p.depth === 0 ? 'round' : 'round')\n const fill = p.depth === 0 ? THEME.dark : p.depth === 1 ? p.color : tint(p.color)\n const ink = p.depth <= 1 ? '#ffffff' : THEME.ink\n if (shape === 'none') {\n svg.line(x, y + p.h, x + p.w, y + p.h, { stroke: p.color, sw: 1.5 })\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs })\n continue\n }\n if (shape === 'circle') svg.circle(c.x, c.y, p.w / 2, { fill, stroke: p.color, sw: 1.2 })\n else if (shape === 'hexagon') {\n const s = p.h / 4\n svg.poly(\n [\n [x + s, y],\n [x + p.w - s, y],\n [x + p.w, c.y],\n [x + p.w - s, y + p.h],\n [x + s, y + p.h],\n [x, c.y],\n ],\n { fill, stroke: p.color, sw: 1.2 },\n )\n } else svg.rect(x, y, p.w, p.h, { fill, stroke: p.depth === 0 ? undefined : p.color, sw: 1.2 }, shape === 'rect' ? 2 : shape === 'cloud' ? p.h / 2 : 8)\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs, bold: p.depth === 0, color: ink })\n }\n let W = maxX - minX + 2 * MARGIN\n const H = maxY - minY + 2 * MARGIN + titleH\n if (title) {\n W = Math.max(W, textWidth(title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\n/** a light version of a #rrggbb color */\nfunction tint(c: string): string {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(c)\n if (!m) return '#f1f3f7'\n return '#' + [m[1], m[2], m[3]].map((h) => Math.round(parseInt(h, 16) * 0.22 + 255 * 0.78).toString(16).padStart(2, '0')).join('')\n}\n","/**\n * Sequence diagrams (Mermaid sequenceDiagram, PlantUML): participants across, messages down, with activations,\n * notes, fragments (loop / alt / opt / par…), dividers and delays.\n */\nimport type { Rendered } from './graph'\nimport { DiagramError, lineHeight, measure, Svg, textWidth, THEME } from './svg'\n\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\nexport type PKind = 'participant' | 'actor' | 'database' | 'boundary' | 'control' | 'entity' | 'collections' | 'queue'\n\nexport interface Participant {\n id: string\n label: string\n kind: PKind\n fill?: string\n}\n\nexport type MsgHead = 'filled' | 'open' | 'cross' | 'half' | 'none'\n\nexport type SeqEvent =\n | { t: 'msg'; from: string; to: string; text: string; dashed: boolean; head: MsgHead; both?: boolean; activate?: boolean; deactivate?: boolean }\n | { t: 'act'; who: string; on: boolean }\n | { t: 'note'; pos: 'left' | 'right' | 'over'; who: string[]; text: string }\n | { t: 'block'; kind: string; label: string; fill?: string }\n | { t: 'else'; label: string }\n | { t: 'end' }\n | { t: 'divider'; text: string }\n | { t: 'delay'; text: string }\n | { t: 'space'; h: number }\n | { t: 'destroy'; who: string }\n\nexport interface Sequence {\n title?: string\n participants: Participant[]\n events: SeqEvent[]\n autonumber?: boolean\n /** participants drawn again at the bottom (default true) */\n footer?: boolean\n}\n\nexport class SequenceBuilder {\n readonly s: Sequence = { participants: [], events: [] }\n private ids = new Map<string, Participant>()\n\n participant(id: string, patch: Partial<Participant> = {}): Participant {\n let p = this.ids.get(id)\n if (!p) {\n p = { id, label: id, kind: 'participant' }\n this.ids.set(id, p)\n this.s.participants.push(p)\n }\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) (p as unknown as Record<string, unknown>)[k] = v\n return p\n }\n\n has(id: string) {\n return this.ids.has(id)\n }\n\n push(e: SeqEvent) {\n if (e.t === 'msg') {\n this.participant(e.from)\n this.participant(e.to)\n } else if (e.t === 'note') e.who.forEach((w) => this.participant(w))\n else if (e.t === 'act' || e.t === 'destroy') this.participant(e.who)\n this.s.events.push(e)\n }\n}\n\nconst SIZE = 14\nconst MSG = 13\nconst MLH = lineHeight(MSG)\nconst MARGIN = 16\nconst lines = (s: string) => (s ? s.split('\\n') : [])\n\ninterface PBox {\n w: number\n h: number\n text: string[]\n}\n\nfunction pbox(p: Participant): PBox {\n const text = lines(p.label)\n const t = measure(text, SIZE)\n switch (p.kind) {\n case 'actor':\n return { w: Math.max(44, t.w + 8), h: 44 + t.h, text }\n case 'boundary':\n case 'control':\n case 'entity':\n return { w: Math.max(44, t.w + 8), h: 34 + t.h, text }\n case 'database':\n return { w: Math.max(64, t.w + 24), h: t.h + 30, text }\n default:\n return { w: Math.max(64, t.w + 24), h: t.h + 18, text }\n }\n}\n\nfunction drawParticipant(svg: Svg, p: Participant, b: PBox, cx: number, y: number) {\n const fill = p.fill ?? THEME.fill\n const st = { fill, stroke: THEME.stroke, sw: 1.3 }\n const ink = { fill: 'none', stroke: THEME.dark, sw: 1.5 }\n const textBelow = (top: number) => svg.text(cx, top + (b.text.length * lineHeight(SIZE)) / 2, b.text, { anchor: 'middle' })\n const x = cx - b.w / 2\n switch (p.kind) {\n case 'actor':\n svg.circle(cx, y + 8, 7, { ...ink, fill })\n svg.line(cx, y + 15, cx, y + 29, ink).line(cx - 11, y + 20, cx + 11, y + 20, ink)\n svg.line(cx, y + 29, cx - 9, y + 41, ink).line(cx, y + 29, cx + 9, y + 41, ink)\n textBelow(y + 44)\n return\n case 'boundary':\n svg.circle(cx + 4, y + 14, 12, st).line(cx - 14, y + 4, cx - 14, y + 24, ink).line(cx - 14, y + 14, cx - 8, y + 14, ink)\n textBelow(y + 32)\n return\n case 'control':\n svg.circle(cx, y + 15, 12, st).poly(\n [\n [cx + 4, y - 1],\n [cx - 2, y + 3],\n [cx + 4, y + 7],\n ],\n ink,\n false,\n )\n textBelow(y + 32)\n return\n case 'entity':\n svg.circle(cx, y + 13, 12, st).line(cx - 12, y + 27, cx + 12, y + 27, ink)\n textBelow(y + 32)\n return\n case 'database': {\n const ry = 6\n const w = b.w\n const h = b.h\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x + w)} ${r2(y + ry)} L${r2(x + w)} ${r2(y + h - ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x)} ${r2(y + h - ry)} Z`, st)\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 0 ${r2(x + w)} ${r2(y + ry)}`, { ...st, fill: 'none' })\n svg.text(cx, y + h / 2 + ry / 2, b.text, { anchor: 'middle' })\n return\n }\n case 'collections':\n svg.rect(x + 4, y - 4, b.w, b.h, st, 3)\n svg.rect(x, y, b.w, b.h, st, 3)\n break\n case 'queue':\n svg.rect(x, y, b.w, b.h, st, b.h / 2)\n break\n default:\n svg.rect(x, y, b.w, b.h, st, 3)\n }\n svg.text(cx, y + b.h / 2, b.text, { anchor: 'middle' })\n}\n\nfunction arrowHead(svg: Svg, head: MsgHead, x: number, y: number, dir: number) {\n const col = THEME.line\n switch (head) {\n case 'filled':\n svg.poly(\n [\n [x, y],\n [x - dir * 10, y - 4.5],\n [x - dir * 10, y + 4.5],\n ],\n { fill: col, stroke: col, sw: 1 },\n )\n break\n case 'open':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n [x - dir * 10, y + 5],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'half':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'cross':\n svg.line(x - 5 - dir * 4, y - 5, x + 5 - dir * 4, y + 5, { stroke: col, sw: 1.6 }).line(x - 5 - dir * 4, y + 5, x + 5 - dir * 4, y - 5, { stroke: col, sw: 1.6 })\n break\n }\n}\n\ninterface Frame {\n kind: string\n label: string\n fill?: string\n y0: number\n y1: number\n lo: number\n hi: number\n depth: number\n elses: { y: number; label: string }[]\n}\n\nexport function renderSequence(s: Sequence): Rendered {\n const ps = s.participants\n if (!ps.length) throw new DiagramError('The sequence diagram has no participants')\n if (ps.length > 300 || s.events.length > 8000) throw new DiagramError('The sequence diagram is too large to draw')\n const idx = new Map(ps.map((p, k) => [p.id, k]))\n const boxes = ps.map(pbox)\n const n = ps.length\n // ---- horizontal: gaps between neighbouring lifelines\n const gap = new Array(n).fill(0)\n for (let k = 1; k < n; k++) gap[k] = (boxes[k - 1].w + boxes[k].w) / 2 + 28\n let leftExtra = 0\n let rightExtra = 0\n const need = (a: number, b: number, v: number) => {\n if (a > b) [a, b] = [b, a]\n if (a === b) return\n let have = 0\n for (let k = a + 1; k <= b; k++) have += gap[k]\n if (have >= v) return\n const add = (v - have) / (b - a)\n for (let k = a + 1; k <= b; k++) gap[k] += add\n }\n const num = (k: number) => (s.autonumber ? textWidth(String(k), 10) + 14 : 0)\n let count = 0\n for (const e of s.events) {\n if (e.t === 'msg') {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const tw = Math.max(0, ...lines(e.text).map((l) => textWidth(l, MSG))) + num(count)\n if (a === b) {\n if (a + 1 < n) need(a, a + 1, boxes[a + 1].w / 2 + tw + 44)\n else rightExtra = Math.max(rightExtra, tw + 44 - boxes[a].w / 2)\n } else need(a, b, tw + 30)\n } else if (e.t === 'note') {\n const tw = measure(lines(e.text), MSG).w + 20\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n if (e.pos === 'over') {\n if (a !== b) need(a, b, tw - 50)\n } else if (e.pos === 'left') {\n if (a > 0) need(a - 1, a, tw + 16 + boxes[a - 1].w / 2)\n else leftExtra = Math.max(leftExtra, tw + 16 - boxes[0].w / 2)\n } else if (b + 1 < n) need(b, b + 1, tw + 16 + boxes[b + 1].w / 2)\n else rightExtra = Math.max(rightExtra, tw + 16 - boxes[b].w / 2)\n }\n }\n const cx: number[] = []\n // frames add a margin on the outer lifelines\n const deepest = (() => {\n let d = 0\n let m = 0\n for (const e of s.events) {\n if (e.t === 'block') m = Math.max(m, ++d)\n else if (e.t === 'end') d = Math.max(0, d - 1)\n }\n return m\n })()\n const frameRoom = deepest ? 12 + deepest * 8 : 0\n cx[0] = MARGIN + Math.max(boxes[0].w / 2, leftExtra + boxes[0].w / 2, frameRoom + 10)\n for (let k = 1; k < n; k++) cx[k] = cx[k - 1] + gap[k]\n let width = cx[n - 1] + Math.max(boxes[n - 1].w / 2, rightExtra + boxes[n - 1].w / 2, frameRoom + 10) + MARGIN\n\n // ---- vertical\n const titleH = s.title ? 34 : 0\n const top = MARGIN + titleH\n const headH = Math.max(...boxes.map((b) => b.h))\n let y = top + headH + 18\n const svgBack = new Svg()\n const svgMid = new Svg()\n const svgFront = new Svg()\n const active: number[][] = ps.map(() => [])\n const bars: { k: number; y0: number; y1: number; depth: number }[] = []\n const frames: Frame[] = []\n const open: Frame[] = []\n const ended = new Map<number, number>()\n const touch = (lo: number, hi: number) => {\n for (const f of open) {\n f.lo = Math.min(f.lo, lo)\n f.hi = Math.max(f.hi, hi)\n }\n }\n const actX = (k: number, side: number) => {\n const d = active[k].length\n return cx[k] + (d ? side * 5 + (d - 1) * 5 : 0)\n }\n const activate = (k: number, at: number) => active[k].push(at)\n const deactivate = (k: number, at: number) => {\n const y0 = active[k].pop()\n if (y0 !== undefined) bars.push({ k, y0, y1: at, depth: active[k].length })\n }\n count = 0\n for (const e of s.events) {\n switch (e.t) {\n case 'msg': {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const text = lines(e.text)\n const th = text.length * MLH\n const paint = { stroke: THEME.line, sw: 1.4, dash: e.dashed ? '6 4' : undefined }\n const nw = num(count)\n if (a === b) {\n y += th + 4\n const x0 = actX(a, 1)\n const loopW = 34\n svgMid.poly(\n [\n [x0, y],\n [x0 + loopW, y],\n [x0 + loopW, y + 20],\n [x0 + 2, y + 20],\n ],\n paint,\n false,\n )\n arrowHead(svgMid, e.head, x0, y + 20, -1)\n svgFront.text(x0 + 6 + nw, y - 4 - th / 2, text, { size: MSG })\n if (s.autonumber) numberBadge(svgFront, x0, y, count)\n touch(cx[a] - 10, x0 + loopW + 6 + nw + Math.max(...text.map((l) => textWidth(l, MSG))))\n y += 20\n if (e.activate) activate(b, y)\n if (e.deactivate) deactivate(a, y)\n y += 14\n break\n }\n y += th + 6\n const dir = b > a ? 1 : -1\n if (e.activate) activate(b, y)\n const x1 = actX(a, dir)\n const x2 = actX(b, -dir)\n svgMid.line(x1, y, x2, y, paint)\n arrowHead(svgMid, e.head, x2, y, dir)\n if (e.both) arrowHead(svgMid, e.head, x1, y, -dir)\n svgFront.text((x1 + x2) / 2 + (dir * nw) / 2, y - 5 - th / 2, text, { anchor: 'middle', size: MSG })\n if (s.autonumber) numberBadge(svgFront, x1, y, count)\n if (e.deactivate) deactivate(a, y)\n touch(Math.min(cx[a], cx[b]), Math.max(cx[a], cx[b]))\n y += 14\n break\n }\n case 'act': {\n const k = idx.get(e.who)!\n if (e.on) activate(k, y - 6)\n else deactivate(k, y - 6)\n break\n }\n case 'note': {\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n const text = lines(e.text)\n const t = measure(text, MSG)\n const w = Math.max(t.w + 20, e.pos === 'over' && a !== b ? cx[b] - cx[a] + 50 : 0, 60)\n const h = t.h + 12\n y += 6\n const x = e.pos === 'left' ? cx[a] - 12 - w : e.pos === 'right' ? cx[b] + 12 : (cx[a] + cx[b]) / 2 - w / 2\n svgFront.poly(\n [\n [x, y],\n [x + w - 8, y],\n [x + w, y + 8],\n [x + w, y + h],\n [x, y + h],\n ],\n { fill: THEME.note, stroke: THEME.noteStroke, sw: 1 },\n )\n svgFront.text(x + 10, y + h / 2, text, { size: MSG })\n touch(x, x + w)\n y += h + 8\n break\n }\n case 'block': {\n y += 10\n const f: Frame = { kind: e.kind, label: e.label, fill: e.fill, y0: y, y1: y, lo: Infinity, hi: -Infinity, depth: open.length, elses: [] }\n frames.push(f)\n open.push(f)\n y += e.kind === 'rect' ? 8 : 26\n break\n }\n case 'else': {\n const f = open[open.length - 1]\n if (!f) break\n y += 8\n f.elses.push({ y, label: e.label })\n y += 24\n break\n }\n case 'end': {\n const f = open.pop()\n if (!f) break\n y += 10\n f.y1 = y\n y += 6\n break\n }\n case 'divider': {\n y += 16\n const t = measure(lines(e.text), MSG)\n svgFront.line(MARGIN / 2, y - 2, width - MARGIN / 2, y - 2, { stroke: THEME.muted, sw: 1 }).line(MARGIN / 2, y + 2, width - MARGIN / 2, y + 2, { stroke: THEME.muted, sw: 1 })\n if (e.text) {\n svgFront.rect(width / 2 - t.w / 2 - 10, y - t.h / 2 - 4, t.w + 20, t.h + 8, { fill: '#ffffff', stroke: THEME.muted, sw: 1 }, 3)\n svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, bold: true })\n }\n y += 22\n break\n }\n case 'delay':\n y += 14\n if (e.text) svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, italic: true, color: THEME.muted })\n y += 18\n break\n case 'space':\n y += e.h\n break\n case 'destroy': {\n const k = idx.get(e.who)!\n y += 6\n svgFront.line(cx[k] - 8, y - 8, cx[k] + 8, y + 8, { stroke: '#c0392b', sw: 2 }).line(cx[k] - 8, y + 8, cx[k] + 8, y - 8, { stroke: '#c0392b', sw: 2 })\n ended.set(k, y)\n y += 14\n break\n }\n }\n }\n for (let k = 0; k < n; k++) while (active[k].length) deactivate(k, y)\n for (const f of open.splice(0)) f.y1 = y\n y += 14\n const footer = s.footer !== false\n const height = y + (footer ? headH : 0) + MARGIN\n\n // frames: widths from what they contain (or the whole width when empty)\n for (const f of frames) {\n const pad = 12 + (deepest - f.depth) * 8\n if (f.lo > f.hi) {\n f.lo = cx[0]\n f.hi = cx[n - 1]\n }\n const x0 = Math.max(4, f.lo - pad)\n // wide enough for its title and branch labels (the picture grows if need be)\n const tab = textWidth(f.kind, 12, true) + 16\n const titles = [f.label ? tab + 8 + textWidth(`[${f.label}]`, 12) : tab, ...f.elses.map((e) => 10 + textWidth(`[${e.label}]`, 12))]\n const x1 = Math.max(Math.min(width - 4, f.hi + pad), f.kind === 'rect' ? 0 : x0 + Math.max(...titles) + 10)\n width = Math.max(width, x1 + 4)\n if (f.kind === 'rect') {\n svgBack.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, { fill: f.fill ?? 'rgba(200, 210, 230, 0.35)' }, 2)\n continue\n }\n const frameP = { stroke: THEME.muted, sw: 1.2 }\n svgMid.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, frameP)\n const tw = tab\n svgMid.poly(\n [\n [x0, f.y0],\n [x0 + tw, f.y0],\n [x0 + tw, f.y0 + 12],\n [x0 + tw - 7, f.y0 + 19],\n [x0, f.y0 + 19],\n ],\n { fill: '#eef0f4', stroke: THEME.muted, sw: 1.2 },\n )\n svgMid.text(x0 + 7, f.y0 + 10, f.kind, { size: 12, bold: true })\n if (f.label) svgMid.text(x0 + tw + 8, f.y0 + 11, `[${f.label}]`, { size: 12, color: THEME.ink, italic: true })\n for (const el of f.elses) {\n svgMid.line(x0, el.y, x1, el.y, { ...frameP, dash: '5 4' })\n if (el.label) svgMid.text(x0 + 10, el.y + 12, `[${el.label}]`, { size: 12, italic: true })\n }\n }\n\n // lifelines, activations, participants\n const out = new Svg()\n const lifeTop = top + headH\n for (let k = 0; k < n; k++) out.line(cx[k], lifeTop, cx[k], ended.get(k) ?? (footer ? y : y - 6), { stroke: '#9aa3b2', sw: 1, dash: '5 4' })\n out.raw(svgBack.body())\n for (const b of bars) {\n const x = cx[b.k] - 5 + b.depth * 5\n out.rect(x, b.y0, 10, Math.max(8, b.y1 - b.y0), { fill: '#f3f4f6', stroke: THEME.stroke, sw: 1 })\n }\n out.raw(svgMid.body())\n out.raw(svgFront.body())\n ps.forEach((p, k) => {\n drawParticipant(out, p, boxes[k], cx[k], top + headH - boxes[k].h)\n if (footer && !ended.has(k)) drawParticipant(out, p, boxes[k], cx[k], y)\n })\n if (s.title) {\n width = Math.max(width, textWidth(s.title, 16, true) + 2 * MARGIN)\n out.text(width / 2, MARGIN + 12, s.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: out.toString(width, height), w: Math.ceil(width), h: Math.ceil(height) }\n}\n\nfunction numberBadge(svg: Svg, x: number, y: number, k: number) {\n const r = Math.max(8, textWidth(String(k), 10) / 2 + 4)\n svg.circle(x, y, r, { fill: THEME.dark })\n svg.text(x, y, String(k), { anchor: 'middle', size: 10, color: '#ffffff', bold: true })\n}\n","/** What a diagram source parses to, and its picture. */\nimport { renderGantt, renderPie, renderTree, type Gantt, type Pie, type TreeNode } from './charts'\nimport { renderGraph, type Graph, type Rendered } from './graph'\nimport { renderSequence, type Sequence } from './sequence'\n\nexport type Model =\n | { t: 'graph'; graph: Graph }\n | { t: 'sequence'; seq: Sequence }\n | { t: 'pie'; pie: Pie }\n | { t: 'gantt'; gantt: Gantt }\n | { t: 'tree'; root: TreeNode; title?: string }\n\nexport function renderModel(m: Model): Rendered {\n switch (m.t) {\n case 'graph':\n return renderGraph(m.graph)\n case 'sequence':\n return renderSequence(m.seq)\n case 'pie':\n return renderPie(m.pie)\n case 'gantt':\n return renderGantt(m.gantt)\n case 'tree':\n return renderTree(m.root, m.title)\n }\n}\n","/**\n * PlantUML: sequence, class / object, use case, component / deployment, state and activity diagrams, mind maps and\n * work breakdown structures; @startdot hands over to the Graphviz reader. A file may hold several diagrams.\n * https://plantuml.com\n */\nimport type { TreeNode } from './charts'\nimport { parseDot } from './dot'\nimport { GraphBuilder, type GEdge, type Head, type Rendered, type Section, type Shape } from './graph'\nimport { renderModel, type Model } from './model'\nimport { SequenceBuilder, type MsgHead, type PKind } from './sequence'\nimport { color, DiagramError, labelText } from './svg'\n\n/** the diagrams of a file: the text of each @startX … @endX block (the whole text when there is none) */\nexport function plantUmlBlocks(src: string): { kind: string; lines: string[] }[] {\n const text = src.replace(/^/, '').replace(/\\r\\n?/g, '\\n')\n const out: { kind: string; lines: string[] }[] = []\n const re = /^[ \\t]*@start(\\w+)[^\\n]*\\n([\\s\\S]*?)^[ \\t]*@end\\1\\b/gm\n let m: RegExpExecArray | null\n while ((m = re.exec(text))) out.push({ kind: m[1].toLowerCase(), lines: m[2].split('\\n') })\n if (!out.length) out.push({ kind: 'uml', lines: text.split('\\n') })\n return out\n}\n\nexport function parsePlantUml(src: string): Model[] {\n return plantUmlBlocks(src).map(({ kind, lines }) => parseBlock(kind, lines))\n}\n\nexport const renderPlantUml = (src: string): Rendered[] => parsePlantUml(src).map(renderModel)\n\nfunction parseBlock(kind: string, raw: string[]): Model {\n if (kind === 'dot') return { t: 'graph', graph: parseDot(raw.join('\\n'))[0] }\n const { lines, title, dir } = clean(raw)\n switch (kind) {\n case 'uml':\n break\n case 'mindmap':\n case 'wbs':\n return { t: 'tree', root: tree(lines, kind === 'wbs'), title }\n default:\n throw new DiagramError(`PlantUML @start${kind} diagrams are not supported yet`)\n }\n switch (umlKind(lines)) {\n case 'activity':\n return { t: 'graph', graph: { ...activity(lines), title } }\n case 'sequence':\n return { t: 'sequence', seq: { ...sequence(lines), title } }\n case 'state':\n return { t: 'graph', graph: { ...state(lines, dir), title } }\n default:\n return { t: 'graph', graph: { ...description(lines, dir), title } }\n }\n}\n\n/** creole / HTML markup out of a label */\nexport function pText(s: string): string {\n return labelText(\n s\n .trim()\n .replace(/^\"(.*)\"$/s, '$1')\n .replace(/\\*\\*(.+?)\\*\\*|\\/\\/(.+?)\\/\\/|\"\"(.+?)\"\"|__(.+?)__|~~(.+?)~~|--(.+?)--/g, (...m) => m.slice(1, 7).find((x) => x !== undefined) ?? '')\n .replace(/<\\/?(?:b|i|u|s|font|color|size|back|code|plain|strike|w|sub|sup)\\b[^>]*>/gi, '')\n .replace(/<&[\\w-]+>/g, '')\n .replace(/\\\\t/g, ' '),\n )\n}\n\n/** comments, skinparams, legends, headers out; the title and the direction */\nfunction clean(raw: string[]): { lines: string[]; title?: string; dir?: 'LR' | 'TB' } {\n const lines: string[] = []\n let title: string | undefined\n let dir: 'LR' | 'TB' | undefined\n let skip: RegExp | null = null\n let titleLines: string[] | null = null\n let inComment = false\n for (let l of raw) {\n if (inComment) {\n const e = l.indexOf(\"'/\")\n if (e < 0) continue\n l = l.slice(e + 2)\n inComment = false\n }\n l = l.replace(/\\/'.*?'\\//g, '')\n const c = l.indexOf(\"/'\")\n if (c >= 0) {\n l = l.slice(0, c)\n inComment = true\n }\n const t = l.trim()\n if (skip) {\n if (skip.test(t)) skip = null\n continue\n }\n if (titleLines) {\n if (/^end\\s*title$/i.test(t)) {\n title = pText(titleLines.join('\\n'))\n titleLines = null\n } else titleLines.push(t)\n continue\n }\n if (!t || t.startsWith(\"'\")) continue\n let m: RegExpExecArray | null\n if (/^skinparam\\b.*\\{$/i.test(t) || /^(legend|header|footer)\\b(?!.*:)/i.test(t) && !/^(header|footer)\\s+\\S/i.test(t)) {\n skip = /^(\\}|end\\s*legend|endlegend|end\\s*header|endheader|end\\s*footer|endfooter)$/i\n continue\n }\n if (/^(skinparam|!|hide|show|scale|caption|header|footer|newpage|allowmixing|autoactivate|set\\s+namespaceSeparator|page|mainframe|sprite|remove|restore|together|left\\s+header|right\\s+footer)\\b/i.test(t)) continue\n if ((m = /^title\\s*:?\\s*(.*)$/i.exec(t))) {\n if (m[1]) title = pText(m[1])\n else titleLines = []\n continue\n }\n if (/^left\\s+to\\s+right\\s+direction$/i.test(t)) {\n dir = 'LR'\n continue\n }\n if (/^top\\s+to\\s+bottom\\s+direction$/i.test(t)) {\n dir = 'TB'\n continue\n }\n lines.push(t)\n }\n return { lines, title, dir }\n}\n\nfunction umlKind(lines: string[]): 'activity' | 'sequence' | 'state' | 'description' {\n const has = (re: RegExp) => lines.some((l) => re.test(l))\n if (has(/^(start|stop)$/) || has(/^:[\\s\\S]*[;|<>/\\]}]$/) || has(/^:/) || has(/^(if\\s*\\(.*\\)\\s*then|while\\s*\\(|repeat\\b|fork$|endif$)/)) return 'activity'\n if (has(/\\[\\*\\]/) || has(/^state\\s/)) return 'state'\n if (has(/^(participant|boundary|control|collections|queue|autonumber|activate|deactivate|alt|loop|return|ref\\s+over)\\b/) || has(/^(==.*==|\\.\\.\\.|\\|\\|\\d*\\|\\|)$/)) return 'sequence'\n if (has(/^(abstract|class|interface|enum|annotation|struct|protocol|object|map|json|usecase|component|node|cloud|package|namespace|folder|frame|rectangle|artifact|storage|card|file|agent|person|hexagon|together)\\b/)) return 'description'\n if (has(/\\([^)]*\\)|\\[[^\\]*]+\\]|<\\|--|--\\|>|\\*--|o--|\\.\\.>/)) return 'description'\n if (has(/^(actor|database|entity)\\b/) || has(/^\\S+\\s*<?-{1,2}>?>?\\s*\\S+\\s*:/)) return 'sequence'\n return 'description'\n}\n\n// ---------------------------------------------------------------- sequence\n\nconst KIND: Record<string, PKind> = { participant: 'participant', actor: 'actor', boundary: 'boundary', control: 'control', entity: 'entity', database: 'database', collections: 'collections', queue: 'queue' }\n\nfunction sequence(lines: string[]) {\n const b = new SequenceBuilder()\n const calls: { from: string; to: string }[] = []\n let noteLines: string[] | null = null\n let note: { pos: 'left' | 'right' | 'over'; who: string[] } | null = null\n let last: { from: string; to: string } | null = null\n const id = (s: string) => {\n const t = s.trim().replace(/^\"(.*)\"$/, '$1')\n return t\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*(note|ref|rnote|hnote)$/i.test(l)) {\n if (note && note.who.length) b.push({ t: 'note', pos: note.pos, who: note.who, text: pText(noteLines.join('\\n')) })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^(?:create\\s+)?(participant|actor|boundary|control|entity|database|collections|queue)\\s+(.+)$/.exec(l))) {\n let rest = m[2].replace(/\\s+order\\s+-?\\d+/, '').trim()\n const col = /\\s+(#\\w+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n rest = rest.replace(/<<[^>]*>>/g, '').trim()\n let pid = rest\n let label = rest\n const as1 = /^\"([^\"]+)\"\\s+as\\s+(\\S+)$/.exec(rest)\n const as2 = /^(\\S+)\\s+as\\s+\"?([^\"]+)\"?$/.exec(rest)\n if (as1) [pid, label] = [as1[2], as1[1]]\n else if (as2) [pid, label] = [as2[1], as2[2]]\n else pid = label = id(rest)\n b.participant(pid, { kind: KIND[m[1].toLowerCase()], label: pText(label), fill: col ? color(col[1].slice(1)) ?? color(col[1]) : undefined })\n continue\n }\n if (/^hide\\s+footbox$/i.test(l)) {\n b.s.footer = false\n continue\n }\n if (/^autonumber\\b/i.test(l)) {\n b.s.autonumber = !/\\bstop\\b/i.test(l)\n continue\n }\n if ((m = /^(activate|deactivate|destroy)\\s+(\\S+)/i.exec(l))) {\n const who = id(m[2])\n if (m[1].toLowerCase() === 'destroy') b.push({ t: 'destroy', who })\n else b.push({ t: 'act', who, on: m[1].toLowerCase() === 'activate' })\n continue\n }\n if ((m = /^return\\b\\s*(.*)$/i.exec(l))) {\n const c = calls.pop() ?? (last ? { from: last.from, to: last.to } : null)\n if (c) b.push({ t: 'msg', from: c.to, to: c.from, text: pText(m[1]), dashed: true, head: 'filled', deactivate: true })\n continue\n }\n if ((m = /^[rh]?note\\s+(left|right|over)(?:\\s+of)?\\s*([^:]*?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l)) || (m = /^ref\\s+over\\s+()([^:]+?)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const pos = (m[1] || 'over').toLowerCase() as 'left' | 'right' | 'over'\n let who = m[2] ? m[2].split(',').map(id).filter(Boolean) : []\n if (!who.length && last) who = [pos === 'left' ? last.from : last.to]\n if (!who.length && b.s.participants.length) who = [b.s.participants[0].id]\n if (m[3] !== undefined) {\n if (who.length) b.push({ t: 'note', pos, who, text: pText(m[3]) })\n } else {\n noteLines = []\n note = { pos, who }\n }\n continue\n }\n if ((m = /^note\\s+across\\s*:\\s*(.*)$/i.exec(l))) {\n const ps = b.s.participants\n if (ps.length) b.push({ t: 'note', pos: 'over', who: [ps[0].id, ps[ps.length - 1].id], text: pText(m[1]) })\n continue\n }\n if ((m = /^(alt|opt|loop|par|break|critical|group)\\b\\s*(.*)$/i.exec(l))) {\n const kind = m[1].toLowerCase()\n b.push({ t: 'block', kind: kind === 'group' ? pText(m[2]) || 'group' : kind, label: kind === 'group' ? '' : pText(m[2]) })\n continue\n }\n if ((m = /^else\\b\\s*(.*)$/i.exec(l))) {\n b.push({ t: 'else', label: pText(m[1]) })\n continue\n }\n if (/^end$/i.test(l)) {\n b.push({ t: 'end' })\n continue\n }\n if (/^(box\\b|end\\s*box)/i.test(l)) continue\n if ((m = /^==\\s*(.*?)\\s*==$/.exec(l))) {\n b.push({ t: 'divider', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\.\\.\\.\\s*(.*?)\\s*(?:\\.\\.\\.)?$/.exec(l))) {\n b.push({ t: 'delay', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\|\\|(\\d*)\\|\\|$/.exec(l)) || l === '|||') {\n b.push({ t: 'space', h: m?.[1] ? Math.min(400, Number(m[1])) : 20 })\n continue\n }\n const msg = seqMessage(l)\n if (msg) {\n const { from, to, dashed, head, both, act, text } = msg\n b.push({ t: 'msg', from, to, text, dashed, head, both, activate: act === '++', deactivate: act === '--' })\n last = { from, to }\n if (act === '++') calls.push({ from, to })\n if (act === '--' && calls.length) calls.pop()\n if (act === '**') b.participant(to)\n if (act === '!!') b.push({ t: 'destroy', who: to })\n }\n }\n return b.s\n}\n\nconst ARROW = /^(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(<<?|[\\\\/]{1,2})?(-{1,2}|\\.{1,2})(?:\\[[^\\]]*\\])?(-?)(>>?|[\\\\/]{1,2})?\\s*([ox])?\\s*(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(\\+\\+|--|\\*\\*|!!)?\\s*(?::\\s*(.*))?$/u\n\nfunction seqMessage(l: string) {\n // \"o->\", \"x<-\": lost / found markers before the arrow\n const m = ARROW.exec(l.replace(/^(\\S+)\\s*([ox])(?=<|-)/, '$1 '))\n if (!m) return null\n const [, a, left, line, , right, , z, act, text] = m\n if (!left && !right) return null\n if (!a || !z) return null\n const clean = (s: string) => s.replace(/^\"(.*)\"$/, '$1')\n let from = clean(a)\n let to = clean(z)\n if (from === '[' || from === ']' || to === '[' || to === ']') return null\n const dashed = line === '--' || line.startsWith('.')\n const headOf = (s: string | undefined): MsgHead => (!s ? 'none' : s === '>>' || s === '<<' ? 'open' : s.length && /[\\\\/]/.test(s) ? 'half' : 'filled')\n let head: MsgHead\n let both = false\n if (left && right) {\n head = headOf(right)\n both = true\n } else if (left) {\n ;[from, to] = [to, from]\n head = headOf(left)\n } else head = headOf(right)\n if (/x\\s*$/.test(l.split(':')[0].replace(z, '').trim()) && !left) head = 'cross'\n return { from, to, dashed, head, both, act, text: pText(text ?? '') }\n}\n\n// ---------------------------------------------------------------- class, use case, component… (description diagrams)\n\nconst ELEMENT: Record<string, Shape> = {\n actor: 'actor', person: 'actor', usecase: 'ellipse', component: 'component', node: 'box3d', database: 'cylinder', cloud: 'cloud', folder: 'folder', frame: 'folder',\n package: 'folder', artifact: 'note', file: 'note', storage: 'stadium', queue: 'stadium', stack: 'rect', card: 'rect', rectangle: 'rect', agent: 'rect', label: 'none',\n boundary: 'circle', control: 'circle', entity: 'rect', collections: 'rect', hexagon: 'hexagon', interface: 'rect', circle: 'circle', port: 'point', portin: 'point', portout: 'point',\n action: 'rect', process: 'round', usecase_: 'ellipse', object: 'rect', map: 'rect', json: 'rect', diamond: 'diamond', state: 'round',\n}\nconst CLASSES = new Set(['class', 'abstract', 'abstract class', 'interface', 'enum', 'annotation', 'struct', 'protocol', 'entity', 'exception', 'metaclass', 'stereotype', 'object', 'map', 'json'])\n\nconst MARKS: Record<string, Head> = {\n '>': 'arrow', '<': 'arrow', '|>': 'triangle', '<|': 'triangle', '^': 'triangle', '*': 'diamond', o: 'odiamond', '#': 'odiamond', x: 'cross', '+': 'ocircle',\n '{': 'many', '}': 'many', '>>': 'open', '<<': 'open', '|o': 'zero-one', 'o|': 'zero-one', '||': 'one', '}o': 'zero-many', 'o{': 'zero-many', '}|': 'one-many', '|{': 'one-many',\n}\n\nconst END = String.raw`\\[\\*\\]|\\[[^\\]]+\\]|\\([^)]*\\)|:[^:]+:|\"[^\"]+\"|\\(\\)\\s*\"[^\"]+\"|\\(\\)\\s*[\\w.]+|[\\w.$À--]+`\nconst LINK = new RegExp(\n String.raw`^(${END})\\s*(?:\"([^\"]*)\"\\s*)?((?:<\\||<<|\\}o|\\}\\||\\|o|\\|\\||[<*o#x+^}])?)([-.=~]+)(?:\\[([^\\]]*)\\])?((?:up|down|left|right|u|d|l|r|le|ri|do)?)([-.=~]*)(?:\\[([^\\]]*)\\])?((?:\\|>|>>|o\\{|\\|\\{|o\\||\\|\\||[>*#+^{]|[ox](?=\\s|\\[|\\(|\"|:|$))?)\\s*(?:\"([^\"]*)\"\\s*)?(${END})\\s*(?::\\s*(.*))?$`,\n 'u',\n)\n\ninterface ClassInfo {\n kind: string\n stereo?: string\n sections: string[][]\n}\n\nfunction description(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'rect')\n const info = new Map<string, ClassInfo>()\n const ns: string[] = []\n const stackKinds: string[] = []\n let body: { id: string; c: ClassInfo } | null = null\n let noteLines: string[] | null = null\n let noteTarget: string | undefined\n let noteId = ''\n let notes = 0\n let anon = 0\n const cur = () => ns[ns.length - 1]\n /** an element written in a link or a declaration: its id (created when new) */\n const element = (raw: string): string => {\n let t = raw.trim()\n let m: RegExpExecArray | null\n if (t === '(*)') return 'start'\n if ((m = /^\\[(.+)\\]$/.exec(t))) return ensure(m[1], 'component')\n if ((m = /^\\((.*)\\)$/.exec(t))) return ensure(m[1], 'ellipse')\n if ((m = /^:(.+):$/.exec(t))) return ensure(m[1], 'actor')\n if ((m = /^\\(\\)\\s*\"?([^\"]+)\"?$/.exec(t))) return ensure(m[1], 'circle')\n t = t.replace(/^\"(.*)\"$/, '$1')\n if (!b.has(t) && !b.isCluster(t)) b.node(t, { label: pText(t) }, cur())\n return t\n }\n const ensure = (name: string, shape: Shape) => {\n const id = name.trim()\n if (!b.has(id) && !b.isCluster(id)) b.node(id, { label: pText(id), shape }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n b.node(noteId, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteTarget) b.edge({ from: noteTarget, to: noteId, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (body) {\n if (l === '}') {\n body = null\n continue\n }\n if (/^(--|==|\\.\\.|__)(.*?)(--|==|\\.\\.|__)?$/.test(l)) body.c.sections.push([])\n else body.c.sections[body.c.sections.length - 1].push(pText(l.replace(/\\{(static|abstract|classifier|field|method)\\}\\s*/g, '')))\n continue\n }\n let m: RegExpExecArray | null\n if (l === '}' || /^end\\s*(package|namespace|rectangle|node|folder|frame|together)$/i.test(l)) {\n ns.pop()\n stackKinds.pop()\n continue\n }\n // note\n if ((m = /^note\\s+(left|right|top|bottom)(?:\\s+of)?\\s+(\\S+?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const target = element(m[2])\n const nid = `__note${notes++}`\n if (m[3] !== undefined) {\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: target, to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteTarget = target\n noteId = nid\n }\n continue\n }\n if ((m = /^note\\s+\"([^\"]*)\"\\s+as\\s+(\\S+)$/i.exec(l))) {\n b.node(m[2], { label: pText(m[1]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n continue\n }\n if ((m = /^note\\s+as\\s+(\\S+)$/i.exec(l))) {\n noteLines = []\n noteTarget = undefined\n noteId = m[1]\n continue\n }\n // container: package \"Name\" { / rectangle System {\n if ((m = /^(package|namespace|rectangle|node|folder|frame|cloud|database|component|card|storage|artifact|file|stack|queue|agent|hexagon|together)\\s*(?:\"([^\"]*)\"|([^\\s{<#]+))?\\s*(?:as\\s+(\\S+))?\\s*(<<[^>]*>>)?\\s*(#\\S+)?\\s*\\{$/.exec(l))) {\n const kind = m[1].toLowerCase()\n const label = m[2] ?? m[3] ?? ''\n const cid = m[4] ?? (m[3] || m[2] || `__group${anon++}`)\n const c = b.cluster(cid, kind === 'together' ? '' : pText(label), cur())\n const fill = m[6] ? color(m[6].slice(1)) ?? color(m[6]) : undefined\n if (fill) c.style = { fill }\n if (kind === 'together') c.style = { fill: 'none', stroke: 'none' }\n ns.push(cid)\n stackKinds.push(kind)\n continue\n }\n // class-like declaration\n if ((m = /^(abstract\\s+class|abstract|class|interface|enum|annotation|struct|protocol|entity|exception|metaclass|stereotype|object|map|json)\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+)|(\\S+)\\s+as\\s+\"([^\"]+)\"|([^\\s{<#]+))(?:\\s*<([^>]+)>)?\\s*(<<.+?>>)?\\s*(#\\S+)?\\s*(\\{)?\\s*(\\})?$/.exec(l)) && CLASSES.has(m[1].toLowerCase().replace(/\\s+/, ' '))) {\n const kind = m[1].toLowerCase().replace(/\\s+/, ' ')\n const cid = m[3] ?? m[4] ?? m[6]\n const label = m[2] ?? m[5] ?? cid\n const generic = m[7] ? `<${m[7]}>` : ''\n b.node(cid, { label: pText(label) + generic, shape: 'rect' }, cur())\n const c: ClassInfo = info.get(cid) ?? { kind, sections: [[], []] }\n c.kind = kind\n if (m[8]) c.stereo = m[8].replace(/^<<|>>$/g, '').trim()\n const fill = m[9] ? color(m[9].slice(1)) ?? color(m[9]) : undefined\n if (fill) b.node(cid).style = { fill }\n info.set(cid, c)\n if (m[10] && !m[11]) {\n c.sections = [[]]\n body = { id: cid, c }\n }\n continue\n }\n // element declaration\n if ((m = /^(actor\\/?|usecase\\/?|component|node|database|cloud|folder|frame|package|artifact|file|storage|queue|stack|card|rectangle|agent|label|boundary|control|entity|collections|hexagon|interface|circle|person|port|portin|portout|action|process|diamond)\\s+(.+)$/.exec(l))) {\n const kind = m[1].toLowerCase().replace('/', '')\n let rest = m[2].trim()\n const col = /\\s+(#[\\w]+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n const stereo = /\\s*<<(.+?)>>\\s*$/.exec(rest)\n if (stereo) rest = rest.slice(0, stereo.index).trim()\n let id = rest\n let label = rest\n const a1 = /^(.+?)\\s+as\\s+(.+)$/.exec(rest)\n if (a1) {\n const [x, y] = [a1[1].trim(), a1[2].trim()]\n // the quoted / bracketed side is the label\n if (/^[\"([:]/.test(x)) [label, id] = [x, y]\n else [id, label] = [x, y]\n }\n label = label.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3')\n id = id.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3').replace(/^\"(.*)\"$/, '$1')\n const shape = kind === 'usecase' ? 'ellipse' : kind === 'actor' ? 'actor' : (ELEMENT[kind] ?? 'rect')\n const n = b.node(id, { label: pText(label) + (stereo ? `\\n«${stereo[1]}»` : ''), shape }, cur())\n const fill = col ? color(col[1].slice(1)) ?? color(col[1]) : undefined\n if (fill) n.style = { ...n.style, fill }\n continue\n }\n // shorthand elements alone on a line\n if ((m = /^(\\[[^\\]]+\\]|\\([^)]+\\)|:[^:]+:)(?:\\s+as\\s+(\\S+))?$/.exec(l))) {\n const id = element(m[1])\n if (m[2]) {\n const n = b.get(id)!\n b.node(m[2], { label: n.label, shape: n.shape }, cur())\n b.g.nodes.splice(b.g.nodes.indexOf(n), 1)\n }\n continue\n }\n if ((m = LINK.exec(l))) {\n const [, ra, la, lm, l1, , dirWord, l2, , rm, lb, rz, label] = m\n let a = element(ra)\n let z = element(rz)\n const line = l1 + l2\n let tail = lm ? MARKS[lm] ?? 'none' : 'none'\n let head = rm ? MARKS[rm] ?? 'none' : 'none'\n let tl = la\n let hl = lb\n // \"up\" / \"left\": laid out the other way round\n if (/^(up|u|left|l|le)$/i.test(dirWord)) {\n ;[a, z] = [z, a]\n ;[tail, head] = [head, tail]\n ;[tl, hl] = [hl, tl]\n }\n const e: GEdge = { from: a, to: z, head, tail, line: line.includes('.') ? 'dashed' : line.includes('=') ? 'thick' : line.includes('~') ? 'dotted' : 'solid' }\n if (label) e.label = pText(label.replace(/\\s*[<>]\\s*$|^\\s*[<>]\\s*/g, ''))\n if (tl) e.tailLabel = tl\n if (hl) e.headLabel = hl\n b.edge(e)\n continue\n }\n // Class : member\n if ((m = /^([\\w.$]+)\\s*:\\s*(.+)$/.exec(l)) && (info.has(m[1]) || b.has(m[1]))) {\n const c = info.get(m[1]) ?? { kind: 'class', sections: [[], []] }\n info.set(m[1], c)\n const mem = pText(m[2])\n if (mem.includes('(') && c.sections.length > 1) c.sections[1].push(mem)\n else c.sections[0].push(mem)\n continue\n }\n }\n // start / end of old-style activity links\n const start = b.get('start')\n if (start && start.label === 'start' && b.g.edges.some((e) => e.from === 'start' || e.to === 'start')) {\n start.shape = 'start'\n start.label = ''\n const ins = b.g.edges.filter((e) => e.to === 'start')\n if (ins.length) {\n b.node('__end', { shape: 'end', label: '' })\n for (const e of ins) e.to = '__end'\n }\n }\n for (const n of b.g.nodes) {\n const c = info.get(n.id)\n if (!c) continue\n const header: string[][] = []\n const stereo = c.stereo ?? (c.kind === 'interface' ? 'interface' : c.kind === 'enum' ? 'enumeration' : c.kind === 'annotation' ? 'annotation' : c.kind === 'abstract' || c.kind === 'abstract class' ? 'abstract' : undefined)\n if (stereo) header.push([`«${stereo}»`])\n header.push([n.label])\n const sections: Section[] = [{ rows: header, bold: true, center: true, italic: c.kind.startsWith('abstract') }]\n for (const s of c.sections) sections.push({ rows: s.map((x) => [x]) })\n n.sections = sections\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- state\n\nfunction state(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'round')\n const scope: string[] = []\n const desc = new Map<string, string[]>()\n let notes = 0\n let noteLines: string[] | null = null\n let noteFor: string | undefined\n const cur = () => scope[scope.length - 1]\n const st = (raw: string, asTarget: boolean): string => {\n const id = raw.trim().replace(/^\"(.*)\"$/, '$1')\n if (id === '[*]') {\n const sid = `${cur() ?? ''}__${asTarget ? 'end' : 'start'}`\n b.node(sid, { label: '', shape: asTarget ? 'end' : 'start' }, cur())\n return sid\n }\n if (!b.isCluster(id) && !b.has(id)) b.node(id, { label: id }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteFor) b.edge({ from: noteFor, to: nid, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (l === '--' || l === '||') continue\n let m: RegExpExecArray | null\n if ((m = /^state\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+?)|(\\S+?)\\s+as\\s+\"([^\"]+)\"|(\"[^\"]+\"|[^\\s{<#]+))\\s*(<<(\\w+)>>)?\\s*(#\\S+)?\\s*(\\{)?$/i.exec(l))) {\n const id = (m[2] ?? m[3] ?? m[5]).replace(/^\"(.*)\"$/, '$1')\n const label = m[1] ?? m[4] ?? id\n const kind = m[7]?.toLowerCase()\n if (m[9]) {\n b.cluster(id, pText(label), cur())\n scope.push(id)\n continue\n }\n const shape: Shape | undefined =\n kind === 'fork' || kind === 'join' ? 'bar' : kind === 'choice' ? 'diamond' : kind === 'start' || kind === 'entrypoint' ? 'start' : kind === 'end' || kind === 'exitpoint' ? 'end' : undefined\n b.node(id, { label: shape ? '' : pText(label), shape }, cur())\n const fill = m[8] ? color(m[8].slice(1)) ?? color(m[8]) : undefined\n if (fill) b.node(id).style = { fill }\n continue\n }\n if (l === '}') {\n scope.pop()\n continue\n }\n if ((m = /^note\\s+(left|right|top|bottom)\\s+of\\s+(\\S+)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n if (m[3] !== undefined) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: st(m[2], false), to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteFor = st(m[2], false)\n }\n continue\n }\n if ((m = /^(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(-+|\\.+)(?:\\[[^\\]]*\\])?((?:up|down|left|right|u|d|l|r)?)(-*|\\.*)(?:\\[[^\\]]*\\])?>\\s*(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(?::\\s*(.*))?$/u.exec(l))) {\n let a = st(m[1], false)\n let z = st(m[5], true)\n let rev = false\n if (/^(up|u|left|l)$/i.test(m[3])) {\n ;[a, z] = [z, a]\n rev = true\n }\n b.edge({ from: a, to: z, head: rev ? 'none' : 'arrow', tail: rev ? 'arrow' : 'none', line: m[2].includes('.') ? 'dashed' : 'solid', label: m[6] ? pText(m[6]) : undefined })\n continue\n }\n if ((m = /^([\\w.$À-]+)\\s*:\\s*(.+)$/u.exec(l))) {\n st(m[1], false)\n desc.set(m[1], [...(desc.get(m[1]) ?? []), pText(m[2])])\n }\n }\n for (const n of b.g.nodes) {\n const d = desc.get(n.id)\n if (d && n.shape === 'round') n.sections = [{ rows: [[n.label]], bold: true, center: true }, { rows: d.map((x) => [x]) }]\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- activity (new syntax)\n\ninterface Exit {\n from: string\n label?: string\n}\n\nfunction activity(raw: string[]) {\n const b = new GraphBuilder('TB', 'round')\n // join multi-line actions \":…;\"\n const lines: string[] = []\n for (let k = 0; k < raw.length; k++) {\n let l = raw[k]\n if (/^:/.test(l) && !/[;|<>/\\]}]$/.test(l)) {\n while (k + 1 < raw.length && !/[;|<>/\\]}]$/.test(l)) l += '\\n' + raw[++k]\n }\n lines.push(l)\n }\n let i = 0\n let n = 0\n const scope: string[] = []\n const node = (shape: Shape, label = '') => {\n const id = `a${n++}`\n b.node(id, { shape, label }, scope[scope.length - 1])\n return id\n }\n let pendingLabel: string | undefined\n const link = (exits: Exit[], to: string) => {\n for (const e of exits) b.edge({ from: e.from, to, head: 'arrow', label: e.label })\n }\n const cond = (s: string) => pText(s.replace(/^\\((.*)\\)$/, '$1'))\n /** statements until a line matching `stop` (left unread); returns the open ends */\n const block = (start: Exit[], stop: RegExp): Exit[] => {\n let cur = start\n const put = (id: string) => {\n if (pendingLabel !== undefined) cur = cur.map((e) => ({ ...e, label: e.label ?? pendingLabel }))\n pendingLabel = undefined\n link(cur, id)\n }\n while (i < lines.length) {\n const l = lines[i]\n if (stop.test(l)) return cur\n i++\n let m: RegExpExecArray | null\n if (/^start$/i.test(l)) {\n const id = node('start')\n put(id)\n cur = [{ from: id }]\n } else if (/^(stop|end)$/i.test(l)) {\n const id = node('end')\n put(id)\n cur = []\n } else if (/^(kill|detach|break)$/i.test(l)) cur = []\n else if ((m = /^:([\\s\\S]*?)[;|<>/\\]}]$/.exec(l))) {\n const id = node('round', pText(m[1]))\n put(id)\n cur = [{ from: id }]\n } else if ((m = /^->\\s*(.*?);?$/.exec(l))) pendingLabel = pText(m[1]) || undefined\n else if ((m = /^if\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?\\s*$/i.exec(l)) || (m = /^if\\s*(\\(.*\\))\\s*(?:is\\s*\\((.*)\\))?\\s*then\\s*$/i.exec(l))) {\n let d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = block([{ from: d, label: m[2] ? pText(m[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i)\n let open = true\n while (i < lines.length) {\n const t = lines[i++]\n let e: RegExpExecArray | null\n if ((e = /^(?:elseif|else\\s*if)\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?$/i.exec(t))) {\n const d2 = node('diamond', cond(e[1]))\n b.edge({ from: d, to: d2, head: 'arrow' })\n d = d2\n out = out.concat(block([{ from: d2, label: e[2] ? pText(e[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i))\n } else if ((e = /^else\\s*(?:\\((.*)\\))?$/i.exec(t))) {\n out = out.concat(block([{ from: d, label: e[1] ? pText(e[1]) : undefined }], /^(endif|end\\s*if)\\b/i))\n open = false\n } else break\n }\n if (open) out.push({ from: d })\n cur = out\n } else if ((m = /^switch\\s*(\\(.*\\))$/i.exec(l))) {\n const d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = []\n while (i < lines.length) {\n const t = lines[i++]\n const e = /^case\\s*(\\(.*\\))$/i.exec(t)\n if (!e) break\n out = out.concat(block([{ from: d, label: cond(e[1]) }], /^(case\\s*\\(|endswitch)/i))\n }\n cur = out\n } else if ((m = /^while\\s*(\\(.*?\\))\\s*(?:is\\s*\\((.*)\\))?$/i.exec(l))) {\n const w = node('diamond', cond(m[1]))\n put(w)\n const body = block([{ from: w, label: m[2] ? pText(m[2]) : undefined }], /^(endwhile|end\\s*while)\\b/i)\n link(body, w)\n const e = /^(?:endwhile|end\\s*while)\\s*(?:\\((.*)\\))?$/i.exec(lines[i++] ?? '')\n cur = [{ from: w, label: e?.[1] ? pText(e[1]) : undefined }]\n } else if ((m = /^repeat\\s*(?::([\\s\\S]*?)[;|<>/\\]}])?$/i.exec(l)) && !/^repeat\\s*while/i.test(l)) {\n const r = m[1] !== undefined ? node('round', pText(m[1])) : node('diamond', '')\n put(r)\n const body = block([{ from: r }], /^(repeat\\s*while|backward)/i)\n let back: string | undefined\n let bm: RegExpExecArray | null\n if ((bm = /^backward\\s*:([\\s\\S]*?)[;|<>/\\]}]$/i.exec(lines[i] ?? ''))) {\n back = node('round', pText(bm[1]))\n i++\n }\n const e = /^repeat\\s*while\\s*(\\(.*?\\))?\\s*(?:is\\s*\\((.*?)\\))?\\s*(?:not\\s*\\((.*?)\\))?$/i.exec(lines[i++] ?? '')\n const d = node('diamond', e?.[1] ? cond(e[1]) : '')\n link(body, d)\n if (back) {\n b.edge({ from: d, to: back, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n b.edge({ from: back, to: r, head: 'arrow' })\n } else b.edge({ from: d, to: r, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n cur = [{ from: d, label: e?.[3] ? pText(e[3]) : undefined }]\n } else if (/^(fork|split)$/i.test(l)) {\n const fork = /^fork$/i.test(l)\n let f: string | undefined\n let starts = cur\n if (fork) {\n f = node('bar')\n put(f)\n starts = [{ from: f }]\n } else if (pendingLabel !== undefined) pendingLabel = undefined\n let out: Exit[] = []\n for (;;) {\n out = out.concat(block(starts, /^(fork\\s+again|split\\s+again|end\\s*fork|end\\s*merge|end\\s*split)\\b/i))\n const t = lines[i++] ?? ''\n if (!/again/i.test(t)) break\n }\n if (fork) {\n const j = node('bar')\n link(out, j)\n cur = [{ from: j }]\n } else cur = out\n } else if ((m = /^(?:partition|group|package|rectangle|card)\\s+(?:\"([^\"]*)\"|(\\S[^{]*?))\\s*(?:#\\S+)?\\s*\\{?$/i.exec(l))) {\n const name = (m[1] ?? m[2]).trim()\n const cid = `__p${n++}`\n b.cluster(cid, pText(name), scope[scope.length - 1])\n scope.push(cid)\n } else if (l === '}' || /^end\\s*group$/i.test(l)) scope.pop()\n else if (/^[rh]?note\\b/i.test(l) || /^floating\\s+note\\b/i.test(l)) {\n if (!/:/.test(l)) while (i < lines.length && !/^end\\s*note$/i.test(lines[i++]));\n }\n // swimlanes, arrows styles, labels we do not draw\n }\n return cur\n }\n block([], /^\\u0000$/)\n return b.g\n}\n\n// ---------------------------------------------------------------- mind map / WBS\n\nfunction tree(lines: string[], wbs: boolean): TreeNode {\n const stack: { depth: number; n: TreeNode }[] = []\n let root: TreeNode | undefined\n for (let k = 0; k < lines.length; k++) {\n const l = lines[k]\n const m = /^([*+\\-#]+)(_)?\\s*(?:\\[#[\\w]+\\])?\\s*(.*)$/.exec(l)\n if (!m) continue\n let text = m[3]\n // \":multi\\nline;\" nodes\n if (text.startsWith(':')) {\n text = text.slice(1)\n while (!/;\\s*$/.test(text) && k + 1 < lines.length) text += '\\n' + lines[++k]\n text = text.replace(/;\\s*$/, '')\n }\n const depth = m[1].length\n const side = m[1][0] === '-' ? 'left' : 'right'\n const node: TreeNode = { label: pText(text), shape: m[2] ? 'none' : undefined, side: wbs ? undefined : side, children: [] }\n if (!root) {\n root = node\n stack.push({ depth, n: node })\n continue\n }\n while (stack.length > 1 && stack[stack.length - 1].depth >= depth) stack.pop()\n stack[stack.length - 1].n.children.push(node)\n stack.push({ depth, n: node })\n }\n if (!root) throw new DiagramError('The mind map is empty')\n // only the root's children choose a side\n const clear = (n: TreeNode, top: boolean) => n.children.forEach((c) => (top ? clear(c, false) : ((c.side = undefined), clear(c, false))))\n clear(root, true)\n return root\n}\n","/** Browser helpers shared by the diagram packages (not part of their typed API). */\n\n/** A PNG of an SVG picture, `scale` times its size (2: sharp on high-density screens). Browser only. */\nexport async function svgToPng(svg: string, scale = 2): Promise<Blob> {\n const size = (k: string) => Number(new RegExp(`<svg[^>]*\\\\s${k}=\"([\\\\d.]+)\"`).exec(svg)?.[1] ?? 0)\n const w = size('width')\n const h = size('height')\n if (!w || !h) throw new Error('Not a picture with a size')\n const img = new Image()\n img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n await img.decode()\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(w * scale))\n canvas.height = Math.max(1, Math.round(h * scale))\n const g = canvas.getContext('2d')\n if (!g) throw new Error('No 2D canvas')\n g.scale(scale, scale)\n g.drawImage(img, 0, 0, w, h)\n return new Promise((resolve, reject) => canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('PNG export failed'))), 'image/png'))\n}\n\n/** Puts pictures in an element (the SVG is built by the renderer: text escaped, no scripts or links). */\nexport function show(target: Element, svgs: string[]) {\n target.innerHTML = svgs.join('')\n}\n","/**\n * @p10node/plantuml: PlantUML text → SVG, with no DOM (browser, worker, Node, Bun), no server and no dependency.\n */\nimport { renderPlantUml } from '../../../src/core/diagram/plantuml'\nimport { show, svgToPng } from '../../diagram/src/dom'\n\n/** A drawing: a self-contained SVG document and its size in CSS pixels. */\nexport interface Diagram {\n svg: string\n width: number\n height: number\n}\n\n/** The source cannot be drawn (unsupported diagram kind, syntax the reader does not follow). */\nexport class DiagramError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DiagramError'\n }\n}\n\n/** Every drawing of a source (one per @startuml … @enduml block). */\nexport function renderEach(source: string): Diagram[] {\n try {\n return renderPlantUml(source).map((d) => ({ svg: d.svg, width: d.w, height: d.h }))\n } catch (e) {\n throw new DiagramError((e as Error).message)\n }\n}\n\n/** The (first) drawing of a source. */\nexport function render(source: string): Diagram {\n return renderEach(source)[0]\n}\n\n/** Draws a source into an element (its content is replaced). */\nexport function renderTo(target: Element, source: string): Diagram[] {\n const ds = renderEach(source)\n show(\n target,\n ds.map((d) => d.svg),\n )\n return ds\n}\n\n/** A PNG of a drawing's SVG, `scale` times its size. Browser only. */\nexport function toPng(svg: string, scale = 2): Promise<Blob> {\n return svgToPng(svg, scale)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["DiagramError","SIZE","lines","MARGIN","DiagramError","DiagramError","MARGIN","r2","DiagramError","DiagramError","layered","N","nodes","C","clusters","outs","isSource","i","reversed","edges","state","starts","k","s","stack","top","v","ei","w","sameGroup","g","E","flat","inE","outE","topo","deg","l","queue","rank","propagate","it","moved","order","lo","hi","win","wout","r","o","changed","minRank","a","b","maxRank","chain","out","c","lca","ca","cb","W","n","H","kind","cl","rk","loopX","owner","add","h","up","down","link","budget","chains","labelAt","span","lab","labelRank","dc","at","d","f","cMin","cMax","bl","br","borderChain","V","layers","seen","roots","pos","setPos","key","globalOrder","computeGlobal","sortLayer","layer","root","groups","group","settle","sum","cnt","slots","cs","j","flatten","crossings","total","ls","pairs","tree","le","bary","u","wt","nb","best","bestCross","goingDown","rankH","kids","startExt","endExt","extraStart","extraEnd","ry","height","half","sep","ka","kb","x","pav","off","bs","both","use","uw","L0","varOf","NV","val","adj","indeg","edge","done","pushed","minX","maxX","centre","portX","sides","step","outEdges","dir","t","p","q","pts","straight","band","slope","sec","s1","s2","h1","h2","segs","label","back","boxes","x0","x1","y0","y1","ASCII","charWidth","cp","textWidth","mono","ch","text","size","bold","lineHeight","measure","lines","wrap","line","max","cur","word","next","esc","NAMED","color","THEME","paint","Svg","y","rx","cx","cy","x2","y2","points","closed","lh","attrs","bg","pathData","cmds","labelText","name","m","e","DiagramError$1","GraphBuilder","defShape","id","patch","cluster","SIZE$1","SMALL","PX","PY","LH","lines$1","sectionSize","cols","row","nodeBox","across","ss","tw","th","nodePaint","drawNode","txt","svg","tx","ty","poly","rt","b2","drawSections","HEAD_LEN","unit","dx","dy","drawHead","nx","ny","side","col","head","many","trimEnd","last","end","start","len","c2","edgeColor","MARGIN$2","MAX_NODES","MAX_EDGES","renderGraph","clusterIdx","nodeIdx","parentOf","inCluster","resolve","leaving","labelled","loops","lnodes","spread","SPREAD","ledges","pad","lclusters","same","grp","titleH","LW","LH2","tr","depth","clusterBox","titles","z","cw","st","labels","geom","c1","lp","g2","cv","sample","clip","tail","dHead","first","dTail","tailStart","tl","midpoint","inside","list","atStart","dict","table","tokenize","src","lineStart","prev","plus","SHAPES","ARROWS","arrow","dflt","dotColor","hsv","htmlLabel","plainLabel","graph","recordRows","parseDot","toks","peek","isP","eat","kw","graphs","directed","nodeAttrs","anon","graphAttrs","clusterAttrs","attrList","nodeRef","scope","stmts","which","setGraph","ends","subgraph","from","to","sname","isCluster","parent","cid","style","applyEdge","applyNode","shapeName","rows","MARGIN$1","r2$1","renderPie","slices","a0","frac","a1","p0","p1","ly","lw","fmt","HOUR","DAY","pad2","renderGantt","tasks","t0","t1","sectW","chartW","scale","X","bottom","xa","fill","GAP_X","GAP_Y","renderTree","fs","circle","build","right","left","acc","place","yTop","sideSpan","ks","spanR","spanL","minY","maxY","all","walk","title","ox","oy","P","shape","tint","ink","r2","SequenceBuilder","SIZE","MSG","MLH","MARGIN","pbox","drawParticipant","textBelow","arrowHead","renderSequence","ps","idx","gap","leftExtra","rightExtra","need","have","num","count","deepest","frameRoom","width","headH","svgBack","svgMid","svgFront","active","bars","frames","open","ended","touch","actX","activate","deactivate","nw","numberBadge","footer","tab","frameP","el","lifeTop","renderModel","plantUmlBlocks","re","parsePlantUml","parseBlock","renderPlantUml","raw","clean","umlKind","activity","sequence","description","pText","skip","titleLines","inComment","has","KIND","calls","noteLines","note","rest","pid","as1","as2","who","msg","seqMessage","act","ARROW","dashed","headOf","ELEMENT","CLASSES","MARKS","END","LINK","info","ns","stackKinds","body","noteTarget","noteId","notes","element","ensure","target","nid","generic","stereo","ra","la","lm","l1","dirWord","l2","rm","lb","rz","hl","mem","ins","header","sections","desc","noteFor","sid","asTarget","rev","node","pendingLabel","exits","cond","block","put","stop","d2","bm","fork","wbs","clear","svgToPng","img","canvas","reject","show","svgs","DiagramError","message","renderEach","source","render","renderTo","ds","toPng"],"sources":["../../../src/core/diagram/layout.ts","../../../src/core/diagram/svg.ts","../../../src/core/diagram/graph.ts","../../../src/core/dict.ts","../../../src/core/diagram/dot.ts","../../../src/core/diagram/charts.ts","../../../src/core/diagram/sequence.ts","../../../src/core/diagram/model.ts","../../../src/core/diagram/plantuml.ts","../../diagram/src/dom.ts","../src/index.ts"],"sourcesContent":["/**\n * Layered (\"hierarchical\") graph layout, in the spirit of Sugiyama's method:\n * cycles broken by reversing DFS back edges → ranks (longest path, then each node moved to where its edges are\n * shortest) → long edges split by dummy nodes (edge labels ride on one) → crossings reduced by barycenter sweeps\n * that keep clusters contiguous → coordinates by weighted isotonic regression per rank (long edges pulled straight)\n * → clusters legalised so no foreign node falls inside a cluster's box.\n *\n * Works in \"layout space\": ranks go down (y), the order within a rank goes right (x). The caller turns LR / BT / RL\n * graphs by swapping or mirroring axes (and node sizes) on the way in and out.\n */\nimport type { Pt } from './svg'\n\nexport interface LNode {\n /** size across the rank (x) and along the rank axis (y) */\n w: number\n h: number\n /** innermost cluster, -1 for none */\n cluster: number\n /** extra room after the node in its rank (self loops) */\n loop?: number\n /** edges meeting a flat side spread out along it (boxes) instead of meeting at its middle */\n spread?: boolean\n}\n\nexport interface LEdge {\n v: number\n w: number\n minlen: number\n weight: number\n label?: { w: number; h: number }\n}\n\nexport interface LCluster {\n parent: number\n /** padding: cross start (left), cross end (right), rank start (top), rank end (bottom) */\n pad: [number, number, number, number]\n /** least width (the title) */\n minW: number\n}\n\nexport interface LayoutOpts {\n nodesep: number\n ranksep: number\n edgesep: number\n /** groups of nodes put on one rank (Graphviz rank=same) */\n sameRank?: number[][]\n}\n\nexport interface Seg {\n c: 'L' | 'C'\n p: Pt[]\n}\n\nexport interface EdgeGeom {\n start: Pt\n segs: Seg[]\n label?: Pt\n}\n\nexport interface Box {\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface LayoutOut {\n nodes: Pt[]\n /** null for self loops (the caller draws them) */\n edges: (EdgeGeom | null)[]\n /** null for a cluster without nodes */\n clusters: (Box | null)[]\n w: number\n h: number\n}\n\nconst REAL = 0\nconst DUMMY = 1\nconst LEFT = 2\nconst RIGHT = 3\n\ninterface Item {\n node: number\n cluster: number\n key: number\n idx: number\n items: Item[]\n}\n\nexport function layered(nodes: LNode[], edges: LEdge[], clusters: LCluster[], o: LayoutOpts): LayoutOut {\n const N = nodes.length\n const C = clusters.length\n\n // ---------------------------------------------------------------- 1. break cycles\n const outs: number[][] = Array.from({ length: N }, () => [])\n const isSource = new Array(N).fill(true)\n edges.forEach((e, i) => {\n if (e.v === e.w) return\n outs[e.v].push(i)\n isSource[e.w] = false\n })\n const reversed = new Array(edges.length).fill(false)\n const state = new Uint8Array(N)\n const starts = [...Array.from({ length: N }, (_, k) => k).filter((k) => isSource[k]), ...Array.from({ length: N }, (_, k) => k)]\n for (const s of starts) {\n if (state[s]) continue\n state[s] = 1\n const stack: [number, number][] = [[s, 0]]\n while (stack.length) {\n const top = stack[stack.length - 1]\n const v = top[0]\n if (top[1] < outs[v].length) {\n const ei = outs[v][top[1]++]\n const w = edges[ei].w\n if (state[w] === 1) reversed[ei] = true\n else if (!state[w]) {\n state[w] = 1\n stack.push([w, 0])\n }\n } else {\n state[v] = 2\n stack.pop()\n }\n }\n }\n const sameGroup = new Map<number, number>()\n o.sameRank?.forEach((g, k) => g.forEach((v) => sameGroup.set(v, k)))\n const E = edges.map((e, i) => {\n const flat = sameGroup.has(e.v) && sameGroup.get(e.v) === sameGroup.get(e.w)\n return reversed[i] ? { v: e.w, w: e.v, minlen: flat ? 0 : e.minlen, weight: e.weight } : { v: e.v, w: e.w, minlen: flat ? 0 : e.minlen, weight: e.weight }\n })\n\n // ---------------------------------------------------------------- 2. ranks\n const inE: number[][] = Array.from({ length: N }, () => [])\n const outE: number[][] = Array.from({ length: N }, () => [])\n E.forEach((e, i) => {\n if (e.v === e.w) return\n outE[e.v].push(i)\n inE[e.w].push(i)\n })\n const topo: number[] = []\n {\n const deg = inE.map((l) => l.length)\n const queue = Array.from({ length: N }, (_, k) => k).filter((k) => !deg[k])\n while (queue.length) {\n const v = queue.shift()!\n topo.push(v)\n for (const ei of outE[v]) if (!--deg[E[ei].w]) queue.push(E[ei].w)\n }\n // (a cycle left by minlen-0 edges between same-rank nodes: keep the rest in input order)\n if (topo.length < N) for (let k = 0; k < N; k++) if (!topo.includes(k)) topo.push(k)\n }\n const rank = new Array(N).fill(0)\n const propagate = () => {\n for (const v of topo) for (const ei of outE[v]) rank[E[ei].w] = Math.max(rank[E[ei].w], rank[v] + E[ei].minlen)\n }\n propagate()\n for (let it = 0; it < 60; it++) {\n let moved = false\n const order = it % 2 ? [...topo].reverse() : topo\n for (const v of order) {\n if (sameGroup.has(v)) continue\n let lo = -Infinity\n let hi = Infinity\n let win = 0\n let wout = 0\n for (const ei of inE[v]) {\n lo = Math.max(lo, rank[E[ei].v] + E[ei].minlen)\n win += E[ei].weight\n }\n for (const ei of outE[v]) {\n hi = Math.min(hi, rank[E[ei].w] - E[ei].minlen)\n wout += E[ei].weight\n }\n let r = rank[v]\n if (win > wout && lo > -Infinity) r = lo\n else if (wout > win && hi < Infinity) r = hi\n if (r !== rank[v]) {\n rank[v] = r\n moved = true\n }\n }\n if (!moved) break\n }\n if (o.sameRank?.length) {\n for (let it = 0; it < 12; it++) {\n let changed = false\n for (const g of o.sameRank) {\n const r = Math.max(...g.map((v) => rank[v]))\n for (const v of g) if (rank[v] !== r) {\n rank[v] = r\n changed = true\n }\n }\n propagate()\n if (!changed) break\n }\n }\n const minRank = rank.reduce((a, b) => Math.min(a, b), 0)\n for (let v = 0; v < N; v++) rank[v] -= minRank\n let maxRank = rank.reduce((a, b) => Math.max(a, b), 0)\n\n // ---------------------------------------------------------------- 3. dummies, cluster borders\n const chain = (c: number) => {\n const out: number[] = []\n for (let k = c; k >= 0; k = clusters[k].parent) out.unshift(k)\n return out\n }\n const lca = (a: number, b: number) => {\n const ca = chain(a)\n const cb = chain(b)\n let k = 0\n while (k < ca.length && k < cb.length && ca[k] === cb[k]) k++\n return k ? ca[k - 1] : -1\n }\n const W: number[] = nodes.map((n) => n.w)\n const H: number[] = nodes.map((n) => n.h)\n const kind: number[] = nodes.map(() => REAL)\n const cl: number[] = nodes.map((n) => n.cluster)\n const rk: number[] = [...rank]\n const loopX: number[] = nodes.map((n) => n.loop ?? 0)\n const owner: number[] = nodes.map(() => -1)\n const add = (w: number, h: number, k: number, c: number, r: number) => {\n W.push(w)\n H.push(h)\n kind.push(k)\n cl.push(c)\n rk.push(r)\n loopX.push(0)\n owner.push(k === LEFT || k === RIGHT ? c : -1)\n return W.length - 1\n }\n /** neighbours with weights: up (rank - 1) and down (rank + 1) */\n const up: [number, number][][] = []\n const down: [number, number][][] = []\n const link = (a: number, b: number, w: number) => {\n while (up.length < W.length) {\n up.push([])\n down.push([])\n }\n down[a].push([b, w])\n up[b].push([a, w])\n }\n // long edges cost a node per rank they cross: past this the picture is unreadable anyway\n let budget = 60000\n for (const e of E) budget -= Math.max(0, Math.abs(rank[e.w] - rank[e.v]) - 1)\n if (budget < 0) throw new Error('The diagram is too large to draw')\n const chains: (number[] | null)[] = []\n const labelAt: number[] = []\n E.forEach((e, i) => {\n if (e.v === e.w) {\n chains.push(null)\n labelAt.push(-1)\n return\n }\n const c = [e.v]\n const span = rank[e.w] - rank[e.v]\n const lab = edges[i].label\n const labelRank = lab && span >= 2 ? rank[e.v] + Math.floor(span / 2) : -1\n const dc = lca(cl[e.v], cl[e.w])\n let at = -1\n for (let r = rank[e.v] + 1; r < rank[e.w]; r++) {\n const d = r === labelRank ? add(lab!.w, lab!.h, DUMMY, dc, r) : add(0, 0, DUMMY, dc, r)\n if (r === labelRank) at = d\n c.push(d)\n }\n c.push(e.w)\n chains.push(span > 0 ? c : null)\n labelAt.push(at)\n for (let k = 0; k + 1 < c.length; k++) {\n if (span <= 0) break\n const a = c[k]\n const b = c[k + 1]\n const f = (kind[a] === DUMMY ? 1 : 0) + (kind[b] === DUMMY ? 1 : 0)\n link(a, b, e.weight * (f === 2 ? 8 : f === 1 ? 2 : 1))\n }\n })\n // flat edges (same rank): not part of the layering\n const flat = E.map((e, i) => e.v !== e.w && rank[e.v] === rank[e.w] && !chains[i])\n\n const cMin = new Array(C).fill(Infinity)\n const cMax = new Array(C).fill(-Infinity)\n for (let v = 0; v < W.length; v++) {\n for (const c of chain(cl[v])) {\n cMin[c] = Math.min(cMin[c], rk[v])\n cMax[c] = Math.max(cMax[c], rk[v])\n }\n }\n const bl: number[][] = Array.from({ length: C }, () => [])\n const br: number[][] = Array.from({ length: C }, () => [])\n const borderChain: [number, number][][] = []\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n for (let r = cMin[c]; r <= cMax[c]; r++) {\n bl[c][r] = add(0, 0, LEFT, c, r)\n br[c][r] = add(0, 0, RIGHT, c, r)\n }\n }\n while (up.length < W.length) {\n up.push([])\n down.push([])\n }\n for (let v = 0; v < W.length; v++) borderChain.push([])\n for (let c = 0; c < C; c++) {\n for (let r = cMin[c]; r < cMax[c]; r++) {\n borderChain[bl[c][r]].push([bl[c][r + 1], 1])\n borderChain[bl[c][r + 1]].push([bl[c][r], 1])\n borderChain[br[c][r]].push([br[c][r + 1], 1])\n borderChain[br[c][r + 1]].push([br[c][r], 1])\n }\n }\n const V = W.length\n maxRank = rk.reduce((a, b) => Math.max(a, b), maxRank)\n\n // ---------------------------------------------------------------- 4. order within ranks\n let layers: number[][] = Array.from({ length: maxRank + 1 }, () => [])\n {\n const seen = new Uint8Array(V)\n const roots = Array.from({ length: V }, (_, k) => k)\n .filter((k) => kind[k] !== LEFT && kind[k] !== RIGHT)\n .sort((a, b) => rk[a] - rk[b] || a - b)\n for (const s of roots) {\n if (seen[s]) continue\n const stack = [s]\n while (stack.length) {\n const v = stack.pop()!\n if (seen[v]) continue\n seen[v] = 1\n layers[rk[v]].push(v)\n for (let k = down[v].length - 1; k >= 0; k--) if (!seen[down[v][k][0]]) stack.push(down[v][k][0])\n }\n }\n for (let v = 0; v < V; v++) if (kind[v] === LEFT || kind[v] === RIGHT) layers[rk[v]].push(v)\n }\n const pos = new Float64Array(V)\n const setPos = () => layers.forEach((l) => l.forEach((v, k) => (pos[v] = k)))\n setPos()\n const key = new Float64Array(V)\n const globalOrder = new Float64Array(C)\n const computeGlobal = () => {\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n let s = 0\n for (let r = cMin[c]; r <= cMax[c]; r++) s += pos[bl[c][r]] / Math.max(1, layers[r].length)\n globalOrder[c] = s / (cMax[c] - cMin[c] + 1)\n }\n }\n const sortLayer = (layer: number[], r: number): number[] => {\n if (!C) return [...layer].sort((a, b) => key[a] - key[b] || pos[a] - pos[b])\n const root: Item = { node: -1, cluster: -1, key: 0, idx: 0, items: [] }\n const groups = new Map<number, Item>()\n const group = (c: number): Item => {\n if (c < 0) return root\n let g = groups.get(c)\n if (!g) {\n g = { node: -1, cluster: c, key: 0, idx: pos[bl[c][r]] ?? 0, items: [] }\n groups.set(c, g)\n group(clusters[c].parent).items.push(g)\n }\n return g\n }\n for (const v of layer) {\n if (kind[v] === LEFT) group(owner[v])\n else if (kind[v] !== RIGHT) group(cl[v]).items.push({ node: v, cluster: -1, key: key[v], idx: pos[v], items: [] })\n }\n const settle = (g: Item): [number, number] => {\n let sum = 0\n let cnt = 0\n for (const it of g.items) {\n if (it.node >= 0) {\n sum += it.key\n cnt++\n } else {\n const [s, n] = settle(it)\n sum += s\n cnt += n\n }\n }\n if (g.cluster >= 0) g.key = cnt ? sum / cnt : key[bl[g.cluster][r]]\n g.items.sort((a, b) => a.key - b.key || a.idx - b.idx)\n // sibling clusters keep one left-to-right order on every rank\n const slots = g.items.map((it, k) => (it.cluster >= 0 ? k : -1)).filter((k) => k >= 0)\n const cs = slots.map((k) => g.items[k]).sort((a, b) => globalOrder[a.cluster] - globalOrder[b.cluster])\n slots.forEach((k, j) => (g.items[k] = cs[j]))\n return [sum, cnt]\n }\n settle(root)\n const out: number[] = []\n const flatten = (g: Item) => {\n for (const it of g.items) {\n if (it.node >= 0) out.push(it.node)\n else {\n out.push(bl[it.cluster][r])\n flatten(it)\n out.push(br[it.cluster][r])\n }\n }\n }\n flatten(root)\n return out\n }\n const crossings = (ls: number[][]): number => {\n let total = 0\n for (let r = 0; r + 1 < ls.length; r++) {\n const pairs: [number, number][] = []\n for (const v of ls[r]) for (const [w] of down[v]) pairs.push([pos[v], pos[w]])\n pairs.sort((a, b) => a[0] - b[0] || a[1] - b[1])\n const n = ls[r + 1].length + 1\n const tree = new Float64Array(n + 1)\n for (let k = 0; k < pairs.length; k++) {\n // count earlier pairs with a larger bottom position\n let le = 0\n for (let i = pairs[k][1] + 1; i > 0; i -= i & -i) le += tree[i]\n total += k - le\n for (let i = pairs[k][1] + 1; i <= n; i += i & -i) tree[i]++\n }\n }\n return total\n }\n const bary = (v: number, nb: [number, number][][]) => {\n let s = 0\n let w = 0\n for (const [u, wt] of nb[v]) {\n s += pos[u] * wt\n w += wt\n }\n return w ? s / w : pos[v]\n }\n for (const l of layers) {\n for (const v of l) key[v] = pos[v]\n }\n computeGlobal()\n layers = layers.map((l, r) => sortLayer(l, r))\n setPos()\n let best = layers.map((l) => [...l])\n let bestCross = crossings(layers)\n for (let it = 0; it < 24 && bestCross > 0; it++) {\n computeGlobal()\n const goingDown = it % 2 === 0\n for (let k = 1; k <= maxRank; k++) {\n const r = goingDown ? k : maxRank - k\n const nb = goingDown ? up : down\n for (const v of layers[r]) key[v] = bary(v, nb)\n layers[r] = sortLayer(layers[r], r)\n layers[r].forEach((v, j) => (pos[v] = j))\n }\n const c = crossings(layers)\n if (c < bestCross) {\n bestCross = c\n best = layers.map((l) => [...l])\n }\n }\n layers = best\n setPos()\n\n // ---------------------------------------------------------------- 5. rank positions\n const rankH = layers.map((l) => l.reduce((a, v) => Math.max(a, H[v]), 0))\n const kids: number[][] = Array.from({ length: C }, () => [])\n clusters.forEach((c, k) => c.parent >= 0 && kids[c.parent].push(k))\n const startExt = (c: number): number => clusters[c].pad[2] + Math.max(0, ...kids[c].filter((k) => cMin[k] === cMin[c]).map(startExt))\n const endExt = (c: number): number => clusters[c].pad[3] + Math.max(0, ...kids[c].filter((k) => cMax[k] === cMax[c]).map(endExt))\n const extraStart = new Array(maxRank + 1).fill(0)\n const extraEnd = new Array(maxRank + 1).fill(0)\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n extraStart[cMin[c]] = Math.max(extraStart[cMin[c]], startExt(c))\n extraEnd[cMax[c]] = Math.max(extraEnd[cMax[c]], endExt(c))\n }\n const ry: number[] = []\n for (let r = 0; r <= maxRank; r++) {\n ry[r] = r === 0 ? rankH[0] / 2 + extraStart[0] : ry[r - 1] + rankH[r - 1] / 2 + extraEnd[r - 1] + o.ranksep + extraStart[r] + rankH[r] / 2\n }\n const height = ry[maxRank] + rankH[maxRank] / 2 + extraEnd[maxRank]\n\n // ---------------------------------------------------------------- 6. coordinates across ranks\n const half = (v: number) => (kind[v] === LEFT || kind[v] === RIGHT ? 0 : W[v] / 2)\n const sep = (a: number, b: number) => {\n let g = loopX[a]\n const ka = kind[a]\n const kb = kind[b]\n if (ka === LEFT) g += clusters[owner[a]].pad[0]\n if (ka === RIGHT) g += o.nodesep / 2\n if (kb === RIGHT) g += clusters[owner[b]].pad[1]\n if (kb === LEFT) g += o.nodesep / 2\n if (ka < LEFT && kb < LEFT) g += ka === DUMMY && kb === DUMMY ? o.edgesep : ka === DUMMY || kb === DUMMY ? (o.nodesep + o.edgesep) / 2 : o.nodesep\n return half(a) + half(b) + g\n }\n const x = new Float64Array(V)\n for (const l of layers) for (let k = 1; k < l.length; k++) x[l[k]] = x[l[k - 1]] + sep(l[k - 1], l[k])\n const pav = (layer: number[], d: number[], wt: number[]) => {\n const n = layer.length\n const off = [0]\n for (let k = 1; k < n; k++) off[k] = off[k - 1] + sep(layer[k - 1], layer[k])\n const bs: { s: number; e: number; w: number; wt: number }[] = []\n for (let k = 0; k < n; k++) {\n bs.push({ s: k, e: k, w: wt[k], wt: wt[k] * (d[k] - off[k]) })\n while (bs.length > 1) {\n const a = bs[bs.length - 2]\n const b = bs[bs.length - 1]\n if (a.wt / a.w < b.wt / b.w) break\n a.e = b.e\n a.w += b.w\n a.wt += b.wt\n bs.pop()\n }\n }\n for (const b of bs) for (let k = b.s; k <= b.e; k++) x[layer[k]] = b.wt / b.w + off[k]\n }\n const ITER = 10\n for (let it = 0; it < ITER; it++) {\n const both = it >= ITER - 2\n const goingDown = it % 2 === 0\n for (let k = 0; k <= maxRank; k++) {\n const r = goingDown ? k : maxRank - k\n const l = layers[r]\n if (!l.length) continue\n const d: number[] = []\n const wt: number[] = []\n for (const v of l) {\n let s = 0\n let w = 0\n const use = (nb: [number, number][]) => {\n for (const [u, uw] of nb) {\n s += x[u] * uw\n w += uw\n }\n }\n if (both || goingDown) use(up[v])\n if (both || !goingDown) use(down[v])\n use(borderChain[v])\n d.push(w ? s / w : x[v])\n wt.push(w || 0.01)\n }\n pav(l, d, wt)\n }\n }\n // legalise clusters: one left and one right border per cluster on every rank it spans\n const L0 = V\n const varOf = (v: number) => (kind[v] === LEFT ? L0 + 2 * owner[v] : kind[v] === RIGHT ? L0 + 2 * owner[v] + 1 : v)\n if (C) {\n const NV = V + 2 * C\n const val = new Float64Array(NV)\n for (let v = 0; v < V; v++) val[v] = x[v]\n for (let c = 0; c < C; c++) {\n val[L0 + 2 * c] = Infinity\n val[L0 + 2 * c + 1] = -Infinity\n }\n for (let v = 0; v < V; v++) {\n if (kind[v] === LEFT) val[varOf(v)] = Math.min(val[varOf(v)], x[v])\n if (kind[v] === RIGHT) val[varOf(v)] = Math.max(val[varOf(v)], x[v])\n }\n const adj: [number, number][][] = Array.from({ length: NV }, () => [])\n const indeg = new Int32Array(NV)\n const edge = (a: number, b: number, s: number) => {\n adj[a].push([b, s])\n indeg[b]++\n }\n for (const l of layers) for (let k = 1; k < l.length; k++) edge(varOf(l[k - 1]), varOf(l[k]), sep(l[k - 1], l[k]))\n for (let c = 0; c < C; c++) if (cMin[c] <= cMax[c]) edge(L0 + 2 * c, L0 + 2 * c + 1, Math.max(clusters[c].minW, clusters[c].pad[0] + clusters[c].pad[1]))\n const queue: number[] = []\n for (let v = 0; v < NV; v++) if (!indeg[v]) queue.push(v)\n let done = 0\n const pushed = new Float64Array(val)\n while (queue.length) {\n const v = queue.pop()!\n done++\n for (const [w, s] of adj[v]) {\n if (Number.isFinite(pushed[v])) pushed[w] = Math.max(pushed[w], pushed[v] + s)\n if (!--indeg[w]) queue.push(w)\n }\n }\n if (done === NV) for (let v = 0; v < V; v++) x[v] = pushed[varOf(v)]\n }\n let minX = Infinity\n let maxX = -Infinity\n for (let v = 0; v < V; v++) {\n minX = Math.min(minX, x[v] - half(v))\n maxX = Math.max(maxX, x[v] + half(v) + loopX[v])\n }\n if (!Number.isFinite(minX)) minX = maxX = 0\n for (let v = 0; v < V; v++) x[v] -= minX\n\n // ---------------------------------------------------------------- 7. output\n const centre = (v: number): Pt => ({ x: x[v], y: ry[rk[v]] })\n // where each edge meets its end nodes: the middle of the side, or spread along a box's side by the order of what\n // the edges lead to (the next point on the edge)\n const portX = new Map<string, number>()\n {\n const sides = new Map<string, { i: number; nx: number }[]>()\n const at = (key: string, i: number, nx: number) => {\n let l = sides.get(key)\n if (!l) sides.set(key, (l = []))\n l.push({ i, nx })\n }\n E.forEach((_, i) => {\n const c = chains[i]\n if (!c || flat[i]) return\n if (nodes[c[0]]?.spread) at(`${c[0]}:b`, i, x[c[1]])\n if (nodes[c[c.length - 1]]?.spread) at(`${c[c.length - 1]}:t`, i, x[c[c.length - 2]])\n })\n for (const [key, l] of sides) {\n if (l.length < 2) continue\n const v = Number(key.split(':')[0])\n l.sort((a, b) => a.nx - b.nx || a.i - b.i)\n const step = Math.min(36, (W[v] * 0.7) / (l.length - 1))\n l.forEach((it, k) => portX.set(`${key}:${it.i}`, x[v] + (k - (l.length - 1) / 2) * step))\n }\n }\n const outEdges: (EdgeGeom | null)[] = E.map((e, i) => {\n if (e.v === e.w) return null\n if (flat[i]) {\n const a = centre(e.v)\n const b = centre(e.w)\n const dir = Math.sign(b.x - a.x) || 1\n const s = { x: a.x + (dir * W[e.v]) / 2, y: a.y }\n const t = { x: b.x - (dir * W[e.w]) / 2, y: b.y }\n const [p, q] = reversed[i] ? [t, s] : [s, t]\n return { start: p, segs: [{ c: 'L', p: [q] }], label: edges[i].label ? { x: (p.x + q.x) / 2, y: p.y - 10 } : undefined }\n }\n const c = chains[i]\n if (!c) return null\n const pts: Pt[] = []\n const straight: boolean[] = []\n const a = centre(c[0])\n pts.push({ x: portX.get(`${c[0]}:b:${i}`) ?? a.x, y: a.y + H[c[0]] / 2 })\n for (let k = 1; k + 1 < c.length; k++) {\n const p = centre(c[k])\n const band = rankH[rk[c[k]]] / 2\n if (band > 0.5) {\n pts.push({ x: p.x, y: p.y - band }, { x: p.x, y: p.y + band })\n straight.push(false, true)\n } else {\n pts.push(p)\n straight.push(false)\n }\n }\n const b = centre(c[c.length - 1])\n pts.push({ x: portX.get(`${c[c.length - 1]}:t:${i}`) ?? b.x, y: b.y - H[c[c.length - 1]] / 2 })\n straight.push(false)\n // one smooth curve through the waypoints, the across coordinate a function of the rank coordinate: square-on at\n // the ports and at a straight piece, a monotone (Fritsch–Carlson) slope at the other waypoints, so the curve never\n // swings out past one (a dummy next to an end would otherwise bend the whole offset into a short piece)\n const n = pts.length\n const slope = new Array<number>(n).fill(0)\n const sec = (k: number) => (pts[k + 1].x - pts[k].x) / Math.max(0.5, pts[k + 1].y - pts[k].y)\n for (let k = 1; k + 1 < n; k++) {\n if (straight[k - 1] || straight[k]) continue\n const s1 = sec(k - 1)\n const s2 = sec(k)\n if (s1 * s2 <= 0) continue\n const h1 = pts[k].y - pts[k - 1].y\n const h2 = pts[k + 1].y - pts[k].y\n slope[k] = (3 * (h1 + h2)) / ((2 * h2 + h1) / s1 + (h2 + 2 * h1) / s2)\n }\n const segs: Seg[] = []\n for (let k = 1; k < n; k++) {\n const p = pts[k - 1]\n const q = pts[k]\n const h = (q.y - p.y) / 3\n if (straight[k - 1] || (Math.abs(p.x - q.x) < 0.5 && !slope[k - 1] && !slope[k])) segs.push({ c: 'L', p: [q] })\n else segs.push({ c: 'C', p: [{ x: p.x + slope[k - 1] * h, y: p.y + h }, { x: q.x - slope[k] * h, y: q.y - h }, q] })\n }\n const label = labelAt[i] >= 0 ? centre(labelAt[i]) : undefined\n if (!reversed[i]) return { start: pts[0], segs, label }\n // drawn from the other end: the pieces in reverse, each cubic's control points swapped\n const back: Seg[] = []\n for (let k = n - 1; k >= 1; k--) {\n const s = segs[k - 1]\n back.push(s.c === 'C' ? { c: 'C', p: [s.p[1], s.p[0], pts[k - 1]] } : { c: 'L', p: [pts[k - 1]] })\n }\n return { start: pts[n - 1], segs: back, label }\n })\n const boxes: (Box | null)[] = clusters.map((_, c) => {\n if (cMin[c] > cMax[c]) return null\n let x0 = Infinity\n let x1 = -Infinity\n for (let r = cMin[c]; r <= cMax[c]; r++) {\n x0 = Math.min(x0, x[bl[c][r]])\n x1 = Math.max(x1, x[br[c][r]])\n }\n const y0 = ry[cMin[c]] - rankH[cMin[c]] / 2 - startExt(c)\n const y1 = ry[cMax[c]] + rankH[cMax[c]] / 2 + endExt(c)\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 }\n })\n return {\n nodes: Array.from({ length: N }, (_, v) => centre(v)),\n edges: outEdges,\n clusters: boxes,\n w: maxX - minX,\n h: height,\n }\n}\n","/**\n * SVG output for the diagram renderers: text metrics (no DOM: the worker has none), escaping, colors and a small\n * builder. Pictures are self-contained (no scripts, links, external references, markers or CSS) so they show the\n * same in an <img>, in Word and in a PDF export.\n */\n\nexport const FONT = 'Helvetica, Arial, sans-serif'\nexport const MONO = 'Menlo, Consolas, \"Courier New\", monospace'\n\n/** Helvetica advance widths (1/1000 em), U+0020 to U+007E */\nconst ASCII = [\n 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556,\n 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556,\n 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584,\n]\n\nfunction charWidth(cp: number): number {\n if (cp >= 0x20 && cp <= 0x7e) return ASCII[cp - 0x20]\n // combining marks (Vietnamese tones…), zero-width characters\n if ((cp >= 0x300 && cp <= 0x36f) || (cp >= 0x200b && cp <= 0x200f) || cp === 0xfe0f) return 0\n // CJK, Hangul, kana, full-width forms, emoji\n if ((cp >= 0x1100 && cp <= 0x115f) || (cp >= 0x2e80 && cp <= 0xa4cf) || (cp >= 0xac00 && cp <= 0xd7a3) || (cp >= 0xf900 && cp <= 0xfaff) || (cp >= 0xfe30 && cp <= 0xfe4f) || (cp >= 0xff00 && cp <= 0xff60) || cp >= 0x1f000) return 1000\n return 580\n}\n\n/** Width in px of one line of text at `size` px. */\nexport function textWidth(text: string, size = 14, bold = false, mono = false): number {\n let w = 0\n if (mono) {\n for (const ch of text) w += charWidth(ch.codePointAt(0)!) ? 600 : 0\n } else for (const ch of text) w += charWidth(ch.codePointAt(0)!)\n return (w * size * (bold ? 1.08 : 1)) / 1000\n}\n\nexport const lineHeight = (size: number) => Math.round(size * 1.3)\n\n/** Size of a block of lines. */\nexport function measure(lines: string[], size = 14, bold = false): { w: number; h: number } {\n let w = 0\n for (const l of lines) w = Math.max(w, textWidth(l, size, bold))\n return { w, h: lines.length * lineHeight(size) }\n}\n\n/** Breaks lines longer than `max` px at spaces. */\nexport function wrap(lines: string[], max: number, size = 14, bold = false): string[] {\n const out: string[] = []\n for (const line of lines) {\n if (textWidth(line, size, bold) <= max) {\n out.push(line)\n continue\n }\n let cur = ''\n for (const word of line.split(/ +/)) {\n const next = cur ? cur + ' ' + word : word\n if (cur && textWidth(next, size, bold) > max) {\n out.push(cur)\n cur = word\n } else cur = next\n }\n out.push(cur)\n }\n return out\n}\n\nexport const esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n\nconst NAMED = /^[a-z]{3,24}$/\n\n/** A color from the source, or undefined when it is not one a picture can carry safely (#rgb, rgb(), a name). */\nexport function color(c: string | undefined): string | undefined {\n if (!c) return undefined\n const v = c.trim().toLowerCase()\n if (/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(v)) return v\n if (/^[0-9a-f]{6}$/.test(v)) return '#' + v\n if (/^rgba?\\(\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*(,\\s*[\\d.]+%?\\s*)?\\)$/.test(v)) return v\n if (/^rgba?\\(\\s*[\\d.]+%?\\s+[\\d.]+%?\\s+[\\d.]+%?\\s*(\\/\\s*[\\d.]+%?\\s*)?\\)$/.test(v)) return v\n if (NAMED.test(v)) return v === 'transparent' ? 'none' : v\n return undefined\n}\n\nexport const THEME = {\n ink: '#1f2937',\n line: '#4b5563',\n fill: '#eef2fb',\n stroke: '#5b6f9a',\n muted: '#6b7280',\n cluster: '#f7f8fb',\n clusterStroke: '#a3adc2',\n note: '#fff6c8',\n noteStroke: '#c9a227',\n label: '#ffffff',\n dark: '#2d3748',\n /** categorical series: pie slices, gantt sections */\n series: ['#5b8def', '#f2994a', '#3fb68b', '#e5596b', '#9b6be0', '#d4b33a', '#3bb3c9', '#e07bb8', '#8c9aaf', '#7cbd4a'],\n}\n\nexport interface Paint {\n fill?: string\n stroke?: string\n sw?: number\n dash?: string\n opacity?: number\n}\n\nconst n = (v: number) => (Number.isFinite(v) ? Math.round(v * 100) / 100 : 0)\n\nfunction paint(p: Paint): string {\n let a = ` fill=\"${p.fill ?? 'none'}\"`\n if (p.stroke) a += ` stroke=\"${p.stroke}\" stroke-width=\"${n(p.sw ?? 1)}\"`\n if (p.stroke && p.dash) a += ` stroke-dasharray=\"${p.dash}\"`\n if (p.opacity !== undefined) a += ` opacity=\"${n(p.opacity)}\"`\n return a\n}\n\nexport interface TextOpts {\n size?: number\n anchor?: 'start' | 'middle' | 'end'\n bold?: boolean\n italic?: boolean\n underline?: boolean\n color?: string\n mono?: boolean\n}\n\nexport class Svg {\n private out: string[] = []\n\n rect(x: number, y: number, w: number, h: number, p: Paint, rx = 0): this {\n this.out.push(`<rect x=\"${n(x)}\" y=\"${n(y)}\" width=\"${n(w)}\" height=\"${n(h)}\"${rx ? ` rx=\"${n(rx)}\"` : ''}${paint(p)}/>`)\n return this\n }\n\n circle(cx: number, cy: number, r: number, p: Paint): this {\n this.out.push(`<circle cx=\"${n(cx)}\" cy=\"${n(cy)}\" r=\"${n(r)}\"${paint(p)}/>`)\n return this\n }\n\n ellipse(cx: number, cy: number, rx: number, ry: number, p: Paint): this {\n this.out.push(`<ellipse cx=\"${n(cx)}\" cy=\"${n(cy)}\" rx=\"${n(rx)}\" ry=\"${n(ry)}\"${paint(p)}/>`)\n return this\n }\n\n line(x1: number, y1: number, x2: number, y2: number, p: Paint): this {\n this.out.push(`<line x1=\"${n(x1)}\" y1=\"${n(y1)}\" x2=\"${n(x2)}\" y2=\"${n(y2)}\"${paint(p)}/>`)\n return this\n }\n\n poly(points: [number, number][], p: Paint, closed = true): this {\n const pts = points.map(([x, y]) => `${n(x)},${n(y)}`).join(' ')\n this.out.push(`<${closed ? 'polygon' : 'polyline'} points=\"${pts}\"${paint(p)}/>`)\n return this\n }\n\n /** `d` uses numbers rounded by the caller (see `pathData`) */\n path(d: string, p: Paint): this {\n this.out.push(`<path d=\"${d}\"${paint(p)}/>`)\n return this\n }\n\n /** Lines of text, the block centered vertically on `y`. */\n text(x: number, y: number, lines: string[] | string, o: TextOpts = {}): this {\n const ls = typeof lines === 'string' ? [lines] : lines\n const size = o.size ?? 14\n const lh = lineHeight(size)\n const top = y - (ls.length * lh) / 2\n let attrs = ` font-family=\"${esc(o.mono ? MONO : FONT)}\" font-size=\"${size}\" fill=\"${o.color ?? THEME.ink}\"`\n if (o.anchor && o.anchor !== 'start') attrs += ` text-anchor=\"${o.anchor}\"`\n if (o.bold) attrs += ' font-weight=\"bold\"'\n if (o.italic) attrs += ' font-style=\"italic\"'\n if (o.underline) attrs += ' text-decoration=\"underline\"'\n ls.forEach((l, k) => {\n if (!l) return\n // baseline: the middle of the line box plus about a third of the font size\n this.out.push(`<text x=\"${n(x)}\" y=\"${n(top + k * lh + lh / 2 + size * 0.35)}\"${attrs}>${esc(l)}</text>`)\n })\n return this\n }\n\n raw(s: string): this {\n this.out.push(s)\n return this\n }\n\n /** the elements drawn so far */\n body(): string {\n return this.out.join('')\n }\n\n /** The picture; `bg` paints the canvas. */\n toString(w: number, h: number, bg = '#ffffff'): string {\n const W = Math.ceil(w)\n const H = Math.ceil(h)\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${W}\" height=\"${H}\" viewBox=\"0 0 ${W} ${H}\">` +\n (bg ? `<rect x=\"0\" y=\"0\" width=\"${W}\" height=\"${H}\" fill=\"${bg}\"/>` : '') +\n this.out.join('') +\n '</svg>'\n )\n }\n}\n\nexport type Pt = { x: number; y: number }\n\nexport function pathData(cmds: { c: 'M' | 'L' | 'C' | 'Q'; p: Pt[] }[]): string {\n return cmds.map((k) => k.c + k.p.map((q) => `${n(q.x)} ${n(q.y)}`).join(' ')).join(' ')\n}\n\n/** Mermaid / PlantUML / DOT label text: entity codes, <br>, markdown-string quotes, tags dropped. */\nexport function labelText(s: string): string {\n return s\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/\\\\n/g, '\\n')\n .replace(/<\\/?[a-z][^>]*>/gi, '')\n .replace(/#(\\d+);/g, (_, d: string) => String.fromCodePoint(Math.min(Number(d), 0x10ffff)))\n .replace(/#([a-z]+);/gi, (m, name: string) => ({ quot: '\"', amp: '&', lt: '<', gt: '>', nbsp: ' ', apos: \"'\" })[name.toLowerCase()] ?? m)\n .replace(/&(quot|amp|lt|gt|nbsp|apos|#\\d+);/g, (m, e: string) =>\n e[0] === '#' ? String.fromCodePoint(Math.min(Number(e.slice(1)), 0x10ffff)) : (({ quot: '\"', amp: '&', lt: '<', gt: '>', nbsp: ' ', apos: \"'\" }) as Record<string, string>)[e] ?? m,\n )\n}\n\n/** Mermaid \"`markdown string`\": the text without the markup */\nexport const unMarkdown = (s: string) => s.replace(/\\*\\*(.+?)\\*\\*|__(.+?)__/g, '$1$2').replace(/(^|\\W)[*_](\\S.*?\\S|\\S)[*_](?=\\W|$)/g, '$1$2')\n\nexport class DiagramError extends Error {}\n","/**\n * Node-and-edge diagrams (flowcharts, class, state, ER, use case, component diagrams, Graphviz graphs): the model the\n * parsers build, node sizes and shapes, and the picture from the layered layout.\n */\nimport { layered, type EdgeGeom, type LCluster, type LEdge, type LNode, type Seg } from './layout'\nimport { DiagramError, lineHeight, measure, pathData, Svg, textWidth, THEME, wrap, type Pt } from './svg'\n\nexport type Dir = 'TB' | 'BT' | 'LR' | 'RL'\n\nexport type Shape =\n | 'rect'\n | 'round'\n | 'stadium'\n | 'subroutine'\n | 'cylinder'\n | 'circle'\n | 'doublecircle'\n | 'ellipse'\n | 'diamond'\n | 'hexagon'\n | 'lean-r'\n | 'lean-l'\n | 'trap-b'\n | 'trap-t'\n | 'flag'\n | 'note'\n | 'folder'\n | 'component'\n | 'box3d'\n | 'cloud'\n | 'octagon'\n | 'triangle'\n | 'actor'\n | 'start'\n | 'end'\n | 'bar'\n | 'point'\n | 'none'\n\nexport type Head = 'none' | 'arrow' | 'open' | 'triangle' | 'diamond' | 'odiamond' | 'circle' | 'ocircle' | 'cross' | 'one' | 'zero-one' | 'one-many' | 'zero-many' | 'many'\n\nexport interface NodeStyle {\n fill?: string\n stroke?: string\n color?: string\n dash?: string\n sw?: number\n bold?: boolean\n italic?: boolean\n hidden?: boolean\n}\n\n/** A compartment of a class / entity / record box: rows of cells (cells line up in columns) */\nexport interface Section {\n rows: string[][]\n bold?: boolean\n italic?: boolean\n center?: boolean\n}\n\nexport interface GNode {\n id: string\n label: string\n shape: Shape\n style?: NodeStyle\n sections?: Section[]\n cluster?: string\n}\n\nexport interface GEdge {\n from: string\n to: string\n label?: string\n head?: Head\n tail?: Head\n line?: 'solid' | 'dashed' | 'dotted' | 'thick' | 'hidden'\n minlen?: number\n headLabel?: string\n tailLabel?: string\n color?: string\n sw?: number\n}\n\nexport interface GCluster {\n id: string\n label: string\n parent?: string\n style?: NodeStyle\n}\n\nexport interface Graph {\n dir: Dir\n nodes: GNode[]\n edges: GEdge[]\n clusters: GCluster[]\n sameRank?: string[][]\n title?: string\n}\n\nexport interface Rendered {\n svg: string\n w: number\n h: number\n}\n\n/** Builds a graph: nodes are created on first mention and refined by later ones. */\nexport class GraphBuilder {\n readonly g: Graph\n private byId = new Map<string, GNode>()\n private clusterIds = new Map<string, GCluster>()\n\n constructor(dir: Dir = 'TB', private defShape: Shape = 'rect') {\n this.g = { dir, nodes: [], edges: [], clusters: [] }\n }\n\n has(id: string) {\n return this.byId.has(id)\n }\n\n get(id: string) {\n return this.byId.get(id)\n }\n\n node(id: string, patch: Partial<GNode> = {}, cluster?: string): GNode {\n let n = this.byId.get(id)\n if (!n) {\n n = { id, label: id, shape: this.defShape, cluster }\n this.byId.set(id, n)\n this.g.nodes.push(n)\n }\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) (n as unknown as Record<string, unknown>)[k] = v\n return n\n }\n\n edge(e: GEdge, cluster?: string): GEdge {\n if (!this.clusterIds.has(e.from)) this.node(e.from, {}, cluster)\n if (!this.clusterIds.has(e.to)) this.node(e.to, {}, cluster)\n this.g.edges.push(e)\n return e\n }\n\n cluster(id: string, label: string, parent?: string): GCluster {\n let c = this.clusterIds.get(id)\n if (!c) {\n c = { id, label, parent }\n this.clusterIds.set(id, c)\n this.g.clusters.push(c)\n } else if (label) c.label = label\n // a node of that name (mentioned before) is the cluster\n const n = this.byId.get(id)\n if (n) {\n this.byId.delete(id)\n this.g.nodes.splice(this.g.nodes.indexOf(n), 1)\n }\n return c\n }\n\n isCluster(id: string) {\n return this.clusterIds.has(id)\n }\n}\n\n// ---------------------------------------------------------------- sizes\n\nconst SIZE = 14\nconst SMALL = 13\nconst PX = 14\nconst PY = 9\nconst LH = lineHeight(SIZE)\n\nconst lines = (s: string) => s.split('\\n')\nconst r = (v: number) => Math.round(v * 100) / 100\n\ninterface Box {\n w: number\n h: number\n text: string[]\n}\n\nfunction sectionSize(s: Section): { w: number; h: number; cols: number[] } {\n const cols: number[] = []\n for (const row of s.rows) row.forEach((c, k) => (cols[k] = Math.max(cols[k] ?? 0, textWidth(c, SMALL, s.bold))))\n const w = cols.reduce((a, b) => a + b, 0) + Math.max(0, cols.length - 1) * 12\n return { w, h: s.rows.length ? s.rows.length * lineHeight(SMALL) + 10 : 8, cols }\n}\n\nfunction nodeBox(n: GNode, dir: Dir): Box {\n const text = n.shape === 'none' || n.label === '' ? lines(n.label) : wrap(lines(n.label), 260, SIZE, n.style?.bold)\n const t = n.label === '' ? { w: 0, h: 0 } : measure(text, SIZE, n.style?.bold)\n const across = dir === 'TB' || dir === 'BT'\n if (n.sections?.length) {\n const ss = n.sections.map(sectionSize)\n return { w: Math.max(90, ...ss.map((s) => s.w + 2 * PX)), h: ss.reduce((a, s) => a + s.h, 0), text }\n }\n const tw = t.w + 2 * PX\n const th = t.h + 2 * PY\n switch (n.shape) {\n case 'start':\n return { w: 20, h: 20, text: [] }\n case 'end':\n return { w: 22, h: 22, text: [] }\n case 'point':\n return { w: 8, h: 8, text: [] }\n case 'bar':\n return across ? { w: 80, h: 7, text: [] } : { w: 7, h: 80, text: [] }\n case 'none':\n return { w: t.w + 8, h: t.h + 6, text }\n case 'circle': {\n const d = Math.max(t.w, t.h) + 2 * PY + 4\n return { w: d, h: d, text }\n }\n case 'doublecircle': {\n const d = Math.max(t.w, t.h) + 2 * PY + 14\n return { w: d, h: d, text }\n }\n case 'ellipse':\n return { w: Math.max(50, (t.w + PX) * 1.42), h: Math.max(36, (t.h + PY) * 1.42), text }\n case 'diamond': {\n const w = tw + th / 0.6\n return { w, h: 0.6 * w, text }\n }\n case 'stadium':\n return { w: t.w + th + PX, h: th, text }\n case 'hexagon':\n case 'octagon':\n return { w: tw + th / 2, h: th, text }\n case 'lean-r':\n case 'lean-l':\n return { w: tw + th / 2, h: th, text }\n case 'trap-b':\n case 'trap-t':\n return { w: tw + th * 0.7, h: th, text }\n case 'flag':\n return { w: tw + th / 3, h: th, text }\n case 'cylinder':\n return { w: Math.max(tw, 50), h: th + 16, text }\n case 'subroutine':\n case 'component':\n return { w: tw + 16, h: th, text }\n case 'note':\n case 'folder':\n return { w: tw + 8, h: th + (n.shape === 'folder' ? 8 : 0), text }\n case 'box3d':\n return { w: tw + 8, h: th + 8, text }\n case 'triangle':\n return { w: tw * 1.6, h: th * 1.7, text }\n case 'actor':\n return { w: Math.max(36, t.w + 8), h: 46 + t.h, text }\n default:\n return { w: Math.max(tw, 40), h: th, text }\n }\n}\n\n// ---------------------------------------------------------------- shapes\n\nfunction nodePaint(n: GNode) {\n const s = n.style ?? {}\n const p = { fill: s.fill ?? THEME.fill, stroke: s.stroke ?? THEME.stroke, sw: s.sw ?? 1.3, dash: s.dash }\n return p\n}\n\nfunction drawNode(svg: Svg, n: GNode, b: Box, cx: number, cy: number) {\n const { w, h } = b\n const x = cx - w / 2\n const y = cy - h / 2\n const p = nodePaint(n)\n const color = n.style?.color ?? THEME.ink\n const txt = (tx = cx, ty = cy) => svg.text(tx, ty, b.text, { anchor: 'middle', color, bold: n.style?.bold, italic: n.style?.italic })\n const poly = (pts: [number, number][]) => svg.poly(pts, p)\n switch (n.shape) {\n case 'start':\n svg.circle(cx, cy, w / 2, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'end':\n svg.circle(cx, cy, w / 2, { fill: '#ffffff', stroke: n.style?.stroke ?? THEME.dark, sw: 1.5 }).circle(cx, cy, w / 2 - 4, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'point':\n svg.circle(cx, cy, w / 2, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'bar':\n svg.rect(x, y, w, h, { fill: n.style?.fill ?? THEME.dark }, 2)\n return\n case 'none':\n return void txt()\n case 'round':\n svg.rect(x, y, w, h, p, 6)\n break\n case 'stadium':\n svg.rect(x, y, w, h, p, h / 2)\n break\n case 'subroutine':\n svg.rect(x, y, w, h, p).line(x + 8, y, x + 8, y + h, p).line(x + w - 8, y, x + w - 8, y + h, p)\n break\n case 'component':\n svg.rect(x + 6, y, w - 6, h, p)\n svg.rect(x, y + h / 2 - 11, 12, 7, p).rect(x, y + h / 2 + 4, 12, 7, p)\n return void txt(cx + 4)\n case 'cylinder': {\n const ry = 7\n svg.path(`M${r(x)} ${r(y + ry)} A${r(w / 2)} ${ry} 0 0 1 ${r(x + w)} ${r(y + ry)} L${r(x + w)} ${r(y + h - ry)} A${r(w / 2)} ${ry} 0 0 1 ${r(x)} ${r(y + h - ry)} Z`, p)\n svg.path(`M${r(x)} ${r(y + ry)} A${r(w / 2)} ${ry} 0 0 0 ${r(x + w)} ${r(y + ry)}`, { ...p, fill: 'none' })\n return void txt(cx, cy + ry / 2)\n }\n case 'circle':\n svg.circle(cx, cy, w / 2, p)\n break\n case 'doublecircle':\n svg.circle(cx, cy, w / 2, p).circle(cx, cy, w / 2 - 5, { ...p, fill: 'none' })\n break\n case 'ellipse':\n svg.ellipse(cx, cy, w / 2, h / 2, p)\n break\n case 'diamond':\n poly([\n [cx, y],\n [x + w, cy],\n [cx, y + h],\n [x, cy],\n ])\n break\n case 'hexagon': {\n const s = h / 4\n poly([\n [x + s, y],\n [x + w - s, y],\n [x + w, cy],\n [x + w - s, y + h],\n [x + s, y + h],\n [x, cy],\n ])\n break\n }\n case 'octagon': {\n const s = h / 4\n poly([\n [x + s, y],\n [x + w - s, y],\n [x + w, y + s],\n [x + w, y + h - s],\n [x + w - s, y + h],\n [x + s, y + h],\n [x, y + h - s],\n [x, y + s],\n ])\n break\n }\n case 'lean-r':\n case 'lean-l': {\n const s = h / 2\n const rt = n.shape === 'lean-r'\n poly([\n [rt ? x + s : x, y],\n [rt ? x + w : x + w - s, y],\n [rt ? x + w - s : x + w, y + h],\n [rt ? x : x + s, y + h],\n ])\n break\n }\n case 'trap-b':\n case 'trap-t': {\n const s = h * 0.35\n const b2 = n.shape === 'trap-b'\n poly([\n [b2 ? x + s : x, y],\n [b2 ? x + w - s : x + w, y],\n [b2 ? x + w : x + w - s, y + h],\n [b2 ? x : x + s, y + h],\n ])\n break\n }\n case 'flag': {\n const s = h / 3\n poly([\n [x, y],\n [x + w, y],\n [x + w, y + h],\n [x, y + h],\n [x + s, cy],\n ])\n return void txt(cx + s / 2)\n }\n case 'note': {\n const f = 10\n poly([\n [x, y],\n [x + w - f, y],\n [x + w, y + f],\n [x + w, y + h],\n [x, y + h],\n ])\n svg.poly(\n [\n [x + w - f, y],\n [x + w - f, y + f],\n [x + w, y + f],\n ],\n { ...p, fill: 'none' },\n false,\n )\n break\n }\n case 'folder':\n svg.rect(x, y, Math.min(w * 0.4, 40), 10, p, 2).rect(x, y + 8, w, h - 8, p)\n return void txt(cx, cy + 4)\n case 'box3d':\n poly([\n [x, y + 8],\n [x + 8, y],\n [x + w, y],\n [x + w, y + h - 8],\n [x + w - 8, y + h],\n [x, y + h],\n ])\n svg.poly(\n [\n [x, y + 8],\n [x + w - 8, y + 8],\n [x + w, y],\n ],\n { ...p, fill: 'none' },\n false,\n ).line(x + w - 8, y + 8, x + w - 8, y + h, p)\n return void txt(cx - 4, cy + 4)\n case 'cloud':\n svg.rect(x, y, w, h, p, Math.min(h / 2, 20))\n break\n case 'triangle':\n poly([\n [cx, y],\n [x + w, y + h],\n [x, y + h],\n ])\n return void txt(cx, cy + h / 6)\n case 'actor': {\n const s = { fill: 'none', stroke: n.style?.stroke ?? THEME.dark, sw: 1.5 }\n const top = y + 2\n svg.circle(cx, top + 7, 7, { ...s, fill: n.style?.fill ?? THEME.fill })\n svg.line(cx, top + 14, cx, top + 28, s).line(cx - 11, top + 19, cx + 11, top + 19, s)\n svg.line(cx, top + 28, cx - 9, top + 40, s).line(cx, top + 28, cx + 9, top + 40, s)\n svg.text(cx, top + 44 + (b.text.length * LH) / 2, b.text, { anchor: 'middle', color })\n return\n }\n default:\n if (n.sections?.length) return drawSections(svg, n, x, y, w)\n svg.rect(x, y, w, h, p)\n }\n txt()\n}\n\nfunction drawSections(svg: Svg, n: GNode, x: number, y: number, w: number) {\n const p = nodePaint(n)\n const ss = n.sections!.map(sectionSize)\n const total = ss.reduce((a, s) => a + s.h, 0)\n svg.rect(x, y, w, total, p, n.shape === 'round' ? 6 : 0)\n let top = y\n n.sections!.forEach((s, k) => {\n if (k) svg.line(x, top, x + w, top, { stroke: p.stroke, sw: 1 })\n const lh = lineHeight(SMALL)\n s.rows.forEach((row, r) => {\n const ty = top + 5 + r * lh + lh / 2\n if (s.center || (row.length === 1 && k === 0)) {\n svg.text(x + w / 2, ty, row.join(' '), { anchor: 'middle', size: SMALL, bold: s.bold, italic: s.italic, color: n.style?.color })\n return\n }\n let cx = x + PX\n row.forEach((c, j) => {\n svg.text(cx, ty, c, { size: SMALL, bold: s.bold, italic: s.italic, color: n.style?.color })\n cx += ss[k].cols[j] + 12\n })\n })\n top += ss[k].h\n })\n}\n\n// ---------------------------------------------------------------- edges\n\nconst HEAD_LEN: Partial<Record<Head, number>> = { arrow: 10, triangle: 13, diamond: 15, odiamond: 15, circle: 8, ocircle: 8 }\n\nfunction unit(a: Pt, b: Pt): Pt {\n const dx = b.x - a.x\n const dy = b.y - a.y\n const l = Math.hypot(dx, dy) || 1\n return { x: dx / l, y: dy / l }\n}\n\n/** marker at `p`, `d` the direction the edge arrives in */\nfunction drawHead(svg: Svg, head: Head, p: Pt, d: Pt, col: string) {\n const nx = -d.y\n const ny = d.x\n const at = (back: number, side: number): [number, number] => [p.x - d.x * back + nx * side, p.y - d.y * back + ny * side]\n const line = (a: [number, number], b: [number, number]) => svg.line(a[0], a[1], b[0], b[1], { stroke: col, sw: 1.3 })\n switch (head) {\n case 'arrow':\n svg.poly([at(0, 0), at(10, 4.5), at(10, -4.5)], { fill: col, stroke: col, sw: 1 })\n break\n case 'open':\n svg.poly([at(10, 5), at(0, 0), at(10, -5)], { stroke: col, sw: 1.4 }, false)\n break\n case 'triangle':\n svg.poly([at(0, 0), at(13, 7), at(13, -7)], { fill: '#ffffff', stroke: col, sw: 1.2 })\n break\n case 'diamond':\n case 'odiamond':\n svg.poly([at(0, 0), at(7.5, 5), at(15, 0), at(7.5, -5)], { fill: head === 'diamond' ? col : '#ffffff', stroke: col, sw: 1.2 })\n break\n case 'circle':\n case 'ocircle': {\n const [cx, cy] = at(4, 0)\n svg.circle(cx, cy, 4, { fill: head === 'circle' ? col : '#ffffff', stroke: col, sw: 1.2 })\n break\n }\n case 'cross':\n line(at(1, 5), at(11, -5))\n line(at(1, -5), at(11, 5))\n break\n case 'one':\n case 'zero-one':\n case 'one-many':\n case 'zero-many':\n case 'many': {\n const many = head.endsWith('many')\n if (many) {\n line(at(0, 7), at(12, 0))\n line(at(0, -7), at(12, 0))\n }\n if (head === 'one' || head === 'one-many') line(at(many ? 16 : 7, 6), at(many ? 16 : 7, -6))\n if (head === 'one') line(at(12, 6), at(12, -6))\n if (head === 'zero-one' || head === 'zero-many') {\n const [cx, cy] = at(many ? 20 : 17, 0)\n svg.circle(cx, cy, 4.5, { fill: '#ffffff', stroke: col, sw: 1.2 })\n }\n if (head === 'zero-one') line(at(7, 6), at(7, -6))\n break\n }\n }\n}\n\n/** shortens the path at its end by `len` along the arriving direction */\nfunction trimEnd(start: Pt, segs: Seg[], len: number): Pt {\n const last = segs[segs.length - 1]\n const end = last.p[last.p.length - 1]\n const prev = last.c === 'C' ? last.p[1] : segs.length > 1 ? segs[segs.length - 2].p[segs[segs.length - 2].p.length - 1] : start\n const d = unit(prev, end)\n if (len) {\n const q = { x: end.x - d.x * len, y: end.y - d.y * len }\n last.p[last.p.length - 1] = q\n if (last.c === 'C') {\n const c2 = { x: last.p[1].x - d.x * Math.min(len, 6), y: last.p[1].y - d.y * Math.min(len, 6) }\n // a short last piece: the control point stays ahead of the first one, or the curve would loop back\n const k = Math.min(0, (c2.x - last.p[0].x) * d.x + (c2.y - last.p[0].y) * d.y)\n last.p[1] = { x: c2.x - d.x * k, y: c2.y - d.y * k }\n }\n }\n return d\n}\n\nfunction edgeColor(e: GEdge) {\n return e.color ?? THEME.line\n}\n\n// ---------------------------------------------------------------- render\n\nconst MARGIN = 16\n\nconst MAX_NODES = 3000\nconst MAX_EDGES = 6000\n\nexport function renderGraph(g: Graph): Rendered {\n if (!g.nodes.length) throw new DiagramError('The diagram has no nodes')\n if (g.nodes.length > MAX_NODES || g.edges.length > MAX_EDGES) throw new DiagramError(`The diagram is too large to draw (${g.nodes.length} nodes, ${g.edges.length} edges)`)\n const dir = g.dir\n const across = dir === 'TB' || dir === 'BT'\n const svg = new Svg()\n // edges to a cluster go to one of its nodes\n const clusterIdx = new Map(g.clusters.map((c, k) => [c.id, k]))\n const nodeIdx = new Map(g.nodes.map((n, k) => [n.id, k]))\n const parentOf = (c: number) => (g.clusters[c].parent !== undefined ? clusterIdx.get(g.clusters[c].parent!) ?? -1 : -1)\n const inCluster = (v: number, c: number) => {\n for (let k = g.nodes[v].cluster !== undefined ? clusterIdx.get(g.nodes[v].cluster!) ?? -1 : -1; k >= 0; k = parentOf(k)) if (k === c) return true\n return false\n }\n /** an edge's end: its node, or for a cluster the member it is laid out to (the first one entering, the last leaving) */\n const resolve = (id: string, leaving: boolean): number => {\n const v = nodeIdx.get(id)\n if (v !== undefined) return v\n const c = clusterIdx.get(id)\n if (c === undefined) return -1\n if (!leaving) return g.nodes.findIndex((_, k) => inCluster(k, c))\n for (let k = g.nodes.length - 1; k >= 0; k--) if (inCluster(k, c)) return k\n return -1\n }\n\n const boxes = g.nodes.map((n) => nodeBox(n, dir))\n const edges = g.edges\n .map((e) => ({ e, v: resolve(e.from, true), w: resolve(e.to, false), cv: nodeIdx.has(e.from) ? -1 : clusterIdx.get(e.from) ?? -1, cw: nodeIdx.has(e.to) ? -1 : clusterIdx.get(e.to) ?? -1 }))\n .filter((x) => x.v >= 0 && x.w >= 0)\n const labelled = edges.some((x) => x.e.label)\n const lab = (s: string | undefined) => (s ? measure(lines(s), SMALL) : undefined)\n const loops = new Map<number, number>()\n for (const { e, v, w } of edges) {\n if (v !== w) continue\n const l = lab(e.label)\n loops.set(v, Math.max(loops.get(v) ?? 0, 40 + (l ? (across ? l.w : l.h) + 6 : 0)))\n }\n const lnodes: LNode[] = g.nodes.map((n, k) => {\n const b = boxes[k]\n const c = n.cluster !== undefined ? clusterIdx.get(n.cluster) ?? -1 : -1\n const spread = !!n.sections?.length || SPREAD.has(n.shape)\n return across ? { w: b.w, h: b.h, cluster: c, loop: loops.get(k), spread } : { w: b.h, h: b.w, cluster: c, loop: loops.get(k), spread }\n })\n const ledges: LEdge[] = edges.map(({ e, v, w }) => {\n const l = lab(e.label)\n const pad = l ? { w: l.w + 8, h: l.h + 4 } : undefined\n return {\n v,\n w,\n minlen: (e.minlen ?? 1) * (labelled ? 2 : 1),\n weight: 1,\n label: pad ? (across ? pad : { w: pad.h, h: pad.w }) : undefined,\n }\n })\n const TITLE_H = 22\n const lclusters: LCluster[] = g.clusters.map((c, k) => {\n const t = c.label ? measure(lines(c.label), SMALL, true) : { w: 0, h: 0 }\n const top = 12 + (c.label ? t.h + 6 : 0)\n const side = 12\n // [cross start, cross end, rank start, rank end] in layout space\n const pad: [number, number, number, number] =\n dir === 'TB' ? [side, side, top, side] : dir === 'BT' ? [side, side, side, top] : dir === 'LR' ? [top, side, side, side] : [top, side, side, side]\n return { parent: parentOf(k), pad, minW: across ? t.w + 2 * side : t.h + top + side }\n })\n const same = g.sameRank?.map((grp) => grp.map((id) => nodeIdx.get(id)).filter((v): v is number => v !== undefined)).filter((grp) => grp.length > 1)\n const out = layered(lnodes, ledges, lclusters, {\n nodesep: across ? 40 : 28,\n ranksep: (across ? 50 : 60) / (labelled ? 2 : 1),\n edgesep: 14,\n sameRank: same,\n })\n\n // layout space → picture\n const titleH = g.title ? TITLE_H + 10 : 0\n const LW = out.w\n const LH2 = out.h\n const tr = (p: Pt): Pt => {\n const q = dir === 'TB' ? p : dir === 'BT' ? { x: p.x, y: LH2 - p.y } : dir === 'LR' ? { x: p.y, y: p.x } : { x: LH2 - p.y, y: p.x }\n return { x: q.x + MARGIN, y: q.y + MARGIN + titleH }\n }\n let W = (across ? LW : LH2) + 2 * MARGIN\n const H = (across ? LH2 : LW) + 2 * MARGIN + titleH\n\n // clusters, outermost first\n const depth = (k: number) => {\n let d = 0\n for (let c = parentOf(k); c >= 0; c = parentOf(c)) d++\n return d\n }\n const order = g.clusters.map((_, k) => k).sort((a, b) => depth(a) - depth(b))\n const clusterBox: ({ x: number; y: number; w: number; h: number } | null)[] = g.clusters.map(() => null)\n // cluster titles go over the edges that cross them\n const titles: { x: number; y: number; text: string[]; color: string; bg: string }[] = []\n for (const k of order) {\n const b = out.clusters[k]\n if (!b) continue\n const c = g.clusters[k]\n const a = tr({ x: b.x, y: b.y })\n const z = tr({ x: b.x + b.w, y: b.y + b.h })\n const x0 = Math.min(a.x, z.x)\n const y0 = Math.min(a.y, z.y)\n const cw = Math.abs(z.x - a.x)\n const ch = Math.abs(z.y - a.y)\n const st = c.style ?? {}\n clusterBox[k] = { x: x0, y: y0, w: cw, h: ch }\n svg.rect(x0, y0, cw, ch, { fill: st.fill ?? THEME.cluster, stroke: st.stroke ?? THEME.clusterStroke, sw: st.sw ?? 1, dash: st.dash }, 4)\n if (c.label) {\n const t = lines(c.label)\n const top = dir === 'BT' ? y0 + ch - 8 - (t.length * lineHeight(SMALL)) / 2 : y0 + 8 + (t.length * lineHeight(SMALL)) / 2\n titles.push({ x: x0 + cw / 2, y: top, text: t, color: st.color ?? THEME.ink, bg: st.fill && st.fill !== 'none' ? st.fill : THEME.cluster })\n }\n }\n\n // edges\n const labels: { p: Pt; text: string[]; color?: string; plain?: boolean }[] = []\n edges.forEach(({ e, v }, i) => {\n if (e.line === 'hidden') return\n const col = edgeColor(e)\n const paint = { stroke: col, sw: e.sw ?? (e.line === 'thick' ? 3 : 1.4), dash: e.line === 'dashed' ? '6 4' : e.line === 'dotted' ? '2 3' : undefined }\n const geom = out.edges[i]\n if (!geom) {\n if (edges[i].v !== edges[i].w) return\n // self loop, on the far side of the rank\n const c = tr(out.nodes[v])\n const b = boxes[v]\n let s: Pt, c1: Pt, c2: Pt, t: Pt, lp: Pt\n if (across) {\n s = { x: c.x + b.w / 2, y: c.y - b.h / 4 }\n t = { x: c.x + b.w / 2, y: c.y + b.h / 4 }\n c1 = { x: s.x + 34, y: s.y - 12 }\n c2 = { x: t.x + 34, y: t.y + 12 }\n lp = { x: c.x + b.w / 2 + 34, y: c.y }\n } else {\n s = { x: c.x - b.w / 4, y: c.y + b.h / 2 }\n t = { x: c.x + b.w / 4, y: c.y + b.h / 2 }\n c1 = { x: s.x - 12, y: s.y + 34 }\n c2 = { x: t.x + 12, y: t.y + 34 }\n lp = { x: c.x, y: c.y + b.h / 2 + 34 }\n }\n const segs: Seg[] = [{ c: 'C', p: [c1, c2, t] }]\n const head = e.head ?? 'arrow'\n const d = trimEnd(s, segs, HEAD_LEN[head] ?? 0)\n svg.path(pathData([{ c: 'M', p: [s] }, ...segs.map((k) => ({ c: k.c, p: k.p }))]), paint)\n drawHead(svg, head, t, d, col)\n if (e.label) {\n const l = measure(lines(e.label), SMALL)\n labels.push({ p: across ? { x: lp.x + l.w / 2 + 4, y: lp.y } : { x: lp.x, y: lp.y + l.h / 2 + 4 }, text: lines(e.label) })\n }\n return\n }\n let g2: EdgeGeom = { start: tr(geom.start), segs: geom.segs.map((s) => ({ c: s.c, p: s.p.map(tr) })), label: geom.label && tr(geom.label) }\n // an edge to / from a cluster stops at the cluster's border\n const { cv, cw } = edges[i]\n if ((cv >= 0 && !inCluster(edges[i].w, cv)) || (cw >= 0 && !inCluster(edges[i].v, cw))) {\n let pts = sample(g2.start, g2.segs)\n if (cv >= 0 && clusterBox[cv]) pts = clip(pts, clusterBox[cv]!, true)\n if (cw >= 0 && clusterBox[cw]) pts = clip(pts, clusterBox[cw]!, false)\n if (pts.length > 1) g2 = { start: pts[0], segs: pts.slice(1).map((p) => ({ c: 'L' as const, p: [p] })), label: g2.label }\n }\n const head = e.head ?? 'none'\n const tail = e.tail ?? 'none'\n const end = g2.segs[g2.segs.length - 1].p[g2.segs[g2.segs.length - 1].p.length - 1]\n const dHead = trimEnd(g2.start, g2.segs, HEAD_LEN[head] ?? 0)\n // the tail: reverse the first segment's direction\n const first = g2.segs[0]\n const toward = first.c === 'C' ? first.p[0] : first.p[0]\n const dTail = unit(toward, g2.start)\n const tailStart = g2.start\n const tl = HEAD_LEN[tail] ?? 0\n const start = tl ? { x: g2.start.x - dTail.x * tl, y: g2.start.y - dTail.y * tl } : g2.start\n if (tl && first.c === 'C') {\n const c1 = { x: first.p[0].x - dTail.x * Math.min(tl, 6), y: first.p[0].y - dTail.y * Math.min(tl, 6) }\n const k = Math.max(0, (first.p[1].x - c1.x) * dTail.x + (first.p[1].y - c1.y) * dTail.y)\n first.p[0] = { x: c1.x + dTail.x * k, y: c1.y + dTail.y * k }\n }\n svg.path(pathData([{ c: 'M', p: [start] }, ...g2.segs.map((k) => ({ c: k.c, p: k.p }))]), paint)\n if (head !== 'none') drawHead(svg, head, end, dHead, col)\n if (tail !== 'none') drawHead(svg, tail, tailStart, dTail, col)\n if (e.label) {\n const p = g2.label ?? midpoint(g2.start, end)\n labels.push({ p, text: lines(e.label) })\n }\n // multiplicities: beside the line, near its end\n const side = (p: Pt, d: Pt, text: string) => {\n const l = measure(lines(text), SMALL)\n const nx = -d.y\n const ny = d.x\n const off = Math.abs(nx) * (l.w / 2 + 5) + Math.abs(ny) * (l.h / 2 + 3)\n labels.push({ p: { x: p.x - d.x * (16 + l.h / 2) + nx * off, y: p.y - d.y * (14 + l.h / 2) + ny * off }, text: lines(text), plain: true })\n }\n if (e.headLabel) side(end, dHead, e.headLabel)\n if (e.tailLabel) side(tailStart, dTail, e.tailLabel)\n })\n\n for (const t of titles) {\n const m = measure(t.text, SMALL, true)\n svg.rect(t.x - m.w / 2 - 4, t.y - m.h / 2 - 1, m.w + 8, m.h + 2, { fill: t.bg }, 2)\n svg.text(t.x, t.y, t.text, { anchor: 'middle', size: SMALL, bold: true, color: t.color })\n }\n\n // nodes\n g.nodes.forEach((n, k) => {\n if (n.style?.hidden) return\n const c = tr(out.nodes[k])\n drawNode(svg, n, boxes[k], c.x, c.y)\n })\n\n for (const l of labels) {\n const m = measure(l.text, SMALL)\n if (!l.plain) svg.rect(l.p.x - m.w / 2 - 3, l.p.y - m.h / 2 - 1, m.w + 6, m.h + 2, { fill: THEME.label, opacity: 0.92 }, 2)\n svg.text(l.p.x, l.p.y, l.text, { anchor: 'middle', size: SMALL, color: l.color ?? THEME.ink })\n }\n if (g.title) {\n W = Math.max(W, textWidth(g.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + TITLE_H / 2, g.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\nconst midpoint = (a: Pt, b: Pt): Pt => ({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 })\n\n/** shapes whose flat top / bottom edges can take several edges side by side */\nconst SPREAD = new Set<Shape>(['rect', 'round', 'subroutine', 'component', 'note', 'folder', 'box3d', 'cylinder', 'stadium', 'cloud'])\n\n/** the path as a polyline */\nfunction sample(start: Pt, segs: Seg[]): Pt[] {\n const out = [start]\n let cur = start\n for (const s of segs) {\n if (s.c === 'L') out.push(s.p[0])\n else {\n const [c1, c2, e] = s.p\n for (let k = 1; k <= 12; k++) {\n const t = k / 12\n const u = 1 - t\n out.push({\n x: u * u * u * cur.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * e.x,\n y: u * u * u * cur.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * e.y,\n })\n }\n }\n cur = out[out.length - 1]\n }\n return out\n}\n\n/** cuts the part of a polyline inside `b` off its start (or end) */\nfunction clip(pts: Pt[], b: { x: number; y: number; w: number; h: number }, atStart: boolean): Pt[] {\n const inside = (p: Pt) => p.x > b.x && p.x < b.x + b.w && p.y > b.y && p.y < b.y + b.h\n const list = atStart ? pts : [...pts].reverse()\n const k = list.findIndex((p) => !inside(p))\n if (k <= 0) return pts\n const a = list[k - 1]\n const z = list[k]\n // where a→z leaves the box\n let t = 1\n const dx = z.x - a.x\n const dy = z.y - a.y\n if (dx > 0) t = Math.min(t, (b.x + b.w - a.x) / dx)\n if (dx < 0) t = Math.min(t, (b.x - a.x) / dx)\n if (dy > 0) t = Math.min(t, (b.y + b.h - a.y) / dy)\n if (dy < 0) t = Math.min(t, (b.y - a.y) / dy)\n const out = [{ x: a.x + dx * t, y: a.y + dy * t }, ...list.slice(k)]\n return atStart ? out : out.reverse()\n}\n","/**\n * Lookups by a key read from a file (an attribute value, an element name, a style id).\n *\n * A plain object answers \"constructor\", \"toString\" or \"__proto__\" with what it inherits: a function or an object,\n * which then travels as a color, a border style, an alignment… and can't be sent out of the worker (the document\n * comes out blank) or breaks the code that expects a string.\n */\n\n/** A lookup table with no inherited keys: a key the table was not given is undefined. */\nexport function dict<T extends object>(table: T): T {\n return Object.assign(Object.create(null) as T, table)\n}\n\n/** `obj[key]`, only when the object itself holds the key: for objects built elsewhere (XML attributes, cloned models). */\nexport function own<T>(obj: Record<string, T> | undefined, key: string | undefined): T | undefined {\n return obj !== undefined && key !== undefined && Object.hasOwn(obj, key) ? obj[key] : undefined\n}\n","/**\n * Graphviz DOT: graphs, digraphs, subgraphs and clusters, default attributes, edge chains, rank=same, record and\n * HTML-like labels (as text). Laid out by the layered layout, like `dot`.\n * https://graphviz.org/doc/info/lang.html\n */\nimport { GraphBuilder, renderGraph, type Dir, type GEdge, type GNode, type Graph, type Head, type NodeStyle, type Rendered, type Section, type Shape } from './graph'\nimport { color, DiagramError, labelText } from './svg'\nimport { dict } from '../dict'\n\ntype Tok = { t: 'id' | 'str' | 'html' | 'p'; v: string }\n\nfunction tokenize(src: string): Tok[] {\n const out: Tok[] = []\n const n = src.length\n let i = 0\n let lineStart = true\n while (i < n) {\n const c = src[i]\n if (c === '\\n') {\n lineStart = true\n i++\n continue\n }\n if (c === ' ' || c === '\\t' || c === '\\r' || c === '') {\n i++\n continue\n }\n if (lineStart && c === '#') {\n while (i < n && src[i] !== '\\n') i++\n continue\n }\n lineStart = false\n if (c === '/' && src[i + 1] === '/') {\n while (i < n && src[i] !== '\\n') i++\n continue\n }\n if (c === '/' && src[i + 1] === '*') {\n const e = src.indexOf('*/', i + 2)\n i = e < 0 ? n : e + 2\n continue\n }\n if (c === '\"') {\n let v = ''\n i++\n while (i < n && src[i] !== '\"') {\n if (src[i] === '\\\\' && src[i + 1] === '\"') {\n v += '\"'\n i += 2\n } else if (src[i] === '\\\\' && src[i + 1] === '\\n') i += 2\n else v += src[i++]\n }\n i++\n // \"a\" + \"b\"\n const prev = out[out.length - 1]\n const plus = out[out.length - 2]\n if (prev?.t === 'p' && prev.v === '+' && plus?.t === 'str') {\n out.pop()\n plus.v += v\n } else out.push({ t: 'str', v })\n continue\n }\n if (c === '<') {\n let depth = 0\n const s = i\n for (; i < n; i++) {\n if (src[i] === '<') depth++\n else if (src[i] === '>' && --depth === 0) break\n }\n out.push({ t: 'html', v: src.slice(s + 1, i) })\n i++\n continue\n }\n if (c === '-' && (src[i + 1] === '>' || src[i + 1] === '-')) {\n out.push({ t: 'p', v: src.slice(i, i + 2) })\n i += 2\n continue\n }\n if ('{}[]=;,:+'.includes(c)) {\n out.push({ t: 'p', v: c })\n i++\n continue\n }\n const m = /^(-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)|[A-Za-z_\\u0080-][\\w\\u0080-]*)/.exec(src.slice(i, i + 256))\n if (!m) {\n i++\n continue\n }\n out.push({ t: 'id', v: m[0] })\n i += m[0].length\n }\n return out\n}\n\ninterface Scope {\n node: Record<string, string>\n edge: Record<string, string>\n cluster?: string\n members: Set<string>\n name?: string\n}\n\nconst SHAPES: Record<string, Shape> = dict({\n box: 'rect', rect: 'rect', rectangle: 'rect', square: 'rect', msquare: 'rect', ellipse: 'ellipse', oval: 'ellipse', egg: 'ellipse', circle: 'circle',\n doublecircle: 'doublecircle', point: 'point', plaintext: 'none', plain: 'none', none: 'none', underline: 'none', diamond: 'diamond', mdiamond: 'diamond',\n hexagon: 'hexagon', octagon: 'octagon', doubleoctagon: 'octagon', tripleoctagon: 'octagon', triangle: 'triangle', invtriangle: 'triangle', parallelogram: 'lean-r',\n trapezium: 'trap-b', invtrapezium: 'trap-t', house: 'trap-b', invhouse: 'trap-t', cylinder: 'cylinder', note: 'note', tab: 'folder', folder: 'folder', box3d: 'box3d',\n component: 'component', cds: 'flag', larrow: 'flag', rarrow: 'flag', lpromoter: 'flag', rpromoter: 'flag', star: 'circle', record: 'rect', mrecord: 'round', underlinebox: 'rect',\n})\n\nconst ARROWS: Record<string, Head> = dict({\n normal: 'arrow', inv: 'arrow', empty: 'triangle', onormal: 'triangle', invempty: 'triangle', oinv: 'triangle', vee: 'open', open: 'open', halfopen: 'open',\n diamond: 'diamond', odiamond: 'odiamond', ediamond: 'odiamond', box: 'diamond', obox: 'odiamond', dot: 'circle', odot: 'ocircle', invdot: 'circle', invodot: 'ocircle',\n none: 'none', crow: 'many', tee: 'one', curve: 'open', icurve: 'open',\n})\n\nfunction arrow(v: string | undefined, dflt: Head): Head {\n if (!v) return dflt\n const k = v.toLowerCase().replace(/^[lr](?=[a-z])/, '')\n return ARROWS[k] ?? ARROWS[k.replace(/^o/, '')] ?? dflt\n}\n\n/** a Graphviz color: names, #rgb(a), \"H S V\" or \"H,S,V\"; the first of a color list */\nfunction dotColor(v: string | undefined): string | undefined {\n if (!v) return undefined\n const first = v.split(/[:;]/)[0].trim()\n const hsv = /^([\\d.]+)[ ,]+([\\d.]+)[ ,]+([\\d.]+)$/.exec(first)\n if (hsv) {\n const [h, s, b] = [Number(hsv[1]), Number(hsv[2]), Number(hsv[3])]\n const f = (k: number) => {\n const x = (k + h * 6) % 6\n return Math.round((b - b * s * Math.max(0, Math.min(x, 4 - x, 1))) * 255)\n }\n return '#' + [f(5), f(3), f(1)].map((x) => x.toString(16).padStart(2, '0')).join('')\n }\n const name = first.replace(/^\\/\\w+\\//, '').toLowerCase()\n // X11 grey levels (gray0 … gray100); numbered variants (red3) as their base color\n const g = /^gr[ae]y(\\d{1,3})$/.exec(name)\n if (g) {\n const x = Math.round((Math.min(100, Number(g[1])) * 255) / 100)\n .toString(16)\n .padStart(2, '0')\n return `#${x}${x}${x}`\n }\n return color(/^[a-z]+\\d+$/.test(name) ? name.replace(/\\d+$/, '') : name)\n}\n\nfunction htmlLabel(v: string): string {\n return labelText(\n v\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/tr>/gi, '\\n')\n .replace(/<\\/td>\\s*<td/gi, ' <td')\n .replace(/<[^>]+>/g, '')\n .replace(/\\n\\s*\\n/g, '\\n'),\n )\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n .join('\\n')\n}\n\n/** text of a plain label: \\n \\l \\r line breaks, \\N the node name */\nfunction plainLabel(v: string, id: string, graph = ''): string {\n return v\n .replace(/\\\\[nlr]/g, '\\n')\n .replace(/\\\\N/g, id)\n .replace(/\\\\G/g, graph)\n .replace(/\\\\(.)/g, '$1')\n .replace(/\\n$/, '')\n}\n\n/** record fields \"{a|<p> b|{c|d}}\" as rows */\nfunction recordRows(v: string, id: string): string[] {\n return plainLabel(v, id)\n .replace(/<[^>]*>/g, '')\n .split(/[|{}]/)\n .map((x) => x.trim())\n .filter(Boolean)\n}\n\nexport function parseDot(src: string): Graph[] {\n const toks = tokenize(src)\n let p = 0\n const peek = (k = 0) => toks[p + k]\n const isP = (v: string, k = 0) => peek(k)?.t === 'p' && peek(k).v === v\n const eat = (v: string) => {\n if (isP(v)) {\n p++\n return true\n }\n return false\n }\n const kw = (v: string) => peek()?.t === 'id' && peek().v.toLowerCase() === v\n const graphs: Graph[] = []\n while (p < toks.length) {\n if (kw('strict')) p++\n if (!kw('graph') && !kw('digraph')) {\n p++\n continue\n }\n const directed = peek().v.toLowerCase() === 'digraph'\n p++\n const name = peek()?.t !== 'p' ? toks[p++].v : ''\n if (!eat('{')) throw new DiagramError('Graphviz: “{” expected after the graph name')\n const b = new GraphBuilder('TB', 'ellipse')\n const nodeAttrs = new Map<string, Record<string, string>>()\n const edges: { e: GEdge; attrs: Record<string, string> }[] = []\n const same: string[][] = []\n let anon = 0\n const graphAttrs: Record<string, string> = {}\n const clusterAttrs = new Map<string, Record<string, string>>()\n\n const attrList = (): Record<string, string> => {\n const a: Record<string, string> = {}\n while (eat('[')) {\n while (p < toks.length && !isP(']')) {\n const k = toks[p++]\n if (k.t === 'p') continue\n if (eat('=')) {\n const v = toks[p++]\n if (v) a[k.v.toLowerCase()] = v.t === 'html' ? '<' + v.v + '>' : v.v\n } else a[k.v.toLowerCase()] = 'true'\n }\n eat(']')\n }\n return a\n }\n const nodeRef = (scope: Scope): string => {\n const id = toks[p++].v\n // port: a:p or a:p:n\n while (isP(':')) p += 2\n if (!nodeAttrs.has(id)) {\n nodeAttrs.set(id, { ...scope.node })\n b.node(id, {}, scope.cluster)\n } else if (scope.cluster && b.get(id) && b.get(id)!.cluster === undefined) b.get(id)!.cluster = scope.cluster\n scope.members.add(id)\n return id\n }\n const stmts = (scope: Scope) => {\n while (p < toks.length && !isP('}')) {\n if (eat(';') || eat(',')) continue\n const t = peek()\n if (t.t === 'id' && ['graph', 'node', 'edge'].includes(t.v.toLowerCase()) && isP('[', 1)) {\n p++\n const a = attrList()\n const which = t.v.toLowerCase()\n if (which === 'node') Object.assign(scope.node, a)\n else if (which === 'edge') Object.assign(scope.edge, a)\n else setGraph(scope, a)\n continue\n }\n if (t.t !== 'p' && isP('=', 1)) {\n const k = t.v.toLowerCase()\n p += 2\n const v = toks[p++]\n setGraph(scope, { [k]: v ? (v.t === 'html' ? '<' + v.v + '>' : v.v) : '' })\n continue\n }\n // a chain of node ids / subgraphs joined by edge operators\n const ends: string[][] = []\n for (;;) {\n if (kw('subgraph') || isP('{')) ends.push([...subgraph(scope)])\n else if (peek() && peek().t !== 'p') ends.push([nodeRef(scope)])\n else {\n p++\n break\n }\n if (isP('->') || isP('--')) p++\n else break\n }\n const a = attrList()\n if (ends.length === 1) {\n for (const id of ends[0]) if (Object.keys(a).length && nodeAttrs.has(id)) Object.assign(nodeAttrs.get(id)!, a)\n continue\n }\n const attrs = { ...scope.edge, ...a }\n for (let k = 0; k + 1 < ends.length; k++) for (const from of ends[k]) for (const to of ends[k + 1]) edges.push({ e: { from, to }, attrs })\n }\n }\n const setGraph = (scope: Scope, a: Record<string, string>) => {\n if (scope.cluster) Object.assign(clusterAttrs.get(scope.cluster)!, a)\n else if (!scope.name) Object.assign(graphAttrs, a)\n if (a.rank && scope.name !== undefined) (scope as Scope & { rank?: string }).rank = a.rank\n }\n const subgraph = (parent: Scope): Set<string> => {\n let sname: string | undefined\n if (kw('subgraph')) {\n p++\n if (peek() && peek().t !== 'p') sname = toks[p++].v\n }\n const isCluster = !!sname && /^cluster/i.test(sname)\n const scope: Scope & { rank?: string } = { node: { ...parent.node }, edge: { ...parent.edge }, cluster: parent.cluster, members: new Set(), name: sname ?? `__anon${anon++}` }\n if (isCluster) {\n const cid = `${sname}`\n b.cluster(cid, '', parent.cluster)\n clusterAttrs.set(cid, {})\n scope.cluster = cid\n }\n if (eat('{')) {\n stmts(scope)\n eat('}')\n }\n if (scope.rank && /^(same|min|max|source|sink)$/.test(scope.rank) && scope.members.size > 1) same.push([...scope.members])\n for (const m of scope.members) parent.members.add(m)\n return scope.members\n }\n const root: Scope = { node: {}, edge: {}, members: new Set() }\n stmts(root)\n eat('}')\n\n // attributes → model\n const dir: Dir = ({ LR: 'LR', RL: 'RL', BT: 'BT', TB: 'TB' } as Record<string, Dir>)[(graphAttrs.rankdir ?? 'TB').toUpperCase()] ?? 'TB'\n b.g.dir = dir\n if (graphAttrs.label) b.g.title = graphAttrs.label.startsWith('<') ? htmlLabel(graphAttrs.label.slice(1, -1)) : plainLabel(graphAttrs.label, '', name)\n for (const n of b.g.nodes) applyNode(n, nodeAttrs.get(n.id) ?? {})\n for (const c of b.g.clusters) {\n const a = clusterAttrs.get(c.id) ?? {}\n c.label = a.label ? (a.label.startsWith('<') ? htmlLabel(a.label.slice(1, -1)) : plainLabel(a.label, '', c.id)) : ''\n const st: NodeStyle = {}\n const style = (a.style ?? '').toLowerCase()\n if (style.includes('filled')) st.fill = dotColor(a.fillcolor ?? a.color ?? a.bgcolor) ?? '#d3d3d3'\n else if (a.bgcolor) st.fill = dotColor(a.bgcolor)\n if (a.color || a.pencolor) st.stroke = dotColor(a.pencolor ?? a.color)\n if (style.includes('dashed')) st.dash = '6 4'\n if (style.includes('dotted')) st.dash = '2 3'\n if (a.fontcolor) st.color = dotColor(a.fontcolor)\n if (style.includes('invis')) st.stroke = st.fill = 'none'\n c.style = st\n }\n for (const { e, attrs } of edges) b.g.edges.push(applyEdge(e, attrs, directed))\n b.g.sameRank = same\n graphs.push(b.g)\n }\n if (!graphs.length) throw new DiagramError('No “graph” or “digraph” found')\n return graphs\n}\n\nfunction applyNode(n: GNode, a: Record<string, string>) {\n const shapeName = (a.shape ?? 'ellipse').toLowerCase()\n n.shape = SHAPES[shapeName] ?? 'ellipse'\n const lab = a.label\n if (lab !== undefined) {\n if (lab.startsWith('<') && lab.endsWith('>')) n.label = htmlLabel(lab.slice(1, -1))\n else if (shapeName === 'record' || shapeName === 'mrecord') {\n const rows = recordRows(lab, n.id)\n n.label = rows.join('\\n')\n if (rows.length > 1) n.sections = rows.map((r) => ({ rows: [[r]], center: true }) as Section)\n } else n.label = plainLabel(lab, n.id)\n }\n if (n.shape === 'point') n.label = ''\n const st: NodeStyle = {}\n const style = (a.style ?? '').toLowerCase()\n if (style.includes('filled') || a.fillcolor) st.fill = dotColor(a.fillcolor ?? a.color) ?? '#d3d3d3'\n else if (n.shape !== 'point') st.fill = '#ffffff'\n if (a.color) st.stroke = dotColor(a.color)\n else st.stroke = '#000000'\n if (a.fontcolor) st.color = dotColor(a.fontcolor)\n if (style.includes('dashed')) st.dash = '6 4'\n if (style.includes('dotted')) st.dash = '2 3'\n if (style.includes('bold')) st.sw = 2.4\n if (a.penwidth) st.sw = Math.min(8, Number(a.penwidth) || 1)\n if (style.includes('invis')) st.hidden = true\n if (style.includes('rounded') && n.shape === 'rect') n.shape = 'round'\n if (n.shape === 'none') st.fill = undefined\n n.style = st\n}\n\nfunction applyEdge(e: GEdge, a: Record<string, string>, directed: boolean): GEdge {\n const style = (a.style ?? '').toLowerCase()\n const dir = (a.dir ?? (directed ? 'forward' : 'none')).toLowerCase()\n const head = arrow(a.arrowhead, 'arrow')\n const tail = arrow(a.arrowtail, 'arrow')\n e.head = dir === 'forward' || dir === 'both' ? head : 'none'\n e.tail = dir === 'back' || dir === 'both' ? tail : 'none'\n const lab = a.label ?? a.xlabel\n if (lab) e.label = lab.startsWith('<') && lab.endsWith('>') ? htmlLabel(lab.slice(1, -1)) : plainLabel(lab, '')\n if (a.headlabel) e.headLabel = plainLabel(a.headlabel, '')\n if (a.taillabel) e.tailLabel = plainLabel(a.taillabel, '')\n e.line = style.includes('invis') ? 'hidden' : style.includes('dashed') ? 'dashed' : style.includes('dotted') ? 'dotted' : style.includes('bold') ? 'thick' : 'solid'\n e.color = dotColor(a.color) ?? '#000000'\n if (a.penwidth) e.sw = Math.min(8, Number(a.penwidth) || 1)\n if (a.minlen) e.minlen = Math.max(1, Math.min(6, Math.round(Number(a.minlen)) || 1))\n return e\n}\n\nexport function renderDot(src: string): Rendered {\n return renderGraph(parseDot(src)[0])\n}\n\nexport function renderDotAll(src: string): Rendered[] {\n return parseDot(src).map(renderGraph)\n}\n","/** Pie charts, Gantt charts and mind maps / work breakdown trees. */\nimport type { Rendered } from './graph'\nimport { measure, pathData, Svg, textWidth, THEME, wrap, type Pt } from './svg'\n\nconst MARGIN = 16\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\n// ---------------------------------------------------------------- pie\n\nexport interface Pie {\n title?: string\n showData?: boolean\n slices: { label: string; value: number }[]\n}\n\nexport function renderPie(p: Pie): Rendered {\n const slices = p.slices.filter((s) => s.value > 0 && Number.isFinite(s.value))\n if (!slices.length) throw new Error('The pie chart has no values')\n const total = slices.reduce((a, s) => a + s.value, 0)\n const R = 130\n const svg = new Svg()\n const titleH = p.title ? 36 : 0\n const cx = MARGIN + R\n const cy = MARGIN + titleH + R\n const color = (k: number) => THEME.series[k % THEME.series.length]\n let a0 = -Math.PI / 2\n const at = (a: number, r: number): Pt => ({ x: cx + Math.cos(a) * r, y: cy + Math.sin(a) * r })\n slices.forEach((s, k) => {\n const frac = s.value / total\n const a1 = a0 + frac * 2 * Math.PI\n if (frac >= 0.9999) svg.circle(cx, cy, R, { fill: color(k), stroke: '#ffffff', sw: 2 })\n else {\n const p0 = at(a0, R)\n const p1 = at(a1, R)\n svg.path(`M${r2(cx)} ${r2(cy)} L${r2(p0.x)} ${r2(p0.y)} A${R} ${R} 0 ${frac > 0.5 ? 1 : 0} 1 ${r2(p1.x)} ${r2(p1.y)} Z`, { fill: color(k), stroke: '#ffffff', sw: 2 })\n }\n if (frac >= 0.06) {\n const m = at((a0 + a1) / 2, R * 0.66)\n svg.text(m.x, m.y, `${Math.round(frac * 1000) / 10}%`, { anchor: 'middle', size: 13, bold: true, color: '#ffffff' })\n }\n a0 = a1\n })\n // legend\n const lx = cx + R + 30\n const lh = 24\n const ly = cy - (slices.length * lh) / 2 + lh / 2\n let lw = 0\n slices.forEach((s, k) => {\n const text = p.showData ? `${s.label} [${fmt(s.value)}]` : s.label\n svg.rect(lx, ly + k * lh - 8, 16, 16, { fill: color(k) }, 3)\n svg.text(lx + 24, ly + k * lh, text)\n lw = Math.max(lw, textWidth(text, 14))\n })\n let W = lx + 24 + lw + MARGIN\n const H = Math.max(cy + R, ly + slices.length * lh) + MARGIN\n if (p.title) {\n W = Math.max(W, textWidth(p.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, p.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\nconst fmt = (v: number) => (Number.isInteger(v) ? String(v) : String(Math.round(v * 100) / 100))\n\n// ---------------------------------------------------------------- gantt\n\nexport interface GanttTask {\n name: string\n start: number\n end: number\n done?: boolean\n active?: boolean\n crit?: boolean\n milestone?: boolean\n}\n\nexport interface Gantt {\n title?: string\n sections: { name: string; tasks: GanttTask[] }[]\n}\n\nconst HOUR = 3600e3\nconst DAY = 24 * HOUR\n\nconst pad2 = (v: number) => String(v).padStart(2, '0')\n\nexport function renderGantt(g: Gantt): Rendered {\n const tasks = g.sections.flatMap((s) => s.tasks)\n if (!tasks.length) throw new Error('The Gantt chart has no tasks')\n const t0 = Math.min(...tasks.map((t) => t.start))\n const t1 = Math.max(...tasks.map((t) => Math.max(t.end, t.start)))\n const span = Math.max(t1 - t0, HOUR)\n const sectW = Math.min(180, Math.max(0, ...g.sections.map((s) => textWidth(s.name, 13, true))) + 24)\n const chartW = Math.max(560, Math.min(1100, tasks.length * 60))\n const scale = chartW / span\n const titleH = g.title ? 36 : 0\n const ROW = 28\n const axisH = 24\n const x0 = MARGIN + sectW\n const y0 = MARGIN + titleH\n const X = (t: number) => x0 + (t - t0) * scale\n const svg = new Svg()\n const H = y0 + tasks.length * ROW + axisH + MARGIN + 6\n // ticks\n const steps = [HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR, DAY, 2 * DAY, 7 * DAY, 14 * DAY, 30 * DAY, 91 * DAY, 365 * DAY]\n const step = steps.find((st) => span / st <= 12) ?? 365 * DAY\n const first = Math.ceil(t0 / step) * step\n const label = (t: number) => {\n const d = new Date(t)\n if (step < DAY) return `${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`\n if (step >= 365 * DAY) return String(d.getUTCFullYear())\n if (step >= 30 * DAY) return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}`\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`\n }\n const bottom = y0 + tasks.length * ROW + 4\n for (let t = first; t <= t1; t += step) {\n const x = X(t)\n svg.line(x, y0, x, bottom, { stroke: '#e3e6ec', sw: 1 })\n svg.text(x, bottom + 12, label(t), { anchor: 'middle', size: 11, color: THEME.muted })\n }\n let row = 0\n g.sections.forEach((s, k) => {\n const color = THEME.series[k % THEME.series.length]\n const top = y0 + row * ROW\n if (k % 2 === 0) svg.rect(MARGIN, top, sectW + chartW, s.tasks.length * ROW, { fill: '#f6f7fa' })\n if (s.name) svg.text(MARGIN + 6, top + (s.tasks.length * ROW) / 2, wrap([s.name], sectW - 12, 13, true), { size: 13, bold: true })\n for (const t of s.tasks) {\n const y = y0 + row * ROW + ROW / 2\n if (t.milestone) {\n const x = X(t.start)\n svg.poly(\n [\n [x, y - 8],\n [x + 8, y],\n [x, y + 8],\n [x - 8, y],\n ],\n { fill: t.crit ? '#e5596b' : THEME.dark },\n )\n svg.text(x + 14, y, t.name, { size: 12 })\n } else {\n const xa = X(t.start)\n const w = Math.max(3, X(t.end) - xa)\n const fill = t.done ? '#c7ccd6' : color\n svg.rect(xa, y - 9, w, 18, { fill, stroke: t.crit ? '#c0392b' : t.active ? THEME.dark : undefined, sw: t.crit || t.active ? 2 : 0 }, 3)\n const tw = textWidth(t.name, 12)\n if (tw + 10 < w) svg.text(xa + w / 2, y, t.name, { anchor: 'middle', size: 12, color: t.done ? THEME.ink : '#ffffff' })\n else if (xa + w + 6 + tw < x0 + chartW + 200) svg.text(xa + w + 6, y, t.name, { size: 12 })\n else svg.text(xa - 6, y, t.name, { anchor: 'end', size: 12 })\n }\n row++\n }\n })\n let W = x0 + chartW + MARGIN\n // labels to the right of the last bars\n for (const t of tasks) W = Math.max(W, X(t.end) + 12 + textWidth(t.name, 12) + MARGIN)\n if (g.title) {\n W = Math.max(W, textWidth(g.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, g.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\n// ---------------------------------------------------------------- mind maps / trees\n\nexport interface TreeNode {\n label: string\n shape?: 'rect' | 'round' | 'circle' | 'cloud' | 'hexagon' | 'none'\n side?: 'left' | 'right'\n children: TreeNode[]\n}\n\ninterface Placed {\n n: TreeNode\n w: number\n h: number\n text: string[]\n x: number\n y: number\n color: string\n depth: number\n kids: Placed[]\n span: number\n}\n\nconst GAP_X = 44\nconst GAP_Y = 12\n\nexport function renderTree(root: TreeNode, title?: string): Rendered {\n const svg = new Svg()\n const size = (n: TreeNode, depth: number) => {\n const fs = depth === 0 ? 16 : depth === 1 ? 14 : 13\n const text = wrap(n.label.split('\\n'), 220, fs, depth === 0)\n const t = measure(text, fs, depth === 0)\n const circle = n.shape === 'circle'\n const d = Math.max(t.w, t.h) + 20\n return { text, w: circle ? d : t.w + (n.shape === 'none' ? 8 : 24), h: circle ? d : t.h + (n.shape === 'none' ? 6 : 14), fs }\n }\n const build = (n: TreeNode, depth: number, color: string): Placed => {\n const s = size(n, depth)\n const kids = n.children.map((c, k) => build(c, depth + 1, depth === 0 ? THEME.series[k % THEME.series.length] : color))\n const span = Math.max(s.h, kids.reduce((a, c) => a + c.span, 0) + Math.max(0, kids.length - 1) * GAP_Y)\n return { n, w: s.w, h: s.h, text: s.text, x: 0, y: 0, color, depth, kids, span }\n }\n const top = build(root, 0, THEME.dark)\n // sides: explicit, else balanced by size\n let right: Placed[] = []\n let left: Placed[] = []\n if (top.kids.some((k) => k.n.side)) {\n right = top.kids.filter((k) => k.n.side !== 'left')\n left = top.kids.filter((k) => k.n.side === 'left')\n } else if (top.kids.length > 3) {\n const total = top.kids.reduce((a, k) => a + k.span, 0)\n let acc = 0\n for (const k of top.kids) {\n if (acc < total / 2) right.push(k)\n else left.push(k)\n acc += k.span\n }\n } else right = top.kids\n const place = (p: Placed, x: number, yTop: number, dir: number) => {\n p.x = x\n let y = yTop + (p.span - (p.kids.reduce((a, c) => a + c.span, 0) + Math.max(0, p.kids.length - 1) * GAP_Y)) / 2\n for (const c of p.kids) {\n place(c, x + dir * (p.w / 2 + GAP_X + c.w / 2), y, dir)\n y += c.span + GAP_Y\n }\n p.y = p.kids.length ? (p.kids[0].y + p.kids[p.kids.length - 1].y) / 2 : yTop + p.span / 2\n }\n const sideSpan = (ks: Placed[]) => ks.reduce((a, c) => a + c.span, 0) + Math.max(0, ks.length - 1) * GAP_Y\n const spanR = sideSpan(right)\n const spanL = sideSpan(left)\n const height = Math.max(top.h, spanR, spanL)\n let y = (height - spanR) / 2\n for (const c of right) {\n place(c, top.w / 2 + GAP_X + c.w / 2, y, 1)\n y += c.span + GAP_Y\n }\n y = (height - spanL) / 2\n for (const c of left) {\n place(c, -(top.w / 2 + GAP_X + c.w / 2), y, -1)\n y += c.span + GAP_Y\n }\n top.x = 0\n top.y = height / 2\n // bounds\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n const all: Placed[] = []\n const walk = (p: Placed) => {\n all.push(p)\n minX = Math.min(minX, p.x - p.w / 2)\n maxX = Math.max(maxX, p.x + p.w / 2)\n minY = Math.min(minY, p.y - p.h / 2)\n maxY = Math.max(maxY, p.y + p.h / 2)\n p.kids.forEach(walk)\n }\n walk(top)\n const titleH = title ? 36 : 0\n const ox = MARGIN - minX\n const oy = MARGIN + titleH - minY\n const P = (p: Placed): Pt => ({ x: p.x + ox, y: p.y + oy })\n for (const p of all) {\n for (const c of p.kids) {\n const a = P(p)\n const b = P(c)\n const dir = Math.sign(b.x - a.x) || 1\n const s = { x: a.x + (dir * p.w) / 2, y: a.y }\n const t = { x: b.x - (dir * c.w) / 2, y: b.y }\n const m = (s.x + t.x) / 2\n svg.path(pathData([{ c: 'M', p: [s] }, { c: 'C', p: [{ x: m, y: s.y }, { x: m, y: t.y }, t] }]), { stroke: c.color, sw: Math.max(1.2, 3.2 - c.depth * 0.6) })\n }\n }\n for (const p of all) {\n const c = P(p)\n const fs = p.depth === 0 ? 16 : p.depth === 1 ? 14 : 13\n const x = c.x - p.w / 2\n const y = c.y - p.h / 2\n const shape = p.n.shape ?? (p.depth === 0 ? 'round' : 'round')\n const fill = p.depth === 0 ? THEME.dark : p.depth === 1 ? p.color : tint(p.color)\n const ink = p.depth <= 1 ? '#ffffff' : THEME.ink\n if (shape === 'none') {\n svg.line(x, y + p.h, x + p.w, y + p.h, { stroke: p.color, sw: 1.5 })\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs })\n continue\n }\n if (shape === 'circle') svg.circle(c.x, c.y, p.w / 2, { fill, stroke: p.color, sw: 1.2 })\n else if (shape === 'hexagon') {\n const s = p.h / 4\n svg.poly(\n [\n [x + s, y],\n [x + p.w - s, y],\n [x + p.w, c.y],\n [x + p.w - s, y + p.h],\n [x + s, y + p.h],\n [x, c.y],\n ],\n { fill, stroke: p.color, sw: 1.2 },\n )\n } else svg.rect(x, y, p.w, p.h, { fill, stroke: p.depth === 0 ? undefined : p.color, sw: 1.2 }, shape === 'rect' ? 2 : shape === 'cloud' ? p.h / 2 : 8)\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs, bold: p.depth === 0, color: ink })\n }\n let W = maxX - minX + 2 * MARGIN\n const H = maxY - minY + 2 * MARGIN + titleH\n if (title) {\n W = Math.max(W, textWidth(title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\n/** a light version of a #rrggbb color */\nfunction tint(c: string): string {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(c)\n if (!m) return '#f1f3f7'\n return '#' + [m[1], m[2], m[3]].map((h) => Math.round(parseInt(h, 16) * 0.22 + 255 * 0.78).toString(16).padStart(2, '0')).join('')\n}\n","/**\n * Sequence diagrams (Mermaid sequenceDiagram, PlantUML): participants across, messages down, with activations,\n * notes, fragments (loop / alt / opt / par…), dividers and delays.\n */\nimport type { Rendered } from './graph'\nimport { DiagramError, lineHeight, measure, Svg, textWidth, THEME } from './svg'\n\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\nexport type PKind = 'participant' | 'actor' | 'database' | 'boundary' | 'control' | 'entity' | 'collections' | 'queue'\n\nexport interface Participant {\n id: string\n label: string\n kind: PKind\n fill?: string\n}\n\nexport type MsgHead = 'filled' | 'open' | 'cross' | 'half' | 'none'\n\nexport type SeqEvent =\n | { t: 'msg'; from: string; to: string; text: string; dashed: boolean; head: MsgHead; both?: boolean; activate?: boolean; deactivate?: boolean }\n | { t: 'act'; who: string; on: boolean }\n | { t: 'note'; pos: 'left' | 'right' | 'over'; who: string[]; text: string }\n | { t: 'block'; kind: string; label: string; fill?: string }\n | { t: 'else'; label: string }\n | { t: 'end' }\n | { t: 'divider'; text: string }\n | { t: 'delay'; text: string }\n | { t: 'space'; h: number }\n | { t: 'destroy'; who: string }\n\nexport interface Sequence {\n title?: string\n participants: Participant[]\n events: SeqEvent[]\n autonumber?: boolean\n /** participants drawn again at the bottom (default true) */\n footer?: boolean\n}\n\nexport class SequenceBuilder {\n readonly s: Sequence = { participants: [], events: [] }\n private ids = new Map<string, Participant>()\n\n participant(id: string, patch: Partial<Participant> = {}): Participant {\n let p = this.ids.get(id)\n if (!p) {\n p = { id, label: id, kind: 'participant' }\n this.ids.set(id, p)\n this.s.participants.push(p)\n }\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) (p as unknown as Record<string, unknown>)[k] = v\n return p\n }\n\n has(id: string) {\n return this.ids.has(id)\n }\n\n push(e: SeqEvent) {\n if (e.t === 'msg') {\n this.participant(e.from)\n this.participant(e.to)\n } else if (e.t === 'note') e.who.forEach((w) => this.participant(w))\n else if (e.t === 'act' || e.t === 'destroy') this.participant(e.who)\n this.s.events.push(e)\n }\n}\n\nconst SIZE = 14\nconst MSG = 13\nconst MLH = lineHeight(MSG)\nconst MARGIN = 16\nconst lines = (s: string) => (s ? s.split('\\n') : [])\n\ninterface PBox {\n w: number\n h: number\n text: string[]\n}\n\nfunction pbox(p: Participant): PBox {\n const text = lines(p.label)\n const t = measure(text, SIZE)\n switch (p.kind) {\n case 'actor':\n return { w: Math.max(44, t.w + 8), h: 44 + t.h, text }\n case 'boundary':\n case 'control':\n case 'entity':\n return { w: Math.max(44, t.w + 8), h: 34 + t.h, text }\n case 'database':\n return { w: Math.max(64, t.w + 24), h: t.h + 30, text }\n default:\n return { w: Math.max(64, t.w + 24), h: t.h + 18, text }\n }\n}\n\nfunction drawParticipant(svg: Svg, p: Participant, b: PBox, cx: number, y: number) {\n const fill = p.fill ?? THEME.fill\n const st = { fill, stroke: THEME.stroke, sw: 1.3 }\n const ink = { fill: 'none', stroke: THEME.dark, sw: 1.5 }\n const textBelow = (top: number) => svg.text(cx, top + (b.text.length * lineHeight(SIZE)) / 2, b.text, { anchor: 'middle' })\n const x = cx - b.w / 2\n switch (p.kind) {\n case 'actor':\n svg.circle(cx, y + 8, 7, { ...ink, fill })\n svg.line(cx, y + 15, cx, y + 29, ink).line(cx - 11, y + 20, cx + 11, y + 20, ink)\n svg.line(cx, y + 29, cx - 9, y + 41, ink).line(cx, y + 29, cx + 9, y + 41, ink)\n textBelow(y + 44)\n return\n case 'boundary':\n svg.circle(cx + 4, y + 14, 12, st).line(cx - 14, y + 4, cx - 14, y + 24, ink).line(cx - 14, y + 14, cx - 8, y + 14, ink)\n textBelow(y + 32)\n return\n case 'control':\n svg.circle(cx, y + 15, 12, st).poly(\n [\n [cx + 4, y - 1],\n [cx - 2, y + 3],\n [cx + 4, y + 7],\n ],\n ink,\n false,\n )\n textBelow(y + 32)\n return\n case 'entity':\n svg.circle(cx, y + 13, 12, st).line(cx - 12, y + 27, cx + 12, y + 27, ink)\n textBelow(y + 32)\n return\n case 'database': {\n const ry = 6\n const w = b.w\n const h = b.h\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x + w)} ${r2(y + ry)} L${r2(x + w)} ${r2(y + h - ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x)} ${r2(y + h - ry)} Z`, st)\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 0 ${r2(x + w)} ${r2(y + ry)}`, { ...st, fill: 'none' })\n svg.text(cx, y + h / 2 + ry / 2, b.text, { anchor: 'middle' })\n return\n }\n case 'collections':\n svg.rect(x + 4, y - 4, b.w, b.h, st, 3)\n svg.rect(x, y, b.w, b.h, st, 3)\n break\n case 'queue':\n svg.rect(x, y, b.w, b.h, st, b.h / 2)\n break\n default:\n svg.rect(x, y, b.w, b.h, st, 3)\n }\n svg.text(cx, y + b.h / 2, b.text, { anchor: 'middle' })\n}\n\nfunction arrowHead(svg: Svg, head: MsgHead, x: number, y: number, dir: number) {\n const col = THEME.line\n switch (head) {\n case 'filled':\n svg.poly(\n [\n [x, y],\n [x - dir * 10, y - 4.5],\n [x - dir * 10, y + 4.5],\n ],\n { fill: col, stroke: col, sw: 1 },\n )\n break\n case 'open':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n [x - dir * 10, y + 5],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'half':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'cross':\n svg.line(x - 5 - dir * 4, y - 5, x + 5 - dir * 4, y + 5, { stroke: col, sw: 1.6 }).line(x - 5 - dir * 4, y + 5, x + 5 - dir * 4, y - 5, { stroke: col, sw: 1.6 })\n break\n }\n}\n\ninterface Frame {\n kind: string\n label: string\n fill?: string\n y0: number\n y1: number\n lo: number\n hi: number\n depth: number\n elses: { y: number; label: string }[]\n}\n\nexport function renderSequence(s: Sequence): Rendered {\n const ps = s.participants\n if (!ps.length) throw new DiagramError('The sequence diagram has no participants')\n if (ps.length > 300 || s.events.length > 8000) throw new DiagramError('The sequence diagram is too large to draw')\n const idx = new Map(ps.map((p, k) => [p.id, k]))\n const boxes = ps.map(pbox)\n const n = ps.length\n // ---- horizontal: gaps between neighbouring lifelines\n const gap = new Array(n).fill(0)\n for (let k = 1; k < n; k++) gap[k] = (boxes[k - 1].w + boxes[k].w) / 2 + 28\n let leftExtra = 0\n let rightExtra = 0\n const need = (a: number, b: number, v: number) => {\n if (a > b) [a, b] = [b, a]\n if (a === b) return\n let have = 0\n for (let k = a + 1; k <= b; k++) have += gap[k]\n if (have >= v) return\n const add = (v - have) / (b - a)\n for (let k = a + 1; k <= b; k++) gap[k] += add\n }\n const num = (k: number) => (s.autonumber ? textWidth(String(k), 10) + 14 : 0)\n let count = 0\n for (const e of s.events) {\n if (e.t === 'msg') {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const tw = Math.max(0, ...lines(e.text).map((l) => textWidth(l, MSG))) + num(count)\n if (a === b) {\n if (a + 1 < n) need(a, a + 1, boxes[a + 1].w / 2 + tw + 44)\n else rightExtra = Math.max(rightExtra, tw + 44 - boxes[a].w / 2)\n } else need(a, b, tw + 30)\n } else if (e.t === 'note') {\n const tw = measure(lines(e.text), MSG).w + 20\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n if (e.pos === 'over') {\n if (a !== b) need(a, b, tw - 50)\n } else if (e.pos === 'left') {\n if (a > 0) need(a - 1, a, tw + 16 + boxes[a - 1].w / 2)\n else leftExtra = Math.max(leftExtra, tw + 16 - boxes[0].w / 2)\n } else if (b + 1 < n) need(b, b + 1, tw + 16 + boxes[b + 1].w / 2)\n else rightExtra = Math.max(rightExtra, tw + 16 - boxes[b].w / 2)\n }\n }\n const cx: number[] = []\n // frames add a margin on the outer lifelines\n const deepest = (() => {\n let d = 0\n let m = 0\n for (const e of s.events) {\n if (e.t === 'block') m = Math.max(m, ++d)\n else if (e.t === 'end') d = Math.max(0, d - 1)\n }\n return m\n })()\n const frameRoom = deepest ? 12 + deepest * 8 : 0\n cx[0] = MARGIN + Math.max(boxes[0].w / 2, leftExtra + boxes[0].w / 2, frameRoom + 10)\n for (let k = 1; k < n; k++) cx[k] = cx[k - 1] + gap[k]\n let width = cx[n - 1] + Math.max(boxes[n - 1].w / 2, rightExtra + boxes[n - 1].w / 2, frameRoom + 10) + MARGIN\n\n // ---- vertical\n const titleH = s.title ? 34 : 0\n const top = MARGIN + titleH\n const headH = Math.max(...boxes.map((b) => b.h))\n let y = top + headH + 18\n const svgBack = new Svg()\n const svgMid = new Svg()\n const svgFront = new Svg()\n const active: number[][] = ps.map(() => [])\n const bars: { k: number; y0: number; y1: number; depth: number }[] = []\n const frames: Frame[] = []\n const open: Frame[] = []\n const ended = new Map<number, number>()\n const touch = (lo: number, hi: number) => {\n for (const f of open) {\n f.lo = Math.min(f.lo, lo)\n f.hi = Math.max(f.hi, hi)\n }\n }\n const actX = (k: number, side: number) => {\n const d = active[k].length\n return cx[k] + (d ? side * 5 + (d - 1) * 5 : 0)\n }\n const activate = (k: number, at: number) => active[k].push(at)\n const deactivate = (k: number, at: number) => {\n const y0 = active[k].pop()\n if (y0 !== undefined) bars.push({ k, y0, y1: at, depth: active[k].length })\n }\n count = 0\n for (const e of s.events) {\n switch (e.t) {\n case 'msg': {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const text = lines(e.text)\n const th = text.length * MLH\n const paint = { stroke: THEME.line, sw: 1.4, dash: e.dashed ? '6 4' : undefined }\n const nw = num(count)\n if (a === b) {\n y += th + 4\n const x0 = actX(a, 1)\n const loopW = 34\n svgMid.poly(\n [\n [x0, y],\n [x0 + loopW, y],\n [x0 + loopW, y + 20],\n [x0 + 2, y + 20],\n ],\n paint,\n false,\n )\n arrowHead(svgMid, e.head, x0, y + 20, -1)\n svgFront.text(x0 + 6 + nw, y - 4 - th / 2, text, { size: MSG })\n if (s.autonumber) numberBadge(svgFront, x0, y, count)\n touch(cx[a] - 10, x0 + loopW + 6 + nw + Math.max(...text.map((l) => textWidth(l, MSG))))\n y += 20\n if (e.activate) activate(b, y)\n if (e.deactivate) deactivate(a, y)\n y += 14\n break\n }\n y += th + 6\n const dir = b > a ? 1 : -1\n if (e.activate) activate(b, y)\n const x1 = actX(a, dir)\n const x2 = actX(b, -dir)\n svgMid.line(x1, y, x2, y, paint)\n arrowHead(svgMid, e.head, x2, y, dir)\n if (e.both) arrowHead(svgMid, e.head, x1, y, -dir)\n svgFront.text((x1 + x2) / 2 + (dir * nw) / 2, y - 5 - th / 2, text, { anchor: 'middle', size: MSG })\n if (s.autonumber) numberBadge(svgFront, x1, y, count)\n if (e.deactivate) deactivate(a, y)\n touch(Math.min(cx[a], cx[b]), Math.max(cx[a], cx[b]))\n y += 14\n break\n }\n case 'act': {\n const k = idx.get(e.who)!\n if (e.on) activate(k, y - 6)\n else deactivate(k, y - 6)\n break\n }\n case 'note': {\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n const text = lines(e.text)\n const t = measure(text, MSG)\n const w = Math.max(t.w + 20, e.pos === 'over' && a !== b ? cx[b] - cx[a] + 50 : 0, 60)\n const h = t.h + 12\n y += 6\n const x = e.pos === 'left' ? cx[a] - 12 - w : e.pos === 'right' ? cx[b] + 12 : (cx[a] + cx[b]) / 2 - w / 2\n svgFront.poly(\n [\n [x, y],\n [x + w - 8, y],\n [x + w, y + 8],\n [x + w, y + h],\n [x, y + h],\n ],\n { fill: THEME.note, stroke: THEME.noteStroke, sw: 1 },\n )\n svgFront.text(x + 10, y + h / 2, text, { size: MSG })\n touch(x, x + w)\n y += h + 8\n break\n }\n case 'block': {\n y += 10\n const f: Frame = { kind: e.kind, label: e.label, fill: e.fill, y0: y, y1: y, lo: Infinity, hi: -Infinity, depth: open.length, elses: [] }\n frames.push(f)\n open.push(f)\n y += e.kind === 'rect' ? 8 : 26\n break\n }\n case 'else': {\n const f = open[open.length - 1]\n if (!f) break\n y += 8\n f.elses.push({ y, label: e.label })\n y += 24\n break\n }\n case 'end': {\n const f = open.pop()\n if (!f) break\n y += 10\n f.y1 = y\n y += 6\n break\n }\n case 'divider': {\n y += 16\n const t = measure(lines(e.text), MSG)\n svgFront.line(MARGIN / 2, y - 2, width - MARGIN / 2, y - 2, { stroke: THEME.muted, sw: 1 }).line(MARGIN / 2, y + 2, width - MARGIN / 2, y + 2, { stroke: THEME.muted, sw: 1 })\n if (e.text) {\n svgFront.rect(width / 2 - t.w / 2 - 10, y - t.h / 2 - 4, t.w + 20, t.h + 8, { fill: '#ffffff', stroke: THEME.muted, sw: 1 }, 3)\n svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, bold: true })\n }\n y += 22\n break\n }\n case 'delay':\n y += 14\n if (e.text) svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, italic: true, color: THEME.muted })\n y += 18\n break\n case 'space':\n y += e.h\n break\n case 'destroy': {\n const k = idx.get(e.who)!\n y += 6\n svgFront.line(cx[k] - 8, y - 8, cx[k] + 8, y + 8, { stroke: '#c0392b', sw: 2 }).line(cx[k] - 8, y + 8, cx[k] + 8, y - 8, { stroke: '#c0392b', sw: 2 })\n ended.set(k, y)\n y += 14\n break\n }\n }\n }\n for (let k = 0; k < n; k++) while (active[k].length) deactivate(k, y)\n for (const f of open.splice(0)) f.y1 = y\n y += 14\n const footer = s.footer !== false\n const height = y + (footer ? headH : 0) + MARGIN\n\n // frames: widths from what they contain (or the whole width when empty)\n for (const f of frames) {\n const pad = 12 + (deepest - f.depth) * 8\n if (f.lo > f.hi) {\n f.lo = cx[0]\n f.hi = cx[n - 1]\n }\n const x0 = Math.max(4, f.lo - pad)\n // wide enough for its title and branch labels (the picture grows if need be)\n const tab = textWidth(f.kind, 12, true) + 16\n const titles = [f.label ? tab + 8 + textWidth(`[${f.label}]`, 12) : tab, ...f.elses.map((e) => 10 + textWidth(`[${e.label}]`, 12))]\n const x1 = Math.max(Math.min(width - 4, f.hi + pad), f.kind === 'rect' ? 0 : x0 + Math.max(...titles) + 10)\n width = Math.max(width, x1 + 4)\n if (f.kind === 'rect') {\n svgBack.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, { fill: f.fill ?? 'rgba(200, 210, 230, 0.35)' }, 2)\n continue\n }\n const frameP = { stroke: THEME.muted, sw: 1.2 }\n svgMid.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, frameP)\n const tw = tab\n svgMid.poly(\n [\n [x0, f.y0],\n [x0 + tw, f.y0],\n [x0 + tw, f.y0 + 12],\n [x0 + tw - 7, f.y0 + 19],\n [x0, f.y0 + 19],\n ],\n { fill: '#eef0f4', stroke: THEME.muted, sw: 1.2 },\n )\n svgMid.text(x0 + 7, f.y0 + 10, f.kind, { size: 12, bold: true })\n if (f.label) svgMid.text(x0 + tw + 8, f.y0 + 11, `[${f.label}]`, { size: 12, color: THEME.ink, italic: true })\n for (const el of f.elses) {\n svgMid.line(x0, el.y, x1, el.y, { ...frameP, dash: '5 4' })\n if (el.label) svgMid.text(x0 + 10, el.y + 12, `[${el.label}]`, { size: 12, italic: true })\n }\n }\n\n // lifelines, activations, participants\n const out = new Svg()\n const lifeTop = top + headH\n for (let k = 0; k < n; k++) out.line(cx[k], lifeTop, cx[k], ended.get(k) ?? (footer ? y : y - 6), { stroke: '#9aa3b2', sw: 1, dash: '5 4' })\n out.raw(svgBack.body())\n for (const b of bars) {\n const x = cx[b.k] - 5 + b.depth * 5\n out.rect(x, b.y0, 10, Math.max(8, b.y1 - b.y0), { fill: '#f3f4f6', stroke: THEME.stroke, sw: 1 })\n }\n out.raw(svgMid.body())\n out.raw(svgFront.body())\n ps.forEach((p, k) => {\n drawParticipant(out, p, boxes[k], cx[k], top + headH - boxes[k].h)\n if (footer && !ended.has(k)) drawParticipant(out, p, boxes[k], cx[k], y)\n })\n if (s.title) {\n width = Math.max(width, textWidth(s.title, 16, true) + 2 * MARGIN)\n out.text(width / 2, MARGIN + 12, s.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: out.toString(width, height), w: Math.ceil(width), h: Math.ceil(height) }\n}\n\nfunction numberBadge(svg: Svg, x: number, y: number, k: number) {\n const r = Math.max(8, textWidth(String(k), 10) / 2 + 4)\n svg.circle(x, y, r, { fill: THEME.dark })\n svg.text(x, y, String(k), { anchor: 'middle', size: 10, color: '#ffffff', bold: true })\n}\n","/** What a diagram source parses to, and its picture. */\nimport { renderGantt, renderPie, renderTree, type Gantt, type Pie, type TreeNode } from './charts'\nimport { renderGraph, type Graph, type Rendered } from './graph'\nimport { renderSequence, type Sequence } from './sequence'\n\nexport type Model =\n | { t: 'graph'; graph: Graph }\n | { t: 'sequence'; seq: Sequence }\n | { t: 'pie'; pie: Pie }\n | { t: 'gantt'; gantt: Gantt }\n | { t: 'tree'; root: TreeNode; title?: string }\n\nexport function renderModel(m: Model): Rendered {\n switch (m.t) {\n case 'graph':\n return renderGraph(m.graph)\n case 'sequence':\n return renderSequence(m.seq)\n case 'pie':\n return renderPie(m.pie)\n case 'gantt':\n return renderGantt(m.gantt)\n case 'tree':\n return renderTree(m.root, m.title)\n }\n}\n","/**\n * PlantUML: sequence, class / object, use case, component / deployment, state and activity diagrams, mind maps and\n * work breakdown structures; @startdot hands over to the Graphviz reader. A file may hold several diagrams.\n * https://plantuml.com\n */\nimport type { TreeNode } from './charts'\nimport { parseDot } from './dot'\nimport { GraphBuilder, type GEdge, type Head, type Rendered, type Section, type Shape } from './graph'\nimport { renderModel, type Model } from './model'\nimport { SequenceBuilder, type MsgHead, type PKind } from './sequence'\nimport { color, DiagramError, labelText } from './svg'\nimport { dict } from '../dict'\n\n/** the diagrams of a file: the text of each @startX … @endX block (the whole text when there is none) */\nexport function plantUmlBlocks(src: string): { kind: string; lines: string[] }[] {\n const text = src.replace(/^/, '').replace(/\\r\\n?/g, '\\n')\n const out: { kind: string; lines: string[] }[] = []\n const re = /^[ \\t]*@start(\\w+)[^\\n]*\\n([\\s\\S]*?)^[ \\t]*@end\\1\\b/gm\n let m: RegExpExecArray | null\n while ((m = re.exec(text))) out.push({ kind: m[1].toLowerCase(), lines: m[2].split('\\n') })\n if (!out.length) out.push({ kind: 'uml', lines: text.split('\\n') })\n return out\n}\n\nexport function parsePlantUml(src: string): Model[] {\n return plantUmlBlocks(src).map(({ kind, lines }) => parseBlock(kind, lines))\n}\n\nexport const renderPlantUml = (src: string): Rendered[] => parsePlantUml(src).map(renderModel)\n\nfunction parseBlock(kind: string, raw: string[]): Model {\n if (kind === 'dot') return { t: 'graph', graph: parseDot(raw.join('\\n'))[0] }\n const { lines, title, dir } = clean(raw)\n switch (kind) {\n case 'uml':\n break\n case 'mindmap':\n case 'wbs':\n return { t: 'tree', root: tree(lines, kind === 'wbs'), title }\n default:\n throw new DiagramError(`PlantUML @start${kind} diagrams are not supported yet`)\n }\n switch (umlKind(lines)) {\n case 'activity':\n return { t: 'graph', graph: { ...activity(lines), title } }\n case 'sequence':\n return { t: 'sequence', seq: { ...sequence(lines), title } }\n case 'state':\n return { t: 'graph', graph: { ...state(lines, dir), title } }\n default:\n return { t: 'graph', graph: { ...description(lines, dir), title } }\n }\n}\n\n/** creole / HTML markup out of a label */\nexport function pText(s: string): string {\n return labelText(\n s\n .trim()\n .replace(/^\"(.*)\"$/s, '$1')\n .replace(/\\*\\*(.+?)\\*\\*|\\/\\/(.+?)\\/\\/|\"\"(.+?)\"\"|__(.+?)__|~~(.+?)~~|--(.+?)--/g, (...m) => m.slice(1, 7).find((x) => x !== undefined) ?? '')\n .replace(/<\\/?(?:b|i|u|s|font|color|size|back|code|plain|strike|w|sub|sup)\\b[^>]*>/gi, '')\n .replace(/<&[\\w-]+>/g, '')\n .replace(/\\\\t/g, ' '),\n )\n}\n\n/** comments, skinparams, legends, headers out; the title and the direction */\nfunction clean(raw: string[]): { lines: string[]; title?: string; dir?: 'LR' | 'TB' } {\n const lines: string[] = []\n let title: string | undefined\n let dir: 'LR' | 'TB' | undefined\n let skip: RegExp | null = null\n let titleLines: string[] | null = null\n let inComment = false\n for (let l of raw) {\n if (inComment) {\n const e = l.indexOf(\"'/\")\n if (e < 0) continue\n l = l.slice(e + 2)\n inComment = false\n }\n l = l.replace(/\\/'.*?'\\//g, '')\n const c = l.indexOf(\"/'\")\n if (c >= 0) {\n l = l.slice(0, c)\n inComment = true\n }\n const t = l.trim()\n if (skip) {\n if (skip.test(t)) skip = null\n continue\n }\n if (titleLines) {\n if (/^end\\s*title$/i.test(t)) {\n title = pText(titleLines.join('\\n'))\n titleLines = null\n } else titleLines.push(t)\n continue\n }\n if (!t || t.startsWith(\"'\")) continue\n let m: RegExpExecArray | null\n if (/^skinparam\\b.*\\{$/i.test(t) || /^(legend|header|footer)\\b(?!.*:)/i.test(t) && !/^(header|footer)\\s+\\S/i.test(t)) {\n skip = /^(\\}|end\\s*legend|endlegend|end\\s*header|endheader|end\\s*footer|endfooter)$/i\n continue\n }\n if (/^(skinparam|!|hide|show|scale|caption|header|footer|newpage|allowmixing|autoactivate|set\\s+namespaceSeparator|page|mainframe|sprite|remove|restore|together|left\\s+header|right\\s+footer)\\b/i.test(t)) continue\n if ((m = /^title\\s*:?\\s*(.*)$/i.exec(t))) {\n if (m[1]) title = pText(m[1])\n else titleLines = []\n continue\n }\n if (/^left\\s+to\\s+right\\s+direction$/i.test(t)) {\n dir = 'LR'\n continue\n }\n if (/^top\\s+to\\s+bottom\\s+direction$/i.test(t)) {\n dir = 'TB'\n continue\n }\n lines.push(t)\n }\n return { lines, title, dir }\n}\n\nfunction umlKind(lines: string[]): 'activity' | 'sequence' | 'state' | 'description' {\n const has = (re: RegExp) => lines.some((l) => re.test(l))\n if (has(/^(start|stop)$/) || has(/^:[\\s\\S]*[;|<>/\\]}]$/) || has(/^:/) || has(/^(if\\s*\\(.*\\)\\s*then|while\\s*\\(|repeat\\b|fork$|endif$)/)) return 'activity'\n if (has(/\\[\\*\\]/) || has(/^state\\s/)) return 'state'\n if (has(/^(participant|boundary|control|collections|queue|autonumber|activate|deactivate|alt|loop|return|ref\\s+over)\\b/) || has(/^(==.*==|\\.\\.\\.|\\|\\|\\d*\\|\\|)$/)) return 'sequence'\n if (has(/^(abstract|class|interface|enum|annotation|struct|protocol|object|map|json|usecase|component|node|cloud|package|namespace|folder|frame|rectangle|artifact|storage|card|file|agent|person|hexagon|together)\\b/)) return 'description'\n if (has(/\\([^)]*\\)|\\[[^\\]*]+\\]|<\\|--|--\\|>|\\*--|o--|\\.\\.>/)) return 'description'\n if (has(/^(actor|database|entity)\\b/) || has(/^\\S+\\s*<?-{1,2}>?>?\\s*\\S+\\s*:/)) return 'sequence'\n return 'description'\n}\n\n// ---------------------------------------------------------------- sequence\n\nconst KIND: Record<string, PKind> = dict({ participant: 'participant', actor: 'actor', boundary: 'boundary', control: 'control', entity: 'entity', database: 'database', collections: 'collections', queue: 'queue' })\n\nfunction sequence(lines: string[]) {\n const b = new SequenceBuilder()\n const calls: { from: string; to: string }[] = []\n let noteLines: string[] | null = null\n let note: { pos: 'left' | 'right' | 'over'; who: string[] } | null = null\n let last: { from: string; to: string } | null = null\n const id = (s: string) => {\n const t = s.trim().replace(/^\"(.*)\"$/, '$1')\n return t\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*(note|ref|rnote|hnote)$/i.test(l)) {\n if (note && note.who.length) b.push({ t: 'note', pos: note.pos, who: note.who, text: pText(noteLines.join('\\n')) })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^(?:create\\s+)?(participant|actor|boundary|control|entity|database|collections|queue)\\s+(.+)$/.exec(l))) {\n let rest = m[2].replace(/\\s+order\\s+-?\\d+/, '').trim()\n const col = /\\s+(#\\w+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n rest = rest.replace(/<<[^>]*>>/g, '').trim()\n let pid = rest\n let label = rest\n const as1 = /^\"([^\"]+)\"\\s+as\\s+(\\S+)$/.exec(rest)\n const as2 = /^(\\S+)\\s+as\\s+\"?([^\"]+)\"?$/.exec(rest)\n if (as1) [pid, label] = [as1[2], as1[1]]\n else if (as2) [pid, label] = [as2[1], as2[2]]\n else pid = label = id(rest)\n b.participant(pid, { kind: KIND[m[1].toLowerCase()], label: pText(label), fill: col ? color(col[1].slice(1)) ?? color(col[1]) : undefined })\n continue\n }\n if (/^hide\\s+footbox$/i.test(l)) {\n b.s.footer = false\n continue\n }\n if (/^autonumber\\b/i.test(l)) {\n b.s.autonumber = !/\\bstop\\b/i.test(l)\n continue\n }\n if ((m = /^(activate|deactivate|destroy)\\s+(\\S+)/i.exec(l))) {\n const who = id(m[2])\n if (m[1].toLowerCase() === 'destroy') b.push({ t: 'destroy', who })\n else b.push({ t: 'act', who, on: m[1].toLowerCase() === 'activate' })\n continue\n }\n if ((m = /^return\\b\\s*(.*)$/i.exec(l))) {\n const c = calls.pop() ?? (last ? { from: last.from, to: last.to } : null)\n if (c) b.push({ t: 'msg', from: c.to, to: c.from, text: pText(m[1]), dashed: true, head: 'filled', deactivate: true })\n continue\n }\n if ((m = /^[rh]?note\\s+(left|right|over)(?:\\s+of)?\\s*([^:]*?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l)) || (m = /^ref\\s+over\\s+()([^:]+?)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const pos = (m[1] || 'over').toLowerCase() as 'left' | 'right' | 'over'\n let who = m[2] ? m[2].split(',').map(id).filter(Boolean) : []\n if (!who.length && last) who = [pos === 'left' ? last.from : last.to]\n if (!who.length && b.s.participants.length) who = [b.s.participants[0].id]\n if (m[3] !== undefined) {\n if (who.length) b.push({ t: 'note', pos, who, text: pText(m[3]) })\n } else {\n noteLines = []\n note = { pos, who }\n }\n continue\n }\n if ((m = /^note\\s+across\\s*:\\s*(.*)$/i.exec(l))) {\n const ps = b.s.participants\n if (ps.length) b.push({ t: 'note', pos: 'over', who: [ps[0].id, ps[ps.length - 1].id], text: pText(m[1]) })\n continue\n }\n if ((m = /^(alt|opt|loop|par|break|critical|group)\\b\\s*(.*)$/i.exec(l))) {\n const kind = m[1].toLowerCase()\n b.push({ t: 'block', kind: kind === 'group' ? pText(m[2]) || 'group' : kind, label: kind === 'group' ? '' : pText(m[2]) })\n continue\n }\n if ((m = /^else\\b\\s*(.*)$/i.exec(l))) {\n b.push({ t: 'else', label: pText(m[1]) })\n continue\n }\n if (/^end$/i.test(l)) {\n b.push({ t: 'end' })\n continue\n }\n if (/^(box\\b|end\\s*box)/i.test(l)) continue\n if ((m = /^==\\s*(.*?)\\s*==$/.exec(l))) {\n b.push({ t: 'divider', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\.\\.\\.\\s*(.*?)\\s*(?:\\.\\.\\.)?$/.exec(l))) {\n b.push({ t: 'delay', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\|\\|(\\d*)\\|\\|$/.exec(l)) || l === '|||') {\n b.push({ t: 'space', h: m?.[1] ? Math.min(400, Number(m[1])) : 20 })\n continue\n }\n const msg = seqMessage(l)\n if (msg) {\n const { from, to, dashed, head, both, act, text } = msg\n b.push({ t: 'msg', from, to, text, dashed, head, both, activate: act === '++', deactivate: act === '--' })\n last = { from, to }\n if (act === '++') calls.push({ from, to })\n if (act === '--' && calls.length) calls.pop()\n if (act === '**') b.participant(to)\n if (act === '!!') b.push({ t: 'destroy', who: to })\n }\n }\n return b.s\n}\n\nconst ARROW = /^(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(<<?|[\\\\/]{1,2})?(-{1,2}|\\.{1,2})(?:\\[[^\\]]*\\])?(-?)(>>?|[\\\\/]{1,2})?\\s*([ox])?\\s*(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(\\+\\+|--|\\*\\*|!!)?\\s*(?::\\s*(.*))?$/u\n\nfunction seqMessage(l: string) {\n // \"o->\", \"x<-\": lost / found markers before the arrow\n const m = ARROW.exec(l.replace(/^(\\S+)\\s*([ox])(?=<|-)/, '$1 '))\n if (!m) return null\n const [, a, left, line, , right, , z, act, text] = m\n if (!left && !right) return null\n if (!a || !z) return null\n const clean = (s: string) => s.replace(/^\"(.*)\"$/, '$1')\n let from = clean(a)\n let to = clean(z)\n if (from === '[' || from === ']' || to === '[' || to === ']') return null\n const dashed = line === '--' || line.startsWith('.')\n const headOf = (s: string | undefined): MsgHead => (!s ? 'none' : s === '>>' || s === '<<' ? 'open' : s.length && /[\\\\/]/.test(s) ? 'half' : 'filled')\n let head: MsgHead\n let both = false\n if (left && right) {\n head = headOf(right)\n both = true\n } else if (left) {\n ;[from, to] = [to, from]\n head = headOf(left)\n } else head = headOf(right)\n if (/x\\s*$/.test(l.split(':')[0].replace(z, '').trim()) && !left) head = 'cross'\n return { from, to, dashed, head, both, act, text: pText(text ?? '') }\n}\n\n// ---------------------------------------------------------------- class, use case, component… (description diagrams)\n\nconst ELEMENT: Record<string, Shape> = dict({\n actor: 'actor', person: 'actor', usecase: 'ellipse', component: 'component', node: 'box3d', database: 'cylinder', cloud: 'cloud', folder: 'folder', frame: 'folder',\n package: 'folder', artifact: 'note', file: 'note', storage: 'stadium', queue: 'stadium', stack: 'rect', card: 'rect', rectangle: 'rect', agent: 'rect', label: 'none',\n boundary: 'circle', control: 'circle', entity: 'rect', collections: 'rect', hexagon: 'hexagon', interface: 'rect', circle: 'circle', port: 'point', portin: 'point', portout: 'point',\n action: 'rect', process: 'round', usecase_: 'ellipse', object: 'rect', map: 'rect', json: 'rect', diamond: 'diamond', state: 'round',\n})\nconst CLASSES = new Set(['class', 'abstract', 'abstract class', 'interface', 'enum', 'annotation', 'struct', 'protocol', 'entity', 'exception', 'metaclass', 'stereotype', 'object', 'map', 'json'])\n\nconst MARKS: Record<string, Head> = dict({\n '>': 'arrow', '<': 'arrow', '|>': 'triangle', '<|': 'triangle', '^': 'triangle', '*': 'diamond', o: 'odiamond', '#': 'odiamond', x: 'cross', '+': 'ocircle',\n '{': 'many', '}': 'many', '>>': 'open', '<<': 'open', '|o': 'zero-one', 'o|': 'zero-one', '||': 'one', '}o': 'zero-many', 'o{': 'zero-many', '}|': 'one-many', '|{': 'one-many',\n})\n\nconst END = String.raw`\\[\\*\\]|\\[[^\\]]+\\]|\\([^)]*\\)|:[^:]+:|\"[^\"]+\"|\\(\\)\\s*\"[^\"]+\"|\\(\\)\\s*[\\w.]+|[\\w.$À--]+`\nconst LINK = new RegExp(\n String.raw`^(${END})\\s*(?:\"([^\"]*)\"\\s*)?((?:<\\||<<|\\}o|\\}\\||\\|o|\\|\\||[<*o#x+^}])?)([-.=~]+)(?:\\[([^\\]]*)\\])?((?:up|down|left|right|u|d|l|r|le|ri|do)?)([-.=~]*)(?:\\[([^\\]]*)\\])?((?:\\|>|>>|o\\{|\\|\\{|o\\||\\|\\||[>*#+^{]|[ox](?=\\s|\\[|\\(|\"|:|$))?)\\s*(?:\"([^\"]*)\"\\s*)?(${END})\\s*(?::\\s*(.*))?$`,\n 'u',\n)\n\ninterface ClassInfo {\n kind: string\n stereo?: string\n sections: string[][]\n}\n\nfunction description(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'rect')\n const info = new Map<string, ClassInfo>()\n const ns: string[] = []\n const stackKinds: string[] = []\n let body: { id: string; c: ClassInfo } | null = null\n let noteLines: string[] | null = null\n let noteTarget: string | undefined\n let noteId = ''\n let notes = 0\n let anon = 0\n const cur = () => ns[ns.length - 1]\n /** an element written in a link or a declaration: its id (created when new) */\n const element = (raw: string): string => {\n let t = raw.trim()\n let m: RegExpExecArray | null\n if (t === '(*)') return 'start'\n if ((m = /^\\[(.+)\\]$/.exec(t))) return ensure(m[1], 'component')\n if ((m = /^\\((.*)\\)$/.exec(t))) return ensure(m[1], 'ellipse')\n if ((m = /^:(.+):$/.exec(t))) return ensure(m[1], 'actor')\n if ((m = /^\\(\\)\\s*\"?([^\"]+)\"?$/.exec(t))) return ensure(m[1], 'circle')\n t = t.replace(/^\"(.*)\"$/, '$1')\n if (!b.has(t) && !b.isCluster(t)) b.node(t, { label: pText(t) }, cur())\n return t\n }\n const ensure = (name: string, shape: Shape) => {\n const id = name.trim()\n if (!b.has(id) && !b.isCluster(id)) b.node(id, { label: pText(id), shape }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n b.node(noteId, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteTarget) b.edge({ from: noteTarget, to: noteId, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (body) {\n if (l === '}') {\n body = null\n continue\n }\n if (/^(--|==|\\.\\.|__)(.*?)(--|==|\\.\\.|__)?$/.test(l)) body.c.sections.push([])\n else body.c.sections[body.c.sections.length - 1].push(pText(l.replace(/\\{(static|abstract|classifier|field|method)\\}\\s*/g, '')))\n continue\n }\n let m: RegExpExecArray | null\n if (l === '}' || /^end\\s*(package|namespace|rectangle|node|folder|frame|together)$/i.test(l)) {\n ns.pop()\n stackKinds.pop()\n continue\n }\n // note\n if ((m = /^note\\s+(left|right|top|bottom)(?:\\s+of)?\\s+(\\S+?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const target = element(m[2])\n const nid = `__note${notes++}`\n if (m[3] !== undefined) {\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: target, to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteTarget = target\n noteId = nid\n }\n continue\n }\n if ((m = /^note\\s+\"([^\"]*)\"\\s+as\\s+(\\S+)$/i.exec(l))) {\n b.node(m[2], { label: pText(m[1]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n continue\n }\n if ((m = /^note\\s+as\\s+(\\S+)$/i.exec(l))) {\n noteLines = []\n noteTarget = undefined\n noteId = m[1]\n continue\n }\n // container: package \"Name\" { / rectangle System {\n if ((m = /^(package|namespace|rectangle|node|folder|frame|cloud|database|component|card|storage|artifact|file|stack|queue|agent|hexagon|together)\\s*(?:\"([^\"]*)\"|([^\\s{<#]+))?\\s*(?:as\\s+(\\S+))?\\s*(<<[^>]*>>)?\\s*(#\\S+)?\\s*\\{$/.exec(l))) {\n const kind = m[1].toLowerCase()\n const label = m[2] ?? m[3] ?? ''\n const cid = m[4] ?? (m[3] || m[2] || `__group${anon++}`)\n const c = b.cluster(cid, kind === 'together' ? '' : pText(label), cur())\n const fill = m[6] ? color(m[6].slice(1)) ?? color(m[6]) : undefined\n if (fill) c.style = { fill }\n if (kind === 'together') c.style = { fill: 'none', stroke: 'none' }\n ns.push(cid)\n stackKinds.push(kind)\n continue\n }\n // class-like declaration\n if ((m = /^(abstract\\s+class|abstract|class|interface|enum|annotation|struct|protocol|entity|exception|metaclass|stereotype|object|map|json)\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+)|(\\S+)\\s+as\\s+\"([^\"]+)\"|([^\\s{<#]+))(?:\\s*<([^>]+)>)?\\s*(<<.+?>>)?\\s*(#\\S+)?\\s*(\\{)?\\s*(\\})?$/.exec(l)) && CLASSES.has(m[1].toLowerCase().replace(/\\s+/, ' '))) {\n const kind = m[1].toLowerCase().replace(/\\s+/, ' ')\n const cid = m[3] ?? m[4] ?? m[6]\n const label = m[2] ?? m[5] ?? cid\n const generic = m[7] ? `<${m[7]}>` : ''\n b.node(cid, { label: pText(label) + generic, shape: 'rect' }, cur())\n const c: ClassInfo = info.get(cid) ?? { kind, sections: [[], []] }\n c.kind = kind\n if (m[8]) c.stereo = m[8].replace(/^<<|>>$/g, '').trim()\n const fill = m[9] ? color(m[9].slice(1)) ?? color(m[9]) : undefined\n if (fill) b.node(cid).style = { fill }\n info.set(cid, c)\n if (m[10] && !m[11]) {\n c.sections = [[]]\n body = { id: cid, c }\n }\n continue\n }\n // element declaration\n if ((m = /^(actor\\/?|usecase\\/?|component|node|database|cloud|folder|frame|package|artifact|file|storage|queue|stack|card|rectangle|agent|label|boundary|control|entity|collections|hexagon|interface|circle|person|port|portin|portout|action|process|diamond)\\s+(.+)$/.exec(l))) {\n const kind = m[1].toLowerCase().replace('/', '')\n let rest = m[2].trim()\n const col = /\\s+(#[\\w]+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n const stereo = /\\s*<<(.+?)>>\\s*$/.exec(rest)\n if (stereo) rest = rest.slice(0, stereo.index).trim()\n let id = rest\n let label = rest\n const a1 = /^(.+?)\\s+as\\s+(.+)$/.exec(rest)\n if (a1) {\n const [x, y] = [a1[1].trim(), a1[2].trim()]\n // the quoted / bracketed side is the label\n if (/^[\"([:]/.test(x)) [label, id] = [x, y]\n else [id, label] = [x, y]\n }\n label = label.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3')\n id = id.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3').replace(/^\"(.*)\"$/, '$1')\n const shape = kind === 'usecase' ? 'ellipse' : kind === 'actor' ? 'actor' : (ELEMENT[kind] ?? 'rect')\n const n = b.node(id, { label: pText(label) + (stereo ? `\\n«${stereo[1]}»` : ''), shape }, cur())\n const fill = col ? color(col[1].slice(1)) ?? color(col[1]) : undefined\n if (fill) n.style = { ...n.style, fill }\n continue\n }\n // shorthand elements alone on a line\n if ((m = /^(\\[[^\\]]+\\]|\\([^)]+\\)|:[^:]+:)(?:\\s+as\\s+(\\S+))?$/.exec(l))) {\n const id = element(m[1])\n if (m[2]) {\n const n = b.get(id)!\n b.node(m[2], { label: n.label, shape: n.shape }, cur())\n b.g.nodes.splice(b.g.nodes.indexOf(n), 1)\n }\n continue\n }\n if ((m = LINK.exec(l))) {\n const [, ra, la, lm, l1, , dirWord, l2, , rm, lb, rz, label] = m\n let a = element(ra)\n let z = element(rz)\n const line = l1 + l2\n let tail = lm ? MARKS[lm] ?? 'none' : 'none'\n let head = rm ? MARKS[rm] ?? 'none' : 'none'\n let tl = la\n let hl = lb\n // \"up\" / \"left\": laid out the other way round\n if (/^(up|u|left|l|le)$/i.test(dirWord)) {\n ;[a, z] = [z, a]\n ;[tail, head] = [head, tail]\n ;[tl, hl] = [hl, tl]\n }\n const e: GEdge = { from: a, to: z, head, tail, line: line.includes('.') ? 'dashed' : line.includes('=') ? 'thick' : line.includes('~') ? 'dotted' : 'solid' }\n if (label) e.label = pText(label.replace(/\\s*[<>]\\s*$|^\\s*[<>]\\s*/g, ''))\n if (tl) e.tailLabel = tl\n if (hl) e.headLabel = hl\n b.edge(e)\n continue\n }\n // Class : member\n if ((m = /^([\\w.$]+)\\s*:\\s*(.+)$/.exec(l)) && (info.has(m[1]) || b.has(m[1]))) {\n const c = info.get(m[1]) ?? { kind: 'class', sections: [[], []] }\n info.set(m[1], c)\n const mem = pText(m[2])\n if (mem.includes('(') && c.sections.length > 1) c.sections[1].push(mem)\n else c.sections[0].push(mem)\n continue\n }\n }\n // start / end of old-style activity links\n const start = b.get('start')\n if (start && start.label === 'start' && b.g.edges.some((e) => e.from === 'start' || e.to === 'start')) {\n start.shape = 'start'\n start.label = ''\n const ins = b.g.edges.filter((e) => e.to === 'start')\n if (ins.length) {\n b.node('__end', { shape: 'end', label: '' })\n for (const e of ins) e.to = '__end'\n }\n }\n for (const n of b.g.nodes) {\n const c = info.get(n.id)\n if (!c) continue\n const header: string[][] = []\n const stereo = c.stereo ?? (c.kind === 'interface' ? 'interface' : c.kind === 'enum' ? 'enumeration' : c.kind === 'annotation' ? 'annotation' : c.kind === 'abstract' || c.kind === 'abstract class' ? 'abstract' : undefined)\n if (stereo) header.push([`«${stereo}»`])\n header.push([n.label])\n const sections: Section[] = [{ rows: header, bold: true, center: true, italic: c.kind.startsWith('abstract') }]\n for (const s of c.sections) sections.push({ rows: s.map((x) => [x]) })\n n.sections = sections\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- state\n\nfunction state(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'round')\n const scope: string[] = []\n const desc = new Map<string, string[]>()\n let notes = 0\n let noteLines: string[] | null = null\n let noteFor: string | undefined\n const cur = () => scope[scope.length - 1]\n const st = (raw: string, asTarget: boolean): string => {\n const id = raw.trim().replace(/^\"(.*)\"$/, '$1')\n if (id === '[*]') {\n const sid = `${cur() ?? ''}__${asTarget ? 'end' : 'start'}`\n b.node(sid, { label: '', shape: asTarget ? 'end' : 'start' }, cur())\n return sid\n }\n if (!b.isCluster(id) && !b.has(id)) b.node(id, { label: id }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteFor) b.edge({ from: noteFor, to: nid, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (l === '--' || l === '||') continue\n let m: RegExpExecArray | null\n if ((m = /^state\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+?)|(\\S+?)\\s+as\\s+\"([^\"]+)\"|(\"[^\"]+\"|[^\\s{<#]+))\\s*(<<(\\w+)>>)?\\s*(#\\S+)?\\s*(\\{)?$/i.exec(l))) {\n const id = (m[2] ?? m[3] ?? m[5]).replace(/^\"(.*)\"$/, '$1')\n const label = m[1] ?? m[4] ?? id\n const kind = m[7]?.toLowerCase()\n if (m[9]) {\n b.cluster(id, pText(label), cur())\n scope.push(id)\n continue\n }\n const shape: Shape | undefined =\n kind === 'fork' || kind === 'join' ? 'bar' : kind === 'choice' ? 'diamond' : kind === 'start' || kind === 'entrypoint' ? 'start' : kind === 'end' || kind === 'exitpoint' ? 'end' : undefined\n b.node(id, { label: shape ? '' : pText(label), shape }, cur())\n const fill = m[8] ? color(m[8].slice(1)) ?? color(m[8]) : undefined\n if (fill) b.node(id).style = { fill }\n continue\n }\n if (l === '}') {\n scope.pop()\n continue\n }\n if ((m = /^note\\s+(left|right|top|bottom)\\s+of\\s+(\\S+)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n if (m[3] !== undefined) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: st(m[2], false), to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteFor = st(m[2], false)\n }\n continue\n }\n if ((m = /^(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(-+|\\.+)(?:\\[[^\\]]*\\])?((?:up|down|left|right|u|d|l|r)?)(-*|\\.*)(?:\\[[^\\]]*\\])?>\\s*(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(?::\\s*(.*))?$/u.exec(l))) {\n let a = st(m[1], false)\n let z = st(m[5], true)\n let rev = false\n if (/^(up|u|left|l)$/i.test(m[3])) {\n ;[a, z] = [z, a]\n rev = true\n }\n b.edge({ from: a, to: z, head: rev ? 'none' : 'arrow', tail: rev ? 'arrow' : 'none', line: m[2].includes('.') ? 'dashed' : 'solid', label: m[6] ? pText(m[6]) : undefined })\n continue\n }\n if ((m = /^([\\w.$À-]+)\\s*:\\s*(.+)$/u.exec(l))) {\n st(m[1], false)\n desc.set(m[1], [...(desc.get(m[1]) ?? []), pText(m[2])])\n }\n }\n for (const n of b.g.nodes) {\n const d = desc.get(n.id)\n if (d && n.shape === 'round') n.sections = [{ rows: [[n.label]], bold: true, center: true }, { rows: d.map((x) => [x]) }]\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- activity (new syntax)\n\ninterface Exit {\n from: string\n label?: string\n}\n\nfunction activity(raw: string[]) {\n const b = new GraphBuilder('TB', 'round')\n // join multi-line actions \":…;\"\n const lines: string[] = []\n for (let k = 0; k < raw.length; k++) {\n let l = raw[k]\n if (/^:/.test(l) && !/[;|<>/\\]}]$/.test(l)) {\n while (k + 1 < raw.length && !/[;|<>/\\]}]$/.test(l)) l += '\\n' + raw[++k]\n }\n lines.push(l)\n }\n let i = 0\n let n = 0\n const scope: string[] = []\n const node = (shape: Shape, label = '') => {\n const id = `a${n++}`\n b.node(id, { shape, label }, scope[scope.length - 1])\n return id\n }\n let pendingLabel: string | undefined\n const link = (exits: Exit[], to: string) => {\n for (const e of exits) b.edge({ from: e.from, to, head: 'arrow', label: e.label })\n }\n const cond = (s: string) => pText(s.replace(/^\\((.*)\\)$/, '$1'))\n /** statements until a line matching `stop` (left unread); returns the open ends */\n const block = (start: Exit[], stop: RegExp): Exit[] => {\n let cur = start\n const put = (id: string) => {\n if (pendingLabel !== undefined) cur = cur.map((e) => ({ ...e, label: e.label ?? pendingLabel }))\n pendingLabel = undefined\n link(cur, id)\n }\n while (i < lines.length) {\n const l = lines[i]\n if (stop.test(l)) return cur\n i++\n let m: RegExpExecArray | null\n if (/^start$/i.test(l)) {\n const id = node('start')\n put(id)\n cur = [{ from: id }]\n } else if (/^(stop|end)$/i.test(l)) {\n const id = node('end')\n put(id)\n cur = []\n } else if (/^(kill|detach|break)$/i.test(l)) cur = []\n else if ((m = /^:([\\s\\S]*?)[;|<>/\\]}]$/.exec(l))) {\n const id = node('round', pText(m[1]))\n put(id)\n cur = [{ from: id }]\n } else if ((m = /^->\\s*(.*?);?$/.exec(l))) pendingLabel = pText(m[1]) || undefined\n else if ((m = /^if\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?\\s*$/i.exec(l)) || (m = /^if\\s*(\\(.*\\))\\s*(?:is\\s*\\((.*)\\))?\\s*then\\s*$/i.exec(l))) {\n let d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = block([{ from: d, label: m[2] ? pText(m[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i)\n let open = true\n while (i < lines.length) {\n const t = lines[i++]\n let e: RegExpExecArray | null\n if ((e = /^(?:elseif|else\\s*if)\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?$/i.exec(t))) {\n const d2 = node('diamond', cond(e[1]))\n b.edge({ from: d, to: d2, head: 'arrow' })\n d = d2\n out = out.concat(block([{ from: d2, label: e[2] ? pText(e[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i))\n } else if ((e = /^else\\s*(?:\\((.*)\\))?$/i.exec(t))) {\n out = out.concat(block([{ from: d, label: e[1] ? pText(e[1]) : undefined }], /^(endif|end\\s*if)\\b/i))\n open = false\n } else break\n }\n if (open) out.push({ from: d })\n cur = out\n } else if ((m = /^switch\\s*(\\(.*\\))$/i.exec(l))) {\n const d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = []\n while (i < lines.length) {\n const t = lines[i++]\n const e = /^case\\s*(\\(.*\\))$/i.exec(t)\n if (!e) break\n out = out.concat(block([{ from: d, label: cond(e[1]) }], /^(case\\s*\\(|endswitch)/i))\n }\n cur = out\n } else if ((m = /^while\\s*(\\(.*?\\))\\s*(?:is\\s*\\((.*)\\))?$/i.exec(l))) {\n const w = node('diamond', cond(m[1]))\n put(w)\n const body = block([{ from: w, label: m[2] ? pText(m[2]) : undefined }], /^(endwhile|end\\s*while)\\b/i)\n link(body, w)\n const e = /^(?:endwhile|end\\s*while)\\s*(?:\\((.*)\\))?$/i.exec(lines[i++] ?? '')\n cur = [{ from: w, label: e?.[1] ? pText(e[1]) : undefined }]\n } else if ((m = /^repeat\\s*(?::([\\s\\S]*?)[;|<>/\\]}])?$/i.exec(l)) && !/^repeat\\s*while/i.test(l)) {\n const r = m[1] !== undefined ? node('round', pText(m[1])) : node('diamond', '')\n put(r)\n const body = block([{ from: r }], /^(repeat\\s*while|backward)/i)\n let back: string | undefined\n let bm: RegExpExecArray | null\n if ((bm = /^backward\\s*:([\\s\\S]*?)[;|<>/\\]}]$/i.exec(lines[i] ?? ''))) {\n back = node('round', pText(bm[1]))\n i++\n }\n const e = /^repeat\\s*while\\s*(\\(.*?\\))?\\s*(?:is\\s*\\((.*?)\\))?\\s*(?:not\\s*\\((.*?)\\))?$/i.exec(lines[i++] ?? '')\n const d = node('diamond', e?.[1] ? cond(e[1]) : '')\n link(body, d)\n if (back) {\n b.edge({ from: d, to: back, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n b.edge({ from: back, to: r, head: 'arrow' })\n } else b.edge({ from: d, to: r, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n cur = [{ from: d, label: e?.[3] ? pText(e[3]) : undefined }]\n } else if (/^(fork|split)$/i.test(l)) {\n const fork = /^fork$/i.test(l)\n let f: string | undefined\n let starts = cur\n if (fork) {\n f = node('bar')\n put(f)\n starts = [{ from: f }]\n } else if (pendingLabel !== undefined) pendingLabel = undefined\n let out: Exit[] = []\n for (;;) {\n out = out.concat(block(starts, /^(fork\\s+again|split\\s+again|end\\s*fork|end\\s*merge|end\\s*split)\\b/i))\n const t = lines[i++] ?? ''\n if (!/again/i.test(t)) break\n }\n if (fork) {\n const j = node('bar')\n link(out, j)\n cur = [{ from: j }]\n } else cur = out\n } else if ((m = /^(?:partition|group|package|rectangle|card)\\s+(?:\"([^\"]*)\"|(\\S[^{]*?))\\s*(?:#\\S+)?\\s*\\{?$/i.exec(l))) {\n const name = (m[1] ?? m[2]).trim()\n const cid = `__p${n++}`\n b.cluster(cid, pText(name), scope[scope.length - 1])\n scope.push(cid)\n } else if (l === '}' || /^end\\s*group$/i.test(l)) scope.pop()\n else if (/^[rh]?note\\b/i.test(l) || /^floating\\s+note\\b/i.test(l)) {\n if (!/:/.test(l)) while (i < lines.length && !/^end\\s*note$/i.test(lines[i++]));\n }\n // swimlanes, arrows styles, labels we do not draw\n }\n return cur\n }\n block([], /^\\u0000$/)\n return b.g\n}\n\n// ---------------------------------------------------------------- mind map / WBS\n\nfunction tree(lines: string[], wbs: boolean): TreeNode {\n const stack: { depth: number; n: TreeNode }[] = []\n let root: TreeNode | undefined\n for (let k = 0; k < lines.length; k++) {\n const l = lines[k]\n const m = /^([*+\\-#]+)(_)?\\s*(?:\\[#[\\w]+\\])?\\s*(.*)$/.exec(l)\n if (!m) continue\n let text = m[3]\n // \":multi\\nline;\" nodes\n if (text.startsWith(':')) {\n text = text.slice(1)\n while (!/;\\s*$/.test(text) && k + 1 < lines.length) text += '\\n' + lines[++k]\n text = text.replace(/;\\s*$/, '')\n }\n const depth = m[1].length\n const side = m[1][0] === '-' ? 'left' : 'right'\n const node: TreeNode = { label: pText(text), shape: m[2] ? 'none' : undefined, side: wbs ? undefined : side, children: [] }\n if (!root) {\n root = node\n stack.push({ depth, n: node })\n continue\n }\n while (stack.length > 1 && stack[stack.length - 1].depth >= depth) stack.pop()\n stack[stack.length - 1].n.children.push(node)\n stack.push({ depth, n: node })\n }\n if (!root) throw new DiagramError('The mind map is empty')\n // only the root's children choose a side\n const clear = (n: TreeNode, top: boolean) => n.children.forEach((c) => (top ? clear(c, false) : ((c.side = undefined), clear(c, false))))\n clear(root, true)\n return root\n}\n","/** Browser helpers shared by the diagram packages (not part of their typed API). */\n\n/** A PNG of an SVG picture, `scale` times its size (2: sharp on high-density screens). Browser only. */\nexport async function svgToPng(svg: string, scale = 2): Promise<Blob> {\n const size = (k: string) => Number(new RegExp(`<svg[^>]*\\\\s${k}=\"([\\\\d.]+)\"`).exec(svg)?.[1] ?? 0)\n const w = size('width')\n const h = size('height')\n if (!w || !h) throw new Error('Not a picture with a size')\n const img = new Image()\n img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n await img.decode()\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(w * scale))\n canvas.height = Math.max(1, Math.round(h * scale))\n const g = canvas.getContext('2d')\n if (!g) throw new Error('No 2D canvas')\n g.scale(scale, scale)\n g.drawImage(img, 0, 0, w, h)\n return new Promise((resolve, reject) => canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('PNG export failed'))), 'image/png'))\n}\n\n/** Puts pictures in an element (the SVG is built by the renderer: text escaped, no scripts or links). */\nexport function show(target: Element, svgs: string[]) {\n target.innerHTML = svgs.join('')\n}\n","/**\n * @p10node/plantuml: PlantUML text → SVG, with no DOM (browser, worker, Node, Bun), no server and no dependency.\n */\nimport { renderPlantUml } from '../../../src/core/diagram/plantuml'\nimport { show, svgToPng } from '../../diagram/src/dom'\n\n/** A drawing: a self-contained SVG document and its size in CSS pixels. */\nexport interface Diagram {\n svg: string\n width: number\n height: number\n}\n\n/** The source cannot be drawn (unsupported diagram kind, syntax the reader does not follow). */\nexport class DiagramError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DiagramError'\n }\n}\n\n/** Every drawing of a source (one per @startuml … @enduml block). */\nexport function renderEach(source: string): Diagram[] {\n try {\n return renderPlantUml(source).map((d) => ({ svg: d.svg, width: d.w, height: d.h }))\n } catch (e) {\n throw new DiagramError((e as Error).message)\n }\n}\n\n/** The (first) drawing of a source. */\nexport function render(source: string): Diagram {\n return renderEach(source)[0]\n}\n\n/** Draws a source into an element (its content is replaced). */\nexport function renderTo(target: Element, source: string): Diagram[] {\n const ds = renderEach(source)\n show(\n target,\n ds.map((d) => d.svg),\n )\n return ds\n}\n\n/** A PNG of a drawing's SVG, `scale` times its size. Browser only. */\nexport function toPng(svg: string, scale = 2): Promise<Blob> {\n return svgToPng(svg, scale)\n}\n"],"mappings":"AAyFA,SAAgBU,EAAQ,GAAgB,GAAgB,GAAsB,GAA0B;CACtG,IAAMC,IAAIC,EAAM,QACVC,IAAIC,EAAS,QAGbC,IAAmB,MAAM,KAAK,EAAE,QAAQJ,EAAE,SAAS,CAAC,CAAC,GACrDK,IAAe,MAAML,CAAC,CAAC,CAAC,KAAK,EAAI;CACvC,EAAM,SAAS,GAAG,MAAM;EACtB,AAAI,EAAE,MAAM,EAAE,MACdI,EAAK,EAAE,EAAE,CAAC,KAAKE,CAAC,GAChB,EAAS,EAAE,KAAK;CAClB,CAAC;CACD,IAAMC,IAAe,MAAMC,EAAM,MAAM,CAAC,CAAC,KAAK,EAAK,GAC7CC,IAAQ,IAAI,WAAWT,CAAC,GACxBU,IAAS,CAAC,GAAG,MAAM,KAAK,EAAE,QAAQV,EAAE,IAAI,GAAG,MAAMW,CAAC,CAAC,CAAC,QAAQ,MAAMN,EAASM,EAAE,GAAG,GAAG,MAAM,KAAK,EAAE,QAAQX,EAAE,IAAI,GAAG,MAAMW,CAAC,CAAC;CAC/H,KAAK,IAAMC,KAAKF,GAAQ;EACtB,IAAID,EAAMG,IAAI;EACd,EAAMA,KAAK;EACX,IAAMC,IAA4B,CAAC,CAACD,GAAG,CAAC,CAAC;EACzC,OAAOC,EAAM,SAAQ;GACnB,IAAMC,IAAMD,EAAMA,EAAM,SAAS,IAC3BE,IAAID,EAAI;GACd,IAAIA,EAAI,KAAKV,EAAKW,EAAE,CAAC,QAAQ;IAC3B,IAAMC,IAAKZ,EAAKW,EAAE,CAAC,EAAI,EAAE,KACnBE,IAAIT,EAAMQ,EAAG,CAAC;IACpB,AAAIP,EAAMQ,OAAO,IAAG,EAASD,KAAM,KACzBP,EAAMQ,OACd,EAAMA,KAAK,GACXJ,EAAM,KAAK,CAACI,GAAG,CAAC,CAAC;GAErB,OAEE,AADA,EAAMF,KAAK,GACXF,EAAM,IAAI;EAEd;CACF;CACA,IAAMK,oBAAY,IAAI,IAAoB;CAC1C,EAAE,UAAU,SAAS,GAAG,MAAMC,EAAE,SAAS,MAAMD,EAAU,IAAIH,GAAGJ,CAAC,CAAC,CAAC;CACnE,IAAMS,IAAIZ,EAAM,KAAK,GAAG,MAAM;EAC5B,IAAMa,IAAOH,EAAU,IAAI,EAAE,CAAC,KAAKA,EAAU,IAAI,EAAE,CAAC,MAAMA,EAAU,IAAI,EAAE,CAAC;EAC3E,OAAOX,EAASD,KAAK;GAAE,GAAG,EAAE;GAAG,GAAG,EAAE;GAAG,QAAQe,IAAO,IAAI,EAAE;GAAQ,QAAQ,EAAE;EAAO,IAAI;GAAE,GAAG,EAAE;GAAG,GAAG,EAAE;GAAG,QAAQA,IAAO,IAAI,EAAE;GAAQ,QAAQ,EAAE;EAAO;CAC3J,CAAC,GAGKC,IAAkB,MAAM,KAAK,EAAE,QAAQtB,EAAE,SAAS,CAAC,CAAC,GACpDuB,IAAmB,MAAM,KAAK,EAAE,QAAQvB,EAAE,SAAS,CAAC,CAAC;CAC3D,EAAE,SAAS,GAAG,MAAM;EAClB,AAAI,EAAE,MAAM,EAAE,MACduB,EAAK,EAAE,EAAE,CAAC,KAAKjB,CAAC,GAChBgB,EAAI,EAAE,EAAE,CAAC,KAAKhB,CAAC;CACjB,CAAC;CACD,IAAMkB,IAAiB,CAAC;CACxB;EACE,IAAMC,IAAMH,EAAI,KAAK,MAAMI,EAAE,MAAM,GAC7BC,IAAQ,MAAM,KAAK,EAAE,QAAQ3B,EAAE,IAAI,GAAG,MAAMW,CAAC,CAAC,CAAC,QAAQ,MAAM,CAACc,EAAId,EAAE;EAC1E,OAAOgB,EAAM,SAAQ;GACnB,IAAMZ,IAAIY,EAAM,MAAM;GACtB,EAAK,KAAKZ,CAAC;GACX,KAAK,IAAMC,KAAMO,EAAKR,IAAI,AAAK,EAAEU,EAAIL,EAAEJ,EAAG,CAAC,MAAIW,EAAM,KAAKP,EAAEJ,EAAG,CAAC,CAAC;EACnE;EAEA,IAAIQ,EAAK,SAASxB,GAAQ,KAAA,IAAIW,IAAI,GAAGA,IAAIX,GAAG,KAAK,AAAKwB,EAAK,SAASb,CAAC,KAAGa,EAAK,KAAKb,CAAC;CACrF;CACA,IAAMiB,IAAW,MAAM5B,CAAC,CAAC,CAAC,KAAK,CAAC,GAC1B6B,UAAkB;EACtB,KAAK,IAAMd,KAAKS,GAAM,KAAK,IAAMR,KAAMO,EAAKR,IAAI,EAAKK,EAAEJ,EAAG,CAAC,KAAK,KAAK,IAAIY,EAAKR,EAAEJ,EAAG,CAAC,IAAIY,EAAKb,KAAKK,EAAEJ,EAAG,CAAC,MAAM;CAChH;CACA,EAAU;CACV,KAAK,IAAIc,IAAK,GAAGA,IAAK,IAAI,KAAM;EAC9B,IAAIC,IAAQ,IACNC,IAAQF,IAAK,IAAI,CAAC,GAAGN,CAAI,CAAC,CAAC,QAAQ,IAAIA;EAC7C,KAAK,IAAMT,KAAKiB,GAAO;GACrB,IAAId,EAAU,IAAIH,CAAC,GAAG;GACtB,IAAIkB,IAAK,WACLC,IAAK,UACLC,IAAM,GACNC,IAAO;GACX,KAAK,IAAMpB,KAAMM,EAAIP,IAEnB,AADA,IAAK,KAAK,IAAIkB,GAAIL,EAAKR,EAAEJ,EAAG,CAAC,KAAKI,EAAEJ,EAAG,CAAC,MAAM,GAC9C,KAAOI,EAAEJ,EAAG,CAAC;GAEf,KAAK,IAAMA,KAAMO,EAAKR,IAEpB,AADA,IAAK,KAAK,IAAImB,GAAIN,EAAKR,EAAEJ,EAAG,CAAC,KAAKI,EAAEJ,EAAG,CAAC,MAAM,GAC9C,KAAQI,EAAEJ,EAAG,CAAC;GAEhB,IAAIqB,IAAIT,EAAKb;GAGb,AAFIoB,IAAMC,KAAQH,IAAK,YAAW,IAAIA,IAC7BG,IAAOD,KAAOD,IAAK,aAAU,IAAIA,IACtCG,MAAMT,EAAKb,OACb,EAAKA,KAAKsB,GACV,IAAQ;EAEZ;EACA,IAAI,CAACN,GAAO;CACd;CACA,IAAIO,EAAE,UAAU,QACd,KAAK,IAAIR,IAAK,GAAGA,IAAK,IAAI,KAAM;EAC9B,IAAIS,IAAU;EACd,KAAK,IAAMpB,KAAKmB,EAAE,UAAU;GAC1B,IAAMD,IAAI,KAAK,IAAI,GAAGlB,EAAE,KAAK,MAAMS,EAAKb,EAAE,CAAC;GAC3C,KAAK,IAAMA,KAAKI,GAAG,AAAIS,EAAKb,OAAOsB,MACjC,EAAKtB,KAAKsB,GACV,IAAU;EAEd;EAEA,IADAR,EAAU,GACN,CAACU,GAAS;CAChB;CAEF,IAAMC,IAAUZ,EAAK,QAAQ,GAAG,MAAM,KAAK,IAAIa,GAAGC,CAAC,GAAG,CAAC;CACvD,KAAK,IAAI3B,IAAI,GAAGA,IAAIf,GAAG,KAAK,EAAKe,MAAMyB;CACvC,IAAIG,IAAUf,EAAK,QAAQ,GAAG,MAAM,KAAK,IAAIa,GAAGC,CAAC,GAAG,CAAC,GAG/CE,KAAS,MAAc;EAC3B,IAAMC,IAAgB,CAAC;EACvB,KAAK,IAAIlC,IAAImC,GAAGnC,KAAK,GAAG,IAAIR,EAASQ,EAAE,CAAC,QAAQ,EAAI,QAAQA,CAAC;EAC7D,OAAOkC;CACT,GACME,KAAO,GAAW,MAAc;EACpC,IAAMC,IAAKJ,EAAMH,CAAC,GACZQ,IAAKL,EAAMF,CAAC,GACd/B,IAAI;EACR,OAAOA,IAAIqC,EAAG,UAAUrC,IAAIsC,EAAG,UAAUD,EAAGrC,OAAOsC,EAAGtC,KAAI;EAC1D,OAAOA,IAAIqC,EAAGrC,IAAI,KAAK;CACzB,GACMuC,IAAcjD,EAAM,KAAK,MAAMkD,EAAE,CAAC,GAClCC,IAAcnD,EAAM,KAAK,MAAMkD,EAAE,CAAC,GAClCE,IAAiBpD,EAAM,UAAU,CAAI,GACrCqD,IAAerD,EAAM,KAAK,MAAMkD,EAAE,OAAO,GACzCI,IAAe,CAAC,GAAG3B,CAAI,GACvB4B,IAAkBvD,EAAM,KAAK,MAAMkD,EAAE,QAAQ,CAAC,GAC9CM,IAAkBxD,EAAM,UAAU,EAAE,GACpCyD,KAAO,GAAW,GAAW,GAAW,GAAW,OACvDR,EAAE,KAAKjC,CAAC,GACRmC,EAAE,KAAKO,CAAC,GACRN,EAAK,KAAK1C,CAAC,GACX2C,EAAG,KAAKR,CAAC,GACTS,EAAG,KAAKlB,CAAC,GACTmB,EAAM,KAAK,CAAC,GACZC,EAAM,KAAK9C,MAAM,KAAQA,MAAM,IAAQmC,IAAI,EAAE,GACtCI,EAAE,SAAS,IAGdU,IAA2B,CAAC,GAC5BC,IAA6B,CAAC,GAC9BC,MAAQ,GAAW,GAAW,MAAc;EAChD,OAAOF,EAAG,SAASV,EAAE,SAEnB,AADAU,EAAG,KAAK,CAAC,CAAC,GACVC,EAAK,KAAK,CAAC,CAAC;EAGd,AADAA,EAAKpB,EAAE,CAAC,KAAK,CAACC,GAAGzB,CAAC,CAAC,GACnB2C,EAAGlB,EAAE,CAAC,KAAK,CAACD,GAAGxB,CAAC,CAAC;CACnB,GAEI8C,KAAS;CACb,KAAK,IAAM,KAAK3C,GAAG,MAAU,KAAK,IAAI,GAAG,KAAK,IAAIQ,EAAK,EAAE,KAAKA,EAAK,EAAE,EAAE,IAAI,CAAC;CAC5E,IAAImC,KAAS,GAAG,MAAU,MAAM,kCAAkC;CAClE,IAAMC,IAA8B,CAAC,GAC/BC,IAAoB,CAAC;CAC3B,EAAE,SAAS,GAAG,MAAM;EAClB,IAAI,EAAE,MAAM,EAAE,GAAG;GAEf,AADAD,EAAO,KAAK,IAAI,GAChBC,EAAQ,KAAK,EAAE;GACf;EACF;EACA,IAAMnB,IAAI,CAAC,EAAE,CAAC,GACRoB,IAAOtC,EAAK,EAAE,KAAKA,EAAK,EAAE,IAC1BuC,IAAM3D,EAAMF,EAAE,CAAC,OACf8D,IAAYD,KAAOD,KAAQ,IAAItC,EAAK,EAAE,KAAK,KAAK,MAAMsC,IAAO,CAAC,IAAI,IAClEG,IAAKtB,EAAIO,EAAG,EAAE,IAAIA,EAAG,EAAE,EAAE,GAC3BgB,IAAK;EACT,KAAK,IAAIjC,IAAIT,EAAK,EAAE,KAAK,GAAGS,IAAIT,EAAK,EAAE,IAAI,KAAK;GAC9C,IAAM2C,IAAIlC,MAAM+B,IAAYV,EAAIS,EAAK,GAAGA,EAAK,GAAG,GAAOE,GAAIhC,CAAC,IAAIqB,EAAI,GAAG,GAAG,GAAOW,GAAIhC,CAAC;GAEtF,AADIA,MAAM+B,MAAW,IAAKG,IAC1BzB,EAAE,KAAKyB,CAAC;EACV;EAGA,AAFAzB,EAAE,KAAK,EAAE,CAAC,GACVkB,EAAO,KAAKE,IAAO,IAAIpB,IAAI,IAAI,GAC/BmB,EAAQ,KAAKK,CAAE;EACf,KAAK,IAAI3D,IAAI,GAAGA,IAAI,IAAImC,EAAE,UACpB,OAAQ,IADoB,KAAK;GAErC,IAAML,IAAIK,EAAEnC,IACN+B,IAAII,EAAEnC,IAAI,IACV6D,IAAK,IAAK/B,OAAO,KAAkB,IAAKC,OAAO;GACrD,GAAKD,GAAGC,GAAG,EAAE,UAAU8B,MAAM,IAAI,IAAIA,MAAM,IAAI,IAAI,EAAE;EACvD;CACF,CAAC;CAED,IAAMnD,KAAOD,EAAE,KAAK,GAAG,MAAM,EAAE,MAAM,EAAE,KAAKQ,EAAK,EAAE,OAAOA,EAAK,EAAE,MAAM,CAACoC,EAAO1D,EAAE,GAE3EmE,IAAW,MAAMvE,CAAC,CAAC,CAAC,KAAK,QAAQ,GACjCwE,IAAW,MAAMxE,CAAC,CAAC,CAAC,KAAK,SAAS;CACxC,KAAK,IAAIa,IAAI,GAAGA,IAAImC,EAAE,QAAQ,KAC5B,KAAK,IAAMJ,KAAKF,EAAMU,EAAGvC,EAAE,GAEzB,AADA,EAAK+B,KAAK,KAAK,IAAI2B,EAAK3B,IAAIS,EAAGxC,EAAE,GACjC,EAAK+B,KAAK,KAAK,IAAI4B,EAAK5B,IAAIS,EAAGxC,EAAE;CAGrC,IAAM4D,IAAiB,MAAM,KAAK,EAAE,QAAQzE,EAAE,SAAS,CAAC,CAAC,GACnD0E,KAAiB,MAAM,KAAK,EAAE,QAAQ1E,EAAE,SAAS,CAAC,CAAC,GACnD2E,KAAoC,CAAC;CAC3C,KAAK,IAAI/B,IAAI,GAAGA,IAAI5C,GAAG,KACrB,IAAI,IAAK4C,KAAK4B,EAAK5B,KACnB,KAAK,IAAIT,IAAIoC,EAAK3B,IAAIT,KAAKqC,EAAK5B,IAAI,KAElC,AADA,EAAGA,EAAE,CAACT,KAAKqB,EAAI,GAAG,GAAG,GAAMZ,GAAGT,CAAC,GAC/B,GAAGS,EAAE,CAACT,KAAKqB,EAAI,GAAG,GAAG,GAAOZ,GAAGT,CAAC;CAGpC,OAAOuB,EAAG,SAASV,EAAE,SAEnB,AADAU,EAAG,KAAK,CAAC,CAAC,GACVC,EAAK,KAAK,CAAC,CAAC;CAEd,KAAK,IAAI9C,IAAI,GAAGA,IAAImC,EAAE,QAAQ,KAAK,GAAY,KAAK,CAAC,CAAC;CACtD,KAAK,IAAIJ,IAAI,GAAGA,IAAI5C,GAAG,KACrB,KAAK,IAAImC,IAAIoC,EAAK3B,IAAIT,IAAIqC,EAAK5B,IAAI,KAIjC,AAHA+B,GAAYF,EAAG7B,EAAE,CAACT,GAAG,CAAC,KAAK,CAACsC,EAAG7B,EAAE,CAACT,IAAI,IAAI,CAAC,CAAC,GAC5CwC,GAAYF,EAAG7B,EAAE,CAACT,IAAI,GAAG,CAAC,KAAK,CAACsC,EAAG7B,EAAE,CAACT,IAAI,CAAC,CAAC,GAC5CwC,GAAYD,GAAG9B,EAAE,CAACT,GAAG,CAAC,KAAK,CAACuC,GAAG9B,EAAE,CAACT,IAAI,IAAI,CAAC,CAAC,GAC5CwC,GAAYD,GAAG9B,EAAE,CAACT,IAAI,GAAG,CAAC,KAAK,CAACuC,GAAG9B,EAAE,CAACT,IAAI,CAAC,CAAC;CAGhD,IAAMyC,IAAI5B,EAAE;CACZ,IAAUK,EAAG,QAAQ,GAAG,MAAM,KAAK,IAAId,GAAGC,CAAC,GAAGC,CAAO;CAGrD,IAAIoC,IAAqB,MAAM,KAAK,EAAE,QAAQpC,IAAU,EAAE,SAAS,CAAC,CAAC;CACrE;EACE,IAAMqC,IAAO,IAAI,WAAWF,CAAC,GACvBG,IAAQ,MAAM,KAAK,EAAE,QAAQH,EAAE,IAAI,GAAG,MAAMnE,CAAC,CAAC,CACjD,QAAQ,MAAM0C,EAAK1C,OAAO,KAAQ0C,EAAK1C,OAAO,CAAK,CAAC,CACpD,MAAM,GAAG,MAAM4C,EAAGd,KAAKc,EAAGb,MAAMD,IAAIC,CAAC;EACxC,KAAK,IAAM9B,KAAKqE,GAAO;GACrB,IAAID,EAAKpE,IAAI;GACb,IAAMC,IAAQ,CAACD,CAAC;GAChB,OAAOC,EAAM,SAAQ;IACnB,IAAME,IAAIF,EAAM,IAAI;IACpB,IAAI,GAAKE,IACT;KACA,AADA,EAAKA,KAAK,GACVgE,EAAOxB,EAAGxC,GAAG,CAAC,KAAKA,CAAC;KACpB,KAAK,IAAIJ,IAAIkD,EAAK9C,EAAE,CAAC,SAAS,GAAGJ,KAAK,GAAG,KAAK,AAAKqE,EAAKnB,EAAK9C,EAAE,CAACJ,EAAE,CAAC,OAAKE,EAAM,KAAKgD,EAAK9C,EAAE,CAACJ,EAAE,CAAC,EAAE;IAFtF;GAGZ;EACF;EACA,KAAK,IAAII,IAAI,GAAGA,IAAI+D,GAAG,KAAK,CAAIzB,EAAKtC,OAAO,KAAQsC,EAAKtC,OAAO,MAAOgE,EAAOxB,EAAGxC,GAAG,CAAC,KAAKA,CAAC;CAC7F;CACA,IAAMmE,IAAM,IAAI,aAAaJ,CAAC,GACxBK,WAAeJ,EAAO,SAAS,MAAMrD,EAAE,SAAS,GAAG,MAAO,EAAIX,KAAKJ,CAAE,CAAC;CAC5E,GAAO;CACP,IAAMyE,IAAM,IAAI,aAAaN,CAAC,GACxBO,IAAc,IAAI,aAAanF,CAAC,GAChCoF,UAAsB;EAC1B,KAAK,IAAIxC,IAAI,GAAGA,IAAI5C,GAAG,KAAK;GAC1B,IAAIuE,EAAK3B,KAAK4B,EAAK5B,IAAI;GACvB,IAAIlC,IAAI;GACR,KAAK,IAAIyB,IAAIoC,EAAK3B,IAAIT,KAAKqC,EAAK5B,IAAI,KAAK,KAAKoC,EAAIP,EAAG7B,EAAE,CAACT,MAAM,KAAK,IAAI,GAAG0C,EAAO1C,EAAE,CAAC,MAAM;GAC1F,EAAYS,KAAKlC,KAAK8D,EAAK5B,KAAK2B,EAAK3B,KAAK;EAC5C;CACF,GACMyC,MAAa,GAAiB,MAAwB;EAC1D,IAAI,CAACrF,GAAG,OAAO,CAAC,GAAGsF,CAAK,CAAC,CAAC,MAAM,GAAG,MAAMJ,EAAI3C,KAAK2C,EAAI1C,MAAMwC,EAAIzC,KAAKyC,EAAIxC,EAAE;EAC3E,IAAM+C,IAAa;GAAE,MAAM;GAAI,SAAS;GAAI,KAAK;GAAG,KAAK;GAAG,OAAO,CAAC;EAAE,GAChEC,oBAAS,IAAI,IAAkB,GAC/BC,KAAS,MAAoB;GACjC,IAAI7C,IAAI,GAAG,OAAO2C;GAClB,IAAItE,IAAIuE,EAAO,IAAI5C,CAAC;GAMpB,OALK3B,MACH,IAAI;IAAE,MAAM;IAAI,SAAS2B;IAAG,KAAK;IAAG,KAAKoC,EAAIP,EAAG7B,EAAE,CAACT,OAAO;IAAG,OAAO,CAAC;GAAE,GACvEqD,EAAO,IAAI5C,GAAG3B,CAAC,GACfwE,EAAMxF,EAAS2C,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK3B,CAAC,IAEjCA;EACT;EACA,KAAK,IAAMJ,KAAKyE,GACd,AAAInC,EAAKtC,OAAO,IAAM4E,EAAMlC,EAAM1C,EAAE,IAC3BsC,EAAKtC,OAAO,KAAO4E,EAAMrC,EAAGvC,EAAE,CAAC,CAAC,MAAM,KAAK;GAAE,MAAMA;GAAG,SAAS;GAAI,KAAKqE,EAAIrE;GAAI,KAAKmE,EAAInE;GAAI,OAAO,CAAC;EAAE,CAAC;EAEnH,IAAM6E,KAAU,MAA8B;GAC5C,IAAIC,IAAM,GACNC,IAAM;GACV,KAAK,IAAMhE,KAAMX,EAAE,OACjB,IAAIW,EAAG,QAAQ,GAEb,AADA,KAAOA,EAAG,KACV;QACK;IACL,IAAM,CAAClB,GAAGuC,KAAKyC,EAAO9D,CAAE;IAExB,AADA,KAAOlB,GACP,KAAOuC;GACT;GAGF,AADIhC,EAAE,WAAW,MAAG,EAAE,MAAM2E,IAAMD,IAAMC,IAAMV,EAAIT,EAAGxD,EAAE,QAAQ,CAACkB,MAChElB,EAAE,MAAM,MAAM,GAAG,MAAMsB,EAAE,MAAMC,EAAE,OAAOD,EAAE,MAAMC,EAAE,GAAG;GAErD,IAAMqD,IAAQ5E,EAAE,MAAM,KAAK,GAAI,MAAOW,EAAG,WAAW,IAAInB,IAAI,EAAG,CAAC,CAAC,QAAQ,MAAMA,KAAK,CAAC,GAC/EqF,IAAKD,EAAM,KAAK,MAAM5E,EAAE,MAAMR,EAAE,CAAC,CAAC,MAAM,GAAG,MAAM0E,EAAY5C,EAAE,WAAW4C,EAAY3C,EAAE,QAAQ;GAEtG,OADAqD,EAAM,SAAS,GAAG,MAAO,EAAE,MAAMpF,KAAKqF,EAAGC,EAAG,GACrC,CAACJ,GAAKC,CAAG;EAClB;EACA,EAAOL,CAAI;EACX,IAAM5C,IAAgB,CAAC,GACjBqD,KAAW,MAAY;GAC3B,KAAK,IAAMpE,KAAMX,EAAE,OACjB,AAAIW,EAAG,QAAQ,IAAGe,EAAI,KAAKf,EAAG,IAAI,KAEhCe,EAAI,KAAK8B,EAAG7C,EAAG,QAAQ,CAACO,EAAE,GAC1B6D,EAAQpE,CAAE,GACVe,EAAI,KAAK+B,GAAG9C,EAAG,QAAQ,CAACO,EAAE;EAGhC;EAEA,OADA6D,EAAQT,CAAI,GACL5C;CACT,GACMsD,KAAa,MAA2B;EAC5C,IAAIC,IAAQ;EACZ,KAAK,IAAI/D,IAAI,GAAGA,IAAI,IAAIgE,EAAG,QAAQ,KAAK;GACtC,IAAMC,IAA4B,CAAC;GACnC,KAAK,IAAMvF,KAAKsF,EAAGhE,IAAI,KAAK,IAAM,CAACpB,MAAM4C,EAAK9C,IAAI,EAAM,KAAK,CAACmE,EAAInE,IAAImE,EAAIjE,EAAE,CAAC;GAC7E,EAAM,MAAM,GAAG,MAAMwB,EAAE,KAAKC,EAAE,MAAMD,EAAE,KAAKC,EAAE,EAAE;GAC/C,IAAMS,IAAIkD,EAAGhE,IAAI,EAAE,CAAC,SAAS,GACvBkE,IAAO,IAAI,aAAapD,IAAI,CAAC;GACnC,KAAK,IAAIxC,IAAI,GAAGA,IAAI2F,EAAM,QAAQ,KAAK;IAErC,IAAIE,IAAK;IACT,KAAK,IAAIlG,IAAIgG,EAAM3F,EAAE,CAAC,KAAK,GAAGL,IAAI,GAAG,KAAKA,IAAI,CAACA,GAAG,KAAMiG,EAAKjG;IAC7D,KAASK,IAAI6F;IACb,KAAK,IAAIlG,IAAIgG,EAAM3F,EAAE,CAAC,KAAK,GAAGL,KAAK6C,GAAG,KAAK7C,IAAI,CAACA,GAAG,EAAKA,EAAE;GAC5D;EACF;EACA,OAAO8F;CACT,GACMK,MAAQ,GAAW,MAA6B;EACpD,IAAI7F,IAAI,GACJK,IAAI;EACR,KAAK,IAAM,CAACyF,GAAGC,MAAOC,EAAG7F,IAEvB,AADA,KAAKmE,EAAIwB,KAAKC,GACd,KAAKA;EAEP,OAAO1F,IAAIL,IAAIK,IAAIiE,EAAInE;CACzB;CACA,KAAK,IAAMW,KAAKqD,GACd,KAAK,IAAMhE,KAAKW,GAAG,EAAIX,KAAKmE,EAAInE;CAIlC,AAFAuE,EAAc,GACd,IAASP,EAAO,KAAK,GAAG,MAAMQ,GAAU7D,GAAGW,CAAC,CAAC,GAC7C8C,GAAO;CACP,IAAI0B,KAAO9B,EAAO,KAAK,MAAM,CAAC,GAAGrD,CAAC,CAAC,GAC/BoF,KAAYX,EAAUpB,CAAM;CAChC,KAAK,IAAIjD,IAAK,GAAGA,IAAK,MAAMgF,KAAY,GAAG,KAAM;EAC/C,EAAc;EACd,IAAMC,IAAYjF,IAAK,KAAM;EAC7B,KAAK,IAAInB,IAAI,GAAGA,KAAKgC,GAAS,KAAK;GACjC,IAAMN,IAAI0E,IAAYpG,IAAIgC,IAAUhC,GAC9BiG,IAAKG,IAAYnD,IAAKC;GAC5B,KAAK,IAAM9C,KAAKgE,EAAO1C,IAAI,EAAItB,KAAK0F,GAAK1F,GAAG6F,CAAE;GAE9C,AADA,EAAOvE,KAAKkD,GAAUR,EAAO1C,IAAIA,CAAC,GAClC0C,EAAO1C,EAAE,CAAC,SAAS,GAAG,MAAO,EAAItB,KAAKkF,CAAE;EAC1C;EACA,IAAMnD,IAAIqD,EAAUpB,CAAM;EAC1B,AAAIjC,IAAIgE,OACN,KAAYhE,GACZ,KAAOiC,EAAO,KAAK,MAAM,CAAC,GAAGrD,CAAC,CAAC;CAEnC;CAEA,AADA,IAASmF,IACT1B,GAAO;CAGP,IAAM6B,KAAQjC,EAAO,KAAK,MAAMrD,EAAE,QAAQ,GAAG,MAAM,KAAK,IAAIe,GAAGW,EAAErC,EAAE,GAAG,CAAC,CAAC,GAClEkG,IAAmB,MAAM,KAAK,EAAE,QAAQ/G,EAAE,SAAS,CAAC,CAAC;CAC3D,EAAS,SAAS,GAAG,MAAM4C,EAAE,UAAU,KAAKmE,EAAKnE,EAAE,OAAO,CAAC,KAAKnC,CAAC,CAAC;CAClE,IAAMuG,KAAY,MAAsB/G,EAAS2C,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,GAAGmE,EAAKnE,EAAE,CAAC,QAAQ,MAAM2B,EAAK9D,OAAO8D,EAAK3B,EAAE,CAAC,CAAC,IAAIoE,CAAQ,CAAC,GAC9HC,MAAU,MAAsBhH,EAAS2C,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,GAAGmE,EAAKnE,EAAE,CAAC,QAAQ,MAAM4B,EAAK/D,OAAO+D,EAAK5B,EAAE,CAAC,CAAC,IAAIqE,EAAM,CAAC,GAC1HC,KAAiB,MAAMzE,IAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAC1C0E,IAAe,MAAM1E,IAAU,CAAC,CAAC,CAAC,KAAK,CAAC;CAC9C,KAAK,IAAIG,IAAI,GAAGA,IAAI5C,GAAG,KACrB,AAAIuE,EAAK3B,KAAK4B,EAAK5B,OACnB,GAAW2B,EAAK3B,MAAM,KAAK,IAAIsE,GAAW3C,EAAK3B,KAAKoE,EAASpE,CAAC,CAAC,GAC/D,EAAS4B,EAAK5B,MAAM,KAAK,IAAIuE,EAAS3C,EAAK5B,KAAKqE,GAAOrE,CAAC,CAAC;CAE3D,IAAMwE,IAAe,CAAC;CACtB,KAAK,IAAIjF,IAAI,GAAGA,KAAKM,GAAS,KAC5B,EAAGN,KAAKA,MAAM,IAAI2E,GAAM,KAAK,IAAII,GAAW,KAAKE,EAAGjF,IAAI,KAAK2E,GAAM3E,IAAI,KAAK,IAAIgF,EAAShF,IAAI,KAAKC,EAAE,UAAU8E,GAAW/E,KAAK2E,GAAM3E,KAAK;CAE3I,IAAMkF,KAASD,EAAG3E,KAAWqE,GAAMrE,KAAW,IAAI0E,EAAS1E,IAGrD6E,MAAQ,MAAenE,EAAKtC,OAAO,KAAQsC,EAAKtC,OAAO,IAAQ,IAAImC,EAAEnC,KAAK,GAC1E0G,MAAO,GAAW,MAAc;EACpC,IAAItG,IAAIqC,EAAMf,IACRiF,IAAKrE,EAAKZ,IACVkF,IAAKtE,EAAKX;EAMhB,OALIgF,MAAO,MAAM,KAAKvH,EAASsD,EAAMhB,GAAG,CAAC,IAAI,KACzCiF,MAAO,MAAO,KAAKpF,EAAE,UAAU,IAC/BqF,MAAO,MAAO,KAAKxH,EAASsD,EAAMf,GAAG,CAAC,IAAI,KAC1CiF,MAAO,MAAM,KAAKrF,EAAE,UAAU,IAC9BoF,IAAK,KAAQC,IAAK,MAAM,KAAKD,MAAO,KAASC,MAAO,IAAQrF,EAAE,UAAUoF,MAAO,KAASC,MAAO,KAASrF,EAAE,UAAUA,EAAE,WAAW,IAAIA,EAAE,UACpIkF,GAAK/E,CAAC,IAAI+E,GAAK9E,CAAC,IAAIvB;CAC7B,GACMyG,IAAI,IAAI,aAAa9C,CAAC;CAC5B,KAAK,IAAMpD,KAAKqD,GAAQ,KAAK,IAAIpE,IAAI,GAAGA,IAAIe,EAAE,QAAQ,KAAK,EAAEA,EAAEf,MAAMiH,EAAElG,EAAEf,IAAI,MAAM8G,GAAI/F,EAAEf,IAAI,IAAIe,EAAEf,EAAE;CACrG,IAAMkH,MAAO,GAAiB,GAAa,MAAiB;EAC1D,IAAM1E,IAAIqC,EAAM,QACVsC,IAAM,CAAC,CAAC;EACd,KAAK,IAAInH,IAAI,GAAGA,IAAIwC,GAAG,KAAK,EAAIxC,KAAKmH,EAAInH,IAAI,KAAK8G,GAAIjC,EAAM7E,IAAI,IAAI6E,EAAM7E,EAAE;EAC5E,IAAMoH,IAAwD,CAAC;EAC/D,KAAK,IAAIpH,IAAI,GAAGA,IAAIwC,GAAG,KAErB,KADA4E,EAAG,KAAK;GAAE,GAAGpH;GAAMA;GAAG,GAAGgG,EAAGhG;GAAI,IAAIgG,EAAGhG,MAAM4D,EAAE5D,KAAKmH,EAAInH;EAAI,CAAC,GACtDoH,EAAG,SAAS,IAAG;GACpB,IAAMtF,IAAIsF,EAAGA,EAAG,SAAS,IACnBrF,IAAIqF,EAAGA,EAAG,SAAS;GACzB,IAAItF,EAAE,KAAKA,EAAE,IAAIC,EAAE,KAAKA,EAAE,GAAG;GAI7B,AAHA,EAAE,IAAIA,EAAE,GACR,EAAE,KAAKA,EAAE,GACT,EAAE,MAAMA,EAAE,IACVqF,EAAG,IAAI;EACT;EAEF,KAAK,IAAMrF,KAAKqF,GAAI,KAAK,IAAIpH,IAAI+B,EAAE,GAAG/B,KAAK+B,EAAE,GAAG,KAAK,EAAE8C,EAAM7E,MAAM+B,EAAE,KAAKA,EAAE,IAAIoF,EAAInH;CACtF;CAEA,KAAK,IAAImB,IAAK,GAAGA,IAAK,IAAM,KAAM;EAChC,IAAMkG,IAAOlG,KAAM,GACbiF,IAAYjF,IAAK,KAAM;EAC7B,KAAK,IAAInB,IAAI,GAAGA,KAAKgC,GAAS,KAAK;GACjC,IAAM,IAAIoE,IAAYpG,IAAIgC,IAAUhC,GAC9Be,IAAIqD,EAAO;GACjB,IAAI,CAACrD,EAAE,QAAQ;GACf,IAAM6C,IAAc,CAAC,GACfoC,IAAe,CAAC;GACtB,KAAK,IAAM5F,KAAKW,GAAG;IACjB,IAAId,IAAI,GACJK,IAAI,GACFgH,KAAO,MAA2B;KACtC,KAAK,IAAM,CAACvB,GAAGwB,MAAOtB,GAEpB,AADA,KAAKgB,EAAElB,KAAKwB,GACZ,KAAKA;IAET;IAKA,CAJIF,KAAQjB,MAAWkB,EAAIrE,EAAG7C,EAAE,IAC5BiH,KAAQ,CAACjB,MAAWkB,EAAIpE,EAAK9C,EAAE,GACnCkH,EAAIpD,GAAY9D,EAAE,GAClBwD,EAAE,KAAKtD,IAAIL,IAAIK,IAAI2G,EAAE7G,EAAE,GACvB4F,EAAG,KAAK1F,KAAK,GAAI;GACnB;GACA,GAAIS,GAAG6C,GAAGoC,CAAE;EACd;CACF;CAEA,IAAMwB,KAAKrD,GACLsD,KAAS,MAAe/E,EAAKtC,OAAO,IAAOoH,KAAK,IAAI1E,EAAM1C,KAAKsC,EAAKtC,OAAO,IAAQoH,KAAK,IAAI1E,EAAM1C,KAAK,IAAIA;CACjH,IAAIb,GAAG;EACL,IAAMmI,IAAKvD,IAAI,IAAI5E,GACboI,IAAM,IAAI,aAAaD,CAAE;EAC/B,KAAK,IAAItH,IAAI,GAAGA,IAAI+D,GAAG,KAAK,EAAI/D,KAAK6G,EAAE7G;EACvC,KAAK,IAAI+B,IAAI,GAAGA,IAAI5C,GAAG,KAErB,AADA,EAAIiI,KAAK,IAAIrF,KAAK,UAClB,EAAIqF,KAAK,IAAIrF,IAAI,KAAK;EAExB,KAAK,IAAI/B,IAAI,GAAGA,IAAI+D,GAAG,KAErB,AADIzB,EAAKtC,OAAO,MAAM,EAAIqH,EAAMrH,CAAC,KAAK,KAAK,IAAIuH,EAAIF,EAAMrH,CAAC,IAAI6G,EAAE7G,EAAE,IAC9DsC,EAAKtC,OAAO,MAAO,EAAIqH,EAAMrH,CAAC,KAAK,KAAK,IAAIuH,EAAIF,EAAMrH,CAAC,IAAI6G,EAAE7G,EAAE;EAErE,IAAMwH,IAA4B,MAAM,KAAK,EAAE,QAAQF,EAAG,SAAS,CAAC,CAAC,GAC/DG,IAAQ,IAAI,WAAWH,CAAE,GACzBI,KAAQ,GAAW,GAAW,MAAc;GAEhD,AADAF,EAAI9F,EAAE,CAAC,KAAK,CAACC,GAAG9B,CAAC,CAAC,GAClB,EAAM8B,EAAE;EACV;EACA,KAAK,IAAMhB,KAAKqD,GAAQ,KAAK,IAAIpE,IAAI,GAAGA,IAAIe,EAAE,QAAQ,KAAK,EAAK0G,EAAM1G,EAAEf,IAAI,EAAE,GAAGyH,EAAM1G,EAAEf,EAAE,GAAG8G,GAAI/F,EAAEf,IAAI,IAAIe,EAAEf,EAAE,CAAC;EACjH,KAAK,IAAImC,IAAI,GAAGA,IAAI5C,GAAG,KAAK,AAAIuE,EAAK3B,MAAM4B,EAAK5B,MAAI2F,EAAKN,KAAK,IAAIrF,GAAGqF,KAAK,IAAIrF,IAAI,GAAG,KAAK,IAAI3C,EAAS2C,EAAE,CAAC,MAAM3C,EAAS2C,EAAE,CAAC,IAAI,KAAK3C,EAAS2C,EAAE,CAAC,IAAI,EAAE,CAAC;EACxJ,IAAMnB,IAAkB,CAAC;EACzB,KAAK,IAAIZ,IAAI,GAAGA,IAAIsH,GAAI,KAAK,AAAKG,EAAMzH,MAAIY,EAAM,KAAKZ,CAAC;EACxD,IAAI2H,IAAO,GACLC,IAAS,IAAI,aAAaL,CAAG;EACnC,OAAO3G,EAAM,SAAQ;GACnB,IAAMZ,IAAIY,EAAM,IAAI;GACpB;GACA,KAAK,IAAM,CAACV,GAAGL,MAAM2H,EAAIxH,IAEvB,AADI,OAAO,SAAS4H,EAAO5H,EAAE,MAAG,EAAOE,KAAK,KAAK,IAAI0H,EAAO1H,IAAI0H,EAAO5H,KAAKH,CAAC,IACxE,EAAE4H,EAAMvH,MAAIU,EAAM,KAAKV,CAAC;EAEjC;EACA,IAAIyH,MAASL,GAAI,KAAK,IAAItH,IAAI,GAAGA,IAAI+D,GAAG,KAAK,EAAE/D,KAAK4H,EAAOP,EAAMrH,CAAC;CACpE;CACA,IAAI6H,KAAO,UACPC,KAAO;CACX,KAAK,IAAI9H,IAAI,GAAGA,IAAI+D,GAAG,KAErB,AADA,KAAO,KAAK,IAAI8D,IAAMhB,EAAE7G,KAAKyG,GAAKzG,CAAC,CAAC,GACpC,KAAO,KAAK,IAAI8H,IAAMjB,EAAE7G,KAAKyG,GAAKzG,CAAC,IAAIyC,EAAMzC,EAAE;CAEjD,AAAK,OAAO,SAAS6H,EAAI,MAAG,KAAO,KAAO;CAC1C,KAAK,IAAI7H,IAAI,GAAGA,IAAI+D,GAAG,KAAK,EAAE/D,MAAM6H;CAGpC,IAAME,KAAU,OAAmB;EAAE,GAAGlB,EAAE7G;EAAI,GAAGuG,EAAG/D,EAAGxC;CAAI,IAGrDgI,qBAAQ,IAAI,IAAoB;CACtC;EACE,IAAMC,oBAAQ,IAAI,IAAyC,GACrD1E,KAAM,GAAa,GAAW,MAAe;GACjD,IAAI5C,IAAIsH,EAAM,IAAI5D,CAAG;GAErB,AADK1D,KAAGsH,EAAM,IAAI5D,GAAM,IAAI,CAAC,CAAE,GAC/B1D,EAAE,KAAK;IAAE;IAAG;GAAG,CAAC;EAClB;EACA,EAAE,SAAS,GAAG,MAAM;GAClB,IAAMoB,IAAIkB,EAAO1D;GACjB,AAAKwC,KAAK,IAAKxC,OACXL,EAAM6C,EAAE,GAAG,EAAE,UAAQwB,EAAG,GAAGxB,EAAE,GAAG,KAAKxC,GAAGsH,EAAE9E,EAAE,GAAG,GAC/C7C,EAAM6C,EAAEA,EAAE,SAAS,GAAG,EAAE,UAAQwB,EAAG,GAAGxB,EAAEA,EAAE,SAAS,GAAG,KAAKxC,GAAGsH,EAAE9E,EAAEA,EAAE,SAAS,GAAG;EACtF,CAAC;EACD,KAAK,IAAM,CAACsC,GAAK1D,MAAMsH,GAAO;GAC5B,IAAItH,EAAE,SAAS,GAAG;GAClB,IAAMX,IAAI,OAAOqE,EAAI,MAAM,GAAG,CAAC,CAAC,EAAE;GAClC,EAAE,MAAM,GAAG,MAAM3C,EAAE,KAAKC,EAAE,MAAMD,EAAE,IAAIC,EAAE,CAAC;GACzC,IAAMuG,IAAO,KAAK,IAAI,IAAK/F,EAAEnC,KAAK,MAAQW,EAAE,SAAS,EAAE;GACvD,EAAE,SAAS,GAAI,MAAMqH,GAAM,IAAI,GAAG3D,EAAI,GAAGtD,EAAG,KAAK8F,EAAE7G,MAAMJ,KAAKe,EAAE,SAAS,KAAK,KAAKuH,CAAI,CAAC;EAC1F;CACF;CACA,IAAMC,IAAgC9H,EAAE,KAAK,GAAG,MAAM;EACpD,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO;EACxB,IAAIC,GAAKf,IAAI;GACX,IAAMmC,IAAIqG,EAAO,EAAE,CAAC,GACdpG,IAAIoG,EAAO,EAAE,CAAC,GACdK,IAAM,KAAK,KAAKzG,EAAE,IAAID,EAAE,CAAC,KAAK,GAC9B7B,IAAI;IAAE,GAAG6B,EAAE,IAAK0G,IAAMjG,EAAE,EAAE,KAAM;IAAG,GAAGT,EAAE;GAAE,GAC1C2G,IAAI;IAAE,GAAG1G,EAAE,IAAKyG,IAAMjG,EAAE,EAAE,KAAM;IAAG,GAAGR,EAAE;GAAE,GAC1C,CAAC2G,GAAGC,KAAK/I,EAASD,KAAK,CAAC8I,GAAGxI,CAAC,IAAI,CAACA,GAAGwI,CAAC;GAC3C,OAAO;IAAE,OAAOC;IAAG,MAAM,CAAC;KAAE,GAAG;KAAK,GAAG,CAACC,CAAC;IAAE,CAAC;IAAG,OAAO9I,EAAMF,EAAE,CAAC,QAAQ;KAAE,IAAI+I,EAAE,IAAIC,EAAE,KAAK;KAAG,GAAGD,EAAE,IAAI;IAAG,IAAI,KAAA;GAAU;EACzH;EACA,IAAMvG,IAAIkB,EAAO1D;EACjB,IAAI,CAACwC,GAAG,OAAO;EACf,IAAMyG,IAAY,CAAC,GACbC,IAAsB,CAAC,GACvB/G,IAAIqG,EAAOhG,EAAE,EAAE;EACrB,EAAI,KAAK;GAAE,GAAGiG,GAAM,IAAI,GAAGjG,EAAE,GAAG,KAAKxC,GAAG,KAAKmC,EAAE;GAAG,GAAGA,EAAE,IAAIW,EAAEN,EAAE,MAAM;EAAE,CAAC;EACxE,KAAK,IAAInC,IAAI,GAAGA,IAAI,IAAImC,EAAE,QAAQ,KAAK;GACrC,IAAMuG,IAAIP,EAAOhG,EAAEnC,EAAE,GACf8I,IAAOzC,GAAMzD,EAAGT,EAAEnC,OAAO;GAC/B,AAAI8I,IAAO,MACTF,EAAI,KAAK;IAAE,GAAGF,EAAE;IAAG,GAAGA,EAAE,IAAII;GAAK,GAAG;IAAE,GAAGJ,EAAE;IAAG,GAAGA,EAAE,IAAII;GAAK,CAAC,GAC7DD,EAAS,KAAK,IAAO,EAAI,MAEzBD,EAAI,KAAKF,CAAC,GACVG,EAAS,KAAK,EAAK;EAEvB;EACA,IAAM9G,IAAIoG,EAAOhG,EAAEA,EAAE,SAAS,EAAE;EAEhC,AADAyG,EAAI,KAAK;GAAE,GAAGR,GAAM,IAAI,GAAGjG,EAAEA,EAAE,SAAS,GAAG,KAAKxC,GAAG,KAAKoC,EAAE;GAAG,GAAGA,EAAE,IAAIU,EAAEN,EAAEA,EAAE,SAAS,MAAM;EAAE,CAAC,GAC9F0G,EAAS,KAAK,EAAK;EAInB,IAAMrG,IAAIoG,EAAI,QACRG,IAAY,MAAcvG,CAAC,CAAC,CAAC,KAAK,CAAC,GACnCwG,KAAO,OAAeJ,EAAI5I,IAAI,EAAE,CAAC,IAAI4I,EAAI5I,EAAE,CAAC,KAAK,KAAK,IAAI,IAAK4I,EAAI5I,IAAI,EAAE,CAAC,IAAI4I,EAAI5I,EAAE,CAAC,CAAC;EAC5F,KAAK,IAAIA,IAAI,GAAGA,IAAI,IAAIwC,GAAG,KAAK;GAC9B,IAAIqG,EAAS7I,IAAI,MAAM6I,EAAS7I,IAAI;GACpC,IAAMiJ,IAAKD,EAAIhJ,IAAI,CAAC,GACdkJ,IAAKF,EAAIhJ,CAAC;GAChB,IAAIiJ,IAAKC,KAAM,GAAG;GAClB,IAAMC,IAAKP,EAAI5I,EAAE,CAAC,IAAI4I,EAAI5I,IAAI,EAAE,CAAC,GAC3BoJ,IAAKR,EAAI5I,IAAI,EAAE,CAAC,IAAI4I,EAAI5I,EAAE,CAAC;GACjC,EAAMA,KAAM,KAAKmJ,IAAKC,OAAS,IAAIA,IAAKD,KAAMF,KAAMG,IAAK,IAAID,KAAMD;EACrE;EACA,IAAMG,IAAc,CAAC;EACrB,KAAK,IAAIrJ,IAAI,GAAGA,IAAIwC,GAAG,KAAK;GAC1B,IAAMkG,IAAIE,EAAI5I,IAAI,IACZ2I,IAAIC,EAAI5I,IACRgD,KAAK2F,EAAE,IAAID,EAAE,KAAK;GACxB,AAAIG,EAAS7I,IAAI,MAAO,KAAK,IAAI0I,EAAE,IAAIC,EAAE,CAAC,IAAI,MAAO,CAACI,EAAM/I,IAAI,MAAM,CAAC+I,EAAM/I,KAAKqJ,EAAK,KAAK;IAAE,GAAG;IAAK,GAAG,CAACV,CAAC;GAAE,CAAC,IACzGU,EAAK,KAAK;IAAE,GAAG;IAAK,GAAG;KAAC;MAAE,GAAGX,EAAE,IAAIK,EAAM/I,IAAI,KAAKgD;MAAG,GAAG0F,EAAE,IAAI1F;KAAE;KAAG;MAAE,GAAG2F,EAAE,IAAII,EAAM/I,KAAKgD;MAAG,GAAG2F,EAAE,IAAI3F;KAAE;KAAG2F;IAAC;GAAE,CAAC;EACrH;EACA,IAAMW,IAAQhG,EAAQ3D,MAAM,IAAIwI,EAAO7E,EAAQ3D,EAAE,IAAI,KAAA;EACrD,IAAI,CAACC,EAASD,IAAI,OAAO;GAAE,OAAOiJ,EAAI;GAAI;GAAM;EAAM;EAEtD,IAAMW,IAAc,CAAC;EACrB,KAAK,IAAIvJ,IAAIwC,IAAI,GAAGxC,KAAK,GAAG,KAAK;GAC/B,IAAMC,IAAIoJ,EAAKrJ,IAAI;GACnB,EAAK,KAAKC,EAAE,MAAM,MAAM;IAAE,GAAG;IAAK,GAAG;KAACA,EAAE,EAAE;KAAIA,EAAE,EAAE;KAAI2I,EAAI5I,IAAI;IAAE;GAAE,IAAI;IAAE,GAAG;IAAK,GAAG,CAAC4I,EAAI5I,IAAI,EAAE;GAAE,CAAC;EACnG;EACA,OAAO;GAAE,OAAO4I,EAAIpG,IAAI;GAAI,MAAM+G;GAAM;EAAM;CAChD,CAAC,GACKC,IAAwBhK,EAAS,KAAK,GAAG,MAAM;EACnD,IAAIsE,EAAK3B,KAAK4B,EAAK5B,IAAI,OAAO;EAC9B,IAAIsH,IAAK,UACLC,IAAK;EACT,KAAK,IAAIhI,IAAIoC,EAAK3B,IAAIT,KAAKqC,EAAK5B,IAAI,KAElC,AADA,IAAK,KAAK,IAAIsH,GAAIxC,EAAEjD,EAAG7B,EAAE,CAACT,GAAG,GAC7B,IAAK,KAAK,IAAIgI,GAAIzC,EAAEhD,GAAG9B,EAAE,CAACT,GAAG;EAE/B,IAAMiI,IAAKhD,EAAG7C,EAAK3B,MAAMkE,GAAMvC,EAAK3B,MAAM,IAAIoE,EAASpE,CAAC,GAClDyH,IAAKjD,EAAG5C,EAAK5B,MAAMkE,GAAMtC,EAAK5B,MAAM,IAAIqE,GAAOrE,CAAC;EACtD,OAAO;GAAE,GAAGsH;GAAI,GAAGE;GAAI,GAAGD,IAAKD;GAAI,GAAGG,IAAKD;EAAG;CAChD,CAAC;CACD,OAAO;EACL,OAAO,MAAM,KAAK,EAAE,QAAQtK,EAAE,IAAI,GAAG,MAAM8I,EAAO/H,CAAC,CAAC;EACpD,OAAOmI;EACP,UAAUiB;EACV,GAAGtB,KAAOD;EACV,GAAGrB;CACL;AACF;;AC7qBA,IAIMiD,IAAQ;CACZ;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAC3J;CAAM;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAC5J;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AACxJ;AAEA,SAASC,EAAU,GAAoB;CAMrC,OALIC,KAAM,MAAQA,KAAM,MAAaF,EAAME,IAAK,MAE3CA,KAAM,OAASA,KAAM,OAAWA,KAAM,QAAUA,KAAM,QAAWA,MAAO,QAAe,IAEvFA,KAAM,QAAUA,KAAM,QAAYA,KAAM,SAAUA,KAAM,SAAYA,KAAM,SAAUA,KAAM,SAAYA,KAAM,SAAUA,KAAM,SAAYA,KAAM,SAAUA,KAAM,SAAYA,KAAM,SAAUA,KAAM,SAAWA,KAAM,SAAgB,MAC/N;AACT;AAGA,SAAgBC,EAAU,GAAc,IAAO,IAAI,IAAO,IAAO,IAAO,IAAe;CACrF,IAAI1J,IAAI;CACR,IAAI2J,GACF,KAAK,IAAMC,KAAMC,GAAM,KAAKL,EAAUI,EAAG,YAAY,CAAC,CAAE,IAAI,MAAM;MAC7D,KAAK,IAAMA,KAAMC,GAAM,KAAKL,EAAUI,EAAG,YAAY,CAAC,CAAE;CAC/D,OAAQ5J,IAAI8J,KAAQC,IAAO,OAAO,KAAM;AAC1C;AAEA,IAAaC,KAAc,MAAiB,KAAK,MAAMF,IAAO,GAAG;AAGjE,SAAgBG,EAAQ,GAAiB,IAAO,IAAI,IAAO,IAAiC;CAC1F,IAAIjK,IAAI;CACR,KAAK,IAAMS,KAAKyJ,GAAO,IAAI,KAAK,IAAIlK,GAAG0J,EAAUjJ,GAAGqJ,GAAMC,CAAI,CAAC;CAC/D,OAAO;EAAE;EAAG,GAAGG,EAAM,SAASF,EAAWF,CAAI;CAAE;AACjD;AAGA,SAAgBK,EAAK,GAAiB,GAAa,IAAO,IAAI,IAAO,IAAiB;CACpF,IAAMvI,IAAgB,CAAC;CACvB,KAAK,IAAMwI,KAAQF,GAAO;EACxB,IAAIR,EAAUU,GAAMN,GAAMC,CAAI,KAAKM,GAAK;GACtC,EAAI,KAAKD,CAAI;GACb;EACF;EACA,IAAIE,IAAM;EACV,KAAK,IAAMC,KAAQH,EAAK,MAAM,IAAI,GAAG;GACnC,IAAMI,IAAOF,IAAMA,IAAM,MAAMC,IAAOA;GACtC,AAAID,KAAOZ,EAAUc,GAAMV,GAAMC,CAAI,IAAIM,KACvCzI,EAAI,KAAK0I,CAAG,GACZ,IAAMC,KACD,IAAMC;EACf;EACA,EAAI,KAAKF,CAAG;CACd;CACA,OAAO1I;AACT;AAEA,IAAa6I,KAAO,MAAc9K,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,QAAQ,GAEvH+K,IAAQ;AAGd,SAAgBC,EAAM,GAA2C;CAC/D,IAAI,CAAC9I,GAAG;CACR,IAAM/B,IAAI+B,EAAE,KAAK,CAAC,CAAC,YAAY;CAC/B,IAAI,+CAA+C,KAAK/B,CAAC,GAAG,OAAOA;CACnE,IAAI,gBAAgB,KAAKA,CAAC,GAAG,OAAO,MAAMA;CAE1C,IADI,4EAA4E,KAAKA,CAAC,KAClF,qEAAqE,KAAKA,CAAC,GAAG,OAAOA;CACzF,IAAI4K,EAAM,KAAK5K,CAAC,GAAG,OAAOA,MAAM,gBAAgB,SAASA;AAE3D;AAEA,IAAa8K,IAAQ;CACnB,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,SAAS;CACT,eAAe;CACf,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;CAEN,QAAQ;EAAC;EAAW;EAAW;EAAW;EAAW;EAAW;EAAW;EAAW;EAAW;EAAW;CAAS;AACvH,GAUM1I,KAAK,MAAe,OAAO,SAASpC,CAAC,IAAI,KAAK,MAAMA,IAAI,GAAG,IAAI,MAAM;AAE3E,SAAS+K,EAAM,GAAkB;CAC/B,IAAIrJ,IAAI,UAAU4G,EAAE,QAAQ,OAAO;CAInC,OAHIA,EAAE,WAAQ,KAAK,YAAYA,EAAE,OAAO,kBAAkBlG,EAAEkG,EAAE,MAAM,CAAC,EAAE,KACnEA,EAAE,UAAUA,EAAE,SAAM,KAAK,sBAAsBA,EAAE,KAAK,KACtDA,EAAE,YAAY,KAAA,MAAW,KAAK,aAAalG,EAAEkG,EAAE,OAAO,EAAE,KACrD5G;AACT;AAYA,IAAasJ,IAAb,MAAiB;CACf,MAAwB,CAAC;CAEzB,KAAK,GAAW,GAAW,GAAW,GAAW,GAAU,IAAK,GAAS;EAEvE,OADA,KAAK,IAAI,KAAK,YAAY5I,EAAEyE,CAAC,EAAE,OAAOzE,EAAE6I,CAAC,EAAE,WAAW7I,EAAElC,CAAC,EAAE,YAAYkC,EAAEQ,CAAC,EAAE,GAAGsI,IAAK,QAAQ9I,EAAE8I,CAAE,EAAE,KAAK,KAAKH,EAAMzC,CAAC,EAAE,GAAG,GACjH;CACT;CAEA,OAAO,GAAY,GAAY,GAAW,GAAgB;EAExD,OADA,KAAK,IAAI,KAAK,eAAelG,EAAE+I,CAAE,EAAE,QAAQ/I,EAAEgJ,CAAE,EAAE,OAAOhJ,EAAEd,CAAC,EAAE,GAAGyJ,EAAMzC,CAAC,EAAE,GAAG,GACrE;CACT;CAEA,QAAQ,GAAY,GAAY,GAAY,GAAY,GAAgB;EAEtE,OADA,KAAK,IAAI,KAAK,gBAAgBlG,EAAE+I,CAAE,EAAE,QAAQ/I,EAAEgJ,CAAE,EAAE,QAAQhJ,EAAE8I,CAAE,EAAE,QAAQ9I,EAAEmE,CAAE,EAAE,GAAGwE,EAAMzC,CAAC,EAAE,GAAG,GACtF;CACT;CAEA,KAAK,GAAY,GAAY,GAAY,GAAY,GAAgB;EAEnE,OADA,KAAK,IAAI,KAAK,aAAalG,EAAEkH,CAAE,EAAE,QAAQlH,EAAEoH,CAAE,EAAE,QAAQpH,EAAEiJ,CAAE,EAAE,QAAQjJ,EAAEkJ,CAAE,EAAE,GAAGP,EAAMzC,CAAC,EAAE,GAAG,GACnF;CACT;CAEA,KAAK,GAA4B,GAAU,IAAS,IAAY;EAC9D,IAAME,IAAM+C,EAAO,KAAK,CAAC1E,GAAGoE,OAAO,GAAG7I,EAAEyE,CAAC,EAAE,GAAGzE,EAAE6I,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;EAE9D,OADA,KAAK,IAAI,KAAK,IAAIO,IAAS,YAAY,WAAW,WAAWhD,EAAI,GAAGuC,EAAMzC,CAAC,EAAE,GAAG,GACzE;CACT;CAGA,KAAK,GAAW,GAAgB;EAE9B,OADA,KAAK,IAAI,KAAK,YAAY9E,EAAE,GAAGuH,EAAMzC,CAAC,EAAE,GAAG,GACpC;CACT;CAGA,KAAK,GAAW,GAAW,GAA0B,IAAc,CAAC,GAAS;EAC3E,IAAMhD,IAAK,OAAO8E,KAAU,WAAW,CAACA,CAAK,IAAIA,GAC3CJ,IAAOzI,EAAE,QAAQ,IACjBkK,IAAKvB,EAAWF,CAAI,GACpBjK,IAAMkL,IAAK3F,EAAG,SAASmG,IAAM,GAC/BC,IAAQ,iBAAiBf,EAAIpJ,EAAE,OAAO,gDAAO,8BAAI,EAAE,eAAeyI,EAAK,UAAUzI,EAAE,SAASuJ,EAAM,IAAI;EAU1G,OATIvJ,EAAE,UAAUA,EAAE,WAAW,YAAS,KAAS,iBAAiBA,EAAE,OAAO,KACrEA,EAAE,SAAM,KAAS,0BACjBA,EAAE,WAAQ,KAAS,2BACnBA,EAAE,cAAW,KAAS,mCAC1B+D,EAAG,SAAS,GAAG,MAAM;GACnB,AAAK3E,KAEL,KAAK,IAAI,KAAK,YAAYyB,EAAEyE,CAAC,EAAE,OAAOzE,EAAErC,IAAMH,IAAI6L,IAAKA,IAAK,IAAIzB,IAAO,GAAI,EAAE,GAAG0B,EAAM,GAAGf,EAAIhK,CAAC,EAAE,QAAQ;EAC1G,CAAC,GACM;CACT;CAEA,IAAI,GAAiB;EAEnB,OADA,KAAK,IAAI,KAAKd,CAAC,GACR;CACT;CAGA,OAAe;EACb,OAAO,KAAK,IAAI,KAAK,EAAE;CACzB;CAGA,SAAS,GAAW,GAAW,IAAK,WAAmB;EACrD,IAAMsC,IAAI,KAAK,KAAKjC,CAAC,GACfmC,IAAI,KAAK,KAAKO,CAAC;EACrB,OACE,kDAAkDT,EAAE,YAAYE,EAAE,iBAAiBF,EAAE,GAAGE,EAAE,OACzFsJ,IAAK,4BAA4BxJ,EAAE,YAAYE,EAAE,UAAUsJ,EAAG,OAAO,MACtE,KAAK,IAAI,KAAK,EAAE,IAChB;CAEJ;AACF;AAIA,SAAgBC,EAAS,GAAuD;CAC9E,OAAOC,EAAK,KAAK,MAAMjM,EAAE,IAAIA,EAAE,EAAE,KAAK,MAAM,GAAGwC,EAAEmG,EAAE,CAAC,EAAE,GAAGnG,EAAEmG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;AACxF;AAGA,SAAgBuD,EAAU,GAAmB;CAC3C,OAAOjM,EACJ,QAAQ,gBAAgB,IAAI,CAAC,CAC7B,QAAQ,QAAQ,IAAI,CAAC,CACrB,QAAQ,qBAAqB,EAAE,CAAC,CAChC,QAAQ,aAAa,GAAG,MAAc,OAAO,cAAc,KAAK,IAAI,OAAO2D,CAAC,GAAG,OAAQ,CAAC,CAAC,CAAC,CAC1F,QAAQ,iBAAiB,GAAG,OAAkB;EAAE,MAAM;EAAK,KAAK;EAAK,IAAI;EAAK,IAAI;EAAK,MAAM;EAAK,MAAM;CAAI,EAAA,CAAGuI,EAAK,YAAY,MAAMC,CAAC,CAAC,CACxI,QAAQ,uCAAuC,GAAG,MACjDC,EAAE,OAAO,MAAM,OAAO,cAAc,KAAK,IAAI,OAAOA,EAAE,MAAM,CAAC,CAAC,GAAG,OAAQ,CAAC,IAAM;EAAE,MAAM;EAAK,KAAK;EAAK,IAAI;EAAK,IAAI;EAAK,MAAM;EAAK,MAAM;CAAI,EAA8BA,MAAMD,CACpL;AACJ;AAKA,IAAa1N,IAAb,cAAkC,MAAM,CAAC,GCrH5B6N,IAAb,MAA0B;CAKa;CAJrC;CACA,uBAAe,IAAI,IAAmB;CACtC,6BAAqB,IAAI,IAAsB;CAE/C,YAAY,IAAW,MAAM,IAA0B,QAAQ;EAC7D,AADmC,KAAA,WAAAC,GACnC,KAAK,IAAI;GAAE;GAAK,OAAO,CAAC;GAAG,OAAO,CAAC;GAAG,UAAU,CAAC;EAAE;CACrD;CAEA,IAAI,GAAY;EACd,OAAO,KAAK,KAAK,IAAIC,CAAE;CACzB;CAEA,IAAI,GAAY;EACd,OAAO,KAAK,KAAK,IAAIA,CAAE;CACzB;CAEA,KAAK,GAAY,IAAwB,CAAC,GAAG,GAAyB;EACpE,IAAIjK,IAAI,KAAK,KAAK,IAAIiK,CAAE;EACxB,AAAKjK,MACH,IAAI;GAAE;GAAI,OAAOiK;GAAI,OAAO,KAAK;GAAU;EAAQ,GACnD,KAAK,KAAK,IAAIA,GAAIjK,CAAC,GACnB,KAAK,EAAE,MAAM,KAAKA,CAAC;EAErB,KAAK,IAAM,CAACxC,GAAGI,MAAM,OAAO,QAAQsM,CAAK,GAAG,AAAItM,MAAM,KAAA,MAAW,EAA0CJ,KAAKI;EAChH,OAAOoC;CACT;CAEA,KAAK,GAAU,GAAyB;EAItC,OAHK,KAAK,WAAW,IAAI,EAAE,IAAI,KAAG,KAAK,KAAK,EAAE,MAAM,CAAC,GAAGmK,CAAO,GAC1D,KAAK,WAAW,IAAI,EAAE,EAAE,KAAG,KAAK,KAAK,EAAE,IAAI,CAAC,GAAGA,CAAO,GAC3D,KAAK,EAAE,MAAM,KAAK,CAAC,GACZ;CACT;CAEA,QAAQ,GAAY,GAAe,GAA2B;EAC5D,IAAIxK,IAAI,KAAK,WAAW,IAAIsK,CAAE;EAC9B,AAAKtK,IAIMmH,MAAO,EAAE,QAAQA,MAH1B,IAAI;GAAE;GAAI;GAAO;EAAO,GACxB,KAAK,WAAW,IAAImD,GAAItK,CAAC,GACzB,KAAK,EAAE,SAAS,KAAKA,CAAC;EAGxB,IAAMK,IAAI,KAAK,KAAK,IAAIiK,CAAE;EAK1B,OAJIjK,MACF,KAAK,KAAK,OAAOiK,CAAE,GACnB,KAAK,EAAE,MAAM,OAAO,KAAK,EAAE,MAAM,QAAQjK,CAAC,GAAG,CAAC,IAEzCL;CACT;CAEA,UAAU,GAAY;EACpB,OAAO,KAAK,WAAW,IAAIsK,CAAE;CAC/B;AACF,GAIM9N,IAAO,IACPkO,IAAQ,IACRC,IAAK,IACLC,IAAK,GACLC,IAAK1C,EAAW3L,CAAI,GAEpBC,KAAS,MAAcqB,EAAE,MAAM,IAAI,GACnCyB,KAAK,MAAc,KAAK,MAAMtB,IAAI,GAAG,IAAI;AAQ/C,SAAS8M,EAAY,GAAsD;CACzE,IAAMC,IAAiB,CAAC;CACxB,KAAK,IAAMC,KAAOnN,EAAE,MAAM,EAAI,SAAS,GAAG,MAAO,EAAKD,KAAK,KAAK,IAAImN,EAAKnN,MAAM,GAAGgK,EAAU7H,GAAG0K,GAAO5M,EAAE,IAAI,CAAC,CAAE;CAE/G,OAAO;EAAE,GADCkN,EAAK,QAAQ,GAAG,MAAMrL,IAAIC,GAAG,CAAC,IAAI,KAAK,IAAI,GAAGoL,EAAK,SAAS,CAAC,IAAI;EAC/D,GAAGlN,EAAE,KAAK,SAASA,EAAE,KAAK,SAASqK,EAAWuC,CAAK,IAAI,KAAK;EAAG;CAAK;AAClF;AAEA,SAASQ,EAAQ,GAAU,GAAe;CACxC,IAAMlD,IAAO3H,EAAE,UAAU,UAAUA,EAAE,UAAU,KAAK5D,EAAM4D,EAAE,KAAK,IAAIiI,EAAK7L,EAAM4D,EAAE,KAAK,GAAG,KAAK7D,GAAM6D,EAAE,OAAO,IAAI,GAC5GiG,IAAIjG,EAAE,UAAU,KAAK;EAAE,GAAG;EAAG,GAAG;CAAE,IAAI+H,EAAQJ,GAAMxL,GAAM6D,EAAE,OAAO,IAAI,GACvE8K,IAAS9E,MAAQ,QAAQA,MAAQ;CACvC,IAAIhG,EAAE,UAAU,QAAQ;EACtB,IAAM+K,IAAK/K,EAAE,SAAS,IAAI0K,CAAW;EACrC,OAAO;GAAE,GAAG,KAAK,IAAI,IAAI,GAAGK,EAAG,KAAK,MAAMtN,EAAE,IAAI,EAAM,CAAC;GAAG,GAAGsN,EAAG,QAAQ,GAAG,MAAMzL,IAAI7B,EAAE,GAAG,CAAC;GAAG;EAAK;CACrG;CACA,IAAMuN,IAAK/E,EAAE,IAAI,IACXgF,IAAKhF,EAAE,IAAI;CACjB,QAAQjG,EAAE,OAAV;EACE,KAAK,SACH,OAAO;GAAE,GAAG;GAAI,GAAG;GAAI,MAAM,CAAC;EAAE;EAClC,KAAK,OACH,OAAO;GAAE,GAAG;GAAI,GAAG;GAAI,MAAM,CAAC;EAAE;EAClC,KAAK,SACH,OAAO;GAAE,GAAG;GAAG,GAAG;GAAG,MAAM,CAAC;EAAE;EAChC,KAAK,OACH,OAAO8K,IAAS;GAAE,GAAG;GAAI,GAAG;GAAG,MAAM,CAAC;EAAE,IAAI;GAAE,GAAG;GAAG,GAAG;GAAI,MAAM,CAAC;EAAE;EACtE,KAAK,QACH,OAAO;GAAE,GAAG7E,EAAE,IAAI;GAAG,GAAGA,EAAE,IAAI;GAAG;EAAK;EACxC,KAAK,UAAU;GACb,IAAM7E,IAAI,KAAK,IAAI6E,EAAE,GAAGA,EAAE,CAAC,IAAI,KAAS;GACxC,OAAO;IAAE,GAAG7E;IAAG,GAAGA;IAAG;GAAK;EAC5B;EACA,KAAK,gBAAgB;GACnB,IAAMA,IAAI,KAAK,IAAI6E,EAAE,GAAGA,EAAE,CAAC,IAAI,KAAS;GACxC,OAAO;IAAE,GAAG7E;IAAG,GAAGA;IAAG;GAAK;EAC5B;EACA,KAAK,WACH,OAAO;GAAE,GAAG,KAAK,IAAI,KAAK6E,EAAE,IAAIqE,KAAM,IAAI;GAAG,GAAG,KAAK,IAAI,KAAKrE,EAAE,IAAIsE,KAAM,IAAI;GAAG;EAAK;EACxF,KAAK,WAAW;GACd,IAAMzM,IAAIkN,IAAKC,IAAK;GACpB,OAAO;IAAE;IAAG,GAAG,KAAMnN;IAAG;GAAK;EAC/B;EACA,KAAK,WACH,OAAO;GAAE,GAAGmI,EAAE,IAAIgF,IAAKX;GAAI,GAAGW;GAAI;EAAK;EACzC,KAAK;EACL,KAAK,WACH,OAAO;GAAE,GAAGD,IAAKC,IAAK;GAAG,GAAGA;GAAI;EAAK;EACvC,KAAK;EACL,KAAK,UACH,OAAO;GAAE,GAAGD,IAAKC,IAAK;GAAG,GAAGA;GAAI;EAAK;EACvC,KAAK;EACL,KAAK,UACH,OAAO;GAAE,GAAGD,IAAKC,IAAK;GAAK,GAAGA;GAAI;EAAK;EACzC,KAAK,QACH,OAAO;GAAE,GAAGD,IAAKC,IAAK;GAAG,GAAGA;GAAI;EAAK;EACvC,KAAK,YACH,OAAO;GAAE,GAAG,KAAK,IAAID,GAAI,EAAE;GAAG,GAAGC,IAAK;GAAI;EAAK;EACjD,KAAK;EACL,KAAK,aACH,OAAO;GAAE,GAAGD,IAAK;GAAI,GAAGC;GAAI;EAAK;EACnC,KAAK;EACL,KAAK,UACH,OAAO;GAAE,GAAGD,IAAK;GAAG,GAAGC,KAAMjL,EAAE,UAAU,WAAW,IAAI;GAAI;EAAK;EACnE,KAAK,SACH,OAAO;GAAE,GAAGgL,IAAK;GAAG,GAAGC,IAAK;GAAG;EAAK;EACtC,KAAK,YACH,OAAO;GAAE,GAAGD,IAAK;GAAK,GAAGC,IAAK;GAAK;EAAK;EAC1C,KAAK,SACH,OAAO;GAAE,GAAG,KAAK,IAAI,IAAIhF,EAAE,IAAI,CAAC;GAAG,GAAG,KAAKA,EAAE;GAAG;EAAK;EACvD,SACE,OAAO;GAAE,GAAG,KAAK,IAAI+E,GAAI,EAAE;GAAG,GAAGC;GAAI;EAAK;CAC9C;AACF;AAIA,SAASC,EAAU,GAAU;CAC3B,IAAMzN,IAAIuC,EAAE,SAAS,CAAC;CAEtB,OAAO;EADK,MAAMvC,EAAE,QAAQiL,EAAM;EAAM,QAAQjL,EAAE,UAAUiL,EAAM;EAAQ,IAAIjL,EAAE,MAAM;EAAK,MAAMA,EAAE;CAC5F;AACT;AAEA,SAAS0N,EAAS,GAAU,GAAU,GAAQ,GAAY,GAAY;CACpE,IAAM,EAAE,MAAG,SAAM5L,GACXkF,IAAIsE,IAAKjL,IAAI,GACb+K,IAAIG,IAAKxI,IAAI,GACb0F,IAAIgF,EAAUlL,CAAC,GACfyI,IAAQzI,EAAE,OAAO,SAAS0I,EAAM,KAChC0C,KAAO,IAAKrC,GAAI,IAAKC,MAAOqC,EAAI,KAAKC,GAAIC,GAAIhM,EAAE,MAAM;EAAE,QAAQ;EAAU;EAAO,MAAMS,EAAE,OAAO;EAAM,QAAQA,EAAE,OAAO;CAAO,CAAC,GAC9HwL,KAAQ,MAA4BH,EAAI,KAAKjF,GAAKF,CAAC;CACzD,QAAQlG,EAAE,OAAV;EACE,KAAK;GACH,EAAI,OAAO+I,GAAIC,GAAIlL,IAAI,GAAG,EAAE,MAAMkC,EAAE,OAAO,QAAQ0I,EAAM,KAAK,CAAC;GAC/D;EACF,KAAK;GACH,EAAI,OAAOK,GAAIC,GAAIlL,IAAI,GAAG;IAAE,MAAM;IAAW,QAAQkC,EAAE,OAAO,UAAU0I,EAAM;IAAM,IAAI;GAAI,CAAC,CAAC,CAAC,OAAOK,GAAIC,GAAIlL,IAAI,IAAI,GAAG,EAAE,MAAMkC,EAAE,OAAO,QAAQ0I,EAAM,KAAK,CAAC;GAC9J;EACF,KAAK;GACH,EAAI,OAAOK,GAAIC,GAAIlL,IAAI,GAAG,EAAE,MAAMkC,EAAE,OAAO,QAAQ0I,EAAM,KAAK,CAAC;GAC/D;EACF,KAAK;GACH,EAAI,KAAKjE,GAAGoE,GAAG/K,GAAG0C,GAAG,EAAE,MAAMR,EAAE,OAAO,QAAQ0I,EAAM,KAAK,GAAG,CAAC;GAC7D;EACF,KAAK;GACI,EAAS;GAAhB;EACF,KAAK;GACH,EAAI,KAAKjE,GAAGoE,GAAG/K,GAAG0C,GAAG0F,GAAG,CAAC;GACzB;EACF,KAAK;GACH,EAAI,KAAKzB,GAAGoE,GAAG/K,GAAG0C,GAAG0F,GAAG1F,IAAI,CAAC;GAC7B;EACF,KAAK;GACH,EAAI,KAAKiE,GAAGoE,GAAG/K,GAAG0C,GAAG0F,CAAC,CAAC,CAAC,KAAKzB,IAAI,GAAGoE,GAAGpE,IAAI,GAAGoE,IAAIrI,GAAG0F,CAAC,CAAC,CAAC,KAAKzB,IAAI3G,IAAI,GAAG+K,GAAGpE,IAAI3G,IAAI,GAAG+K,IAAIrI,GAAG0F,CAAC;GAC9F;EACF,KAAK;GAGI,AAFPmF,EAAI,KAAK5G,IAAI,GAAGoE,GAAG/K,IAAI,GAAG0C,GAAG0F,CAAC,GAC9BmF,EAAI,KAAK5G,GAAGoE,IAAIrI,IAAI,IAAI,IAAI,IAAI,GAAG0F,CAAC,CAAC,CAAC,KAAKzB,GAAGoE,IAAIrI,IAAI,IAAI,GAAG,IAAI,GAAG0F,CAAC,GAC9DkF,EAASrC,IAAK,CAAC;GAAtB;EACF,KAAK;GAII,AAFPsC,EAAI,KAAK,IAAInM,EAAEuF,CAAC,EAAE,GAAGvF,EAAE2J,IAAI,CAAE,EAAE,IAAI3J,EAAEpB,IAAI,CAAC,EAAE,WAAeoB,EAAEuF,IAAI3G,CAAC,EAAE,GAAGoB,EAAE2J,IAAI,CAAE,EAAE,IAAI3J,EAAEuF,IAAI3G,CAAC,EAAE,GAAGoB,EAAE2J,IAAIrI,IAAI,CAAE,EAAE,IAAItB,EAAEpB,IAAI,CAAC,EAAE,WAAeoB,EAAEuF,CAAC,EAAE,GAAGvF,EAAE2J,IAAIrI,IAAI,CAAE,EAAE,KAAK0F,CAAC,GACvKmF,EAAI,KAAK,IAAInM,EAAEuF,CAAC,EAAE,GAAGvF,EAAE2J,IAAI,CAAE,EAAE,IAAI3J,EAAEpB,IAAI,CAAC,EAAE,WAAeoB,EAAEuF,IAAI3G,CAAC,EAAE,GAAGoB,EAAE2J,IAAI,CAAE,KAAK;IAAE,GAAG3C;IAAG,MAAM;GAAO,CAAC,GACnGkF,EAASrC,GAAIC,IAAK,IAAK,CAAC;GAA/B;EAEF,KAAK;GACH,EAAI,OAAOD,GAAIC,GAAIlL,IAAI,GAAGoI,CAAC;GAC3B;EACF,KAAK;GACH,EAAI,OAAO6C,GAAIC,GAAIlL,IAAI,GAAGoI,CAAC,CAAC,CAAC,OAAO6C,GAAIC,GAAIlL,IAAI,IAAI,GAAG;IAAE,GAAGoI;IAAG,MAAM;GAAO,CAAC;GAC7E;EACF,KAAK;GACH,EAAI,QAAQ6C,GAAIC,GAAIlL,IAAI,GAAG0C,IAAI,GAAG0F,CAAC;GACnC;EACF,KAAK;GACH,EAAK;IACH,CAAC6C,GAAIF,CAAC;IACN,CAACpE,IAAI3G,GAAGkL,CAAE;IACV,CAACD,GAAIF,IAAIrI,CAAC;IACV,CAACiE,GAAGuE,CAAE;GACR,CAAC;GACD;EACF,KAAK,WAAW;GACd,IAAMvL,IAAI+C,IAAI;GACd,EAAK;IACH,CAACiE,IAAIhH,GAAGoL,CAAC;IACT,CAACpE,IAAI3G,IAAIL,GAAGoL,CAAC;IACb,CAACpE,IAAI3G,GAAGkL,CAAE;IACV,CAACvE,IAAI3G,IAAIL,GAAGoL,IAAIrI,CAAC;IACjB,CAACiE,IAAIhH,GAAGoL,IAAIrI,CAAC;IACb,CAACiE,GAAGuE,CAAE;GACR,CAAC;GACD;EACF;EACA,KAAK,WAAW;GACd,IAAMvL,IAAI+C,IAAI;GACd,EAAK;IACH,CAACiE,IAAIhH,GAAGoL,CAAC;IACT,CAACpE,IAAI3G,IAAIL,GAAGoL,CAAC;IACb,CAACpE,IAAI3G,GAAG+K,IAAIpL,CAAC;IACb,CAACgH,IAAI3G,GAAG+K,IAAIrI,IAAI/C,CAAC;IACjB,CAACgH,IAAI3G,IAAIL,GAAGoL,IAAIrI,CAAC;IACjB,CAACiE,IAAIhH,GAAGoL,IAAIrI,CAAC;IACb,CAACiE,GAAGoE,IAAIrI,IAAI/C,CAAC;IACb,CAACgH,GAAGoE,IAAIpL,CAAC;GACX,CAAC;GACD;EACF;EACA,KAAK;EACL,KAAK,UAAU;GACb,IAAMA,IAAI+C,IAAI,GACRiL,IAAKzL,EAAE,UAAU;GACvB,EAAK;IACH,CAACyL,IAAKhH,IAAIhH,IAAIgH,GAAGoE,CAAC;IAClB,CAAC4C,IAAKhH,IAAI3G,IAAI2G,IAAI3G,IAAIL,GAAGoL,CAAC;IAC1B,CAAC4C,IAAKhH,IAAI3G,IAAIL,IAAIgH,IAAI3G,GAAG+K,IAAIrI,CAAC;IAC9B,CAACiL,IAAKhH,IAAIA,IAAIhH,GAAGoL,IAAIrI,CAAC;GACxB,CAAC;GACD;EACF;EACA,KAAK;EACL,KAAK,UAAU;GACb,IAAM/C,IAAI+C,IAAI,KACRkL,IAAK1L,EAAE,UAAU;GACvB,EAAK;IACH,CAAC0L,IAAKjH,IAAIhH,IAAIgH,GAAGoE,CAAC;IAClB,CAAC6C,IAAKjH,IAAI3G,IAAIL,IAAIgH,IAAI3G,GAAG+K,CAAC;IAC1B,CAAC6C,IAAKjH,IAAI3G,IAAI2G,IAAI3G,IAAIL,GAAGoL,IAAIrI,CAAC;IAC9B,CAACkL,IAAKjH,IAAIA,IAAIhH,GAAGoL,IAAIrI,CAAC;GACxB,CAAC;GACD;EACF;EACA,KAAK,QAAQ;GACX,IAAM/C,IAAI+C,IAAI;GAQP,AAPPgL,EAAK;IACH,CAAC/G,GAAGoE,CAAC;IACL,CAACpE,IAAI3G,GAAG+K,CAAC;IACT,CAACpE,IAAI3G,GAAG+K,IAAIrI,CAAC;IACb,CAACiE,GAAGoE,IAAIrI,CAAC;IACT,CAACiE,IAAIhH,GAAGuL,CAAE;GACZ,CAAC,GACMoC,EAASrC,IAAKtL,IAAI,CAAC;GAA1B;EACF;EACA,KAAK;GASH,AAPA+N,EAAK;IACH,CAAC/G,GAAGoE,CAAC;IACL,CAACpE,IAAI3G,IAAI,IAAG+K,CAAC;IACb,CAACpE,IAAI3G,GAAG+K,IAAI,EAAC;IACb,CAACpE,IAAI3G,GAAG+K,IAAIrI,CAAC;IACb,CAACiE,GAAGoE,IAAIrI,CAAC;GACX,CAAC,GACD6K,EAAI,KACF;IACE,CAAC5G,IAAI3G,IAAI,IAAG+K,CAAC;IACb,CAACpE,IAAI3G,IAAI,IAAG+K,IAAI,EAAC;IACjB,CAACpE,IAAI3G,GAAG+K,IAAI,EAAC;GACf,GACA;IAAE,GAAG3C;IAAG,MAAM;GAAO,GACrB,EACF;GACA;EAEF,KAAK;GAEI,AADPmF,EAAI,KAAK5G,GAAGoE,GAAG,KAAK,IAAI/K,IAAI,IAAK,EAAE,GAAG,IAAIoI,GAAG,CAAC,CAAC,CAAC,KAAKzB,GAAGoE,IAAI,GAAG/K,GAAG0C,IAAI,GAAG0F,CAAC,GACnEkF,EAASrC,GAAIC,IAAK,CAAC;GAA1B;EACF,KAAK;GAkBI,AAjBPwC,EAAK;IACH,CAAC/G,GAAGoE,IAAI,CAAC;IACT,CAACpE,IAAI,GAAGoE,CAAC;IACT,CAACpE,IAAI3G,GAAG+K,CAAC;IACT,CAACpE,IAAI3G,GAAG+K,IAAIrI,IAAI,CAAC;IACjB,CAACiE,IAAI3G,IAAI,GAAG+K,IAAIrI,CAAC;IACjB,CAACiE,GAAGoE,IAAIrI,CAAC;GACX,CAAC,GACD6K,EAAI,KACF;IACE,CAAC5G,GAAGoE,IAAI,CAAC;IACT,CAACpE,IAAI3G,IAAI,GAAG+K,IAAI,CAAC;IACjB,CAACpE,IAAI3G,GAAG+K,CAAC;GACX,GACA;IAAE,GAAG3C;IAAG,MAAM;GAAO,GACrB,EACF,CAAC,CAAC,KAAKzB,IAAI3G,IAAI,GAAG+K,IAAI,GAAGpE,IAAI3G,IAAI,GAAG+K,IAAIrI,GAAG0F,CAAC,GACrCkF,EAASrC,IAAK,GAAGC,IAAK,CAAC;GAA9B;EACF,KAAK;GACH,EAAI,KAAKvE,GAAGoE,GAAG/K,GAAG0C,GAAG0F,GAAG,KAAK,IAAI1F,IAAI,GAAG,EAAE,CAAC;GAC3C;EACF,KAAK;GAMI,AALPgL,EAAK;IACH,CAACzC,GAAIF,CAAC;IACN,CAACpE,IAAI3G,GAAG+K,IAAIrI,CAAC;IACb,CAACiE,GAAGoE,IAAIrI,CAAC;GACX,CAAC,GACM4K,EAASrC,GAAIC,IAAKxI,IAAI,CAAC;GAA9B;EACF,KAAK,SAAS;GACZ,IAAM/C,IAAI;IAAE,MAAM;IAAQ,QAAQuC,EAAE,OAAO,UAAU0I,EAAM;IAAM,IAAI;GAAI,GACnE/K,IAAMkL,IAAI;GAIhB,AAHAwC,EAAI,OAAOtC,GAAIpL,IAAM,GAAG,GAAG;IAAE,GAAGF;IAAG,MAAMuC,EAAE,OAAO,QAAQ0I,EAAM;GAAK,CAAC,GACtE2C,EAAI,KAAKtC,GAAIpL,IAAM,IAAIoL,GAAIpL,IAAM,IAAIF,CAAC,CAAC,CAAC,KAAKsL,IAAK,IAAIpL,IAAM,IAAIoL,IAAK,IAAIpL,IAAM,IAAIF,CAAC,GACpF4N,EAAI,KAAKtC,GAAIpL,IAAM,IAAIoL,IAAK,GAAGpL,IAAM,IAAIF,CAAC,CAAC,CAAC,KAAKsL,GAAIpL,IAAM,IAAIoL,IAAK,GAAGpL,IAAM,IAAIF,CAAC,GAClF4N,EAAI,KAAKtC,GAAIpL,IAAM,KAAM4B,EAAE,KAAK,SAASiL,IAAM,GAAGjL,EAAE,MAAM;IAAE,QAAQ;IAAU;GAAM,CAAC;GACrF;EACF;EACA;GACE,IAAIS,EAAE,UAAU,QAAQ,OAAO2L,EAAaN,GAAKrL,GAAGyE,GAAGoE,GAAG/K,CAAC;GAC3D,EAAI,KAAK2G,GAAGoE,GAAG/K,GAAG0C,GAAG0F,CAAC;CAC1B;CACA,EAAI;AACN;AAEA,SAASyF,EAAa,GAAU,GAAU,GAAW,GAAW,GAAW;CACzE,IAAMzF,IAAIgF,EAAUlL,CAAC,GACf+K,IAAK/K,EAAE,SAAU,IAAI0K,CAAW,GAChCzH,IAAQ8H,EAAG,QAAQ,GAAG,MAAMzL,IAAI7B,EAAE,GAAG,CAAC;CAC5C,EAAI,KAAKgH,GAAGoE,GAAG/K,GAAGmF,GAAOiD,GAAGlG,EAAE,UAAU,UAAU,IAAI,CAAC;CACvD,IAAIrC,IAAMkL;CACV,EAAE,SAAU,SAAS,GAAG,MAAM;EAC5B,AAAIrL,KAAG6N,EAAI,KAAK5G,GAAG9G,GAAK8G,IAAI3G,GAAGH,GAAK;GAAE,QAAQuI,EAAE;GAAQ,IAAI;EAAE,CAAC;EAC/D,IAAMmD,IAAKvB,EAAWuC,CAAK;EAa3B,AAZA5M,EAAE,KAAK,SAAS,GAAK,MAAM;GACzB,IAAM8N,IAAK5N,IAAM,IAAIuB,IAAImK,IAAKA,IAAK;GACnC,IAAI5L,EAAE,UAAWmN,EAAI,WAAW,KAAKpN,MAAM,GAAI;IAC7C,EAAI,KAAKiH,IAAI3G,IAAI,GAAGyN,GAAIX,EAAI,KAAK,GAAG,GAAG;KAAE,QAAQ;KAAU,MAAMP;KAAO,MAAM5M,EAAE;KAAM,QAAQA,EAAE;KAAQ,OAAOuC,EAAE,OAAO;IAAM,CAAC;IAC/H;GACF;GACA,IAAI+I,IAAKtE,IAAI6F;GACb,EAAI,SAAS,GAAG,MAAM;IAEpB,AADAe,EAAI,KAAKtC,GAAIwC,GAAI5L,GAAG;KAAE,MAAM0K;KAAO,MAAM5M,EAAE;KAAM,QAAQA,EAAE;KAAQ,OAAOuC,EAAE,OAAO;IAAM,CAAC,GAC1F,KAAM+K,EAAGvN,EAAE,CAAC,KAAKsF,KAAK;GACxB,CAAC;EACH,CAAC,GACD,KAAOiI,EAAGvN,EAAE,CAAC;CACf,CAAC;AACH;AAIA,IAAMoO,IAA0C;CAAE,OAAO;CAAI,UAAU;CAAI,SAAS;CAAI,UAAU;CAAI,QAAQ;CAAG,SAAS;AAAE;AAE5H,SAASC,EAAK,GAAO,GAAW;CAC9B,IAAMC,IAAKvM,EAAE,IAAID,EAAE,GACbyM,IAAKxM,EAAE,IAAID,EAAE,GACbf,IAAI,KAAK,MAAMuN,GAAIC,CAAE,KAAK;CAChC,OAAO;EAAE,GAAGD,IAAKvN;EAAG,GAAGwN,IAAKxN;CAAE;AAChC;AAGA,SAASyN,GAAS,GAAU,GAAY,GAAO,GAAO,GAAa;CACjE,IAAMC,IAAK,CAAC7K,EAAE,GACR8K,IAAK9K,EAAE,GACPD,KAAM,GAAc,MAAmC,CAAC+E,EAAE,IAAI9E,EAAE,IAAI2F,IAAOkF,IAAKE,GAAMjG,EAAE,IAAI9E,EAAE,IAAI2F,IAAOmF,IAAKC,CAAI,GAClHjE,KAAQ,GAAqB,MAAwBmD,EAAI,KAAK/L,EAAE,IAAIA,EAAE,IAAIC,EAAE,IAAIA,EAAE,IAAI;EAAE,QAAQ6M;EAAK,IAAI;CAAI,CAAC;CACpH,QAAQC,GAAR;EACE,KAAK;GACH,EAAI,KAAK;IAAClL,EAAG,GAAG,CAAC;IAAGA,EAAG,IAAI,GAAG;IAAGA,EAAG,IAAI,IAAI;GAAC,GAAG;IAAE,MAAMiL;IAAK,QAAQA;IAAK,IAAI;GAAE,CAAC;GACjF;EACF,KAAK;GACH,EAAI,KAAK;IAACjL,EAAG,IAAI,CAAC;IAAGA,EAAG,GAAG,CAAC;IAAGA,EAAG,IAAI,EAAE;GAAC,GAAG;IAAE,QAAQiL;IAAK,IAAI;GAAI,GAAG,EAAK;GAC3E;EACF,KAAK;GACH,EAAI,KAAK;IAACjL,EAAG,GAAG,CAAC;IAAGA,EAAG,IAAI,CAAC;IAAGA,EAAG,IAAI,EAAE;GAAC,GAAG;IAAE,MAAM;IAAW,QAAQiL;IAAK,IAAI;GAAI,CAAC;GACrF;EACF,KAAK;EACL,KAAK;GACH,EAAI,KAAK;IAACjL,EAAG,GAAG,CAAC;IAAGA,EAAG,KAAK,CAAC;IAAGA,EAAG,IAAI,CAAC;IAAGA,EAAG,KAAK,EAAE;GAAC,GAAG;IAAE,MAAMkL,MAAS,YAAYD,IAAM;IAAW,QAAQA;IAAK,IAAI;GAAI,CAAC;GAC7H;EACF,KAAK;EACL,KAAK,WAAW;GACd,IAAM,CAACrD,GAAIC,KAAM7H,EAAG,GAAG,CAAC;GACxB,EAAI,OAAO4H,GAAIC,GAAI,GAAG;IAAE,MAAMqD,MAAS,WAAWD,IAAM;IAAW,QAAQA;IAAK,IAAI;GAAI,CAAC;GACzF;EACF;EACA,KAAK;GAEH,AADAlE,EAAK/G,EAAG,GAAG,CAAC,GAAGA,EAAG,IAAI,EAAE,CAAC,GACzB+G,EAAK/G,EAAG,GAAG,EAAE,GAAGA,EAAG,IAAI,CAAC,CAAC;GACzB;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,QAAQ;GACX,IAAMmL,IAAOD,EAAK,SAAS,MAAM;GAOjC,IANIC,MACFpE,EAAK/G,EAAG,GAAG,CAAC,GAAGA,EAAG,IAAI,CAAC,CAAC,GACxB+G,EAAK/G,EAAG,GAAG,EAAE,GAAGA,EAAG,IAAI,CAAC,CAAC,KAEvBkL,MAAS,SAASA,MAAS,eAAYnE,EAAK/G,EAAGmL,IAAO,KAAK,GAAG,CAAC,GAAGnL,EAAGmL,IAAO,KAAK,GAAG,EAAE,CAAC,GACvFD,MAAS,SAAOnE,EAAK/G,EAAG,IAAI,CAAC,GAAGA,EAAG,IAAI,EAAE,CAAC,GAC1CkL,MAAS,cAAcA,MAAS,aAAa;IAC/C,IAAM,CAACtD,GAAIC,KAAM7H,EAAGmL,IAAO,KAAK,IAAI,CAAC;IACrC,EAAI,OAAOvD,GAAIC,GAAI,KAAK;KAAE,MAAM;KAAW,QAAQoD;KAAK,IAAI;IAAI,CAAC;GACnE;GACA,AAAIC,MAAS,cAAYnE,EAAK/G,EAAG,GAAG,CAAC,GAAGA,EAAG,GAAG,EAAE,CAAC;GACjD;EACF;CACF;AACF;AAGA,SAASoL,GAAQ,GAAW,GAAa,GAAiB;CACxD,IAAMC,IAAO3F,EAAKA,EAAK,SAAS,IAC1B4F,IAAMD,EAAK,EAAEA,EAAK,EAAE,SAAS,IAE7BpL,IAAIyK,EADGW,EAAK,MAAM,MAAMA,EAAK,EAAE,KAAK3F,EAAK,SAAS,IAAIA,EAAKA,EAAK,SAAS,EAAE,CAAC,EAAEA,EAAKA,EAAK,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK6F,GACrGD,CAAG;CACxB,IAAIE,GAAK;EACP,IAAMxG,IAAI;GAAE,GAAGsG,EAAI,IAAIrL,EAAE,IAAIuL;GAAK,GAAGF,EAAI,IAAIrL,EAAE,IAAIuL;EAAI;EAEvD,IADA,EAAK,EAAEH,EAAK,EAAE,SAAS,KAAKrG,GACxBqG,EAAK,MAAM,KAAK;GAClB,IAAMI,IAAK;IAAE,GAAGJ,EAAK,EAAE,EAAE,CAAC,IAAIpL,EAAE,IAAI,KAAK,IAAIuL,GAAK,CAAC;IAAG,GAAGH,EAAK,EAAE,EAAE,CAAC,IAAIpL,EAAE,IAAI,KAAK,IAAIuL,GAAK,CAAC;GAAE,GAExFnP,IAAI,KAAK,IAAI,IAAIoP,EAAG,IAAIJ,EAAK,EAAE,EAAE,CAAC,KAAKpL,EAAE,KAAKwL,EAAG,IAAIJ,EAAK,EAAE,EAAE,CAAC,KAAKpL,EAAE,CAAC;GAC7E,EAAK,EAAE,KAAK;IAAE,GAAGwL,EAAG,IAAIxL,EAAE,IAAI5D;IAAG,GAAGoP,EAAG,IAAIxL,EAAE,IAAI5D;GAAE;EACrD;CACF;CACA,OAAO4D;AACT;AAEA,SAASyL,EAAU,GAAU;CAC3B,OAAO,EAAE,SAASnE,EAAM;AAC1B;AAIA,IAAMrM,IAAS,IAET0Q,KAAY,KACZC,IAAY;AAElB,SAAgBC,EAAY,GAAoB;CAC9C,IAAI,CAACjP,EAAE,MAAM,QAAQ,MAAM,IAAI1B,EAAa,0BAA0B;CACtE,IAAI0B,EAAE,MAAM,SAAS+O,MAAa/O,EAAE,MAAM,SAASgP,GAAW,MAAM,IAAI1Q,EAAa,qCAAqC0B,EAAE,MAAM,OAAO,UAAUA,EAAE,MAAM,OAAO,QAAQ;CAC1K,IAAMgI,IAAMhI,EAAE,KACR8M,IAAS9E,MAAQ,QAAQA,MAAQ,MACjCqF,IAAM,IAAIzC,EAAI,GAEdsE,IAAa,IAAI,IAAIlP,EAAE,SAAS,KAAK,GAAG,MAAM,CAAC2B,EAAE,IAAInC,CAAC,CAAC,CAAC,GACxD2P,IAAU,IAAI,IAAInP,EAAE,MAAM,KAAK,GAAG,MAAM,CAACgC,EAAE,IAAIxC,CAAC,CAAC,CAAC,GAClD4P,KAAY,MAAepP,EAAE,SAAS2B,EAAE,CAAC,WAAW,KAAA,IAA0D,KAA9CuN,EAAW,IAAIlP,EAAE,SAAS2B,EAAE,CAAC,MAAO,KAAK,IACzG0N,KAAa,GAAW,MAAc;EAC1C,KAAK,IAAI7P,IAAIQ,EAAE,MAAMJ,EAAE,CAAC,YAAY,KAAA,IAAwD,KAA5CsP,EAAW,IAAIlP,EAAE,MAAMJ,EAAE,CAAC,OAAQ,KAAK,IAASJ,KAAK,GAAG,IAAI4P,EAAS5P,CAAC,GAAG,IAAIA,MAAMmC,GAAG,OAAO;EAC7I,OAAO;CACT,GAEM2N,KAAW,GAAY,MAA6B;EACxD,IAAM1P,IAAIuP,EAAQ,IAAIlD,CAAE;EACxB,IAAIrM,MAAM,KAAA,GAAW,OAAOA;EAC5B,IAAM+B,IAAIuN,EAAW,IAAIjD,CAAE;EAC3B,IAAItK,MAAM,KAAA,GAAW,OAAO;EAC5B,IAAI,CAAC4N,GAAS,OAAOvP,EAAE,MAAM,WAAW,GAAG,MAAMqP,EAAU7P,GAAGmC,CAAC,CAAC;EAChE,KAAK,IAAInC,IAAIQ,EAAE,MAAM,SAAS,GAAGR,KAAK,GAAG,KAAK,IAAI6P,EAAU7P,GAAGmC,CAAC,GAAG,OAAOnC;EAC1E,OAAO;CACT,GAEMwJ,IAAQhJ,EAAE,MAAM,KAAK,MAAM6M,EAAQ7K,GAAGgG,CAAG,CAAC,GAC1C3I,IAAQW,EAAE,MACb,KAAK,OAAO;EAAE;EAAG,GAAGsP,EAAQ,EAAE,MAAM,EAAI;EAAG,GAAGA,EAAQ,EAAE,IAAI,EAAK;EAAG,IAAIH,EAAQ,IAAI,EAAE,IAAI,IAAI,KAAKD,EAAW,IAAI,EAAE,IAAI,KAAK;EAAI,IAAIC,EAAQ,IAAI,EAAE,EAAE,IAAI,KAAKD,EAAW,IAAI,EAAE,EAAE,KAAK;CAAG,EAAE,CAAC,CAC5L,QAAQ,MAAMzI,EAAE,KAAK,KAAKA,EAAE,KAAK,CAAC,GAC/B+I,IAAWnQ,EAAM,MAAM,MAAMoH,EAAE,EAAE,KAAK,GACtCzD,KAAO,MAA2BvD,IAAIsK,EAAQ3L,EAAMqB,CAAC,GAAG4M,CAAK,IAAI,KAAA,GACjEoD,oBAAQ,IAAI,IAAoB;CACtC,KAAK,IAAM,EAAE,GAAG,MAAG,UAAOpQ,GAAO;EAC/B,IAAIO,MAAME,GAAG;EACb,IAAMS,IAAIyC,EAAI,EAAE,KAAK;EACrB,EAAM,IAAIpD,GAAG,KAAK,IAAI6P,EAAM,IAAI7P,CAAC,KAAK,GAAG,MAAMW,KAAKuM,IAASvM,EAAE,IAAIA,EAAE,KAAK,IAAI,EAAE,CAAC;CACnF;CACA,IAAMmP,IAAkB1P,EAAE,MAAM,KAAK,GAAG,MAAM;EAC5C,IAAMuB,IAAIyH,EAAMxJ,IACVmC,IAAIK,EAAE,YAAY,KAAA,IAA8C,KAAlCkN,EAAW,IAAIlN,EAAE,OAAO,KAAK,IAC3D2N,IAAS,CAAC,CAAC3N,EAAE,UAAU,UAAU4N,GAAO,IAAI5N,EAAE,KAAK;EACzD,OAAO8K,IAAS;GAAE,GAAGvL,EAAE;GAAG,GAAGA,EAAE;GAAG,SAASI;GAAG,MAAM8N,EAAM,IAAIjQ,CAAC;GAAG;EAAO,IAAI;GAAE,GAAG+B,EAAE;GAAG,GAAGA,EAAE;GAAG,SAASI;GAAG,MAAM8N,EAAM,IAAIjQ,CAAC;GAAG;EAAO;CACxI,CAAC,GACKqQ,IAAkBxQ,EAAM,KAAK,EAAE,GAAG,MAAG,WAAQ;EACjD,IAAMkB,IAAIyC,EAAI,EAAE,KAAK,GACf8M,IAAMvP,IAAI;GAAE,GAAGA,EAAE,IAAI;GAAG,GAAGA,EAAE,IAAI;EAAE,IAAI,KAAA;EAC7C,OAAO;GACL;GACA;GACA,SAAS,EAAE,UAAU,MAAMiP,IAAW,IAAI;GAC1C,QAAQ;GACR,OAAOM,IAAOhD,IAASgD,IAAM;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;GAAE,IAAK,KAAA;EACzD;CACF,CAAC,GAEKC,IAAwB/P,EAAE,SAAS,KAAK,GAAG,MAAM;EACrD,IAAMiI,IAAItG,EAAE,QAAQoI,EAAQ3L,EAAMuD,EAAE,KAAK,GAAG0K,GAAO,EAAI,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE,GAClE1M,IAAM,MAAMgC,EAAE,QAAQsG,EAAE,IAAI,IAAI,IAGhC6H,IACJ9H,MAAQ,OAAO;GAAC;GAAM;GAAMrI;GAAK;EAAI,IAAIqI,MAAQ,OAAO;GAAC;GAAM;GAAM;GAAMrI;EAAG,IAAmB;GAACA;GAAK;GAAM;GAAM;EAAI;EACzH,OAAO;GAAE,QAAQyP,EAAS5P,CAAC;GAAG;GAAK,MAAMsN,IAAS7E,EAAE,IAAI,KAAWA,EAAE,IAAItI,IAAM;EAAK;CACtF,CAAC,GACKqQ,IAAOhQ,EAAE,UAAU,KAAK,MAAQiQ,EAAI,KAAK,MAAOd,EAAQ,IAAIlD,CAAE,CAAC,CAAC,CAAC,QAAQ,MAAmBrM,MAAM,KAAA,CAAS,CAAC,CAAC,CAAC,QAAQ,MAAQqQ,EAAI,SAAS,CAAC,GAC5IvO,IAAM9C,EAAQ8Q,GAAQG,GAAQE,GAAW;EAC7C,SAASjD,IAAS,KAAK;EACvB,UAAUA,IAAS,KAAK,OAAO0C,IAAW,IAAI;EAC9C,SAAS;EACT,UAAUQ;CACZ,CAAC,GAGKE,IAASlQ,EAAE,QAAQ,KAAe,GAClCmQ,IAAKzO,EAAI,GACT0O,KAAM1O,EAAI,GACV2O,KAAM,MAAc;EACxB,IAAMlI,IAAIH,MAAQ,OAAOE,IAAIF,MAAQ,OAAO;GAAE,GAAGE,EAAE;GAAG,GAAGkI,KAAMlI,EAAE;EAAE,IAAIF,MAAQ,OAAO;GAAE,GAAGE,EAAE;GAAG,GAAGA,EAAE;EAAE,IAAI;GAAE,GAAGkI,KAAMlI,EAAE;GAAG,GAAGA,EAAE;EAAE;EAClI,OAAO;GAAE,GAAGC,EAAE,IAAI9J;GAAQ,GAAG8J,EAAE,IAAI9J,IAAS6R;EAAO;CACrD,GACInO,KAAK+K,IAASqD,IAAKC,MAAO,IACxB,KAAKtD,IAASsD,KAAMD,KAAM,KAAaD,GAGvCI,MAAS,MAAc;EAC3B,IAAIlN,IAAI;EACR,KAAK,IAAIzB,IAAIyN,EAAS5P,CAAC,GAAGmC,KAAK,GAAG,IAAIyN,EAASzN,CAAC,GAAG;EACnD,OAAOyB;CACT,GACMvC,IAAQb,EAAE,SAAS,KAAK,GAAG,MAAMR,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM8Q,GAAMhP,CAAC,IAAIgP,GAAM/O,CAAC,CAAC,GACtEgP,KAAwEvQ,EAAE,SAAS,UAAU,IAAI,GAEjGwQ,KAAgF,CAAC;CACvF,KAAK,IAAMhR,KAAKqB,GAAO;EACrB,IAAMU,IAAIG,EAAI,SAASlC;EACvB,IAAI,CAAC+B,GAAG;EACR,IAAMI,IAAI3B,EAAE,SAASR,IACf8B,IAAI+O,EAAG;GAAE,GAAG9O,EAAE;GAAG,GAAGA,EAAE;EAAE,CAAC,GACzBkP,IAAIJ,EAAG;GAAE,GAAG9O,EAAE,IAAIA,EAAE;GAAG,GAAGA,EAAE,IAAIA,EAAE;EAAE,CAAC,GACrC0H,IAAK,KAAK,IAAI3H,EAAE,GAAGmP,EAAE,CAAC,GACtBtH,IAAK,KAAK,IAAI7H,EAAE,GAAGmP,EAAE,CAAC,GACtBC,IAAK,KAAK,IAAID,EAAE,IAAInP,EAAE,CAAC,GACvBoI,IAAK,KAAK,IAAI+G,EAAE,IAAInP,EAAE,CAAC,GACvBqP,IAAKhP,EAAE,SAAS,CAAC;EAGvB,IAFA,GAAWnC,KAAK;GAAE,GAAGyJ;GAAI,GAAGE;GAAI,GAAGuH;GAAI,GAAGhH;EAAG,GAC7C2D,EAAI,KAAKpE,GAAIE,GAAIuH,GAAIhH,GAAI;GAAE,MAAMiH,EAAG,QAAQjG,EAAM;GAAS,QAAQiG,EAAG,UAAUjG,EAAM;GAAe,IAAIiG,EAAG,MAAM;GAAG,MAAMA,EAAG;EAAK,GAAG,CAAC,GACnIhP,EAAE,OAAO;GACX,IAAMsG,IAAI7J,EAAMuD,EAAE,KAAK,GACjBhC,IAAMqI,MAAQ,OAAOmB,IAAKO,IAAK,IAAKzB,EAAE,SAAS6B,EAAWuC,CAAK,IAAK,IAAIlD,IAAK,IAAKlB,EAAE,SAAS6B,EAAWuC,CAAK,IAAK;GACxH,GAAO,KAAK;IAAE,GAAGpD,IAAKyH,IAAK;IAAG,GAAG/Q;IAAK,MAAMsI;IAAG,OAAO0I,EAAG,SAASjG,EAAM;IAAK,IAAIiG,EAAG,QAAQA,EAAG,SAAS,SAASA,EAAG,OAAOjG,EAAM;GAAQ,CAAC;EAC5I;CACF;CAGA,IAAMkG,KAAuE,CAAC;CAC9E,EAAM,SAAS,EAAE,GAAG,QAAK,MAAM;EAC7B,IAAI,EAAE,SAAS,UAAU;EACzB,IAAMxC,IAAMS,EAAU,CAAC,GACjBlE,IAAQ;GAAE,QAAQyD;GAAK,IAAI,EAAE,OAAO,EAAE,SAAS,UAAU,IAAI;GAAM,MAAM,EAAE,SAAS,WAAW,QAAQ,EAAE,SAAS,WAAW,QAAQ,KAAA;EAAU,GAC/IyC,IAAOnP,EAAI,MAAMvC;EACvB,IAAI,CAAC0R,GAAM;GACT,IAAIxR,EAAMF,EAAE,CAAC,MAAME,EAAMF,EAAE,CAAC,GAAG;GAE/B,IAAM,IAAIkR,EAAG3O,EAAI,MAAM9B,EAAE,GACnB2B,IAAIyH,EAAMpJ,IACZH,GAAOqR,GAAQlC,GAAQ3G,GAAO8I;GAClC,AAAIjE,KACF,IAAI;IAAE,GAAG,EAAE,IAAIvL,EAAE,IAAI;IAAG,GAAG,EAAE,IAAIA,EAAE,IAAI;GAAE,GACzC,IAAI;IAAE,GAAG,EAAE,IAAIA,EAAE,IAAI;IAAG,GAAG,EAAE,IAAIA,EAAE,IAAI;GAAE,GACzC,IAAK;IAAE,GAAG9B,EAAE,IAAI;IAAI,GAAGA,EAAE,IAAI;GAAG,GAChC,IAAK;IAAE,GAAGwI,EAAE,IAAI;IAAI,GAAGA,EAAE,IAAI;GAAG,GAChC,IAAK;IAAE,GAAG,EAAE,IAAI1G,EAAE,IAAI,IAAI;IAAI,GAAG,EAAE;GAAE,MAErC,IAAI;IAAE,GAAG,EAAE,IAAIA,EAAE,IAAI;IAAG,GAAG,EAAE,IAAIA,EAAE,IAAI;GAAE,GACzC,IAAI;IAAE,GAAG,EAAE,IAAIA,EAAE,IAAI;IAAG,GAAG,EAAE,IAAIA,EAAE,IAAI;GAAE,GACzC,IAAK;IAAE,GAAG9B,EAAE,IAAI;IAAI,GAAGA,EAAE,IAAI;GAAG,GAChC,IAAK;IAAE,GAAGwI,EAAE,IAAI;IAAI,GAAGA,EAAE,IAAI;GAAG,GAChC,IAAK;IAAE,GAAG,EAAE;IAAG,GAAG,EAAE,IAAI1G,EAAE,IAAI,IAAI;GAAG;GAEvC,IAAMsH,IAAc,CAAC;IAAE,GAAG;IAAK,GAAG;KAACiI;KAAIlC;KAAI3G;IAAC;GAAE,CAAC,GACzCoG,IAAO,EAAE,QAAQ,SACjBjL,IAAImL,GAAQ9O,GAAGoJ,GAAM+E,EAASS,MAAS,CAAC;GAG9C,IAFAhB,EAAI,KAAK7B,EAAS,CAAC;IAAE,GAAG;IAAK,GAAG,CAAC/L,CAAC;GAAE,GAAG,GAAGoJ,EAAK,KAAK,OAAO;IAAE,GAAGrJ,EAAE;IAAG,GAAGA,EAAE;GAAE,EAAE,CAAC,CAAC,GAAGmL,CAAK,GACxFqD,GAASX,GAAKgB,GAAMpG,GAAG7E,GAAGgL,CAAG,GACzB,EAAE,OAAO;IACX,IAAM7N,IAAIwJ,EAAQ3L,EAAM,EAAE,KAAK,GAAGiO,CAAK;IACvC,GAAO,KAAK;KAAE,GAAGS,IAAS;MAAE,GAAGiE,EAAG,IAAIxQ,EAAE,IAAI,IAAI;MAAG,GAAGwQ,EAAG;KAAE,IAAI;MAAE,GAAGA,EAAG;MAAG,GAAGA,EAAG,IAAIxQ,EAAE,IAAI,IAAI;KAAE;KAAG,MAAMnC,EAAM,EAAE,KAAK;IAAE,CAAC;GAC3H;GACA;EACF;EACA,IAAI4S,IAAe;GAAE,OAAOX,EAAGQ,EAAK,KAAK;GAAG,MAAMA,EAAK,KAAK,KAAK,OAAO;IAAE,GAAGpR,EAAE;IAAG,GAAGA,EAAE,EAAE,IAAI4Q,CAAE;GAAE,EAAE;GAAG,OAAOQ,EAAK,SAASR,EAAGQ,EAAK,KAAK;EAAE,GAEpI,EAAE,OAAI,UAAOxR,EAAMF;EACzB,IAAK8R,KAAM,KAAK,CAAC5B,EAAUhQ,EAAMF,EAAE,CAAC,GAAG8R,CAAE,KAAOP,KAAM,KAAK,CAACrB,EAAUhQ,EAAMF,EAAE,CAAC,GAAGuR,CAAE,GAAI;GACtF,IAAItI,IAAM8I,GAAOF,EAAG,OAAOA,EAAG,IAAI;GAGlC,AAFIC,KAAM,KAAKV,GAAWU,OAAK,IAAME,EAAK/I,GAAKmI,GAAWU,IAAM,EAAI,IAChEP,KAAM,KAAKH,GAAWG,OAAK,IAAMS,EAAK/I,GAAKmI,GAAWG,IAAM,EAAK,IACjEtI,EAAI,SAAS,MAAG,IAAK;IAAE,OAAOA,EAAI;IAAI,MAAMA,EAAI,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO;KAAE,GAAG;KAAc,GAAG,CAACF,CAAC;IAAE,EAAE;IAAG,OAAO8I,EAAG;GAAM;EAC1H;EACA,IAAM3C,IAAO,EAAE,QAAQ,QACjB+C,IAAO,EAAE,QAAQ,QACjB3C,IAAMuC,EAAG,KAAKA,EAAG,KAAK,SAAS,EAAE,CAAC,EAAEA,EAAG,KAAKA,EAAG,KAAK,SAAS,EAAE,CAAC,EAAE,SAAS,IAC3EK,IAAQ9C,GAAQyC,EAAG,OAAOA,EAAG,MAAMpD,EAASS,MAAS,CAAC,GAEtDiD,IAAQN,EAAG,KAAK,IAEhBO,IAAQ1D,GADCyD,EAAM,GAAYA,EAAM,EAAE,KACdN,EAAG,KAAK,GAC7BQ,IAAYR,EAAG,OACfS,IAAK7D,EAASwD,MAAS,GACvB1C,IAAQ+C,IAAK;GAAE,GAAGT,EAAG,MAAM,IAAIO,EAAM,IAAIE;GAAI,GAAGT,EAAG,MAAM,IAAIO,EAAM,IAAIE;EAAG,IAAIT,EAAG;EACvF,IAAIS,KAAMH,EAAM,MAAM,KAAK;GACzB,IAAMR,IAAK;IAAE,GAAGQ,EAAM,EAAE,EAAE,CAAC,IAAIC,EAAM,IAAI,KAAK,IAAIE,GAAI,CAAC;IAAG,GAAGH,EAAM,EAAE,EAAE,CAAC,IAAIC,EAAM,IAAI,KAAK,IAAIE,GAAI,CAAC;GAAE,GAChGjS,IAAI,KAAK,IAAI,IAAI8R,EAAM,EAAE,EAAE,CAAC,IAAIR,EAAG,KAAKS,EAAM,KAAKD,EAAM,EAAE,EAAE,CAAC,IAAIR,EAAG,KAAKS,EAAM,CAAC;GACvF,EAAM,EAAE,KAAK;IAAE,GAAGT,EAAG,IAAIS,EAAM,IAAI/R;IAAG,GAAGsR,EAAG,IAAIS,EAAM,IAAI/R;GAAE;EAC9D;EAIA,IAHA6N,EAAI,KAAK7B,EAAS,CAAC;GAAE,GAAG;GAAK,GAAG,CAACkD,CAAK;EAAE,GAAG,GAAGsC,EAAG,KAAK,KAAK,OAAO;GAAE,GAAGxR,EAAE;GAAG,GAAGA,EAAE;EAAE,EAAE,CAAC,CAAC,GAAGmL,CAAK,GAC3F0D,MAAS,UAAQL,GAASX,GAAKgB,GAAMI,GAAK4C,GAAOjD,CAAG,GACpDgD,MAAS,UAAQpD,GAASX,GAAK+D,GAAMI,GAAWD,GAAOnD,CAAG,GAC1D,EAAE,OAAO;GACX,IAAMlG,IAAI8I,EAAG,SAASU,EAASV,EAAG,OAAOvC,CAAG;GAC5C,GAAO,KAAK;IAAE;IAAG,MAAMrQ,EAAM,EAAE,KAAK;GAAE,CAAC;EACzC;EAEA,IAAM+P,KAAQ,GAAO,GAAO,MAAiB;GAC3C,IAAM5N,IAAIwJ,EAAQ3L,EAAMuL,CAAI,GAAG0C,CAAK,GAC9B4B,IAAK,CAAC7K,EAAE,GACR8K,IAAK9K,EAAE,GACPuD,IAAM,KAAK,IAAIsH,CAAE,KAAK1N,EAAE,IAAI,IAAI,KAAK,KAAK,IAAI2N,CAAE,KAAK3N,EAAE,IAAI,IAAI;GACrE,GAAO,KAAK;IAAE,GAAG;KAAE,GAAG2H,EAAE,IAAI9E,EAAE,KAAK,KAAK7C,EAAE,IAAI,KAAK0N,IAAKtH;KAAK,GAAGuB,EAAE,IAAI9E,EAAE,KAAK,KAAK7C,EAAE,IAAI,KAAK2N,IAAKvH;IAAI;IAAG,MAAMvI,EAAMuL,CAAI;IAAG,OAAO;GAAK,CAAC;EAC3I;EAEA,AADI,EAAE,aAAWwE,EAAKM,GAAK4C,GAAO,EAAE,SAAS,GACzC,EAAE,aAAWlD,EAAKqD,GAAWD,GAAO,EAAE,SAAS;CACrD,CAAC;CAED,KAAK,IAAMtJ,KAAKuI,IAAQ;EACtB,IAAM5E,IAAI7B,EAAQ9B,EAAE,MAAMoE,GAAO,EAAI;EAErC,AADAgB,EAAI,KAAKpF,EAAE,IAAI2D,EAAE,IAAI,IAAI,GAAG3D,EAAE,IAAI2D,EAAE,IAAI,IAAI,GAAGA,EAAE,IAAI,GAAGA,EAAE,IAAI,GAAG,EAAE,MAAM3D,EAAE,GAAG,GAAG,CAAC,GAClFoF,EAAI,KAAKpF,EAAE,GAAGA,EAAE,GAAGA,EAAE,MAAM;GAAE,QAAQ;GAAU,MAAMoE;GAAO,MAAM;GAAM,OAAOpE,EAAE;EAAM,CAAC;CAC1F;CAGA,EAAE,MAAM,SAAS,GAAG,MAAM;EACxB,IAAIjG,EAAE,OAAO,QAAQ;EACrB,IAAML,IAAI0O,EAAG3O,EAAI,MAAMlC,EAAE;EACzB,EAAS6N,GAAKrL,GAAGgH,EAAMxJ,IAAImC,EAAE,GAAGA,EAAE,CAAC;CACrC,CAAC;CAED,KAAK,IAAMpB,KAAKqQ,IAAQ;EACtB,IAAMhF,IAAI7B,EAAQxJ,EAAE,MAAM8L,CAAK;EAE/B,AADK9L,EAAE,SAAO8M,EAAI,KAAK9M,EAAE,EAAE,IAAIqL,EAAE,IAAI,IAAI,GAAGrL,EAAE,EAAE,IAAIqL,EAAE,IAAI,IAAI,GAAGA,EAAE,IAAI,GAAGA,EAAE,IAAI,GAAG;GAAE,MAAMlB,EAAM;GAAO,SAAS;EAAK,GAAG,CAAC,GAC1H2C,EAAI,KAAK9M,EAAE,EAAE,GAAGA,EAAE,EAAE,GAAGA,EAAE,MAAM;GAAE,QAAQ;GAAU,MAAM8L;GAAO,OAAO9L,EAAE,SAASmK,EAAM;EAAI,CAAC;CAC/F;CAKA,OAJI1K,EAAE,UACJ,IAAI,KAAK,IAAI+B,GAAGyH,EAAUxJ,EAAE,OAAO,IAAI,EAAI,IAAI,EAAU,GACzDqN,EAAI,KAAKtL,IAAI,GAAG,IAAsB/B,EAAE,OAAO;EAAE,QAAQ;EAAU,MAAM;EAAI,MAAM;CAAK,CAAC,IAEpF;EAAE,KAAKqN,EAAI,SAAStL,GAAG,CAAC;EAAG,GAAG,KAAK,KAAKA,CAAC;EAAG,GAAG,KAAK,KAAK,CAAC;CAAE;AACrE;AAEA,IAAM2P,KAAY,GAAO,OAAe;CAAE,IAAIpQ,EAAE,IAAIC,EAAE,KAAK;CAAG,IAAID,EAAE,IAAIC,EAAE,KAAK;AAAE,IAG3EqO,qBAAS,IAAI,IAAW;CAAC;CAAQ;CAAS;CAAc;CAAa;CAAQ;CAAU;CAAS;CAAY;CAAW;AAAO,CAAC;AAGrI,SAASsB,GAAO,GAAW,GAAmB;CAC5C,IAAMxP,IAAM,CAACgN,CAAK,GACdtE,IAAMsE;CACV,KAAK,IAAMjP,KAAKoJ,GAAM;EACpB,IAAIpJ,EAAE,MAAM,KAAK,EAAI,KAAKA,EAAE,EAAE,EAAE;OAC3B;GACH,IAAM,CAACqR,GAAIlC,GAAI/C,KAAKpM,EAAE;GACtB,KAAK,IAAID,IAAI,GAAGA,KAAK,IAAI,KAAK;IAC5B,IAAMyI,IAAIzI,IAAI,IACR+F,IAAI,IAAI0C;IACd,EAAI,KAAK;KACP,GAAG1C,IAAIA,IAAIA,IAAI6E,EAAI,IAAI,IAAI7E,IAAIA,IAAI0C,IAAI6I,EAAG,IAAI,IAAIvL,IAAI0C,IAAIA,IAAI2G,EAAG,IAAI3G,IAAIA,IAAIA,IAAI4D,EAAE;KACnF,GAAGtG,IAAIA,IAAIA,IAAI6E,EAAI,IAAI,IAAI7E,IAAIA,IAAI0C,IAAI6I,EAAG,IAAI,IAAIvL,IAAI0C,IAAIA,IAAI2G,EAAG,IAAI3G,IAAIA,IAAIA,IAAI4D,EAAE;IACrF,CAAC;GACH;EACF;EACA,IAAMnK,EAAIA,EAAI,SAAS;CACzB;CACA,OAAOA;AACT;AAGA,SAASyP,EAAK,GAAW,GAAmD,GAAwB;CAClG,IAAMQ,KAAU,MAAUzJ,EAAE,IAAI3G,EAAE,KAAK2G,EAAE,IAAI3G,EAAE,IAAIA,EAAE,KAAK2G,EAAE,IAAI3G,EAAE,KAAK2G,EAAE,IAAI3G,EAAE,IAAIA,EAAE,GAC/EqQ,IAAOC,IAAUzJ,IAAM,CAAC,GAAGA,CAAG,CAAC,CAAC,QAAQ,GACxC5I,IAAIoS,EAAK,WAAW,MAAM,CAACD,EAAOzJ,CAAC,CAAC;CAC1C,IAAI1I,KAAK,GAAG,OAAO4I;CACnB,IAAM9G,IAAIsQ,EAAKpS,IAAI,IACbiR,IAAImB,EAAKpS,IAEXyI,IAAI,GACF6F,IAAK2C,EAAE,IAAInP,EAAE,GACbyM,IAAK0C,EAAE,IAAInP,EAAE;CAInB,AAHIwM,IAAK,MAAG,IAAI,KAAK,IAAI7F,IAAI1G,EAAE,IAAIA,EAAE,IAAID,EAAE,KAAKwM,CAAE,IAC9CA,IAAK,MAAG,IAAI,KAAK,IAAI7F,IAAI1G,EAAE,IAAID,EAAE,KAAKwM,CAAE,IACxCC,IAAK,MAAG,IAAI,KAAK,IAAI9F,IAAI1G,EAAE,IAAIA,EAAE,IAAID,EAAE,KAAKyM,CAAE,IAC9CA,IAAK,MAAG,IAAI,KAAK,IAAI9F,IAAI1G,EAAE,IAAID,EAAE,KAAKyM,CAAE;CAC5C,IAAMrM,IAAM,CAAC;EAAE,GAAGJ,EAAE,IAAIwM,IAAK7F;EAAG,GAAG3G,EAAE,IAAIyM,IAAK9F;CAAE,GAAG,GAAG2J,EAAK,MAAMpS,CAAC,CAAC;CACnE,OAAOqS,IAAUnQ,IAAMA,EAAI,QAAQ;AACrC;;ACtzBA,SAAgBoQ,EAAuB,GAAa;CAClD,OAAO,OAAO,OAAO,OAAO,OAAO,IAAI,GAAQC,CAAK;AACtD;;ACAA,SAASC,EAAS,GAAoB;CACpC,IAAMtQ,IAAa,CAAC,GACd,IAAIuQ,EAAI,QACV9S,IAAI,GACJ+S,IAAY;CAChB,OAAO/S,IAAI,IAAG;EACZ,IAAMwC,IAAIsQ,EAAI9S;EACd,IAAIwC,MAAM,MAAM;GAEd,AADA,IAAY,IACZ;GACA;EACF;EACA,IAAIA,MAAM,OAAOA,MAAM,OAAQA,MAAM,QAAQA,MAAM,KAAK;GACtD;GACA;EACF;EAMA,IALIuQ,KAAavQ,MAAM,QAIvB,IAAY,IACRA,MAAM,OAAOsQ,EAAI9S,IAAI,OAAO,MAAK;GACnC,OAAOA,IAAI,KAAK8S,EAAI9S,OAAO,OAAM;GACjC;EACF;EACA,IAAIwC,MAAM,OAAOsQ,EAAI9S,IAAI,OAAO,KAAK;GACnC,IAAM0M,IAAIoG,EAAI,QAAQ,MAAM9S,IAAI,CAAC;GACjC,IAAI0M,IAAI,IAAI,IAAIA,IAAI;GACpB;EACF;EACA,IAAIlK,MAAM,MAAK;GACb,IAAI/B,IAAI;GAER,KADA,KACOT,IAAI,KAAK8S,EAAI9S,OAAO,OACzB,AAAI8S,EAAI9S,OAAO,QAAQ8S,EAAI9S,IAAI,OAAO,QACpC,KAAK,MACL,KAAK,KACI8S,EAAI9S,OAAO,QAAQ8S,EAAI9S,IAAI,OAAO,OAAM,KAAK,IACnD,KAAK8S,EAAI;GAEhB;GAEA,IAAME,IAAOzQ,EAAIA,EAAI,SAAS,IACxB0Q,IAAO1Q,EAAIA,EAAI,SAAS;GAC9B,AAAIyQ,GAAM,MAAM,OAAOA,EAAK,MAAM,OAAOC,GAAM,MAAM,SACnD1Q,EAAI,IAAI,GACR,EAAK,KAAK9B,KACL8B,EAAI,KAAK;IAAE,GAAG;IAAO;GAAE,CAAC;GAC/B;EACF;EACA,IAAIC,MAAM,KAAK;GACb,IAAI2O,IAAQ,GACN7Q,IAAIN;GACV,OAAOA,IAAI,GAAG,KACZ,IAAI8S,EAAI9S,OAAO,KAAK;QACf,IAAI8S,EAAI9S,OAAO,OAAO,EAAEmR,MAAU,GAAG;GAG5C,AADA5O,EAAI,KAAK;IAAE,GAAG;IAAQ,GAAGuQ,EAAI,MAAMxS,IAAI,GAAGN,CAAC;GAAE,CAAC,GAC9C;GACA;EACF;EACA,IAAIwC,MAAM,QAAQsQ,EAAI9S,IAAI,OAAO,OAAO8S,EAAI9S,IAAI,OAAO,MAAM;GAE3D,AADAuC,EAAI,KAAK;IAAE,GAAG;IAAK,GAAGuQ,EAAI,MAAM9S,GAAGA,IAAI,CAAC;GAAE,CAAC,GAC3C,KAAK;GACL;EACF;EACA,IAAI,YAAY,SAASwC,CAAC,GAAG;GAE3B,AADAD,EAAI,KAAK;IAAE,GAAG;IAAK,GAAGC;GAAE,CAAC,GACzB;GACA;EACF;EACA,IAAMiK,IAAI,8DAA8D,KAAKqG,EAAI,MAAM9S,GAAGA,IAAI,GAAG,CAAC;EAClG,AAAKyM,KAILlK,EAAI,KAAK;GAAE,GAAG;GAAM,GAAGkK,EAAE;EAAG,CAAC,GAC7B,KAAKA,EAAE,EAAE,CAAC,UAJR;CAKJ;CACA,OAAOlK;AACT;AAUA,IAAM2Q,KAAgCP,EAAK;CACzC,KAAK;CAAQ,MAAM;CAAQ,WAAW;CAAQ,QAAQ;CAAQ,SAAS;CAAQ,SAAS;CAAW,MAAM;CAAW,KAAK;CAAW,QAAQ;CAC5I,cAAc;CAAgB,OAAO;CAAS,WAAW;CAAQ,OAAO;CAAQ,MAAM;CAAQ,WAAW;CAAQ,SAAS;CAAW,UAAU;CAC/I,SAAS;CAAW,SAAS;CAAW,eAAe;CAAW,eAAe;CAAW,UAAU;CAAY,aAAa;CAAY,eAAe;CAC1J,WAAW;CAAU,cAAc;CAAU,OAAO;CAAU,UAAU;CAAU,UAAU;CAAY,MAAM;CAAQ,KAAK;CAAU,QAAQ;CAAU,OAAO;CAC9J,WAAW;CAAa,KAAK;CAAQ,QAAQ;CAAQ,QAAQ;CAAQ,WAAW;CAAQ,WAAW;CAAQ,MAAM;CAAU,QAAQ;CAAQ,SAAS;CAAS,cAAc;AAC7K,CAAC,GAEKQ,IAA+BR,EAAK;CACxC,QAAQ;CAAS,KAAK;CAAS,OAAO;CAAY,SAAS;CAAY,UAAU;CAAY,MAAM;CAAY,KAAK;CAAQ,MAAM;CAAQ,UAAU;CACpJ,SAAS;CAAW,UAAU;CAAY,UAAU;CAAY,KAAK;CAAW,MAAM;CAAY,KAAK;CAAU,MAAM;CAAW,QAAQ;CAAU,SAAS;CAC7J,MAAM;CAAQ,MAAM;CAAQ,KAAK;CAAO,OAAO;CAAQ,QAAQ;AACjE,CAAC;AAED,SAASS,EAAM,GAAuB,GAAkB;CACtD,IAAI,CAAC3S,GAAG,OAAO4S;CACf,IAAMhT,IAAII,EAAE,YAAY,CAAC,CAAC,QAAQ,kBAAkB,EAAE;CACtD,OAAO0S,EAAO9S,MAAM8S,EAAO9S,EAAE,QAAQ,MAAM,EAAE,MAAMgT;AACrD;AAGA,SAASC,EAAS,GAA2C;CAC3D,IAAI,CAAC7S,GAAG;CACR,IAAM0R,IAAQ1R,EAAE,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,GAChC8S,IAAM,uCAAuC,KAAKpB,CAAK;CAC7D,IAAIoB,GAAK;EACP,IAAM,CAAClQ,GAAG/C,GAAG8B,KAAK;GAAC,OAAOmR,EAAI,EAAE;GAAG,OAAOA,EAAI,EAAE;GAAG,OAAOA,EAAI,EAAE;EAAC,GAC3DrP,KAAK,MAAc;GACvB,IAAMoD,KAAKjH,IAAIgD,IAAI,KAAK;GACxB,OAAO,KAAK,OAAOjB,IAAIA,IAAI9B,IAAI,KAAK,IAAI,GAAG,KAAK,IAAIgH,GAAG,IAAIA,GAAG,CAAC,CAAC,KAAK,GAAG;EAC1E;EACA,OAAO,MAAM;GAACpD,EAAE,CAAC;GAAGA,EAAE,CAAC;GAAGA,EAAE,CAAC;EAAC,CAAC,CAAC,KAAK,MAAMoD,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;CACrF;CACA,IAAMkF,IAAO2F,EAAM,QAAQ,YAAY,EAAE,CAAC,CAAC,YAAY,GAEjDtR,IAAI,qBAAqB,KAAK2L,CAAI;CACxC,IAAI3L,GAAG;EACL,IAAMyG,IAAI,KAAK,MAAO,KAAK,IAAI,KAAK,OAAOzG,EAAE,EAAE,CAAC,IAAI,MAAO,GAAG,CAAC,CAC5D,SAAS,EAAE,CAAC,CACZ,SAAS,GAAG,GAAG;EAClB,OAAO,IAAIyG,IAAIA,IAAIA;CACrB;CACA,OAAOgE,EAAM,cAAc,KAAKkB,CAAI,IAAIA,EAAK,QAAQ,QAAQ,EAAE,IAAIA,CAAI;AACzE;AAEA,SAASgH,GAAU,GAAmB;CACpC,OAAOjH,EACL9L,EACG,QAAQ,gBAAgB,IAAI,CAAC,CAC7B,QAAQ,YAAY,IAAI,CAAC,CACzB,QAAQ,kBAAkB,OAAO,CAAC,CAClC,QAAQ,YAAY,EAAE,CAAC,CACvB,QAAQ,YAAY,IAAI,CAC7B,CAAC,CACE,MAAM,IAAI,CAAC,CACX,KAAK,MAAMW,EAAE,KAAK,CAAC,CAAC,CACpB,OAAO,OAAO,CAAC,CACf,KAAK,IAAI;AACd;AAGA,SAASqS,EAAW,GAAW,GAAY,IAAQ,IAAY;CAC7D,OAAOhT,EACJ,QAAQ,YAAY,IAAI,CAAC,CACzB,QAAQ,QAAQqM,CAAE,CAAC,CACnB,QAAQ,QAAQ4G,CAAK,CAAC,CACtB,QAAQ,UAAU,IAAI,CAAC,CACvB,QAAQ,OAAO,EAAE;AACtB;AAGA,SAASC,GAAW,GAAW,GAAsB;CACnD,OAAOF,EAAWhT,GAAGqM,CAAE,CAAC,CACrB,QAAQ,YAAY,EAAE,CAAC,CACvB,MAAM,OAAO,CAAC,CACd,KAAK,MAAMxF,EAAE,KAAK,CAAC,CAAC,CACpB,OAAO,OAAO;AACnB;AAEA,SAAgBsM,GAAS,GAAsB;CAC7C,IAAMC,IAAOhB,EAASC,CAAG,GACrB/J,IAAI,GACF+K,KAAQ,IAAI,MAAMD,EAAK9K,IAAI1I,IAC3B0T,KAAO,GAAW,IAAI,MAAMD,EAAKzT,CAAC,CAAC,EAAE,MAAM,OAAOyT,EAAKzT,CAAC,CAAC,CAAC,MAAMI,GAChEuT,KAAO,MACPD,EAAItT,CAAC,KACP,KACO,MAEF,IAEHwT,KAAM,MAAcH,EAAK,CAAC,EAAE,MAAM,QAAQA,EAAK,CAAC,CAAC,EAAE,YAAY,MAAMrT,GACrEyT,IAAkB,CAAC;CACzB,OAAOnL,IAAI8K,EAAK,SAAQ;EAEtB,IADII,EAAG,QAAQ,KAAG,KACd,CAACA,EAAG,OAAO,KAAK,CAACA,EAAG,SAAS,GAAG;GAClC;GACA;EACF;EACA,IAAME,IAAWL,EAAK,CAAC,CAAC,EAAE,YAAY,MAAM;EAC5C;EACA,IAAMtH,IAAOsH,EAAK,CAAC,EAAE,MAAM,MAAoB,KAAdD,EAAK,IAAI,CAAC;EAC3C,IAAI,CAACG,EAAI,GAAG,GAAG,MAAM,IAAI5U,EAAa,6CAA6C;EACnF,IAAMgD,IAAI,IAAIwK,EAAa,MAAM,SAAS,GACpCwH,oBAAY,IAAI,IAAoC,GACpDlU,IAAuD,CAAC,GACxD2Q,IAAmB,CAAC,GACtBwD,IAAO,GACLC,IAAqC,CAAC,GACtCC,oBAAe,IAAI,IAAoC,GAEvDC,UAAyC;GAC7C,IAAMrS,IAA4B,CAAC;GACnC,OAAO6R,EAAI,GAAG,IAAG;IACf,OAAOjL,IAAI8K,EAAK,UAAU,CAACE,EAAI,GAAG,IAAG;KACnC,IAAM1T,IAAIwT,EAAK;KACf,IAAIxT,EAAE,MAAM,KACZ;UAAI2T,EAAI,GAAG,GAAG;OACZ,IAAMvT,IAAIoT,EAAK;OACf,AAAIpT,MAAG,EAAEJ,EAAE,EAAE,YAAY,KAAKI,EAAE,MAAM,SAAS,MAAMA,EAAE,IAAI,MAAMA,EAAE;MACrE,OAAO,EAAEJ,EAAE,EAAE,YAAY,KAAK;KAAA;IAChC;IACA,EAAI,GAAG;GACT;GACA,OAAO8B;EACT,GACMsS,KAAW,MAAyB;GACxC,IAAM3H,IAAK+G,EAAK,IAAI,CAAC;GAErB,OAAOE,EAAI,GAAG,IAAG,KAAK;GAMtB,OALKK,EAAU,IAAItH,CAAE,IAGV4H,EAAM,WAAWtS,EAAE,IAAI0K,CAAE,KAAK1K,EAAE,IAAI0K,CAAE,CAAC,CAAE,YAAY,KAAA,MAAW,EAAE,IAAIA,CAAE,CAAC,CAAE,UAAU4H,EAAM,YAFpGN,EAAU,IAAItH,GAAI,EAAE,GAAG4H,EAAM,KAAK,CAAC,GACnCtS,EAAE,KAAK0K,GAAI,CAAC,GAAG4H,EAAM,OAAO,IAE9BA,EAAM,QAAQ,IAAI5H,CAAE,GACbA;EACT,GACM6H,KAAS,MAAiB;GAC9B,OAAO5L,IAAI8K,EAAK,UAAU,CAACE,EAAI,GAAG,IAAG;IACnC,IAAIC,EAAI,GAAG,KAAKA,EAAI,GAAG,GAAG;IAC1B,IAAMlL,IAAIgL,EAAK;IACf,IAAIhL,EAAE,MAAM,QAAQ;KAAC;KAAS;KAAQ;IAAM,CAAC,CAAC,SAASA,EAAE,EAAE,YAAY,CAAC,KAAKiL,EAAI,KAAK,CAAC,GAAG;KACxF;KACA,IAAM5R,IAAIqS,EAAS,GACbI,IAAQ9L,EAAE,EAAE,YAAY;KAC9B,AAAI8L,MAAU,SAAQ,OAAO,OAAOF,EAAM,MAAMvS,CAAC,IACxCyS,MAAU,SAAQ,OAAO,OAAOF,EAAM,MAAMvS,CAAC,IACjD0S,EAASH,GAAOvS,CAAC;KACtB;IACF;IACA,IAAI2G,EAAE,MAAM,OAAOiL,EAAI,KAAK,CAAC,GAAG;KAC9B,IAAM1T,IAAIyI,EAAE,EAAE,YAAY;KAC1B,KAAK;KACL,IAAMrI,IAAIoT,EAAK;KACf,EAASa,GAAO,GAAGrU,IAAII,IAAKA,EAAE,MAAM,SAAS,MAAMA,EAAE,IAAI,MAAMA,EAAE,IAAK,GAAG,CAAC;KAC1E;IACF;IAEA,IAAMqU,IAAmB,CAAC;IAC1B,SAAS;KACP,IAAIb,EAAG,UAAU,KAAKF,EAAI,GAAG,GAAG,EAAK,KAAK,CAAC,GAAGgB,EAASL,CAAK,CAAC,CAAC;UACzD,IAAIZ,EAAK,KAAKA,EAAK,CAAC,CAAC,MAAM,KAAK,EAAK,KAAK,CAACW,EAAQC,CAAK,CAAC,CAAC;UAC1D;MACH;MACA;KACF;KACA,IAAIX,EAAI,IAAI,KAAKA,EAAI,IAAI,GAAG;UACvB;IACP;IACA,IAAM5R,IAAIqS,EAAS;IACnB,IAAIM,EAAK,WAAW,GAAG;KACrB,KAAK,IAAMhI,KAAMgI,EAAK,IAAI,AAAI,OAAO,KAAK3S,CAAC,CAAC,CAAC,UAAUiS,EAAU,IAAItH,CAAE,KAAG,OAAO,OAAOsH,EAAU,IAAItH,CAAE,GAAI3K,CAAC;KAC7G;IACF;IACA,IAAMgK,IAAQ;KAAE,GAAGuI,EAAM;KAAM,GAAGvS;IAAE;IACpC,KAAK,IAAI9B,IAAI,GAAGA,IAAI,IAAIyU,EAAK,QAAQ,KAAK,KAAK,IAAME,KAAQF,EAAKzU,IAAI,KAAK,IAAM4U,KAAMH,EAAKzU,IAAI,IAAI,EAAM,KAAK;KAAE,GAAG;MAAE;MAAM;KAAG;KAAG;IAAM,CAAC;GAC3I;EACF,GACMwU,KAAY,GAAc,MAA8B;GAG5D,AAFIH,EAAM,UAAS,OAAO,OAAOH,EAAa,IAAIG,EAAM,OAAO,GAAIvS,CAAC,IAC1DuS,EAAM,QAAM,OAAO,OAAOJ,GAAYnS,CAAC,GAC7CA,EAAE,QAAQuS,EAAM,SAAS,KAAA,MAAW,EAAqC,OAAOvS,EAAE;EACxF,GACM4S,KAAY,MAA+B;GAC/C,IAAIG;GACJ,AAAIjB,EAAG,UAAU,MACf,KACIH,EAAK,KAAKA,EAAK,CAAC,CAAC,MAAM,QAAK,IAAQD,EAAK,IAAI,CAAC;GAEpD,IAAMsB,IAAY,CAAC,CAACD,KAAS,YAAY,KAAKA,CAAK,GAC7CR,IAAmC;IAAE,MAAM,EAAE,GAAGU,EAAO,KAAK;IAAG,MAAM,EAAE,GAAGA,EAAO,KAAK;IAAG,SAASA,EAAO;IAAS,yBAAS,IAAI,IAAI;IAAG,MAAMF,KAAS,SAAS;GAAS;GAC7K,IAAIC,GAAW;IACb,IAAME,IAAM,GAAGH;IAGf,AAFA9S,EAAE,QAAQiT,GAAK,IAAID,EAAO,OAAO,GACjCb,EAAa,IAAIc,GAAK,CAAC,CAAC,GACxB,EAAM,UAAUA;GAClB;GAKA,AAJIrB,EAAI,GAAG,MACTW,EAAMD,CAAK,GACXV,EAAI,GAAG,IAELU,EAAM,QAAQ,+BAA+B,KAAKA,EAAM,IAAI,KAAKA,EAAM,QAAQ,OAAO,KAAG7D,EAAK,KAAK,CAAC,GAAG6D,EAAM,OAAO,CAAC;GACzH,KAAK,IAAMjI,KAAKiI,EAAM,SAAS,EAAO,QAAQ,IAAIjI,CAAC;GACnD,OAAOiI,EAAM;EACf;EAGA,AADAC,EAAM;GADgB,MAAM,CAAC;GAAG,MAAM,CAAC;GAAG,yBAAS,IAAI,IAAI;EACrD,CAAI,GACVX,EAAI,GAAG;EAGP,IAAMnL,IAAY;GAAE,IAAI;GAAM,IAAI;GAAM,IAAI;GAAM,IAAI;EAAK,GAA2ByL,EAAW,WAAW,KAAA,CAAM,YAAY,MAAM;EAEpI,AADA,EAAE,EAAE,MAAMzL,GACNyL,EAAW,UAAO,EAAE,EAAE,QAAQA,EAAW,MAAM,WAAW,GAAG,IAAId,GAAUc,EAAW,MAAM,MAAM,GAAG,EAAE,CAAC,IAAIb,EAAWa,EAAW,OAAO,IAAI9H,CAAI;EACrJ,KAAK,IAAM3J,KAAKT,EAAE,EAAE,OAAO,GAAUS,GAAGuR,EAAU,IAAIvR,EAAE,EAAE,KAAK,CAAC,CAAC;EACjE,KAAK,IAAML,KAAKJ,EAAE,EAAE,UAAU;GAC5B,IAAMD,IAAIoS,EAAa,IAAI/R,EAAE,EAAE,KAAK,CAAC;GACrC,EAAE,QAAQL,EAAE,QAASA,EAAE,MAAM,WAAW,GAAG,IAAIqR,GAAUrR,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC,IAAIsR,EAAWtR,EAAE,OAAO,IAAIK,EAAE,EAAE,IAAK;GAClH,IAAMgP,IAAgB,CAAC,GACjB8D,KAASnT,EAAE,SAAS,GAAA,CAAI,YAAY;GAQ1C,AAPImT,EAAM,SAAS,QAAQ,IAAG,EAAG,OAAOhC,EAASnR,EAAE,aAAaA,EAAE,SAASA,EAAE,OAAO,KAAK,YAChFA,EAAE,YAAS,EAAG,OAAOmR,EAASnR,EAAE,OAAO,KAC5CA,EAAE,SAASA,EAAE,cAAU,EAAG,SAASmR,EAASnR,EAAE,YAAYA,EAAE,KAAK,IACjEmT,EAAM,SAAS,QAAQ,MAAG,EAAG,OAAO,QACpCA,EAAM,SAAS,QAAQ,MAAG,EAAG,OAAO,QACpCnT,EAAE,cAAW,EAAG,QAAQmR,EAASnR,EAAE,SAAS,IAC5CmT,EAAM,SAAS,OAAO,MAAG,EAAG,SAAS,EAAG,OAAO,SACnD,EAAE,QAAQ9D;EACZ;EACA,KAAK,IAAM,EAAE,MAAG,cAAWtR,GAAO,EAAE,EAAE,MAAM,KAAKqV,GAAU7I,GAAGP,GAAOgI,CAAQ,CAAC;EAE9E,AADA,EAAE,EAAE,WAAWtD,GACfqD,EAAO,KAAK9R,EAAE,CAAC;CACjB;CACA,IAAI,CAAC8R,EAAO,QAAQ,MAAM,IAAI9U,EAAa,+BAA+B;CAC1E,OAAO8U;AACT;AAEA,SAASsB,GAAU,GAAU,GAA2B;CACtD,IAAMC,KAAatT,EAAE,SAAS,UAAA,CAAW,YAAY;CACrD,EAAE,QAAQ+Q,GAAOuC,MAAc;CAC/B,IAAM5R,IAAM1B,EAAE;CACd,IAAI0B,MAAQ,KAAA,GAAW;EACrB,IAAIA,EAAI,WAAW,GAAG,KAAKA,EAAI,SAAS,GAAG,GAAG,EAAE,QAAQ2P,GAAU3P,EAAI,MAAM,GAAG,EAAE,CAAC;OAC7E,IAAI4R,MAAc,YAAYA,MAAc,WAAW;GAC1D,IAAMC,IAAO/B,GAAW9P,GAAKhB,EAAE,EAAE;GAEjC,AADA,EAAE,QAAQ6S,EAAK,KAAK,IAAI,GACpBA,EAAK,SAAS,MAAG,EAAE,WAAWA,EAAK,KAAK,OAAO;IAAE,MAAM,CAAC,CAAC3T,CAAC,CAAC;IAAG,QAAQ;GAAK,EAAa;EAC9F,OAAO,EAAE,QAAQ0R,EAAW5P,GAAKhB,EAAE,EAAE;CACvC;CACA,AAAIA,EAAE,UAAU,YAAS,EAAE,QAAQ;CACnC,IAAM2O,IAAgB,CAAC,GACjB8D,KAASnT,EAAE,SAAS,GAAA,CAAI,YAAY;CAa1C,AAZImT,EAAM,SAAS,QAAQ,KAAKnT,EAAE,YAAW,EAAG,OAAOmR,EAASnR,EAAE,aAAaA,EAAE,KAAK,KAAK,YAClFU,EAAE,UAAU,YAAS,EAAG,OAAO,YACxC,AACK2O,EAAG,SADJrP,EAAE,QAAmBmR,EAASnR,EAAE,KAAK,IACxB,WACbA,EAAE,cAAW,EAAG,QAAQmR,EAASnR,EAAE,SAAS,IAC5CmT,EAAM,SAAS,QAAQ,MAAG,EAAG,OAAO,QACpCA,EAAM,SAAS,QAAQ,MAAG,EAAG,OAAO,QACpCA,EAAM,SAAS,MAAM,MAAG,EAAG,KAAK,MAChCnT,EAAE,aAAU,EAAG,KAAK,KAAK,IAAI,GAAG,OAAOA,EAAE,QAAQ,KAAK,CAAC,IACvDmT,EAAM,SAAS,OAAO,MAAG,EAAG,SAAS,KACrCA,EAAM,SAAS,SAAS,KAAKzS,EAAE,UAAU,WAAQ,EAAE,QAAQ,UAC3DA,EAAE,UAAU,WAAQ,EAAG,OAAO,KAAA,IAClC,EAAE,QAAQ2O;AACZ;AAEA,SAAS+D,GAAU,GAAU,GAA2B,GAA0B;CAChF,IAAMD,KAASnT,EAAE,SAAS,GAAA,CAAI,YAAY,GACpC0G,KAAO1G,EAAE,QAAQgS,IAAW,YAAY,QAAA,CAAS,YAAY,GAC7DjF,IAAOkE,EAAMjR,EAAE,WAAW,OAAO,GACjC8P,IAAOmB,EAAMjR,EAAE,WAAW,OAAO;CAEvC,AADA,EAAE,OAAO0G,MAAQ,aAAaA,MAAQ,SAASqG,IAAO,QACtD,EAAE,OAAOrG,MAAQ,UAAUA,MAAQ,SAASoJ,IAAO;CACnD,IAAMpO,IAAM1B,EAAE,SAASA,EAAE;CAQzB,OAPI0B,MAAK,EAAE,QAAQA,EAAI,WAAW,GAAG,KAAKA,EAAI,SAAS,GAAG,IAAI2P,GAAU3P,EAAI,MAAM,GAAG,EAAE,CAAC,IAAI4P,EAAW5P,GAAK,EAAE,IAC1G1B,EAAE,cAAW,EAAE,YAAYsR,EAAWtR,EAAE,WAAW,EAAE,IACrDA,EAAE,cAAW,EAAE,YAAYsR,EAAWtR,EAAE,WAAW,EAAE,IACzD,EAAE,OAAOmT,EAAM,SAAS,OAAO,IAAI,WAAWA,EAAM,SAAS,QAAQ,IAAI,WAAWA,EAAM,SAAS,QAAQ,IAAI,WAAWA,EAAM,SAAS,MAAM,IAAI,UAAU,SAC7J,EAAE,QAAQhC,EAASnR,EAAE,KAAK,KAAK,WAC3BA,EAAE,aAAU,EAAE,KAAK,KAAK,IAAI,GAAG,OAAOA,EAAE,QAAQ,KAAK,CAAC,IACtDA,EAAE,WAAQ,EAAE,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,OAAOA,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAC5E;AACT;;AC3XA,IAAM9C,IAAS,IACTC,KAAM,MAAc,KAAK,MAAMmB,IAAI,GAAG,IAAI;AAUhD,SAAgBoV,GAAU,GAAkB;CAC1C,IAAMC,IAAS/M,EAAE,OAAO,QAAQ,MAAMzI,EAAE,QAAQ,KAAK,OAAO,SAASA,EAAE,KAAK,CAAC;CAC7E,IAAI,CAACwV,EAAO,QAAQ,MAAU,MAAM,6BAA6B;CACjE,IAAMhQ,IAAQgQ,EAAO,QAAQ,GAAG,MAAM3T,IAAI7B,EAAE,OAAO,CAAC,GAE9C4N,IAAM,IAAIzC,EAAI,GAGdI,IAAKxM,KAFI0J,EAAE,QAAQ,KAAK,KAED,KACvBuC,KAAS,MAAcC,EAAM,OAAOlL,IAAIkL,EAAM,OAAO,SACvDwK,IAAK,CAAC,KAAK,KAAK,GACd/R,KAAM,GAAW,OAAmB;EAAE,GAAG,MAAK,KAAK,IAAI7B,CAAC,IAAIJ;EAAG,GAAG8J,IAAK,KAAK,IAAI1J,CAAC,IAAIJ;CAAE;CAC7F,EAAO,SAAS,GAAG,MAAM;EACvB,IAAMiU,IAAO1V,EAAE,QAAQwF,GACjBmQ,IAAKF,IAAKC,IAAO,IAAI,KAAK;EAChC,IAAIA,KAAQ,OAAQ,EAAI,OAAO,KAAInK,GAAI,KAAG;GAAE,MAAMP,EAAMjL,CAAC;GAAG,QAAQ;GAAW,IAAI;EAAE,CAAC;OACjF;GACH,IAAM6V,IAAKlS,EAAG+R,GAAI,GAAC,GACbI,IAAKnS,EAAGiS,GAAI,GAAC;GACnB,EAAI,KAAK,IAAI3W,EAAG,GAAE,EAAE,GAAGA,EAAGuM,CAAE,EAAE,IAAIvM,EAAG4W,EAAG,CAAC,EAAE,GAAG5W,EAAG4W,EAAG,CAAC,EAAE,cAAgB,MAAO,IAAY,KAAK5W,EAAG6W,EAAG,CAAC,EAAE,GAAG7W,EAAG6W,EAAG,CAAC,EAAE,KAAK;IAAE,MAAM7K,EAAMjL,CAAC;IAAG,QAAQ;IAAW,IAAI;GAAE,CAAC;EACvK;EACA,IAAI2V,KAAQ,KAAM;GAChB,IAAMvJ,IAAIzI,GAAI+R,IAAKE,KAAM,GAAG,IAAQ;GACpC,EAAI,KAAKxJ,EAAE,GAAGA,EAAE,GAAG,GAAG,KAAK,MAAMuJ,IAAO,GAAI,IAAI,GAAG,IAAI;IAAE,QAAQ;IAAU,MAAM;IAAI,MAAM;IAAM,OAAO;GAAU,CAAC;EACrH;EACA,IAAKC;CACP,CAAC;CAED,IAEMG,IAAKvK,IAAMiK,EAAO,SAAS,KAAM,IAAI,IACvCO,IAAK;CACT,EAAO,SAAS,GAAG,MAAM;EACvB,IAAM7L,IAAOzB,EAAE,WAAW,GAAGzI,EAAE,MAAM,IAAIgW,GAAIhW,EAAE,KAAK,EAAE,KAAKA,EAAE;EAG7D,AAFA4N,EAAI,KAAK,KAAIkI,IAAK/V,IAAI,KAAK,GAAG,IAAI,IAAI,EAAE,MAAMiL,EAAMjL,CAAC,EAAE,GAAG,CAAC,GAC3D6N,EAAI,KAAK,KAASkI,IAAK/V,IAAI,IAAImK,CAAI,GACnC,IAAK,KAAK,IAAI6L,GAAIhM,EAAUG,GAAM,EAAE,CAAC;CACvC,CAAC;CACD,IAAI5H,IAAI,MAAUyT,IAAKhX,GACjByD,IAAI,KAAK,IAAI+I,IAAK,KAAGuK,IAAKN,EAAO,SAAS,EAAE,IAAIzW;CAKtD,OAJI0J,EAAE,UACJ,IAAI,KAAK,IAAInG,GAAGyH,EAAUtB,EAAE,OAAO,IAAI,EAAI,IAAI,EAAU,GACzDmF,EAAI,KAAKtL,IAAI,GAAG,IAAamG,EAAE,OAAO;EAAE,QAAQ;EAAU,MAAM;EAAI,MAAM;CAAK,CAAC,IAE3E;EAAE,KAAKmF,EAAI,SAAStL,GAAGE,CAAC;EAAG,GAAG,KAAK,KAAKF,CAAC;EAAG,GAAG,KAAK,KAAKE,CAAC;CAAE;AACrE;AAEA,IAAMwT,MAAO,MAAqC,OAAtB,OAAO,UAAU7V,CAAC,IAAWA,IAAY,KAAK,MAAMA,IAAI,GAAG,IAAI,GAAG,GAmBxF8V,IAAO,MACPC,IAAM,KAAKD,GAEXE,MAAQ,MAAc,OAAOhW,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;AAErD,SAAgBiW,GAAY,GAAoB;CAC9C,IAAMC,IAAQ9V,EAAE,SAAS,SAAS,MAAMP,EAAE,KAAK;CAC/C,IAAI,CAACqW,EAAM,QAAQ,MAAU,MAAM,8BAA8B;CACjE,IAAMC,IAAK,KAAK,IAAI,GAAGD,EAAM,KAAK,MAAM7N,EAAE,KAAK,CAAC,GAC1C+N,IAAK,KAAK,IAAI,GAAGF,EAAM,KAAK,MAAM,KAAK,IAAI7N,EAAE,KAAKA,EAAE,KAAK,CAAC,CAAC,GAC3DlF,IAAO,KAAK,IAAIiT,IAAKD,GAAIL,CAAI,GAC7BO,IAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,GAAGjW,EAAE,SAAS,KAAK,MAAMwJ,EAAU/J,EAAE,MAAM,IAAI,EAAI,CAAC,CAAC,IAAI,EAAE,GAC7FyW,IAAS,KAAK,IAAI,KAAK,KAAK,IAAI,MAAMJ,EAAM,SAAS,EAAE,CAAC,GACxDK,IAAQD,IAASnT,GACjBmN,IAASlQ,EAAE,QAAQ,KAAK,GAGxBiJ,IAAKzK,IAASyX,GACd9M,IAAK3K,IAAS0R,GACdkG,KAAK,MAAcnN,KAAMhB,IAAI8N,KAAMI,GACnC9I,IAAM,IAAIzC,EAAI,GACd3I,IAAIkH,IAAK2M,EAAM,SAAS,KAAM,KAAQtX,IAAS,GAG/CsJ,IAAO;EADE4N;EAAM,IAAIA;EAAM,IAAIA;EAAM,KAAKA;EAAMC;EAAK,IAAIA;EAAK,IAAIA;EAAK,KAAKA;EAAK,KAAKA;EAAK,KAAKA;EAAK,MAAMA;CAClG,CAAA,CAAM,MAAM,MAAO5S,IAAO4N,KAAM,EAAE,KAAK,MAAMgF,GACpDrE,IAAQ,KAAK,KAAKyE,IAAKjO,CAAI,IAAIA,GAC/BgB,KAAS,MAAc;EAC3B,IAAM1F,IAAI,IAAI,KAAK6E,CAAC;EAIpB,OAHIH,IAAO6N,IAAY,GAAGC,GAAKxS,EAAE,YAAY,CAAC,EAAE,GAAGwS,GAAKxS,EAAE,cAAc,CAAC,MACrE0E,KAAQ,MAAM6N,IAAY,OAAOvS,EAAE,eAAe,CAAC,IACnD0E,KAAQ,KAAK6N,IAAY,GAAGvS,EAAE,eAAe,EAAE,GAAGwS,GAAKxS,EAAE,YAAY,IAAI,CAAC,MACvE,GAAGA,EAAE,eAAe,EAAE,GAAGwS,GAAKxS,EAAE,YAAY,IAAI,CAAC,EAAE,GAAGwS,GAAKxS,EAAE,WAAW,CAAC;CAClF,GACMiT,IAASlN,IAAK2M,EAAM,SAAS,KAAM;CACzC,KAAK,IAAI7N,IAAIqJ,GAAOrJ,KAAK+N,GAAI,KAAKlO,GAAM;EACtC,IAAMrB,IAAI2P,EAAEnO,CAAC;EAEb,AADAoF,EAAI,KAAK5G,GAAG0C,GAAI1C,GAAG4P,GAAQ;GAAE,QAAQ;GAAW,IAAI;EAAE,CAAC,GACvDhJ,EAAI,KAAK5G,GAAG4P,IAAS,IAAIvN,EAAMb,CAAC,GAAG;GAAE,QAAQ;GAAU,MAAM;GAAI,OAAOyC,EAAM;EAAM,CAAC;CACvF;CACA,IAAIkC,IAAM;CACV,EAAE,SAAS,SAAS,GAAG,MAAM;EAC3B,IAAMnC,IAAQC,EAAM,OAAOlL,IAAIkL,EAAM,OAAO,SACtC/K,IAAMwJ,IAAKyD,IAAM;EAEvB,AADIpN,IAAI,KAAM,KAAG6N,EAAI,KAAK7O,GAAQmB,GAAKsW,IAAQC,GAAQzW,EAAE,MAAM,SAAS,IAAK,EAAE,MAAM,UAAU,CAAC,GAC5FA,EAAE,QAAM4N,EAAI,KAAK,IAAY1N,IAAOF,EAAE,MAAM,SAAS,KAAO,GAAGwK,EAAK,CAACxK,EAAE,IAAI,GAAGwW,IAAQ,IAAI,IAAI,EAAI,GAAG;GAAE,MAAM;GAAI,MAAM;EAAK,CAAC;EACjI,KAAK,IAAM,KAAKxW,EAAE,OAAO;GACvB,IAAMoL,IAAI1B,IAAKyD,IAAM,KAAM;GAC3B,IAAI,EAAE,WAAW;IACf,IAAMnG,IAAI2P,EAAE,EAAE,KAAK;IAUnB,AATA/I,EAAI,KACF;KACE,CAAC5G,GAAGoE,IAAI,CAAC;KACT,CAACpE,IAAI,GAAGoE,CAAC;KACT,CAACpE,GAAGoE,IAAI,CAAC;KACT,CAACpE,IAAI,GAAGoE,CAAC;IACX,GACA,EAAE,MAAM,EAAE,OAAO,YAAYH,EAAM,KAAK,CAC1C,GACA2C,EAAI,KAAK5G,IAAI,IAAIoE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;GAC1C,OAAO;IACL,IAAMyL,IAAKF,EAAE,EAAE,KAAK,GACdtW,IAAI,KAAK,IAAI,GAAGsW,EAAE,EAAE,GAAG,IAAIE,CAAE,GAC7BC,IAAO,EAAE,OAAO,YAAY9L;IAClC,EAAI,KAAK6L,GAAIzL,IAAI,GAAG/K,GAAG,IAAI;KAAE;KAAM,QAAQ,EAAE,OAAO,YAAY,EAAE,SAAS4K,EAAM,OAAO,KAAA;KAAW,IAAI,EAAE,QAAQ,EAAE,SAAS,IAAI;IAAE,GAAG,CAAC;IACtI,IAAMsC,IAAKxD,EAAU,EAAE,MAAM,EAAE;IAC/B,AAAIwD,IAAK,KAAKlN,IAAGuN,EAAI,KAAKiJ,IAAKxW,IAAI,GAAG+K,GAAG,EAAE,MAAM;KAAE,QAAQ;KAAU,MAAM;KAAI,OAAO,EAAE,OAAOH,EAAM,MAAM;IAAU,CAAC,IAC7G4L,IAAKxW,IAAI,IAAIkN,IAAK/D,IAAKiN,IAAS,MAAK7I,EAAI,KAAKiJ,IAAKxW,IAAI,GAAG+K,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,IACrFwC,EAAI,KAAKiJ,IAAK,GAAGzL,GAAG,EAAE,MAAM;KAAE,QAAQ;KAAO,MAAM;IAAG,CAAC;GAC9D;GACA;EACF;CACF,CAAC;CACD,IAAI9I,IAAIkH,IAAKiN,IAAS1X;CAEtB,KAAK,IAAMyJ,KAAK6N,GAAO,IAAI,KAAK,IAAI/T,GAAGqU,EAAEnO,EAAE,GAAG,IAAI,KAAKuB,EAAUvB,EAAE,MAAM,EAAE,IAAIzJ,CAAM;CAKrF,OAJIwB,EAAE,UACJ,IAAI,KAAK,IAAI+B,GAAGyH,EAAUxJ,EAAE,OAAO,IAAI,EAAI,IAAI,EAAU,GACzDqN,EAAI,KAAKtL,IAAI,GAAG,IAAa/B,EAAE,OAAO;EAAE,QAAQ;EAAU,MAAM;EAAI,MAAM;CAAK,CAAC,IAE3E;EAAE,KAAKqN,EAAI,SAAStL,GAAGE,CAAC;EAAG,GAAG,KAAK,KAAKF,CAAC;EAAG,GAAG,KAAK,KAAKE,CAAC;CAAE;AACrE;AAwBA,IAAMuU,KAAQ,IACRC,IAAQ;AAEd,SAAgBC,GAAW,GAAgB,GAA0B;CACnE,IAAMrJ,IAAM,IAAIzC,EAAI,GACdhB,KAAQ,GAAa,MAAkB;EAC3C,IAAM+M,IAAKrG,MAAU,IAAI,KAAKA,MAAU,IAAI,KAAK,IAC3C3G,IAAOM,EAAKjI,EAAE,MAAM,MAAM,IAAI,GAAG,KAAK2U,GAAIrG,MAAU,CAAC,GACrDrI,IAAI8B,EAAQJ,GAAMgN,GAAIrG,MAAU,CAAC,GACjCsG,IAAS5U,EAAE,UAAU,UACrBoB,IAAI,KAAK,IAAI6E,EAAE,GAAGA,EAAE,CAAC,IAAI;EAC/B,OAAO;GAAE;GAAM,GAAG2O,IAASxT,IAAI6E,EAAE,KAAKjG,EAAE,UAAU,SAAS,IAAI;GAAK,GAAG4U,IAASxT,IAAI6E,EAAE,KAAKjG,EAAE,UAAU,SAAS,IAAI;GAAK;EAAG;CAC9H,GACM6U,KAAS,GAAa,GAAe,MAA0B;EACnE,IAAMpX,IAAImK,EAAK5H,GAAGsO,CAAK,GACjBxK,IAAO9D,EAAE,SAAS,KAAK,GAAG,MAAM6U,EAAMlV,GAAG2O,IAAQ,GAAGA,MAAU,IAAI5F,EAAM,OAAOlL,IAAIkL,EAAM,OAAO,UAAUD,CAAK,CAAC,GAChH1H,IAAO,KAAK,IAAItD,EAAE,GAAGqG,EAAK,QAAQ,GAAG,MAAMxE,IAAIK,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,GAAGmE,EAAK,SAAS,CAAC,IAAI2Q,CAAK;EACtG,OAAO;GAAE;GAAG,GAAGhX,EAAE;GAAG,GAAGA,EAAE;GAAG,MAAMA,EAAE;GAAM,GAAG;GAAG,GAAG;GAAG;GAAO;GAAO;GAAM;EAAK;CACjF,GACME,IAAMkX,EAAMvS,GAAM,GAAGoG,EAAM,IAAI,GAEjCoM,IAAkB,CAAC,GACnBC,IAAiB,CAAC;CACtB,IAAIpX,EAAI,KAAK,MAAM,MAAMH,EAAE,EAAE,IAAI,GAE/B,AADA,IAAQG,EAAI,KAAK,QAAQ,MAAMH,EAAE,EAAE,SAAS,MAAM,GAClD,IAAOG,EAAI,KAAK,QAAQ,MAAMH,EAAE,EAAE,SAAS,MAAM;MAC5C,IAAIG,EAAI,KAAK,SAAS,GAAG;EAC9B,IAAMsF,IAAQtF,EAAI,KAAK,QAAQ,GAAG,MAAM2B,IAAI9B,EAAE,MAAM,CAAC,GACjDwX,IAAM;EACV,KAAK,IAAMxX,KAAKG,EAAI,MAGlB,AAFIqX,IAAM/R,IAAQ,IAAG6R,EAAM,KAAKtX,CAAC,IAC5BuX,EAAK,KAAKvX,CAAC,GAChB,KAAOA,EAAE;CAEb,OAAO,IAAQG,EAAI;CACnB,IAAMsX,KAAS,GAAW,GAAW,GAAc,MAAgB;EACjE,EAAE,IAAIxQ;EACN,IAAIoE,IAAIqM,KAAQhP,EAAE,QAAQA,EAAE,KAAK,QAAQ,GAAG,MAAM5G,IAAIK,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,GAAGuG,EAAE,KAAK,SAAS,CAAC,IAAIuO,MAAU;EAC9G,KAAK,IAAM9U,KAAKuG,EAAE,MAEhB,AADA+O,EAAMtV,GAAG8E,IAAIuB,KAAOE,EAAE,IAAI,IAAIsO,KAAQ7U,EAAE,IAAI,IAAIkJ,GAAG7C,CAAG,GACtD,KAAKrG,EAAE,OAAO8U;EAEhB,EAAE,IAAIvO,EAAE,KAAK,UAAUA,EAAE,KAAK,EAAE,CAAC,IAAIA,EAAE,KAAKA,EAAE,KAAK,SAAS,EAAE,CAAC,KAAK,IAAIgP,IAAOhP,EAAE,OAAO;CAC1F,GACMiP,KAAY,MAAiBC,EAAG,QAAQ,GAAG,MAAM9V,IAAIK,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,GAAGyV,EAAG,SAAS,CAAC,IAAIX,GAC/FY,IAAQF,EAASL,CAAK,GACtBQ,IAAQH,EAASJ,CAAI,GACrB3Q,IAAS,KAAK,IAAIzG,EAAI,GAAG0X,GAAOC,CAAK,GACvC,KAAKlR,IAASiR,KAAS;CAC3B,KAAK,IAAM1V,KAAKmV,GAEd,AADAG,EAAMtV,GAAGhC,EAAI,IAAI,IAAI6W,KAAQ7U,EAAE,IAAI,GAAG,GAAG,CAAC,GAC1C,KAAKA,EAAE,OAAO8U;CAEhB,KAAKrQ,IAASkR,KAAS;CACvB,KAAK,IAAM3V,KAAKoV,GAEd,AADAE,EAAMtV,GAAG,EAAEhC,EAAI,IAAI,IAAI6W,KAAQ7U,EAAE,IAAI,IAAI,GAAG,EAAE,GAC9C,KAAKA,EAAE,OAAO8U;CAGhB,AADA,EAAI,IAAI,GACR,EAAI,IAAIrQ,IAAS;CAEjB,IAAIqB,IAAO,UACPC,IAAO,WACP6P,IAAO,UACPC,IAAO,WACLC,IAAgB,CAAC,GACjBC,KAAQ,MAAc;EAM1B,AALAD,EAAI,KAAKvP,CAAC,GACV,IAAO,KAAK,IAAIT,GAAMS,EAAE,IAAIA,EAAE,IAAI,CAAC,GACnC,IAAO,KAAK,IAAIR,GAAMQ,EAAE,IAAIA,EAAE,IAAI,CAAC,GACnC,IAAO,KAAK,IAAIqP,GAAMrP,EAAE,IAAIA,EAAE,IAAI,CAAC,GACnC,IAAO,KAAK,IAAIsP,GAAMtP,EAAE,IAAIA,EAAE,IAAI,CAAC,GACnCA,EAAE,KAAK,QAAQwP,CAAI;CACrB;CACA,EAAK/X,CAAG;CACR,IAAMuQ,IAASyH,IAAQ,KAAK,GACtBC,IAAKpZ,IAASiJ,GACdoQ,IAAKrZ,IAAS0R,IAASqH,GACvBO,KAAK,OAAmB;EAAE,GAAG5P,EAAE,IAAI0P;EAAI,GAAG1P,EAAE,IAAI2P;CAAG;CACzD,KAAK,IAAM3P,KAAKuP,GACd,KAAK,IAAM9V,KAAKuG,EAAE,MAAM;EACtB,IAAM5G,IAAIwW,EAAE5P,CAAC,GACP3G,IAAIuW,EAAEnW,CAAC,GACPqG,IAAM,KAAK,KAAKzG,EAAE,IAAID,EAAE,CAAC,KAAK,GAC9B7B,IAAI;GAAE,GAAG6B,EAAE,IAAK0G,IAAME,EAAE,IAAK;GAAG,GAAG5G,EAAE;EAAE,GACvC2G,IAAI;GAAE,GAAG1G,EAAE,IAAKyG,IAAMrG,EAAE,IAAK;GAAG,GAAGJ,EAAE;EAAE,GACvCqK,KAAKnM,EAAE,IAAIwI,EAAE,KAAK;EACxB,EAAI,KAAKuD,EAAS,CAAC;GAAE,GAAG;GAAK,GAAG,CAAC/L,CAAC;EAAE,GAAG;GAAE,GAAG;GAAK,GAAG;IAAC;KAAE,GAAGmM;KAAG,GAAGnM,EAAE;IAAE;IAAG;KAAE,GAAGmM;KAAG,GAAG3D,EAAE;IAAE;IAAGA;GAAC;EAAE,CAAC,CAAC,GAAG;GAAE,QAAQtG,EAAE;GAAO,IAAI,KAAK,IAAI,KAAK,MAAMA,EAAE,QAAQ,EAAG;EAAE,CAAC;CAC9J;CAEF,KAAK,IAAMuG,KAAKuP,GAAK;EACnB,IAAM9V,IAAImW,EAAE5P,CAAC,GACPyO,IAAKzO,EAAE,UAAU,IAAI,KAAKA,EAAE,UAAU,IAAI,KAAK,IAC/CzB,IAAI9E,EAAE,IAAIuG,EAAE,IAAI,GAChB2C,IAAIlJ,EAAE,IAAIuG,EAAE,IAAI,GAChB6P,IAAQ7P,EAAE,EAAE,UAAUA,EAAE,OAAc,UACtCqO,IAAOrO,EAAE,UAAU,IAAIwC,EAAM,OAAOxC,EAAE,UAAU,IAAIA,EAAE,QAAQ8P,GAAK9P,EAAE,KAAK,GAC1E+P,IAAM/P,EAAE,SAAS,IAAI,YAAYwC,EAAM;EAC7C,IAAIqN,MAAU,QAEZ,AADA1K,EAAI,KAAK5G,GAAGoE,IAAI3C,EAAE,GAAGzB,IAAIyB,EAAE,GAAG2C,IAAI3C,EAAE,GAAG;GAAE,QAAQA,EAAE;GAAO,IAAI;EAAI,CAAC,GACnEmF,EAAI,KAAK1L,EAAE,GAAGA,EAAE,GAAGuG,EAAE,MAAM;GAAE,QAAQ;GAAU,MAAMyO;EAAG,CAAC;OAG3D;OAAIoB,MAAU,UAAU,EAAI,OAAOpW,EAAE,GAAGA,EAAE,GAAGuG,EAAE,IAAI,GAAG;IAAE;IAAM,QAAQA,EAAE;IAAO,IAAI;GAAI,CAAC;QACnF,IAAI6P,MAAU,WAAW;IAC5B,IAAMtY,IAAIyI,EAAE,IAAI;IAChB,EAAI,KACF;KACE,CAACzB,IAAIhH,GAAGoL,CAAC;KACT,CAACpE,IAAIyB,EAAE,IAAIzI,GAAGoL,CAAC;KACf,CAACpE,IAAIyB,EAAE,GAAGvG,EAAE,CAAC;KACb,CAAC8E,IAAIyB,EAAE,IAAIzI,GAAGoL,IAAI3C,EAAE,CAAC;KACrB,CAACzB,IAAIhH,GAAGoL,IAAI3C,EAAE,CAAC;KACf,CAACzB,GAAG9E,EAAE,CAAC;IACT,GACA;KAAE;KAAM,QAAQuG,EAAE;KAAO,IAAI;IAAI,CACnC;GACF,OAAO,EAAI,KAAKzB,GAAGoE,GAAG3C,EAAE,GAAGA,EAAE,GAAG;IAAE;IAAM,QAAQA,EAAE,UAAU,IAAI,KAAA,IAAYA,EAAE;IAAO,IAAI;GAAI,GAAG6P,MAAU,SAAS,IAAIA,MAAU,UAAU7P,EAAE,IAAI,IAAI,CAAC;GACtJ,EAAI,KAAKvG,EAAE,GAAGA,EAAE,GAAGuG,EAAE,MAAM;IAAE,QAAQ;IAAU,MAAMyO;IAAI,MAAMzO,EAAE,UAAU;IAAG,OAAO+P;GAAI,CAAC;EAD4D;CAExJ;CACA,IAAIlW,IAAI2F,IAAOD,IAAO,IAChBxF,IAAIuV,IAAOD,IAAO,KAAarH;CAKrC,OAJIyH,MACF,IAAI,KAAK,IAAI5V,GAAGyH,EAAUmO,GAAO,IAAI,EAAI,IAAI,EAAU,GACvDtK,EAAI,KAAKtL,IAAI,GAAG,IAAa4V,GAAO;EAAE,QAAQ;EAAU,MAAM;EAAI,MAAM;CAAK,CAAC,IAEzE;EAAE,KAAKtK,EAAI,SAAStL,GAAGE,CAAC;EAAG,GAAG,KAAK,KAAKF,CAAC;EAAG,GAAG,KAAK,KAAKE,CAAC;CAAE;AACrE;AAGA,SAAS+V,GAAK,GAAmB;CAC/B,IAAMpM,IAAI,8CAA8C,KAAKjK,CAAC;CAE9D,OADKiK,IACE,MAAM;EAACA,EAAE;EAAIA,EAAE;EAAIA,EAAE;CAAE,CAAC,CAAC,KAAK,MAAM,KAAK,MAAM,SAASpJ,GAAG,EAAE,IAAI,MAAO,KAAU,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IADlH;AAEjB;;ACxTA,IAAM0V,KAAM,MAAc,KAAK,MAAMtY,IAAI,GAAG,IAAI,KAkCnCuY,KAAb,MAA6B;CAC3B,IAAuB;EAAE,cAAc,CAAC;EAAG,QAAQ,CAAC;CAAE;CACtD,sBAAc,IAAI,IAAyB;CAE3C,YAAY,GAAY,IAA8B,CAAC,GAAgB;EACrE,IAAIjQ,IAAI,KAAK,IAAI,IAAI+D,CAAE;EACvB,AAAK/D,MACH,IAAI;GAAE;GAAI,OAAO+D;GAAI,MAAM;EAAc,GACzC,KAAK,IAAI,IAAIA,GAAI/D,CAAC,GAClB,KAAK,EAAE,aAAa,KAAKA,CAAC;EAE5B,KAAK,IAAM,CAAC1I,GAAGI,MAAM,OAAO,QAAQsM,CAAK,GAAG,AAAItM,MAAM,KAAA,MAAW,EAA0CJ,KAAKI;EAChH,OAAOsI;CACT;CAEA,IAAI,GAAY;EACd,OAAO,KAAK,IAAI,IAAI+D,CAAE;CACxB;CAEA,KAAK,GAAa;EAMhB,AALI,EAAE,MAAM,SACV,KAAK,YAAY,EAAE,IAAI,GACvB,KAAK,YAAY,EAAE,EAAE,KACZ,EAAE,MAAM,SAAQ,EAAE,IAAI,SAAS,MAAM,KAAK,YAAYnM,CAAC,CAAC,KAC1D,EAAE,MAAM,SAAS,EAAE,MAAM,cAAW,KAAK,YAAY,EAAE,GAAG,GACnE,KAAK,EAAE,OAAO,KAAK,CAAC;CACtB;AACF,GAEMsY,KAAO,IACPC,IAAM,IACNC,KAAMxO,EAAWuO,CAAG,GACpBE,IAAS,IACTvO,KAAS,MAAevK,IAAIA,EAAE,MAAM,IAAI,IAAI,CAAC;AAQnD,SAAS+Y,GAAK,GAAsB;CAClC,IAAM7O,IAAOK,EAAM9B,EAAE,KAAK,GACpBD,IAAI8B,EAAQJ,GAAMyO,EAAI;CAC5B,QAAQlQ,EAAE,MAAV;EACE,KAAK,SACH,OAAO;GAAE,GAAG,KAAK,IAAI,IAAID,EAAE,IAAI,CAAC;GAAG,GAAG,KAAKA,EAAE;GAAG;EAAK;EACvD,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAO;GAAE,GAAG,KAAK,IAAI,IAAIA,EAAE,IAAI,CAAC;GAAG,GAAG,KAAKA,EAAE;GAAG;EAAK;EACvD,KAAK,YACH,OAAO;GAAE,GAAG,KAAK,IAAI,IAAIA,EAAE,IAAI,EAAE;GAAG,GAAGA,EAAE,IAAI;GAAI;EAAK;EACxD,SACE,OAAO;GAAE,GAAG,KAAK,IAAI,IAAIA,EAAE,IAAI,EAAE;GAAG,GAAGA,EAAE,IAAI;GAAI;EAAK;CAC1D;AACF;AAEA,SAASwQ,GAAgB,GAAU,GAAgB,GAAS,GAAY,GAAW;CACjF,IAAMlC,IAAOrO,EAAE,QAAQwC,EAAM,MACvBiG,IAAK;EAAE;EAAM,QAAQjG,EAAM;EAAQ,IAAI;CAAI,GAC3CuN,IAAM;EAAE,MAAM;EAAQ,QAAQvN,EAAM;EAAM,IAAI;CAAI,GAClDgO,KAAa,MAAgBrL,EAAI,KAAKtC,GAAIpL,IAAO4B,EAAE,KAAK,SAASuI,EAAWsO,EAAI,IAAK,GAAG7W,EAAE,MAAM,EAAE,QAAQ,SAAS,CAAC,GACpHkF,IAAIsE,IAAKxJ,EAAE,IAAI;CACrB,QAAQ2G,EAAE,MAAV;EACE,KAAK;GAIH,AAHAmF,EAAI,OAAOtC,GAAIF,IAAI,GAAG,GAAG;IAAE,GAAGoN;IAAK;GAAK,CAAC,GACzC5K,EAAI,KAAKtC,GAAIF,IAAI,IAAIE,GAAIF,IAAI,IAAIoN,CAAG,CAAC,CAAC,KAAKlN,IAAK,IAAIF,IAAI,IAAIE,IAAK,IAAIF,IAAI,IAAIoN,CAAG,GAChF5K,EAAI,KAAKtC,GAAIF,IAAI,IAAIE,IAAK,GAAGF,IAAI,IAAIoN,CAAG,CAAC,CAAC,KAAKlN,GAAIF,IAAI,IAAIE,IAAK,GAAGF,IAAI,IAAIoN,CAAG,GAC9ES,EAAU7N,IAAI,EAAE;GAChB;EACF,KAAK;GAEH,AADAwC,EAAI,OAAOtC,IAAK,GAAGF,IAAI,IAAI,IAAI8F,CAAE,CAAC,CAAC,KAAK5F,IAAK,IAAIF,IAAI,GAAGE,IAAK,IAAIF,IAAI,IAAIoN,CAAG,CAAC,CAAC,KAAKlN,IAAK,IAAIF,IAAI,IAAIE,IAAK,GAAGF,IAAI,IAAIoN,CAAG,GACvHS,EAAU7N,IAAI,EAAE;GAChB;EACF,KAAK;GAUH,AATAwC,EAAI,OAAOtC,GAAIF,IAAI,IAAI,IAAI8F,CAAE,CAAC,CAAC,KAC7B;IACE,CAAC5F,IAAK,GAAGF,IAAI,CAAC;IACd,CAACE,IAAK,GAAGF,IAAI,CAAC;IACd,CAACE,IAAK,GAAGF,IAAI,CAAC;GAChB,GACAoN,GACA,EACF,GACAS,EAAU7N,IAAI,EAAE;GAChB;EACF,KAAK;GAEH,AADAwC,EAAI,OAAOtC,GAAIF,IAAI,IAAI,IAAI8F,CAAE,CAAC,CAAC,KAAK5F,IAAK,IAAIF,IAAI,IAAIE,IAAK,IAAIF,IAAI,IAAIoN,CAAG,GACzES,EAAU7N,IAAI,EAAE;GAChB;EACF,KAAK,YAAY;GACf,IACM/K,IAAIyB,EAAE,GACNiB,IAAIjB,EAAE;GAGZ,AAFA8L,EAAI,KAAK,IAAI6K,EAAGzR,CAAC,EAAE,GAAGyR,EAAGrN,IAAI,CAAE,EAAE,IAAIqN,EAAGpY,IAAI,CAAC,EAAE,WAAeoY,EAAGzR,IAAI3G,CAAC,EAAE,GAAGoY,EAAGrN,IAAI,CAAE,EAAE,IAAIqN,EAAGzR,IAAI3G,CAAC,EAAE,GAAGoY,EAAGrN,IAAIrI,IAAI,CAAE,EAAE,IAAI0V,EAAGpY,IAAI,CAAC,EAAE,WAAeoY,EAAGzR,CAAC,EAAE,GAAGyR,EAAGrN,IAAIrI,IAAI,CAAE,EAAE,KAAKmO,CAAE,GAClLtD,EAAI,KAAK,IAAI6K,EAAGzR,CAAC,EAAE,GAAGyR,EAAGrN,IAAI,CAAE,EAAE,IAAIqN,EAAGpY,IAAI,CAAC,EAAE,WAAeoY,EAAGzR,IAAI3G,CAAC,EAAE,GAAGoY,EAAGrN,IAAI,CAAE,KAAK;IAAE,GAAG8F;IAAI,MAAM;GAAO,CAAC,GAChHtD,EAAI,KAAKtC,GAAIF,IAAIrI,IAAI,IAAI,GAAQjB,EAAE,MAAM,EAAE,QAAQ,SAAS,CAAC;GAC7D;EACF;EACA,KAAK;GAEH,AADA8L,EAAI,KAAK5G,IAAI,GAAGoE,IAAI,GAAGtJ,EAAE,GAAGA,EAAE,GAAGoP,GAAI,CAAC,GACtCtD,EAAI,KAAK5G,GAAGoE,GAAGtJ,EAAE,GAAGA,EAAE,GAAGoP,GAAI,CAAC;GAC9B;EACF,KAAK;GACH,EAAI,KAAKlK,GAAGoE,GAAGtJ,EAAE,GAAGA,EAAE,GAAGoP,GAAIpP,EAAE,IAAI,CAAC;GACpC;EACF,SACE,EAAI,KAAKkF,GAAGoE,GAAGtJ,EAAE,GAAGA,EAAE,GAAGoP,GAAI,CAAC;CAClC;CACA,EAAI,KAAK5F,GAAIF,IAAItJ,EAAE,IAAI,GAAGA,EAAE,MAAM,EAAE,QAAQ,SAAS,CAAC;AACxD;AAEA,SAASoX,GAAU,GAAU,GAAe,GAAW,GAAW,GAAa;CAC7E,IAAMvK,IAAM1D,EAAM;CAClB,QAAQ2D,GAAR;EACE,KAAK;GACH,EAAI,KACF;IACE,CAAC5H,GAAGoE,CAAC;IACL,CAACpE,IAAIuB,IAAM,IAAI6C,IAAI,GAAG;IACtB,CAACpE,IAAIuB,IAAM,IAAI6C,IAAI,GAAG;GACxB,GACA;IAAE,MAAMuD;IAAK,QAAQA;IAAK,IAAI;GAAE,CAClC;GACA;EACF,KAAK;GACH,EAAI,KACF;IACE,CAAC3H,IAAIuB,IAAM,IAAI6C,IAAI,CAAC;IACpB,CAACpE,GAAGoE,CAAC;IACL,CAACpE,IAAIuB,IAAM,IAAI6C,IAAI,CAAC;GACtB,GACA;IAAE,QAAQuD;IAAK,IAAI;GAAI,GACvB,EACF;GACA;EACF,KAAK;GACH,EAAI,KACF,CACE,CAAC3H,IAAIuB,IAAM,IAAI6C,IAAI,CAAC,GACpB,CAACpE,GAAGoE,CAAC,CACP,GACA;IAAE,QAAQuD;IAAK,IAAI;GAAI,GACvB,EACF;GACA;EACF,KAAK,SACH,EAAI,KAAK3H,IAAI,IAAIuB,IAAM,GAAG6C,IAAI,GAAGpE,IAAI,IAAIuB,IAAM,GAAG6C,IAAI,GAAG;GAAE,QAAQuD;GAAK,IAAI;EAAI,CAAC,CAAC,CAAC,KAAK3H,IAAI,IAAIuB,IAAM,GAAG6C,IAAI,GAAGpE,IAAI,IAAIuB,IAAM,GAAG6C,IAAI,GAAG;GAAE,QAAQuD;GAAK,IAAI;EAAI,CAAC;CAEpK;AACF;AAcA,SAAgBwK,GAAe,GAAuB;CACpD,IAAMC,IAAKpZ,EAAE;CACb,IAAI,CAACoZ,EAAG,QAAQ,MAAM,IAAIna,EAAa,0CAA0C;CACjF,IAAIma,EAAG,SAAS,OAAOpZ,EAAE,OAAO,SAAS,KAAM,MAAM,IAAIf,EAAa,2CAA2C;CACjH,IAAMoa,IAAM,IAAI,IAAID,EAAG,KAAK,GAAG,MAAM,CAAC3Q,EAAE,IAAI1I,CAAC,CAAC,CAAC,GACzCwJ,IAAQ6P,EAAG,IAAIL,EAAI,GACnBxW,IAAI6W,EAAG,QAEPE,IAAU,MAAM/W,CAAC,CAAC,CAAC,KAAK,CAAC;CAC/B,KAAK,IAAIxC,IAAI,GAAGA,IAAIwC,GAAG,KAAK,EAAIxC,MAAMwJ,EAAMxJ,IAAI,EAAE,CAAC,IAAIwJ,EAAMxJ,EAAE,CAAC,KAAK,IAAI;CACzE,IAAIwZ,IAAY,GACZC,IAAa,GACXC,KAAQ,GAAW,GAAW,MAAc;EAEhD,IADI5X,IAAIC,MAAG,CAACD,GAAGC,KAAK,CAACA,GAAGD,CAAC,IACrBA,MAAMC,GAAG;EACb,IAAI4X,IAAO;EACX,KAAK,IAAI3Z,IAAI8B,IAAI,GAAG9B,KAAK+B,GAAG,KAAK,KAAQwX,EAAIvZ;EAC7C,IAAI2Z,KAAQvZ,GAAG;EACf,IAAM2C,KAAO3C,IAAIuZ,MAAS5X,IAAID;EAC9B,KAAK,IAAI9B,IAAI8B,IAAI,GAAG9B,KAAK+B,GAAG,KAAK,EAAI/B,MAAM+C;CAC7C,GACM6W,KAAO,MAAe3Z,EAAE,aAAa+J,EAAU,OAAOhK,CAAC,GAAG,EAAE,IAAI,KAAK,GACvE6Z,IAAQ;CACZ,KAAK,IAAMxN,KAAKpM,EAAE,QAChB,IAAIoM,EAAE,MAAM,OAAO;EACjB;EACA,IAAMvK,IAAIwX,EAAI,IAAIjN,EAAE,IAAI,GAClBtK,IAAIuX,EAAI,IAAIjN,EAAE,EAAE,GAChBmB,IAAK,KAAK,IAAI,GAAG,GAAGhD,EAAM6B,EAAE,IAAI,CAAC,CAAC,KAAK,MAAMrC,EAAUjJ,GAAG8X,CAAG,CAAC,CAAC,IAAIe,EAAIC,CAAK;EAClF,AAAI/X,MAAMC,IACJD,IAAI,IAAIU,IAAGkX,EAAK5X,GAAGA,IAAI,GAAG0H,EAAM1H,IAAI,EAAE,CAAC,IAAI,IAAI0L,IAAK,EAAE,IACrD,IAAa,KAAK,IAAIiM,GAAYjM,IAAK,KAAKhE,EAAM1H,EAAE,CAAC,IAAI,CAAC,IAC1D4X,EAAK5X,GAAGC,GAAGyL,IAAK,EAAE;CAC3B,OAAO,IAAInB,EAAE,MAAM,QAAQ;EACzB,IAAMmB,IAAKjD,EAAQC,EAAM6B,EAAE,IAAI,GAAGwM,CAAG,CAAC,CAAC,IAAI,IACrCjB,IAAKvL,EAAE,IAAI,KAAK,MAAMiN,EAAI,IAAIhZ,CAAC,CAAE,GACjCwB,IAAI,KAAK,IAAI,GAAG8V,CAAE,GAClB7V,IAAI,KAAK,IAAI,GAAG6V,CAAE;EACxB,AAAIvL,EAAE,QAAQ,SACRvK,MAAMC,KAAG2X,EAAK5X,GAAGC,GAAGyL,IAAK,EAAE,IACtBnB,EAAE,QAAQ,SACfvK,IAAI,IAAG4X,EAAK5X,IAAI,GAAGA,GAAG0L,IAAK,KAAKhE,EAAM1H,IAAI,EAAE,CAAC,IAAI,CAAC,IACjD,IAAY,KAAK,IAAI0X,GAAWhM,IAAK,KAAKhE,EAAM,EAAE,CAAC,IAAI,CAAC,IACpDzH,IAAI,IAAIS,IAAGkX,EAAK3X,GAAGA,IAAI,GAAGyL,IAAK,KAAKhE,EAAMzH,IAAI,EAAE,CAAC,IAAI,CAAC,IAC5D,IAAa,KAAK,IAAI0X,GAAYjM,IAAK,KAAKhE,EAAMzH,EAAE,CAAC,IAAI,CAAC;CACjE;CAEF,IAAMwJ,IAAe,CAAC,GAEhBuO,WAAiB;EACrB,IAAIlW,IAAI,GACJwI,IAAI;EACR,KAAK,IAAMC,KAAKpM,EAAE,QAChB,AAAIoM,EAAE,MAAM,UAAS,IAAI,KAAK,IAAID,GAAG,EAAExI,CAAC,IAC/ByI,EAAE,MAAM,UAAO,IAAI,KAAK,IAAI,GAAGzI,IAAI,CAAC;EAE/C,OAAOwI;CACT,EAAA,CAAG,GACG2N,IAAYD,IAAU,KAAKA,IAAU,IAAI;CAC/C,EAAG,KAAKf,IAAS,KAAK,IAAIvP,EAAM,EAAE,CAAC,IAAI,GAAGgQ,IAAYhQ,EAAM,EAAE,CAAC,IAAI,GAAGuQ,IAAY,EAAE;CACpF,KAAK,IAAI/Z,IAAI,GAAGA,IAAIwC,GAAG,KAAK,EAAGxC,KAAKuL,EAAGvL,IAAI,KAAKuZ,EAAIvZ;CACpD,IAAIga,IAAQzO,EAAG/I,IAAI,KAAK,KAAK,IAAIgH,EAAMhH,IAAI,EAAE,CAAC,IAAI,GAAGiX,IAAajQ,EAAMhH,IAAI,EAAE,CAAC,IAAI,GAAGuX,IAAY,EAAE,IAAIhB,GAIlG5Y,IAAM4Y,KADG9Y,EAAE,QAAQ,KAAK,IAExBga,IAAQ,KAAK,IAAI,GAAGzQ,EAAM,KAAK,MAAMzH,EAAE,CAAC,CAAC,GAC3CsJ,IAAIlL,IAAM8Z,IAAQ,IAChBC,IAAU,IAAI9O,EAAI,GAClB+O,IAAS,IAAI/O,EAAI,GACjBgP,IAAW,IAAIhP,EAAI,GACnBiP,IAAqBhB,EAAG,UAAU,CAAC,CAAC,GACpCiB,IAA+D,CAAC,GAChEC,IAAkB,CAAC,GACnBC,IAAgB,CAAC,GACjBC,oBAAQ,IAAI,IAAoB,GAChCC,KAAS,GAAY,MAAe;EACxC,KAAK,IAAM7W,KAAK2W,GAEd,AADA,EAAE,KAAK,KAAK,IAAI3W,EAAE,IAAIvC,CAAE,GACxB,EAAE,KAAK,KAAK,IAAIuC,EAAE,IAAItC,CAAE;CAE5B,GACMoZ,MAAQ,GAAW,MAAiB;EACxC,IAAM/W,IAAIyW,EAAOra,EAAE,CAAC;EACpB,OAAOuL,EAAGvL,MAAM4D,IAAI+K,IAAO,KAAK/K,IAAI,KAAK,IAAI;CAC/C,GACMgX,MAAY,GAAW,MAAeP,EAAOra,EAAE,CAAC,KAAK2D,CAAE,GACvDkX,KAAc,GAAW,MAAe;EAC5C,IAAMlR,IAAK0Q,EAAOra,EAAE,CAAC,IAAI;EACzB,AAAI2J,MAAO,KAAA,KAAW2Q,EAAK,KAAK;GAAE;GAAG;GAAI,IAAI3W;GAAI,OAAO0W,EAAOra,EAAE,CAAC;EAAO,CAAC;CAC5E;CACA,IAAQ;CACR,KAAK,IAAMqM,KAAKpM,EAAE,QAChB,QAAQoM,EAAE,GAAV;EACE,KAAK,OAAO;GACV;GACA,IAAMvK,IAAIwX,EAAI,IAAIjN,EAAE,IAAI,GAClBtK,IAAIuX,EAAI,IAAIjN,EAAE,EAAE,GAChBlC,IAAOK,EAAM6B,EAAE,IAAI,GACnBoB,IAAKtD,EAAK,SAAS2O,IACnB3N,IAAQ;IAAE,QAAQD,EAAM;IAAM,IAAI;IAAK,MAAMmB,EAAE,SAAS,QAAQ,KAAA;GAAU,GAC1EyO,IAAKlB,EAAIC,CAAK;GACpB,IAAI/X,MAAMC,GAAG;IACX,KAAK0L,IAAK;IACV,IAAMhE,IAAKkR,GAAK7Y,GAAG,CAAC;IAmBpB,AAjBAqY,EAAO,KACL;KACE,CAAC1Q,GAAI4B,CAAC;KACN,CAAC5B,IAAK,IAAO4B,CAAC;KACd,CAAC5B,IAAK,IAAO4B,IAAI,EAAE;KACnB,CAAC5B,IAAK,GAAG4B,IAAI,EAAE;IACjB,GACAF,GACA,EACF,GACAgO,GAAUgB,GAAQ9N,EAAE,MAAM5C,GAAI4B,IAAI,IAAI,EAAE,GACxC+O,EAAS,KAAK3Q,IAAK,IAAIqR,GAAIzP,IAAI,IAAIoC,IAAK,GAAGtD,GAAM,EAAE,MAAM0O,EAAI,CAAC,GAC1D5Y,EAAE,cAAY8a,GAAYX,GAAU3Q,GAAI4B,GAAGwO,CAAK,GACpDa,EAAMnP,EAAGzJ,KAAK,IAAI2H,IAAK,KAAQ,IAAIqR,IAAK,KAAK,IAAI,GAAG3Q,EAAK,KAAK,MAAMH,EAAUjJ,GAAG8X,CAAG,CAAC,CAAC,CAAC,GACvF,KAAK,IACDxM,EAAE,YAAUuO,GAAS7Y,GAAGsJ,CAAC,GACzBgB,EAAE,cAAYwO,EAAW/Y,GAAGuJ,CAAC,GACjC,KAAK;IACL;GACF;GACA,KAAKoC,IAAK;GACV,IAAMjF,IAAMzG,IAAID,IAAI,IAAI;GACxB,AAAIuK,EAAE,YAAUuO,GAAS7Y,GAAGsJ,CAAC;GAC7B,IAAM3B,IAAKiR,GAAK7Y,GAAG0G,CAAG,GAChBiD,IAAKkP,GAAK5Y,GAAG,CAACyG,CAAG;GAQvB,AAPA2R,EAAO,KAAKzQ,GAAI2B,GAAGI,GAAIJ,GAAGF,CAAK,GAC/BgO,GAAUgB,GAAQ9N,EAAE,MAAMZ,GAAIJ,GAAG7C,CAAG,GAChC6D,EAAE,QAAM8M,GAAUgB,GAAQ9N,EAAE,MAAM3C,GAAI2B,GAAG,CAAC7C,CAAG,GACjD4R,EAAS,MAAM1Q,IAAK+B,KAAM,IAAKjD,IAAMsS,IAAM,GAAGzP,IAAI,IAAIoC,IAAK,GAAGtD,GAAM;IAAE,QAAQ;IAAU,MAAM0O;GAAI,CAAC,GAC/F5Y,EAAE,cAAY8a,GAAYX,GAAU1Q,GAAI2B,GAAGwO,CAAK,GAChDxN,EAAE,cAAYwO,EAAW/Y,GAAGuJ,CAAC,GACjCqP,EAAM,KAAK,IAAInP,EAAGzJ,IAAIyJ,EAAGxJ,EAAE,GAAG,KAAK,IAAIwJ,EAAGzJ,IAAIyJ,EAAGxJ,EAAE,CAAC,GACpD,KAAK;GACL;EACF;EACA,KAAK,OAAO;GACV,IAAM/B,IAAIsZ,EAAI,IAAIjN,EAAE,GAAG;GACvB,AAAIA,EAAE,KAAIuO,GAAS5a,GAAGqL,IAAI,CAAC,IACtBwP,EAAW7a,GAAGqL,IAAI,CAAC;GACxB;EACF;EACA,KAAK,QAAQ;GACX,IAAMuM,IAAKvL,EAAE,IAAI,KAAK,MAAMiN,EAAI,IAAIhZ,CAAC,CAAE,GACjCwB,IAAI,KAAK,IAAI,GAAG8V,CAAE,GAClB7V,IAAI,KAAK,IAAI,GAAG6V,CAAE,GAClBzN,IAAOK,EAAM6B,EAAE,IAAI,GACnB5D,IAAI8B,EAAQJ,GAAM0O,CAAG,GACrBvY,IAAI,KAAK,IAAImI,EAAE,IAAI,IAAI4D,EAAE,QAAQ,UAAUvK,MAAMC,IAAIwJ,EAAGxJ,KAAKwJ,EAAGzJ,KAAK,KAAK,GAAG,EAAE,GAC/EkB,IAAIyF,EAAE,IAAI;GAChB,KAAK;GACL,IAAMxB,IAAIoF,EAAE,QAAQ,SAASd,EAAGzJ,KAAK,KAAKxB,IAAI+L,EAAE,QAAQ,UAAUd,EAAGxJ,KAAK,MAAMwJ,EAAGzJ,KAAKyJ,EAAGxJ,MAAM,IAAIzB,IAAI;GAazG,AAZA8Z,EAAS,KACP;IACE,CAACnT,GAAGoE,CAAC;IACL,CAACpE,IAAI3G,IAAI,GAAG+K,CAAC;IACb,CAACpE,IAAI3G,GAAG+K,IAAI,CAAC;IACb,CAACpE,IAAI3G,GAAG+K,IAAIrI,CAAC;IACb,CAACiE,GAAGoE,IAAIrI,CAAC;GACX,GACA;IAAE,MAAMkI,EAAM;IAAM,QAAQA,EAAM;IAAY,IAAI;GAAE,CACtD,GACAkP,EAAS,KAAKnT,IAAI,IAAIoE,IAAIrI,IAAI,GAAGmH,GAAM,EAAE,MAAM0O,EAAI,CAAC,GACpD6B,EAAMzT,GAAGA,IAAI3G,CAAC,GACd,KAAK0C,IAAI;GACT;EACF;EACA,KAAK,SAAS;GACZ,KAAK;GACL,IAAMa,IAAW;IAAE,MAAMwI,EAAE;IAAM,OAAOA,EAAE;IAAO,MAAMA,EAAE;IAAM,IAAIhB;IAAG,IAAIA;IAAG,IAAI;IAAU,IAAI;IAAW,OAAOmP,EAAK;IAAQ,OAAO,CAAC;GAAE;GAGxI,AAFAD,EAAO,KAAK1W,CAAC,GACb2W,EAAK,KAAK3W,CAAC,GACX,KAAKwI,EAAE,SAAS,SAAS,IAAI;GAC7B;EACF;EACA,KAAK,QAAQ;GACX,IAAMxI,IAAI2W,EAAKA,EAAK,SAAS;GAC7B,IAAI,CAAC3W,GAAG;GAGR,AAFA,KAAK,GACLA,EAAE,MAAM,KAAK;IAAE;IAAG,OAAOwI,EAAE;GAAM,CAAC,GAClC,KAAK;GACL;EACF;EACA,KAAK,OAAO;GACV,IAAMxI,IAAI2W,EAAK,IAAI;GACnB,IAAI,CAAC3W,GAAG;GAGR,AAFA,KAAK,IACL,EAAE,KAAKwH,GACP,KAAK;GACL;EACF;EACA,KAAK,WAAW;GACd,KAAK;GACL,IAAM5C,IAAI8B,EAAQC,EAAM6B,EAAE,IAAI,GAAGwM,CAAG;GAMpC,AALAuB,EAAS,KAAKrB,IAAS,GAAG1N,IAAI,GAAG2O,IAAQjB,IAAS,GAAG1N,IAAI,GAAG;IAAE,QAAQH,EAAM;IAAO,IAAI;GAAE,CAAC,CAAC,CAAC,KAAK6N,IAAS,GAAG1N,IAAI,GAAG2O,IAAQjB,IAAS,GAAG1N,IAAI,GAAG;IAAE,QAAQH,EAAM;IAAO,IAAI;GAAE,CAAC,GACzKmB,EAAE,SACJ+N,EAAS,KAAKJ,IAAQ,IAAIvR,EAAE,IAAI,IAAI,IAAI4C,IAAI5C,EAAE,IAAI,IAAI,GAAGA,EAAE,IAAI,IAAIA,EAAE,IAAI,GAAG;IAAE,MAAM;IAAW,QAAQyC,EAAM;IAAO,IAAI;GAAE,GAAG,CAAC,GAC9HkP,EAAS,KAAKJ,IAAQ,GAAG3O,GAAGb,EAAM6B,EAAE,IAAI,GAAG;IAAE,QAAQ;IAAU,MAAMwM;IAAK,MAAM;GAAK,CAAC,IAExF,KAAK;GACL;EACF;EACA,KAAK;GAGH,AAFA,KAAK,IACDxM,EAAE,QAAM+N,EAAS,KAAKJ,IAAQ,GAAG3O,GAAGb,EAAM6B,EAAE,IAAI,GAAG;IAAE,QAAQ;IAAU,MAAMwM;IAAK,QAAQ;IAAM,OAAO3N,EAAM;GAAM,CAAC,GACxH,KAAK;GACL;EACF,KAAK;GACH,KAAKmB,EAAE;GACP;EACF,KAAK,WAAW;GACd,IAAMrM,IAAIsZ,EAAI,IAAIjN,EAAE,GAAG;GAIvB,AAHA,KAAK,GACL+N,EAAS,KAAK7O,EAAGvL,KAAK,GAAGqL,IAAI,GAAGE,EAAGvL,KAAK,GAAGqL,IAAI,GAAG;IAAE,QAAQ;IAAW,IAAI;GAAE,CAAC,CAAC,CAAC,KAAKE,EAAGvL,KAAK,GAAGqL,IAAI,GAAGE,EAAGvL,KAAK,GAAGqL,IAAI,GAAG;IAAE,QAAQ;IAAW,IAAI;GAAE,CAAC,GACrJoP,EAAM,IAAIza,GAAGqL,CAAC,GACd,KAAK;GACL;EACF;CACF;CAEF,KAAK,IAAIrL,IAAI,GAAGA,IAAIwC,GAAG,KAAK,OAAO6X,EAAOra,EAAE,CAAC,SAAQ,EAAWA,GAAGqL,CAAC;CACpE,KAAK,IAAMxH,KAAK2W,EAAK,OAAO,CAAC,GAAG,EAAE,KAAKnP;CACvC,KAAK;CACL,IAAM2P,IAAS/a,EAAE,WAAW,IACtB2G,KAASyE,KAAK2P,IAASf,IAAQ,KAAKlB;CAG1C,KAAK,IAAMlV,KAAK0W,GAAQ;EACtB,IAAMjK,IAAM,MAAMwJ,IAAUjW,EAAE,SAAS;EACvC,AAAIA,EAAE,KAAKA,EAAE,OACX,EAAE,KAAK0H,EAAG,IACV,EAAE,KAAKA,EAAG/I,IAAI;EAEhB,IAAMiH,IAAK,KAAK,IAAI,GAAG5F,EAAE,KAAKyM,CAAG,GAE3B2K,IAAMjR,EAAUnG,EAAE,MAAM,IAAI,EAAI,IAAI,IACpCmN,IAAS,CAACnN,EAAE,QAAQoX,IAAM,IAAIjR,EAAU,IAAInG,EAAE,MAAM,IAAI,EAAE,IAAIoX,GAAK,GAAGpX,EAAE,MAAM,KAAK,MAAM,KAAKmG,EAAU,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAC5HN,IAAK,KAAK,IAAI,KAAK,IAAIsQ,IAAQ,GAAGnW,EAAE,KAAKyM,CAAG,GAAGzM,EAAE,SAAS,SAAS,IAAI4F,IAAK,KAAK,IAAI,GAAGuH,CAAM,IAAI,EAAE;EAE1G,IADA,IAAQ,KAAK,IAAIgJ,GAAOtQ,IAAK,CAAC,GAC1B7F,EAAE,SAAS,QAAQ;GACrB,EAAQ,KAAK4F,GAAI5F,EAAE,IAAI6F,IAAKD,GAAI5F,EAAE,KAAKA,EAAE,IAAI,EAAE,MAAMA,EAAE,QAAQ,4BAA4B,GAAG,CAAC;GAC/F;EACF;EACA,IAAMqX,IAAS;GAAE,QAAQhQ,EAAM;GAAO,IAAI;EAAI;EAC9C,EAAO,KAAKzB,GAAI5F,EAAE,IAAI6F,IAAKD,GAAI5F,EAAE,KAAKA,EAAE,IAAIqX,CAAM;EAClD,IAAM1N,IAAKyN;EAYX,AAXAd,EAAO,KACL;GACE,CAAC1Q,GAAI5F,EAAE,EAAE;GACT,CAAC4F,IAAK+D,GAAI3J,EAAE,EAAE;GACd,CAAC4F,IAAK+D,GAAI3J,EAAE,KAAK,EAAE;GACnB,CAAC4F,IAAK+D,IAAK,GAAG3J,EAAE,KAAK,EAAE;GACvB,CAAC4F,GAAI5F,EAAE,KAAK,EAAE;EAChB,GACA;GAAE,MAAM;GAAW,QAAQqH,EAAM;GAAO,IAAI;EAAI,CAClD,GACAiP,EAAO,KAAK1Q,IAAK,GAAG5F,EAAE,KAAK,IAAIA,EAAE,MAAM;GAAE,MAAM;GAAI,MAAM;EAAK,CAAC,GAC3DA,EAAE,SAAOsW,EAAO,KAAK1Q,IAAK+D,IAAK,GAAG3J,EAAE,KAAK,IAAI,IAAIA,EAAE,MAAM,IAAI;GAAE,MAAM;GAAI,OAAOqH,EAAM;GAAK,QAAQ;EAAK,CAAC;EAC7G,KAAK,IAAMiQ,KAAMtX,EAAE,OAEjB,AADAsW,EAAO,KAAK1Q,GAAI0R,EAAG,GAAGzR,GAAIyR,EAAG,GAAG;GAAE,GAAGD;GAAQ,MAAM;EAAM,CAAC,GACtDC,EAAG,SAAOhB,EAAO,KAAK1Q,IAAK,IAAI0R,EAAG,IAAI,IAAI,IAAIA,EAAG,MAAM,IAAI;GAAE,MAAM;GAAI,QAAQ;EAAK,CAAC;CAE7F;CAGA,IAAMjZ,IAAM,IAAIkJ,EAAI,GACdgQ,IAAUjb,IAAM8Z;CACtB,KAAK,IAAIja,IAAI,GAAGA,IAAIwC,GAAG,KAAK,EAAI,KAAK+I,EAAGvL,IAAIob,GAAS7P,EAAGvL,IAAIya,EAAM,IAAIza,CAAC,MAAMgb,IAAS3P,IAAIA,IAAI,IAAI;EAAE,QAAQ;EAAW,IAAI;EAAG,MAAM;CAAM,CAAC;CAC3I,EAAI,IAAI6O,EAAQ,KAAK,CAAC;CACtB,KAAK,IAAMnY,KAAKuY,GAAM;EACpB,IAAMrT,IAAIsE,EAAGxJ,EAAE,KAAK,IAAIA,EAAE,QAAQ;EAClC,EAAI,KAAKkF,GAAGlF,EAAE,IAAI,IAAI,KAAK,IAAI,GAAGA,EAAE,KAAKA,EAAE,EAAE,GAAG;GAAE,MAAM;GAAW,QAAQmJ,EAAM;GAAQ,IAAI;EAAE,CAAC;CAClG;CAWA,OAVAhJ,EAAI,IAAIiY,EAAO,KAAK,CAAC,GACrBjY,EAAI,IAAIkY,EAAS,KAAK,CAAC,GACvBf,EAAG,SAAS,GAAG,MAAM;EAEnB,AADAJ,GAAgB/W,GAAKwG,GAAGc,EAAMxJ,IAAIuL,EAAGvL,IAAIG,IAAM8Z,IAAQzQ,EAAMxJ,EAAE,CAAC,CAAC,GAC7Dgb,KAAU,CAACP,EAAM,IAAIza,CAAC,KAAGiZ,GAAgB/W,GAAKwG,GAAGc,EAAMxJ,IAAIuL,EAAGvL,IAAIqL,CAAC;CACzE,CAAC,GACGpL,EAAE,UACJ,IAAQ,KAAK,IAAI+Z,GAAOhQ,EAAU/J,EAAE,OAAO,IAAI,EAAI,IAAI,EAAU,GACjEiC,EAAI,KAAK8X,IAAQ,GAAG,IAAa/Z,EAAE,OAAO;EAAE,QAAQ;EAAU,MAAM;EAAI,MAAM;CAAK,CAAC,IAE/E;EAAE,KAAKiC,EAAI,SAAS8X,GAAOpT,EAAM;EAAG,GAAG,KAAK,KAAKoT,CAAK;EAAG,GAAG,KAAK,KAAKpT,EAAM;CAAE;AACvF;AAEA,SAASmU,GAAY,GAAU,GAAW,GAAW,GAAW;CAC9D,IAAMrZ,IAAI,KAAK,IAAI,GAAGsI,EAAU,OAAOhK,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;CAEtD,AADA6N,EAAI,OAAO5G,GAAGoE,GAAG3J,GAAG,EAAE,MAAMwJ,EAAM,KAAK,CAAC,GACxC2C,EAAI,KAAK5G,GAAGoE,GAAG,OAAOrL,CAAC,GAAG;EAAE,QAAQ;EAAU,MAAM;EAAI,OAAO;EAAW,MAAM;CAAK,CAAC;AACxF;;ACzeA,SAAgBqb,GAAY,GAAoB;CAC9C,QAAQjP,EAAE,GAAV;EACE,KAAK,SACH,OAAOqD,EAAYrD,EAAE,KAAK;EAC5B,KAAK,YACH,OAAOgN,GAAehN,EAAE,GAAG;EAC7B,KAAK,OACH,OAAOoJ,GAAUpJ,EAAE,GAAG;EACxB,KAAK,SACH,OAAOiK,GAAYjK,EAAE,KAAK;EAC5B,KAAK,QACH,OAAO8K,GAAW9K,EAAE,MAAMA,EAAE,KAAK;CACrC;AACF;;ACXA,SAAgBkP,GAAe,GAAkD;CAC/E,IAAMnR,IAAOsI,EAAI,QAAQ,MAAM,EAAE,CAAC,CAAC,QAAQ,UAAU,IAAI,GACnDvQ,IAA2C,CAAC,GAC5CqZ,IAAK,yDACPnP;CACJ,OAAQ,IAAImP,EAAG,KAAKpR,CAAI,IAAI,EAAI,KAAK;EAAE,MAAMiC,EAAE,EAAE,CAAC,YAAY;EAAG,OAAOA,EAAE,EAAE,CAAC,MAAM,IAAI;CAAE,CAAC;CAE1F,OADKlK,EAAI,UAAQA,EAAI,KAAK;EAAE,MAAM;EAAO,OAAOiI,EAAK,MAAM,IAAI;CAAE,CAAC,GAC3DjI;AACT;AAEA,SAAgBsZ,GAAc,GAAsB;CAClD,OAAOF,GAAe7I,CAAG,CAAC,CAAC,KAAK,EAAE,SAAM,eAAYgJ,GAAW/Y,GAAM8H,CAAK,CAAC;AAC7E;AAEA,IAAakR,MAAkB,MAA4BF,GAAc/I,CAAG,CAAC,CAAC,IAAI4I,EAAW;AAE7F,SAASI,GAAW,GAAc,GAAsB;CACtD,IAAI/Y,MAAS,OAAO,OAAO;EAAE,GAAG;EAAS,OAAO6Q,GAASoI,EAAI,KAAK,IAAI,CAAC,CAAC,CAAC;CAAG;CAC5E,IAAM,EAAE,UAAO,UAAO,WAAQC,GAAMD,CAAG;CACvC,QAAQjZ,GAAR;EACE,KAAK,OACH;EACF,KAAK;EACL,KAAK,OACH,OAAO;GAAE,GAAG;GAAQ,MAAMkD,GAAK4E,GAAO9H,MAAS,KAAK;GAAG;EAAM;EAC/D,SACE,MAAM,IAAIvD,EAAa,kBAAkBuD,EAAK,gCAAgC;CAClF;CACA,QAAQmZ,GAAQrR,CAAK,GAArB;EACE,KAAK,YACH,OAAO;GAAE,GAAG;GAAS,OAAO;IAAE,GAAGsR,GAAStR,CAAK;IAAG;GAAM;EAAE;EAC5D,KAAK,YACH,OAAO;GAAE,GAAG;GAAY,KAAK;IAAE,GAAGuR,GAASvR,CAAK;IAAG;GAAM;EAAE;EAC7D,KAAK,SACH,OAAO;GAAE,GAAG;GAAS,OAAO;IAAE,GAAG1K,GAAM0K,GAAOhC,CAAG;IAAG;GAAM;EAAE;EAC9D,SACE,OAAO;GAAE,GAAG;GAAS,OAAO;IAAE,GAAGwT,GAAYxR,GAAOhC,CAAG;IAAG;GAAM;EAAE;CACtE;AACF;AAGA,SAAgByT,EAAM,GAAmB;CACvC,OAAO/P,EACLjM,EACG,KAAK,CAAC,CACN,QAAQ,aAAa,IAAI,CAAC,CAC1B,QAAQ,yEAAyE,GAAGmM,MAAMA,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,MAAMnF,MAAM,KAAA,CAAS,KAAK,EAAE,CAAC,CAC3I,QAAQ,8EAA8E,EAAE,CAAC,CACzF,QAAQ,cAAc,EAAE,CAAC,CACzB,QAAQ,QAAQ,IAAI,CACzB;AACF;AAGA,SAAS2U,GAAM,GAAuE;CACpF,IAAMpR,IAAkB,CAAC,GACrB2N,GACA3P,GACA0T,IAAsB,MACtBC,IAA8B,MAC9BC,IAAY;CAChB,KAAK,IAAIrb,KAAK4a,GAAK;EACjB,IAAIS,GAAW;GACb,IAAM,IAAIrb,EAAE,QAAQ,IAAI;GACxB,IAAI,IAAI,GAAG;GAEX,AADA,IAAIA,EAAE,MAAM,IAAI,CAAC,GACjB,IAAY;EACd;EACA,IAAIA,EAAE,QAAQ,cAAc,EAAE;EAC9B,IAAMoB,IAAIpB,EAAE,QAAQ,IAAI;EACxB,AAAIoB,KAAK,MACP,IAAIpB,EAAE,MAAM,GAAGoB,CAAC,GAChB,IAAY;EAEd,IAAMsG,IAAI1H,EAAE,KAAK;EACjB,IAAImb,GAAM;GACR,AAAIA,EAAK,KAAKzT,CAAC,MAAG,IAAO;GACzB;EACF;EACA,IAAI0T,GAAY;GACd,AAAI,iBAAiB,KAAK1T,CAAC,KACzB,IAAQwT,EAAME,EAAW,KAAK,IAAI,CAAC,GACnC,IAAa,QACRA,EAAW,KAAK1T,CAAC;GACxB;EACF;EACA,IAAI,CAACA,KAAKA,EAAE,WAAW,GAAG,GAAG;EAC7B,IAAI2D;EACJ,AAAI,qBAAqB,KAAK3D,CAAC,KAAK,oCAAoC,KAAKA,CAAC,KAAK,CAAC,yBAAyB,KAAKA,CAAC,IACjH,IAAO,iFAGL,+LAA+L,KAAKA,CAAC,OACpM,IAAI,uBAAuB,KAAKA,CAAC,KAChC2D,EAAE,KAAI,IAAQ6P,EAAM7P,EAAE,EAAE,IACvB,IAAa,CAAC,IAGjB,mCAAmC,KAAK3D,CAAC,IAC3C,IAAM,OAGJ,mCAAmC,KAAKA,CAAC,IAC3C,IAAM,OAGR+B,EAAM,KAAK/B,CAAC;CACd;CACA,OAAO;EAAE;EAAO;EAAO;CAAI;AAC7B;AAEA,SAASoT,GAAQ,GAAoE;CACnF,IAAMQ,KAAO,MAAe7R,EAAM,MAAM,MAAM+Q,EAAG,KAAKxa,CAAC,CAAC;CAOxD,OANIsb,EAAI,gBAAgB,KAAKA,EAAI,sBAAsB,KAAKA,EAAI,IAAI,KAAKA,EAAI,wDAAwD,IAAU,aAC3IA,EAAI,QAAQ,KAAKA,EAAI,UAAU,IAAU,UACzCA,EAAI,+GAA+G,KAAKA,EAAI,+BAA+B,IAAU,aACrKA,EAAI,8MAA8M,KAClNA,EAAI,kDAAkD,IAAU,gBAChEA,EAAI,4BAA4B,KAAKA,EAAI,+BAA+B,IAAU,aAC/E;AACT;AAIA,IAAMC,KAA8BhK,EAAK;CAAE,aAAa;CAAe,OAAO;CAAS,UAAU;CAAY,SAAS;CAAW,QAAQ;CAAU,UAAU;CAAY,aAAa;CAAe,OAAO;AAAQ,CAAC;AAErN,SAASyJ,GAAS,GAAiB;CACjC,IAAMha,IAAI,IAAI4W,GAAgB,GACxB4D,IAAwC,CAAC,GAC3CC,IAA6B,MAC7BC,IAAiE,MACjEzN,IAA4C,MAC1CvC,KAAM,MACAxM,EAAE,KAAK,CAAC,CAAC,QAAQ,YAAY,IAChC;CAET,KAAK,IAAMc,KAAKyJ,GAAO;EACrB,IAAIgS,GAAW;GACb,AAAI,kCAAkC,KAAKzb,CAAC,KACtC0b,KAAQA,EAAK,IAAI,UAAQ1a,EAAE,KAAK;IAAE,GAAG;IAAQ,KAAK0a,EAAK;IAAK,KAAKA,EAAK;IAAK,MAAMR,EAAMO,EAAU,KAAK,IAAI,CAAC;GAAE,CAAC,GAClH,IAAY,QACPA,EAAU,KAAKzb,CAAC;GACvB;EACF;EACA,IAAIqL;EACJ,IAAK,IAAI,gGAAgG,KAAKrL,CAAC,GAAI;GACjH,IAAI2b,IAAOtQ,EAAE,EAAE,CAAC,QAAQ,oBAAoB,EAAE,CAAC,CAAC,KAAK,GAC/CwC,IAAM,gBAAgB,KAAK8N,CAAI;GAErC,AADI9N,MAAK,IAAO8N,EAAK,MAAM,GAAG9N,EAAI,KAAK,CAAC,CAAC,KAAK,IAC9C,IAAO8N,EAAK,QAAQ,cAAc,EAAE,CAAC,CAAC,KAAK;GAC3C,IAAIC,IAAMD,GACNpT,IAAQoT,GACNE,IAAM,2BAA2B,KAAKF,CAAI,GAC1CG,IAAM,6BAA6B,KAAKH,CAAI;GAIlD,AAHIE,IAAK,CAACD,GAAKrT,KAAS,CAACsT,EAAI,IAAIA,EAAI,EAAE,IAC9BC,IAAK,CAACF,GAAKrT,KAAS,CAACuT,EAAI,IAAIA,EAAI,EAAE,IACvC,IAAM,IAAQpQ,EAAGiQ,CAAI,GAC1B3a,EAAE,YAAY4a,GAAK;IAAE,MAAML,GAAKlQ,EAAE,EAAE,CAAC,YAAY;IAAI,OAAO6P,EAAM3S,CAAK;IAAG,MAAMsF,IAAM3D,EAAM2D,EAAI,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK3D,EAAM2D,EAAI,EAAE,IAAI,KAAA;GAAU,CAAC;GAC3I;EACF;EACA,IAAI,oBAAoB,KAAK7N,CAAC,GAAG;GAC/B,EAAE,EAAE,SAAS;GACb;EACF;EACA,IAAI,iBAAiB,KAAKA,CAAC,GAAG;GAC5B,EAAE,EAAE,aAAa,CAAC,YAAY,KAAKA,CAAC;GACpC;EACF;EACA,IAAK,IAAI,0CAA0C,KAAKA,CAAC,GAAI;GAC3D,IAAM+b,IAAMrQ,EAAGL,EAAE,EAAE;GACnB,AAAIA,EAAE,EAAE,CAAC,YAAY,MAAM,YAAWrK,EAAE,KAAK;IAAE,GAAG;IAAW;GAAI,CAAC,IAC7DA,EAAE,KAAK;IAAE,GAAG;IAAO;IAAK,IAAIqK,EAAE,EAAE,CAAC,YAAY,MAAM;GAAW,CAAC;GACpE;EACF;EACA,IAAK,IAAI,qBAAqB,KAAKrL,CAAC,GAAI;GACtC,IAAMoB,IAAIoa,EAAM,IAAI,MAAMvN,IAAO;IAAE,MAAMA,EAAK;IAAM,IAAIA,EAAK;GAAG,IAAI;GACpE,AAAI7M,KAAGJ,EAAE,KAAK;IAAE,GAAG;IAAO,MAAMI,EAAE;IAAI,IAAIA,EAAE;IAAM,MAAM8Z,EAAM7P,EAAE,EAAE;IAAG,QAAQ;IAAM,MAAM;IAAU,YAAY;GAAK,CAAC;GACrH;EACF;EACA,KAAK,IAAI,oFAAoF,KAAKrL,CAAC,OAAO,IAAI,6CAA6C,KAAKA,CAAC,IAAI;GACnK,IAAMwD,KAAO6H,EAAE,MAAM,OAAA,CAAQ,YAAY,GACrC0Q,IAAM1Q,EAAE,KAAKA,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAIK,CAAE,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC;GAG5D,AAFI,CAACqQ,EAAI,UAAU9N,MAAM,IAAM,CAACzK,MAAQ,SAASyK,EAAK,OAAOA,EAAK,EAAE,IAChE,CAAC8N,EAAI,UAAU/a,EAAE,EAAE,aAAa,WAAQ,IAAM,CAACA,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,IACrEqK,EAAE,OAAO,KAAA,KAGX,IAAY,CAAC,GACb,IAAO;IAAE;IAAK;GAAI,KAHd0Q,EAAI,UAAQ/a,EAAE,KAAK;IAAE,GAAG;IAAQ;IAAK;IAAK,MAAMka,EAAM7P,EAAE,EAAE;GAAE,CAAC;GAKnE;EACF;EACA,IAAK,IAAI,8BAA8B,KAAKrL,CAAC,GAAI;GAC/C,IAAMsY,IAAKtX,EAAE,EAAE;GACf,AAAIsX,EAAG,UAAQtX,EAAE,KAAK;IAAE,GAAG;IAAQ,KAAK;IAAQ,KAAK,CAACsX,EAAG,EAAE,CAAC,IAAIA,EAAGA,EAAG,SAAS,EAAE,CAAC,EAAE;IAAG,MAAM4C,EAAM7P,EAAE,EAAE;GAAE,CAAC;GAC1G;EACF;EACA,IAAK,IAAI,sDAAsD,KAAKrL,CAAC,GAAI;GACvE,IAAM2B,IAAO0J,EAAE,EAAE,CAAC,YAAY;GAC9B,EAAE,KAAK;IAAE,GAAG;IAAS,MAAM1J,MAAS,UAAUuZ,EAAM7P,EAAE,EAAE,KAAK,UAAU1J;IAAM,OAAOA,MAAS,UAAU,KAAKuZ,EAAM7P,EAAE,EAAE;GAAE,CAAC;GACzH;EACF;EACA,IAAK,IAAI,mBAAmB,KAAKrL,CAAC,GAAI;GACpC,EAAE,KAAK;IAAE,GAAG;IAAQ,OAAOkb,EAAM7P,EAAE,EAAE;GAAE,CAAC;GACxC;EACF;EACA,IAAI,SAAS,KAAKrL,CAAC,GAAG;GACpB,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;GACnB;EACF;EACA,IAAI,sBAAsB,KAAKA,CAAC,GAAG;EACnC,IAAK,IAAI,oBAAoB,KAAKA,CAAC,GAAI;GACrC,EAAE,KAAK;IAAE,GAAG;IAAW,MAAMkb,EAAM7P,EAAE,EAAE;GAAE,CAAC;GAC1C;EACF;EACA,IAAK,IAAI,iCAAiC,KAAKrL,CAAC,GAAI;GAClD,EAAE,KAAK;IAAE,GAAG;IAAS,MAAMkb,EAAM7P,EAAE,EAAE;GAAE,CAAC;GACxC;EACF;EACA,KAAK,IAAI,kBAAkB,KAAKrL,CAAC,MAAMA,MAAM,OAAO;GAClD,EAAE,KAAK;IAAE,GAAG;IAAS,GAAGqL,IAAI,KAAK,KAAK,IAAI,KAAK,OAAOA,EAAE,EAAE,CAAC,IAAI;GAAG,CAAC;GACnE;EACF;EACA,IAAM2Q,IAAMC,GAAWjc,CAAC;EACxB,IAAIgc,GAAK;GACP,IAAM,EAAE,SAAM,OAAI,WAAQ,SAAM,SAAM,QAAK,YAASA;GAMpD,AALAhb,EAAE,KAAK;IAAE,GAAG;IAAO;IAAM;IAAI;IAAM;IAAQ;IAAM;IAAM,UAAUkb,MAAQ;IAAM,YAAYA,MAAQ;GAAK,CAAC,GACzG,IAAO;IAAE;IAAM;GAAG,GACdA,MAAQ,QAAMV,EAAM,KAAK;IAAE;IAAM;GAAG,CAAC,GACrCU,MAAQ,QAAQV,EAAM,UAAQA,EAAM,IAAI,GACxCU,MAAQ,QAAMlb,EAAE,YAAY6S,CAAE,GAC9BqI,MAAQ,QAAMlb,EAAE,KAAK;IAAE,GAAG;IAAW,KAAK6S;GAAG,CAAC;EACpD;CACF;CACA,OAAO7S,EAAE;AACX;AAEA,IAAMmb,KAAQ;AAEd,SAASF,GAAW,GAAW;CAE7B,IAAM5Q,IAAI8Q,GAAM,KAAKnc,EAAE,QAAQ,0BAA0B,KAAK,CAAC;CAC/D,IAAI,CAACqL,GAAG,OAAO;CACf,IAAM,GAAGtK,GAAGyV,GAAM7M,KAAQ4M,KAASrG,GAAGgM,GAAK9S,KAAQiC;CAEnD,IADI,CAACmL,KAAQ,CAACD,KACV,CAACxV,KAAK,CAACmP,GAAG,OAAO;CACrB,IAAM2K,KAAS,MAAc3b,EAAE,QAAQ,YAAY,IAAI,GACnD0U,IAAOiH,EAAM9Z,CAAC,GACd8S,IAAKgH,EAAM3K,CAAC;CAChB,IAAI0D,MAAS,OAAOA,MAAS,OAAOC,MAAO,OAAOA,MAAO,KAAK,OAAO;CACrE,IAAMuI,IAASzS,MAAS,QAAQA,EAAK,WAAW,GAAG,GAC7C0S,KAAU,MAAqCnd,IAAaA,MAAM,QAAQA,MAAM,OAAO,SAASA,EAAE,UAAU,QAAQ,KAAKA,CAAC,IAAI,SAAS,WAApF,QACrD4O,GACAxH,IAAO;CASX,OARIkQ,KAAQD,KACV,IAAO8F,EAAO9F,CAAK,GACnB,IAAO,MACEC,KACR,CAAC5C,GAAMC,KAAM,CAACA,GAAID,CAAI,GACvB,IAAOyI,EAAO7F,CAAI,KACb,IAAO6F,EAAO9F,CAAK,GACtB,QAAQ,KAAKvW,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQkQ,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAACsG,MAAM,IAAO,UAClE;EAAE;EAAM;EAAI;EAAQ;EAAM;EAAM;EAAK,MAAM0E,EAAM9R,KAAQ,EAAE;CAAE;AACtE;AAIA,IAAMkT,KAAiC/K,EAAK;CAC1C,OAAO;CAAS,QAAQ;CAAS,SAAS;CAAW,WAAW;CAAa,MAAM;CAAS,UAAU;CAAY,OAAO;CAAS,QAAQ;CAAU,OAAO;CAC3J,SAAS;CAAU,UAAU;CAAQ,MAAM;CAAQ,SAAS;CAAW,OAAO;CAAW,OAAO;CAAQ,MAAM;CAAQ,WAAW;CAAQ,OAAO;CAAQ,OAAO;CAC/J,UAAU;CAAU,SAAS;CAAU,QAAQ;CAAQ,aAAa;CAAQ,SAAS;CAAW,WAAW;CAAQ,QAAQ;CAAU,MAAM;CAAS,QAAQ;CAAS,SAAS;CAC9K,QAAQ;CAAQ,SAAS;CAAS,UAAU;CAAW,QAAQ;CAAQ,KAAK;CAAQ,MAAM;CAAQ,SAAS;CAAW,OAAO;AAC/H,CAAC,GACKgL,qBAAU,IAAI,IAAI;CAAC;CAAS;CAAY;CAAkB;CAAa;CAAQ;CAAc;CAAU;CAAY;CAAU;CAAa;CAAa;CAAc;CAAU;CAAO;AAAM,CAAC,GAE7LC,KAA8BjL,EAAK;CACvC,KAAK;CAAS,KAAK;CAAS,MAAM;CAAY,MAAM;CAAY,KAAK;CAAY,KAAK;CAAW,GAAG;CAAY,KAAK;CAAY,GAAG;CAAS,KAAK;CAClJ,KAAK;CAAQ,KAAK;CAAQ,MAAM;CAAQ,MAAM;CAAQ,MAAM;CAAY,MAAM;CAAY,MAAM;CAAO,MAAM;CAAa,MAAM;CAAa,MAAM;CAAY,MAAM;AACvK,CAAC,GAEKkL,KAAM,OAAO,GAAG,wFAChBC,KAAO,IAAI,OACf,OAAO,GAAG,KAAKD,GAAI,mPAAmPA,GAAI,qBAC1Q,GACF;AAQA,SAASxB,GAAY,GAAiB,GAAmB;CACvD,IAAMja,IAAI,IAAIwK,EAAa/D,KAAO,MAAM,MAAM,GACxCkV,oBAAO,IAAI,IAAuB,GAClCC,IAAe,CAAC,GAChBC,IAAuB,CAAC,GAC1BC,IAA4C,MAC5CrB,IAA6B,MAC7BsB,GACAC,IAAS,IACTC,IAAQ,GACRhK,IAAO,GACLpJ,UAAY+S,EAAGA,EAAG,SAAS,IAE3BM,KAAW,MAAwB;EACvC,IAAI,IAAItC,EAAI,KAAK,GACbvP;EAQJ,OAPI,MAAM,QAAc,WACnB,IAAI,aAAa,KAAK,CAAC,KAAW8R,EAAO9R,EAAE,IAAI,WAAW,KAC1D,IAAI,aAAa,KAAK,CAAC,KAAW8R,EAAO9R,EAAE,IAAI,SAAS,KACxD,IAAI,WAAW,KAAK,CAAC,KAAW8R,EAAO9R,EAAE,IAAI,OAAO,KACpD,IAAI,uBAAuB,KAAK,CAAC,KAAW8R,EAAO9R,EAAE,IAAI,QAAQ,KACtE,IAAI,EAAE,QAAQ,YAAY,IAAI,GAC1B,CAACrK,EAAE,IAAI,CAAC,KAAK,CAACA,EAAE,UAAU,CAAC,KAAGA,EAAE,KAAK,GAAG,EAAE,OAAOka,EAAM,CAAC,EAAE,GAAGrR,EAAI,CAAC,GAC/D;CACT,GACMsT,KAAU,GAAc,MAAiB;EAC7C,IAAMzR,IAAKN,EAAK,KAAK;EAErB,OADI,CAACpK,EAAE,IAAI0K,CAAE,KAAK,CAAC1K,EAAE,UAAU0K,CAAE,KAAG1K,EAAE,KAAK0K,GAAI;GAAE,OAAOwP,EAAMxP,CAAE;GAAG;EAAM,GAAG7B,EAAI,CAAC,GAC1E6B;CACT;CACA,KAAK,IAAM1L,KAAKyJ,GAAO;EACrB,IAAIgS,GAAW;GACb,AAAI,gBAAgB,KAAKzb,CAAC,KACxBgB,EAAE,KAAKgc,GAAQ;IAAE,OAAO9B,EAAMO,EAAU,KAAK,IAAI,CAAC;IAAG,OAAO;IAAQ,OAAO;KAAE,MAAM;KAAW,QAAQ;IAAU;GAAE,GAAG5R,EAAI,CAAC,GACtHkT,KAAY/b,EAAE,KAAK;IAAE,MAAM+b;IAAY,IAAIC;IAAQ,MAAM;IAAU,MAAM;GAAO,CAAC,GACrF,IAAY,QACPvB,EAAU,KAAKzb,CAAC;GACvB;EACF;EACA,IAAI8c,GAAM;GACR,IAAI9c,MAAM,KAAK;IACb,IAAO;IACP;GACF;GACA,AAAI,yCAAyC,KAAKA,CAAC,IAAG8c,EAAK,EAAE,SAAS,KAAK,CAAC,CAAC,IACxEA,EAAK,EAAE,SAASA,EAAK,EAAE,SAAS,SAAS,EAAE,CAAC,KAAK5B,EAAMlb,EAAE,QAAQ,qDAAqD,EAAE,CAAC,CAAC;GAC/H;EACF;EACA,IAAIqL;EACJ,IAAIrL,MAAM,OAAO,oEAAoE,KAAKA,CAAC,GAEzF,AADA4c,EAAG,IAAI,GACPC,EAAW,IAAI;OAIjB,IAAK,IAAI,mFAAmF,KAAK7c,CAAC,GAAI;GACpG,IAAMod,IAASF,EAAQ7R,EAAE,EAAE,GACrBgS,IAAM,SAAS;GACrB,AAAIhS,EAAE,OAAO,KAAA,KAIX,IAAY,CAAC,GACb,IAAa+R,GACb,IAASC,MALTrc,EAAE,KAAKqc,GAAK;IAAE,OAAOnC,EAAM7P,EAAE,EAAE;IAAG,OAAO;IAAQ,OAAO;KAAE,MAAM;KAAW,QAAQ;IAAU;GAAE,GAAGxB,EAAI,CAAC,GACvG7I,EAAE,KAAK;IAAE,MAAMoc;IAAQ,IAAIC;IAAK,MAAM;IAAU,MAAM;GAAO,CAAC;EAOlE,OACA,IAAK,IAAI,mCAAmC,KAAKrd,CAAC,GAChD,EAAE,KAAKqL,EAAE,IAAI;GAAE,OAAO6P,EAAM7P,EAAE,EAAE;GAAG,OAAO;GAAQ,OAAO;IAAE,MAAM;IAAW,QAAQ;GAAU;EAAE,GAAGxB,EAAI,CAAC;OAG1G,IAAK,IAAI,uBAAuB,KAAK7J,CAAC,GAGpC,AAFA,IAAY,CAAC,GACb,IAAa,KAAA,GACb,IAASqL,EAAE;OAIb,IAAK,IAAI,wNAAwN,KAAKrL,CAAC,GAAI;GACzO,IAAM2B,IAAO0J,EAAE,EAAE,CAAC,YAAY,GACxB9C,IAAQ8C,EAAE,MAAMA,EAAE,MAAM,IACxB4I,IAAM5I,EAAE,OAAOA,EAAE,MAAMA,EAAE,MAAM,UAAU,QACzCjK,IAAIJ,EAAE,QAAQiT,GAAKtS,MAAS,aAAa,KAAKuZ,EAAM3S,CAAK,GAAGsB,EAAI,CAAC,GACjEmM,IAAO3K,EAAE,KAAKnB,EAAMmB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAKnB,EAAMmB,EAAE,EAAE,IAAI,KAAA;GAI1D,AAHI2K,MAAM,EAAE,QAAQ,EAAE,QAAK,IACvBrU,MAAS,eAAY,EAAE,QAAQ;IAAE,MAAM;IAAQ,QAAQ;GAAO,IAClEib,EAAG,KAAK3I,CAAG,GACX4I,EAAW,KAAKlb,CAAI;EAEtB,OAEA,KAAK,IAAI,8PAA8P,KAAK3B,CAAC,MAAMuc,GAAQ,IAAIlR,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,GAAG;GACtU,IAAM1J,IAAO0J,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,QAAQ,OAAO,GAAG,GAC5C4I,IAAM5I,EAAE,MAAMA,EAAE,MAAMA,EAAE,IACxB9C,IAAQ8C,EAAE,MAAMA,EAAE,MAAM4I,GACxBqJ,IAAUjS,EAAE,KAAK,IAAIA,EAAE,GAAG,KAAK;GACrC,EAAE,KAAK4I,GAAK;IAAE,OAAOiH,EAAM3S,CAAK,IAAI+U;IAAS,OAAO;GAAO,GAAGzT,EAAI,CAAC;GACnE,IAAM,IAAe8S,EAAK,IAAI1I,CAAG,KAAK;IAAE;IAAM,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;GAAE;GAEjE,AADA,EAAE,OAAOtS,GACL0J,EAAE,OAAI,EAAE,SAASA,EAAE,EAAE,CAAC,QAAQ,YAAY,EAAE,CAAC,CAAC,KAAK;GACvD,IAAM2K,IAAO3K,EAAE,KAAKnB,EAAMmB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAKnB,EAAMmB,EAAE,EAAE,IAAI,KAAA;GAG1D,AAFI2K,MAAM,EAAE,KAAK/B,CAAG,CAAC,CAAC,QAAQ,EAAE,QAAK,IACrC0I,EAAK,IAAI1I,GAAK,CAAC,GACX5I,EAAE,OAAO,CAACA,EAAE,QACd,EAAE,WAAW,CAAC,CAAC,CAAC,GAChB,IAAO;IAAE,IAAI4I;IAAK;GAAE;EAGxB,OAEA,IAAK,IAAI,gQAAgQ,KAAKjU,CAAC,GAAI;GACjR,IAAM2B,IAAO0J,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,QAAQ,KAAK,EAAE,GAC3CsQ,IAAOtQ,EAAE,EAAE,CAAC,KAAK,GACfwC,IAAM,kBAAkB,KAAK8N,CAAI;GACvC,AAAI9N,MAAK,IAAO8N,EAAK,MAAM,GAAG9N,EAAI,KAAK,CAAC,CAAC,KAAK;GAC9C,IAAM0P,IAAS,mBAAmB,KAAK5B,CAAI;GAC3C,AAAI4B,MAAQ,IAAO5B,EAAK,MAAM,GAAG4B,EAAO,KAAK,CAAC,CAAC,KAAK;GACpD,IAAI7R,IAAKiQ,GACLpT,IAAQoT,GACN9G,IAAK,sBAAsB,KAAK8G,CAAI;GAC1C,IAAI9G,GAAI;IACN,IAAM,CAAC3O,GAAGoE,KAAK,CAACuK,EAAG,EAAE,CAAC,KAAK,GAAGA,EAAG,EAAE,CAAC,KAAK,CAAC;IAE1C,AAAI,UAAU,KAAK3O,CAAC,IAAG,CAACqC,GAAOmD,KAAM,CAACxF,GAAGoE,CAAC,IACrC,CAACoB,GAAInD,KAAS,CAACrC,GAAGoE,CAAC;GAC1B;GAEA,AADA,IAAQ/B,EAAM,QAAQ,kCAAkC,QAAQ,GAChE,IAAKmD,EAAG,QAAQ,kCAAkC,QAAQ,CAAC,CAAC,QAAQ,YAAY,IAAI;GACpF,IAAM8L,IAAQ7V,MAAS,YAAY,YAAYA,MAAS,UAAU,UAAW2a,GAAQ3a,MAAS,QACxFF,IAAIT,EAAE,KAAK0K,GAAI;IAAE,OAAOwP,EAAM3S,CAAK,KAAKgV,IAAS,MAAMA,EAAO,GAAG,KAAK;IAAK;GAAM,GAAG1T,EAAI,CAAC,GACzFmM,IAAOnI,IAAM3D,EAAM2D,EAAI,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK3D,EAAM2D,EAAI,EAAE,IAAI,KAAA;GAC7D,AAAImI,MAAM,EAAE,QAAQ;IAAE,GAAGvU,EAAE;IAAO;GAAK;EAEzC,OAEA,IAAK,IAAI,qDAAqD,KAAKzB,CAAC,GAAI;GACtE,IAAM0L,IAAKwR,EAAQ7R,EAAE,EAAE;GACvB,IAAIA,EAAE,IAAI;IACR,IAAM5J,IAAIT,EAAE,IAAI0K,CAAE;IAElB,AADA1K,EAAE,KAAKqK,EAAE,IAAI;KAAE,OAAO5J,EAAE;KAAO,OAAOA,EAAE;IAAM,GAAGoI,EAAI,CAAC,GACtD7I,EAAE,EAAE,MAAM,OAAOA,EAAE,EAAE,MAAM,QAAQS,CAAC,GAAG,CAAC;GAC1C;EAEF,OACA,IAAK,IAAIib,GAAK,KAAK1c,CAAC,GAAI;GACtB,IAAM,GAAGwd,GAAIC,GAAIC,GAAIC,KAAMC,GAASC,KAAMC,GAAIC,GAAIC,GAAIzV,KAAS8C,GAC3DtK,IAAImc,EAAQM,CAAE,GACdtN,IAAIgN,EAAQc,CAAE,GACZrU,IAAOgU,IAAKE,GACdhN,IAAO6M,IAAKlB,GAAMkB,MAAO,SAAS,QAClC5P,IAAOgQ,IAAKtB,GAAMsB,MAAO,SAAS,QAClC5M,IAAKuM,GACLQ,IAAKF;GAET,AAAI,sBAAsB,KAAKH,CAAO,MACnC,CAAC7c,GAAGmP,KAAK,CAACA,GAAGnP,CAAC,GACd,CAAC8P,GAAM/C,KAAQ,CAACA,GAAM+C,CAAI,GAC1B,CAACK,GAAI+M,KAAM,CAACA,GAAI/M,CAAE;GAErB,IAAM5F,IAAW;IAAE,MAAMvK;IAAG,IAAImP;IAAG;IAAM;IAAM,MAAMvG,EAAK,SAAS,GAAG,IAAI,WAAWA,EAAK,SAAS,GAAG,IAAI,UAAUA,EAAK,SAAS,GAAG,IAAI,WAAW;GAAQ;GAI5J,AAHIpB,MAAO,EAAE,QAAQ2S,EAAM3S,EAAM,QAAQ,4BAA4B,EAAE,CAAC,IACpE2I,MAAI,EAAE,YAAYA,IAClB+M,MAAI,EAAE,YAAYA,IACtBjd,EAAE,KAAKsK,CAAC;EAEV,OAEA,KAAK,IAAI,yBAAyB,KAAKtL,CAAC,OAAO2c,EAAK,IAAItR,EAAE,EAAE,KAAKrK,EAAE,IAAIqK,EAAE,EAAE,IAAI;GAC7E,IAAMjK,IAAIub,EAAK,IAAItR,EAAE,EAAE,KAAK;IAAE,MAAM;IAAS,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;GAAE;GAChE,EAAK,IAAIA,EAAE,IAAIjK,CAAC;GAChB,IAAM8c,IAAMhD,EAAM7P,EAAE,EAAE;GACtB,AAAI6S,EAAI,SAAS,GAAG,KAAK9c,EAAE,SAAS,SAAS,IAAGA,EAAE,SAAS,EAAE,CAAC,KAAK8c,CAAG,IACjE9c,EAAE,SAAS,EAAE,CAAC,KAAK8c,CAAG;EAE7B;CACF;CAEA,IAAM/P,IAAQnN,EAAE,IAAI,OAAO;CAC3B,IAAImN,KAASA,EAAM,UAAU,WAAWnN,EAAE,EAAE,MAAM,MAAM,MAAM,EAAE,SAAS,WAAW,EAAE,OAAO,OAAO,GAAG;EAErG,AADA,EAAM,QAAQ,SACd,EAAM,QAAQ;EACd,IAAMmd,IAAMnd,EAAE,EAAE,MAAM,QAAQ,MAAM,EAAE,OAAO,OAAO;EACpD,IAAImd,EAAI,QAAQ;GACd,EAAE,KAAK,SAAS;IAAE,OAAO;IAAO,OAAO;GAAG,CAAC;GAC3C,KAAK,IAAM7S,KAAK6S,GAAK,EAAE,KAAK;EAC9B;CACF;CACA,KAAK,IAAM1c,KAAKT,EAAE,EAAE,OAAO;EACzB,IAAMI,IAAIub,EAAK,IAAIlb,EAAE,EAAE;EACvB,IAAI,CAACL,GAAG;EACR,IAAMgd,IAAqB,CAAC,GACtBb,IAASnc,EAAE,WAAWA,EAAE,SAAS,cAAc,cAAcA,EAAE,SAAS,SAAS,gBAAgBA,EAAE,SAAS,eAAe,eAAeA,EAAE,SAAS,cAAcA,EAAE,SAAS,mBAAmB,aAAa,KAAA;EAEpN,AADImc,KAAQa,EAAO,KAAK,CAAC,IAAIb,EAAO,EAAE,CAAC,GACvCa,EAAO,KAAK,CAAC3c,EAAE,KAAK,CAAC;EACrB,IAAM4c,IAAsB,CAAC;GAAE,MAAMD;GAAQ,MAAM;GAAM,QAAQ;GAAM,QAAQhd,EAAE,KAAK,WAAW,UAAU;EAAE,CAAC;EAC9G,KAAK,IAAMlC,KAAKkC,EAAE,UAAU,EAAS,KAAK,EAAE,MAAMlC,EAAE,KAAK,MAAM,CAACgH,CAAC,CAAC,EAAE,CAAC;EACrE,EAAE,WAAWmY;CACf;CACA,OAAOrd,EAAE;AACX;AAIA,SAASjC,GAAM,GAAiB,GAAmB;CACjD,IAAMiC,IAAI,IAAIwK,EAAa/D,KAAO,MAAM,OAAO,GACzC6L,IAAkB,CAAC,GACnBgL,oBAAO,IAAI,IAAsB,GACnCrB,IAAQ,GACRxB,IAA6B,MAC7B8C,GACE1U,UAAYyJ,EAAMA,EAAM,SAAS,IACjClD,KAAM,GAAa,MAA8B;EACrD,IAAM1E,IAAKkP,EAAI,KAAK,CAAC,CAAC,QAAQ,YAAY,IAAI;EAC9C,IAAIlP,MAAO,OAAO;GAChB,IAAM8S,IAAM,GAAG3U,EAAI,KAAK,GAAG,IAAI4U,IAAW,QAAQ;GAElD,OADAzd,EAAE,KAAKwd,GAAK;IAAE,OAAO;IAAI,OAAOC,IAAW,QAAQ;GAAQ,GAAG5U,EAAI,CAAC,GAC5D2U;EACT;EAEA,OADI,CAACxd,EAAE,UAAU0K,CAAE,KAAK,CAAC1K,EAAE,IAAI0K,CAAE,KAAG1K,EAAE,KAAK0K,GAAI,EAAE,OAAOA,EAAG,GAAG7B,EAAI,CAAC,GAC5D6B;CACT;CACA,KAAK,IAAM1L,KAAKyJ,GAAO;EACrB,IAAIgS,GAAW;GACb,IAAI,gBAAgB,KAAKzb,CAAC,GAAG;IAC3B,IAAMqd,IAAM,SAAS;IAGrB,AAFArc,EAAE,KAAKqc,GAAK;KAAE,OAAOnC,EAAMO,EAAU,KAAK,IAAI,CAAC;KAAG,OAAO;KAAQ,OAAO;MAAE,MAAM;MAAW,QAAQ;KAAU;IAAE,GAAG5R,EAAI,CAAC,GACnH0U,KAASvd,EAAE,KAAK;KAAE,MAAMud;KAAS,IAAIlB;KAAK,MAAM;KAAU,MAAM;IAAO,CAAC,GAC5E,IAAY;GACd,OAAO,EAAU,KAAKrd,CAAC;GACvB;EACF;EACA,IAAIA,MAAM,QAAQA,MAAM,MAAM;EAC9B,IAAIqL;EACJ,IAAK,IAAI,sHAAsH,KAAKrL,CAAC,GAAI;GACvI,IAAM0L,KAAML,EAAE,MAAMA,EAAE,MAAMA,EAAE,GAAA,CAAI,QAAQ,YAAY,IAAI,GACpD9C,IAAQ8C,EAAE,MAAMA,EAAE,MAAMK,GACxB/J,IAAO0J,EAAE,EAAE,EAAE,YAAY;GAC/B,IAAIA,EAAE,IAAI;IAER,AADArK,EAAE,QAAQ0K,GAAIwP,EAAM3S,CAAK,GAAGsB,EAAI,CAAC,GACjCyJ,EAAM,KAAK5H,CAAE;IACb;GACF;GACA,IAAM8L,IACJ7V,MAAS,UAAUA,MAAS,SAAS,QAAQA,MAAS,WAAW,YAAYA,MAAS,WAAWA,MAAS,eAAe,UAAUA,MAAS,SAASA,MAAS,cAAc,QAAQ,KAAA;GACtL,EAAE,KAAK+J,GAAI;IAAE,OAAO8L,IAAQ,KAAK0D,EAAM3S,CAAK;IAAG;GAAM,GAAGsB,EAAI,CAAC;GAC7D,IAAMmM,IAAO3K,EAAE,KAAKnB,EAAMmB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAKnB,EAAMmB,EAAE,EAAE,IAAI,KAAA;GAC1D,AAAI2K,MAAM,EAAE,KAAKtK,CAAE,CAAC,CAAC,QAAQ,EAAE,QAAK;EAEtC,OACA,IAAI1L,MAAM,KACR,EAAM,IAAI;OAGZ,IAAK,IAAI,iEAAiE,KAAKA,CAAC,GAAI;GAClF,IAAIqL,EAAE,OAAO,KAAA,GAAW;IACtB,IAAMgS,IAAM,SAAS;IAErB,AADArc,EAAE,KAAKqc,GAAK;KAAE,OAAOnC,EAAM7P,EAAE,EAAE;KAAG,OAAO;KAAQ,OAAO;MAAE,MAAM;MAAW,QAAQ;KAAU;IAAE,GAAGxB,EAAI,CAAC,GACvG7I,EAAE,KAAK;KAAE,MAAMoP,EAAG/E,EAAE,IAAI,EAAK;KAAG,IAAIgS;KAAK,MAAM;KAAU,MAAM;IAAO,CAAC;GACzE,OAEE,AADA,IAAY,CAAC,GACb,IAAUjN,EAAG/E,EAAE,IAAI,EAAK;EAG5B,OACA,IAAK,IAAI,kKAAkK,KAAKrL,CAAC,GAAI;GACnL,IAAIe,IAAIqP,EAAG/E,EAAE,IAAI,EAAK,GAClB6E,IAAIE,EAAG/E,EAAE,IAAI,EAAI,GACjBqT,IAAM;GAKV,AAJI,mBAAmB,KAAKrT,EAAE,EAAE,MAC7B,CAACtK,GAAGmP,KAAK,CAACA,GAAGnP,CAAC,GACf,IAAM,KAERC,EAAE,KAAK;IAAE,MAAMD;IAAG,IAAImP;IAAG,MAAMwO,IAAM,SAAS;IAAS,MAAMA,IAAM,UAAU;IAAQ,MAAMrT,EAAE,EAAE,CAAC,SAAS,GAAG,IAAI,WAAW;IAAS,OAAOA,EAAE,KAAK6P,EAAM7P,EAAE,EAAE,IAAI,KAAA;GAAU,CAAC;EAE7K,OACA,CAAK,IAAI,6BAA6B,KAAKrL,CAAC,OAC1CoQ,EAAG/E,EAAE,IAAI,EAAK,GACdiT,EAAK,IAAIjT,EAAE,IAAI,CAAC,GAAIiT,EAAK,IAAIjT,EAAE,EAAE,KAAK,CAAC,GAAI6P,EAAM7P,EAAE,EAAE,CAAC,CAAC;CAE3D;CACA,KAAK,IAAM5J,KAAKT,EAAE,EAAE,OAAO;EACzB,IAAM6B,IAAIyb,EAAK,IAAI7c,EAAE,EAAE;EACvB,AAAIoB,KAAKpB,EAAE,UAAU,YAAS,EAAE,WAAW,CAAC;GAAE,MAAM,CAAC,CAACA,EAAE,KAAK,CAAC;GAAG,MAAM;GAAM,QAAQ;EAAK,GAAG,EAAE,MAAMoB,EAAE,KAAK,MAAM,CAACqD,CAAC,CAAC,EAAE,CAAC;CAC1H;CACA,OAAOlF,EAAE;AACX;AASA,SAAS+Z,GAAS,GAAe;CAC/B,IAAM/Z,IAAI,IAAIwK,EAAa,MAAM,OAAO,GAElC/B,IAAkB,CAAC;CACzB,KAAK,IAAIxK,IAAI,GAAGA,IAAI2b,EAAI,QAAQ,KAAK;EACnC,IAAI5a,IAAI4a,EAAI3b;EACZ,IAAI,KAAK,KAAKe,CAAC,KAAK,CAAC,cAAc,KAAKA,CAAC,GACvC,OAAOf,IAAI,IAAI2b,EAAI,UAAU,CAAC,cAAc,KAAK5a,CAAC,IAAG,KAAK,OAAO4a,EAAI,EAAE3b;EAEzE,EAAM,KAAKe,CAAC;CACd;CACA,IAAIpB,IAAI,GACJ6C,IAAI,GACF6R,IAAkB,CAAC,GACnBqL,KAAQ,GAAc,IAAQ,OAAO;EACzC,IAAMjT,IAAK,IAAI;EAEf,OADA1K,EAAE,KAAK0K,GAAI;GAAE;GAAO;EAAM,GAAG4H,EAAMA,EAAM,SAAS,EAAE,GAC7C5H;CACT,GACIkT,GACExc,KAAQ,GAAe,MAAe;EAC1C,KAAK,IAAMkJ,KAAKuT,GAAO,EAAE,KAAK;GAAE,MAAMvT,EAAE;GAAM;GAAI,MAAM;GAAS,OAAOA,EAAE;EAAM,CAAC;CACnF,GACMwT,KAAQ,MAAc5D,EAAMhc,EAAE,QAAQ,cAAc,IAAI,CAAC,GAEzD6f,KAAS,GAAe,MAAyB;EACrD,IAAIlV,IAAMsE,GACJ6Q,KAAO,MAAe;GAG1B,AAFIJ,MAAiB,KAAA,MAAW,IAAM/U,EAAI,KAAK,OAAO;IAAE,GAAG;IAAG,OAAO,EAAE,SAAS+U;GAAa,EAAE,IAC/F,IAAe,KAAA,GACfxc,EAAKyH,GAAK6B,CAAE;EACd;EACA,OAAO9M,IAAI6K,EAAM,SAAQ;GACvB,IAAMzJ,IAAIyJ,EAAM7K;GAChB,IAAIqgB,EAAK,KAAKjf,CAAC,GAAG,OAAO6J;GACzB;GACA,IAAI;GACJ,IAAI,WAAW,KAAK7J,CAAC,GAAG;IACtB,IAAM0L,IAAKiT,EAAK,OAAO;IAEvB,AADAK,EAAItT,CAAE,GACN,IAAM,CAAC,EAAE,MAAMA,EAAG,CAAC;GACrB,OAAO,IAAI,gBAAgB,KAAK1L,CAAC,GAG/B,AADAgf,EADWL,EAAK,KACZ,CAAE,GACN,IAAM,CAAC;QACF,IAAI,yBAAyB,KAAK3e,CAAC,GAAG,IAAM,CAAC;QAC/C,IAAK,IAAI,0BAA0B,KAAKA,CAAC,GAAI;IAChD,IAAM0L,IAAKiT,EAAK,SAASzD,EAAM,EAAE,EAAE,CAAC;IAEpC,AADA8D,EAAItT,CAAE,GACN,IAAM,CAAC,EAAE,MAAMA,EAAG,CAAC;GACrB,OAAO,IAAK,IAAI,iBAAiB,KAAK1L,CAAC,GAAI,IAAekb,EAAM,EAAE,EAAE,KAAK,KAAA;QACpE,KAAK,IAAI,mDAAmD,KAAKlb,CAAC,OAAO,IAAI,kDAAkD,KAAKA,CAAC,IAAI;IAC5I,IAAI6C,IAAI8b,EAAK,WAAWG,EAAK,EAAE,EAAE,CAAC;IAClC,EAAIjc,CAAC;IACL,IAAI1B,IAAc4d,EAAM,CAAC;KAAE,MAAMlc;KAAG,OAAO,EAAE,KAAKqY,EAAM,EAAE,EAAE,IAAI,KAAA;IAAU,CAAC,GAAG,4CAA4C,GACtHzB,IAAO;IACX,OAAO7a,IAAI6K,EAAM,SAAQ;KACvB,IAAM/B,IAAI+B,EAAM,MACZ6B;KACJ,IAAK,IAAI,kEAAkE,KAAK5D,CAAC,GAAI;MACnF,IAAMwX,IAAKP,EAAK,WAAWG,EAAKxT,EAAE,EAAE,CAAC;MAGrC,AAFAtK,EAAE,KAAK;OAAE,MAAM6B;OAAG,IAAIqc;OAAI,MAAM;MAAQ,CAAC,GACzC,IAAIA,GACJ,IAAM/d,EAAI,OAAO4d,EAAM,CAAC;OAAE,MAAMG;OAAI,OAAO5T,EAAE,KAAK4P,EAAM5P,EAAE,EAAE,IAAI,KAAA;MAAU,CAAC,GAAG,4CAA4C,CAAC;KAC7H,OAAO,IAAK,IAAI,0BAA0B,KAAK5D,CAAC,GAE9C,AADA,IAAMvG,EAAI,OAAO4d,EAAM,CAAC;MAAE,MAAMlc;MAAG,OAAOyI,EAAE,KAAK4P,EAAM5P,EAAE,EAAE,IAAI,KAAA;KAAU,CAAC,GAAG,sBAAsB,CAAC,GACpG,IAAO;UACF;IACT;IAEA,AADImO,KAAMtY,EAAI,KAAK,EAAE,MAAM0B,EAAE,CAAC,GAC9B,IAAM1B;GACR,OAAO,IAAK,IAAI,uBAAuB,KAAKnB,CAAC,GAAI;IAC/C,IAAM6C,IAAI8b,EAAK,WAAWG,EAAK,EAAE,EAAE,CAAC;IACpC,EAAIjc,CAAC;IACL,IAAI1B,IAAc,CAAC;IACnB,OAAOvC,IAAI6K,EAAM,SAAQ;KACvB,IAAM/B,IAAI+B,EAAM,MACV6B,IAAI,qBAAqB,KAAK5D,CAAC;KACrC,IAAI,CAAC4D,GAAG;KACR,IAAMnK,EAAI,OAAO4d,EAAM,CAAC;MAAE,MAAMlc;MAAG,OAAOic,EAAKxT,EAAE,EAAE;KAAE,CAAC,GAAG,yBAAyB,CAAC;IACrF;IACA,IAAMnK;GACR,OAAO,IAAK,IAAI,4CAA4C,KAAKnB,CAAC,GAAI;IACpE,IAAMT,IAAIof,EAAK,WAAWG,EAAK,EAAE,EAAE,CAAC;IACpC,EAAIvf,CAAC;IACL,IAAMud,IAAOiC,EAAM,CAAC;KAAE,MAAMxf;KAAG,OAAO,EAAE,KAAK2b,EAAM,EAAE,EAAE,IAAI,KAAA;IAAU,CAAC,GAAG,4BAA4B;IACrG,EAAK4B,GAAMvd,CAAC;IACZ,IAAM+L,IAAI,8CAA8C,KAAK7B,EAAM,QAAQ,EAAE;IAC7E,IAAM,CAAC;KAAE,MAAMlK;KAAG,OAAO+L,IAAI,KAAK4P,EAAM5P,EAAE,EAAE,IAAI,KAAA;IAAU,CAAC;GAC7D,OAAO,KAAK,IAAI,yCAAyC,KAAKtL,CAAC,MAAM,CAAC,mBAAmB,KAAKA,CAAC,GAAG;IAChG,IAAMW,IAAI,EAAE,OAAO,KAAA,IAAyCge,EAAK,WAAW,EAAE,IAA/CA,EAAK,SAASzD,EAAM,EAAE,EAAE,CAAC;IACxD,EAAIva,CAAC;IACL,IAAMmc,IAAOiC,EAAM,CAAC,EAAE,MAAMpe,EAAE,CAAC,GAAG,6BAA6B,GAC3D6H,GACA2W;IACJ,CAAK,IAAK,sCAAsC,KAAK1V,EAAM7K,MAAM,EAAE,OACjE,IAAO+f,EAAK,SAASzD,EAAMiE,EAAG,EAAE,CAAC,GACjC;IAEF,IAAM7T,IAAI,8EAA8E,KAAK7B,EAAM,QAAQ,EAAE,GACvG5G,IAAI8b,EAAK,WAAWrT,IAAI,KAAKwT,EAAKxT,EAAE,EAAE,IAAI,EAAE;IAMlD,AALAlJ,EAAK0a,GAAMja,CAAC,GACR2F,KACFxH,EAAE,KAAK;KAAE,MAAM6B;KAAG,IAAI2F;KAAM,MAAM;KAAS,OAAO8C,IAAI,KAAK4P,EAAM5P,EAAE,EAAE,IAAI,KAAA;IAAU,CAAC,GACpFtK,EAAE,KAAK;KAAE,MAAMwH;KAAM,IAAI7H;KAAG,MAAM;IAAQ,CAAC,KACtCK,EAAE,KAAK;KAAE,MAAM6B;KAAG,IAAIlC;KAAG,MAAM;KAAS,OAAO2K,IAAI,KAAK4P,EAAM5P,EAAE,EAAE,IAAI,KAAA;IAAU,CAAC,GACxF,IAAM,CAAC;KAAE,MAAMzI;KAAG,OAAOyI,IAAI,KAAK4P,EAAM5P,EAAE,EAAE,IAAI,KAAA;IAAU,CAAC;GAC7D,OAAO,IAAI,kBAAkB,KAAKtL,CAAC,GAAG;IACpC,IAAMof,IAAO,UAAU,KAAKpf,CAAC,GACzB8C,GACA9D,IAAS6K;IACb,AAAIuV,KACF,IAAIT,EAAK,KAAK,GACdK,EAAIlc,CAAC,GACL,IAAS,CAAC,EAAE,MAAMA,EAAE,CAAC,KACZ8b,MAAiB,KAAA,MAAW,IAAe,KAAA;IACtD,IAAIzd,IAAc,CAAC;IACnB,SAAS;KACP,IAAMA,EAAI,OAAO4d,EAAM/f,GAAQ,qEAAqE,CAAC;KACrG,IAAM0I,IAAI+B,EAAM,QAAQ;KACxB,IAAI,CAAC,SAAS,KAAK/B,CAAC,GAAG;IACzB;IACA,IAAI0X,GAAM;KACR,IAAM7a,IAAIoa,EAAK,KAAK;KAEpB,AADAvc,EAAKjB,GAAKoD,CAAC,GACX,IAAM,CAAC,EAAE,MAAMA,EAAE,CAAC;IACpB,OAAO,IAAMpD;GACf,OAAO,IAAK,IAAI,6FAA6F,KAAKnB,CAAC,GAAI;IACrH,IAAMoL,KAAQ,EAAE,MAAM,EAAE,GAAA,CAAI,KAAK,GAC3B6I,IAAM,MAAM;IAElB,AADAjT,EAAE,QAAQiT,GAAKiH,EAAM9P,CAAI,GAAGkI,EAAMA,EAAM,SAAS,EAAE,GACnDA,EAAM,KAAKW,CAAG;GAChB,OAAO,IAAIjU,MAAM,OAAO,iBAAiB,KAAKA,CAAC,GAAG,EAAM,IAAI;QACvD,KAAI,gBAAgB,KAAKA,CAAC,KAAK,sBAAsB,KAAKA,CAAC,MAC1D,CAAC,IAAI,KAAKA,CAAC,GAAG,OAAOpB,IAAI6K,EAAM,UAAU,CAAC,gBAAgB,KAAKA,EAAM,IAAI;EAGjF;EACA,OAAOI;CACT;CAEA,OADAkV,EAAM,CAAC,GAAG,UAAU,GACb/d,EAAE;AACX;AAIA,SAAS6D,GAAK,GAAiB,GAAwB;CACrD,IAAM1F,IAA0C,CAAC,GAC7C4E;CACJ,KAAK,IAAI9E,IAAI,GAAGA,IAAIwK,EAAM,QAAQ,KAAK;EACrC,IAAMzJ,IAAIyJ,EAAMxK,IACVoM,IAAI,4CAA4C,KAAKrL,CAAC;EAC5D,IAAI,CAACqL,GAAG;EACR,IAAIjC,IAAOiC,EAAE;EAEb,IAAIjC,EAAK,WAAW,GAAG,GAAG;GAExB,KADA,IAAOA,EAAK,MAAM,CAAC,GACZ,CAAC,QAAQ,KAAKA,CAAI,KAAKnK,IAAI,IAAIwK,EAAM,SAAQ,KAAQ,OAAOA,EAAM,EAAExK;GAC3E,IAAOmK,EAAK,QAAQ,SAAS,EAAE;EACjC;EACA,IAAM2G,IAAQ1E,EAAE,EAAE,CAAC,QACbuC,IAAOvC,EAAE,EAAE,CAAC,OAAO,MAAM,SAAS,SAClCsT,IAAiB;GAAE,OAAOzD,EAAM9R,CAAI;GAAG,OAAOiC,EAAE,KAAK,SAAS,KAAA;GAAW,MAAMgU,IAAM,KAAA,IAAYzR;GAAM,UAAU,CAAC;EAAE;EAC1H,IAAI,CAAC7J,GAEH,AADA,IAAO4a,GACPxf,EAAM,KAAK;GAAE;GAAO,GAAGwf;EAAK,CAAC;OAG/B;UAAOxf,EAAM,SAAS,KAAKA,EAAMA,EAAM,SAAS,EAAE,CAAC,SAAS4Q,IAAO,EAAM,IAAI;GAE7E,AADA5Q,EAAMA,EAAM,SAAS,EAAE,CAAC,EAAE,SAAS,KAAKwf,CAAI,GAC5Cxf,EAAM,KAAK;IAAE;IAAO,GAAGwf;GAAK,CAAC;EAFgD;CAG/E;CACA,IAAI,CAAC5a,GAAM,MAAM,IAAI3F,EAAa,uBAAuB;CAEzD,IAAMkhB,KAAS,GAAa,MAAiB7d,EAAE,SAAS,SAAS,OAAOrC,MAA0B,EAAE,OAAO,KAAA,IAAYkgB,EAAMle,GAAG,EAAK,EAAG;CAExI,OADAke,EAAMvb,GAAM,EAAI,GACTA;AACT;;ACvwBA,eAAsBwb,GAAS,GAAa,IAAQ,GAAkB;CACpE,IAAMlW,KAAQ,MAAc,OAAW,OAAO,eAAepK,EAAE,aAAa,CAAC,CAAC,KAAK6N,CAAG,CAAC,GAAG,MAAM,CAAC,GAC3FvN,IAAI8J,EAAK,OAAO,GAChBpH,IAAIoH,EAAK,QAAQ;CACvB,IAAI,CAAC9J,KAAK,CAAC0C,GAAG,MAAU,MAAM,2BAA2B;CACzD,IAAMud,IAAM,IAAI,MAAM;CAEtB,AADA,EAAI,MAAM,oCAAoC,mBAAmB1S,CAAG,KACpE,MAAM0S,EAAI,OAAO;CACjB,IAAMC,IAAS,SAAS,cAAc,QAAQ;CAE9C,AADA,EAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAMlgB,IAAIqW,CAAK,CAAC,GAChD,EAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM3T,IAAI2T,CAAK,CAAC;CACjD,IAAMnW,IAAIggB,EAAO,WAAW,IAAI;CAChC,IAAI,CAAChgB,GAAG,MAAU,MAAM,cAAc;CAGtC,OAFAA,EAAE,MAAMmW,GAAOA,CAAK,GACpBnW,EAAE,UAAU+f,GAAK,GAAG,GAAGjgB,GAAG0C,CAAC,GACpB,IAAI,SAAS,GAAS,MAAWwd,EAAO,QAAQ,MAAOze,IAAI+N,EAAQ/N,CAAC,IAAI0e,EAAO,gBAAI,MAAM,mBAAmB,CAAC,GAAI,WAAW,CAAC;AACtI;AAGA,SAAgBC,GAAK,GAAiB,GAAgB;CACpD,EAAO,YAAYC,EAAK,KAAK,EAAE;AACjC;;ACVA,IAAaC,KAAb,cAAkC,MAAM;CACtC,YAAY,GAAiB;EAE3B,AADA,MAAMC,CAAO,GACb,KAAK,OAAO;CACd;AACF;AAGA,SAAgBC,GAAW,GAA2B;CACpD,IAAI;EACF,OAAOpF,GAAeqF,CAAM,CAAC,CAAC,KAAK,OAAO;GAAE,KAAKnd,EAAE;GAAK,OAAOA,EAAE;GAAG,QAAQA,EAAE;EAAE,EAAE;CACpF,SAAS,GAAG;EACV,MAAM,IAAIgd,GAAc,EAAY,OAAO;CAC7C;AACF;AAGA,SAAgBI,GAAO,GAAyB;CAC9C,OAAOF,GAAWC,CAAM,CAAC,CAAC;AAC5B;AAGA,SAAgBE,GAAS,GAAiB,GAA2B;CACnE,IAAMC,IAAKJ,GAAWC,CAAM;CAK5B,OAJAL,GACEvC,GACA+C,EAAG,KAAK,MAAMtd,EAAE,GAAG,CACrB,GACOsd;AACT;AAGA,SAAgBC,GAAM,GAAa,IAAQ,GAAkB;CAC3D,OAAOb,GAASzS,GAAK8I,CAAK;AAC5B"}
|