@weasel-js/geom 1.7.0 → 1.7.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mat3.ts","../src/box.ts","../src/nearest.ts","../src/portCurve2.ts","../src/polyline.ts","../src/affine.ts","../src/place.ts"],"names":["x","y","portControls"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 2D affine transforms in canvas/DOMMatrix order: [a, b, c, d, e, f].\n * x' = a·x + c·y + e\n * y' = b·x + d·y + f\n * Represented as a readonly 6-tuple (f64). The affine tier of the kernel.\n *\n * Convention alignment: the renderer already has a `Mat3` in\n * `src/renderer/math/mat3.ts`. That one is a 9-element column-major\n * `Float32Array` (a full 3×3) shaped for `uniformMatrix3fv` — a deliberately\n * different *representation* for the WebGL upload path. Its *logical element\n * order* is identical to ours: `create(a, b, c, d, tx, ty)` maps\n * `x' = a·x + c·y + tx`, `y' = b·x + d·y + ty` (canvas/DOMMatrix a,b,c,d,e,f).\n * We keep the pure 6-tuple f64 form here (the kernel form); the 9-element f32\n * form stays a render-layer concern. No second logical convention is created.\n */\nimport { SINGULAR_RATIO } from './scalar';\n\nexport type Mat3 = readonly [number, number, number, number, number, number];\n\n/** The transform that leaves a point where it is. */\nexport function identity(): Mat3 {\n return [1, 0, 0, 1, 0, 0];\n}\n\n/** A pure translation by `(tx, ty)`. */\nexport function translate(tx: number, ty: number): Mat3 {\n return [1, 0, 0, 1, tx, ty];\n}\n\n/** A pure scale about the origin. Scale about another point by composing\n * translate → scale → inverse translate with `multiply`. */\nexport function scale(sx: number, sy: number): Mat3 {\n return [sx, 0, 0, sy, 0, 0];\n}\n\n/** A pure rotation about the origin, in radians, clockwise in canvas\n * coordinates (y down). */\nexport function rotate(rad: number): Mat3 {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n return [c, s, -s, c, 0, 0];\n}\n\n/** Compose: result applies `n` first, then `m` (m·n). */\nexport function multiply(m: Mat3, n: Mat3): Mat3 {\n return [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n ];\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Mat3): Mat3 | null {\n const det = m[0] * m[3] - m[1] * m[2];\n // The determinant is an area, so it is judged against the squared column norms.\n const norm2 = Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3]);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * norm2)) return null;\n const id = 1 / det;\n const a = m[3] * id;\n const b = -m[1] * id;\n const c = -m[2] * id;\n const d = m[0] * id;\n return [a, b, c, d, -(m[4] * a + m[5] * c), -(m[4] * b + m[5] * d)];\n}\n\n/** Apply to a point, returning a tuple. Cold-path use; hot loops inline. */\nexport function applyToPoint(m: Mat3, x: number, y: number): [number, number] {\n return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n}\n\n/** Affine that maps source box (sx,sy,sw,sh) onto destination box (dx,dy,dw,dh). */\nexport function boxToBox(\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number,\n): Mat3 {\n const kx = sw === 0 ? 1 : dw / sw;\n const ky = sh === 0 ? 1 : dh / sh;\n // translate(dx,dy) · scale(kx,ky) · translate(-sx,-sy)\n return [kx, 0, 0, ky, dx - sx * kx, dy - sy * ky];\n}\n\n/** Rotation by `rad` about pivot (cx,cy): translate(c)·rotate·translate(-c). */\nexport function rotateAboutPoint(cx: number, cy: number, rad: number): Mat3 {\n return multiply(translate(cx, cy), multiply(rotate(rad), translate(-cx, -cy)));\n}\n","/** Axis-aligned box as [minX, minY, maxX, maxY]. */\nexport type Box = readonly [number, number, number, number];\n\n/** An axis-aligned rectangle in object form. `Box` is the tuple form; this is\n * the one that survives being read by a human. */\nexport interface Rect { x: number; y: number; width: number; height: number }\n\n/** Tight bounds of an interleaved coord stream, or null if empty. */\nexport function boundsOfCoords(coords: ArrayLike<number>): Box | null {\n if (coords.length < 2) return null;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Smallest box containing both inputs. */\nexport function unionBox(a: Box, b: Box): Box {\n return [\n Math.min(a[0], b[0]),\n Math.min(a[1], b[1]),\n Math.max(a[2], b[2]),\n Math.max(a[3], b[3]),\n ];\n}\n\n/** Inclusive point-in-box test. */\nexport function boxContainsPoint(b: Box, x: number, y: number): boolean {\n return x >= b[0] && x <= b[2] && y >= b[1] && y <= b[3];\n}\n\n/** Interleaved corner ring for a rect at (x,y,w,h), wound clockwise from the\n * origin corner. The closing edge is implicit — the same unclosed shape\n * `pointInPolygon` takes, and what a repeated first vertex would leave as a\n * zero-length segment for anything that strokes it. */\nexport function rectToContour(x: number, y: number, w: number, h: number): Float64Array {\n return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);\n}\n","/**\n * Nearest point on a segment or a whole path to a probe point: where it is,\n * its curve parameter, and how far away it lies.\n */\nimport { cubicEvalAt, elevateQuadraticToCubic } from './curve';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Q, PATH_C, PATH_Z } from './commands';\n\n/** The point on one segment nearest a probe. */\nexport interface CurveNearest {\n x: number;\n y: number;\n /** Curve parameter of the point, in [0, 1]. */\n t: number;\n /** Euclidean distance from the probe. */\n dist: number;\n}\n\n/** The point on a path nearest a probe, and the command whose segment holds it. */\nexport interface PathNearest extends CurveNearest {\n /** Index of the segment's command in the command stream (`L`, `Q`, `C` or `Z`). */\n commandIndex: number;\n /** Offset of that command's first coord; for a `Z`, where its coords would begin. */\n coordIndex: number;\n}\n\n/** Nearest point on segment (x0,y0)-(x1,y1) to (px,py). */\nexport function nearestOnLine(\n px: number, py: number, x0: number, y0: number, x1: number, y1: number,\n): CurveNearest {\n const vx = x1 - x0, vy = y1 - y0;\n const vv = vx * vx + vy * vy;\n let t = vv === 0 ? 0 : ((px - x0) * vx + (py - y0) * vy) / vv;\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n const x = t === 1 ? x1 : x0 + t * vx;\n const y = t === 1 ? y1 : y0 + t * vy;\n return { x, y, t, dist: Math.hypot(px - x, py - y) };\n}\n\n/** Coarse samples per cubic. Each local minimum among them is refined, so this\n * only has to separate the distance function's minima (a cubic has at most\n * three), not locate them. */\nconst CUBIC_SAMPLES = 32;\nconst REFINE_ITERS = 40;\nconst T_EPS = 1e-14;\n\n/**\n * Nearest point on the cubic (x0,y0)…(x3,y3) to (px,py). Samples the curve,\n * then refines every sampled local minimum with bracketed Newton on the\n * distance derivative, so a loop or cusp cannot capture it in the wrong basin.\n */\nexport function nearestOnCubic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): CurveNearest {\n // Power basis B(t) = a t³ + b t² + c t + p0, for the derivatives.\n const ax = -x0 + 3 * x1 - 3 * x2 + x3, ay = -y0 + 3 * y1 - 3 * y2 + y3;\n const bx = 3 * x0 - 6 * x1 + 3 * x2, by = 3 * y0 - 6 * y1 + 3 * y2;\n const cx = 3 * (x1 - x0), cy = 3 * (y1 - y0);\n\n const d2At = (t: number): number => {\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n return (x - px) ** 2 + (y - py) ** 2;\n };\n\n const d2s: number[] = [];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) d2s.push(d2At(k / CUBIC_SAMPLES));\n\n let bestT = 0, bestD2 = d2s[0];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) {\n const d = d2s[k];\n const prev = k > 0 ? d2s[k - 1] : Infinity;\n const next = k < CUBIC_SAMPLES ? d2s[k + 1] : Infinity;\n if (!(d <= prev && d <= next)) continue;\n\n let lo = Math.max(0, (k - 1) / CUBIC_SAMPLES);\n let hi = Math.min(1, (k + 1) / CUBIC_SAMPLES);\n let t = k / CUBIC_SAMPLES;\n for (let i = 0; i < REFINE_ITERS; i++) {\n const t2 = t * t;\n const ex = ax * t2 * t + bx * t2 + cx * t + x0 - px;\n const ey = ay * t2 * t + by * t2 + cy * t + y0 - py;\n const dx = 3 * ax * t2 + 2 * bx * t + cx, dy = 3 * ay * t2 + 2 * by * t + cy;\n const ddx = 6 * ax * t + 2 * bx, ddy = 6 * ay * t + 2 * by;\n // g = ½ d/dt |B - P|², zero at a critical point; its sign says which side the minimum is on.\n const g = ex * dx + ey * dy;\n const gp = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (g > 0) hi = t; else if (g < 0) lo = t; else break;\n let tn = gp > 0 ? t - g / gp : NaN;\n if (!(tn > lo && tn < hi)) tn = (lo + hi) / 2;\n const step = Math.abs(tn - t);\n t = tn;\n if (step < T_EPS || hi - lo < T_EPS) break;\n }\n const refined = d2At(t);\n const [tk, dk] = refined <= d ? [t, refined] : [k / CUBIC_SAMPLES, d];\n if (dk < bestD2) { bestD2 = dk; bestT = tk; }\n }\n\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, bestT);\n return { x, y, t: bestT, dist: Math.hypot(x - px, y - py) };\n}\n\n/** Nearest point on the quadratic (x0,y0)(x1,y1)(x2,y2) to (px,py). */\nexport function nearestOnQuadratic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number,\n): CurveNearest {\n // Degree elevation keeps the parameterization, so t carries over unchanged.\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(x0, y0, x1, y1, x2, y2);\n return nearestOnCubic(px, py, x0, y0, c1x, c1y, c2x, c2y, x2, y2);\n}\n\n/**\n * Nearest point on a command-stream path to (px,py), over every `L`, `Q`, `C`\n * and the closing edge each `Z` draws. The earliest segment wins a tie.\n * Returns `null` when the path has no segment, and throws on a command code\n * `PATH_COMMANDS` does not declare.\n */\nexport function nearestOnPath(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n px: number,\n py: number,\n): PathNearest | null {\n let best: PathNearest | null = null;\n let startX = 0, startY = 0;\n forEachSegment(commands, coords, (cmd, ci, x0, y0, commandIndex) => {\n let hit: CurveNearest;\n if (cmd === PATH_M) {\n startX = coords[ci]; startY = coords[ci + 1];\n return;\n } else if (cmd === PATH_L) {\n hit = nearestOnLine(px, py, x0, y0, coords[ci], coords[ci + 1]);\n } else if (cmd === PATH_Q) {\n hit = nearestOnQuadratic(px, py, x0, y0, coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3]);\n } else if (cmd === PATH_C) {\n hit = nearestOnCubic(\n px, py, x0, y0,\n coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3], coords[ci + 4], coords[ci + 5],\n );\n } else if (cmd === PATH_Z) {\n hit = nearestOnLine(px, py, x0, y0, startX, startY);\n } else {\n throw new Error(`nearestOnPath: unknown command code ${cmd}`);\n }\n if (best === null || hit.dist < best.dist) best = { ...hit, commandIndex, coordIndex: ci };\n });\n return best;\n}\n","/**\n * The port-curve rule in the 2D kernel's currency: loose scalars, the way\n * `cubicEvalAt` and `applyToPoint` take them. The rule itself lives in\n * `./portCurve`, stated once over components, so this and `./3d` cannot drift.\n */\n\nimport { PORT_REACH, cubicAt as cubicAtN, portControls as portControlsN } from './portCurve';\n\nexport { PORT_REACH };\n\n/**\n * `[c1, c2]` for the cubic from `(ax, ay)` to `(bx, by)`.\n *\n * A null normal falls back to a lerp along the chord. See `./portCurve` for why\n * the two ends are not symmetric.\n */\nexport function portControls(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n reach: number = PORT_REACH,\n): [[number, number], [number, number]] {\n const [c1, c2] = portControlsN([ax, ay], [bx, by], outNormal, inNormal, reach);\n return [\n [c1[0]!, c1[1]!],\n [c2[0]!, c2[1]!],\n ];\n}\n\n/** A port curve sampled into `samples` points, excluding its start. */\nexport function portCurvePoints(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n samples: number,\n reach: number = PORT_REACH,\n): [number, number][] {\n const a = [ax, ay];\n const b = [bx, by];\n const [c1, c2] = portControlsN(a, b, outNormal, inNormal, reach);\n const out: [number, number][] = [];\n for (let s = 1; s <= samples; s++) {\n const p = cubicAtN(a, c1, c2, b, s / samples);\n out.push([p[0]!, p[1]!]);\n }\n return out;\n}\n","import { sign, dot, len2 } from './scalar';\n\n/**\n * Even-odd ray-cast point-in-polygon over an interleaved, unclosed contour\n * [x0,y0,x1,y1,…]. The closing edge (last→first) is implicit.\n *\n * `start`/`end` are vertex indices, not float offsets, and bound one contour\n * inside a buffer holding several.\n */\nexport function pointInPolygon(\n coords: ArrayLike<number>,\n px: number,\n py: number,\n start = 0,\n end = coords.length >> 1,\n): boolean {\n if (end - start < 3) return false;\n let inside = false;\n for (let i = start, j = end - 1; i < end; j = i++) {\n const xi = coords[i * 2], yi = coords[i * 2 + 1];\n const xj = coords[j * 2], yj = coords[j * 2 + 1];\n const crosses =\n (yi > py) !== (yj > py) &&\n px < ((xj - xi) * (py - yi)) / (yj - yi) + xi;\n if (crosses) inside = !inside;\n }\n return inside;\n}\n\n/**\n * True if segments (ax,ay)-(bx,by) and (cx,cy)-(dx,dy) intersect at a single\n * point. An endpoint landing on the other segment counts (a T-junction and a\n * shared endpoint both answer true) — hit-testing wants a grazing edge to\n * register. Collinear overlap answers false: there is no single crossing\n * point, so the sign test both segments rely on is zero on all four sides.\n */\nexport function segmentsCross(\n ax: number, ay: number, bx: number, by: number,\n cx: number, cy: number, dx: number, dy: number,\n): boolean {\n const d1 = sign((dx - cx) * (ay - cy) - (dy - cy) * (ax - cx));\n const d2 = sign((dx - cx) * (by - cy) - (dy - cy) * (bx - cx));\n const d3 = sign((bx - ax) * (cy - ay) - (by - ay) * (cx - ax));\n const d4 = sign((bx - ax) * (dy - ay) - (by - ay) * (dx - ax));\n return d1 !== d2 && d3 !== d4;\n}\n\n/** Squared distance from (px,py) to segment (ax,ay)-(bx,by), endpoint-clamped. */\nexport function pointSegmentDist2(\n px: number, py: number, ax: number, ay: number, bx: number, by: number,\n): number {\n const vx = bx - ax, vy = by - ay;\n const wx = px - ax, wy = py - ay;\n const vv = len2(vx, vy);\n let t = vv === 0 ? 0 : dot(wx, wy, vx, vy) / vv;\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n const dx = px - (ax + t * vx), dy = py - (ay + t * vy);\n return len2(dx, dy);\n}\n","import type { Mat3 } from './mat3';\n\n/**\n * Apply an affine to an interleaved coord stream, returning a fresh f64\n * buffer. Command codes are unaffected — for a Bezier the transformed control\n * points define the transformed curve exactly (affine invariance), so callers\n * pass `path.coords` straight through and keep `path.commands` as-is.\n */\nexport function transformCoords(coords: ArrayLike<number>, m: Mat3): Float64Array {\n const out = new Float64Array(coords.length);\n const a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n out[i] = a * x + c * y + e;\n out[i + 1] = b * x + d * y + f;\n }\n return out;\n}\n","import type { Rect } from './box';\n\n/** Which side of the anchor the overlay sits on. */\nexport type PlacementSide = 'top' | 'bottom' | 'left' | 'right';\n\n/** How the overlay lines up along the side it sits on. */\nexport type PlacementAlign = 'start' | 'center' | 'end';\n\n/** A side paired with an alignment along it. */\nexport interface Placement {\n side: PlacementSide;\n align: PlacementAlign;\n}\n\n/** Inputs to {@link placeRect}. All rects share one coordinate space. */\nexport interface PlaceRectOptions {\n anchor: Rect;\n overlay: { width: number; height: number };\n boundary: Rect;\n placement: Placement;\n /** Gap between anchor and overlay along the side axis. Default 0. */\n offset?: number;\n /** Shift along the alignment axis. Default 0. */\n crossOffset?: number;\n /** Minimum gap kept between the overlay and the boundary. Default 0. */\n padding?: number;\n /** Whether to try the opposite side when the preferred one lacks room. Default true. */\n flip?: boolean;\n}\n\n/** Where the overlay landed, and the placement that produced it. */\nexport interface PlacedRect {\n rect: Rect;\n placement: Placement;\n}\n\nfunction alignAlong(start: number, extent: number, size: number, align: PlacementAlign): number {\n if (align === 'start') return start;\n if (align === 'end') return start + extent - size;\n return start + (extent - size) / 2;\n}\n\nfunction positionOn(\n anchor: Rect,\n overlay: { width: number; height: number },\n placement: Placement,\n offset: number,\n crossOffset: number,\n): Rect {\n const { width, height } = overlay;\n const { side, align } = placement;\n if (side === 'top' || side === 'bottom') {\n const y = side === 'bottom' ? anchor.y + anchor.height + offset : anchor.y - offset - height;\n return { x: alignAlong(anchor.x, anchor.width, width, align) + crossOffset, y, width, height };\n }\n const x = side === 'right' ? anchor.x + anchor.width + offset : anchor.x - offset - width;\n return { x, y: alignAlong(anchor.y, anchor.height, height, align) + crossOffset, width, height };\n}\n\nfunction clampAxis(start: number, size: number, low: number, extent: number, padding: number): number {\n const min = low + padding;\n return Math.max(min, Math.min(start, min + extent - padding * 2 - size));\n}\n\n/**\n * Move `rect` the shortest distance that puts it inside `boundary`, keeping its\n * size. A rect too big to fit pins to the boundary's leading edge.\n */\nexport function clampRectWithin(rect: Rect, boundary: Rect, padding = 0): Rect {\n return {\n ...rect,\n x: clampAxis(rect.x, rect.width, boundary.x, boundary.width, padding),\n y: clampAxis(rect.y, rect.height, boundary.y, boundary.height, padding),\n };\n}\n\n/** Slide along the alignment axis until the overlay is inside. */\nfunction shiftAcross(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): Rect {\n const vertical = side === 'top' || side === 'bottom';\n const size = vertical ? rect.width : rect.height;\n const low = (vertical ? boundary.x : boundary.y) + padding;\n const high = low + (vertical ? boundary.width : boundary.height) - padding * 2 - size;\n const placed = Math.max(low, Math.min(vertical ? rect.x : rect.y, high));\n return vertical ? { ...rect, x: placed } : { ...rect, y: placed };\n}\n\nconst OPPOSITE: Record<PlacementSide, PlacementSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nfunction fitsAlongSide(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): boolean {\n const vertical = side === 'top' || side === 'bottom';\n const start = vertical ? rect.y : rect.x;\n const end = start + (vertical ? rect.height : rect.width);\n const low = (vertical ? boundary.y : boundary.x) + padding;\n const high = low + (vertical ? boundary.height : boundary.width) - padding * 2;\n return start >= low && end <= high;\n}\n\nexport function placeRect(options: PlaceRectOptions): PlacedRect {\n const { anchor, overlay, boundary, placement, offset = 0, crossOffset = 0 } = options;\n const { padding = 0, flip = true } = options;\n\n let resolved = placement;\n let rect = positionOn(anchor, overlay, resolved, offset, crossOffset);\n\n if (flip && !fitsAlongSide(rect, boundary, resolved.side, padding)) {\n const opposite = { side: OPPOSITE[resolved.side], align: resolved.align };\n const flipped = positionOn(anchor, overlay, opposite, offset, crossOffset);\n if (fitsAlongSide(flipped, boundary, opposite.side, padding)) {\n resolved = opposite;\n rect = flipped;\n }\n }\n\n return { rect: shiftAcross(rect, boundary, resolved.side, padding), placement: resolved };\n}\n"]}
1
+ {"version":3,"sources":["../src/mat3.ts","../src/nearest.ts","../src/portCurve2.ts","../src/paths/builder.ts","../src/paths/bounds.ts","../src/paths/unionBoundsPath.ts","../src/affine.ts","../src/paths/transformPath.ts","../src/paths/transform.ts","../src/paths/compose.ts","../src/paths/splitSubpaths.ts","../src/paths/winding.ts","../src/paths/pathFromD.ts","../src/paths/pathAt.ts","../src/paths/pathDistance.ts","../src/paths/schneiderFit.ts","../src/screenBand.ts","../src/pathHitTest.ts","../src/place.ts","../src/easings.ts","../src/easingSpec.ts"],"names":["x","y","portControls","sign","dot","last","fit","sub"],"mappings":";;;;;;;;;;;;;;;;AAqBO,SAAS,QAAA,GAAiB;AAC/B,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC1B;AAGO,SAAS,SAAA,CAAU,IAAY,EAAA,EAAkB;AACtD,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAI,EAAE,CAAA;AAC5B;AAIO,SAAS,KAAA,CAAM,IAAY,EAAA,EAAkB;AAClD,EAAA,OAAO,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,GAAG,CAAC,CAAA;AAC5B;AAIO,SAAS,OAAO,GAAA,EAAmB;AACxC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACtB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACtB,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3B;AAGO,SAAS,QAAA,CAAS,GAAS,CAAA,EAAe;AAC/C,EAAA,OAAO;AAAA,IACL,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACxB,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACxB,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACxB,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACxB,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AAAA,IAC/B,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC;AAAA,GACjC;AACF;AAIO,SAAS,OAAO,CAAA,EAAsB;AAC3C,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAEpC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAE3E,EAAA,IAAI,EAAE,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,cAAA,GAAiB,QAAQ,OAAO,IAAA;AACtD,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACjB,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClB,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClB,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACjB,EAAA,OAAO,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAC,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAA;AACpE;AAGO,SAAS,YAAA,CAAa,CAAA,EAAS,CAAA,EAAW,CAAA,EAA6B;AAC5E,EAAA,OAAO,CAAC,EAAE,CAAC,CAAA,GAAI,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,GAAG,CAAA,CAAE,CAAC,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAChE;AAGO,SAAS,QAAA,CACd,IAAY,EAAA,EAAY,EAAA,EAAY,IACpC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAC9B;AACN,EAAA,MAAM,EAAA,GAAK,EAAA,KAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,EAAA,KAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA;AAE/B,EAAA,OAAO,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,KAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA;AAClD;AAGO,SAAS,gBAAA,CAAiB,EAAA,EAAY,EAAA,EAAY,GAAA,EAAmB;AAC1E,EAAA,OAAO,QAAA,CAAS,SAAA,CAAU,EAAA,EAAI,EAAE,GAAG,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,EAAG,UAAU,CAAC,EAAA,EAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AAC/E;;;ACjEO,SAAS,cACd,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAC9C;AACd,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,EAAA,IAAI,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA,GAAA,CAAA,CAAM,KAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,EAAA;AAC3D,EAAA,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,KAAK,CAAA,GAAI,EAAA;AAClC,EAAA,MAAM,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,KAAK,CAAA,GAAI,EAAA;AAClC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA,EAAE;AACrD;AAKA,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,KAAA,GAAQ,KAAA;AAOP,SAAS,cAAA,CACd,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EACpC,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EACtB;AAEd,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,CAAC,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACpE,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,EAAA;AAChE,EAAA,MAAM,KAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,EAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,CAAA;AAEzC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsB;AAClC,IAAA,MAAM,CAACA,EAAAA,EAAGC,EAAC,CAAA,GAAI,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAC5D,IAAA,OAAA,CAAQD,EAAAA,GAAI,EAAA,KAAO,CAAA,GAAA,CAAKC,EAAAA,GAAI,EAAA,KAAO,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,aAAA,EAAe,CAAA,EAAA,MAAS,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,aAAa,CAAC,CAAA;AAEzE,EAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,MAAA,GAAS,GAAA,CAAI,CAAC,CAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,aAAA,EAAe,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,MAAM,OAAO,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA;AAClC,IAAA,MAAM,OAAO,CAAA,GAAI,aAAA,GAAgB,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA;AAC9C,IAAA,IAAI,EAAE,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,CAAA,EAAO;AAE/B,IAAA,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,GAAI,KAAK,aAAa,CAAA;AAC5C,IAAA,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,GAAI,KAAK,aAAa,CAAA;AAC5C,IAAA,IAAI,IAAI,CAAA,GAAI,aAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,MAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACjD,MAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACjD,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAI,EAAA;AAC1E,MAAA,MAAM,GAAA,GAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA;AAExD,MAAA,MAAM,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACzB,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,MAAM,EAAA,GAAK,GAAA;AAC/C,MAAA,IAAI,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA;AAAA,WAAA,IAAY,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA;AAAA,WAAQ;AAChD,MAAA,IAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,GAAA;AAC/B,MAAA,IAAI,EAAE,EAAA,GAAK,EAAA,IAAM,KAAK,EAAA,CAAA,EAAK,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,CAAC,CAAA;AAC5B,MAAA,CAAA,GAAI,EAAA;AACJ,MAAA,IAAI,IAAA,GAAO,KAAA,IAAS,EAAA,GAAK,EAAA,GAAK,KAAA,EAAO;AAAA,IACvC;AACA,IAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AACtB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,OAAA,IAAW,CAAA,GAAI,CAAC,CAAA,EAAG,OAAO,CAAA,GAAI,CAAC,CAAA,GAAI,eAAe,CAAC,CAAA;AACpE,IAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,MAAA,MAAA,GAAS,EAAA;AAAI,MAAA,KAAA,GAAQ,EAAA;AAAA,IAAI;AAAA,EAC9C;AAEA,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,KAAK,CAAA;AAChE,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,EAAE;AAC5D;AAGO,SAAS,kBAAA,CACd,IAAY,EAAA,EACZ,EAAA,EAAY,IAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAC9C;AAEd,EAAA,MAAM,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,GAAI,uBAAA,CAAwB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC3E,EAAA,OAAO,cAAA,CAAe,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA;AAClE;AAQO,SAAS,aAAA,CACd,QAAA,EACA,MAAA,EACA,EAAA,EACA,EAAA,EACoB;AACpB,EAAA,IAAI,IAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,MAAA,GAAS,GAAG,MAAA,GAAS,CAAA;AACzB,EAAA,cAAA,CAAe,UAAU,MAAA,EAAQ,CAAC,KAAK,EAAA,EAAI,EAAA,EAAI,IAAI,YAAA,KAAiB;AAClE,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAA,GAAS,OAAO,EAAE,CAAA;AAAG,MAAA,MAAA,GAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,aAAA,CAAc,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,EAAA,GAAK,CAAC,CAAC,CAAA;AAAA,IAChE,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,mBAAmB,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,OAAO,EAAA,GAAK,CAAC,GAAG,MAAA,CAAO,EAAA,GAAK,CAAC,CAAC,CAAA;AAAA,IACrG,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,cAAA;AAAA,QACJ,EAAA;AAAA,QAAI,EAAA;AAAA,QAAI,EAAA;AAAA,QAAI,EAAA;AAAA,QACZ,OAAO,EAAE,CAAA;AAAA,QAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAAG,MAAA,CAAO,KAAK,CAAC;AAAA,OAC3F;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,cAAc,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,QAAQ,MAAM,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,GAAG,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,GAAA,CAAI,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM,IAAA,GAAO,EAAE,GAAG,GAAA,EAAK,YAAA,EAAc,UAAA,EAAY,EAAA,EAAG;AAAA,EAC3F,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACT;;;ACrIO,SAASC,aAAAA,CACd,IACA,EAAA,EACA,EAAA,EACA,IACA,SAAA,EACA,QAAA,EACA,QAAgB,UAAA,EACsB;AACtC,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,aAAc,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,SAAA,EAAW,UAAU,KAAK,CAAA;AAC7E,EAAA,OAAO;AAAA,IACL,CAAC,EAAA,CAAG,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AAAA,IACf,CAAC,EAAA,CAAG,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAE;AAAA,GACjB;AACF;AAGO,SAAS,eAAA,CACd,IACA,EAAA,EACA,EAAA,EACA,IACA,SAAA,EACA,QAAA,EACA,OAAA,EACA,KAAA,GAAgB,UAAA,EACI;AACpB,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,EAAI,EAAE,CAAA;AACjB,EAAA,MAAM,CAAA,GAAI,CAAC,EAAA,EAAI,EAAE,CAAA;AACjB,EAAA,MAAM,CAAC,IAAI,EAAE,CAAA,GAAI,aAAc,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,KAAK,CAAA;AAC/D,EAAA,MAAM,MAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,IAAI,OAAA,CAAS,CAAA,EAAG,IAAI,EAAA,EAAI,CAAA,EAAG,IAAI,OAAO,CAAA;AAC5C,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAE,CAAC,GAAI,CAAA,CAAE,CAAC,CAAE,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,GAAA;AACT;;;ACpCO,IAAM,WAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EACf,OAAiB,EAAC;AAAA,EAClB,KAAe,EAAC;AAAA,EAChB,QAAA,GAAyB,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWjC,OAAO,SAAS,IAAA,EAAgC;AAC9C,IAAA,MAAM,CAAA,GAAI,IAAI,YAAA,EAAY;AAC1B,IAAA,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACjC,IAAA,CAAA,CAAE,EAAA,GAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC7B,IAAA,CAAA,CAAE,WAAW,IAAA,CAAK,QAAA;AAClB,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,YAAY,IAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,GAAW,CAAA,EAAiB;AACjC,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AACrB,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,GAAW,CAAA,EAAiB;AACjC,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AACrB,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,GAAW,CAAA,EAAiB;AAClF,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AACrB,IAAA,IAAA,CAAK,GAAG,IAAA,CAAK,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,EAAA,EAAY,CAAA,EAAW,CAAA,EAAiB;AACzD,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AACrB,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAqB;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC,MAAA,EAAQ,IAAI,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA;AAAA,MAChC,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AACF;AAGO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,KAAA,EAAe,MAAA,EAA0B;AACtF,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAO;AAC7C;AAKO,SAAS,mBACd,MAAA,EACwB;AACxB,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,SAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACtC,EAAA,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,IAAI,GAAG,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAGO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,GAAoC,EAAC,EACxB;AACb,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,IAAI,UAAA,EAAW;AAAA,MACzB,MAAA,EAAQ,IAAI,YAAA,EAAa;AAAA,MACzB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC7B;AAAA,EACF;AACA,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,IAAI,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,WAAA,CAAY,KAAK,QAAQ,CAAA;AAC9C,EAAA,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,GAAG,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA,EAAG,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA;AACzE,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAGA,IAAM,aAAA,GAAgB,kBAAA;AAIf,SAAS,YACd,MAAA,EACa;AACb,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,OAAO,KAAA,GAAQ,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,GAAS,CAAA;AAC3B,EAAA,MAAM,KAAK,EAAA,GAAK,aAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,aAAA;AAChB,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,CAAA,CAAE,MAAA,CAAO,EAAA,GAAK,EAAA,EAAI,EAAE,CAAA;AACpB,EAAA,CAAA,CAAE,OAAA,CAAQ,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AACzD,EAAA,CAAA,CAAE,OAAA,CAAQ,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAE,CAAA;AACzD,EAAA,CAAA,CAAE,OAAA,CAAQ,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AACzD,EAAA,CAAA,CAAE,OAAA,CAAQ,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAE,CAAA;AACzD,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAIO,SAAS,kBAAA,CACd,MAAA,EACA,MAAA,EACA,KAAA,EACA,WAAW,CAAA,EACE;AACb,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,CAAA,GAAI,QAAA,GAAY,CAAA,GAAI,KAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AAC7C,IAAA,MAAM,IAAI,MAAA,CAAO,CAAA,GAAI,MAAA,GAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AACxC,IAAA,MAAM,IAAI,MAAA,CAAO,CAAA,GAAI,MAAA,GAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AACxC,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAIO,SAAS,QAAA,CACd,QACA,WAAA,EACA,MAAA,GAAS,GACT,WAAA,GAAsB,WAAA,GAAc,CAAA,EACpC,QAAA,GAAW,CAAA,EACE;AACb,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,MAAM,IAAI,MAAA,GAAS,CAAA;AACnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,QAAA,GAAY,CAAA,GAAI,CAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACzC,IAAA,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,WAAA,GAAc,WAAA;AACtC,IAAA,MAAM,IAAI,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACnC,IAAA,MAAM,IAAI,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACnC,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAGO,SAAS,QAAA,CACd,GACA,CAAA,EACa;AACb,EAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAClB,EAAA,EAAA,CAAG,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAClB,EAAA,OAAO,GAAG,KAAA,EAAM;AAClB;;;AC7KO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,IAAA;AAEjC,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,IAAA;AAC7B,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,EACzD;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,WAAW,IAAA,GAAO,CAAA,QAAA;AAC/D,EAAA,IAAI,IAAA,GAAO,KAAA;AAEX,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,CAAA,KAAc;AACxC,IAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,IAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,IAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,IAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AACrB,IAAA,IAAA,GAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,cAAA,CAAe,UAAU,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAA,EAAI,IAAI,EAAA,KAAO;AACpD,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,MAAA;AAAA,MACL,KAAK,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,OAAO,EAAE,CAAA,EAAG,MAAA,CAAO,EAAA,GAAK,CAAC,CAAC,CAAA;AAClC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,GAAI,WAAA;AAAA,UACnC,EAAA;AAAA,UAAI,EAAA;AAAA,UACJ,OAAO,EAAE,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACzB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC7B,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC;AAAA,SAC/B;AACA,QAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,QAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,GAAA,GAAM,OAAO,EAAA,GAAK,CAAC,GAAG,GAAA,GAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC/C,QAAA,MAAM,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,IAAI,uBAAA,CAAwB,EAAA,EAAI,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,KAAK,GAAG,CAAA;AACjG,QAAA,MAAM,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,GAAI,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACrF,QAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,QAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA;AACH,QAAA;AAAA,MACF;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,GAAG,CAAA,CAAE,CAAA;AAAA;AAC1D,EACF,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAClE,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,GAAO,IAAA,EAAK;AACnF;;;ACxEO,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,GAAM,IAAA;AACN,IAAA,MAAM,CAAA,GAAI,aAAa,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA;AACtB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA;AACvB,IAAA,IAAI,KAAA,GAAQ,MAAM,IAAA,GAAO,KAAA;AACzB,IAAA,IAAI,MAAA,GAAS,MAAM,IAAA,GAAO,MAAA;AAAA,EAC5B;AACA,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,GAAO,IAAA,EAAK;AACnF;;;ACpBO,SAAS,eAAA,CAAgB,QAA2B,CAAA,EAAuB;AAChF,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC/D,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,MAAA,CAAO,CAAC,GAAG,CAAA,GAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACzB,IAAA,GAAA,CAAI,IAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,GAAA;AACT;;;ACAO,SAAS,aAAA,CAAc,MAAY,CAAA,EAAe;AACvD,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAC3B,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,CAAA,EAAG;AAEtB,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AACxB,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA;AACxB,MAAA,MAAM,EAAA,GAAK,CAAA,IAAK,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,CAAA,GAAS,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,CAAA,IAAK,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAA,GAAU,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,QAClB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,QAClB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAAA,QACvB,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE;AAAA,OAC1B;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,IAAI,WAAA,EAAY,CAC1B,MAAA,CAAO,KAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,CACrB,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,CAClC,MAAA,CAAO,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,EAAO,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,CAChD,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,CACnC,KAAA,GACA,KAAA,EAAM;AACT,IAAA,OAAO,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,gBAAA,CAAiB,MAAM,CAAC,CAAA;AACjC;AAEA,SAAS,gBAAA,CAAiB,MAAmB,CAAA,EAAsB;AAEjE,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AAC7C,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,EAAE;AACtD;;;AC9BO,SAAS,aAAA,CAAc,IAAA,EAAY,EAAA,EAAY,EAAA,EAAkB;AACtE,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAChG;AACA,EAAA,OAAO,oBAAA,CAAqB,IAAA,EAAM,EAAA,EAAI,EAAE,CAAA;AAC1C;AAEA,SAAS,oBAAA,CAAqB,IAAA,EAAmB,EAAA,EAAY,EAAA,EAAyB;AACpF,EAAA,MAAM,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,MAAM,CAAA;AAChD,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,IAAA;AAC7B,EAAA,cAAA,CAAe,QAAA,EAAU,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAA,KAAO;AAC5C,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,GAAA,GAAM,qBAAA,CAAsB,GAAG,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,IAAK,CAAA,EAAG;AACjE,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA,GAAI,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA,GAAI,EAAA;AAChC,MAAA,IAAA,CAAK,EAAA,GAAK,IAAI,CAAC,CAAA,GAAI,OAAO,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,EAAA;AAAA,IAC1C;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS;AAC3F;AAUO,SAAS,iBAAA,CAAkB,MAAY,MAAA,EAAwB;AACpE,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,EAC9F;AACA,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA;AACvC;AAEA,SAAS,YAAA,CAAa,IAAA,EAAmB,GAAA,EAAe,GAAA,EAA4B;AAClF,EAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,GAAG,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAA,CAAI,GAAG,GAAA,CAAI,KAAA,EAAO,IAAI,MAAM,CAAA;AAE3F,EAAA,OAAO,aAAA,CAAc,MAAM,CAAC,CAAA;AAC9B;;;AC7CO,SAAS,WAAA,CAAY,QAAc,KAAA,EAAmB;AAC3D,EAAA,MAAM,MAAA,GAAS,WAAW,MAAM,CAAA;AAChC,EAAA,OAAO,aAAA,CAAc,KAAA,EAAO,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAChD;AAGO,SAAS,aAAA,CAAc,QAAc,KAAA,EAAmB;AAC7D,EAAA,MAAM,MAAA,GAAS,WAAW,MAAM,CAAA;AAChC,EAAA,OAAO,cAAc,KAAA,EAAO,CAAC,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAClD;AAEA,SAAS,WAAW,IAAA,EAAsC;AACxD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,GAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAE;AAIxD,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AACzC,IAAA,IAAI,OAAO,CAAC,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrC,IAAA,IAAI,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,MAAM,IAAA,GAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,SAAS,QAAA,EAAU,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC3C,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAC5B;;;ACrBO,SAAS,cAAc,IAAA,EAAkC;AAC9D,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS,GAAI,IAAA;AACvC,EAAA,MAAM,MAAqB,EAAC;AAI5B,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,cAAA,CAAe,UAAU,MAAA,EAAQ,CAAC,KAAK,EAAA,EAAI,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,CAAA,IAAK,QAAA,EAAU;AACrC,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,QAAA,EAAU,CAAC,CAAA;AAAA,MACpC,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY,EAAE,CAAA;AAAA,MACnC;AAAA,KACD,CAAA;AACD,IAAA,QAAA,GAAW,CAAA;AACX,IAAA,UAAA,GAAa,EAAA;AAAA,EACf,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,IAAA,CAAK;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAAA,IACjC,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,IAC/B;AAAA,GACD,CAAA;AAED,EAAA,OAAO,GAAA;AACT;;;ACpCA,IAAM,IAAA,GAAO,CAAC,GAAA,GAAM,IAAA,CAAK,KAAK,EAAE,CAAA,GAAI,EAAA,EAAI,GAAA,EAAK,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,EAAE,IAAI,EAAE,CAAA;AACrE,IAAM,OAAO,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAU7B,SAAS,eAAe,IAAA,EAAoB;AACjD,EAAA,IAAI,KAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,MAAA;AACnD,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,IAAA;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,MAAA,GAAS,GAAG,MAAA,GAAS,CAAA;AACzB,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACrB,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,IAAA,EAAM,KAAA,IAAS,IAAA,GAAO,MAAA,GAAS,MAAA,GAAS,IAAA;AAC5C,IAAA,IAAA,GAAO,KAAA;AAAA,EACT,CAAA;AACA,EAAA,cAAA,CAAe,UAAU,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAA,EAAI,IAAI,EAAA,KAAO;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,EAAM;AACN,MAAA,MAAA,GAAS,IAAA,GAAO,OAAO,EAAE,CAAA;AACzB,MAAA,MAAA,GAAS,IAAA,GAAO,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA;AAC7B,MAAA,IAAA,GAAO,IAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAAE,MAAA,KAAA,EAAM;AAAG,MAAA,IAAA,GAAO,MAAA;AAAQ,MAAA,IAAA,GAAO,MAAA;AAAQ,MAAA;AAAA,IAAQ;AACrE,IAAA,IAAI,CAAC,IAAA,EAAM;AAAE,MAAA,MAAA,GAAS,EAAA;AAAI,MAAA,MAAA,GAAS,EAAA;AAAI,MAAA,IAAA,GAAO,IAAA;AAAA,IAAM;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,GAAO,OAAO,EAAE,CAAA;AAAG,MAAA,IAAA,GAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACvC,MAAA,KAAA,IAAS,EAAA,GAAK,OAAO,IAAA,GAAO,EAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,GAAA,KAAQ,MAAA;AACtB,IAAA,MAAM,KAAK,MAAA,CAAO,EAAE,GAAG,EAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACzC,IAAA,MAAM,EAAA,GAAK,OAAO,EAAA,GAAK,CAAC,GAAG,EAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7C,IAAA,MAAM,EAAA,GAAK,KAAA,GAAQ,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,KAAA,GAAQ,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA,GAAI,EAAA;AACtE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAC3B,MAAA,IAAI,CAAA,EAAW,GAAW,EAAA,EAAY,EAAA;AACtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA;AAC3E,QAAA,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA;AAC3E,QAAA,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,CAAA;AACpE,QAAA,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA;AAC1C,QAAA,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA;AAC1C,QAAA,EAAA,GAAK,CAAA,IAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,KAAK,EAAA,GAAK,EAAA,CAAA,CAAA;AACpC,QAAA,EAAA,GAAK,CAAA,IAAK,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,KAAK,EAAA,GAAK,EAAA,CAAA,CAAA;AAAA,MACtC;AACA,MAAA,KAAA,IAAS,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,GAAI,KAAK,CAAA,GAAI,EAAA,CAAA;AAAA,IACnC;AACA,IAAA,IAAA,GAAO,EAAA;AAAI,IAAA,IAAA,GAAO,EAAA;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,KAAA,EAAM;AACN,EAAA,OAAO,KAAA,GAAQ,CAAA;AACjB;AAeO,SAAS,YAAY,IAAA,EAAgC;AAC1D,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,OAAkB,EAAC;AACvB,EAAA,IAAI,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AACjB,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAoB;AACjC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,EAAA;AACpD,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,EAAA;AACpD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAG,MAAA,GAAA,CAAI,IAAA,CAAK,IAAI,EAAE,CAAA;AAClC,MAAA,IAAI,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,EAAA,EAAI;AAAE,QAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAG,QAAA,GAAA,CAAI,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,MAAG;AAAA,IACrE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAG,MAAA,GAAA,CAAI,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,IACpC;AACA,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,CAAA;AACf,MAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ,GAAA,CAAI,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,WAAA,IAChE,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC5B,IAAA,IAAA,GAAO,EAAC;AACR,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,IAAA;AAC7B,EAAA,cAAA,CAAe,UAAU,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAA,EAAI,IAAI,EAAA,KAAO;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,EAAA,GAAK,OAAO,EAAE,CAAA;AAAG,MAAA,EAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACnC,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAAE,MAAA,KAAA,CAAM,IAAI,CAAA;AAAG,MAAA;AAAA,IAAQ;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AAAE,MAAA,EAAA,GAAK,EAAA;AAAI,MAAA,EAAA,GAAK,EAAA;AAAI,MAAA,OAAA,GAAU,IAAA;AAAA,IAAM;AAClD,IAAA,MAAM,IAAI,GAAA,KAAQ,MAAA,GAAS,CAAA,GAAI,GAAA,KAAQ,SAAS,CAAA,GAAI,CAAA;AACpD,IAAA,IAAA,CAAK,KAAK,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,CAAM,KAAK,MAAA,CAAO,QAAA,CAAS,EAAA,EAAI,EAAA,GAAK,CAAC,CAAC,CAAA,EAAG,OAAO,EAAA,EAAI,KAAA,EAAO,IAAI,CAAA;AAAA,EACxF,CAAC,CAAA;AACD,EAAA,KAAA,CAAM,KAAK,CAAA;AAEX,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,IAAI,UAAA,CAAW,IAAI,CAAA;AAAA,IAC7B,MAAA,EAAQ,IAAI,YAAA,CAAa,GAAG,CAAA;AAAA,IAC5B,UAAU,IAAA,CAAK;AAAA,GACjB;AACF;;;AChHA,IAAM,MAAA,GAAS,4CAAA;AAEf,IAAM,SAAA,GAAY,4CAAA;AAOlB,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAoB;AACtD,EAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,CAAC,GAAG,OAAO,KAAA;AAChC,EAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACnC,EAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,OAAO,IAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAC7D,EAAA,OAAO,CAAC,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,CAAC,KAAK,EAAE,CAAA;AAC9B;AAGA,SAAS,SAAS,CAAA,EAA8C;AAC9D,EAAA,MAAM,MAAyC,EAAC;AAEhD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,IAAA,IAAI,eAAA,CAAgB,CAAA,EAAG,CAAC,CAAA,EAAG;AAEzB,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,IAAI,CAAA,CAAE,MAAA,IAAU,CAAC,eAAA,CAAgB,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,EAAA;AAC/C,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACjC,MAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,GAAA;AAAA,QACA,IAAA,EAAM,QAAQ,GAAA,IAAO,GAAA,KAAQ,MAAM,WAAA,CAAY,QAAQ,CAAA,GAAI,WAAA,CAAY,QAAQ;AAAA,OAChF,CAAA;AACD,MAAA,CAAA,GAAI,CAAA;AAAA,IACN,CAAA,MAAO;AAEL,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAqB;AACxC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,CAAA;AACJ,EAAA,MAAA,CAAO,SAAA,GAAY,CAAA;AACnB,EAAA,OAAA,CAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,OAAO,IAAA,EAAM;AACpC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACrB,IAAA,IAAI,OAAO,QAAA,CAAS,CAAC,CAAA,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,YAAY,CAAA,EAAqB;AACxC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,IAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,IAAA,IAAI,CAAA,KAAM,OAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,IAAQ,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM;AAAE,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AACvF,IAAA,MAAM,IAAA,GAAO,IAAI,MAAA,GAAS,CAAA;AAC1B,IAAA,IAAI,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG;AAC5B,MAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,OAAO,GAAA;AACnC,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,KAAM,GAAA,GAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,SAAA,GAAY,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAC,GAAG,OAAO,GAAA;AACf,IAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AACrB,IAAA,CAAA,GAAI,SAAA,CAAU,SAAA;AAAA,EAChB;AACA,EAAA,OAAO,GAAA;AACT;AAOA,IAAM,UAAA,GAAqC;AAAA,EACzC,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG;AAC3D,CAAA;AAkBO,SAAS,SAAA,CACd,GACA,MAAA,EACkC;AAClC,EAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,MAAM,EAAA,GAAiB;AAAA,IACrB,CAAA,EAAG,CAAA;AAAA,IAAG,CAAA,EAAG,CAAA;AAAA,IAAG,MAAA,EAAQ,CAAA;AAAA,IAAG,MAAA,EAAQ,CAAA;AAAA,IAC/B,aAAA,EAAe,IAAA;AAAA,IAAM,YAAA,EAAc;AAAA,GACrC;AAEA,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,IAAA,EAAK,IAAK,MAAA,EAAQ;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,IAAA,MAAM,WAAW,GAAA,KAAQ,KAAA;AACzB,IAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAA,GAAS,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AACvC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,CAAA,CAAE,KAAA,EAAM;AACR,MAAA,EAAA,CAAG,IAAI,EAAA,CAAG,MAAA;AACV,MAAA,EAAA,CAAG,IAAI,EAAA,CAAG,MAAA;AACV,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,aAAa,CAAA,GAAI,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,QAAQ,CAAA;AACrE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,QAAA,EAAA,CAAW,CAAA,GAAI,KAAK,QAAQ,CAAA;AAErD,MAAA,MAAM,cAAA,GAAiB,KAAA,KAAU,GAAA,IAAO,CAAA,GAAI,IAAI,GAAA,GAAM,KAAA;AACtD,MAAA,UAAA,CAAW,cAAA,EAAgB,QAAA,EAAU,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAEA,SAAS,UAAA,CACP,KAAA,EACA,QAAA,EACA,CAAA,EACA,IACA,CAAA,EACM;AACN,EAAA,MAAM,EAAA,GAAK,QAAA,GAAW,EAAA,CAAG,CAAA,GAAI,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,QAAA,GAAW,EAAA,CAAG,CAAA,GAAI,CAAA;AAC7B,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACjB,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACjB,MAAA,CAAA,CAAE,MAAA,CAAO,GAAG,CAAC,CAAA;AACb,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AAAG,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACjB,MAAA,EAAA,CAAG,MAAA,GAAS,CAAA;AAAG,MAAA,EAAA,CAAG,MAAA,GAAS,CAAA;AAC3B,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACjB,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACjB,MAAA,CAAA,CAAE,MAAA,CAAO,GAAG,CAAC,CAAA;AACb,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AAAG,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACjB,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,QAAA,GAAW,GAAG,CAAA,GAAI,CAAA,CAAA;AACpC,MAAA,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA;AAChB,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACP,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,QAAA,GAAW,GAAG,CAAA,GAAI,CAAA,CAAA;AACpC,MAAA,CAAA,CAAE,MAAA,CAAO,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA;AAChB,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACP,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClC,MAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClC,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAChC,MAAA,CAAA,CAAE,QAAQ,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAC9B,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AAAG,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACjB,MAAA,EAAA,CAAG,aAAA,GAAgB,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAClC,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AAGR,MAAA,MAAM,GAAA,GAAM,GAAG,aAAA,IAAiB,EAAE,GAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAE;AACnD,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClC,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAChC,MAAA,CAAA,CAAE,QAAQ,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAC9B,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AAAG,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACjB,MAAA,EAAA,CAAG,aAAA,GAAgB,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAClC,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClC,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAChC,MAAA,CAAA,CAAE,MAAA,CAAO,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AAAG,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACjB,MAAA,EAAA,CAAG,YAAA,GAAe,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACjC,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,GAAA,GAAM,GAAG,YAAA,IAAgB,EAAE,GAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAE;AAClD,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,GAAA,CAAI,CAAA;AAC1B,MAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAChC,MAAA,CAAA,CAAE,MAAA,CAAO,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AAAG,MAAA,EAAA,CAAG,CAAA,GAAI,CAAA;AACjB,MAAA,EAAA,CAAG,YAAA,GAAe,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACjC,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACzB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA;AACvB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAClB,MAAA,WAAA,CAAY,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,CAAC,CAAA;AAClE,MAAA,EAAA,CAAG,CAAA,GAAI,EAAA;AAAI,MAAA,EAAA,CAAG,CAAA,GAAI,EAAA;AAClB,MAAA,EAAA,CAAG,aAAA,GAAgB,IAAA;AACnB,MAAA,EAAA,CAAG,YAAA,GAAe,IAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA;AACE,MAAA;AAAA;AAEN;AAWA,SAAS,WAAA,CACP,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,IAAY,EAAA,EACZ,gBAAA,EACA,QAAA,EACA,KAAA,EACA,CAAA,EACM;AACN,EAAA,IAAI,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,EAAA,EAAI;AAC5B,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG;AACxB,IAAA,CAAA,CAAE,MAAA,CAAO,IAAI,EAAE,CAAA;AACf,IAAA;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAO,gBAAA,GAAmB,IAAA,CAAK,EAAA,GAAM,GAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAG3B,EAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,EAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,EAAA,MAAM,GAAA,GAAM,MAAA,GAAS,EAAA,GAAK,MAAA,GAAS,EAAA;AACnC,EAAA,MAAM,GAAA,GAAM,CAAC,MAAA,GAAS,EAAA,GAAK,MAAA,GAAS,EAAA;AAGpC,EAAA,IAAI,MAAM,EAAA,GAAK,EAAA;AACf,EAAA,IAAI,MAAM,EAAA,GAAK,EAAA;AACf,EAAA,MAAM,OAAO,GAAA,GAAM,GAAA;AACnB,EAAA,MAAM,OAAO,GAAA,GAAM,GAAA;AACnB,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,GAAA,GAAM,IAAA,GAAO,GAAA;AACnC,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACnC,IAAA,OAAA,GAAU,UAAA,GAAa,EAAA;AACvB,IAAA,OAAA,GAAU,UAAA,GAAa,EAAA;AACvB,IAAA,GAAA,GAAM,OAAA,GAAU,OAAA;AAChB,IAAA,GAAA,GAAM,OAAA,GAAU,OAAA;AAAA,EAClB;AAGA,EAAA,MAAMC,KAAAA,GAAO,QAAA,KAAa,KAAA,GAAQ,EAAA,GAAK,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,OAAO,GAAA,GAAM,IAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,GAAA,GAAM,IAAA,GAAO,GAAA,GAAM,IAAA;AAC/B,EAAA,MAAM,MAAA,GAASA,QAAO,IAAA,CAAK,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,GAAG,CAAC,CAAA;AACtD,EAAA,MAAM,GAAA,GAAO,MAAA,IAAU,OAAA,GAAU,GAAA,CAAA,GAAQ,OAAA;AACzC,EAAA,MAAM,GAAA,GAAO,MAAA,GAAS,EAAE,OAAA,GAAU,GAAA,CAAA,GAAQ,OAAA;AAG1C,EAAA,MAAM,KAAK,MAAA,GAAS,GAAA,GAAM,MAAA,GAAS,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACrD,EAAA,MAAM,KAAK,MAAA,GAAS,GAAA,GAAM,MAAA,GAAS,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AAGrD,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAuB;AACxE,IAAA,MAAMC,IAAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAA,CAAM,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,KAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,CAAG,CAAA;AAC/D,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,IAAAA,GAAM,GAAG,CAAC,CAAC,CAAA;AACtD,IAAA,IAAI,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA,MAAO,CAAC,CAAA;AAChC,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,CAAA,EAAG,CAAA,EAAA,CAAI,MAAM,GAAA,IAAO,OAAA,EAAA,CAAU,GAAA,GAAM,GAAA,IAAO,OAAO,CAAA;AACvE,EAAA,IAAI,MAAA,GAAS,KAAA;AAAA,IAAA,CACV,MAAM,GAAA,IAAO,OAAA;AAAA,IAAA,CACb,MAAM,GAAA,IAAO,OAAA;AAAA,IAAA,CACb,CAAC,MAAM,GAAA,IAAO,OAAA;AAAA,IAAA,CACd,CAAC,MAAM,GAAA,IAAO;AAAA,GACjB;AACA,EAAA,IAAI,CAAC,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,IAAU,IAAI,IAAA,CAAK,EAAA;AAAA,OAAA,IACpC,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,IAAU,IAAI,IAAA,CAAK,EAAA;AAGjD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,EAAA,GAAK,EAAE,CAAC,CAAA;AACxE,EAAA,MAAM,WAAW,MAAA,GAAS,QAAA;AAG1B,EAAA,MAAM,IAAK,CAAA,GAAI,CAAA,GAAK,IAAA,CAAK,GAAA,CAAI,WAAW,CAAC,CAAA;AAEzC,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,MAAA,GAAS,CAAC,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,OAAA;AACjC,EAAA,IAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,OAAA;AAEhC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,KAAA,GAAQ,SAAS,CAAA,GAAI,QAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,KAAK,MAAA,IAAU,IAAA,GAAO,OAAA,CAAA,GAAW,MAAA,IAAU,OAAO,OAAA,CAAA,GAAW,EAAA;AACnE,IAAA,MAAM,KAAK,MAAA,IAAU,IAAA,GAAO,OAAA,CAAA,GAAW,MAAA,IAAU,OAAO,OAAA,CAAA,GAAW,EAAA;AACnE,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,GAAO,OAAA;AACtB,IAAA,MAAM,QAAQ,IAAA,GAAO,OAAA;AACrB,IAAA,MAAM,MAAM,KAAA,GAAQ,MAAA,IAAU,CAAA,GAAI,MAAA,CAAA,GAAU,UAAU,CAAA,GAAI,MAAA,CAAA;AAC1D,IAAA,MAAM,MAAM,KAAA,GAAQ,MAAA,IAAU,CAAA,GAAI,MAAA,CAAA,GAAU,UAAU,CAAA,GAAI,MAAA,CAAA;AAC1D,IAAA,MAAM,MAAM,EAAA,GAAK,MAAA,IAAU,CAAA,GAAI,KAAA,CAAA,GAAS,UAAU,CAAA,GAAI,KAAA,CAAA;AACtD,IAAA,MAAM,MAAM,EAAA,GAAK,MAAA,IAAU,CAAA,GAAI,KAAA,CAAA,GAAS,UAAU,CAAA,GAAI,KAAA,CAAA;AACtD,IAAA,CAAA,CAAE,QAAQ,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAI,EAAE,CAAA;AACpC,IAAA,KAAA,GAAQ,EAAA;AACR,IAAA,KAAA,GAAQ,EAAA;AACR,IAAA,MAAA,GAAS,KAAA;AACT,IAAA,MAAA,GAAS,KAAA;AAAA,EACX;AACF;;;ACrWO,SAAS,cAAA,CACd,IAAA,EACA,CAAA,EACA,IAAA,GAA8B,EAAC,EACX;AACpB,EAAA,MAAM,SAAA,GAAY,gBAAA;AAAA,IAChB,IAAA;AAAA,IACA,IAAA,CAAK,qBAAqB,MAAA,GAAY,KAAK,EAAE,gBAAA,EAAkB,KAAK,gBAAA;AAAiB,GACvF;AAGA,EAAA,MAAM,WAA8E,EAAC;AACrF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA;AACJ,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,MAAA,CAAO,MAAA,GAAS,CAAA;AACjC,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,KAAA,KAAU,EAAE,CAAA,EAAG,EAAA,CAAG,MAAA,CAAO,CAAC,GAAI,CAAA,EAAG,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG;AAC/C,IAAA,MAAMC,KAAAA,GAAO,EAAA,CAAG,MAAA,GAAS,KAAA,GAAQ,KAAA,GAAQ,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AACpB,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,CAAA,GAAI,IAAI,CAAC,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,CAAA,GAAI,IAAI,CAAC,CAAA;AAC9B,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACvC,MAAA,IAAI,QAAQ,CAAA,EAAG;AACf,MAAA,QAAA,CAAS,KAAK,EAAE,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA;AACrC,MAAA,KAAA,IAAS,GAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,IAAA;AAChC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAE,EAAE;AAE1E,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA;AAC7C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,MAAA,GAAS,GAAA,CAAI,GAAA,GAAM,MAAA,EAAQ;AAC7B,MAAA,MAAA,IAAU,GAAA,CAAI,GAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAA,CAAK,MAAA,GAAS,MAAA,IAAU,GAAA,CAAI,GAAA;AAClC,IAAA,OAAO;AAAA,MACL,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,EAAA,GAAA,CAAM,IAAI,EAAA,GAAK,GAAA,CAAI,EAAA,IAAM,CAAA,EAAG,GAAG,GAAA,CAAI,EAAA,GAAA,CAAM,IAAI,EAAA,GAAK,GAAA,CAAI,MAAM,CAAA,EAAE;AAAA,MAC9E,OAAA,EAAS,EAAE,CAAA,EAAA,CAAI,GAAA,CAAI,KAAK,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,GAAA,EAAK,IAAI,GAAA,CAAI,EAAA,GAAK,GAAA,CAAI,EAAA,IAAM,IAAI,GAAA;AAAI,KAC5E;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,EAAA,OAAO;AAAA,IACL,OAAO,EAAE,CAAA,EAAG,KAAK,EAAA,EAAI,CAAA,EAAG,KAAK,EAAA,EAAG;AAAA,IAChC,OAAA,EAAS,EAAE,CAAA,EAAA,CAAI,IAAA,CAAK,KAAK,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,IAAM,KAAK,GAAA;AAAI,GAClF;AACF;;;ACxEA,SAAS,yBACP,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAC5B;AAGR,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,GAAK,IAAI,EAAA,IAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AAC9C,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,GAAK,IAAI,EAAA,IAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AAC9C,EAAA,IAAI,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,SAAU,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA;AAE9C,EAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,EAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,EAAA;AACxC,EAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,EAAI,MAAA,GAAS,KAAK,EAAA,GAAK,EAAA;AACxC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,KAAK,MAAM,CAAA;AAC1C;AAMO,SAAS,mBAAA,CAAoB,IAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC9E,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,wBAAA,CAAyB,EAAA,EAAI,EAAA,EAAI,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,CAAK,QAAQ,EAAA,EAAI,EAAE,GAAG,IAAA,IAAQ,QAAA;AACpE;;;AC5BO,SAAS,YAAA,CACd,SACA,cAAA,EACa;AACb,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,IAAI,UAAA,EAAW;AAAA,MACzB,MAAA,EAAQ,IAAI,YAAA,EAAa;AAAA,MACzB,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAE,GAAG,OAAA,CAAQ,CAAC,EAAE,CAAC,CAAA;AAEnC,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,iBAAA,CAAkB,GAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC3C,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAEA,EAAA,YAAA,CAAa,OAAA,EAAS,gBAAgB,CAAC,CAAA;AACvC,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;AAEA,SAAS,YAAA,CACP,OAAA,EACA,cAAA,EACA,CAAA,EACM;AACN,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAMC,IAAAA,GAAM,YAAY,OAAO,CAAA;AAC/B,IAAA,CAAA,CAAE,QAAQA,IAAAA,CAAI,GAAA,CAAI,GAAGA,IAAAA,CAAI,GAAA,CAAI,GAAGA,IAAAA,CAAI,GAAA,CAAI,CAAA,EAAGA,IAAAA,CAAI,IAAI,CAAA,EAAGA,IAAAA,CAAI,IAAI,CAAA,EAAGA,IAAAA,CAAI,IAAI,CAAC,CAAA;AAC1E,IAAA;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,YAAY,OAAO,CAAA;AAC/B,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,YAAA,CAAa,SAAS,GAAG,CAAA;AAC5D,EAAA,IAAI,UAAA,IAAc,iBAAiB,cAAA,EAAgB;AACjD,IAAA,CAAA,CAAE,QAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,GAAA,CAAI,GAAA,CAAI,GAAG,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAC1E,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,aAAa,CAAC,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AACtC,EAAA,YAAA,CAAa,IAAA,EAAM,gBAAgB,CAAC,CAAA;AACpC,EAAA,YAAA,CAAa,KAAA,EAAO,gBAAgB,CAAC,CAAA;AACvC;AAEA,SAAS,YAAA,CACP,SACA,GAAA,EAC4C;AAC5C,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC3C,IAAA,MAAM,CAAA,GAAI,CAAA,IAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAA;AAChC,IAAA,MAAM,CAAA,GAAI,aAAa,CAAA,EAAG,GAAA,CAAI,KAAK,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AACtD,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,UAAA,GAAa,EAAA;AACb,MAAA,UAAA,GAAa,CAAA;AAAA,IACf;AAAA,EACF;AACA,EAAA,OAAO,EAAE,YAAY,UAAA,EAAW;AAClC;AAQA,SAAS,YAAY,OAAA,EAAyC;AAC5D,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,EAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA;AACvB,EAAA,MAAM,SAAS,IAAA,CAAKC,IAAAA,CAAI,QAAQ,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,KAAKA,IAAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAExC,EAAA,MAAM,EAAA,GAAK,iBAAiB,OAAO,CAAA;AACnC,EAAA,IAAI,EAAA,KAAO,IAAA,EAAM,OAAO,EAAE,KAAK,EAAE,GAAG,CAAA,EAAE,EAAG,KAAK,EAAE,GAAG,CAAA,EAAE,EAAG,KAAK,CAAA,EAAE;AAE/D,EAAA,IAAI,MAAM,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,EAAG,CAAA,EAAG,QAAQ,IAAI,CAAA;AACjD,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,cAAA,CAAe,OAAA,EAAS,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACrC,IAAA,GAAA,GAAM,QAAQ,OAAA,EAAS,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,QAAQ,IAAI,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAiB,OAAA,EAAgD;AACxE,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,EAAA,MAAM,EAAA,GAAK,IAAI,KAAA,CAAc,CAAC,CAAA;AAC9B,EAAA,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,KAAK,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AACxC,IAAA,EAAA,CAAG,CAAC,CAAA,GAAI,KAAA;AAAA,EACV;AACA,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AACxB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,EAAA,CAAG,CAAC,CAAA,IAAK,KAAA;AACrC,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,QACP,OAAA,EACA,EAAA,EACA,CAAA,EACA,CAAA,EACA,QACA,IAAA,EACU;AACV,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,EAAA,IAAI,GAAA,GAAM,GAAG,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AAC5C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACd,IAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,CAAA;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,CAAA;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,CAAA;AACtB,IAAA,GAAA,IAAO,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AACzB,IAAA,GAAA,IAAO,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AACzB,IAAA,GAAA,IAAO,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AACzB,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,CAAE,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,CAAE,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,CAAE,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,IAAM,CAAA,CAAE,CAAA;AAC/D,IAAA,EAAA,IAAM,GAAA,GAAM,UAAU,GAAA,GAAM,OAAA;AAC5B,IAAA,EAAA,IAAM,GAAA,GAAM,UAAU,GAAA,GAAM,OAAA;AAAA,EAC9B;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC9B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,EAAO;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACvB,IAAA,MAAA,GAAS,SAAS,KAAA,GAAQ,CAAA;AAAA,EAC5B,CAAA,MAAO;AACL,IAAA,MAAA,GAAA,CAAU,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA,IAAM,GAAA;AACjC,IAAA,MAAA,GAAA,CAAU,GAAA,GAAM,EAAA,GAAK,GAAA,GAAM,EAAA,IAAM,GAAA;AACjC,IAAA,IAAI,MAAA,GAAS,IAAA,IAAQ,MAAA,GAAS,IAAA,EAAM;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AACvB,MAAA,MAAA,GAAS,SAAS,KAAA,GAAQ,CAAA;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,IAAI,MAAA,EAAO;AAAA,IAC9D,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,IAAI,MAAA,EAAO;AAAA,IAC1D,GAAA,EAAK;AAAA,GACP;AACF;AAEA,SAAS,cAAA,CACP,OAAA,EACA,EAAA,EACA,CAAA,EACA,GACA,GAAA,EACM;AAEN,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC3C,IAAA,EAAA,CAAG,CAAC,IAAI,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,CAAI,KAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EACpG;AACF;AAEA,SAAS,cACP,CAAA,EACA,CAAA,EACA,EAAA,EACA,EAAA,EACA,IACA,EAAA,EACQ;AAGR,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,GAAI,YAAA,CAAa,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,IAAE,CAAA,GAAE,CAAA,IAAG,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,CAAA,GAAE,CAAA,GAAE,KAAG,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,CAAA,GAAK,CAAA,GAAE,IAAE,CAAA,IAAG,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,CAAA;AACzE,EAAA,MAAM,GAAA,GAAM,IAAE,CAAA,GAAE,CAAA,IAAG,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,CAAA,GAAE,CAAA,GAAE,KAAG,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,CAAA,GAAK,CAAA,GAAE,IAAE,CAAA,IAAG,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,CAAA;AACzE,EAAA,MAAM,OAAO,CAAA,GAAE,CAAA,IAAG,EAAA,CAAG,CAAA,GAAI,IAAE,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,CAAA,GAAK,IAAE,CAAA,IAAG,EAAA,CAAG,IAAI,CAAA,GAAE,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,CAAA;AAClE,EAAA,MAAM,OAAO,CAAA,GAAE,CAAA,IAAG,EAAA,CAAG,CAAA,GAAI,IAAE,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,CAAA,GAAK,IAAE,CAAA,IAAG,EAAA,CAAG,IAAI,CAAA,GAAE,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,CAAA;AAClE,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,CAAE,CAAA;AAClB,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,CAAE,CAAA;AAClB,EAAA,MAAM,SAAA,GAAY,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA;AAClC,EAAA,MAAM,cAAc,GAAA,GAAM,GAAA,GAAM,MAAM,GAAA,GAAM,EAAA,GAAK,OAAO,EAAA,GAAK,IAAA;AAC7D,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,GAAI,OAAO,OAAO,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,IAAI,SAAA,GAAY,WAAA;AAC7B,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,EAAA,OAAO,IAAA;AACT;AAEA,SAASA,IAAAA,CAAI,GAAU,CAAA,EAAiB;AACtC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAE;AACtC;AACA,SAAS,IAAA,CAAK,GAAU,CAAA,EAAkB;AACxC,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACxC;AACA,SAAS,KAAK,CAAA,EAAiB;AAC7B,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7B,EAAA,IAAI,MAAM,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AACjC,EAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAE;AAClC;AAEA,SAAS,iBAAA,CACP,CAAA,EACA,CAAA,EACA,CAAA,EACM;AAEN,EAAA,MAAM,OAAO,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACjC,EAAA,MAAM,OAAO,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACjC,EAAA,MAAM,OAAO,CAAA,CAAE,CAAA,GAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,CAAA,GAAM,CAAA;AACvC,EAAA,MAAM,OAAO,CAAA,CAAE,CAAA,GAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,CAAA,GAAM,CAAA;AACvC,EAAA,CAAA,CAAE,OAAA,CAAQ,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC5C;;;ACnNO,SAAS,UAAU,CAAA,EAAqB;AAE7C,EAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB,EAAA,MAAM,GAAA,GAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA;AACpD,EAAA,OAAO,EAAE,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,EAAG,GAAA,EAAI;AAC/C;AAIO,SAAS,aAAa,CAAA,EAAqB;AAChD,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,IAAM,OAAO,CAAA,CAAE,EAAA;AACjC;AAOO,SAAS,eAAA,CACd,GAAA,EAAa,GAAA,EACb,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EACpC,CAAA,EAAW,IAAA,EACX,CAAA,EAAY,EAAA,EACH;AACT,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA;AACxD,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA;AACxD,EAAA,MAAM,QAAQ,IAAA,GAAO,IAAA;AACrB,EAAA,MAAM,WAAW,iBAAA,CAAkB,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAC/D,EAAA,IAAI,QAAA,IAAY,OAAO,OAAO,IAAA;AAC9B,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,KAAA;AAEnB,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,CAAA,GAAI,EAAA,CAAG,EAAA;AAC5B,EAAA,IAAI,QAAA,GAAW,KAAA,GAAQ,KAAA,EAAO,OAAO,KAAA;AAGrC,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC5B,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,MAAM,KAAM,CAAC,EAAA,GAAK,KAAM,CAAA,EAAG,EAAA,GAAM,KAAK,EAAA,GAAM,CAAA;AAC5C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA;AACtD,IAAA,IAAI,YAAA,CAAa,KAAK,GAAA,EAAK;AAAA,MACzB,GAAA,GAAM,EAAA;AAAA,MAAI,GAAA,GAAM,EAAA;AAAA,MAAI,GAAA,GAAM,EAAA;AAAA,MAAI,GAAA,GAAM,EAAA;AAAA,MACpC,GAAA,GAAM,EAAA;AAAA,MAAI,GAAA,GAAM,EAAA;AAAA,MAAI,GAAA,GAAM,EAAA;AAAA,MAAI,GAAA,GAAM;AAAA,KACtC,EAAG,KAAK,CAAA,EAAG,OAAO,IAAA;AAAA,EACpB;AAEA,EAAA,OAAO,gBAAgB,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAG,IAAA,EAAM,EAAE,CAAA,IACnD,eAAA,CAAgB,MAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,CAAA,EAAG,MAAM,EAAE,CAAA;AACxD;AAGA,SAAS,YAAA,CAAa,CAAA,EAAW,CAAA,EAAW,CAAA,EAAsB,KAAA,EAAwB;AACxF,EAAA,IAAI,GAAA,GAAM,GAAG,GAAA,GAAM,CAAA;AACnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,IAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,IAAA,MAAM,EAAA,GAAA,CAAM,EAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAC,MAAM,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAA;AAC5E,IAAA,IAAI,KAAK,CAAA,EAAG,GAAA,EAAA;AAAA,SAAA,IACH,KAAK,CAAA,EAAG,GAAA,EAAA;AAAA,EACnB;AACA,EAAA,IAAI,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,IAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,IAAA,IAAI,kBAAkB,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAC,GAAG,CAAA,CAAE,CAAC,GAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAC,CAAA,IAAK,OAAO,OAAO,IAAA;AAAA,EAC/E;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,eAAA,CAAgB,EAAA,EAAY,EAAA,EAAY,CAAA,EAAW,MAAc,EAAA,EAAsB;AAC9F,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,GAAG,GAAG,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,GAAG,CAAA;AACnD,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,EAAA,GAAK,MAAM,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,GAAM,EAAA,GAAK,MAAM,EAAE,CAAA;AACvC,EAAA,MAAM,KAAK,CAAA,GAAI,EAAA,CAAG,EAAA,EAAI,EAAA,GAAK,IAAI,EAAA,CAAG,EAAA;AAClC,EAAA,IAAI,MAAM,CAAA,EAAG;AAEX,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,EAAE,CAAA;AAC/B,IAAA,OAAO,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,IAAA;AAAA,EACvC;AACA,EAAA,OAAO,aAAA,CAAc,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,IAAK,IAAA;AACxC;AAOA,SAAS,aAAA,CAAc,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC7E,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA;AAC9B,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,CAAA;AACnB,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,IAAI,KAAK,CAAA,EAAG;AACV,MAAA,MAAM,EAAA,GAAM,EAAA,GAAK,EAAA,IAAO,EAAA,GAAK,EAAA,CAAA;AAC7B,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,MAAA,IAAI,KAAK,EAAA,GAAK,CAAA;AACd,MAAA,IAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA;AAC9B,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,QAAA,CAAA,GAAA,CAAK,KAAK,EAAA,IAAM,CAAA;AAChB,QAAA,IAAI,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,EAAA,EAAI;AAC1B,QAAA,MAAM,IAAI,EAAA,IAAM,CAAA,GAAI,EAAA,CAAA,EAAK,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,CAAA;AACvC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAC3B,QAAA,IAAI,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AAAA,aAAA,IACR,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AAAA,aACjB;AAAA,MACP;AACA,MAAA,MAAM,EAAA,GAAM,EAAA,GAAK,EAAA,IAAO,CAAA,GAAI,EAAA,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,MAAM,CAAA,GAAI,CAAA,CAAA;AACrB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,EAAA,GAAK,EAAA;AAAA,EACd;AACA,EAAA,MAAM,QAAQ,EAAA,GAAK,EAAA,EAAI,KAAA,GAAQ,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AAC9C,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,KAAA,GAAQ,KAAA;AAClB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAA,EAAG,EAAA,GAAK,KAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,EAAE,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,EAAA,GAAK,EAAA;AACd;;;ACvGA,SAAS,YAAA,CACP,MACA,SAAA,EAC0C;AAC1C,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,IAAA;AAC7B,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,IAAIA,OAAgB,EAAC;AAErB,EAAA,cAAA,CAAe,UAAU,MAAA,EAAQ,CAAC,GAAA,EAAK,EAAA,EAAI,MAAM,IAAA,KAAS;AACxD,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,MAAA;AACH,QAAA,IAAIA,IAAAA,CAAI,MAAA,IAAU,CAAA,EAAG,IAAA,CAAK,KAAKA,IAAG,CAAA;AAClC,QAAAA,IAAAA,GAAM,CAAC,MAAA,CAAO,EAAE,GAAG,MAAA,CAAO,EAAA,GAAK,CAAC,CAAC,CAAA;AACjC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAAA,IAAAA,CAAI,KAAK,MAAA,CAAO,EAAE,GAAG,MAAA,CAAO,EAAA,GAAK,CAAC,CAAC,CAAA;AACnC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,YAAA;AAAA,UACE,IAAA;AAAA,UAAM,IAAA;AAAA,UACN,OAAO,EAAE,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACzB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC7B,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC7B,SAAA;AAAA,UAAWA;AAAA,SACb;AACA,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,gBAAA;AAAA,UACE,IAAA;AAAA,UAAM,IAAA;AAAA,UACN,OAAO,EAAE,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACzB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC7B,SAAA;AAAA,UAAWA;AAAA,SACb;AACA,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAIA,IAAAA,CAAI,MAAA,IAAU,CAAA,EAAG,MAAA,CAAO,KAAKA,IAAG,CAAA;AAAA,aAAA,IAC3BA,IAAAA,CAAI,MAAA,IAAU,CAAA,EAAG,IAAA,CAAK,KAAKA,IAAG,CAAA;AACvC,QAAAA,OAAM,EAAC;AACP,QAAA;AAAA,MACF;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAE,CAAA;AAAA;AACzD,EACF,CAAC,CAAA;AACD,EAAA,IAAIA,IAAAA,CAAI,MAAA,IAAU,CAAA,EAAG,IAAA,CAAK,KAAKA,IAAG,CAAA;AAClC,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;AAEA,SAAS,cAAA,CAAe,MAAmB,IAAA,EAAsC;AAC/E,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK,SAAA,IAAa,yBAAyB,CAAA,CAAE,MAAA;AACzE;AAKO,SAAS,YACd,IAAA,EACA,CAAA,EACA,CAAA,EACA,IAAA,GAA2B,EAAC,EACnB;AACT,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,CAAA,IAAK,IAAA,CAAK,CAAA,IAAK,CAAA,IAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,CAAA,IAAK,IAAA,CAAK,CAAA,IAAK,CAAA,IAAK,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA;AAAA,EACtF;AACA,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAWA,IAAAA,IAAO,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAIA,IAAAA,CAAI,MAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,MAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,MAAA,MAAM,EAAA,GAAKA,KAAI,CAAA,GAAI,CAAC,GAAG,EAAA,GAAKA,IAAAA,CAAI,IAAI,CAAC,CAAA;AACrC,MAAA,IAAK,EAAA,GAAK,CAAA,KAAQ,EAAA,GAAK,CAAA,EAAI;AAC3B,MAAA,MAAM,KAAKA,IAAAA,CAAI,CAAC,CAAA,EAAG,EAAA,GAAKA,KAAI,CAAC,CAAA;AAC7B,MAAA,IAAI,KAAK,EAAA,GAAA,CAAO,CAAA,GAAI,OAAO,EAAA,GAAK,EAAA,CAAA,IAAQ,KAAK,EAAA,CAAA,EAAK;AAClD,MAAA,SAAA,EAAA;AACA,MAAA,OAAA,IAAW,EAAA,IAAM,IAAI,CAAA,GAAI,EAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,OAAO,KAAK,QAAA,KAAa,SAAA,GAAA,CAAa,SAAA,GAAY,CAAA,MAAO,IAAI,OAAA,KAAY,CAAA;AAC3E;AASO,SAAS,cACd,IAAA,EACA,CAAA,EACA,GACA,SAAA,EACA,IAAA,GAA6B,EAAC,EACrB;AACT,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG;AACvB,IAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,SAAA;AAC1B,IAAA,MAAM,CAAA,GAAa,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAChC,IAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,IAAA,IAAI,YAAA,CAAa,EAAE,CAAA,EAAG;AACpB,MAAA,OAAO,aAAA,CAAc,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,SAAA,GAAY,IAAA,CAAK,EAAA,GAAK,EAAA,CAAG,EAAA,EAAI,EAAE,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AAAA,IAC7F;AACA,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA,GAAI,GAAG,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAC3C,IAAA,OAAO,WAAA,CAAY,MAAM,IAAA,CAAK,SAAA,EAAW,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,KACpD,eAAA,CAAgB,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,WAAW,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,KAAK,SAAA,GAAY,SAAA;AACvB,EAAA,OAAO,YAAY,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,CAAC,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,KACpD,iBAAA,CAAkB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,KAAK,EAAE,CAAA;AACjD;AAIA,SAAS,WAAA,CACP,IAAA,EACA,SAAA,EACA,KAAA,EACS;AACT,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE,GAAI,IAAA;AAC9C,IAAA,OAAO,KAAA,CAAM,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,EAAE,CAAA,IAAK,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,GAAG,EAAA,GAAK,CAAC,CAAA,IAC/D,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,CAAC,CAAA,IAAK,KAAA,CAAM,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAE,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,KAAS,YAAA,CAAa,IAAA,EAAM,aAAa,yBAAyB,CAAA;AAClF,EAAA,MAAM,GAAA,GAAM,CAACA,IAAAA,EAAwB,IAAA,KAA2B;AAC9D,IAAA,MAAM,IAAIA,IAAAA,CAAI,MAAA;AACd,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,CAAA;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,KAAK,CAAA,EAAG;AAChC,MAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,MAAA,IAAI,MAAMA,IAAAA,CAAI,CAAC,CAAA,EAAGA,IAAAA,CAAI,IAAI,CAAC,CAAA,EAAGA,IAAAA,CAAI,CAAC,GAAGA,IAAAA,CAAI,CAAA,GAAI,CAAC,CAAC,GAAG,OAAO,IAAA;AAAA,IAC5D;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,CAACA,IAAAA,KAAQ,GAAA,CAAIA,MAAK,IAAI,CAAC,CAAA,IAAK,IAAA,CAAK,KAAK,CAACA,IAAAA,KAAQ,GAAA,CAAIA,IAAAA,EAAK,KAAK,CAAC,CAAA;AACnF;AAIA,SAAS,YAAY,CAAA,EAAe;AAClC,EAAA,OAAO;AAAA,IACL,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,IACjB,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,EAAE,KAAA,EAAO,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,IAC3B,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,OAAO,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAA,EAAO;AAAA,IACtC,EAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,GAAI,EAAE,MAAA;AAAO,GAC9B;AACF;AAGA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,MAAM,IAAA,GAAiB,IAAI,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAChD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,CAAE,CAAA;AACtB,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,iBAAA,CAAkB,GAAkB,CAAA,EAA2B;AACtE,EAAA,IAAI,EAAE,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,KAAA;AAC7C,EAAA,IAAI,cAAA,CAAe,YAAA,CAAa,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,GAAG,OAAO,IAAA;AAC5D,EAAA,IAAI,cAAA,CAAe,YAAA,CAAa,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,GAAG,OAAO,IAAA;AAC5D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA,GAAI,CAAA,IAAK,CAAA,CAAE,MAAM,CAAA;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA,GAAI,CAAA,IAAK,CAAA,CAAE,MAAM,CAAA;AAC1C,MAAA,IAAI,cAAc,EAAA,CAAG,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,CAAG,CAAC,GAAG,OAAO,IAAA;AAAA,IAC5E;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,OAAA,CACP,UACA,KAAA,EACS;AACT,EAAA,KAAA,MAAWA,QAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAIA,IAAAA,CAAI,MAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,MAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,MAAA,IAAI,MAAMA,IAAAA,CAAI,CAAC,CAAA,EAAGA,IAAAA,CAAI,IAAI,CAAC,CAAA,EAAGA,IAAAA,CAAI,CAAC,GAAGA,IAAAA,CAAI,CAAA,GAAI,CAAC,CAAC,GAAG,OAAO,IAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,UAA+B,CAAA,EAAkB;AAC3E,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,EAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,EAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AAC3D,EAAA,OAAO,OAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,KACpC,aAAA,CAAc,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAC5C,cAAc,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,KAC5C,aAAA,CAAc,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,IAC5C,aAAA,CAAc,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE;AAAA,GAC9C;AACF;AAEA,SAAS,qBAAA,CAAsB,UAA+B,IAAA,EAA8B;AAC1F,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC9B,EAAA,OAAO,QAAQ,QAAA,EAAU,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,KAAO;AAC3C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA,EAAG,KAAK,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,MAAM,CAAA;AACnD,MAAA,IAAI,aAAA,CAAc,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,GAAG,OAAO,IAAA;AAAA,IACpE;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAGA,SAAS,yBAAA,CAA0B,MAA2B,IAAA,EAA8B;AAC1F,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,MAAM,KAAK,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,GAAK,IAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,IAAI,CAAA,GAAI,CAAC,GAAG,EAAA,GAAK,GAAA,CAAI,IAAI,CAAC,CAAA;AACnE,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA,EAAG,KAAK,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,MAAM,CAAA;AACnD,QAAA,IAAI,aAAA,CAAc,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,GAAG,OAAO,IAAA;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,UAA+B,CAAA,EAAkB;AACxE,EAAA,KAAA,MAAWA,QAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,MAAA,MAAM,IAAIA,IAAAA,CAAI,CAAC,GAAG,CAAA,GAAIA,IAAAA,CAAI,IAAI,CAAC,CAAA;AAC/B,MAAA,IAAI,KAAK,CAAA,CAAE,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,CAAA,CAAE,KAAK,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,QAAQ,OAAO,IAAA;AAAA,IAChF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,UAA+B,QAAA,EAAsC;AAC/F,EAAA,KAAA,MAAWA,QAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,MAAA,IAAI,cAAA,CAAe,QAAA,EAAUA,IAAAA,CAAI,CAAC,CAAA,EAAGA,KAAI,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,OAAO,IAAA;AAAA,IAC3D;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,kBACd,IAAA,EACA,CAAA,EACA,CAAA,EACA,IAAA,GAA2B,EAAC,EACnB;AACT,EAAA,OAAO,WAAA,CAAY,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AACrC;AAGO,SAAS,gBAAA,CAAiB,IAAA,EAAY,IAAA,EAAY,IAAA,GAA2B,EAAC,EAAY;AAC/F,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OACE,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,IACf,KAAK,CAAA,IAAK,IAAA,CAAK,CAAA,IACf,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,SAAS,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,IACrC,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,EAE1C;AACA,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,KAAA,MAAW,CAAA,IAAK,WAAA,CAAY,IAAI,CAAA,EAAG;AACjC,IAAA,IAAI,CAAC,YAAY,IAAA,EAAM,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,EAAG,OAAO,KAAA;AAAA,EACjD;AAGA,EAAA,OAAO,CAAC,gBAAgB,QAAA,EAAU,IAAI,KAAK,CAAC,kBAAA,CAAmB,UAAU,IAAI,CAAA;AAC/E;AAGO,SAAS,kBAAA,CAAmB,IAAA,EAAY,IAAA,EAAY,IAAA,GAA2B,EAAC,EAAY;AACjG,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OACE,IAAA,CAAK,IAAI,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,IACvB,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAC3B,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,UACvB,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,CAAA;AAAA,EAEhC;AACA,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,KAAA,MAAW,CAAA,IAAK,WAAA,CAAY,IAAI,CAAA,EAAG;AACjC,IAAA,IAAI,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,IAAI,GAAG,OAAO,IAAA;AAAA,EAChD;AACA,EAAA,IAAI,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,OAAO,kBAAA,CAAmB,UAAU,IAAI,CAAA;AAC1C;AAGO,SAAS,mBAAA,CACd,IAAA,EACA,OAAA,EACA,IAAA,GAA2B,EAAC,EACnB;AACT,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACb,CAAC,MACC,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,IACZ,CAAA,CAAE,KAAK,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,IACrB,CAAA,CAAE,KAAK,IAAA,CAAK,CAAA,IACZ,EAAE,CAAA,IAAK,IAAA,CAAK,IAAI,IAAA,CAAK;AAAA,KACzB;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,CAAC,YAAY,IAAA,EAAM,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,EAAG,OAAO,KAAA;AAAA,EACjD;AACA,EAAA,OAAO,CAAC,kBAAA,CAAmB,QAAA,EAAU,YAAA,CAAa,OAAO,CAAC,CAAA,IACxD,CAAC,qBAAA,CAAsB,QAAA,EAAU,OAAO,CAAA;AAC5C;AAGO,SAAS,qBAAA,CACd,IAAA,EACA,OAAA,EACA,IAAA,GAA2B,EAAC,EACnB;AACT,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,iBAAA,CAAkB,WAAA,CAAY,IAAI,CAAA,EAAG,OAAO,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,IAAI,GAAG,OAAO,IAAA;AAAA,EAChD;AACA,EAAA,IAAI,mBAAmB,QAAA,EAAU,YAAA,CAAa,OAAO,CAAC,GAAG,OAAO,IAAA;AAChE,EAAA,OAAO,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAChD;AAOO,SAAS,mBAAA,CACd,OAAA,EACA,IAAA,EACA,IAAA,GAA2B,EAAC,EACnB;AACT,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAC/B,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,QAAA,GAAW,CAAC,YAAA,CAAa,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,EAC7C,CAAA,MAAO;AACL,IAAA,MAAM,EAAE,QAAQ,IAAA,EAAK,GAAI,aAAa,IAAA,EAAM,IAAA,CAAK,aAAa,yBAAyB,CAAA;AACvF,IAAA,QAAA,GAAW,CAAC,GAAG,MAAA,EAAQ,GAAG,IAAI,CAAA;AAAA,EAChC;AACA,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,MAAM,QAAA,GAAW,aAAa,OAAO,CAAA;AACrC,EAAA,KAAA,MAAWA,QAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,MAAA,IAAI,CAAC,cAAA,CAAe,QAAA,EAAUA,IAAAA,CAAI,CAAC,CAAA,EAAGA,IAAAA,CAAI,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,IAC5D;AAAA,EACF;AAGA,EAAA,OAAO,CAAC,qBAAA,CAAsB,QAAA,EAAU,OAAO,CAAA;AACjD;AAQO,SAAS,qBAAA,CACd,OAAA,EACA,IAAA,EACA,IAAA,GAA2B,EAAC,EACnB;AACT,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ,OAAO,kBAAkB,WAAA,CAAY,IAAI,GAAG,OAAO,CAAA;AAC7E,EAAA,MAAM,EAAE,QAAQ,IAAA,EAAK,GAAI,aAAa,IAAA,EAAM,IAAA,CAAK,aAAa,yBAAyB,CAAA;AACvF,EAAA,MAAM,QAAA,GAAW,aAAa,OAAO,CAAA;AACrC,EAAA,IAAI,kBAAA,CAAmB,QAAQ,QAAQ,CAAA,IAAK,mBAAmB,IAAA,EAAM,QAAQ,GAAG,OAAO,IAAA;AACvF,EAAA,IAAI,sBAAsB,MAAA,EAAQ,OAAO,KAAK,yBAAA,CAA0B,IAAA,EAAM,OAAO,CAAA,EAAG;AACtF,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,GAAG,IAAI,CAAA;AAChF;;;AC9YA,SAAS,UAAA,CAAW,KAAA,EAAe,MAAA,EAAgB,IAAA,EAAc,KAAA,EAA+B;AAC9F,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,KAAA,EAAO,OAAO,KAAA,GAAQ,MAAA,GAAS,IAAA;AAC7C,EAAA,OAAO,KAAA,GAAA,CAAS,SAAS,IAAA,IAAQ,CAAA;AACnC;AAEA,SAAS,UAAA,CACP,MAAA,EACA,OAAA,EACA,SAAA,EACA,QACA,WAAA,EACM;AACN,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,OAAA;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,SAAA;AACxB,EAAA,IAAI,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,QAAA,EAAU;AACvC,IAAA,MAAM,CAAA,GAAI,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,CAAA,GAAI,OAAO,MAAA,GAAS,MAAA,GAAS,MAAA,CAAO,CAAA,GAAI,MAAA,GAAS,MAAA;AACtF,IAAA,OAAO,EAAE,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,GAAI,WAAA,EAAa,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,EAC/F;AACA,EAAA,MAAM,CAAA,GAAI,IAAA,KAAS,OAAA,GAAU,MAAA,CAAO,CAAA,GAAI,OAAO,KAAA,GAAQ,MAAA,GAAS,MAAA,CAAO,CAAA,GAAI,MAAA,GAAS,KAAA;AACpF,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAA,GAAI,WAAA,EAAa,OAAO,MAAA,EAAO;AACjG;AAEA,SAAS,SAAA,CAAU,KAAA,EAAe,IAAA,EAAc,GAAA,EAAa,QAAgB,OAAA,EAAyB;AACpG,EAAA,MAAM,MAAM,GAAA,GAAM,OAAA;AAClB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAA,GAAM,MAAA,GAAS,OAAA,GAAU,CAAA,GAAI,IAAI,CAAC,CAAA;AACzE;AAMO,SAAS,eAAA,CAAgB,IAAA,EAAY,QAAA,EAAgB,OAAA,GAAU,CAAA,EAAS;AAC7E,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,OAAO,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAAA,IACpE,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,QAAQ,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,MAAA,EAAQ,OAAO;AAAA,GACxE;AACF;AAGA,SAAS,WAAA,CAAY,IAAA,EAAY,QAAA,EAAgB,IAAA,EAAqB,OAAA,EAAuB;AAC3F,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,QAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA;AAC1C,EAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,QAAA,CAAS,CAAA,GAAI,SAAS,CAAA,IAAK,OAAA;AACnD,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,GAAW,QAAA,CAAS,QAAQ,QAAA,CAAS,MAAA,CAAA,GAAU,UAAU,CAAA,GAAI,IAAA;AACjF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,IAAI,CAAC,CAAA;AACvE,EAAA,OAAO,QAAA,GAAW,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,MAAA,EAAO,GAAI,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,MAAA,EAAO;AAClE;AAEA,IAAM,QAAA,GAAiD;AAAA,EACrD,GAAA,EAAK,QAAA;AAAA,EACL,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,aAAA,CAAc,IAAA,EAAY,QAAA,EAAgB,IAAA,EAAqB,OAAA,EAA0B;AAChG,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,QAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,KAAA,IAAS,QAAA,GAAW,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA,CAAA;AACnD,EAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,QAAA,CAAS,CAAA,GAAI,SAAS,CAAA,IAAK,OAAA;AACnD,EAAA,MAAM,OAAO,GAAA,IAAO,QAAA,GAAW,SAAS,MAAA,GAAS,QAAA,CAAS,SAAS,OAAA,GAAU,CAAA;AAC7E,EAAA,OAAO,KAAA,IAAS,OAAO,GAAA,IAAO,IAAA;AAChC;AAQO,SAAS,UAAU,OAAA,EAAuC;AAC/D,EAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,QAAA,EAAU,WAAW,MAAA,GAAS,CAAA,EAAG,WAAA,GAAc,CAAA,EAAE,GAAI,OAAA;AAC9E,EAAA,MAAM,EAAE,OAAA,GAAU,CAAA,EAAG,IAAA,GAAO,MAAK,GAAI,OAAA;AAErC,EAAA,IAAI,QAAA,GAAW,SAAA;AACf,EAAA,IAAI,OAAO,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,QAAQ,WAAW,CAAA;AAEpE,EAAA,IAAI,IAAA,IAAQ,CAAC,aAAA,CAAc,IAAA,EAAM,UAAU,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA,EAAG;AAClE,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,CAAS,SAAS,IAAI,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,KAAA,EAAM;AACxE,IAAA,MAAM,UAAU,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,QAAQ,WAAW,CAAA;AACzE,IAAA,IAAI,cAAc,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA,EAAG;AAC5D,MAAA,QAAA,GAAW,QAAA;AACX,MAAA,IAAA,GAAO,OAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,SAAS,IAAA,EAAM,OAAO,CAAA,EAAG,SAAA,EAAW,QAAA,EAAS;AAC1F;;;ACxGO,IAAM,MAAA,GAAmB,CAAC,CAAA,KAAM;AAIhC,IAAM,UAAA,GAAuB,CAAC,CAAA,KAAM,CAAA,GAAI;AAExC,IAAM,cAAwB,CAAC,CAAA,KAAM,CAAA,GAAA,CAAK,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA;AAExD,IAAM,aAAA,GAA0B,CAAC,CAAA,KACtC,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,GAAI,CAAA;AAIxC,IAAM,WAAA,GAAwB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI;AAE7C,IAAM,YAAA,GAAyB,CAAC,CAAA,KAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC;AAE3D,IAAM,iBAA2B,CAAC,CAAA,KACvC,CAAA,GAAI,GAAA,GAAM,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI;AAInD,IAAM,WAAA,GAAwB,CAAC,CAAA,KAAM,CAAA,GAAI,IAAI,CAAA,GAAI;AAEjD,IAAM,YAAA,GAAyB,CAAC,CAAA,KAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC;AAE3D,IAAM,iBAA2B,CAAC,CAAA,KACvC,CAAA,GAAI,GAAA,GAAM,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI;AAIvD,IAAM,cAAwB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI;AAErD,IAAM,YAAA,GAAyB,CAAC,CAAA,KAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC;AAE3D,IAAM,iBAA2B,CAAC,CAAA,KACvC,IAAI,GAAA,GAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI;AAM5D,IAAM,UAAA,GAAuB,CAAC,CAAA,KAAM,CAAA,GAAI,KAAK,GAAA,CAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,CAAC;AAGlE,IAAM,WAAA,GAAwB,CAAC,CAAA,KAAM,IAAA,CAAK,IAAK,CAAA,GAAI,IAAA,CAAK,KAAM,CAAC;AAE/D,IAAM,aAAA,GAA0B,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,IAAI,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,GAAI,CAAA,CAAA,GAAK;AAGtE,IAAM,UAAA,GAAuB,CAAC,CAAA,KAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,GAAK,CAAA,GAAI,EAAE;AAE1E,IAAM,WAAA,GAAwB,CAAC,CAAA,KAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,CAAC;AAG3E,IAAM,aAAA,GAA0B,CAAC,CAAA,KAAM;AAC5C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,OAAO,IAAI,GAAA,GACP,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,GAAA,CAC1B,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,GAAM,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AACxC;AAGO,IAAM,UAAA,GAAuB,CAAC,CAAA,KAAM,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAI,IAAI,CAAC;AAE3D,IAAM,WAAA,GAAwB,CAAC,CAAA,KAAM,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC;AAErE,IAAM,aAAA,GAA0B,CAAC,CAAA,KACtC,CAAA,GAAI,GAAA,GAAA,CACC,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,CAAA,GAAA,CACzC,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA,GAAI,CAAA,IAAK;AAMrD,IAAM,EAAA,GAAK,OAAA;AACX,IAAM,KAAK,EAAA,GAAK,KAAA;AAChB,IAAM,KAAK,EAAA,GAAK,CAAA;AAChB,IAAM,EAAA,GAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,CAAA;AAC3B,IAAM,EAAA,GAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,GAAA;AAGpB,IAAM,UAAA,GAAuB,CAAC,CAAA,KAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI;AAE9D,IAAM,cAAwB,CAAC,CAAA,KACpC,CAAA,GAAI,EAAA,GAAK,KAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC;AAE/C,IAAM,aAAA,GAA0B,CAAC,CAAA,KACtC,CAAA,GAAI,GAAA,GACC,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,IAAA,CAAM,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA,GAAI,EAAA,CAAA,GAAO,CAAA,GAAA,CAChD,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,IAAA,CAAM,EAAA,GAAK,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAAK,MAAM,CAAA,IAAK;AAG9D,IAAM,aAAA,GAA0B,CAAC,CAAA,KAAM;AAC5C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,OAAO,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,GAAK,CAAA,GAAI,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,EAAA,GAAK,SAAS,EAAE,CAAA;AACnE;AAEO,IAAM,cAAA,GAA2B,CAAC,CAAA,KAAM;AAC7C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,EAAA,GAAK,IAAA,IAAQ,EAAE,CAAA,GAAI,CAAA;AACjE;AAEO,IAAM,gBAAA,GAA6B,CAAC,CAAA,KAAM;AAC/C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,OAAO,CAAA,GAAI,GAAA,GACP,EAAE,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,GAAK,CAAA,GAAI,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAA,CAAK,EAAA,GAAK,IAAI,MAAA,IAAU,EAAE,CAAA,CAAA,GAAK,CAAA,GAChE,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,IAAI,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAA,CAAK,EAAA,GAAK,CAAA,GAAI,MAAA,IAAU,EAAE,IAAK,CAAA,GAAI,CAAA;AAC3E;AAGO,IAAM,aAAA,GAA0B,CAAC,CAAA,KAAM;AAC5C,EAAA,MAAM,EAAA,GAAK,MAAA;AACX,EAAA,MAAM,EAAA,GAAK,IAAA;AACX,EAAA,IAAI,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,OAAO,KAAK,CAAA,GAAI,CAAA;AAChC,EAAA,IAAI,CAAA,GAAI,IAAI,EAAA,EAAI;AAAE,IAAA,CAAA,IAAK,GAAA,GAAM,EAAA;AAAM,IAAA,OAAO,EAAA,GAAK,IAAI,CAAA,GAAI,IAAA;AAAA,EAAM;AAC7D,EAAA,IAAI,CAAA,GAAI,MAAM,EAAA,EAAI;AAAE,IAAA,CAAA,IAAK,IAAA,GAAO,EAAA;AAAI,IAAA,OAAO,EAAA,GAAK,IAAI,CAAA,GAAI,MAAA;AAAA,EAAQ;AAChE,EAAA,CAAA,IAAK,KAAA,GAAQ,EAAA;AACb,EAAA,OAAO,EAAA,GAAK,IAAI,CAAA,GAAI,QAAA;AACtB;AAEO,IAAM,eAAyB,CAAC,CAAA,KAAM,CAAA,GAAI,aAAA,CAAc,IAAI,CAAC;AAE7D,IAAM,kBAA4B,CAAC,CAAA,KACxC,CAAA,GAAI,GAAA,GAAA,CACC,IAAI,aAAA,CAAc,CAAA,GAAI,CAAA,GAAI,CAAC,KAAK,CAAA,GAAA,CAChC,CAAA,GAAI,cAAc,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,IAAK;AAMhC,IAAM,MAAA,GAAS;AAGf,IAAM,OAAA,GAAU;AAGhB,IAAM,SAAA,GAAY;AAGlB,IAAM,OAAA,GAAU;AAAA,EACrB,MAAA;AAAA,EACA,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,aAAA;AAAA,EACzB,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,cAAA;AAAA,EAC3B,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,cAAA;AAAA,EAC3B,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,cAAA;AAAA,EAC3B,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,aAAA;AAAA,EACzB,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,aAAA;AAAA,EACzB,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,aAAA;AAAA,EACzB,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,aAAA;AAAA,EACzB,aAAA;AAAA,EAAe,cAAA;AAAA,EAAgB,gBAAA;AAAA,EAC/B,YAAA;AAAA,EAAc,aAAA;AAAA,EAAe;AAC/B;AAQO,IAAM,cAAA,GAAyD;AAAA,EACpE,QAAQ,EAAE,SAAA,EAAW,KAAK,OAAA,EAAS,EAAA,EAAI,MAAM,CAAA,EAAE;AAAA,EAC/C,QAAQ,EAAE,SAAA,EAAW,KAAK,OAAA,EAAS,EAAA,EAAI,MAAM,CAAA,EAAE;AAAA,EAC/C,OAAO,EAAE,SAAA,EAAW,KAAK,OAAA,EAAS,EAAA,EAAI,MAAM,CAAA,EAAE;AAAA,EAC9C,MAAM,EAAE,SAAA,EAAW,IAAI,OAAA,EAAS,EAAA,EAAI,MAAM,CAAA;AAC5C;;;AClLA,IAAM,iBAAA,GAAoB,CAAA;AAC1B,IAAM,gBAAA,GAAmB,IAAA;AACzB,IAAM,mBAAA,GAAsB,IAAA;AAC5B,IAAM,eAAA,GAAkB,EAAA;AAExB,SAAS,QAAA,CAAS,CAAA,EAAW,EAAA,EAAY,EAAA,EAAoB;AAC3D,EAAA,MAAM,IAAI,CAAA,GAAI,EAAA;AACd,EAAA,MAAM,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClB,EAAA,OAAA,CAAA,CAAS,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AACjC;AAEA,SAAS,WAAA,CAAY,CAAA,EAAW,EAAA,EAAY,EAAA,EAAoB;AAC9D,EAAA,MAAM,IAAI,CAAA,GAAI,EAAA;AACd,EAAA,MAAM,CAAA,GAAI,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClB,EAAA,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AACnC;AAKA,SAAS,SAAA,CAAU,CAAA,EAAW,EAAA,EAAY,EAAA,EAAoB;AAC5D,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,iBAAA,EAAmB,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACnC,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC9B,IAAA,CAAA,IAAA,CAAM,QAAA,CAAS,CAAA,EAAG,EAAA,EAAI,EAAE,IAAI,CAAA,IAAK,KAAA;AAAA,EACnC;AACA,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,qBAAqB,OAAO,CAAA;AAChD,IAAA,IAAI,GAAA,GAAM,GAAG,EAAA,GAAK,CAAA;AAAA,SAAQ,EAAA,GAAK,CAAA;AAC/B,IAAA,CAAA,GAAA,CAAK,KAAK,EAAA,IAAM,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,CAAA;AACT;AAMO,SAAS,iBAAA,CACd,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAC1B;AACV,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA;AACvC,EAAA,OAAO,CAAC,CAAA,KAAM;AACZ,IAAA,IAAI,CAAA,IAAK,GAAG,OAAO,CAAA;AACnB,IAAA,IAAI,CAAA,IAAK,GAAG,OAAO,CAAA;AACnB,IAAA,OAAO,SAAS,SAAA,CAAU,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG,IAAI,EAAE,CAAA;AAAA,EAChD,CAAA;AACF;AAGA,IAAM,WAAA,uBAAkB,GAAA,EAAsB;AAE9C,SAAS,SAAS,IAAA,EAAwC;AACxD,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAQ,QAAA,IAAY,IAAA;AAClE;AAGO,SAAS,cAAc,IAAA,EAA6B;AACzD,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,OAAO,OAAA,CAAQ,MAAA;AACvC,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA;AACvC,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,EAAA,GAAK,QAAQ,IAAI,CAAA;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,IAAI,CAAA,CAAA,CAAG,CAAA;AACvE,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAClB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,GAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AACnC,IAAA,IAAI,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,EAAA,GAAK,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AACrC,MAAA,WAAA,CAAY,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAC3D","file":"index.js","sourcesContent":["/**\n * 2D affine transforms in canvas/DOMMatrix order: [a, b, c, d, e, f].\n * x' = a·x + c·y + e\n * y' = b·x + d·y + f\n * Represented as a readonly 6-tuple (f64). The affine tier of the kernel.\n *\n * Convention alignment: the renderer already has a `Mat3` in\n * `src/renderer/math/mat3.ts`. That one is a 9-element column-major\n * `Float32Array` (a full 3×3) shaped for `uniformMatrix3fv` — a deliberately\n * different *representation* for the WebGL upload path. Its *logical element\n * order* is identical to ours: `create(a, b, c, d, tx, ty)` maps\n * `x' = a·x + c·y + tx`, `y' = b·x + d·y + ty` (canvas/DOMMatrix a,b,c,d,e,f).\n * We keep the pure 6-tuple f64 form here (the kernel form); the 9-element f32\n * form stays a render-layer concern. No second logical convention is created.\n */\nimport { SINGULAR_RATIO } from './scalar';\n\n/** `[a, b, c, d, e, f]`: `x' = a·x + c·y + e`, `y' = b·x + d·y + f`. */\nexport type Mat3 = readonly [number, number, number, number, number, number];\n\n/** The transform that leaves a point where it is. */\nexport function identity(): Mat3 {\n return [1, 0, 0, 1, 0, 0];\n}\n\n/** A pure translation by `(tx, ty)`. */\nexport function translate(tx: number, ty: number): Mat3 {\n return [1, 0, 0, 1, tx, ty];\n}\n\n/** A pure scale about the origin. Scale about another point by composing\n * translate → scale → inverse translate with `multiply`. */\nexport function scale(sx: number, sy: number): Mat3 {\n return [sx, 0, 0, sy, 0, 0];\n}\n\n/** A pure rotation about the origin, in radians, clockwise in canvas\n * coordinates (y down). */\nexport function rotate(rad: number): Mat3 {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n return [c, s, -s, c, 0, 0];\n}\n\n/** Compose: result applies `n` first, then `m` (m·n). */\nexport function multiply(m: Mat3, n: Mat3): Mat3 {\n return [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n ];\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Mat3): Mat3 | null {\n const det = m[0] * m[3] - m[1] * m[2];\n // The determinant is an area, so it is judged against the squared column norms.\n const norm2 = Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3]);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * norm2)) return null;\n const id = 1 / det;\n const a = m[3] * id;\n const b = -m[1] * id;\n const c = -m[2] * id;\n const d = m[0] * id;\n return [a, b, c, d, -(m[4] * a + m[5] * c), -(m[4] * b + m[5] * d)];\n}\n\n/** Apply to a point, returning a tuple. Cold-path use; hot loops inline. */\nexport function applyToPoint(m: Mat3, x: number, y: number): [number, number] {\n return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n}\n\n/** Affine that maps source box (sx,sy,sw,sh) onto destination box (dx,dy,dw,dh). */\nexport function boxToBox(\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number,\n): Mat3 {\n const kx = sw === 0 ? 1 : dw / sw;\n const ky = sh === 0 ? 1 : dh / sh;\n // translate(dx,dy) · scale(kx,ky) · translate(-sx,-sy)\n return [kx, 0, 0, ky, dx - sx * kx, dy - sy * ky];\n}\n\n/** Rotation by `rad` about pivot (cx,cy): translate(c)·rotate·translate(-c). */\nexport function rotateAboutPoint(cx: number, cy: number, rad: number): Mat3 {\n return multiply(translate(cx, cy), multiply(rotate(rad), translate(-cx, -cy)));\n}\n","/**\n * Nearest point on a segment or a whole path to a probe point: where it is,\n * its curve parameter, and how far away it lies.\n */\nimport { cubicEvalAt, elevateQuadraticToCubic } from './curve';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Q, PATH_C, PATH_Z } from './commands';\n\n/** The point on one segment nearest a probe. */\nexport interface CurveNearest {\n x: number;\n y: number;\n /** Curve parameter of the point, in [0, 1]. */\n t: number;\n /** Euclidean distance from the probe. */\n dist: number;\n}\n\n/** The point on a path nearest a probe, and the command whose segment holds it. */\nexport interface PathNearest extends CurveNearest {\n /** Index of the segment's command in the command stream (`L`, `Q`, `C` or `Z`). */\n commandIndex: number;\n /** Offset of that command's first coord; for a `Z`, where its coords would begin. */\n coordIndex: number;\n}\n\n/** Nearest point on segment (x0,y0)-(x1,y1) to (px,py). */\nexport function nearestOnLine(\n px: number, py: number, x0: number, y0: number, x1: number, y1: number,\n): CurveNearest {\n const vx = x1 - x0, vy = y1 - y0;\n const vv = vx * vx + vy * vy;\n let t = vv === 0 ? 0 : ((px - x0) * vx + (py - y0) * vy) / vv;\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n const x = t === 1 ? x1 : x0 + t * vx;\n const y = t === 1 ? y1 : y0 + t * vy;\n return { x, y, t, dist: Math.hypot(px - x, py - y) };\n}\n\n/** Coarse samples per cubic. Each local minimum among them is refined, so this\n * only has to separate the distance function's minima (a cubic has at most\n * three), not locate them. */\nconst CUBIC_SAMPLES = 32;\nconst REFINE_ITERS = 40;\nconst T_EPS = 1e-14;\n\n/**\n * Nearest point on the cubic (x0,y0)…(x3,y3) to (px,py). Samples the curve,\n * then refines every sampled local minimum with bracketed Newton on the\n * distance derivative, so a loop or cusp cannot capture it in the wrong basin.\n */\nexport function nearestOnCubic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): CurveNearest {\n // Power basis B(t) = a t³ + b t² + c t + p0, for the derivatives.\n const ax = -x0 + 3 * x1 - 3 * x2 + x3, ay = -y0 + 3 * y1 - 3 * y2 + y3;\n const bx = 3 * x0 - 6 * x1 + 3 * x2, by = 3 * y0 - 6 * y1 + 3 * y2;\n const cx = 3 * (x1 - x0), cy = 3 * (y1 - y0);\n\n const d2At = (t: number): number => {\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n return (x - px) ** 2 + (y - py) ** 2;\n };\n\n const d2s: number[] = [];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) d2s.push(d2At(k / CUBIC_SAMPLES));\n\n let bestT = 0, bestD2 = d2s[0];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) {\n const d = d2s[k];\n const prev = k > 0 ? d2s[k - 1] : Infinity;\n const next = k < CUBIC_SAMPLES ? d2s[k + 1] : Infinity;\n if (!(d <= prev && d <= next)) continue;\n\n let lo = Math.max(0, (k - 1) / CUBIC_SAMPLES);\n let hi = Math.min(1, (k + 1) / CUBIC_SAMPLES);\n let t = k / CUBIC_SAMPLES;\n for (let i = 0; i < REFINE_ITERS; i++) {\n const t2 = t * t;\n const ex = ax * t2 * t + bx * t2 + cx * t + x0 - px;\n const ey = ay * t2 * t + by * t2 + cy * t + y0 - py;\n const dx = 3 * ax * t2 + 2 * bx * t + cx, dy = 3 * ay * t2 + 2 * by * t + cy;\n const ddx = 6 * ax * t + 2 * bx, ddy = 6 * ay * t + 2 * by;\n // g = ½ d/dt |B - P|², zero at a critical point; its sign says which side the minimum is on.\n const g = ex * dx + ey * dy;\n const gp = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (g > 0) hi = t; else if (g < 0) lo = t; else break;\n let tn = gp > 0 ? t - g / gp : NaN;\n if (!(tn > lo && tn < hi)) tn = (lo + hi) / 2;\n const step = Math.abs(tn - t);\n t = tn;\n if (step < T_EPS || hi - lo < T_EPS) break;\n }\n const refined = d2At(t);\n const [tk, dk] = refined <= d ? [t, refined] : [k / CUBIC_SAMPLES, d];\n if (dk < bestD2) { bestD2 = dk; bestT = tk; }\n }\n\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, bestT);\n return { x, y, t: bestT, dist: Math.hypot(x - px, y - py) };\n}\n\n/** Nearest point on the quadratic (x0,y0)(x1,y1)(x2,y2) to (px,py). */\nexport function nearestOnQuadratic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number,\n): CurveNearest {\n // Degree elevation keeps the parameterization, so t carries over unchanged.\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(x0, y0, x1, y1, x2, y2);\n return nearestOnCubic(px, py, x0, y0, c1x, c1y, c2x, c2y, x2, y2);\n}\n\n/**\n * Nearest point on a command-stream path to (px,py), over every `L`, `Q`, `C`\n * and the closing edge each `Z` draws. The earliest segment wins a tie.\n * Returns `null` when the path has no segment, and throws on a command code\n * `PATH_COMMANDS` does not declare.\n */\nexport function nearestOnPath(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n px: number,\n py: number,\n): PathNearest | null {\n let best: PathNearest | null = null;\n let startX = 0, startY = 0;\n forEachSegment(commands, coords, (cmd, ci, x0, y0, commandIndex) => {\n let hit: CurveNearest;\n if (cmd === PATH_M) {\n startX = coords[ci]; startY = coords[ci + 1];\n return;\n } else if (cmd === PATH_L) {\n hit = nearestOnLine(px, py, x0, y0, coords[ci], coords[ci + 1]);\n } else if (cmd === PATH_Q) {\n hit = nearestOnQuadratic(px, py, x0, y0, coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3]);\n } else if (cmd === PATH_C) {\n hit = nearestOnCubic(\n px, py, x0, y0,\n coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3], coords[ci + 4], coords[ci + 5],\n );\n } else if (cmd === PATH_Z) {\n hit = nearestOnLine(px, py, x0, y0, startX, startY);\n } else {\n throw new Error(`nearestOnPath: unknown command code ${cmd}`);\n }\n if (best === null || hit.dist < best.dist) best = { ...hit, commandIndex, coordIndex: ci };\n });\n return best;\n}\n","/**\n * The port-curve rule in the 2D kernel's currency: loose scalars, the way\n * `cubicEvalAt` and `applyToPoint` take them. The rule itself lives in\n * `./portCurve`, stated once over components, so this and `./3d` cannot drift.\n */\n\nimport { PORT_REACH, cubicAt as cubicAtN, portControls as portControlsN } from './portCurve';\n\nexport { PORT_REACH };\n\n/**\n * `[c1, c2]` for the cubic from `(ax, ay)` to `(bx, by)`.\n *\n * A null normal falls back to a lerp along the chord. See `./portCurve` for why\n * the two ends are not symmetric.\n */\nexport function portControls(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n reach: number = PORT_REACH,\n): [[number, number], [number, number]] {\n const [c1, c2] = portControlsN([ax, ay], [bx, by], outNormal, inNormal, reach);\n return [\n [c1[0]!, c1[1]!],\n [c2[0]!, c2[1]!],\n ];\n}\n\n/** A port curve sampled into `samples` points, excluding its start. */\nexport function portCurvePoints(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n samples: number,\n reach: number = PORT_REACH,\n): [number, number][] {\n const a = [ax, ay];\n const b = [bx, by];\n const [c1, c2] = portControlsN(a, b, outNormal, inNormal, reach);\n const out: [number, number][] = [];\n for (let s = 1; s <= samples; s++) {\n const p = cubicAtN(a, c1, c2, b, s / samples);\n out.push([p[0]!, p[1]!]);\n }\n return out;\n}\n","/**\n * Fluent builder for `PolygonPath`. Hides the `Uint8Array` / `Float32Array`\n * encoding behind move/line/curve/close calls and a final `build()`. Use\n * this to construct paths in tests and demos; production callers that need\n * to mutate large paths in place should reach for the raw arrays directly.\n *\n * Numeric capacity grows by doubling — typical for amortized O(1) push.\n *\n * Also exposes `rectPath` / `polygonFromPoints` shortcuts for the common\n * cases. `rectPath` returns the lighter `RectPath` subtype, not a polygon.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { PathFillRule, PolygonPath, RectPath } from '../path';\n\n/** Fluent builder for `PolygonPath`; hides the `Uint8Array`/`Float32Array` encoding behind move/line/curve/close calls. */\nexport class PathBuilder {\n private cmds: number[] = [];\n private xs: number[] = [];\n private fillRule: PathFillRule = 'nonzero';\n\n /** Seed a builder with an existing `PolygonPath`. Useful for extending\n * an in-flight path with another segment (e.g. appending a cubic to\n * the end of a curve in response to a user action) without hand-\n * reaching into the `commands` / `coords` typed arrays.\n *\n * ```ts\n * const next = PathBuilder.fromPath(current).curveTo(...).build();\n * ```\n */\n static fromPath(path: PolygonPath): PathBuilder {\n const b = new PathBuilder();\n b.cmds = Array.from(path.commands);\n b.xs = Array.from(path.coords);\n b.fillRule = path.fillRule;\n return b;\n }\n\n setFillRule(rule: PathFillRule): this {\n this.fillRule = rule;\n return this;\n }\n\n moveTo(x: number, y: number): this {\n this.cmds.push(PATH_M);\n this.xs.push(x, y);\n return this;\n }\n\n lineTo(x: number, y: number): this {\n this.cmds.push(PATH_L);\n this.xs.push(x, y);\n return this;\n }\n\n /** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */\n curveTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this {\n this.cmds.push(PATH_C);\n this.xs.push(x1, y1, x2, y2, x, y);\n return this;\n }\n\n /** Quadratic bezier to (x, y) with control point (x1, y1). */\n quadTo(x1: number, y1: number, x: number, y: number): this {\n this.cmds.push(PATH_Q);\n this.xs.push(x1, y1, x, y);\n return this;\n }\n\n close(): this {\n this.cmds.push(PATH_Z);\n return this;\n }\n\n build(): PolygonPath {\n return {\n kind: 'polygon',\n commands: new Uint8Array(this.cmds),\n coords: new Float32Array(this.xs),\n fillRule: this.fillRule,\n };\n }\n}\n\n/** Construct a `RectPath` (the fast-path subtype). */\nexport function rectPath(x: number, y: number, width: number, height: number): RectPath {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** Build an open polyline from a flat list of points — the same geometry as\n * {@link polygonFromPoints} without the closing edge. A freehand stroke and a\n * measurement line want this; a region wants the closed one. */\nexport function polylineFromPoints(\n points: readonly { x: number; y: number }[],\n): PolygonPath | RectPath {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n if (p) b.lineTo(p.x, p.y);\n }\n return b.build();\n}\n\n/** Build a closed polygon from a flat list of points. */\nexport function polygonFromPoints(\n points: readonly { x: number; y: number }[],\n opts: { fillRule?: PathFillRule } = {},\n): PolygonPath {\n if (points.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: opts.fillRule ?? 'nonzero',\n };\n }\n const b = new PathBuilder();\n if (opts.fillRule) b.setFillRule(opts.fillRule);\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return b.build();\n}\n\n/** Cubic-Bezier kappa for circular-quadrant approximation (<1% max error). */\nconst ELLIPSE_KAPPA = 0.5522847498307936;\n\n/** Closed ellipse inscribed in `bounds`, as a 4-cubic-Bezier `PolygonPath`.\n * Matches the geometry `useEllipseTool`'s overlay paints. */\nexport function ellipsePath(\n bounds: { x: number; y: number; width: number; height: number },\n): PolygonPath {\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const rx = bounds.width / 2;\n const ry = bounds.height / 2;\n const ox = rx * ELLIPSE_KAPPA;\n const oy = ry * ELLIPSE_KAPPA;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry);\n b.curveTo(cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy);\n b.curveTo(cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry);\n b.curveTo(cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy);\n b.close();\n return b.build();\n}\n\n/** Closed regular n-gon centered at `center`, circumscribed by `radius`.\n * `rotation` is in radians; default 0 puts the first vertex on the +x axis. */\nexport function regularPolygonPath(\n center: { x: number; y: number },\n radius: number,\n sides: number,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n for (let i = 0; i < sides; i++) {\n const a = rotation + (i / sides) * Math.PI * 2;\n const x = center.x + radius * Math.cos(a);\n const y = center.y + radius * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Closed n-pointed star centered at `center`, alternating `outerRadius` and\n * `innerRadius` (default `outerRadius / 2`). `rotation` is in radians. */\nexport function starPath(\n center: { x: number; y: number },\n outerRadius: number,\n points = 5,\n innerRadius: number = outerRadius / 2,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n const n = points * 2;\n for (let i = 0; i < n; i++) {\n const a = rotation + (i / n) * Math.PI * 2;\n const r = i % 2 === 0 ? outerRadius : innerRadius;\n const x = center.x + r * Math.cos(a);\n const y = center.y + r * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Open 2-vertex polyline from `a` to `b` — strokeable, not fillable. */\nexport function linePath(\n a: { x: number; y: number },\n b: { x: number; y: number },\n): PolygonPath {\n const pb = new PathBuilder();\n pb.moveTo(a.x, a.y);\n pb.lineTo(b.x, b.y);\n return pb.build();\n}\n","/**\n * AABB bounds of a `Path`. Returned as `RectPath` for direct reuse with the\n * rect fast path machinery (selection AABB, area-select intersection).\n *\n * `RectPath` is its own bounds — O(1). For `PolygonPath`, walk segment by\n * segment, computing the tight bound per segment:\n *\n * - `M` / `L`: just the endpoint.\n * - `Q`: quadratic Bezier — endpoints plus axis-aligned extrema (one\n * possible inflection per axis).\n * - `C`: cubic Bezier — endpoints plus axis-aligned extrema (up to two\n * possible inflections per axis, found via the quadratic formula on\n * the derivative).\n *\n * Control points are NOT included directly; they're used only to compute\n * extrema that actually lie on the curve. This avoids the classic \"AABB\n * extends past where the curve visibly reaches\" bug for curved paths whose\n * control points poke outside the visible extent.\n *\n * Empty paths (no commands) return a zero-size rect anchored at the\n * origin — the convention used elsewhere in the kit for missing geometry.\n */\n\nimport { cubicBounds, elevateQuadraticToCubic } from '../curve';\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, RectPath } from '../path';\n\n/** AABB of a `Path`, returned as a `RectPath` for direct reuse with rect-fast-path machinery. */\nexport function boundsOfPath(path: Path): RectPath {\n if (path.kind === 'rect') return path;\n\n const { commands, coords } = path;\n if (commands.length === 0) {\n return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let seen = false;\n\n const include = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n seen = true;\n };\n\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n include(coords[ci], coords[ci + 1]);\n break;\n }\n case PATH_C: {\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(\n px, py,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n );\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Q: {\n const qx2 = coords[ci + 2], qy2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Z:\n break;\n default:\n throw new Error(`boundsOfPath: unknown command ${cmd}`);\n }\n });\n\n if (!seen) return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n return { kind: 'rect', x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n","/**\n * AABB union over a heterogeneous set of `Path` poses. Returns the\n * envelope as a `RectPath`, or `null` for empty input — analog of\n * `unionBounds` for the rect-only model.\n */\n\nimport { boundsOfPath } from './bounds';\nimport type { Path, RectPath } from '../path';\n\n/** AABB envelope over a set of `Path` instances; returns `null` for empty input. */\nexport function unionBoundsPath(paths: Iterable<Path>): RectPath | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let any = false;\n for (const p of paths) {\n any = true;\n const b = boundsOfPath(p);\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n const right = b.x + b.width;\n const bottom = b.y + b.height;\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n }\n if (!any) return null;\n return { kind: 'rect', x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","import type { Mat3 } from './mat3';\n\n/**\n * Apply an affine to an interleaved coord stream, returning a fresh f64\n * buffer. Command codes are unaffected — for a Bezier the transformed control\n * points define the transformed curve exactly (affine invariance), so callers\n * pass `path.coords` straight through and keep `path.commands` as-is.\n */\nexport function transformCoords(coords: ArrayLike<number>, m: Mat3): Float64Array {\n const out = new Float64Array(coords.length);\n const a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n out[i] = a * x + c * y + e;\n out[i + 1] = b * x + d * y + f;\n }\n return out;\n}\n","import type { Mat3 } from '../mat3';\nimport { transformCoords } from '../affine';\nimport { PathBuilder } from './builder';\nimport type { Path, PolygonPath } from '../path';\n\n/** Apply an affine `Mat3` to a path's geometry.\n *\n * Axis-aligned maps (no rotation/shear, i.e. `m[1] === 0 && m[2] === 0`) keep a\n * `RectPath` a rect — the four corners stay axis-aligned, so we transform the\n * two diagonal corners and normalize negative extent (mirror). Rotation or\n * shear promotes the rect's four corners to a `PolygonPath`. Polygon paths map\n * every coord via the kernel's `transformCoords`, preserving the command stream\n * and `fillRule`. Never mutates the input.\n *\n * `Mat3` here is the 6-tuple `number[]` from `@weasel-js/geom` (DOMMatrix order:\n * `[a, b, c, d, e, f]` where `x' = a·x + c·y + e`, `y' = b·x + d·y + f`),\n * not the renderer's 9-element `Float32Array`. */\nexport function transformPath(path: Path, m: Mat3): Path {\n const [a, b, c, d, e, f] = m;\n if (path.kind === 'rect') {\n if (b === 0 && c === 0) {\n // Pure scale + translate — corners remain axis-aligned.\n const x0 = a * path.x + e;\n const y0 = d * path.y + f;\n const x1 = a * (path.x + path.width) + e;\n const y1 = d * (path.y + path.height) + f;\n return {\n kind: 'rect',\n x: Math.min(x0, x1),\n y: Math.min(y0, y1),\n width: Math.abs(x1 - x0),\n height: Math.abs(y1 - y0),\n };\n }\n // Rotation / shear — promote to polygon with the four rect corners.\n const poly = new PathBuilder()\n .moveTo(path.x, path.y)\n .lineTo(path.x + path.width, path.y)\n .lineTo(path.x + path.width, path.y + path.height)\n .lineTo(path.x, path.y + path.height)\n .close()\n .build();\n return transformPolygon(poly, m);\n }\n return transformPolygon(path, m);\n}\n\nfunction transformPolygon(path: PolygonPath, m: Mat3): PolygonPath {\n // transformCoords returns Float64Array; PolygonPath.coords is Float32Array.\n const mapped = transformCoords(path.coords, m);\n return { ...path, coords: Float32Array.from(mapped) };\n}\n","/**\n * In-place and copy-out path transforms. Translation is the most common —\n * called every pointermove during a drag — so the polygon variant mutates\n * the float buffer directly to keep allocation pressure off the GC.\n *\n * `scalePathToBounds` is for the resize interaction: given the path's\n * current AABB and the desired new AABB, scales every coordinate\n * proportionally.\n */\n\nimport { boxToBox } from '../mat3';\nimport { forEachSegment, pathCommandCoordCount } from '../commands';\nimport { boundsOfPath } from './bounds';\nimport { transformPath } from './transformPath';\nimport type { Path, PolygonPath, RectPath } from '../path';\n\n/**\n * Translate a path by (dx, dy). Returns a new instance — the kit's pose\n * model treats poses as immutable to keep React state-update semantics\n * predictable. Polygon coords are copied into a fresh `Float32Array`.\n */\nexport function translatePath(path: Path, dx: number, dy: number): Path {\n if (path.kind === 'rect') {\n return { kind: 'rect', x: path.x + dx, y: path.y + dy, width: path.width, height: path.height };\n }\n return translatePolygonCopy(path, dx, dy);\n}\n\nfunction translatePolygonCopy(path: PolygonPath, dx: number, dy: number): PolygonPath {\n const next = new Float32Array(path.coords.length);\n const { commands, coords } = path;\n forEachSegment(commands, coords, (cmd, ci) => {\n for (let k = 0, len = pathCommandCoordCount(cmd); k < len; k += 2) {\n next[ci + k] = coords[ci + k] + dx;\n next[ci + k + 1] = coords[ci + k + 1] + dy;\n }\n });\n return { kind: 'polygon', commands: path.commands, coords: next, fillRule: path.fillRule };\n}\n\n/**\n * Scale a path's coords so its current AABB maps to `target`. Resize\n * interactions use this to make a polygon follow a corner-handle drag.\n *\n * A degenerate source axis (zero width or height) has no ratio to scale by,\n * so `boxToBox` translates that axis instead — a zero scale is not\n * invertible and would discard what is left on it.\n */\nexport function scalePathToBounds(path: Path, target: RectPath): Path {\n if (path.kind === 'rect') {\n return { kind: 'rect', x: target.x, y: target.y, width: target.width, height: target.height };\n }\n const src = boundsOfPath(path);\n return scalePolygon(path, src, target);\n}\n\nfunction scalePolygon(path: PolygonPath, src: RectPath, dst: RectPath): PolygonPath {\n const m = boxToBox(src.x, src.y, src.width, src.height, dst.x, dst.y, dst.width, dst.height);\n // src/dst are axis-aligned, so the polygon stays a polygon after this pure scale+translate.\n return transformPath(path, m) as PolygonPath;\n}\n","/**\n * Translation-only compose/decompose for `Path` poses, the analog of\n * `composeRectPose` / `decomposeRectPose` for the rect-only model. Pair\n * with `composeWorldPose` / `rebaseLocalPose` when an adapter uses `Path`\n * as its `TPose`.\n *\n * Only translation is folded — the kit's hierarchy contract is\n * translation-only, same as for rects. Parent rotation/scale would require\n * a richer compose; that's out of scope here.\n */\n\nimport { translatePath } from './transform';\nimport type { Path } from '../path';\n\n/** Express `child` (in `parent`'s local frame) in the next frame up. */\nexport function composePath(parent: Path, child: Path): Path {\n const origin = pathOrigin(parent);\n return translatePath(child, origin.x, origin.y);\n}\n\n/** Inverse of `composePath` — undo `parent`'s translation from a world pose. */\nexport function decomposePath(parent: Path, world: Path): Path {\n const origin = pathOrigin(parent);\n return translatePath(world, -origin.x, -origin.y);\n}\n\nfunction pathOrigin(path: Path): { x: number; y: number } {\n if (path.kind === 'rect') return { x: path.x, y: path.y };\n // Polygon origin is its AABB top-left, so children compose under the\n // same anchor convention as rects. Cheap walk; if this becomes a hot\n // path we cache bounds on the polygon at build time.\n let minX = Infinity;\n let minY = Infinity;\n const { coords } = path;\n for (let i = 0; i < coords.length; i += 2) {\n if (coords[i] < minX) minX = coords[i];\n if (coords[i + 1] < minY) minY = coords[i + 1];\n }\n if (minX === Infinity) return { x: 0, y: 0 };\n return { x: minX, y: minY };\n}\n","/**\n * Split a `PolygonPath` at each `M` command, returning one `PolygonPath` per\n * subpath. Inverse-ish of compound-path construction: a multi-region\n * (compound) path becomes N independent paths.\n *\n * `fillRule` is propagated unchanged to every output. Even-odd compound paths\n * with interior \"holes\" lose the hole semantics — each subpath becomes its\n * own filled region. (Same behavior as Illustrator's Release Compound Path.)\n *\n * If the input has zero `M` commands (which would already be malformed) the\n * input is returned wrapped in a single-element array. A path with exactly\n * one subpath is also returned as a single-element array — a trivial pass.\n */\n\nimport { forEachSegment, PATH_M } from '../commands';\nimport type { PolygonPath } from '../path';\n\n/** Split a path into one path per subpath, cutting at each `M`. A path with a\n * single subpath comes back as a one-element array. */\nexport function splitSubpaths(path: PolygonPath): PolygonPath[] {\n const { commands, coords, fillRule } = path;\n const out: PolygonPath[] = [];\n\n // Walk the command stream, tracking the (cmdStart, coordStart) of the\n // active subpath. On each subsequent `M`, slice out the previous subpath.\n let cmdStart = 0;\n let coordStart = 0;\n\n forEachSegment(commands, coords, (cmd, ci, _px, _py, i) => {\n if (cmd !== PATH_M || i <= cmdStart) return;\n out.push({\n kind: 'polygon',\n commands: commands.slice(cmdStart, i),\n coords: coords.slice(coordStart, ci),\n fillRule,\n });\n cmdStart = i;\n coordStart = ci;\n });\n\n out.push({\n kind: 'polygon',\n commands: commands.slice(cmdStart),\n coords: coords.slice(coordStart),\n fillRule,\n });\n\n return out;\n}\n","/**\n * Contour orientation: which way a path winds, and the same path wound the\n * other way. Under `'nonzero'` two overlapping contours fill their overlap\n * only when they wind the same way, so composing shapes from different\n * sources into one compound path first needs them to agree.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z, forEachSegment } from '../commands';\nimport type { Path, PolygonPath } from '../path';\n\n// Three-point Gauss-Legendre: exact for polynomials up to degree 5, and the\n// Green's-theorem integrand of a cubic is degree 5.\nconst GL_T = [0.5 - Math.sqrt(15) / 10, 0.5, 0.5 + Math.sqrt(15) / 10];\nconst GL_W = [5 / 18, 8 / 18, 5 / 18];\n\n/**\n * Signed area enclosed by `path`, summed over its contours. Positive for a\n * contour that turns clockwise on a y-down screen (the shoelace sign), so a\n * hole wound against its outer contour subtracts. An open contour counts as\n * closed by a straight edge back to its start, the way a fill closes it.\n * Curved segments are integrated exactly, not through their control polygon.\n * A `RectPath` has no direction and counts as positive.\n */\nexport function pathSignedArea(path: Path): number {\n if (path.kind === 'rect') return path.width * path.height;\n const { commands, coords } = path;\n let twice = 0;\n let startX = 0, startY = 0;\n let open = false;\n let endX = 0, endY = 0;\n const close = () => {\n if (open) twice += endX * startY - startX * endY;\n open = false;\n };\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n if (cmd === PATH_M) {\n close();\n startX = endX = coords[ci];\n startY = endY = coords[ci + 1];\n open = true;\n return;\n }\n if (cmd === PATH_Z) { close(); endX = startX; endY = startY; return; }\n if (!open) { startX = px; startY = py; open = true; }\n if (cmd === PATH_L) {\n endX = coords[ci]; endY = coords[ci + 1];\n twice += px * endY - endX * py;\n return;\n }\n const cubic = cmd === PATH_C;\n const x1 = coords[ci], y1 = coords[ci + 1];\n const x2 = coords[ci + 2], y2 = coords[ci + 3];\n const x3 = cubic ? coords[ci + 4] : x2, y3 = cubic ? coords[ci + 5] : y2;\n for (let k = 0; k < 3; k++) {\n const t = GL_T[k], u = 1 - t;\n let x: number, y: number, dx: number, dy: number;\n if (cubic) {\n x = u * u * u * px + 3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t * x3;\n y = u * u * u * py + 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t * y3;\n dx = 3 * (u * u * (x1 - px) + 2 * u * t * (x2 - x1) + t * t * (x3 - x2));\n dy = 3 * (u * u * (y1 - py) + 2 * u * t * (y2 - y1) + t * t * (y3 - y2));\n } else {\n x = u * u * px + 2 * u * t * x1 + t * t * x2;\n y = u * u * py + 2 * u * t * y1 + t * t * y2;\n dx = 2 * (u * (x1 - px) + t * (x2 - x1));\n dy = 2 * (u * (y1 - py) + t * (y2 - y1));\n }\n twice += GL_W[k] * (x * dy - y * dx);\n }\n endX = x3; endY = y3;\n });\n close();\n return twice / 2;\n}\n\ninterface Segment {\n cmd: number;\n /** Control points followed by the end point, as the command stores them. */\n args: number[];\n fromX: number;\n fromY: number;\n}\n\n/**\n * `path` with every contour traversed backwards: same region, same curves,\n * opposite winding. A closed contour keeps its starting point; an open one\n * starts from where it used to end.\n */\nexport function reversePath(path: PolygonPath): PolygonPath {\n const cmds: number[] = [];\n const out: number[] = [];\n let segs: Segment[] = [];\n let sx = 0, sy = 0;\n let started = false;\n\n const flush = (closed: boolean) => {\n if (!started) return;\n const last = segs[segs.length - 1];\n const ex = last ? last.args[last.args.length - 2] : sx;\n const ey = last ? last.args[last.args.length - 1] : sy;\n if (closed) {\n cmds.push(PATH_M); out.push(sx, sy);\n if (ex !== sx || ey !== sy) { cmds.push(PATH_L); out.push(ex, ey); }\n } else {\n cmds.push(PATH_M); out.push(ex, ey);\n }\n for (let i = segs.length - 1; i >= 0; i--) {\n const s = segs[i];\n cmds.push(s.cmd);\n if (s.cmd === PATH_C) out.push(s.args[2], s.args[3], s.args[0], s.args[1]);\n else if (s.cmd === PATH_Q) out.push(s.args[0], s.args[1]);\n out.push(s.fromX, s.fromY);\n }\n if (closed) cmds.push(PATH_Z);\n segs = [];\n started = false;\n };\n\n const { commands, coords } = path;\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n if (cmd === PATH_M) {\n flush(false);\n sx = coords[ci]; sy = coords[ci + 1];\n started = true;\n return;\n }\n if (cmd === PATH_Z) { flush(true); return; }\n if (!started) { sx = px; sy = py; started = true; }\n const n = cmd === PATH_C ? 6 : cmd === PATH_Q ? 4 : 2;\n segs.push({ cmd, args: Array.from(coords.subarray(ci, ci + n)), fromX: px, fromY: py });\n });\n flush(false);\n\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(out),\n fillRule: path.fillRule,\n };\n}\n","/**\n * `pathFromD` — build a weasel `Path` from an **SVG path-data string** (the\n * value of SVG's `d` attribute, e.g. `\"M0 0 L100 0 Z\"`).\n *\n * This is the terse, declarative composition surface for geometry: a\n * consumer authors a shape as `d` and hands it straight to a scene/op API,\n * instead of chaining imperative builder calls. SVG `d` is deliberately the\n * language — it's a standard every consumer already knows, so the kit gets\n * path-language expressiveness without minting a new one. See\n * `docs/conventions.md` (\"Compose scenes in a terse path language\").\n *\n * Lowers every supported command (M/m L/l H/h V/v C/c S/s Q/q T/t A/a Z/z)\n * into weasel's `PathBuilder` primitives (move, line, cubic, quadratic,\n * close). Smooth (`S`/`s`/`T`/`t`) commands resolve their implicit reflected\n * control point from the previous cubic / quadratic. Arc commands (`A`/`a`)\n * convert to a series of cubic Bezier curves using the standard\n * endpoint-parameterization formulas (F.6.5 in the SVG spec): we reconstruct\n * the center, sweep angle, and a fixed number of (≤ 90°) cubic segments per\n * arc.\n *\n * No runtime dependency — a small hand-rolled parser. `@weasel-js/svg`'s\n * document parser (`parseSvg`) calls this for `<path d=…>` elements, so the\n * `d` grammar coverage is shared between the two entry points.\n */\n\nimport { PathBuilder } from './builder';\n\nconst NUM_RE = /[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g;\n/** Same grammar, anchored — used where a number's position matters. */\nconst NUM_RE_AT = /[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/y;\n\n/**\n * Is `d[j]` a command letter, as opposed to the `e` of an exponent? `1e2` is\n * a legal coordinate, and treating its `e` as a command drops the number and\n * everything after it in that argument run.\n */\nfunction isCommandLetter(d: string, j: number): boolean {\n const c = d[j];\n if (!/[A-Za-z]/.test(c)) return false;\n if (c !== 'e' && c !== 'E') return true;\n if (!/[\\d.]/.test(d[j - 1] ?? '')) return true;\n const k = d[j + 1] === '+' || d[j + 1] === '-' ? j + 2 : j + 1;\n return !/\\d/.test(d[k] ?? '');\n}\n\n/** Tokenize the command stream from a `d` string. */\nfunction tokenize(d: string): { cmd: string; args: number[] }[] {\n const out: { cmd: string; args: number[] }[] = [];\n // Walk character by character so we can group command-letter + arg-run.\n let i = 0;\n while (i < d.length) {\n if (isCommandLetter(d, i)) {\n // Collect numeric args until the next command letter.\n let j = i + 1;\n while (j < d.length && !isCommandLetter(d, j)) j++;\n const argSlice = d.slice(i + 1, j);\n const cmd = d[i];\n out.push({\n cmd,\n args: cmd === 'A' || cmd === 'a' ? readArcArgs(argSlice) : readNumbers(argSlice),\n });\n i = j;\n } else {\n // Skip any whitespace / commas at the head.\n i++;\n }\n }\n return out;\n}\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n let m: RegExpExecArray | null;\n NUM_RE.lastIndex = 0;\n while ((m = NUM_RE.exec(s)) !== null) {\n const n = Number(m[0]);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Read an `A`/`a` argument run. The two flags are single `0`/`1` digits that\n * need no separator after them, so `a25 25 -30 0 1 50 -25` may legally be\n * written `a25 25 -30 0150 -25` — which a plain number scan reads as two\n * arguments instead of four, leaving the whole arc short and dropped.\n */\nfunction readArcArgs(s: string): number[] {\n const out: number[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i];\n if (c === ',' || c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') { i++; continue; }\n const slot = out.length % 7;\n if (slot === 3 || slot === 4) {\n if (c !== '0' && c !== '1') return out;\n out.push(c === '1' ? 1 : 0);\n i++;\n continue;\n }\n NUM_RE_AT.lastIndex = i;\n const m = NUM_RE_AT.exec(s);\n if (!m) return out;\n out.push(Number(m[0]));\n i = NUM_RE_AT.lastIndex;\n }\n return out;\n}\n\n/**\n * Per-command argument counts (in floats). M/L/T = 2 coords; H/V = 1;\n * C = 6 (two controls + endpoint); S/Q = 4; A = 7 (rx ry x-axis-rotation\n * large-arc-flag sweep-flag x y).\n */\nconst ARG_COUNTS: Record<string, number> = {\n M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0,\n};\n\ninterface ParseState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n /** Last cubic control point for S/s reflection (in absolute coords). */\n lastCubicCtrl: { x: number; y: number } | null;\n /** Last quadratic control point for T/t reflection (in absolute coords). */\n lastQuadCtrl: { x: number; y: number } | null;\n}\n\n/**\n * Build a weasel `PolygonPath` from an SVG path-data (`d`) string. Unknown\n * command letters are skipped (and reported via `onWarn` when provided); the\n * builder still returns whatever valid commands preceded them.\n */\nexport function pathFromD(\n d: string,\n onWarn?: (message: string) => void,\n): ReturnType<PathBuilder['build']> {\n const tokens = tokenize(d);\n const b = new PathBuilder();\n const st: ParseState = {\n x: 0, y: 0, startX: 0, startY: 0,\n lastCubicCtrl: null, lastQuadCtrl: null,\n };\n\n for (const { cmd, args } of tokens) {\n const upper = cmd.toUpperCase();\n const relative = cmd !== upper;\n const argCount = ARG_COUNTS[upper];\n if (argCount === undefined) {\n onWarn?.(`unknown path command: ${cmd}`);\n continue;\n }\n if (upper === 'Z') {\n b.close();\n st.x = st.startX;\n st.y = st.startY;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n continue;\n }\n // M with multiple coord pairs implies subsequent pairs are L (per SVG spec).\n const groups = argCount === 0 ? 1 : Math.floor(args.length / argCount);\n for (let g = 0; g < groups; g++) {\n const a = args.slice(g * argCount, (g + 1) * argCount);\n // For repeated 'M'/'m' coord pairs after the first, downgrade to L/l.\n const effectiveUpper = upper === 'M' && g > 0 ? 'L' : upper;\n runCommand(effectiveUpper, relative, a, st, b);\n }\n }\n\n return b.build();\n}\n\nfunction runCommand(\n upper: string,\n relative: boolean,\n a: number[],\n st: ParseState,\n b: PathBuilder,\n): void {\n const rx = relative ? st.x : 0;\n const ry = relative ? st.y : 0;\n switch (upper) {\n case 'M': {\n const x = a[0] + rx;\n const y = a[1] + ry;\n b.moveTo(x, y);\n st.x = x; st.y = y;\n st.startX = x; st.startY = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'L': {\n const x = a[0] + rx;\n const y = a[1] + ry;\n b.lineTo(x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'H': {\n const x = a[0] + (relative ? st.x : 0);\n b.lineTo(x, st.y);\n st.x = x;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'V': {\n const y = a[0] + (relative ? st.y : 0);\n b.lineTo(st.x, y);\n st.y = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'C': {\n const x1 = a[0] + rx, y1 = a[1] + ry;\n const x2 = a[2] + rx, y2 = a[3] + ry;\n const x = a[4] + rx, y = a[5] + ry;\n b.curveTo(x1, y1, x2, y2, x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = { x: x2, y: y2 };\n st.lastQuadCtrl = null;\n return;\n }\n case 'S': {\n // Reflect prior cubic ctrl about the current point; fall back to\n // current point when prior wasn't a cubic.\n const ref = st.lastCubicCtrl ?? { x: st.x, y: st.y };\n const x1 = 2 * st.x - ref.x;\n const y1 = 2 * st.y - ref.y;\n const x2 = a[0] + rx, y2 = a[1] + ry;\n const x = a[2] + rx, y = a[3] + ry;\n b.curveTo(x1, y1, x2, y2, x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = { x: x2, y: y2 };\n st.lastQuadCtrl = null;\n return;\n }\n case 'Q': {\n const x1 = a[0] + rx, y1 = a[1] + ry;\n const x = a[2] + rx, y = a[3] + ry;\n b.quadTo(x1, y1, x, y);\n st.x = x; st.y = y;\n st.lastQuadCtrl = { x: x1, y: y1 };\n st.lastCubicCtrl = null;\n return;\n }\n case 'T': {\n const ref = st.lastQuadCtrl ?? { x: st.x, y: st.y };\n const x1 = 2 * st.x - ref.x;\n const y1 = 2 * st.y - ref.y;\n const x = a[0] + rx, y = a[1] + ry;\n b.quadTo(x1, y1, x, y);\n st.x = x; st.y = y;\n st.lastQuadCtrl = { x: x1, y: y1 };\n st.lastCubicCtrl = null;\n return;\n }\n case 'A': {\n const rxA = Math.abs(a[0]);\n const ryA = Math.abs(a[1]);\n const xRot = a[2];\n const largeArc = a[3] !== 0;\n const sweep = a[4] !== 0;\n const ex = a[5] + rx;\n const ey = a[6] + ry;\n arcToCubics(st.x, st.y, ex, ey, rxA, ryA, xRot, largeArc, sweep, b);\n st.x = ex; st.y = ey;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n default:\n return;\n }\n}\n\n/**\n * Convert an SVG elliptical arc segment to a series of cubic Bezier\n * `curveTo` calls on the builder. Standard endpoint-parameterization\n * implementation (SVG spec appendix F.6.5):\n *\n * 1. Handle degenerate cases (zero radii → line; same endpoints → noop).\n * 2. Compute the implicit center, start/sweep angles.\n * 3. Split the sweep into ≤ 90° pieces; each piece becomes one cubic.\n */\nfunction arcToCubics(\n x1: number, y1: number,\n x2: number, y2: number,\n rx: number, ry: number,\n xAxisRotationDeg: number,\n largeArc: boolean,\n sweep: boolean,\n b: PathBuilder,\n): void {\n if (x1 === x2 && y1 === y2) return;\n if (rx === 0 || ry === 0) {\n b.lineTo(x2, y2);\n return;\n }\n const phi = (xAxisRotationDeg * Math.PI) / 180;\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n\n // Step 1: compute (x1', y1') — rotate so x-axis aligns with ellipse axis.\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosPhi * dx + sinPhi * dy;\n const y1p = -sinPhi * dx + cosPhi * dy;\n\n // Correct radii if they're too small.\n let rxs = rx * rx;\n let rys = ry * ry;\n const x1ps = x1p * x1p;\n const y1ps = y1p * y1p;\n const lambda = x1ps / rxs + y1ps / rys;\n let rxFixed = rx;\n let ryFixed = ry;\n if (lambda > 1) {\n const sqrtLambda = Math.sqrt(lambda);\n rxFixed = sqrtLambda * rx;\n ryFixed = sqrtLambda * ry;\n rxs = rxFixed * rxFixed;\n rys = ryFixed * ryFixed;\n }\n\n // Step 2: center (cx', cy') in the rotated frame.\n const sign = largeArc === sweep ? -1 : 1;\n const num = rxs * rys - rxs * y1ps - rys * x1ps;\n const den = rxs * y1ps + rys * x1ps;\n const factor = sign * Math.sqrt(Math.max(0, num / den));\n const cxp = (factor * (rxFixed * y1p)) / ryFixed;\n const cyp = (factor * -(ryFixed * x1p)) / rxFixed;\n\n // Step 3: un-rotate the center back to user coords.\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2;\n\n // Step 4: start and sweep angles.\n const angle = (ux: number, uy: number, vx: number, vy: number): number => {\n const dot = ux * vx + uy * vy;\n const len = Math.sqrt((ux * ux + uy * uy) * (vx * vx + vy * vy));\n let a = Math.acos(Math.max(-1, Math.min(1, dot / len)));\n if (ux * vy - uy * vx < 0) a = -a;\n return a;\n };\n const theta1 = angle(1, 0, (x1p - cxp) / rxFixed, (y1p - cyp) / ryFixed);\n let dTheta = angle(\n (x1p - cxp) / rxFixed,\n (y1p - cyp) / ryFixed,\n (-x1p - cxp) / rxFixed,\n (-y1p - cyp) / ryFixed,\n );\n if (!sweep && dTheta > 0) dTheta -= 2 * Math.PI;\n else if (sweep && dTheta < 0) dTheta += 2 * Math.PI;\n\n // Step 5: split into ≤ 90° segments; emit a cubic per segment.\n const segCount = Math.max(1, Math.ceil(Math.abs(dTheta) / (Math.PI / 2)));\n const segAngle = dTheta / segCount;\n // Magic constant: cubic bezier handle length to approximate a circular\n // arc — for a segment of half-angle a, t = (4/3) * tan(a/2).\n const t = (4 / 3) * Math.tan(segAngle / 4);\n\n let prevX = x1;\n let prevY = y1;\n let prevDx = -Math.sin(theta1) * rxFixed;\n let prevDy = Math.cos(theta1) * ryFixed;\n\n for (let i = 1; i <= segCount; i++) {\n const theta = theta1 + i * segAngle;\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n const px = cosPhi * (cosT * rxFixed) - sinPhi * (sinT * ryFixed) + cx;\n const py = sinPhi * (cosT * rxFixed) + cosPhi * (sinT * ryFixed) + cy;\n const dxNew = -sinT * rxFixed;\n const dyNew = cosT * ryFixed;\n const c1x = prevX + cosPhi * (t * prevDx) - sinPhi * (t * prevDy);\n const c1y = prevY + sinPhi * (t * prevDx) + cosPhi * (t * prevDy);\n const c2x = px - cosPhi * (t * dxNew) + sinPhi * (t * dyNew);\n const c2y = py - sinPhi * (t * dxNew) - cosPhi * (t * dyNew);\n b.curveTo(c1x, c1y, c2x, c2y, px, py);\n prevX = px;\n prevY = py;\n prevDx = dxNew;\n prevDy = dyNew;\n }\n}\n","/**\n * A station along a path: where it is at a fraction of its length, and which\n * way it is heading there.\n *\n * For anything positioned *along* geometry rather than beside it — a label on a\n * routed edge, a tick on a curve, a badge near an arrowhead. Curves are\n * flattened first, so the fraction is arc length along the drawn shape rather\n * than a curve parameter, which is what makes 0.5 look like the middle.\n */\nimport type { Point } from './cubicMath';\nimport type { Path } from '../path';\nimport { extractPolylines } from '../tessellate/polyline';\n\n/** The answer `pointAlongPath` gives: a point on the path and its heading there. */\nexport interface PathStation {\n point: Point;\n /** Unit vector along the path at `point`, pointing toward the end. */\n tangent: Point;\n}\n\n/** Options for `pointAlongPath`. */\nexport interface PointAlongPathOptions {\n /** Curve flattening tolerance, in world units. Default 0.5. */\n flattenTolerance?: number;\n}\n\n/**\n * Where `path` is at `t` of its total length, and its heading there.\n *\n * `t` is clamped to 0..1. Subpaths are measured in order and treated as one\n * run, the way a browser measures a whole `<path>`. Returns `null` for a path\n * with no points at all; a path of zero length answers at its single point,\n * heading along +X.\n */\nexport function pointAlongPath(\n path: Path,\n t: number,\n opts: PointAlongPathOptions = {},\n): PathStation | null {\n const polylines = extractPolylines(\n path,\n opts.flattenTolerance === undefined ? {} : { flattenTolerance: opts.flattenTolerance },\n );\n\n /** Every segment, in order, with the length it contributes. */\n const segments: { ax: number; ay: number; bx: number; by: number; len: number }[] = [];\n let total = 0;\n let first: Point | undefined;\n for (const pl of polylines) {\n const count = pl.points.length / 2;\n if (count === 0) continue;\n first ??= { x: pl.points[0]!, y: pl.points[1]! };\n const last = pl.closed ? count : count - 1;\n for (let i = 0; i < last; i++) {\n const j = (i + 1) % count;\n const ax = pl.points[i * 2]!;\n const ay = pl.points[i * 2 + 1]!;\n const bx = pl.points[j * 2]!;\n const by = pl.points[j * 2 + 1]!;\n const len = Math.hypot(bx - ax, by - ay);\n if (len === 0) continue;\n segments.push({ ax, ay, bx, by, len });\n total += len;\n }\n }\n\n if (first === undefined) return null;\n if (segments.length === 0) return { point: first, tangent: { x: 1, y: 0 } };\n\n const target = Math.min(Math.max(t, 0), 1) * total;\n let walked = 0;\n for (const seg of segments) {\n if (walked + seg.len < target) {\n walked += seg.len;\n continue;\n }\n const u = (target - walked) / seg.len;\n return {\n point: { x: seg.ax + (seg.bx - seg.ax) * u, y: seg.ay + (seg.by - seg.ay) * u },\n tangent: { x: (seg.bx - seg.ax) / seg.len, y: (seg.by - seg.ay) / seg.len },\n };\n }\n\n // Float drift can leave `target` a hair past the last segment.\n const last = segments[segments.length - 1]!;\n return {\n point: { x: last.bx, y: last.by },\n tangent: { x: (last.bx - last.ax) / last.len, y: (last.by - last.ay) / last.len },\n };\n}\n","/**\n * Pure-geometry distance from a point to a path's boundary (stroke), with\n * no fill-side logic. Used by pickers that want to know \"how close is this\n * click to the visible edge of the shape?\" Callers combine this with\n * `pathContainsPoint` from `pathHitTest.ts` to get a closed-region\n * pick distance (0 inside, stroke-distance outside).\n *\n * A polygon path defers to geom's `nearestOnPath`; a RectPath short-circuits\n * to AABB-perimeter math.\n */\n\nimport { nearestOnPath } from '../nearest';\nimport type { Path } from '../path';\n\n/** Distance from (px, py) to the perimeter of an axis-aligned rectangle.\n * Returns 0 if the point is on the perimeter; positive value outside or\n * inside (distance to the nearest edge). */\nfunction pointToRectPerimeterDist(\n px: number, py: number,\n rx: number, ry: number, rw: number, rh: number,\n): number {\n // Distance to the rect as a region: 0 if inside, else Euclidean distance\n // to the AABB. For interior points, return distance to the closest edge.\n const dx = Math.max(rx - px, px - (rx + rw), 0);\n const dy = Math.max(ry - py, py - (ry + rh), 0);\n if (dx > 0 || dy > 0) return Math.hypot(dx, dy);\n // Inside: distance to closest edge.\n const left = px - rx, right = rx + rw - px;\n const top = py - ry, bottom = ry + rh - py;\n return Math.min(left, right, top, bottom);\n}\n\n/** Closest Euclidean distance from (px, py) to the boundary of `path`.\n * Pure stroke distance — does *not* consult fill rule or interior. For\n * closed-region pick distance (\"0 inside, stroke-distance outside\"),\n * combine with `pathContainsPoint` at the call site. */\nexport function pathDistanceToPoint(path: Path, px: number, py: number): number {\n if (path.kind === 'rect') {\n return pointToRectPerimeterDist(px, py, path.x, path.y, path.width, path.height);\n }\n return nearestOnPath(path.commands, path.coords, px, py)?.dist ?? Infinity;\n}\n","import { PathBuilder } from './builder';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport type { PolygonPath } from '../path';\n\n/**\n * Schneider (1990, Graphics Gems I) adaptive cubic-Bezier fitter.\n * Given a sequence of sample points, returns a `PolygonPath` whose `C`\n * segments approximate the samples within `errorTolerance` world units.\n *\n * Output shape: an initial `M` to the first sample, followed by N\n * `C` cubic segments. For colinear / two-point inputs, returns a single\n * degenerate cubic. For empty input, returns an empty polygon path.\n */\nexport function schneiderFit(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n): PolygonPath {\n if (samples.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: 'nonzero',\n };\n }\n\n const b = new PathBuilder();\n b.moveTo(samples[0].x, samples[0].y);\n\n if (samples.length === 1) {\n return b.build();\n }\n\n if (samples.length === 2) {\n emitStraightCubic(b, samples[0], samples[1]);\n return b.build();\n }\n\n fitRecursive(samples, errorTolerance, b);\n return b.build();\n}\n\nfunction fitRecursive(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n b: PathBuilder,\n): void {\n if (samples.length === 2) {\n const fit = fitOneCubic(samples);\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n const fit = fitOneCubic(samples);\n const { worstIndex, worstError } = measureError(samples, fit);\n if (worstError <= errorTolerance * errorTolerance) {\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n // Split. Both halves include the split sample so endpoints meet.\n const left = samples.slice(0, worstIndex + 1);\n const right = samples.slice(worstIndex);\n fitRecursive(left, errorTolerance, b);\n fitRecursive(right, errorTolerance, b);\n}\n\nfunction measureError(\n samples: ReadonlyArray<Point>,\n fit: CubicFit,\n): { worstIndex: number; worstError: number } {\n let worstIndex = 1;\n let worstError = 0;\n const a = samples[0];\n for (let i = 1; i < samples.length - 1; i++) {\n const t = i / (samples.length - 1);\n const q = cubicPointAt(a, fit.cp1, fit.cp2, fit.end, t);\n const dx = samples[i].x - q.x;\n const dy = samples[i].y - q.y;\n const sq = dx * dx + dy * dy;\n if (sq > worstError) {\n worstError = sq;\n worstIndex = i;\n }\n }\n return { worstIndex, worstError };\n}\n\ninterface CubicFit {\n cp1: Point;\n cp2: Point;\n end: Point;\n}\n\nfunction fitOneCubic(samples: ReadonlyArray<Point>): CubicFit {\n const n = samples.length;\n const a = samples[0];\n const e = samples[n - 1];\n const tStart = unit(sub(samples[1], a));\n const tEnd = unit(sub(samples[n - 2], e));\n\n const ts = chordLengthParam(samples);\n if (ts === null) return { cp1: { ...a }, cp2: { ...e }, end: e };\n\n let fit = solveLS(samples, ts, a, e, tStart, tEnd);\n for (let pass = 0; pass < 4; pass++) {\n reparameterize(samples, ts, a, e, fit);\n fit = solveLS(samples, ts, a, e, tStart, tEnd);\n }\n return fit;\n}\n\nfunction chordLengthParam(samples: ReadonlyArray<Point>): number[] | null {\n const n = samples.length;\n const ts = new Array<number>(n);\n ts[0] = 0;\n let total = 0;\n for (let i = 1; i < n; i++) {\n total += dist(samples[i - 1], samples[i]);\n ts[i] = total;\n }\n if (total === 0) return null;\n for (let i = 0; i < n; i++) ts[i] /= total;\n return ts;\n}\n\nfunction solveLS(\n samples: ReadonlyArray<Point>,\n ts: ReadonlyArray<number>,\n a: Point,\n e: Point,\n tStart: Point,\n tEnd: Point,\n): CubicFit {\n const n = samples.length;\n let c11 = 0, c12 = 0, c22 = 0, x1 = 0, x2 = 0;\n for (let i = 0; i < n; i++) {\n const t = ts[i];\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n const A1x = b1 * tStart.x;\n const A1y = b1 * tStart.y;\n const A2x = b2 * tEnd.x;\n const A2y = b2 * tEnd.y;\n c11 += A1x * A1x + A1y * A1y;\n c12 += A1x * A2x + A1y * A2y;\n c22 += A2x * A2x + A2y * A2y;\n const targetX = samples[i].x - (b0 + b1) * a.x - (b2 + b3) * e.x;\n const targetY = samples[i].y - (b0 + b1) * a.y - (b2 + b3) * e.y;\n x1 += A1x * targetX + A1y * targetY;\n x2 += A2x * targetX + A2y * targetY;\n }\n const det = c11 * c22 - c12 * c12;\n let alpha1: number;\n let alpha2: number;\n if (Math.abs(det) < 1e-12) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n } else {\n alpha1 = (c22 * x1 - c12 * x2) / det;\n alpha2 = (c11 * x2 - c12 * x1) / det;\n if (alpha1 < 1e-6 || alpha2 < 1e-6) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n }\n }\n return {\n cp1: { x: a.x + tStart.x * alpha1, y: a.y + tStart.y * alpha1 },\n cp2: { x: e.x + tEnd.x * alpha2, y: e.y + tEnd.y * alpha2 },\n end: e,\n };\n}\n\nfunction reparameterize(\n samples: ReadonlyArray<Point>,\n ts: number[],\n a: Point,\n e: Point,\n fit: CubicFit,\n): void {\n void a; void e;\n for (let i = 1; i < samples.length - 1; i++) {\n ts[i] = newtonRefineT(samples[i], ts[i], samples[0], fit.cp1, fit.cp2, samples[samples.length - 1]);\n }\n}\n\nfunction newtonRefineT(\n p: Point,\n t: number,\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n): number {\n // Q(t) - p, where Q is the cubic. Newton step uses Q'(t)·(Q(t)-p) and\n // a second-derivative correction.\n const u = 1 - t;\n const { x: qx, y: qy } = cubicPointAt(p0, p1, p2, p3, t);\n const qpx = 3*u*u*(p1.x - p0.x) + 6*u*t*(p2.x - p1.x) + 3*t*t*(p3.x - p2.x);\n const qpy = 3*u*u*(p1.y - p0.y) + 6*u*t*(p2.y - p1.y) + 3*t*t*(p3.y - p2.y);\n const qppx = 6*u*(p2.x - 2*p1.x + p0.x) + 6*t*(p3.x - 2*p2.x + p1.x);\n const qppy = 6*u*(p2.y - 2*p1.y + p0.y) + 6*t*(p3.y - 2*p2.y + p1.y);\n const dx = qx - p.x;\n const dy = qy - p.y;\n const numerator = dx * qpx + dy * qpy;\n const denominator = qpx * qpx + qpy * qpy + dx * qppx + dy * qppy;\n if (Math.abs(denominator) < 1e-12) return t;\n const next = t - numerator / denominator;\n if (next < 0) return 0;\n if (next > 1) return 1;\n return next;\n}\n\nfunction sub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\nfunction dist(a: Point, b: Point): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\nfunction unit(v: Point): Point {\n const m = Math.hypot(v.x, v.y);\n if (m === 0) return { x: 0, y: 0 };\n return { x: v.x / m, y: v.y / m };\n}\n\nfunction emitStraightCubic(\n b: PathBuilder,\n a: Point,\n c: Point,\n): void {\n // cp1 at 1/3 along chord, cp2 at 2/3 — the canonical straight cubic.\n const cp1x = a.x + (c.x - a.x) / 3;\n const cp1y = a.y + (c.y - a.y) / 3;\n const cp2x = a.x + (2 * (c.x - a.x)) / 3;\n const cp2y = a.y + (2 * (c.y - a.y)) / 3;\n b.curveTo(cp1x, cp1y, cp2x, cp2y, c.x, c.y);\n}\n","/**\n * Is a point within `px` screen pixels of a world-space stroke band?\n *\n * The band is a capsule of radius `r` around each segment, in the frame the\n * path lives in; `m` is the linear part of that frame's map to the screen.\n * Under a similarity the answer is a plain world distance, `r + px / scale`.\n * Under anything else the capsule lands on screen as a parallelogram capped by\n * two ellipses, and the pixel slop has to be measured against that shape:\n * neither a scalar nor a per-axis world tolerance describes it.\n */\nimport { pointSegmentDist2 } from './polyline';\n\n/** Linear part of a map to the screen: `x' = a·x + c·y`, `y' = b·x + d·y`. */\nexport interface Linear2 {\n a: number; b: number; c: number; d: number;\n}\n\n/** A linear map's singular decomposition, as much of it as the band test\n * needs: the two stretch factors, and the screen-space angle of the first. */\nexport interface Stretch {\n s1: number;\n s2: number;\n /** Angle of the first singular direction on screen. */\n phi: number;\n}\n\nexport function stretchOf(m: Linear2): Stretch {\n // Closed-form 2×2 SVD. M = R(phi) · diag(Q + R, Q − R) · R(theta).\n const e = (m.a + m.d) / 2;\n const f = (m.a - m.d) / 2;\n const g = (m.b + m.c) / 2;\n const h = (m.b - m.c) / 2;\n const q = Math.hypot(e, h);\n const r = Math.hypot(f, g);\n const phi = (Math.atan2(h, e) + Math.atan2(g, f)) / 2;\n return { s1: q + r, s2: Math.abs(q - r), phi };\n}\n\n/** True when the map scales every direction alike, so a screen length is one\n * world length. */\nexport function isSimilarity(s: Stretch): boolean {\n return s.s1 - s.s2 <= 1e-9 * s.s1;\n}\n\n/**\n * Screen point `(px0, py0)` against the image of one world capsule\n * `(ax, ay)–(bx, by)`, radius `r`, grown by `slop` pixels. `m`/`st` map world\n * to screen (linear part only — every point shares the translation).\n */\nexport function capsuleWithinPx(\n px0: number, py0: number,\n ax: number, ay: number, bx: number, by: number,\n r: number, slop: number,\n m: Linear2, st: Stretch,\n): boolean {\n const sax = m.a * ax + m.c * ay, say = m.b * ax + m.d * ay;\n const sbx = m.a * bx + m.c * by, sby = m.b * bx + m.d * by;\n const slop2 = slop * slop;\n const dCenter2 = pointSegmentDist2(px0, py0, sax, say, sbx, sby);\n if (dCenter2 <= slop2) return true;\n if (r <= 0) return false;\n // Nothing in the band is farther from the centerline than r·s1 on screen.\n const reach = slop + r * st.s1;\n if (dCenter2 > reach * reach) return false;\n\n // The parallelogram: the capsule's straight part, carried to the screen.\n const wx = bx - ax, wy = by - ay;\n const wl = Math.hypot(wx, wy);\n if (wl > 0) {\n const nx = (-wy / wl) * r, ny = (wx / wl) * r;\n const ox = m.a * nx + m.c * ny, oy = m.b * nx + m.d * ny;\n if (quadWithinPx(px0, py0, [\n sax + ox, say + oy, sbx + ox, sby + oy,\n sbx - ox, sby - oy, sax - ox, say - oy,\n ], slop2)) return true;\n }\n // The round caps: each end's disk lands on screen as an ellipse.\n return ellipseWithinPx(px0 - sax, py0 - say, r, slop, st)\n || ellipseWithinPx(px0 - sbx, py0 - sby, r, slop, st);\n}\n\n/** Inside a convex quad, or within `sqrt(slop2)` of one of its edges. */\nfunction quadWithinPx(x: number, y: number, q: readonly number[], slop2: number): boolean {\n let pos = 0, neg = 0;\n for (let i = 0; i < 8; i += 2) {\n const j = (i + 2) % 8;\n const cr = (q[j] - q[i]) * (y - q[i + 1]) - (q[j + 1] - q[i + 1]) * (x - q[i]);\n if (cr > 0) pos++;\n else if (cr < 0) neg++;\n }\n if (pos === 0 || neg === 0) return true;\n for (let i = 0; i < 8; i += 2) {\n const j = (i + 2) % 8;\n if (pointSegmentDist2(x, y, q[i], q[i + 1], q[j], q[j + 1]) <= slop2) return true;\n }\n return false;\n}\n\n/** `(dx, dy)` from the center of the filled ellipse `M(disk r)`, within `slop`? */\nfunction ellipseWithinPx(dx: number, dy: number, r: number, slop: number, st: Stretch): boolean {\n const cos = Math.cos(st.phi), sin = Math.sin(st.phi);\n const u = Math.abs(cos * dx + sin * dy);\n const v = Math.abs(-sin * dx + cos * dy);\n const e0 = r * st.s1, e1 = r * st.s2;\n if (e1 <= 0) {\n // Collapsed to a segment along the first axis.\n const over = Math.max(0, u - e0);\n return over * over + v * v <= slop * slop;\n }\n return distToEllipse(e0, e1, u, v) <= slop;\n}\n\n/**\n * Distance from `(y0, y1)`, first quadrant, to the filled axis-aligned ellipse\n * with semi-axes `e0 >= e1 > 0`. Eberly, \"Distance from a Point to an\n * Ellipse\" — bisection on the Lagrange root, robust near the axes.\n */\nfunction distToEllipse(e0: number, e1: number, y0: number, y1: number): number {\n const z0 = y0 / e0, z1 = y1 / e1;\n const g = z0 * z0 + z1 * z1 - 1;\n if (g <= 0) return 0;\n if (y1 > 0) {\n if (y0 > 0) {\n const r0 = (e0 / e1) * (e0 / e1);\n const n0 = r0 * z0;\n let s0 = z1 - 1;\n let s1 = Math.hypot(n0, z1) - 1;\n let s = 0;\n for (let i = 0; i < 100; i++) {\n s = (s0 + s1) / 2;\n if (s === s0 || s === s1) break;\n const a = n0 / (s + r0), b = z1 / (s + 1);\n const gs = a * a + b * b - 1;\n if (gs > 0) s0 = s;\n else if (gs < 0) s1 = s;\n else break;\n }\n const x0 = (r0 * y0) / (s + r0);\n const x1 = y1 / (s + 1);\n return Math.hypot(x0 - y0, x1 - y1);\n }\n return y1 - e1;\n }\n const numer = e0 * y0, denom = e0 * e0 - e1 * e1;\n if (numer < denom) {\n const t = numer / denom;\n const x0 = e0 * t, x1 = e1 * Math.sqrt(1 - t * t);\n return Math.hypot(x0 - y0, x1);\n }\n return y0 - e0;\n}\n","/**\n * Path hit-testing: path-vs-point (filled region and stroke distance),\n * path-vs-rect, and path-vs-polygon in both directions.\n *\n * A `rect` path short-circuits to AABB arithmetic. A `polygon` path is its\n * filled region: beziers are flattened, `fillRule` is honored (default\n * `nonzero`), and every closed subpath counts — the hole of a donut is not\n * part of the shape under `evenodd`. Open subpaths enclose no area, so the\n * filled-region tests ignore them.\n */\n\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from './commands';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubic, flattenQuadratic } from './flatten';\nimport { pointInPolygon, pointSegmentDist2, segmentsCross } from './polyline';\nimport type { Rect } from './box';\nimport type { Path, PolygonPath } from './path';\nimport type { Mat3 } from './mat3';\nimport { capsuleWithinPx, isSimilarity, stretchOf, type Linear2 } from './screenBand';\n\ntype XY = { x: number; y: number };\n\n/** Options for the path hit-tests. */\nexport interface PointInPathOptions {\n /** Bezier flattening tolerance in world units. Default 0.5. */\n tolerance?: number;\n}\n\n/** Options for {@link strokeHitTest}. */\nexport interface StrokeHitTestOptions {\n /** Bezier flattening tolerance in world units. Default 0.5. */\n tolerance?: number;\n /** Extra reach past the band measured in screen pixels rather than world\n * units: `px` pixels, after `transform` carries the path's frame to the\n * screen (only its linear part matters). A pointer's forgiveness is a\n * screen distance, and under a non-uniform or rotated-then-squished\n * transform no world distance equals it. */\n slop?: { px: number; transform: Mat3 };\n}\n\n// ─── Flattening ─────────────────────────────────────────────────────────────\n\n/**\n * `path` flattened to interleaved `[x, y, …]` runs, sorted by whether each\n * subpath encloses area. A `Z` closing fewer than three points yields an open\n * run, as does any subpath a `Z` never ends. The closing edge of a closed run\n * back to its first vertex is implicit.\n */\nfunction flatSubpaths(\n path: PolygonPath,\n tolerance: number,\n): { closed: number[][]; open: number[][] } {\n const { commands, coords } = path;\n const closed: number[][] = [];\n const open: number[][] = [];\n let sub: number[] = [];\n\n forEachSegment(commands, coords, (cmd, ci, curX, curY) => {\n switch (cmd) {\n case PATH_M:\n if (sub.length >= 2) open.push(sub);\n sub = [coords[ci], coords[ci + 1]];\n break;\n case PATH_L:\n sub.push(coords[ci], coords[ci + 1]);\n break;\n case PATH_C:\n flattenCubic(\n curX, curY,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n tolerance, sub,\n );\n break;\n case PATH_Q:\n flattenQuadratic(\n curX, curY,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n tolerance, sub,\n );\n break;\n case PATH_Z:\n if (sub.length >= 6) closed.push(sub);\n else if (sub.length >= 2) open.push(sub);\n sub = [];\n break;\n default:\n throw new Error(`pathHitTest: unknown command ${cmd}`);\n }\n });\n if (sub.length >= 2) open.push(sub);\n return { closed, open };\n}\n\nfunction closedSubpaths(path: PolygonPath, opts: PointInPathOptions): number[][] {\n return flatSubpaths(path, opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE).closed;\n}\n\n// ─── Point vs path ──────────────────────────────────────────────────────────\n\n/** Filled-region hit-test for a path. Rect short-circuits to AABB; polygons run ray-cast / winding per `fillRule`. */\nexport function pointInPath(\n path: Path,\n x: number,\n y: number,\n opts: PointInPathOptions = {},\n): boolean {\n if (path.kind === 'rect') {\n return x >= path.x && x <= path.x + path.width && y >= path.y && y <= path.y + path.height;\n }\n let crossings = 0;\n let winding = 0;\n for (const sub of closedSubpaths(path, opts)) {\n const n = sub.length;\n for (let i = 0; i < n; i += 2) {\n const j = (i + 2) % n;\n const ay = sub[i + 1], by = sub[j + 1];\n if ((ay > y) === (by > y)) continue;\n const ax = sub[i], bx = sub[j];\n if (x >= ax + ((y - ay) / (by - ay)) * (bx - ax)) continue;\n crossings++;\n winding += ay <= y ? 1 : -1;\n }\n }\n return path.fillRule === 'evenodd' ? (crossings & 1) === 1 : winding !== 0;\n}\n\n/**\n * Stroke-distance hit-test. True when (x, y) lies within `threshold` world\n * units of the path's outline — when a stroke of total width `2 * threshold`\n * drawn along the path would cover the point. Works for open and closed\n * subpaths alike; OR it with {@link pointInPath} for fill-plus-stroke picking.\n * Every flattened segment is treated as a capsule of radius `threshold`.\n */\nexport function strokeHitTest(\n path: Path,\n x: number,\n y: number,\n threshold: number,\n opts: StrokeHitTestOptions = {},\n): boolean {\n const slop = opts.slop;\n if (slop && slop.px > 0) {\n const [a, b, c, d] = slop.transform;\n const m: Linear2 = { a, b, c, d };\n const st = stretchOf(m);\n if (isSimilarity(st)) {\n return strokeHitTest(path, x, y, threshold + slop.px / st.s1, { tolerance: opts.tolerance });\n }\n const sx = a * x + c * y, sy = b * x + d * y;\n return someSegment(path, opts.tolerance, (ax, ay, bx, by) =>\n capsuleWithinPx(sx, sy, ax, ay, bx, by, threshold, slop.px, m, st));\n }\n const t2 = threshold * threshold;\n return someSegment(path, opts.tolerance, (ax, ay, bx, by) =>\n pointSegmentDist2(x, y, ax, ay, bx, by) <= t2);\n}\n\n/** Does `visit` answer true for any outline segment — every edge of a rect,\n * closing edges of closed subpaths included? */\nfunction someSegment(\n path: Path,\n tolerance: number | undefined,\n visit: (ax: number, ay: number, bx: number, by: number) => boolean,\n): boolean {\n if (path.kind === 'rect') {\n const { x: rx, y: ry, width: w, height: h } = path;\n return visit(rx, ry, rx + w, ry) || visit(rx + w, ry, rx + w, ry + h)\n || visit(rx + w, ry + h, rx, ry + h) || visit(rx, ry + h, rx, ry);\n }\n const { closed, open } = flatSubpaths(path, tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n const run = (sub: readonly number[], wrap: boolean): boolean => {\n const n = sub.length;\n const last = wrap ? n : n - 2;\n for (let i = 0; i < last; i += 2) {\n const j = (i + 2) % n;\n if (visit(sub[i], sub[i + 1], sub[j], sub[j + 1])) return true;\n }\n return false;\n };\n return closed.some((sub) => run(sub, true)) || open.some((sub) => run(sub, false));\n}\n\n// ─── Region vs path ─────────────────────────────────────────────────────────\n\nfunction rectToVerts(r: Rect): XY[] {\n return [\n { x: r.x, y: r.y },\n { x: r.x + r.width, y: r.y },\n { x: r.x + r.width, y: r.y + r.height },\n { x: r.x, y: r.y + r.height },\n ];\n}\n\n/** Flatten a vertex array into an interleaved [x0,y0,x1,y1,...] array. */\nfunction flattenVerts(poly: readonly XY[]): number[] {\n const flat: number[] = new Array(poly.length * 2);\n for (let i = 0; i < poly.length; i++) {\n flat[i * 2] = poly[i].x;\n flat[i * 2 + 1] = poly[i].y;\n }\n return flat;\n}\n\n/** Edge-vs-edge segment intersection check between two closed polygons. */\nfunction polygonsIntersect(a: readonly XY[], b: readonly XY[]): boolean {\n if (a.length === 0 || b.length === 0) return false;\n if (pointInPolygon(flattenVerts(a), b[0].x, b[0].y)) return true;\n if (pointInPolygon(flattenVerts(b), a[0].x, a[0].y)) return true;\n for (let i = 0; i < a.length; i++) {\n const a0 = a[i], a1 = a[(i + 1) % a.length];\n for (let j = 0; j < b.length; j++) {\n const b0 = b[j], b1 = b[(j + 1) % b.length];\n if (segmentsCross(a0.x, a0.y, a1.x, a1.y, b0.x, b0.y, b1.x, b1.y)) return true;\n }\n }\n return false;\n}\n\n/** Run `visit` over every edge of every closed subpath until it answers true. */\nfunction anyEdge(\n subpaths: readonly number[][],\n visit: (ax: number, ay: number, bx: number, by: number) => boolean,\n): boolean {\n for (const sub of subpaths) {\n const n = sub.length;\n for (let i = 0; i < n; i += 2) {\n const j = (i + 2) % n;\n if (visit(sub[i], sub[i + 1], sub[j], sub[j + 1])) return true;\n }\n }\n return false;\n}\n\nfunction anyEdgeCrossesRect(subpaths: readonly number[][], r: Rect): boolean {\n const x0 = r.x, y0 = r.y, x1 = r.x + r.width, y1 = r.y + r.height;\n return anyEdge(subpaths, (ax, ay, bx, by) =>\n segmentsCross(ax, ay, bx, by, x0, y0, x1, y0) ||\n segmentsCross(ax, ay, bx, by, x1, y0, x1, y1) ||\n segmentsCross(ax, ay, bx, by, x1, y1, x0, y1) ||\n segmentsCross(ax, ay, bx, by, x0, y1, x0, y0),\n );\n}\n\nfunction anyEdgeCrossesPolygon(subpaths: readonly number[][], poly: readonly XY[]): boolean {\n if (poly.length === 0) return false;\n return anyEdge(subpaths, (ax, ay, bx, by) => {\n for (let i = 0; i < poly.length; i++) {\n const p0 = poly[i], p1 = poly[(i + 1) % poly.length];\n if (segmentsCross(ax, ay, bx, by, p0.x, p0.y, p1.x, p1.y)) return true;\n }\n return false;\n });\n}\n\n/** `anyEdgeCrossesPolygon` for open runs: no edge back to the first vertex. */\nfunction anyOpenEdgeCrossesPolygon(runs: readonly number[][], poly: readonly XY[]): boolean {\n for (const run of runs) {\n for (let i = 0; i + 3 < run.length; i += 2) {\n const ax = run[i], ay = run[i + 1], bx = run[i + 2], by = run[i + 3];\n for (let k = 0; k < poly.length; k++) {\n const p0 = poly[k], p1 = poly[(k + 1) % poly.length];\n if (segmentsCross(ax, ay, bx, by, p0.x, p0.y, p1.x, p1.y)) return true;\n }\n }\n }\n return false;\n}\n\nfunction anyVertexInRect(subpaths: readonly number[][], r: Rect): boolean {\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n const x = sub[i], y = sub[i + 1];\n if (x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height) return true;\n }\n }\n return false;\n}\n\nfunction anyVertexInPolygon(subpaths: readonly number[][], flatPoly: readonly number[]): boolean {\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n if (pointInPolygon(flatPoly, sub[i], sub[i + 1])) return true;\n }\n }\n return false;\n}\n\n/** Returns true if (x, y) lies within the filled region of `path`. */\nexport function pathContainsPoint(\n path: Path,\n x: number,\n y: number,\n opts: PointInPathOptions = {},\n): boolean {\n return pointInPath(path, x, y, opts);\n}\n\n/** Returns true if `rect` is entirely contained within `path`. */\nexport function pathContainsRect(path: Path, rect: Rect, opts: PointInPathOptions = {}): boolean {\n if (path.kind === 'rect') {\n return (\n rect.x >= path.x &&\n rect.y >= path.y &&\n rect.x + rect.width <= path.x + path.width &&\n rect.y + rect.height <= path.y + path.height\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const c of rectToVerts(rect)) {\n if (!pointInPath(path, c.x, c.y, opts)) return false;\n }\n // Every corner is filled, but any contour reaching into the rect — the\n // boundary of a hole, or a concave notch — leaves part of it unfilled.\n return !anyVertexInRect(subpaths, rect) && !anyEdgeCrossesRect(subpaths, rect);\n}\n\n/** Returns true if `rect` overlaps (intersects or contains) `path`. */\nexport function pathIntersectsRect(path: Path, rect: Rect, opts: PointInPathOptions = {}): boolean {\n if (path.kind === 'rect') {\n return (\n rect.x < path.x + path.width &&\n rect.x + rect.width > path.x &&\n rect.y < path.y + path.height &&\n rect.y + rect.height > path.y\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const c of rectToVerts(rect)) {\n if (pointInPath(path, c.x, c.y, opts)) return true;\n }\n if (anyVertexInRect(subpaths, rect)) return true;\n return anyEdgeCrossesRect(subpaths, rect);\n}\n\n/** Returns true if every vertex of `polygon` lies inside `path`. */\nexport function pathContainsPolygon(\n path: Path,\n polygon: readonly XY[],\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length === 0) return false;\n if (path.kind === 'rect') {\n return polygon.every(\n (p) =>\n p.x >= path.x &&\n p.x <= path.x + path.width &&\n p.y >= path.y &&\n p.y <= path.y + path.height,\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const p of polygon) {\n if (!pointInPath(path, p.x, p.y, opts)) return false;\n }\n return !anyVertexInPolygon(subpaths, flattenVerts(polygon)) &&\n !anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/** Returns true if `polygon` overlaps (intersects or is contained by) `path`. */\nexport function pathIntersectsPolygon(\n path: Path,\n polygon: readonly XY[],\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length === 0) return false;\n if (path.kind === 'rect') {\n return polygonsIntersect(rectToVerts(path), polygon);\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const p of polygon) {\n if (pointInPath(path, p.x, p.y, opts)) return true;\n }\n if (anyVertexInPolygon(subpaths, flattenVerts(polygon))) return true;\n return anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/**\n * Returns true if all of `path` — every subpath, open ones included, beziers\n * flattened — lies inside the closed `polygon`: the inverse of\n * {@link pathContainsPolygon}. A lasso enclosing a shape asks this.\n */\nexport function polygonContainsPath(\n polygon: readonly XY[],\n path: Path,\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length < 3) return false;\n let subpaths: number[][];\n if (path.kind === 'rect') {\n subpaths = [flattenVerts(rectToVerts(path))];\n } else {\n const { closed, open } = flatSubpaths(path, opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n subpaths = [...closed, ...open];\n }\n if (subpaths.length === 0) return false;\n const flatPoly = flattenVerts(polygon);\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n if (!pointInPolygon(flatPoly, sub[i], sub[i + 1])) return false;\n }\n }\n // Every vertex is inside, but a concave polygon can still cut an edge. An\n // open subpath is checked as if closed, so this can only err toward false.\n return !anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/**\n * Returns true if any of `path` meets the closed `polygon`: its filled region,\n * or the line of an open subpath, which encloses nothing. Beziers are\n * flattened, so a control point off the curve never counts. The companion of\n * {@link polygonContainsPath}; a lasso touching a shape asks this.\n */\nexport function polygonIntersectsPath(\n polygon: readonly XY[],\n path: Path,\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length < 3) return false;\n if (path.kind === 'rect') return polygonsIntersect(rectToVerts(path), polygon);\n const { closed, open } = flatSubpaths(path, opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n const flatPoly = flattenVerts(polygon);\n if (anyVertexInPolygon(closed, flatPoly) || anyVertexInPolygon(open, flatPoly)) return true;\n if (anyEdgeCrossesPolygon(closed, polygon) || anyOpenEdgeCrossesPolygon(open, polygon)) {\n return true;\n }\n // No vertex inside and no crossing: the polygon lies wholly in one region\n // of the path, so one of its vertices decides whether that region is filled.\n return closed.length > 0 && pointInPath(path, polygon[0].x, polygon[0].y, opts);\n}\n","import type { Rect } from './box';\n\n/** Which side of the anchor the overlay sits on. */\nexport type PlacementSide = 'top' | 'bottom' | 'left' | 'right';\n\n/** How the overlay lines up along the side it sits on. */\nexport type PlacementAlign = 'start' | 'center' | 'end';\n\n/** A side paired with an alignment along it. */\nexport interface Placement {\n side: PlacementSide;\n align: PlacementAlign;\n}\n\n/** Inputs to {@link placeRect}. All rects share one coordinate space. */\nexport interface PlaceRectOptions {\n anchor: Rect;\n overlay: { width: number; height: number };\n boundary: Rect;\n placement: Placement;\n /** Gap between anchor and overlay along the side axis. Default 0. */\n offset?: number;\n /** Shift along the alignment axis. Default 0. */\n crossOffset?: number;\n /** Minimum gap kept between the overlay and the boundary. Default 0. */\n padding?: number;\n /** Whether to try the opposite side when the preferred one lacks room. Default true. */\n flip?: boolean;\n}\n\n/** Where the overlay landed, and the placement that produced it. */\nexport interface PlacedRect {\n rect: Rect;\n placement: Placement;\n}\n\nfunction alignAlong(start: number, extent: number, size: number, align: PlacementAlign): number {\n if (align === 'start') return start;\n if (align === 'end') return start + extent - size;\n return start + (extent - size) / 2;\n}\n\nfunction positionOn(\n anchor: Rect,\n overlay: { width: number; height: number },\n placement: Placement,\n offset: number,\n crossOffset: number,\n): Rect {\n const { width, height } = overlay;\n const { side, align } = placement;\n if (side === 'top' || side === 'bottom') {\n const y = side === 'bottom' ? anchor.y + anchor.height + offset : anchor.y - offset - height;\n return { x: alignAlong(anchor.x, anchor.width, width, align) + crossOffset, y, width, height };\n }\n const x = side === 'right' ? anchor.x + anchor.width + offset : anchor.x - offset - width;\n return { x, y: alignAlong(anchor.y, anchor.height, height, align) + crossOffset, width, height };\n}\n\nfunction clampAxis(start: number, size: number, low: number, extent: number, padding: number): number {\n const min = low + padding;\n return Math.max(min, Math.min(start, min + extent - padding * 2 - size));\n}\n\n/**\n * Move `rect` the shortest distance that puts it inside `boundary`, keeping its\n * size. A rect too big to fit pins to the boundary's leading edge.\n */\nexport function clampRectWithin(rect: Rect, boundary: Rect, padding = 0): Rect {\n return {\n ...rect,\n x: clampAxis(rect.x, rect.width, boundary.x, boundary.width, padding),\n y: clampAxis(rect.y, rect.height, boundary.y, boundary.height, padding),\n };\n}\n\n/** Slide along the alignment axis until the overlay is inside. */\nfunction shiftAcross(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): Rect {\n const vertical = side === 'top' || side === 'bottom';\n const size = vertical ? rect.width : rect.height;\n const low = (vertical ? boundary.x : boundary.y) + padding;\n const high = low + (vertical ? boundary.width : boundary.height) - padding * 2 - size;\n const placed = Math.max(low, Math.min(vertical ? rect.x : rect.y, high));\n return vertical ? { ...rect, x: placed } : { ...rect, y: placed };\n}\n\nconst OPPOSITE: Record<PlacementSide, PlacementSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nfunction fitsAlongSide(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): boolean {\n const vertical = side === 'top' || side === 'bottom';\n const start = vertical ? rect.y : rect.x;\n const end = start + (vertical ? rect.height : rect.width);\n const low = (vertical ? boundary.y : boundary.x) + padding;\n const high = low + (vertical ? boundary.height : boundary.width) - padding * 2;\n return start >= low && end <= high;\n}\n\n/**\n * Position an overlay beside `anchor` at the requested placement. With `flip`,\n * a side that overflows the boundary is swapped for the opposite one when that\n * fits. The result then slides along the alignment axis to stay inside the\n * boundary; along the side axis it is left where it is, even if it overflows.\n */\nexport function placeRect(options: PlaceRectOptions): PlacedRect {\n const { anchor, overlay, boundary, placement, offset = 0, crossOffset = 0 } = options;\n const { padding = 0, flip = true } = options;\n\n let resolved = placement;\n let rect = positionOn(anchor, overlay, resolved, offset, crossOffset);\n\n if (flip && !fitsAlongSide(rect, boundary, resolved.side, padding)) {\n const opposite = { side: OPPOSITE[resolved.side], align: resolved.align };\n const flipped = positionOn(anchor, overlay, opposite, offset, crossOffset);\n if (fitsAlongSide(flipped, boundary, opposite.side, padding)) {\n resolved = opposite;\n rect = flipped;\n }\n }\n\n return { rect: shiftAcross(rect, boundary, resolved.side, padding), placement: resolved };\n}\n","/** An easing curve: maps normalized progress `t ∈ [0, 1]` to eased progress.\n * Curves may leave the 0–1 range in the middle (back, elastic) but should\n * pass through 0 at 0 and 1 at 1. */\nexport type EasingFn = (t: number) => number;\n\n/** A spring's physical parameters. Higher stiffness settles faster, higher\n * damping overshoots less, higher mass makes both sluggish. */\nexport interface SpringPreset {\n stiffness: number;\n damping: number;\n mass: number;\n}\n\n/** One of the tunings in `SPRING_PRESETS`. */\nexport type SpringPresetName = 'gentle' | 'wobbly' | 'stiff' | 'slow';\n\n// --- Polynomial family (degree 1-5). The unsuffixed `easeIn`/`easeOut`/\n// `easeInOut` aliases mirror the `easeInQuad` curve (degree 2) for backwards\n// compatibility with existing call sites.\n\n/** No easing: constant rate from start to finish. */\nexport const linear: EasingFn = (t) => t;\n\n// Quadratic (degree 2)\n/** Accelerates from a standstill, gently. */\nexport const easeInQuad: EasingFn = (t) => t * t;\n/** Decelerates to a stop, gently. The safe default for UI motion. */\nexport const easeOutQuad: EasingFn = (t) => 1 - (1 - t) * (1 - t);\n/** Accelerates then decelerates, gently. */\nexport const easeInOutQuad: EasingFn = (t) =>\n t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);\n\n// Cubic (degree 3)\n/** Accelerates from a standstill, moderately. */\nexport const easeInCubic: EasingFn = (t) => t * t * t;\n/** Decelerates to a stop, moderately. */\nexport const easeOutCubic: EasingFn = (t) => 1 - Math.pow(1 - t, 3);\n/** Accelerates then decelerates, moderately. */\nexport const easeInOutCubic: EasingFn = (t) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n// Quartic (degree 4)\n/** Accelerates from a standstill, sharply. */\nexport const easeInQuart: EasingFn = (t) => t * t * t * t;\n/** Decelerates to a stop, sharply. */\nexport const easeOutQuart: EasingFn = (t) => 1 - Math.pow(1 - t, 4);\n/** Accelerates then decelerates, sharply. */\nexport const easeInOutQuart: EasingFn = (t) =>\n t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n\n// Quintic (degree 5)\n/** Accelerates from a standstill, very sharply. */\nexport const easeInQuint: EasingFn = (t) => t * t * t * t * t;\n/** Decelerates to a stop, very sharply. */\nexport const easeOutQuint: EasingFn = (t) => 1 - Math.pow(1 - t, 5);\n/** Accelerates then decelerates, very sharply. */\nexport const easeInOutQuint: EasingFn = (t) =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n\n// --- Trigonometric / transcendental\n\n/** Accelerates from a standstill along a sine curve — the mildest\n * acceleration of the built-ins. */\nexport const easeInSine: EasingFn = (t) => 1 - Math.cos((t * Math.PI) / 2);\n/** Decelerates to a stop along a sine curve — the mildest\n * deceleration of the built-ins. */\nexport const easeOutSine: EasingFn = (t) => Math.sin((t * Math.PI) / 2);\n/** Accelerates then decelerates along a sine curve. */\nexport const easeInOutSine: EasingFn = (t) => -(Math.cos(Math.PI * t) - 1) / 2;\n\n/** Accelerates exponentially: barely moves at first, then rushes. */\nexport const easeInExpo: EasingFn = (t) => (t === 0 ? 0 : Math.pow(2, 10 * t - 10));\n/** Decelerates exponentially: leaps away, then creeps in. */\nexport const easeOutExpo: EasingFn = (t) => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t));\n/** Exponential at both ends — a very fast middle between two\n * near-still extremes. */\nexport const easeInOutExpo: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5\n ? Math.pow(2, 20 * t - 10) / 2\n : (2 - Math.pow(2, -20 * t + 10)) / 2;\n};\n\n/** Accelerates along a circular arc: slow start, abrupt arrival. */\nexport const easeInCirc: EasingFn = (t) => 1 - Math.sqrt(1 - t * t);\n/** Decelerates along a circular arc: abrupt start, slow arrival. */\nexport const easeOutCirc: EasingFn = (t) => Math.sqrt(1 - Math.pow(t - 1, 2));\n/** Circular arcs at both ends. */\nexport const easeInOutCirc: EasingFn = (t) =>\n t < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2;\n\n// --- Overshoot / oscillate / decay (Penner's named curves).\n// Constants are the well-known defaults; a future iteration could expose\n// per-call tuning (stiffness on back, amplitude/period on elastic).\n\nconst C1 = 1.70158; // back overshoot\nconst C2 = C1 * 1.525; // back inOut\nconst C3 = C1 + 1;\nconst C4 = (2 * Math.PI) / 3; // elastic in/out\nconst C5 = (2 * Math.PI) / 4.5;\n\n/** Pulls back past the start before moving forward. Overshoots below 0. */\nexport const easeInBack: EasingFn = (t) => C3 * t * t * t - C1 * t * t;\n/** Overshoots the target, then settles back onto it. Exceeds 1. */\nexport const easeOutBack: EasingFn = (t) =>\n 1 + C3 * Math.pow(t - 1, 3) + C1 * Math.pow(t - 1, 2);\n/** Overshoots at both ends. Leaves the 0–1 range on each side. */\nexport const easeInOutBack: EasingFn = (t) =>\n t < 0.5\n ? (Math.pow(2 * t, 2) * ((C2 + 1) * 2 * t - C2)) / 2\n : (Math.pow(2 * t - 2, 2) * ((C2 + 1) * (2 * t - 2) + C2) + 2) / 2;\n\n/** Oscillates around the start with growing amplitude, then snaps away. */\nexport const easeInElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * C4);\n};\n/** Springs past the target and wobbles into it. Exceeds 1. */\nexport const easeOutElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * C4) + 1;\n};\n/** Wobbles at both ends. Leaves the 0–1 range on each side. */\nexport const easeInOutElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5\n ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * C5)) / 2\n : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * C5)) / 2 + 1;\n};\n\n/** Lands on the target and bounces, in hops of decreasing height. */\nexport const easeOutBounce: EasingFn = (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) return n1 * t * t;\n if (t < 2 / d1) { t -= 1.5 / d1; return n1 * t * t + 0.75; }\n if (t < 2.5 / d1) { t -= 2.25 / d1; return n1 * t * t + 0.9375; }\n t -= 2.625 / d1;\n return n1 * t * t + 0.984375;\n};\n/** Bounces up to the start before departing — `easeOutBounce` reversed. */\nexport const easeInBounce: EasingFn = (t) => 1 - easeOutBounce(1 - t);\n/** Bounces at both ends. */\nexport const easeInOutBounce: EasingFn = (t) =>\n t < 0.5\n ? (1 - easeOutBounce(1 - 2 * t)) / 2\n : (1 + easeOutBounce(2 * t - 1)) / 2;\n\n// --- Backwards-compat aliases. Pre-library callers asked for `easeIn`/\n// `easeOut`/`easeInOut`; those resolve to the quadratic curve.\n/** Alias for `easeInQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeIn = easeInQuad;\n/** Alias for `easeOutQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeOut = easeOutQuad;\n/** Alias for `easeInOutQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeInOut = easeInOutQuad;\n\n/** All easings in one bag — useful for demos / pickers. */\nexport const EASINGS = {\n linear,\n easeInQuad, easeOutQuad, easeInOutQuad,\n easeInCubic, easeOutCubic, easeInOutCubic,\n easeInQuart, easeOutQuart, easeInOutQuart,\n easeInQuint, easeOutQuint, easeInOutQuint,\n easeInSine, easeOutSine, easeInOutSine,\n easeInExpo, easeOutExpo, easeInOutExpo,\n easeInCirc, easeOutCirc, easeInOutCirc,\n easeInBack, easeOutBack, easeInOutBack,\n easeInElastic, easeOutElastic, easeInOutElastic,\n easeInBounce, easeOutBounce, easeInOutBounce,\n} as const;\n\n/** The name of one of the built-in easing curves. */\nexport type EasingName = keyof typeof EASINGS;\n\n/** Named spring tunings, from softest to firmest. Springs settle on a target\n * rather than running for a fixed duration, so these are an alternative to an\n * easing curve, not a modifier on one. */\nexport const SPRING_PRESETS: Record<SpringPresetName, SpringPreset> = {\n gentle: { stiffness: 120, damping: 14, mass: 1 },\n wobbly: { stiffness: 180, damping: 12, mass: 1 },\n stiff: { stiffness: 210, damping: 20, mass: 1 },\n slow: { stiffness: 80, damping: 20, mass: 1 },\n};\n","import { EASINGS, type EasingFn, type EasingName } from './easings';\n\n/** Cubic-bezier control points, CSS `cubic-bezier()` order. The curve's two\n * endpoints are implicit at (0,0) and (1,1). */\nexport interface BezierEasing {\n /** `readonly` so an `as const` preset is assignable; nothing ever writes it. */\n bezier: readonly [number, number, number, number];\n}\n\n/** An easing curve as a value: a function, the name of a built-in, or control\n * points. Anything an editor has to name, show or serialize must not be a bare\n * function, which is why the union exists. */\nexport type EasingSpec = EasingFn | EasingName | BezierEasing;\n\nconst NEWTON_ITERATIONS = 8;\nconst NEWTON_MIN_SLOPE = 1e-3;\nconst SUBDIVISION_EPSILON = 1e-7;\nconst SUBDIVISION_MAX = 12;\n\nfunction bezierAt(t: number, a1: number, a2: number): number {\n const c = 3 * a1;\n const b = 3 * (a2 - a1) - c;\n const a = 1 - c - b;\n return ((a * t + b) * t + c) * t;\n}\n\nfunction bezierSlope(t: number, a1: number, a2: number): number {\n const c = 3 * a1;\n const b = 3 * (a2 - a1) - c;\n const a = 1 - c - b;\n return (3 * a * t + 2 * b) * t + c;\n}\n\n/** Solve for the bezier parameter that puts the curve at `x`. Newton-Raphson\n * where the slope allows it, bisection where it does not — the standard\n * approach, and the one browsers use for `cubic-bezier()`. */\nfunction solveForX(x: number, x1: number, x2: number): number {\n let t = x;\n for (let i = 0; i < NEWTON_ITERATIONS; i++) {\n const slope = bezierSlope(t, x1, x2);\n if (slope < NEWTON_MIN_SLOPE) break;\n t -= (bezierAt(t, x1, x2) - x) / slope;\n }\n let lo = 0;\n let hi = 1;\n t = Math.min(1, Math.max(0, t));\n for (let i = 0; i < SUBDIVISION_MAX; i++) {\n const err = bezierAt(t, x1, x2) - x;\n if (Math.abs(err) < SUBDIVISION_EPSILON) return t;\n if (err > 0) hi = t; else lo = t;\n t = (lo + hi) / 2;\n }\n return t;\n}\n\n/** Build the easing curve for four cubic-bezier control points. `x1`/`x2` are\n * clamped to [0,1] — CSS `cubic-bezier()`'s constraint for a monotone x(t),\n * which both `solveForX` root-finders assume. `y1`/`y2` are unclamped: an\n * overshoot easing (back, elastic) needs them outside 0..1. */\nexport function cubicBezierEasing(\n x1: number, y1: number, x2: number, y2: number,\n): EasingFn {\n const cx1 = Math.min(1, Math.max(0, x1));\n const cx2 = Math.min(1, Math.max(0, x2));\n return (t) => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n return bezierAt(solveForX(t, cx1, cx2), y1, y2);\n };\n}\n\n/** Memoized so two equal specs resolve to one function, not a fresh solver per call. */\nconst bezierCache = new Map<string, EasingFn>();\n\nfunction isBezier(spec: EasingSpec): spec is BezierEasing {\n return typeof spec === 'object' && spec !== null && 'bezier' in spec;\n}\n\n/** Resolve a spec to the function that shapes progress. `undefined` is linear. */\nexport function resolveEasing(spec?: EasingSpec): EasingFn {\n if (spec === undefined) return EASINGS.linear;\n if (typeof spec === 'function') return spec;\n if (typeof spec === 'string') {\n const fn = EASINGS[spec];\n if (!fn) throw new Error(`resolveEasing: unknown easing name \"${spec}\"`);\n return fn;\n }\n if (isBezier(spec)) {\n const [x1, y1, x2, y2] = spec.bezier;\n const key = `${x1},${y1},${x2},${y2}`;\n let fn = bezierCache.get(key);\n if (!fn) {\n fn = cubicBezierEasing(x1, y1, x2, y2);\n bezierCache.set(key, fn);\n }\n return fn;\n }\n throw new Error('resolveEasing: unrecognized easing spec');\n}\n"]}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Path data model: the vector-graphics primitive every weasel package uses as
3
+ * its canonical shape. An SVG-style command stream covers lines, polygons,
4
+ * beziers and multi-contour shapes (the inner hole of an "O") under one type.
5
+ *
6
+ * Storage: command codes in a `Uint8Array`, parameters in a `Float32Array`.
7
+ * Each command consumes a fixed number of coords (`PATH_CMD_LENGTHS`); walkers
8
+ * step both arrays in lockstep, which keeps hot loops monomorphic and GC
9
+ * pressure low under heavy edits.
10
+ *
11
+ * `RectPath` is split out at the type level so common-case machinery
12
+ * (selection AABBs, area-select, rect hit-testing) can short-circuit without
13
+ * the polygon kernel. Polymorphic kernels take the `Path` union and dispatch
14
+ * on `kind`.
15
+ */
16
+ /** Fill rule used by polygon path hit-testing and `ctx.fill()`. */
17
+ type PathFillRule = 'nonzero' | 'evenodd';
18
+ /**
19
+ * Polygon path with arbitrary contours and optional bezier segments.
20
+ * Multi-contour: each `M` opens a new subpath; `Z` closes the current one.
21
+ * Open subpaths (no `Z`) render as polylines and don't contribute to fills.
22
+ */
23
+ interface PolygonPath {
24
+ kind: 'polygon';
25
+ commands: Uint8Array;
26
+ coords: Float32Array;
27
+ fillRule: PathFillRule;
28
+ }
29
+ /**
30
+ * Axis-aligned rectangle. Fast path for the (very common) case where the
31
+ * shape is just a rect — preserves O(1) bounds and hit-test, avoids the
32
+ * polygon kernel entirely. Promote to `PolygonPath` only when the shape
33
+ * grows beyond what a rect can express.
34
+ */
35
+ interface RectPath {
36
+ kind: 'rect';
37
+ x: number;
38
+ y: number;
39
+ width: number;
40
+ height: number;
41
+ }
42
+ /** Canonical path shape — either an axis-aligned rect (fast path) or a polygon command stream. */
43
+ type Path = PolygonPath | RectPath;
44
+
45
+ export type { Path as P, RectPath as R, PolygonPath as a, PathFillRule as b };