lineadraw 0.6.0 → 0.8.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../core/src/model/hatchPatterns.ts","../../core/src/model/common.ts","../../core/src/paint/sink.ts","../../core/src/model/builtinPat.ts","../../core/src/export/dxf/exportDxf.ts","../../core/src/model/objects.ts","../../core/src/model/fonts.ts","../../core/src/model/lineTypes.ts","../../core/src/model/builtinLin.ts","../../core/src/geometry/vec2.ts","../../core/src/extensions/paramLists.ts","../../core/src/model/blockDefinition.ts","../../core/src/extensions/evalBlock.ts","../../core/src/geometry/line.ts","../../core/src/transform.ts","../../core/src/extensions/blockDtos.ts","../../core/src/extensions/jsLiteral.ts","../../core/src/model/migrations.ts","../../core/src/extensions/scriptHelpers.ts","../../core/src/extensions/scriptRuntime.ts","../../core/src/model/objectLookup.ts","../../core/src/paint/textMetrics.ts","../../core/src/paint/richText.ts","../../core/src/paint/advanceTables.ts","../../core/src/paint/textMeasurer.ts","../../core/src/paint/dimensionGeometry.ts","../../core/src/paint/textGeometry.ts","../../core/src/paint/tableLayout.ts","../../core/src/export/dxf/aci.ts","../../core/src/export/dxf/codecs.ts","../../core/src/export/dxf/dxfExtras.ts","../../core/src/export/dxf/hatchPattern.ts"],"sourcesContent":["// Named hatch patterns — the AutoCAD .pat line-family model (Tier 2 of\n// docs/hatch-patterns.md). A pattern is N families of parallel, optionally\n// dashed lines. Painting iterates the families and clips each to the boundary\n// loops (computeHatchFamily, ../paint/sink); DXF export maps the curated names\n// 1:1 onto the standard predefined HATCH patterns.\n\nimport { z } from \"zod\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { Vec2Schema } from \"./common\";\nimport { computeHatchFamily } from \"../paint/sink\";\nimport { BUILTIN_PAT } from \"./builtinPat\";\n\n/**\n * One family of parallel lines, in the pattern's own frame (before the fill's\n * rotation/scale). Mirrors an acad .pat definition line\n * `angle, x-origin, y-origin, delta-x, delta-y [, dash…]`:\n * - `angle` radians CCW,\n * - `origin` base point (mm),\n * - `deltaX` shift ALONG the line between successive lines — only affects dash\n * phase, ignored for solid families,\n * - `deltaY` PERPENDICULAR spacing between successive lines (mm, > 0),\n * - `dashesMm` dash cycle along the line: >0 pen-down, <0 gap, 0 dot; omitted\n * means a solid line.\n */\nexport interface PatternLine {\n angle: number;\n origin: Vec2;\n deltaX: number;\n deltaY: number;\n dashesMm?: number[];\n}\n\nexport interface HatchPattern {\n name: string;\n /** Human description from the .pat header (for UI/tooltip). */\n description?: string;\n lines: PatternLine[];\n}\n\n/**\n * Parse acad .pat text into patterns. `unitScale` converts the file's length\n * units to world mm: inch-based .pat files need 25.4 (the default) while the\n * ISO-scaled builtin.pat is already mm (pass 1). Either way ANSI31 lands\n * at the 3.175 mm / scale-1 spacing the DXF layer assumes (ANSI31_BASE_SPACING).\n * Comment (`;`) and blank lines are skipped.\n */\nexport const parsePatternDefinitions = (\n text: string,\n unitScale = 25.4,\n): HatchPattern[] => {\n const DEG2RAD = Math.PI / 180;\n const patterns: HatchPattern[] = [];\n let current: HatchPattern | null = null;\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith(\";\")) continue;\n if (line.startsWith(\"*\")) {\n const [name, ...desc] = line.slice(1).split(\",\");\n current = { name: name.trim(), lines: [] };\n const d = desc.join(\",\").trim();\n if (d) current.description = d;\n patterns.push(current);\n continue;\n }\n if (!current) continue;\n const n = line.split(\",\").map((s) => Number(s.trim()));\n if (n.length < 5 || n.some((v) => Number.isNaN(v))) continue;\n const [angle, x, y, dx, dy, ...dashes] = n;\n current.lines.push({\n angle: angle * DEG2RAD,\n origin: { x: x * unitScale, y: y * unitScale },\n deltaX: dx * unitScale,\n deltaY: dy * unitScale,\n dashesMm: dashes.length ? dashes.map((v) => v * unitScale) : undefined,\n });\n }\n return patterns.filter((p) => p.lines.length > 0);\n};\n\n// Built-in library = the embedded catalogue (builtin.pat, lengths already in\n// mm). Names match the standard DXF predefined patterns, so DXF export/import\n// is a direct name mapping. `SOLID` is filtered defensively — a solid fill is\n// its own `fill.kind`, not a line-family pattern.\nconst BUILT_IN_PATTERNS: HatchPattern[] = parsePatternDefinitions(\n BUILTIN_PAT,\n 1,\n).filter((p) => p.name.toUpperCase() !== \"SOLID\");\n\n// Normalize for lookup: uppercase and fold the punctuation that drifts between\n// the .pat names, the DXF predefined enum, and AutoCAD output (hyphens, dots,\n// and spaces all become `_`), so `AR-CONC`, `AR_CONC`, and `ar conc` resolve to\n// the same pattern. The .pat names are collision-free under this fold.\nconst normalizeName = (name: string): string =>\n name\n .trim()\n .toUpperCase()\n .replace(/[\\s.-]+/g, \"_\");\n\nconst BUILT_IN_BY_NAME = new Map(\n BUILT_IN_PATTERNS.map((p) => [normalizeName(p.name), p]),\n);\n\n/** Ordered built-in pattern names (drives the property-panel dropdown). */\nexport const HATCH_PATTERN_NAMES: string[] = BUILT_IN_PATTERNS.map(\n (p) => p.name,\n);\n\n/** Default pattern name for a new pattern fill. */\nexport const DEFAULT_HATCH_PATTERN = \"ANSI31\";\n\n/** Resolve a fill pattern name to its definition (case- and punctuation-insensitive). */\nexport const getHatchPattern = (name: string): HatchPattern | undefined =>\n BUILT_IN_BY_NAME.get(normalizeName(name));\n\n/**\n * AutoCAD MaxHatch-style ceiling: a hatch whose pattern would emit more\n * segments than this paints as a translucent solid instead (paintHatch).\n * Denser than this is sub-pixel/sub-print-resolution anyway — it reads as\n * tone, and generating millions of segments stalls rendering and export.\n */\nexport const MAX_HATCH_SEGMENTS = 100_000;\n\n/**\n * Cheap upper bound on the segment count computePatternGeometry would emit,\n * from the rings' bounding-box diagonal (no generation, no clipping). Used\n * to decide the solid fallback BEFORE paying for the real geometry.\n */\nexport const estimatePatternSegments = (\n rings: Vec2[][],\n pattern: HatchPattern,\n scale: number,\n): number => {\n if (scale <= 0) return 0;\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const ring of rings)\n for (const p of ring) {\n if (p.x < minX) minX = p.x;\n if (p.x > maxX) maxX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.y > maxY) maxY = p.y;\n }\n if (minX > maxX) return 0;\n const diag = Math.hypot(maxX - minX, maxY - minY);\n let count = 0;\n for (const fam of pattern.lines) {\n const perp = Math.abs(fam.deltaY) * scale;\n if (perp <= 1e-9) continue;\n const lines = diag / perp + 1;\n const period =\n (fam.dashesMm?.reduce((a, b) => a + Math.abs(b), 0) ?? 0) * scale;\n const perLine = period > 1e-9 ? diag / period + 1 : 1;\n count += lines * perLine;\n }\n return count;\n};\n\n/**\n * Every clipped (and dashed) segment for a pattern fill: iterate the families,\n * fold the fill's rotation + world-mm scale into each, and clip via\n * computeHatchFamily. Pure geometry — canvas, PDF, and SVG stroke the same\n * segments.\n */\nexport const computePatternGeometry = (\n rings: Vec2[][],\n pattern: HatchPattern,\n angle: number,\n scale: number,\n /** World anchor of the pattern frame (default: the drawing origin). */\n origin: Vec2 = { x: 0, y: 0 },\n): { a: Vec2; b: Vec2 }[] => {\n const out: { a: Vec2; b: Vec2 }[] = [];\n if (scale <= 0) return out;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n for (const fam of pattern.lines) {\n if (Math.abs(fam.deltaY) * scale <= 1e-9) continue;\n // Map the family's pattern-space origin into world: scale, then rotate by\n // the fill angle (deltas rotate with `angle + fam.angle` inside the family).\n const ox = fam.origin.x * scale;\n const oy = fam.origin.y * scale;\n // No spread: a large boundary with fine spacing yields 100k+ segments,\n // and push(...segs) overflows the call stack (one argument per segment).\n const segs = computeHatchFamily(rings, {\n angle: angle + fam.angle,\n origin: { x: ox * c - oy * s + origin.x, y: ox * s + oy * c + origin.y },\n deltaAlong: fam.deltaX * scale,\n deltaPerp: fam.deltaY * scale,\n dashesMm: fam.dashesMm?.map((d) => d * scale),\n });\n for (const seg of segs) out.push(seg);\n }\n return out;\n};\n\n// ---- document-defined hatch patterns ----------------------------------------\n//\n// A document may carry its own named patterns (`document.hatchPatterns`):\n// the definition lines a DXF HATCH embeds for a non-predefined pattern, or a\n// user-imported .pat. Same shape as the catalogue's HatchPattern (mm);\n// fills keep referencing by NAME. Resolution: document first (shadows a\n// catalogue name), then the built-in catalogue.\n\nexport const PatternLineSchema = z.object({\n /** Radians CCW, in the pattern's own frame. */\n angle: z.number(),\n /** Base point, mm. */\n origin: Vec2Schema,\n /** Shift ALONG the line between successive lines (dash phase), mm. */\n deltaX: z.number(),\n /** Perpendicular spacing between successive lines, mm. */\n deltaY: z.number().positive(),\n /** Dash cycle along the line: >0 dash, <0 gap, 0 dot; absent = solid. */\n dashesMm: z.array(z.number()).optional(),\n});\n\nexport const HatchPatternSchema = z.object({\n /** Stored on fills as `fill.name`; case-insensitive, unique per document. */\n name: z.string().min(1),\n description: z.string().optional(),\n lines: z.array(PatternLineSchema).min(1),\n});\nexport type DocumentHatchPattern = z.infer<typeof HatchPatternSchema>;\n\n/** The key two pattern names compare by (case- and separator-insensitive). */\nexport const hatchPatternKey = (name: string): string => normalizeName(name);\n\n/** Name → pattern: the document's own patterns first, then the built-in\n * catalogue; undefined = unknown (the fill paints as a single line family). */\nexport const resolveHatchPattern = (\n name: string | undefined,\n hatchPatterns?: readonly DocumentHatchPattern[],\n): HatchPattern | undefined => {\n if (!name) return undefined;\n if (hatchPatterns && hatchPatterns.length > 0) {\n const key = normalizeName(name);\n const own = hatchPatterns.find((p) => normalizeName(p.name) === key);\n if (own) return own;\n }\n return getHatchPattern(name);\n};\n\n/** Hatches (every space) whose pattern fill is `name`. */\nexport const hatchPatternUsers = (\n doc: {\n objects: readonly {\n type: string;\n fill?: { kind: string; name?: string };\n }[];\n layouts: readonly {\n objects: readonly {\n type: string;\n fill?: { kind: string; name?: string };\n }[];\n }[];\n },\n name: string,\n): number => {\n const key = normalizeName(name);\n const uses = (o: { type: string; fill?: { kind: string; name?: string } }) =>\n o.type === \"hatch\" &&\n o.fill?.kind === \"pattern\" &&\n o.fill.name !== undefined &&\n normalizeName(o.fill.name) === key;\n let n = doc.objects.filter(uses).length;\n for (const l of doc.layouts) n += l.objects.filter(uses).length;\n return n;\n};\n\n/** `.pat` text (mm) for document patterns: `*NAME,description` then one\n * `angle°, x, y, dx, dy[, dashes…]` line per family. */\nexport const formatPatDefinitions = (\n patterns: readonly DocumentHatchPattern[],\n): string =>\n patterns\n .map(\n (p) =>\n `*${p.name},${p.description ?? \"\"}\\n` +\n p.lines\n .map((l) =>\n [\n (l.angle * 180) / Math.PI,\n l.origin.x,\n l.origin.y,\n l.deltaX,\n l.deltaY,\n ...(l.dashesMm ?? []),\n ]\n .map((v) => +v.toFixed(6))\n .join(\",\"),\n )\n .join(\"\\n\") +\n \"\\n\",\n )\n .join(\"\");\n","import { z } from \"zod\";\n\n/**\n * World units are millimeters, Y-up. Angles in radians, CCW.\n * Accepts [x, y] as input for script ergonomics (block scripts); always\n * parses to {x, y}.\n */\nexport const Vec2Schema = z.preprocess(\n (v) => (Array.isArray(v) && v.length >= 2 ? { x: v[0], y: v[1] } : v),\n z.object({ x: z.number(), y: z.number() }),\n);\nexport type Vec2 = z.infer<typeof Vec2Schema>;\n\n/** Hex color like #rrggbb. */\nexport const ColorSchema = z.string().regex(/^#[0-9a-fA-F]{6}$/);\n\n/**\n * Properties shared by every model object.\n * color/lineWidth/lineType undefined = inherit from the layer (\"byLayer\").\n * lineWidth is a paper-space lineweight in mm (CAD convention).\n */\nexport const ObjectBaseSchema = z.object({\n id: z.string(),\n layerId: z.string(),\n color: ColorSchema.optional(),\n lineType: z.string().optional(),\n /** Extra dash-pattern multiplier on top of the width-proportional scale\n * (CAD CELTSCALE). Dash patterns are defined per 1 mm of line width and\n * scale by the resolved lineweight; this multiplies that. undefined = 1. */\n lineTypeScale: z.number().positive().optional(),\n lineWidth: z.number().positive().optional(),\n /** Paint opacity 0..1 across canvas/SVG/PDF. undefined = opaque. */\n opacity: z.number().min(0).max(1).optional(),\n});\nexport type ObjectBase = z.infer<typeof ObjectBaseSchema>;\n","// GeometrySink — the abstract drawing surface every object painter targets.\n// Painters are written ONCE against this interface and retargeted to:\n// - CanvasSink (screen rendering, src/canvas/canvasSink.ts)\n// - PdfSink (vector PDF export, Phase 4)\n// - DXF entity writers (dimension/leader explosion, Phase 5)\n\nimport type { Vec2 } from \"../geometry/vec2\";\n\nexport interface StrokeStyle {\n color: string;\n /**\n * Lineweight in OUTPUT units (paper mm). Never scaled by the world\n * transform — each sink decides how to realize it (canvas clamps to a\n * screen-px range, PDF uses it verbatim).\n */\n widthMm: number;\n dashMm?: number[];\n /** Paint opacity 0..1 (undefined = opaque). */\n opacity?: number;\n}\n\nexport interface FillStyle {\n color: string;\n /** Paint opacity 0..1 (undefined = opaque). */\n opacity?: number;\n /** Gradient fill (undefined = flat fill), in world/sheet coordinates —\n * the same space as the path. linear: `color` at `from` → `color2` at\n * `to`. radial: `color` at `from` (the center) → `color2` at radius\n * |to − from|. */\n gradient?: {\n shape: \"linear\" | \"radial\";\n from: Vec2;\n to: Vec2;\n color2: string;\n };\n}\n\nexport interface TextSpec {\n text: string;\n anchor: Vec2;\n /** Cap height in current drawing units (world mm before transforms). */\n heightMm: number;\n /** Radians CCW. */\n rotation: number;\n hAlign: \"left\" | \"center\" | \"right\";\n vAlign: \"bottom\" | \"center\" | \"top\";\n color: string;\n /** Font id (model/fonts.ts); absent = default font. */\n font?: string;\n /** Horizontal glyph scale (AutoCAD width factor); absent = 1. */\n widthFactor?: number;\n /** Paint opacity 0..1 (undefined = opaque). */\n opacity?: number;\n}\n\n/** A placed raster image (PNG/JPEG data URL). */\nexport interface ImageSpec {\n /** data: URL with the encoded pixels. */\n data: string;\n /** Bottom-left corner in current drawing units (world/sheet mm). */\n origin: Vec2;\n widthMm: number;\n heightMm: number;\n /** Radians CCW about `origin`. */\n rotation: number;\n /** 0..1. */\n opacity: number;\n}\n\n/** Affine transform [a, b, c, d, e, f]: x' = a·x + c·y + e, y' = b·x + d·y + f. */\nexport type Mat2x3 = [number, number, number, number, number, number];\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface GeometrySink {\n beginPath(): void;\n moveTo(p: Vec2): void;\n lineTo(p: Vec2): void;\n bezierTo(c1: Vec2, c2: Vec2, end: Vec2): void;\n /** Circular arc from startAngle to endAngle; ccw = increasing angle (world CCW). */\n arc(\n center: Vec2,\n r: number,\n startAngle: number,\n endAngle: number,\n ccw: boolean,\n ): void;\n ellipse(\n center: Vec2,\n rx: number,\n ry: number,\n rotation: number,\n startAngle: number,\n endAngle: number,\n ): void;\n closePath(): void;\n stroke(s: StrokeStyle): void;\n fill(f: FillStyle): void;\n text(t: TextSpec): void;\n /** Draw a raster image (decoding is the sink's concern). */\n image(i: ImageSpec): void;\n /** Advance width; implementations must honor font + widthFactor. */\n measureText(\n text: string,\n heightMm: number,\n font?: string,\n widthFactor?: number,\n ): { width: number };\n pushTransform(m: Mat2x3): void;\n popTransform(): void;\n pushClipRect(r: Rect): void;\n popClip(): void;\n /**\n * Optional structure hooks bracketing ONE model object's output. Sinks\n * with structured output (SVG) group + annotate the elements; raster/PDF\n * sinks omit them. Paint loops call them via optional chaining.\n */\n beginObject?(id: string, layer?: string): void;\n endObject?(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix helpers\n// ---------------------------------------------------------------------------\n\nexport const matIdentity: Mat2x3 = [1, 0, 0, 1, 0, 0];\n\nexport const matMultiply = (m: Mat2x3, n: Mat2x3): Mat2x3 => [\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\nexport const matApply = (m: Mat2x3, p: Vec2): Vec2 => ({\n x: m[0] * p.x + m[2] * p.y + m[4],\n y: m[1] * p.x + m[3] * p.y + m[5],\n});\n\n// ---------------------------------------------------------------------------\n// Curve → bezier decomposition (used by non-canvas sinks)\n// ---------------------------------------------------------------------------\n\nexport interface CubicBezier {\n start: Vec2;\n c1: Vec2;\n c2: Vec2;\n end: Vec2;\n}\n\n/**\n * Signed sweep from startAngle to endAngle in the requested direction —\n * positive for ccw (increasing angle), negative for cw. Angles come from\n * atan2 ∈ (−π, π], so a raw `end − start` flips arcs that cross the ±π seam;\n * this normalizes into (0, 2π] / [−2π, 0), treating equal angles as a full\n * circle.\n */\nexport const signedArcSweep = (\n startAngle: number,\n endAngle: number,\n ccw: boolean,\n): number => {\n const TAU = Math.PI * 2;\n let sweep = ccw\n ? (((endAngle - startAngle) % TAU) + TAU) % TAU\n : -((((startAngle - endAngle) % TAU) + TAU) % TAU);\n if (sweep === 0) sweep = ccw ? TAU : -TAU;\n return sweep;\n};\n\n/**\n * Decompose a circular arc (CCW from startAngle over `sweep` > 0) into cubic\n * beziers with ≤90° segments (standard k = 4/3·tan(θ/4) approximation).\n */\nexport const arcToBeziers = (\n center: Vec2,\n r: number,\n startAngle: number,\n sweep: number,\n): CubicBezier[] => {\n const n = Math.max(1, Math.ceil(Math.abs(sweep) / (Math.PI / 2)));\n const step = sweep / n;\n const k = (4 / 3) * Math.tan(step / 4);\n const result: CubicBezier[] = [];\n for (let i = 0; i < n; i++) {\n const a0 = startAngle + step * i;\n const a1 = a0 + step;\n const p0 = {\n x: center.x + r * Math.cos(a0),\n y: center.y + r * Math.sin(a0),\n };\n const p1 = {\n x: center.x + r * Math.cos(a1),\n y: center.y + r * Math.sin(a1),\n };\n result.push({\n start: p0,\n c1: { x: p0.x - r * k * Math.sin(a0), y: p0.y + r * k * Math.cos(a0) },\n c2: { x: p1.x + r * k * Math.sin(a1), y: p1.y - r * k * Math.cos(a1) },\n end: p1,\n });\n }\n return result;\n};\n\n// ---------------------------------------------------------------------------\n// Hatch pattern generation (shared by canvas, PDF, and DXF outputs)\n// ---------------------------------------------------------------------------\n\n/** v-extent (perpendicular range) of the rings, or null if empty. */\nconst vExtent = (\n rings: Vec2[][],\n v: Vec2,\n): { min: number; max: number } | null => {\n let min = Infinity;\n let max = -Infinity;\n for (const ring of rings) {\n for (const p of ring) {\n const dv = p.x * v.x + p.y * v.y;\n if (dv < min) min = dv;\n if (dv > max) max = dv;\n }\n }\n return Number.isFinite(min) ? { min, max } : null;\n};\n\n/**\n * u-coordinates (sorted) where the scanline at perpendicular offset `off`\n * crosses the ring edges. Consecutive pairs bound the even-odd interior.\n */\nconst scanlineCrossings = (\n rings: Vec2[][],\n u: Vec2,\n v: Vec2,\n off: number,\n): number[] => {\n const crossings: number[] = [];\n for (const ring of rings) {\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const a = ring[j];\n const b = ring[i];\n const va = a.x * v.x + a.y * v.y;\n const vb = b.x * v.x + b.y * v.y;\n // Half-open interval avoids double-counting shared vertices.\n if (va < off === vb < off) continue;\n const t = (off - va) / (vb - va);\n const px = a.x + (b.x - a.x) * t;\n const py = a.y + (b.y - a.y) * t;\n crossings.push(px * u.x + py * u.y);\n }\n }\n crossings.sort((x, y) => x - y);\n return crossings;\n};\n\n/**\n * Parallel pattern lines at `angle` spaced `spacing` apart (anchored at the\n * world origin), clipped to the even-odd interior of the tessellated rings.\n * Pure geometry — every output target strokes the same segments. This is the\n * simple single-family \"lines\" fill; pattern fills use computeHatchFamily.\n */\nexport const computeHatchLines = (\n rings: Vec2[][],\n angle: number,\n spacing: number,\n): { a: Vec2; b: Vec2 }[] =>\n spacing <= 0\n ? []\n : computeHatchFamily(rings, {\n angle,\n origin: { x: 0, y: 0 },\n deltaAlong: 0,\n deltaPerp: spacing,\n });\n\nexport interface HatchLineFamily {\n /** Line direction, radians CCW (the fill's rotation already folded in). */\n angle: number;\n /**\n * Anchor point of the family in world coords (the .pat origin, with the\n * fill's rotation + scale already folded in). Its perpendicular component\n * phases the parallel lines; its along-line component phases the dashes.\n */\n origin: Vec2;\n /**\n * Signed shift ALONG the line between successive lines (the .pat delta-x,\n * scaled). Only shifts dash phase per line — no effect on solid families.\n */\n deltaAlong: number;\n /**\n * Signed PERPENDICULAR step between successive lines (the .pat delta-y,\n * scaled). Must be non-zero.\n */\n deltaPerp: number;\n /**\n * Along-line dash cycle, world mm: >0 pen-down, <0 gap, 0 dot. Solid line\n * when omitted/empty. Already scaled by the caller.\n */\n dashesMm?: number[];\n}\n\n/** A tiny mark stroked for a zero-length (dot) dash so it stays visible. */\nconst DOT_LENGTH_MM = 0.35;\n\n/**\n * Split a solid segment (a→b, in the +`u` direction) into its drawn dash\n * sub-segments. The dash cycle's phase-zero sits at along-coordinate `along0`\n * (the family line's anchor), so dashes stay in register line-to-line.\n */\nconst splitByDashes = (\n a: Vec2,\n b: Vec2,\n u: Vec2,\n dashes: number[],\n along0: number,\n out: { a: Vec2; b: Vec2 }[],\n): void => {\n const len = (b.x - a.x) * u.x + (b.y - a.y) * u.y;\n if (len <= 1e-9) return;\n const cycle = dashes.reduce((s, d) => s + Math.abs(d), 0);\n if (cycle <= 1e-9) {\n out.push({ a, b });\n return;\n }\n const pt = (d: number): Vec2 => ({ x: a.x + u.x * d, y: a.y + u.y * d });\n // Phase of `a` within the cycle, measured from the family anchor `along0`.\n const base = a.x * u.x + a.y * u.y - along0;\n let phase = ((base % cycle) + cycle) % cycle;\n let idx = 0;\n for (; idx < dashes.length; idx++) {\n const w = Math.abs(dashes[idx]);\n if (phase < w || w <= 1e-9) break;\n phase -= w;\n }\n if (idx >= dashes.length) {\n idx = 0;\n phase = 0;\n }\n let remaining = Math.max(0, Math.abs(dashes[idx]) - phase);\n let pos = 0;\n let guard = 0;\n while (pos < len - 1e-9 && guard++ < 100000) {\n const w = Math.abs(dashes[idx]);\n const draw = dashes[idx] >= 0;\n if (w <= 1e-9) {\n // Dot: emit a short mark centered on `pos`, then advance to the next\n // element (the following gap) without consuming length.\n if (draw) {\n const s0 = Math.max(0, pos - DOT_LENGTH_MM / 2);\n const s1 = Math.min(len, pos + DOT_LENGTH_MM / 2);\n if (s1 > s0) out.push({ a: pt(s0), b: pt(s1) });\n }\n idx = (idx + 1) % dashes.length;\n remaining = Math.abs(dashes[idx]);\n continue;\n }\n const step = Math.min(remaining, len - pos);\n if (draw) out.push({ a: pt(pos), b: pt(pos + step) });\n pos += step;\n remaining -= step;\n if (remaining <= 1e-9) {\n idx = (idx + 1) % dashes.length;\n remaining = Math.abs(dashes[idx]);\n }\n }\n};\n\n/**\n * One family of a hatch pattern: parallel (optionally dashed) lines stepped by\n * `(deltaAlong, deltaPerp)` from `origin`, clipped to the even-odd interior of\n * the rings. Unlike computeHatchLines this honors the family origin (line\n * phase) and delta-x (per-line dash phase), which is what makes multi-family\n * patterns (ANSI32's paired lines, brick/earth offsets) render correctly.\n */\nexport const computeHatchFamily = (\n rings: Vec2[][],\n family: HatchLineFamily,\n): { a: Vec2; b: Vec2 }[] => {\n const { deltaPerp } = family;\n if (rings.length === 0 || Math.abs(deltaPerp) <= 1e-9) return [];\n const u = { x: Math.cos(family.angle), y: Math.sin(family.angle) };\n const v = { x: -u.y, y: u.x };\n const ext = vExtent(rings, v);\n if (!ext) return [];\n\n const oV = family.origin.x * v.x + family.origin.y * v.y;\n const oU = family.origin.x * u.x + family.origin.y * u.y;\n // Contiguous integer line indices whose perpendicular offset (oV + i·dPerp)\n // lands in [min, max] — the min/max form handles either sign of deltaPerp.\n const iA = (ext.min - oV) / deltaPerp;\n const iB = (ext.max - oV) / deltaPerp;\n const iLo = Math.ceil(Math.min(iA, iB));\n const iHi = Math.floor(Math.max(iA, iB));\n const dashes =\n family.dashesMm && family.dashesMm.length ? family.dashesMm : null;\n\n const out: { a: Vec2; b: Vec2 }[] = [];\n for (let i = iLo; i <= iHi; i++) {\n const off = oV + i * deltaPerp;\n const along0 = oU + i * family.deltaAlong; // dash-phase anchor for this line\n const crossings = scanlineCrossings(rings, u, v, off);\n for (let k = 0; k + 1 < crossings.length; k += 2) {\n const c0 = crossings[k];\n const c1 = crossings[k + 1];\n if (c1 - c0 < 1e-9) continue;\n const a = { x: u.x * c0 + v.x * off, y: u.y * c0 + v.y * off };\n const b = { x: u.x * c1 + v.x * off, y: u.y * c1 + v.y * off };\n if (dashes) splitByDashes(a, b, u, dashes, along0, out);\n else out.push({ a, b });\n }\n }\n return out;\n};\n\n/** Same decomposition for an elliptical arc (rx/ry with axis rotation). */\nexport const ellipseArcToBeziers = (\n center: Vec2,\n rx: number,\n ry: number,\n rotation: number,\n startAngle: number,\n sweep: number,\n): CubicBezier[] => {\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n const map = (p: Vec2): Vec2 => ({\n x: center.x + p.x * cosR - p.y * sinR,\n y: center.y + p.x * sinR + p.y * cosR,\n });\n return arcToBeziers({ x: 0, y: 0 }, 1, startAngle, sweep).map((b) => ({\n start: map({ x: b.start.x * rx, y: b.start.y * ry }),\n c1: map({ x: b.c1.x * rx, y: b.c1.y * ry }),\n c2: map({ x: b.c2.x * rx, y: b.c2.y * ry }),\n end: map({ x: b.end.x * rx, y: b.end.y * ry }),\n }));\n};\n","// GENERATED — do not edit. Mirror of builtin.pat (the built-in hatch\n// pattern library, lengths in mm). Regenerate with:\n// npm run gen:patterns -w @lineadraw/core\n\nexport const BUILTIN_PAT = `;; Linea built-in hatch pattern library.\n;;\n;; Format: .pat syntax - a \\`*NAME,description\\` header followed by one line\n;; family per row: \\`angle, x-origin, y-origin, delta-x, delta-y [, dash...]\\`\n;; (angle in degrees CCW; delta-x shifts successive lines along their own\n;; direction - dash phase - and delta-y is the perpendicular spacing;\n;; dashes: >0 pen-down, <0 gap, 0 dot). All lengths are millimeters (ISO\n;; scaling).\n;;\n;; The pattern geometry is functional interchange data, kept name- and\n;; value-compatible with the predefined DXF HATCH patterns other CAD\n;; applications resolve - ANSI/ISO/JIS/GOST section conventions plus common\n;; architectural textures. Descriptions and organization are Linea's\n;; own. There is no SOLID entry: solid fill is its own fill kind, not a\n;; line-family pattern.\n;;\n;; After editing, regenerate the embedded TS mirror:\n;; npm run gen:patterns -w @lineadraw/core\n;;\n\n;; Material and texture patterns.\n\n*ANGLE,Steel angle framing\n0, 0, 0, 0, 6.985, 5.08, -1.905\n90, 0, 0, 0, 6.985, 5.08, -1.905\n*ANSI31,Cast iron; general section (ANSI)\n45, 0, 0, 0, 3.175\n*ANSI32,Steel (ANSI)\n45, 0, 0, 0, 9.525\n45, 4.49013, 0, 0, 9.525\n*ANSI33,Bronze, brass, copper (ANSI)\n45, 0, 0, 0, 6.35\n45, 4.49013, 0, 0, 6.35, 3.175, -1.5875\n*ANSI34,Plastic, rubber (ANSI)\n45, 0, 0, 0, 19.05\n45, 4.49013, 0, 0, 19.05\n45, 8.98026, 0, 0, 19.05\n45, 13.4704, 0, 0, 19.05\n*ANSI35,Fire brick, refractory (ANSI)\n45, 0, 0, 0, 6.35\n45, 4.49013, 0, 0, 6.35, 7.9375, -1.5875, 0, -1.5875\n*ANSI36,Marble, slate, glass (ANSI)\n45, 0, 0, 5.55625, 3.175, 7.9375, -1.5875, 0, -1.5875\n*ANSI37,Lead, zinc, insulation (ANSI)\n45, 0, 0, 0, 3.175\n135, 0, 0, 0, 3.175\n*ANSI38,Aluminum (ANSI)\n45, 0, 0, 0, 3.175\n135, 0, 0, 6.35, 3.175, 7.9375, -4.7625\n*AR-B816,Block wall 8x16, running bond\n0, 0, 0, 0, 203.2\n90, 0, 0, 203.2, 203.2, 203.2, -203.2\n*AR-B816C,Block wall 8x16 with mortar joints\n0, 0, 0, 203.2, 203.2, 396.875, -9.525\n0, -203.2, 9.525, 203.2, 203.2, 396.875, -9.525\n90, 0, 0, 203.2, 203.2, -212.725, 193.675\n90, -9.525, 0, 203.2, 203.2, -212.725, 193.675\n*AR-B88,Block wall 8x8, running bond\n0, 0, 0, 0, 203.2\n90, 0, 0, 203.2, 101.6, 203.2, -203.2\n*AR-BRELM,Brick wall, English bond, mortar joints\n0, 0, 0, 0, 135.484, 193.675, -9.525\n0, 0, 57.15, 0, 135.484, 193.675, -9.525\n0, 50.8, 67.7418, 0, 135.484, 92.075, -9.525\n0, 50.8, 124.892, 0, 135.484, 92.075, -9.525\n90, 0, 0, 0, 203.2, 57.15, -78.334\n90, -9.525, 0, 0, 203.2, 57.15, -78.334\n90, 50.8, 67.7418, 0, 101.6, 57.15, -78.334\n90, 41.275, 67.7418, 0, 101.6, 57.15, -78.334\n*AR-BRSTD,Brick wall, running bond\n0, 0, 0, 0, 67.7418\n90, 0, 0, 67.7418, 101.6, 67.7418, -67.7418\n*AR-CONC,Concrete, random aggregate\n50, 0, 0, 104.896, -149.807, 19.05, -209.55\n355, 0, 0, -51.76101082,187.25814969, 15.24, -167.64058417\n100.4514447,15.182007,-1.3282535,145.5569059,-176.270089,16.1900088,-178.0902446\n46.1842, 0, 50.8, 157.343, -224.71, 28.575, -314.325\n96.63555761,22.5899,47.2965,218.33577212,-264.40480444,24.28502314,-267.13560816\n351.18415117,0,50.8,196.67912063,280.88740361,22.85996707,-251.45973192\n21, 25.4, 38.1, 104.89565868, -149.80652586, 19.05, -209.55\n326, 25.4, 38.1, -51.7604, 187.258, 15.24, -167.64\n71.451445,38.0345326,29.5779001,145.5567546,-176.2700748,16.1900088,-178.0899376\n37.5, 0, 0, 53.9242, 65.2018, 0, -165.608, 0, -170.18, 0, -168.275\n7.5, 0, 0, 79.3242, 90.6018, 0, -97.028, 0, -161.798, 0, -64.135\n-32.5, -56.642, 0, 117.434, 68.0212, 0, -63.5, 0, -198.12, 0, -262.89\n-42.5, -82.042, 0, 92.0344, 118.821, 0, -82.55, 0, -131.572, 0, -186.69\n*AR-HBONE,Brick paving, herringbone at 45 deg\n45, 0, 0, 101.6, 101.6, 304.8, -101.6\n135, 71.842, 71.842, 101.6, -101.6, 304.8, -101.6\n*AR-PARQ1,Parquet flooring, basket weave\n90, 0, 0, 304.8, 304.8, 304.8, -304.8\n90, 50.8, 0, 304.8, 304.8, 304.8, -304.8\n90, 101.6, 0, 304.8, 304.8, 304.8, -304.8\n90, 152.4, 0, 304.8, 304.8, 304.8, -304.8\n90, 203.2, 0, 304.8, 304.8, 304.8, -304.8\n90, 254, 0, 304.8, 304.8, 304.8, -304.8\n90, 304.8, 0, 304.8, 304.8, 304.8, -304.8\n0, 0, 304.8, 304.8, -304.8, 304.8, -304.8\n0, 0, 355.6, 304.8, -304.8, 304.8, -304.8\n0, 0, 406.4, 304.8, -304.8, 304.8, -304.8\n0, 0, 457.2, 304.8, -304.8, 304.8, -304.8\n0, 0, 508, 304.8, -304.8, 304.8, -304.8\n0, 0, 558.8, 304.8, -304.8, 304.8, -304.8\n0, 0, 609.6, 304.8, -304.8, 304.8, -304.8\n*AR-RROOF,Roof shingles\n0, 0, 0, 55.88, 25.4, 381, -50.8, 127, -25.4\n0, 33.782, 12.7, -25.4, 33.782, 76.2, -8.382, 152.4, -19.05\n0, 12.7, 21.59, 132.08, 17.018, 203.2, -35.56, 101.6, -25.4\n*AR-RSHKE,Roof wood shakes\n0, 0, 0, 647.7, 304.8, 152.4, -127, 177.8, -76.2, 228.6, -101.6\n0, 152.4, 12.7, 647.7, 304.8, 127, -482.6, 101.6, -152.4\n0, 457.2, -19.05, 647.7, 304.8, 76.2, -787.4\n90, 0, 0, 304.8, 215.9, 292.1, -927.1\n90, 152.4, 0, 304.8, 215.9, 285.75, -933.45\n90, 279.4, 0, 304.8, 215.9, 266.7, -952.5\n90, 457.2, -19.05, 304.8, 215.9, 292.1, -927.1\n90, 533.4, -19.05, 304.8, 215.9, 292.1, -927.1\n90, 762, 0, 304.8, 215.9, 279.4, -939.8\n*AR-SAND,Sand stipple\n37.5, 0, 0, 28.5242, 39.8018, 0, -38.608, 0, -43.18, 0, -41.275\n7.5, 0, 0, 53.9242, 65.2018, 0, -20.828, 0, -34.798, 0, -13.335\n-32.5, -31.242, 0, 66.6344, 42.6212, 0, -12.7, 0, -45.72, 0, -59.69\n-42.5, -31.242, 0, 41.2344, 68.0212, 0, -6.35, 0, -29.972, 0, -34.29\n*BOX,Interlocking box weave\n90, 0, 0, 0, 25.4\n90, 6.35, 0, 0, 25.4\n0, 0, 0, 0, 25.4, -6.35, 6.35\n0, 0, 6.35, 0, 25.4, -6.35, 6.35\n0, 0, 12.7, 0, 25.4, 6.35, -6.35\n0, 0, 19.05, 0, 25.4, 6.35, -6.35\n90, 12.7, 0, 0, 25.4, 6.35, -6.35\n90, 19.05, 0, 0, 25.4, 6.35, -6.35\n*BRASS,Brass\n0, 0, 0, 0, 6.35\n0, 0, 3.175, 0, 6.35, 3.175, -1.5875\n*BRICK,Brick coursing\n0, 0, 0, 0, 6.35\n90, 0, 0, 0, 12.7, 6.35, -6.35\n90, 6.35, 0, 0, 12.7, -6.35, 6.35\n*BRSTONE,Brick and stone mix\n0, 0, 0, 0, 8.382\n90, 22.86, 0, 8.382, 12.7, 8.382, -8.382\n90, 20.32, 0, 8.382, 12.7, 8.382, -8.382\n0, 22.86, 1.397, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 2.794, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 4.191, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 5.588, 12.7, 8.382, -22.86, 2.54\n0, 22.86, 6.985, 12.7, 8.382, -22.86, 2.54\n*CLAY,Clay\n0, 0, 0, 0, 4.7625\n0, 0, 0.79375, 0, 4.7625\n0, 0, 1.5875, 0, 4.7625\n0, 0, 3.175, 0, 4.7625, 4.7625, -3.175\n*CORK,Cork\n0, 0, 0, 0, 3.175\n135, 1.5875, -1.5875, 0, 8.98026, 4.49013, -4.49013\n135, 2.38125, -1.5875, 0, 8.98026, 4.49013, -4.49013\n135, 3.175, -1.5875, 0, 8.98026, 4.49013, -4.49013\n*CROSS,Cross tiling\n0, 0, 0, 6.35, 6.35, 3.175, -9.525\n90, 1.5875, -1.5875, 6.35, 6.35, 3.175, -9.525\n*DASH,Staggered dashes\n0, 0, 0, 3.175, 3.175, 3.175, -3.175\n*DOLMIT,Layered rock (dolomite)\n0, 0, 0, 0, 6.35\n45, 0, 0, 0, 17.9605,8.98025612106915355989072339,-17.9605122421383071197814467\n*DOTS,Dot screen\n0, 0, 0, 0.79375, 1.5875, 0, -1.5875\n*EARTH,Earth (section)\n0, 0, 0, 6.35, 6.35, 6.35, -6.35\n0, 0, 2.38125, 6.35, 6.35, 6.35, -6.35\n0, 0, 4.7625, 6.35, 6.35, 6.35, -6.35\n90, 0.79375, 5.55625, 6.35, 6.35, 6.35, -6.35\n90, 3.175, 5.55625, 6.35, 6.35, 6.35, -6.35\n90, 5.55625, 5.55625, 6.35, 6.35, 6.35, -6.35\n*ESCHER,Isometric cube tiling\n60, 0, 0, -15.24, 26.3964542936, 27.94, -2.54\n180, 0, 0, -15.24, 26.3964542936, 27.94, -2.54\n300, 0, 0, 15.24, 26.3964542936, 27.94, -2.54\n60, 2.54, 0, -15.24, 26.3964542936, 5.08, -25.4\n300, 2.54, 0, 15.24, 26.3964542936, 5.08, -25.4\n60, -1.27, 2.199704516, -15.24, 26.3964542936, 5.08, -25.4\n180, -1.27, 2.199704516, -15.24, 26.3964542936, 5.08, -25.4\n300, -1.27, -2.199704516, 15.24, 26.3964542936, 5.08, -25.4\n180, -1.27, -2.199704516, -15.24, 26.3964542936, 5.08, -25.4\n60, -10.16, 0, -15.24, 26.3964542936, 5.08, -25.4\n300, -10.16, 0, 15.24, 26.3964542936, 5.08, -25.4\n60, 5.08, -8.7988180894, -15.24, 26.3964542936, 5.08, -25.4\n180, 5.08, -8.7988180894, -15.24, 26.3964542936, 5.08, -25.4\n300, 5.08, 8.7988180894, 15.24, 26.3964542936, 5.08, -25.4\n180, 5.08, 8.7988180894, -15.24, 26.3964542936, 5.08, -25.4\n0, 5.08, 4.3994090574, -15.24, 26.3964542936, 17.78, -12.7\n0, 5.08, -4.3994090574, -15.24, 26.3964542936, 17.78, -12.7\n120, 1.27, 6.5991135734, 15.24, 26.3964542936, 17.78, -12.7\n120, -6.35, 2.199704516, 15.24, 26.3964542936, 17.78, -12.7\n240, -6.35, -2.199704516, 15.24, 26.3964542936, 17.78, -12.7\n240, 1.27, -6.5991135734, 15.24, 26.3964542936, 17.78, -12.7\n*FLEX,Flexible material\n0, 0, 0, 0, 6.35, 6.35, -6.35\n45,6.35,0,4.490128053,4.490128053,1.5875,-5.8052561314,1.5875,-8.9802561314\n*GOST_GLASS,Glass (GOST)\n45, 0, 0, 6, -6, 5, -7\n45, 2.121320, 0, 6, -6, 2, -10\n45, 0, 2.121320, 6, -6, 2, -10\n*GOST_GROUND,Ground (GOST)\n45, 0, 0, 10, -10, 20\n45, 3, 0, 10, -10, 20\n45, 6, 0, 10, -10, 20\n*GOST_WOOD,Wood (GOST)\n90, 0, 0, 0, -6, 10, -2\n90, 2, -2, 0, -6, 6, -1.5, 3, -1.5\n90, 4, -5, 0, -6, 10, -2\n*GRASS,Grass\n90, 0, 0, 17.96051224, 17.96051224, 4.7625, -31.15852448\n45, 0, 0, 0, 25.4, 4.7625, -20.6375\n135, 0, 0, 0, 25.4, 4.7625, -20.6375\n*GRATE,Grating\n0, 0, 0, 0, 0.79375\n90, 0, 0, 0, 3.175\n*GRAVEL,Gravel, random cobbles\n228.0127875,18.288,25.4,305.85067529778,1.88796713245,3.4172144,-338.30483639565\n184.969741,16.002,22.86,-305.8545235377,1.10019612724,5.8640472,-580.54048893524\n132.5104471,10.16,22.352,-377.59492241548,1.56030959675,4.1348152,-409.347227941\n267.273689,.254,16.002,-508.63316875916,1.20815479432,5.3400452,-528.66437425738\n292.83365418,0.0,10.668,-330.19770134945,1.23208097566,5.236337,-518.39807745344\n357.273689,2.032,5.842,-508.63316875916,1.20815479432,5.3400452,-528.66437425738\n37.69424047,7.366,5.588,-416.58997273292,.91357450169,7.0619366,-699.13115314247\n72.25532837,12.954,9.906,586.40373773403,.96766293399,6.6671952,-660.05256601905\n121.42956562,14.986,16.256,387.71230339293,1.2040754753,5.35813,-530.45545698712\n175.2363583,12.192,20.828,-280.5442400419,2.10935518695,6.1171328,-299.7393695\n222.3974378,6.096,21.336,413.48123885686,.81554484621,7.9107792,-783.16772512177\n138.81407483,25.4,15.748,234.164238558,2.38943100688,2.7000454,-267.30565824344\n171.4692344,23.368,17.526,-334.082478726,1.25594916784,5.1368198,-508.5463899704\n225.00000,18.288,18.288,17.96051224214,17.96051224214,3.5920934,-32.32893108428\n203.19859051,16.51,21.336,-136.74251918,3.33518339548,1.9344132,-191.50622368894\n291.80140949,14.732,20.574,-80.18324702488,4.71666158921,2.7356562,-134.0475299\n30.96375653,15.748,18.034,91.47734531502,4.35606406258,4.4431966,-143.6629815291\n161.56505118,19.558,20.32,-56.2252967978,8.03218525675,3.2128714,-77.10898116828\n16.389540334,0.0,20.574,265.17991128726,1.43340492604,4.50088,-445.58826672539\n70.34617594,4.318,21.844,-297.29446803469,1.70858889651,3.7759894,-373.822156782\n293.19859051,19.558,25.4,-136.7425191801,3.33518339548,3.868801,-189.57183588894\n343.61045967,21.082,21.844,-265.17991128725,1.433404926,4.50088,-445.5882667254\n339.44395478,0.0,4.826,-136.75087638398,2.97284513779,4.340352,-212.67734313106\n294.7751406,4.064,3.302,-306.90424056705,1.77401295215,3.6367212,-360.0359338072\n66.80140949,19.812,0.0,136.74251918012,3.33518339452,3.868801,-189.57183588894\n17.35402464,21.336,3.556,-345.47402804977,1.51523696536,4.2578274,-421.523759802\n69.44395478,7.366,0.0,-136.75087638396,2.97284513874,2.170176,-214.84751913106\n101.309932474,18.288,0.0,104.60834648271,4.98134983255,1.295146,-128.21994964526\n165.963756532,18.034,1.27,-80.085263387,6.16040487582,5.236337,-99.49054589069\n186.00900596,12.954,2.54,-255.26337856879,1.32949676118,4.85267,-480.41364863337\n303.69006753,15.748,15.748,-56.35753993648,7.0446924921,3.6632388,-87.9177635968\n353.15722659,17.78,12.7,434.77679606606,1.0087628707,6.3955676,-633.16009065031\n60.9453959,24.13,11.938,-204.76648550216,2.46706609031,2.6150824,-258.8939231811\n90.0000000,25.4,14.224,25.4,25.4,1.524,-23.876\n120.25643716,12.446,3.302,-204.77318477297,1.8283320086,3.5286696,-349.339407732\n48.01278750,10.668,6.35,305.85067529778,1.88796713138,6.8344288,-334.88762199565\n0.000000000,15.24,11.43,25.4,25.4,6.604,-18.796\n325.3048465,21.844,11.43,310.04235091354,-1.6064370526,4.0160956,-397.5931672414\n254.0546041,25.146,9.144,104.6687497289,3.48895832444,3.6982908,-181.21650038772\n207.64597536,24.13,5.588,545.36007557253,1.07143433066,6.021451,-596.12464422938\n175.42607874,18.796,2.794,331.1739336186,1.01276432357,6.3702946,-630.6584645624\n*HEX,Hexagonal mesh\n0, 0, 0, 0, 5.4992613154, 3.175, -6.35\n120, 0, 0, 0, 5.4992613154, 3.175, -6.35\n60, 3.175, 0, 0, 5.4992613154, 3.175, -6.35\n*HONEY,Honeycomb\n0, 0, 0, 4.7625, 2.749630645, 3.175, -6.35\n120, 0, 0, 4.7625, 2.749630645, 3.175, -6.35\n60, 0, 0, 4.7625, 2.749630645, -6.35, 3.175\n*HOUND,Houndstooth\n0, 0, 0, 6.35, 1.5875, 25.4, -12.7\n90, 0, 0, -6.35, 1.5875, 25.4, -12.7\n*INSUL,Insulation batt\n0, 0, 0, 0, 9.525\n0, 0, 3.175, 0, 9.525, 3.175, -3.175\n0, 0, 6.35, 0, 9.525, 3.175, -3.175\n*LINE,Horizontal lines\n0, 0, 0, 0, 3.175\n*MUDST,Mud / sand (geological)\n0, 0, 0, 12.7, 6.35, 6.35, -6.35, 0, -6.35, 0, -6.35\n*NET,Square grid\n0, 0, 0, 0, 3.175\n90, 0, 0, 0, 3.175\n*NET3,Triangular grid\n0, 0, 0, 0, 3.175\n60, 0, 0, 0, 3.175\n120, 0, 0, 0, 3.175\n*PLAST,Plastic\n0, 0, 0, 0, 6.35\n0, 0, 0.79375, 0, 6.35\n0, 0, 1.5875, 0, 6.35\n*PLASTI,Plastic, dense\n0, 0, 0, 0, 6.35\n0, 0, 0.79375, 0, 6.35\n0, 0, 1.5875, 0, 6.35\n0, 0, 3.96875, 0, 6.35\n*SACNCR,Concrete, dotted diagonal\n45, 0, 0, 0, 2.38125\n45, 1.6838, 0, 0, 2.38125, 0, -2.38125\n*SQUARE,Dashed square lattice\n0, 0, 0, 0, 3.175, 3.175, -3.175\n90, 0, 0, 0, 3.175, 3.175, -3.175\n*STARS,Six-pointed star lattice\n0, 0, 0, 0, 5.4992613154, 3.175, -3.175\n60, 0, 0, 0, 5.4992613154, 3.175, -3.175\n120, 1.5875, 2.7496306704, 0, 5.4992613154, 3.175, -3.175\n*STEEL,Steel, paired lines\n45, 0, 0, 0, 3.175\n45, 0, 1.5875, 0, 3.175\n*SWAMP,Swamp / marsh\n0, 0, 0, 12.7, 21.9970452362, 3.175, -22.225\n90, 1.5875, 0, 21.9970452362, 12.7, 1.5875, -42.4065904724\n90, 1.984375, 0, 21.9970452362, 12.7, 1.27, -42.7240904724\n90, 1.190625, 0, 21.9970452362, 12.7, 1.27, -42.7240904724\n60, 2.38125, 0, 12.7, 21.9970452362, 1.016, -24.384\n120, 0.79375, 0, 12.7, 21.9970452362, 1.016, -24.384\n*TRANS,Heat-transfer surface\n0, 0, 0, 0, 6.35\n0, 0, 3.175, 0, 6.35, 3.175, -3.175\n*TRIANG,Triangle tiling\n60, 0, 0, 4.7625, 8.2488919604, 4.7625, -4.7625\n120, 0, 0, 4.7625, 8.2488919604, 4.7625, -4.7625\n0, -2.38125, 4.1244459802, 4.7625, 8.2488919604, 4.7625, -4.7625\n*ZIGZAG,Stair-step zigzag\n0, 0, 0, 3.175, 3.175, 3.175, -3.175\n90, 3.175, 0, 3.175, 3.175, 3.175, -3.175\n\n;; Hatch companions to the ISO 128 line types (1 mm pen base).\n\n*ACAD_ISO02W100,ISO dashed\n0, 0,0, 0,5, 12,-3\n*ACAD_ISO03W100,ISO dashed, wide gaps\n0, 0,0, 0,5, 12,-18\n*ACAD_ISO04W100,ISO long-dash dot\n0, 0,0, 0,5, 24,-3,.5,-3\n*ACAD_ISO05W100,ISO long-dash double-dot\n0, 0,0, 0,5, 24,-3,.5,-3,.5,-3\n*ACAD_ISO06W100,ISO long-dash triple-dot\n0, 0,0, 0,5, 24,-3,.5,-3,.5,-6.5\n0, 0,0, 0,5, -34,.5,-3\n*ACAD_ISO07W100,ISO dotted\n0, 0,0, 0,5, .5,-3\n*ACAD_ISO08W100,ISO long-dash short-dash\n0, 0,0, 0,5, 24,-3,6,-3\n*ACAD_ISO09W100,ISO long-dash double short-dash\n0, 0,0, 0,5, 24,-3,6,-3,6,-3\n*ACAD_ISO10W100,ISO dash dot\n0, 0,0, 0,5, 12,-3,.5,-3\n*ACAD_ISO11W100,ISO double-dash dot\n0, 0,0, 0,5, 12,-3,12,-3,.5,-3\n*ACAD_ISO12W100,ISO dash double-dot\n0, 0,0, 0,5, 12,-3,.5,-3,.5,-3\n*ACAD_ISO13W100,ISO double-dash double-dot\n0, 0,0, 0,5, 12,-3,12,-3,.5,-6.5\n0, 0,0, 0,5, -33.5,.5,-3\n*ACAD_ISO14W100,ISO dash triple-dot\n0, 0,0, 0,5, 12,-3,.5,-3,.5,-6.5\n0, 0,0, 0,5, -22,.5,-3\n*ACAD_ISO15W100,ISO double-dash triple-dot\n0, 0,0, 0,5, 12,-3,12,-3,.5,-10\n0, 0,0, 0,5, -33.5,.5,-3,.5,-3\n\n;; JIS A 0150 section patterns.\n\n*JIS_LC_20,Lightweight concrete, 20 mm (JIS)\n45,0,0,0,20\n45,.4,0,0,20\n*JIS_LC_20A,Lightweight concrete, 20 mm wide (JIS)\n45,0,0,0,20\n45,1,0,0,20\n*JIS_LC_8,Lightweight concrete, 8 mm (JIS)\n45,0,0,0,7.8\n45,.4,0,0,7.8\n*JIS_LC_8A,Lightweight concrete, 8 mm wide (JIS)\n45,0,0,0,7.8\n45,1,0,0,7.8\n*JIS_RC_10,Reinforced concrete, 10 mm (JIS)\n45,0,0,0,10\n45,.725,0,0,10\n45,1.45,0,0,10\n*JIS_RC_15,Reinforced concrete, 15 mm (JIS)\n45,0,0,0,15\n45,.725,0,0,15\n45,1.45,0,0,15\n*JIS_RC_18,Reinforced concrete, 18 mm (JIS)\n45,0,0,0,18\n45,1,0,0,18\n45,2,0,0,18\n*JIS_RC_30,Reinforced concrete, 30 mm (JIS)\n45,0,0,0,30\n45,1,0,0,30\n45,2,0,0,30\n*JIS_STN_1E,Stone, 1 mm (JIS)\n45, 0, 0, 0, 1\n45, .705, 0, 0,1, 1, -.5\n*JIS_STN_2.5,Stone, 2.5 mm (JIS)\n45, 0, 0, 0, 2.5\n45, 1.765, 0, 0,2.5, 1.2, -.5\n*JIS_WOOD,Wood (JIS)\n45,0,0,0,.70710678\n`;\n","// Document → DXF (AC1021-era entities, mm units). Model space, every paper\n// layout (as *Paper_Space blocks + LAYOUT objects), and viewports (VIEWPORT\n// entities) are written. Hatches, leaders, and dimensions go out as native\n// entities; dimensions also carry a geometry block (exploded via the exact\n// painter geometry) so CAD apps that don't regenerate still show them.\n\nimport {\n hatchPatternKey,\n resolveHatchPattern,\n type DocumentHatchPattern,\n} from \"../../model/hatchPatterns\";\nimport {\n DxfWriter,\n Units,\n LayerFlags,\n LWPolylineFlags,\n MTextAttachmentPoint,\n TextHorizontalAlignment,\n TextVerticalAlignment,\n HatchBoundaryPaths,\n HatchPolylineBoundary,\n HatchPredefinedPatterns,\n pattern,\n type DxfBlock,\n type DxfLayer,\n type Dxfier,\n} from \"@tarikjabiri/dxf\";\nimport type { LineaDocument } from \"../../model/document\";\nimport type {\n DimStyle,\n ModelObject,\n Text,\n TextSpan,\n Viewport,\n} from \"../../model/objects\";\nimport {\n dimFontFace,\n DIM_DEFAULT_CONTENT,\n DIM_VALUE_TOKEN,\n dimStyleFor as dimStyleForObj,\n resolveTextStyle,\n textStyleFor as textStyleForObj,\n} from \"../../model/objects\";\nimport {\n LINE_TYPE_DEFS,\n resolveLineType,\n type LineType,\n} from \"../../model/lineTypes\";\nimport type { Vec2 } from \"../../geometry/vec2\";\nimport { add, fromAngle, norm, perp, scale, sub } from \"../../geometry/vec2\";\nimport { getEvaluatedWorldChildren } from \"../../extensions/evalBlock\";\nimport { documentObjectResolver } from \"../../model/objectLookup\";\nimport {\n dimensionGeometry,\n dimensionLabelFrames,\n formatDimValue,\n linearAxis,\n} from \"../../paint/dimensionGeometry\";\nimport {\n boundMeasurer,\n textBlock,\n type TextMeasurer,\n} from \"../../paint/textMetrics\";\nimport {\n fontFace,\n fontTypeface,\n parseFontFace,\n resolveFont,\n} from \"../../model/fonts\";\nimport { tableLayout } from \"../../paint/tableLayout\";\nimport { textFrameGeometry } from \"../../paint/textGeometry\";\nimport { hexToTrueColor, nearestAci } from \"./aci\";\nimport { encodeMtext, encodeRichMtext, mmToLineWeight } from \"./codecs\";\nimport {\n ViewportEntity,\n LayoutObject,\n MultiLeaderEntity,\n MLeaderStyleObject,\n} from \"./dxfExtras\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nimport { ANSI31_BASE_ANGLE_DEG, ANSI31_BASE_SPACING } from \"./hatchPattern\";\n\n/** DXF layer names must avoid a set of reserved characters. */\nconst sanitizeLayerName = (name: string): string =>\n name.replace(/[<>/\\\\\":;?*|=,`]/g, \"_\").trim() || \"0\";\n\nconst v3 = (p: Vec2) => ({ x: p.x, y: p.y, z: 0 });\n/** BLOCK group-70 bit: an external reference (the path rides in group 1). */\nconst XREF_BLOCK_FLAG = 4;\n\nconst H_ALIGN: Record<Text[\"hAlign\"], TextHorizontalAlignment> = {\n left: TextHorizontalAlignment.Left,\n center: TextHorizontalAlignment.Center,\n right: TextHorizontalAlignment.Right,\n};\n\n/** MTEXT attachment point 1–9 (TL TC TR / ML MC MR / BL BC BR). */\nconst mtextAttachment = (\n hAlign: Text[\"hAlign\"],\n vAlign: Text[\"vAlign\"],\n): MTextAttachmentPoint => {\n const row = vAlign === \"top\" ? 0 : vAlign === \"center\" ? 3 : 6;\n const col = hAlign === \"left\" ? 1 : hAlign === \"center\" ? 2 : 3;\n return (row + col) as MTextAttachmentPoint;\n};\n\n/** LTYPE name a line type exports as (undefined = solid/continuous/unknown).\n * Document-defined line types resolve ahead of the catalogue. */\nconst dxfLineTypeName = (\n lineType: string | undefined,\n lineTypes?: readonly LineType[],\n): string | undefined => {\n if (!lineType) return undefined;\n const p = resolveLineType(lineType, lineTypes);\n if (!p || p.dashesMm.length === 0) return undefined;\n return p.dxfName ?? p.name.toUpperCase();\n};\n\n/** A STYLE table record we wrote: its name, handle, and the font FACE it\n * carries (the xdata typeface/flags derive from the face). */\ninterface StyleRecord {\n name: string;\n handle: string;\n face: string;\n}\n\ninterface ExportContext {\n doc: LineaDocument;\n /** Text width measurement (canvas-backed in the editor, font-metric in Node). */\n measure: TextMeasurer;\n writer: DxfWriter;\n layerNames: Map<string, string>;\n layerRecords: Map<string, DxfLayer>;\n skipped: Map<string, number>;\n exported: number;\n dimBlockCount: number;\n /** Write leaders as plain geometry instead of MULTILEADER objects (see\n * DxfExportOptions). */\n explodeLeaders: boolean;\n /** Handles for MULTILEADER references. */\n mleaderStyleHandle: string;\n textStyleHandle: string;\n lineTypeHandle: string;\n /** STYLE records: the document's text styles under `doc:<id>` (written\n * by their own names), plus lazily created per-face fallbacks under the\n * face string (`LINEA_<FONT>[_B][_I]`) for texts whose effective face\n * differs from their style's. */\n textStyles: Map<string, StyleRecord>;\n /** Taken STYLE names (upper-cased) — DXF table names are case-insensitive. */\n styleNames: Set<string>;\n /** DIMSTYLE record name per document dim style id. */\n dimStyleRecords: Map<string, string>;\n dimStyleNames: Set<string>;\n /** Per-override DIMSTYLE records (`<style>_n`), keyed by base + values. */\n dimStyles: Map<string, string>;\n dimOverrideCounts: Map<string, number>;\n /** Pattern-frame anchors of written hatches, by entity handle — baked into\n * the definition lines' 43/44 after stringify (injectHatchPatternLines). */\n hatchOrigins: Map<string, Vec2>;\n /** XREF block names by referenced path (one block per linked file). */\n xrefBlocks: Map<string, string>;\n}\n\nexport interface DxfExportResult {\n content: string;\n exported: number;\n skipped: Map<string, number>;\n}\n\n/**\n * @tarikjabiri/dxf has no lineweight slot — it hard-codes `370 0` (hairline)\n * on every LAYER record and writes none on entities. Patch the tag emission\n * of one record/entity: overwrite an existing 370, else insert it before the\n * entity's own subclass marker (the second group 100, where AutoCAD puts it).\n */\nconst setLineWeight = (\n target: { dxfy(dx: Dxfier): void },\n weight: number,\n): void => {\n const emit = target.dxfy.bind(target);\n target.dxfy = (dx) => {\n const start = dx.lines.length;\n emit(dx);\n const lines = dx.lines;\n for (let i = start; i < lines.length; i += 2)\n if (lines[i] === 370) {\n lines[i + 1] = weight;\n return;\n }\n let markers = 0;\n for (let i = start; i < lines.length; i += 2)\n if (lines[i] === 100 && ++markers === 2) {\n lines.splice(i, 0, 370, weight);\n return;\n }\n lines.push(370, weight);\n };\n};\n\nconst optionsFor = (obj: ModelObject, ctx: ExportContext) => {\n // We render dashes width-proportionally (pattern × resolved lineweight ×\n // CELTSCALE); DXF consumers render pattern × group 48. Fold the width in\n // so AutoCAD shows the same dash lengths the user saw (import divides it\n // back out — round-trips are exact). Emitted only when the effective line\n // type actually dashes — continuous entities don't need the noise.\n const layer = ctx.doc.layers.find((l) => l.id === obj.layerId);\n const dashed =\n (resolveLineType(obj.lineType ?? layer?.lineType ?? \"\", ctx.doc.lineTypes)\n ?.dashesMm.length ?? 0) > 0;\n const lineTypeScale =\n (obj.lineTypeScale ?? 1) * (obj.lineWidth ?? layer?.lineWidth ?? 0.25);\n const trueColor = obj.color ? hexToTrueColor(obj.color) : null;\n return {\n layerName: ctx.layerNames.get(obj.layerId) ?? \"0\",\n // Both color forms: nearest ACI (62) for legacy viewers, exact true\n // color (420) which wins wherever it is supported.\n ...(obj.color ? { colorNumber: nearestAci(obj.color) } : {}),\n ...(trueColor !== null ? { trueColor: String(trueColor) } : {}),\n ...(dxfLineTypeName(obj.lineType, ctx.doc.lineTypes)\n ? { lineType: dxfLineTypeName(obj.lineType, ctx.doc.lineTypes) }\n : {}),\n ...(dashed && lineTypeScale !== 1 ? { lineTypeScale } : {}),\n };\n};\n\n/** Arrowhead geometry mirroring paintArrowhead's styles. */\nconst addArrowhead = (\n space: DxfBlock,\n tip: Vec2,\n toward: Vec2,\n size: number,\n type: DimStyle[\"arrowType\"],\n opts: object,\n) => {\n if (type === \"none\") return;\n const dir = norm(sub(toward, tip));\n if (dir.x === 0 && dir.y === 0) return;\n switch (type) {\n case \"filled\": {\n const base = add(tip, scale(dir, size));\n const half = scale(perp(dir), size / 3);\n space.addLWPolyline(\n [\n { point: v3(tip) },\n { point: v3(add(base, half)) },\n { point: v3(sub(base, half)) },\n ],\n { flags: LWPolylineFlags.Closed, ...opts },\n );\n break;\n }\n case \"open\": {\n const base = add(tip, scale(dir, size));\n const half = scale(perp(dir), size / 3);\n space.addLWPolyline(\n [\n { point: v3(add(base, half)) },\n { point: v3(tip) },\n { point: v3(sub(base, half)) },\n ],\n opts,\n );\n break;\n }\n case \"tick\": {\n const diag = scale(norm(add(dir, perp(dir))), size / 2);\n space.addLine(v3(sub(tip, diag)), v3(add(tip, diag)), opts);\n break;\n }\n case \"dot\":\n space.addCircle(v3(tip), size / 4, opts);\n break;\n }\n};\n\n/** A table name nobody else holds: `name`, else `name_2`, `name_3`, … */\nconst uniqueTableName = (taken: Set<string>, base: string): string => {\n let name = base;\n for (let i = 2; taken.has(name.toUpperCase()); i++) name = `${base}_${i}`;\n taken.add(name.toUpperCase());\n return name;\n};\n\n/** The font FACE a face string resolves to for writing: a bundled font's id\n * or — a font id outside the bundle, kept from a DXF import — its own name,\n * so it round-trips instead of becoming the default. */\nconst writableFace = (\n font: string | undefined,\n): { face: string; fontFile: string; fontId: string; foreign: boolean } => {\n const def = resolveFont(font);\n const { font: bare, bold, italic } = parseFontFace(font);\n const foreign = bare !== undefined && bare !== \"\" && bare !== def.id;\n const fontId = foreign ? bare : def.id;\n return {\n face: fontFace(fontId, bold, italic)!,\n fontFile: foreign ? `${fontId}.ttf` : def.dxfFontFile,\n fontId,\n foreign,\n };\n};\n\n/** Write (or, for the writer's predefined \"Standard\", adopt) one STYLE\n * record. Fonts are exported as TTF references by file name — never\n * embedded, like AutoCAD; bold/italic ride as the ACAD xdata flags\n * (injectStyleTypefaces), so the receiving CAD picks its own face. */\nconst addStyleRecord = (\n ctx: ExportContext,\n key: string,\n name: string,\n font: string | undefined,\n widthFactor = 1,\n fixedHeight = 0,\n): StyleRecord => {\n const { face, fontFile } = writableFace(font);\n const table = ctx.writer.document.tables.styleTable;\n const predefined =\n name.toUpperCase() === \"STANDARD\" && !ctx.styleNames.has(\"STANDARD\")\n ? table.records.find((r) => r.name.toUpperCase() === \"STANDARD\")\n : undefined;\n const style =\n predefined ?? table.addStyle(uniqueTableName(ctx.styleNames, name));\n if (predefined) ctx.styleNames.add(\"STANDARD\");\n style.fontFileName = fontFile;\n style.widthFactor = widthFactor;\n // A document style's height is the height its texts get — AutoCAD's\n // fixed height (40); 0 for the per-face fallbacks (asked per text).\n style.fixedTextHeight = fixedHeight;\n const rec = { name: style.name, handle: style.handle, face };\n ctx.textStyles.set(key, rec);\n return rec;\n};\n\n/** The document's text styles, each as a STYLE record under its own name —\n * a DXF → Linea → DXF trip keeps \"ISO-25\" and \"Notes\" in the receiving\n * CAD's style manager. Written up front, used or not, like AutoCAD does. */\nconst createDocTextStyles = (ctx: ExportContext): void => {\n for (const s of ctx.doc.textStyles)\n addStyleRecord(\n ctx,\n `doc:${s.id}`,\n sanitizeLayerName(s.name),\n fontFace(s.font, s.bold, s.italic),\n s.widthFactor,\n s.textHeight,\n );\n};\n\n/** The STYLE record a DIMSTYLE's DIMTXSTY points at: a document text style\n * with the same face AND width factor when there is one, else a per-face\n * fallback — with a `_W<pct>` variant when the width factor is not 1, since\n * a dimension has no entity-level 41 to carry it. */\nconst dimTextStyleFor = (\n ctx: ExportContext,\n face: string | undefined,\n widthFactor: number,\n): StyleRecord => {\n const want = writableFace(face).face;\n const own = ctx.doc.textStyles.find(\n (s) =>\n writableFace(fontFace(s.font, s.bold, s.italic)).face === want &&\n Math.abs(s.widthFactor - widthFactor) < 1e-9,\n );\n const ownRec = own && ctx.textStyles.get(`doc:${own.id}`);\n if (ownRec) return ownRec;\n if (Math.abs(widthFactor - 1) < 1e-9) return textStyleFor(ctx, face);\n const key = `${want}|w${widthFactor}`;\n return (\n ctx.textStyles.get(key) ??\n addStyleRecord(\n ctx,\n key,\n `${textStyleFor(ctx, face).name}_W${Math.round(widthFactor * 100)}`,\n face,\n widthFactor,\n )\n );\n};\n\n/** Per-face fallback record (`LINEA_<FONT>[_B][_I]`), created on first use,\n * for text whose effective face is not its document style's. */\nconst textStyleFor = (\n ctx: ExportContext,\n font: string | undefined,\n): StyleRecord => {\n const { face, fontId, foreign } = writableFace(font);\n const { bold, italic } = parseFontFace(face);\n const suffix = (bold ? \"B\" : \"\") + (italic ? \"I\" : \"\");\n return (\n ctx.textStyles.get(face) ??\n addStyleRecord(\n ctx,\n face,\n `LINEA_${(foreign ? fontId.replace(/[^A-Za-z0-9_-]/g, \"_\") : fontId).toUpperCase()}${suffix ? `_${suffix}` : \"\"}`,\n face,\n )\n );\n};\n\n/** The STYLE record a text is written with: its document style's own\n * record when the text renders in that style's face, else the per-face\n * fallback (the entity's own 41 / `\\W` carries the width factor). */\nconst textRecordFor = (\n ctx: ExportContext,\n obj: Text,\n face: string | undefined,\n): StyleRecord => {\n const base = textStyleForObj(obj, ctx.doc.textStyles);\n const own = ctx.textStyles.get(`doc:${base.id}`);\n return own &&\n writableFace(fontFace(base.font, base.bold, base.italic)).face ===\n writableFace(face).face\n ? own\n : textStyleFor(ctx, face);\n};\n\ninterface TextFontOpts {\n styleName?: string;\n font?: string;\n widthFactor?: number;\n /** Character formatting (forces MTEXT inline codes). */\n spans?: readonly TextSpan[];\n}\n\nconst addTextLines = (\n space: DxfBlock,\n content: string,\n position: Vec2,\n height: number,\n rotation: number,\n hAlign: Text[\"hAlign\"],\n vAlign: Text[\"vAlign\"],\n opts: object,\n measure: TextMeasurer,\n /** MTEXT reference rectangle width (mm); forces an MTEXT with word-wrap. */\n mtextWidth?: number,\n fontOpts: TextFontOpts = {},\n) => {\n const { styleName, font, widthFactor = 1, spans } = fontOpts;\n // Wrap decisions must use the font the receiving CAD will render with.\n const m = boundMeasurer(measure, font, widthFactor);\n const block = textBlock(content, height, m, mtextWidth);\n if (\n block.lines.length > 1 ||\n (mtextWidth !== undefined && mtextWidth > 0) ||\n content.includes(\"\\t\") ||\n !!spans?.length\n ) {\n // Multi-line, width-constrained, TABBED or FORMATTED content stays ONE\n // entity: MTEXT with \\P line breaks / ^I tabs, inline formatting codes\n // and (when set) a reference rectangle width (group 41). (TEXT has no\n // tab semantics at all.) Width factor has no MTEXT group code — it\n // rides as an inline \\W code.\n const value =\n (widthFactor !== 1 ? `\\\\W${widthFactor};` : \"\") +\n (spans?.length\n ? encodeRichMtext(content, spans, font)\n : encodeMtext(content));\n const mtext = space.addMText(v3(position), height, value, {\n rotation: rotation * RAD2DEG,\n attachmentPoint: mtextAttachment(hAlign, vAlign),\n ...(mtextWidth !== undefined && mtextWidth > 0\n ? { width: mtextWidth }\n : {}),\n ...opts,\n });\n if (styleName) mtext.textStyle = styleName;\n return;\n }\n const down = scale(perp(fromAngle(rotation)), -1);\n block.lines.forEach((line, i) => {\n if (!line) return;\n const anchor = add(position, scale(down, i * block.lineHeight));\n const text = space.addText(v3(anchor), height, line, {\n rotation: rotation * RAD2DEG,\n horizontalAlignment: H_ALIGN[hAlign],\n verticalAlignment:\n vAlign === \"center\"\n ? TextVerticalAlignment.Middle\n : vAlign === \"top\"\n ? TextVerticalAlignment.Top\n : TextVerticalAlignment.BaseLine,\n // DXF quirk: aligned text positions via the second alignment point.\n secondAlignmentPoint: v3(anchor),\n ...(widthFactor !== 1 ? { relativeXScaleFactor: widthFactor } : {}),\n ...opts,\n });\n if (styleName) text.textStyle = styleName;\n });\n};\n\n/**\n * Built-in pattern name → DXF predefined pattern. They share names; the enum\n * keys use underscores where the .pat uses hyphens (AR-CONC → AR_CONC). Any\n * name the writer doesn't know falls back to ANSI31.\n */\n/** The document's own pattern of this name, if any (shadows the catalogue). */\nconst documentPattern = (\n ctx: ExportContext,\n name: string,\n): DocumentHatchPattern | undefined =>\n ctx.doc.hatchPatterns.find(\n (p) => hatchPatternKey(p.name) === hatchPatternKey(name),\n );\n\n/**\n * HATCH records of document patterns get their definition lines, baked the\n * way AutoCAD stores them (rotated by the hatch's 52, scaled by its 41):\n * `78 n` then per line 53 angle / 43 44 origin / 45 46 offset / 79 n /\n * 49 dashes, inserted after the record's 77; and 76 = 2 (custom pattern).\n * The writer only knows predefined patterns, so this is spliced into its\n * text like injectStyleTypefaces.\n */\nconst injectHatchPatternLines = (\n content: string,\n ctx: ExportContext,\n): string => {\n if (ctx.doc.hatchPatterns.length === 0 && ctx.hatchOrigins.size === 0)\n return content;\n const out: string[] = [];\n let pos = 0;\n for (;;) {\n const start = content.indexOf(\"\\n0\\nHATCH\\n\", pos);\n if (start === -1) break;\n // The record runs to the next entity / section marker: a `0` group whose\n // value is a NAME (a group VALUE of 0, like `70\\n0`, is not one).\n const rest = content.slice(start + 8);\n const m = /\\n0\\n(?=[A-Z][A-Z0-9_]*\\n)/.exec(rest);\n const end = m ? start + 8 + m.index : content.length;\n let record = content.slice(start, end);\n const handle = /\\n5\\n([0-9A-Fa-f]+)\\n/.exec(record)?.[1];\n // Pattern groups are read from the AcDbHatch body only: the entity's\n // handle (`5\\n41`) would otherwise pass for a `41` scale group.\n const bodyAt = record.indexOf(\"\\nAcDbHatch\\n\");\n const body = bodyAt === -1 ? record : record.slice(bodyAt);\n const name = /\\n2\\n([^\\n]*)\\n/.exec(body)?.[1];\n const anchor = handle ? ctx.hatchOrigins.get(handle) : undefined;\n // A document pattern always gets its lines; a catalogue pattern only\n // when the fill is anchored — the lines are the only place a HATCH\n // carries its origin, and readers take them over their own copy.\n const own = name ? documentPattern(ctx, name) : undefined;\n const pat =\n own ?? (name && anchor ? resolveHatchPattern(name, []) : undefined);\n const m77 = pat ? /\\n77\\n[^\\n]*\\n/.exec(body) : null;\n if (pat && m77 && bodyAt !== -1) {\n const angle =\n (Number(/\\n52\\n([^\\n]*)\\n/.exec(body)?.[1] ?? 0) * Math.PI) / 180;\n const scale = Number(/\\n41\\n([^\\n]*)\\n/.exec(body)?.[1] ?? 1) || 1;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const bake = (x: number, y: number) => [\n (cos * x - sin * y) * scale,\n (sin * x + cos * y) * scale,\n ];\n const lines = pat.lines\n .map((l) => {\n const [bx, by] = bake(l.origin.x, l.origin.y);\n const ox = bx + (anchor?.x ?? 0);\n const oy = by + (anchor?.y ?? 0);\n // 45/46: the step between lines, as a vector in the hatch frame\n // — our deltaX/deltaY are along / across the LINE, so rotate by\n // the line's own angle too (the baked angle = l.angle + 52).\n const bakedAngle = l.angle + angle;\n const dx =\n (Math.cos(bakedAngle) * l.deltaX -\n Math.sin(bakedAngle) * l.deltaY) *\n scale;\n const dy =\n (Math.sin(bakedAngle) * l.deltaX +\n Math.cos(bakedAngle) * l.deltaY) *\n scale;\n const dashes = l.dashesMm ?? [];\n return (\n `53\\n${((l.angle * 180) / Math.PI + (angle * 180) / Math.PI).toFixed(6)}\\n` +\n `43\\n${ox.toFixed(6)}\\n44\\n${oy.toFixed(6)}\\n45\\n${dx.toFixed(6)}\\n46\\n${dy.toFixed(6)}\\n` +\n `79\\n${dashes.length}\\n` +\n dashes.map((d) => `49\\n${(d * scale).toFixed(6)}\\n`).join(\"\")\n );\n })\n .join(\"\");\n // Replace the writer's own definition block (a predefined pattern\n // comes with one generic line) or, absent one, insert after 77.\n const at = bodyAt + m77.index + m77[0].length;\n const tail = record.slice(at);\n const writerBlock = tail.startsWith(\"78\\n\")\n ? (() => {\n const stop = /\\n(?:47|98)\\n/.exec(tail);\n return stop ? stop.index + 1 : tail.length;\n })()\n : 0;\n record =\n record.slice(0, at) +\n `78\\n${pat.lines.length}\\n` +\n lines +\n tail.slice(writerBlock);\n if (own) record = record.replace(/\\n76\\n1\\n/, \"\\n76\\n2\\n\");\n }\n out.push(content.slice(pos, start), record);\n pos = end;\n }\n out.push(content.slice(pos));\n return out.join(\"\");\n};\n\nconst dxfPatternName = (name: string): HatchPredefinedPatterns => {\n const key = name\n .toUpperCase()\n .replace(/-/g, \"_\")\n .replace(/\\./g, \"_\") as keyof typeof HatchPredefinedPatterns;\n return HatchPredefinedPatterns[key] ?? HatchPredefinedPatterns.ANSI31;\n};\n\nconst writeHatch = (\n space: DxfBlock,\n obj: ModelObject,\n opts: object,\n ctx: ExportContext,\n) => {\n if (obj.type !== \"hatch\") return;\n // Gradient exports as a SOLID in the gradient's own start color (the\n // entity color would otherwise be the object/layer color, which a\n // gradient fill never shows).\n if (obj.fill.kind === \"gradient\") {\n opts = {\n ...opts,\n colorNumber: nearestAci(obj.fill.color1),\n trueColor: String(hexToTrueColor(obj.fill.color1)),\n };\n }\n const boundary = new HatchBoundaryPaths();\n for (const loop of obj.loops) {\n boundary.addPolylineBoundary(\n new HatchPolylineBoundary(\n loop.points.map((v) => ({ x: v.x, y: v.y, bulge: v.bulge })),\n ),\n );\n }\n const fill =\n // Gradient exports as SOLID in the start color — DXF gradient data\n // (codes 450+) is beyond dxf-writer, and a solid keeps the region and\n // its boundary intact in the receiving CAD.\n obj.fill.kind === \"solid\" || obj.fill.kind === \"gradient\"\n ? pattern({ name: HatchPredefinedPatterns.SOLID })\n : obj.fill.kind === \"pattern\"\n ? // The curated library names are the standard predefined patterns, so\n // this is a direct mapping; fill.angle/scale ARE the DXF rotation\n // (code 52) and scale (code 41). A DOCUMENT pattern goes out under\n // its own name; its definition lines are spliced in afterwards\n // (injectHatchPatternLines — the writer has no custom patterns).\n pattern({\n name: (documentPattern(ctx, obj.fill.name)\n ? obj.fill.name.toUpperCase()\n : dxfPatternName(obj.fill.name)) as HatchPredefinedPatterns,\n angle: obj.fill.angle * RAD2DEG,\n scale: obj.fill.scale * obj.scale,\n })\n : pattern({\n name: HatchPredefinedPatterns.ANSI31,\n angle: obj.fill.angle * RAD2DEG - ANSI31_BASE_ANGLE_DEG,\n // obj.scale is baked into the pattern scale (like text height).\n scale: (obj.fill.spacing * obj.scale) / ANSI31_BASE_SPACING,\n });\n const written = space.addHatch(boundary, fill, opts);\n if (obj.fill.kind === \"pattern\" && obj.fill.origin)\n ctx.hatchOrigins.set(written.handle, obj.fill.origin);\n};\n\n/** The painter's exact dimension output as plain entities (block content or,\n * for the explode path, straight into the target space). */\nconst writeDimensionGeometry = (\n target: DxfBlock,\n geom: NonNullable<ReturnType<typeof dimensionGeometry>>,\n opts: object,\n ctx: ExportContext,\n): void => {\n for (const seg of [...geom.extensionLines, ...geom.dimLines, ...geom.leaders])\n target.addLine(v3(seg.a), v3(seg.b), opts);\n if (geom.dimArc)\n target.addArc(\n v3(geom.dimArc.center),\n geom.dimArc.radius,\n geom.dimArc.startAngle * RAD2DEG,\n geom.dimArc.endAngle * RAD2DEG,\n opts,\n );\n for (const arrow of geom.arrows)\n addArrowhead(\n target,\n arrow.tip,\n arrow.toward,\n arrow.size,\n geom.arrowType,\n opts,\n );\n for (const text of geom.labels)\n addTextLines(\n target,\n text.content,\n text.anchor,\n text.height,\n text.rotation,\n \"center\",\n \"center\",\n opts,\n ctx.measure,\n undefined,\n {\n styleName: textStyleFor(ctx, text.font).name,\n font: text.font,\n widthFactor: text.widthFactor,\n spans: text.spans,\n },\n );\n};\n\n/** Write (or adopt the predefined \"Standard\") DIMSTYLE record mirroring a\n * resolved dim style — base values UNSCALED; the object's scale rides as\n * DIMSCALE, exactly AutoCAD's semantics. */\nconst addDimStyleRecord = (\n ctx: ExportContext,\n name: string,\n style: DimStyle & { scale?: number },\n): string => {\n const table = ctx.writer.document.tables.dimStyleTable;\n const predefined =\n name.toUpperCase() === \"STANDARD\" && !ctx.dimStyleNames.has(\"STANDARD\")\n ? table.records.find((r) => r.name.toUpperCase() === \"STANDARD\")\n : undefined;\n const rec =\n predefined ??\n ctx.writer.addDimStyle(uniqueTableName(ctx.dimStyleNames, name));\n if (predefined) ctx.dimStyleNames.add(\"STANDARD\");\n const scale = style.scale ?? 1;\n rec.DIMASZ = style.arrowSize;\n rec.DIMEXO = style.extensionOffset;\n rec.DIMEXE = style.extensionOvershoot;\n rec.DIMTXT = style.textHeight;\n rec.DIMGAP = style.textOffset;\n rec.DIMDEC = style.precision;\n if (scale !== 1) rec.DIMSCALE = scale;\n if (style.arrowType !== \"filled\") rec.DIMBLK = DIMBLK_NAMES[style.arrowType];\n rec.DIMTXSTY = dimTextStyleFor(\n ctx,\n dimFontFace(style),\n style.widthFactor,\n ).handle;\n return rec.name;\n};\n\n/** The document's dimension styles, each as a DIMSTYLE record under its\n * own name. */\nconst createDocDimStyles = (ctx: ExportContext): void => {\n for (const s of ctx.doc.dimStyles)\n ctx.dimStyleRecords.set(\n s.id,\n addDimStyleRecord(ctx, sanitizeLayerName(s.name), s),\n );\n};\n\n/** Per-object DIMSTYLE (`<style>_n`) for a dimension with overrides or an\n * annotation scale, cached by value so identical ones share a record. */\nconst dimOverrideStyleFor = (\n ctx: ExportContext,\n base: DimStyle,\n style: DimStyle & { scale?: number },\n): string => {\n const baseName =\n ctx.dimStyleRecords.get(base.id) ??\n ctx.dimStyleRecords.values().next().value ??\n \"Standard\";\n const key = JSON.stringify([\n baseName,\n style.arrowSize,\n style.arrowType,\n style.extensionOffset,\n style.extensionOvershoot,\n style.textHeight,\n style.textOffset,\n style.precision,\n dimFontFace(style),\n style.scale ?? 1,\n ]);\n const cached = ctx.dimStyles.get(key);\n if (cached) return cached;\n const n = (ctx.dimOverrideCounts.get(baseName) ?? 0) + 1;\n ctx.dimOverrideCounts.set(baseName, n);\n const name = addDimStyleRecord(ctx, `${baseName}_${n}`, style);\n ctx.dimStyles.set(key, name);\n return name;\n};\n\n// Standard arrowhead block names (\"\" = ClosedFilled, the default).\nconst DIMBLK_NAMES: Record<DimStyle[\"arrowType\"], string> = {\n filled: \"\",\n open: \"_OPEN\",\n tick: \"_ARCHTICK\",\n dot: \"_DOT\",\n none: \"_NONE\",\n};\n\nconst writeDimension = (\n space: DxfBlock,\n obj: ModelObject,\n opts: object,\n ctx: ExportContext,\n): boolean => {\n if (obj.type !== \"dimension\") return false;\n\n // Chained linear dimensions have no DXF counterpart — AutoCAD models\n // chains as one DIMENSION per measured pair; emit the same.\n if (obj.kind === \"linear\" && obj.points.length > 2) {\n let any = false;\n for (let i = 0; i + 1 < obj.points.length; i++) {\n const pair = { ...obj, points: obj.points.slice(i, i + 2) };\n any = writeDimension(space, pair, opts, ctx) || any;\n }\n return any;\n }\n\n const geom = dimensionGeometry(obj, ctx.doc.dimStyles);\n if (!geom) return false;\n\n // Geometry block: the painter's exact output, so CAD apps that don't\n // regenerate dimensions still display what the user saw.\n const blockName = `LINEA_DIM_${ctx.dimBlockCount++}`;\n const block = ctx.writer.addBlock(blockName);\n writeDimensionGeometry(block, geom, opts, ctx);\n\n // Style: the referenced document style's own record, or — with overrides\n // or an annotation scale — a per-object `<style>_n` record, so a\n // regenerating CAD reproduces the object's scale/precision/arrows too\n // (the annotation scale rides as DIMSCALE).\n const baseStyle = dimStyleForObj(obj, ctx.doc.dimStyles);\n const hasOverride =\n obj.styleOverride !== undefined &&\n Object.values(obj.styleOverride).some((v) => v !== undefined);\n const styleName =\n hasOverride || obj.scale !== 1\n ? dimOverrideStyleFor(ctx, baseStyle, {\n ...baseStyle,\n ...obj.styleOverride,\n scale: obj.scale,\n })\n : (ctx.dimStyleRecords.get(baseStyle.id) ??\n dimOverrideStyleFor(ctx, baseStyle, baseStyle));\n\n // Text (code 1): a label template becomes AutoCAD's `<>` for the live\n // measurement — on radial/diameter dims `<>` carries the R/Ø prefix, so\n // the kind's default template maps to it and a bare {value} has no live\n // form there (the number goes in). No content = the CAD computes.\n const content = obj.labels[0]?.content;\n const precision = {\n ...dimStyleForObj(obj, ctx.doc.dimStyles),\n ...obj.styleOverride,\n }.precision;\n const text =\n content === undefined\n ? undefined\n : content\n .split(DIM_DEFAULT_CONTENT[obj.kind])\n .join(\"<>\")\n .split(DIM_VALUE_TOKEN)\n .join(\n obj.kind === \"radial\" || obj.kind === \"diameter\"\n ? formatDimValue(geom.value, precision)\n : \"<>\",\n );\n const dimOpts = {\n blockName,\n ...(text === undefined ? {} : { text }),\n styleName,\n // Text middle point (group 11) — without it a regenerating CAD places\n // the value at the style default instead of where the user saw it.\n ...(geom.labels[0] ? { middlePoint: v3(geom.labels[0].anchor) } : {}),\n ...opts,\n };\n switch (obj.kind) {\n case \"angular\": {\n const [vertex, a, b] = obj.points;\n const [frame] = dimensionLabelFrames(obj);\n space.addAngularPointsDim(v3(vertex), v3(a), v3(b), {\n ...dimOpts,\n // A point on the arc (its middle): the radius and which arc.\n definitionPoint: v3(frame.toWorld((frame.s0 + frame.s1) / 2, 0)),\n });\n break;\n }\n case \"radial\": {\n // DXF radial: definition point (10) = center, 15 = point on the curve.\n const [center, p] = obj.points;\n space.addRadialDim(v3(p), v3(center), dimOpts);\n break;\n }\n case \"diameter\": {\n const [p1, p2] = obj.points;\n space.addDiameterDim(v3(p1), v3(p2), dimOpts);\n break;\n }\n case \"linear\": {\n // A locked measuring axis → a DXF ROTATED dim (code 50); unset →\n // ALIGNED. Code 10 is any point on the dimension line.\n const [p1, p2] = obj.points;\n const { u } = linearAxis(obj);\n space.addLinearDim(v3(p1), v3(p2), {\n ...dimOpts,\n definitionPoint: v3(geom.dimLines[0].b),\n angle: Math.atan2(u.y, u.x) * RAD2DEG,\n });\n break;\n }\n }\n return true;\n};\n\nconst writeObject = (\n space: DxfBlock,\n obj: ModelObject,\n ctx: ExportContext,\n): void => {\n const before = space.entities.length;\n writeObjectEntities(space, obj, ctx);\n // An explicit lineweight is written as 370 on everything the object\n // became; byLayer stays inherited (the LAYER record carries its 370).\n if (obj.lineWidth !== undefined)\n for (const entity of space.entities.slice(before))\n setLineWeight(entity, mmToLineWeight(obj.lineWidth));\n};\n\nconst writeObjectEntities = (\n space: DxfBlock,\n obj: ModelObject,\n ctx: ExportContext,\n): void => {\n const opts = optionsFor(obj, ctx);\n switch (obj.type) {\n case \"line\":\n space.addLine(v3(obj.a), v3(obj.b), opts);\n break;\n case \"point\":\n space.addPoint(obj.p.x, obj.p.y, 0, opts);\n break;\n case \"polyline\":\n space.addLWPolyline(\n obj.points.map((v) => ({\n point: { x: v.x, y: v.y },\n bulge: v.bulge,\n })),\n {\n flags: obj.closed ? LWPolylineFlags.Closed : LWPolylineFlags.None,\n ...opts,\n },\n );\n break;\n case \"circle\":\n space.addCircle(v3(obj.center), obj.radius, opts);\n break;\n case \"arc\":\n space.addArc(\n v3(obj.center),\n obj.radius,\n obj.startAngle * RAD2DEG,\n obj.endAngle * RAD2DEG,\n opts,\n );\n break;\n case \"ellipse\":\n space.addEllipse(\n v3(obj.center),\n v3(obj.majorAxis), // relative to center, per DXF\n obj.ratio,\n obj.startAngle,\n obj.endAngle,\n opts,\n );\n break;\n case \"hatch\":\n writeHatch(space, obj, opts, ctx);\n break;\n case \"text\": {\n // Effective style (document style + overrides) — the font is baked\n // into the STYLE reference so receiving CADs render the same.\n const eff = resolveTextStyle(obj, ctx.doc.textStyles);\n const { arrowSize, arrowType } = eff;\n const face = fontFace(eff.font, eff.bold, eff.italic);\n // DXF has no text frame: write it as the same companion geometry the\n // painters stroke (rectangle/slot/underline → LWPOLYLINE with bulges)\n // — for plain notes and leader notes alike.\n for (const part of textFrameGeometry(\n obj,\n ctx.measure,\n ctx.doc.textStyles,\n ))\n space.addLWPolyline(\n part.points.map((v) => ({\n point: { x: v.x, y: v.y },\n bulge: v.bulge,\n })),\n {\n flags: part.closed ? LWPolylineFlags.Closed : LWPolylineFlags.None,\n ...opts,\n },\n );\n if (obj.leaderLines.length > 0 && ctx.explodeLeaders) {\n // Explode path (DWG transcode): leader lines + arrowheads as plain\n // geometry; the note itself falls through to the TEXT/MTEXT write.\n for (const line of obj.leaderLines) {\n space.addLWPolyline(\n line.map((v) => ({ point: { x: v.x, y: v.y } })),\n opts,\n );\n addArrowhead(\n space,\n line[0],\n line[1],\n arrowSize * obj.scale,\n arrowType,\n opts,\n );\n }\n } else if (obj.leaderLines.length > 0) {\n // One MULTILEADER carries the leader lines + the note text. Line\n // vertices stop before the shared junction (the LEADER node's\n // \"last point\"); the junction→text gap doubles as the dogleg, and\n // the object's scale maps to MLEADER's overall scale.\n const first = obj.leaderLines[0];\n const junction = first[first.length - 1];\n const toText = {\n x: obj.position.x - junction.x,\n y: obj.position.y - junction.y,\n };\n const gap = Math.max(Math.hypot(toText.x, toText.y), 1e-6);\n const lines = obj.leaderLines.map((line) => {\n const last = line[line.length - 1];\n const joins =\n Math.hypot(last.x - junction.x, last.y - junction.y) < 1e-9;\n return joins && line.length > 1 ? line.slice(0, -1) : line;\n });\n const entity = new MultiLeaderEntity({\n lines,\n junction,\n doglegDirection: { x: toText.x / gap, y: toText.y / gap },\n doglegLength: gap,\n content: obj.spans?.length\n ? encodeRichMtext(obj.content, obj.spans, face)\n : encodeMtext(obj.content),\n textHeight: eff.textHeight,\n arrowSize,\n overallScale: obj.scale,\n textLocation: obj.position,\n // Model alignment → MTEXT-style attachment point (1–9).\n attachment:\n 1 +\n 3 * [\"top\", \"center\", \"bottom\"].indexOf(obj.vAlign) +\n [\"left\", \"center\", \"right\"].indexOf(obj.hAlign),\n styleHandle: ctx.mleaderStyleHandle,\n textStyleHandle: textRecordFor(ctx, obj, face).handle,\n lineTypeHandle: ctx.lineTypeHandle,\n });\n entity.layerName = ctx.layerNames.get(obj.layerId) ?? \"0\";\n if (obj.color) {\n entity.colorNumber = nearestAci(obj.color);\n const tc = hexToTrueColor(obj.color);\n if (tc !== null) entity.trueColor = String(tc);\n }\n space.addEntity(entity);\n break;\n }\n // Model alignment is the DXF justification (which edge sits on the\n // point). TEXT has no scale concept, so the effective height is baked\n // in.\n addTextLines(\n space,\n obj.content,\n obj.position,\n eff.textHeight * obj.scale,\n obj.rotation,\n obj.hAlign,\n obj.vAlign,\n opts,\n ctx.measure,\n obj.width === undefined ? undefined : obj.width * obj.scale,\n {\n styleName: textRecordFor(ctx, obj, face).name,\n font: face,\n widthFactor: eff.widthFactor,\n spans: obj.spans,\n },\n );\n break;\n }\n case \"dimension\":\n if (!writeDimension(space, obj, opts, ctx)) {\n skip(ctx, \"dimension\");\n return;\n }\n break;\n case \"block\": {\n // Parametric instances have per-instance geometry — bake the\n // evaluated world children as plain entities.\n const children = getEvaluatedWorldChildren(\n obj,\n ctx.doc.blockDefinitions,\n documentObjectResolver(ctx.doc),\n ctx.doc,\n );\n if (children.length === 0) {\n skip(ctx, \"block\");\n return;\n }\n const before = ctx.exported;\n for (const child of children) {\n if (child.type === \"block\" || child.type === \"viewport\") continue;\n writeObject(space, child, ctx);\n }\n ctx.exported = before; // children count as one instance, not N entities\n break;\n }\n case \"table\": {\n // Baked like a block instance: the rules as LINEs, each cell as its\n // TEXT/MTEXT (native ACAD_TABLE export is a later phase).\n const before = ctx.exported;\n for (const child of tableLayout(obj, ctx.doc.textStyles).children)\n writeObject(space, child, ctx);\n ctx.exported = before;\n break;\n }\n case \"viewport\":\n // Handled by the layout writer; a viewport in model space is invalid.\n skip(ctx, \"viewport\");\n return;\n case \"image\":\n // DXF IMAGE entities reference EXTERNAL files (IMAGEDEF) — embedded\n // assets have no faithful mapping, so images are skipped explicitly.\n skip(ctx, \"image\");\n return;\n case \"reference\": {\n // DXF/DWG links become real XREFs (an xref BLOCK carrying the path +\n // an INSERT with the placement), so CAD apps resolve the same file.\n // Other formats (.linea, PDF, images) have no DXF xref — skipped, as\n // are switched-off references. ponytail: a clip isn't written\n // (XCLIP's SPATIAL_FILTER) — the xref arrives unclipped.\n if (\n obj.hidden ||\n (obj.format !== \"dxf\" && obj.format !== \"dwg\") ||\n obj.source.kind !== \"path\"\n ) {\n skip(ctx, \"reference\");\n return;\n }\n const path = obj.source.path;\n let blockName = ctx.xrefBlocks.get(path);\n if (!blockName) {\n blockName = `${sanitizeLayerName(obj.name)}${ctx.xrefBlocks.size > 0 ? `_${ctx.xrefBlocks.size}` : \"\"}`;\n const block = ctx.writer.addBlock(blockName);\n block.flags = XREF_BLOCK_FLAG as typeof block.flags;\n block.xrefPathName = path;\n ctx.xrefBlocks.set(path, blockName);\n }\n space.addInsert(blockName, v3(obj.position), {\n ...opts,\n scaleFactor: {\n x: obj.mirrored ? -obj.scale : obj.scale,\n y: obj.scale,\n z: obj.scale,\n },\n rotationAngle: (obj.rotation * 180) / Math.PI,\n });\n break;\n }\n case \"comment\":\n // Review annotation, not drawing content — no DXF mapping.\n skip(ctx, \"comment\");\n return;\n default:\n skip(ctx, (obj as ModelObject).type);\n return;\n }\n ctx.exported++;\n};\n\nconst skip = (ctx: ExportContext, type: string) =>\n ctx.skipped.set(type, (ctx.skipped.get(type) ?? 0) + 1);\n\nconst writeViewport = (\n space: DxfBlock,\n vp: Viewport,\n id: number,\n ctx: ExportContext,\n): void => {\n space.addEntity(\n new ViewportEntity({\n center: { x: vp.rect.x + vp.rect.w / 2, y: vp.rect.y + vp.rect.h / 2 },\n width: vp.rect.w,\n height: vp.rect.h,\n viewCenter: vp.modelCenter,\n // scale = the 1:N denominator (model mm per paper mm) → visible model\n // height.\n viewHeight: vp.rect.h * vp.scale,\n id,\n status: id,\n locked: vp.locked,\n frozenLayerHandles: vp.hiddenLayerIds\n .map((layerId) => ctx.layerRecords.get(layerId)?.handle)\n .filter((h): h is string => h !== undefined),\n }),\n );\n ctx.exported++;\n};\n\nexport interface DxfExportOptions {\n /**\n * Write leaders as plain geometry instead of MULTILEADER objects. Used by\n * the DWG path: acadrust's MULTILEADER DWG output is unproven in real\n * CADs (reported invisible) — exploded geometry always displays.\n */\n explodeLeaders?: boolean;\n}\n\n/**\n * Document → DXF text. Pure and headless: `measure` supplies text-width\n * measurement (canvas-backed in the editor, font-metric in Node). The editor\n * wraps this with the store read + file download + toast.\n */\nexport const buildDxf = (\n doc: LineaDocument,\n measure: TextMeasurer,\n options: DxfExportOptions = {},\n): DxfExportResult => {\n const writer = new DxfWriter();\n writer.setUnits(Units.Millimeters);\n\n // Linetype table (Continuous/ByLayer/ByBlock are predefined by the writer).\n // Emit the whole dashed catalogue — hidden scale variants included — so any\n // referenced LTYPE is defined; the signed dash sequence IS the DXF element\n // form (>0 dash, <0 gap, 0 dot).\n const emittedLtypes = new Set<string>();\n // The document's own line types first (they shadow catalogue names).\n for (const t of doc.lineTypes) {\n if (t.dashesMm.length === 0) continue;\n const dxfName = t.name.toUpperCase();\n if (emittedLtypes.has(dxfName)) continue;\n emittedLtypes.add(dxfName);\n const descriptive = (t.description ?? t.name)\n .replace(/[^\\x20-\\x7e]/g, \"\")\n .slice(0, 47);\n writer.addLType(dxfName, descriptive, t.dashesMm);\n }\n for (const p of LINE_TYPE_DEFS) {\n if (p.dashesMm.length === 0) continue;\n const dxfName = p.dxfName ?? p.name.toUpperCase();\n if (emittedLtypes.has(dxfName)) continue;\n emittedLtypes.add(dxfName);\n const descriptive = p.label.replace(/[^\\x20-\\x7e]/g, \"\").slice(0, 47);\n writer.addLType(dxfName, descriptive, p.dashesMm);\n }\n\n // Layers (nearest ACI + exact true color; visibility/locking as flags).\n const layerNames = new Map<string, string>();\n const layerRecords = new Map<string, DxfLayer>();\n // DXF layer names are unique case-insensitively; two Linea layers can\n // collide after sanitizing (\"A/B\" and \"A_B\") or in older documents that\n // already had duplicates — suffix the later ones instead of writing two\n // LAYER records with one name. \"0\" stays the shared default layer.\n const taken = new Set<string>([\"0\"]);\n for (const layer of doc.layers) {\n let name = sanitizeLayerName(layer.name);\n if (name !== \"0\") {\n const base = name;\n for (let i = 2; taken.has(name.toUpperCase()); i++) name = `${base}_${i}`;\n taken.add(name.toUpperCase());\n }\n layerNames.set(layer.id, name);\n if (name === \"0\") {\n const zero = writer.layer(\"0\");\n if (zero) {\n setLineWeight(zero, mmToLineWeight(layer.lineWidth));\n layerRecords.set(layer.id, zero);\n }\n continue;\n }\n const flags =\n (layer.visible ? 0 : LayerFlags.Frozen) |\n (layer.locked ? LayerFlags.Locked : 0);\n const record = writer.addLayer(\n name,\n nearestAci(layer.color),\n dxfLineTypeName(layer.lineType, doc.lineTypes) ?? \"Continuous\",\n flags || undefined,\n );\n const tc = hexToTrueColor(layer.color);\n if (tc !== null) record.trueColor = tc;\n setLineWeight(record, mmToLineWeight(layer.lineWidth));\n layerRecords.set(layer.id, record);\n }\n\n // MULTILEADER plumbing: leaders export as MULTILEADER, which references\n // an MLEADERSTYLE through the ACAD_MLEADERSTYLE dictionary.\n const textStyleHandle =\n writer.document.tables.styleTable.records.find((r) => r.name === \"Standard\")\n ?.handle ?? \"0\";\n const lineTypeHandle =\n writer.document.tables.ltypeTable.records.find((r) => r.name === \"ByBlock\")\n ?.handle ?? \"0\";\n const mleaderDict = writer.document.objects.addDictionary();\n writer.document.objects.addEntryToRoot(\n \"ACAD_MLEADERSTYLE\",\n mleaderDict.handle,\n );\n const mleaderStyle = writer.document.objects.addObject(\n new MLeaderStyleObject({\n name: \"Standard\",\n textStyleHandle,\n arrowSize: doc.dimStyles[0].arrowSize,\n textHeight: doc.dimStyles[0].textHeight,\n dictionaryHandle: mleaderDict.handle,\n }),\n );\n mleaderStyle.ownerObjecthandle = mleaderDict.handle;\n mleaderDict.addEntryObject(\"Standard\", mleaderStyle.handle);\n\n const ctx: ExportContext = {\n doc,\n measure,\n writer,\n layerNames,\n layerRecords,\n skipped: new Map(),\n exported: 0,\n dimBlockCount: 0,\n xrefBlocks: new Map(),\n explodeLeaders: options.explodeLeaders ?? false,\n mleaderStyleHandle: mleaderStyle.handle,\n textStyleHandle,\n lineTypeHandle,\n textStyles: new Map(),\n styleNames: new Set(),\n dimStyleRecords: new Map(),\n dimStyleNames: new Set(),\n dimStyles: new Map(),\n dimOverrideCounts: new Map(),\n hatchOrigins: new Map(),\n };\n\n // The document's named text and dimension styles, as their own records.\n createDocTextStyles(ctx);\n createDocDimStyles(ctx);\n\n // Model space.\n for (const obj of doc.objects)\n writeObject(writer.document.blocks.modelSpace, obj, ctx);\n\n // Paper layouts: the first uses the predefined *Paper_Space block, the\n // rest get their own; each gets a LAYOUT object so tabs survive.\n const layoutRecords: {\n name: string;\n blockRecordHandle: string;\n width: number;\n height: number;\n }[] = [];\n doc.layouts.forEach((layout, i) => {\n const space =\n i === 0 ? writer.document.blocks.paperSpace : writer.addPaperSpace();\n const record = writer.document.tables.blockRecordTable.records.find(\n (r) => r.name === space.name,\n );\n\n // The layout's own paper view is viewport id 1; real ones follow.\n writeViewport(\n space,\n {\n type: \"viewport\",\n id: \"paper\",\n layerId: \"\",\n rect: { x: 0, y: 0, w: layout.sheet.width, h: layout.sheet.height },\n modelCenter: { x: 0, y: 0 },\n scale: 1,\n locked: false,\n hiddenLayerIds: [],\n },\n 1,\n ctx,\n );\n ctx.exported--; // the paper view is bookkeeping, not user content\n\n let viewportId = 2;\n for (const obj of layout.objects) {\n if (obj.type === \"viewport\") writeViewport(space, obj, viewportId++, ctx);\n else writeObject(space, obj, ctx);\n }\n\n if (record) {\n layoutRecords.push({\n name: layout.name,\n blockRecordHandle: record.handle,\n width: layout.sheet.width,\n height: layout.sheet.height,\n });\n }\n });\n\n // LAYOUT objects (+ the mandatory Model entry) in an ACAD_LAYOUT dictionary.\n const objects = writer.document.objects;\n const layoutDict = objects.addDictionary();\n objects.addEntryToRoot(\"ACAD_LAYOUT\", layoutDict.handle);\n const modelRecord = writer.document.tables.blockRecordTable.records.find(\n (r) => r.name === \"*Model_Space\",\n );\n const entries = [\n {\n name: \"Model\",\n tabOrder: 0,\n width: 210,\n height: 297,\n blockRecordHandle: modelRecord?.handle ?? \"0\",\n },\n ...layoutRecords.map((l, i) => ({ ...l, tabOrder: i + 1 })),\n ];\n for (const entry of entries) {\n const layoutObj = objects.addObject(\n new LayoutObject({\n name: entry.name,\n tabOrder: entry.tabOrder,\n paperWidth: entry.width,\n paperHeight: entry.height,\n blockRecordHandle: entry.blockRecordHandle,\n }),\n );\n layoutObj.ownerObjecthandle = layoutDict.handle;\n layoutDict.addEntryObject(entry.name, layoutObj.handle);\n // Back-pointer: BLOCK_RECORD → its LAYOUT (group 340).\n const record = writer.document.tables.blockRecordTable.records.find(\n (r) => r.handle === entry.blockRecordHandle,\n );\n if (record) record.layoutObject = layoutObj.handle;\n }\n\n return {\n content: injectHatchPatternLines(\n injectStyleTypefaces(writer.stringify(), ctx.textStyles),\n ctx,\n ),\n exported: ctx.exported,\n skipped: ctx.skipped,\n };\n};\n\n/**\n * STYLE records carry the font as a FILE name (group 3), but CAD apps\n * resolve installed TrueType fonts by FAMILY through the standard ACAD\n * xdata (1001 \"ACAD\" / 1000 typeface / 1071 flags) — the same convention\n * AutoCAD writes. Without it, a receiver warns about every style whose\n * literal file name it cannot find, even with the font family installed.\n * The writer library has no xdata on table records, so the groups are\n * spliced into the emitted text at the end of each of our STYLE records.\n */\nconst injectStyleTypefaces = (\n content: string,\n textStyles: Map<string, StyleRecord>,\n): string => {\n let out = content;\n for (const rec of textStyles.values()) {\n const fontId = rec.face;\n const { font: bare } = parseFontFace(fontId);\n const def = resolveFont(fontId);\n const typeface =\n bare !== undefined && bare !== def.id ? bare : fontTypeface(def);\n // AutoCAD's packed font flags: italic 0x1000000, bold 0x2000000.\n const { bold, italic } = parseFontFace(fontId);\n const flags = (italic ? 0x1000000 : 0) | (bold ? 0x2000000 : 0);\n // Subclass marker anchors the search to a STYLE record (a user layer\n // could share the name).\n const marker = `\\nAcDbTextStyleTableRecord\\n2\\n${rec.name}\\n`;\n const at = out.indexOf(marker);\n if (at === -1) continue;\n // xdata must close the record — the record runs to the next STYLE or\n // the table's ENDTAB (a bare \"\\n0\\n\" also matches group-70 VALUES).\n const from = at + marker.length;\n const recordEnd = Math.min(\n ...[\"\\n0\\nSTYLE\", \"\\n0\\nENDTAB\"]\n .map((m) => out.indexOf(m, from))\n .filter((i) => i !== -1),\n );\n if (!Number.isFinite(recordEnd)) continue;\n out =\n out.slice(0, recordEnd) +\n `\\n1001\\nACAD\\n1000\\n${typeface}\\n1071\\n${flags}` +\n out.slice(recordEnd);\n }\n return out;\n};\n","import { z } from \"zod\";\nimport {\n ColorSchema,\n ObjectBaseSchema,\n Vec2Schema,\n type ObjectBase,\n} from \"./common\";\nimport { fontFace } from \"./fonts\";\n\n// Geometry is deliberately DXF-shaped so export/import stays a direct mapping.\n\n/**\n * DXF POINT. Paints as a round dot whose DIAMETER is the resolved lineWidth\n * (byLayer or override) — realized like a lineweight, so it stays paper-mm\n * through viewport transforms and clamps like a hairline on screen.\n */\nexport const PointSchema = ObjectBaseSchema.extend({\n type: z.literal(\"point\"),\n p: Vec2Schema,\n});\nexport type Point = z.infer<typeof PointSchema>;\n\nexport const LineSchema = ObjectBaseSchema.extend({\n type: z.literal(\"line\"),\n a: Vec2Schema,\n b: Vec2Schema,\n});\nexport type Line = z.infer<typeof LineSchema>;\n\n/**\n * bulge = tan(sweep/4); 0 = straight segment, >0 CCW arc to the next vertex\n * (DXF LWPOLYLINE). Accepts [x, y, bulge?] as input (block scripts).\n */\nexport const PolylineVertexSchema = z.preprocess(\n (v) =>\n Array.isArray(v) && v.length >= 2\n ? { x: v[0], y: v[1], bulge: v[2] ?? 0 }\n : v,\n z.object({ x: z.number(), y: z.number(), bulge: z.number().default(0) }),\n);\nexport type PolylineVertex = z.infer<typeof PolylineVertexSchema>;\n\n// Note: there is no separate rectangle object — the Rectangle tool emits a\n// closed 4-vertex polyline (same as AutoCAD RECTANG).\nexport const PolylineSchema = ObjectBaseSchema.extend({\n type: z.literal(\"polyline\"),\n points: z.array(PolylineVertexSchema).min(2),\n closed: z.boolean().default(false),\n});\nexport type Polyline = z.infer<typeof PolylineSchema>;\n\nexport const CircleSchema = ObjectBaseSchema.extend({\n type: z.literal(\"circle\"),\n center: Vec2Schema,\n radius: z.number().positive(),\n});\nexport type Circle = z.infer<typeof CircleSchema>;\n\n/** Runs CCW from startAngle to endAngle (DXF ARC convention). */\nexport const ArcSchema = ObjectBaseSchema.extend({\n type: z.literal(\"arc\"),\n center: Vec2Schema,\n radius: z.number().positive(),\n startAngle: z.number(),\n endAngle: z.number(),\n});\nexport type Arc = z.infer<typeof ArcSchema>;\n\n/** DXF ELLIPSE form: majorAxis is the endpoint vector from center; ratio = minor/major in (0,1]. */\nexport const EllipseSchema = ObjectBaseSchema.extend({\n type: z.literal(\"ellipse\"),\n center: Vec2Schema,\n majorAxis: Vec2Schema,\n ratio: z.number().gt(0).max(1),\n startAngle: z.number().default(0),\n endAngle: z.number().default(Math.PI * 2),\n});\nexport type Ellipse = z.infer<typeof EllipseSchema>;\n\nexport const HatchLoopSchema = z.object({\n points: z.array(PolylineVertexSchema).min(3),\n});\nexport type HatchLoop = z.infer<typeof HatchLoopSchema>;\n\nexport const HatchFillSchema = z.discriminatedUnion(\"kind\", [\n z.object({ kind: z.literal(\"solid\") }),\n z.object({\n kind: z.literal(\"pattern\"),\n name: z.string(),\n angle: z.number(),\n scale: z.number().positive(),\n /** Where the pattern frame is anchored, world mm (absent = the drawing\n * origin, like a hatch drawn here). Set by import for hatches that came\n * out of blocks — AutoCAD anchors a block's hatch to the block, so the\n * pattern phase follows the insertion — and carried by the transforms. */\n origin: Vec2Schema.optional(),\n }),\n z.object({\n kind: z.literal(\"lines\"),\n angle: z.number(),\n spacing: z.number().positive(),\n }),\n z.object({\n kind: z.literal(\"gradient\"),\n /** linear = color1→color2 along `angle`; radial = color1 at the\n * boundary's center fading to color2 at its edge. */\n shape: z.enum([\"linear\", \"radial\"]).default(\"linear\"),\n color1: z.string().default(\"#808080\"),\n color2: z.string().default(\"#2d2d2d\"),\n /** Direction, radians CCW: 0 = color1 on the left (linear only). */\n angle: z.number().default(0),\n }),\n]);\n\n/** Owns copied boundary geometry (non-associative). loops[0] outer, rest holes (even-odd). */\nexport const HatchSchema = ObjectBaseSchema.extend({\n type: z.literal(\"hatch\"),\n loops: z.array(HatchLoopSchema).min(1),\n fill: HatchFillSchema.default({\n kind: \"lines\",\n angle: Math.PI / 4,\n spacing: 5,\n }),\n /** Pattern spacing multiplier (same idea as DimStyle.scale). */\n scale: z.number().positive().default(1),\n});\nexport type Hatch = z.infer<typeof HatchSchema>;\n\n/** Arrowhead style (maps to the standard DXF DIMBLK arrowhead blocks). */\nconst ArrowTypeSchema = z.enum([\"filled\", \"open\", \"tick\", \"dot\", \"none\"]);\nexport type ArrowType = z.infer<typeof ArrowTypeSchema>;\n\n/**\n * A named document text style: everything a TEXT object inherits unless its\n * own `styleOverride` sets a key (same model as DimStyle for dimensions).\n * Documents carry an ARRAY of these; objects reference one by `styleId`\n * (absent/dangling = the first style). Font names are stored, never font\n * data — unknown names render in the default and round-trip.\n */\nexport const TextStyleSchema = z.object({\n id: z.string().default(() => crypto.randomUUID()),\n name: z.string().default(\"Standard\"),\n /** Font id (model/fonts.ts). */\n font: z.string().default(\"arial\"),\n /** AutoCAD-style width factor: horizontal glyph scale. */\n widthFactor: z.number().positive().default(1),\n /** Bold / italic face (bundled outlines where the font has them, else\n * synthesized — model/fonts.ts `fontFace`). Absent = regular. */\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n /** Cap height in mm (world), before the object's `scale`. */\n textHeight: z.number().positive().default(2.5),\n /** Leader arrowhead style. */\n arrowType: ArrowTypeSchema.default(\"filled\"),\n /** Leader arrowhead size (mm), before the object's `scale`. */\n arrowSize: z.number().positive().default(2.5),\n});\nexport type TextStyle = z.infer<typeof TextStyleSchema>;\n\n/** The historic hard-coded fallbacks — documents that predate the field\n * default to this and render identically. */\nexport const DEFAULT_TEXT_STYLE: TextStyle = {\n id: \"standard\",\n name: \"Standard\",\n font: \"arial\",\n widthFactor: 1,\n textHeight: 2.5,\n arrowType: \"filled\",\n arrowSize: 2.5,\n};\n\n/**\n * Per-text style override: keys the user actually set, nothing else (same\n * discipline as DimStyleOverrideSchema — NOT .partial(), which would bake\n * defaults in and freeze the object against document-style edits).\n * Keep in sync with TextStyleSchema.\n */\nexport const TextStyleOverrideSchema = z.object({\n font: z.string().optional(),\n widthFactor: z.number().positive().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().optional(),\n arrowType: ArrowTypeSchema.optional(),\n arrowSize: z.number().positive().optional(),\n});\n\n/** The text style an object references: by `styleId`, else the document's\n * first (absent/dangling ids degrade gracefully). */\nexport const textStyleFor = (\n obj: Pick<Text, \"styleId\">,\n styles: readonly TextStyle[],\n): TextStyle =>\n styles.find((s) => s.id === obj.styleId) ?? styles[0] ?? DEFAULT_TEXT_STYLE;\n\n/** Referenced document style + the text's overrides. */\nexport const resolveTextStyle = (\n obj: Pick<Text, \"styleId\" | \"styleOverride\">,\n styles: readonly TextStyle[],\n): TextStyle => ({ ...textStyleFor(obj, styles), ...obj.styleOverride });\n\n/** A text's effective font FACE (font id + bold/italic, as one face string\n * — model/fonts.ts) and widthFactor (override, else its style's). */\nexport const effectiveTextFont = (\n obj: Pick<Text, \"styleId\" | \"styleOverride\">,\n styles: readonly TextStyle[],\n): { font: string; widthFactor: number } => {\n const base = textStyleFor(obj, styles);\n const o = obj.styleOverride;\n return {\n font: fontFace(\n o?.font ?? base.font,\n o?.bold ?? base.bold,\n o?.italic ?? base.italic,\n )!,\n widthFactor: o?.widthFactor ?? base.widthFactor,\n };\n};\n\n/**\n * Character formatting over a range of a text's `content` (docs/rich-text.md\n * §4). Offsets are JS string indices, end exclusive. Absent attributes\n * inherit the text's resolved style; `height` is a ratio of its cap height.\n * Stored normalized (richText.ts `normalizeSpans`): sorted, non-overlapping,\n * non-empty, adjacent equal spans merged.\n */\nexport const TextSpanSchema = z.object({\n start: z.number().int().min(0),\n end: z.number().int().min(0),\n /** Font id (model/fonts.ts). */\n font: z.string().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: z.boolean().optional(),\n /** Literal colour; absent = the text's own (possibly ByLayer) colour. */\n color: ColorSchema.optional(),\n /** × the text's cap height. */\n height: z.number().positive().optional(),\n script: z.enum([\"sub\", \"super\"]).optional(),\n});\nexport type TextSpan = z.infer<typeof TextSpanSchema>;\n\n/**\n * Text, optionally annotated with leader lines (MLEADER-style — the old\n * standalone \"leader\" type merged in at document v6). Each leader line is a\n * polyline with its arrowhead at [0]; by convention lines join at the first\n * line's last point (the junction), near the text.\n */\nexport const TextSchema = ObjectBaseSchema.extend({\n type: z.literal(\"text\"),\n position: Vec2Schema,\n content: z.string(),\n /** Character formatting over `content`; absent = all plain. Replacing\n * `content` without new spans drops them (offsets would be stale). */\n spans: z.array(TextSpanSchema).optional(),\n /** Arrow polylines pointing at this text (arrowhead at [0]). */\n leaderLines: z.array(z.array(Vec2Schema).min(2)).default([]),\n /**\n * Max text box width in mm (before `scale`) — the word-wrap boundary and the\n * frame width. Undefined = no wrapping (lines break only on explicit\n * newlines). Maps to the DXF MTEXT reference rectangle width.\n */\n width: z.number().positive().optional(),\n hAlign: z.enum([\"left\", \"center\", \"right\"]).default(\"center\"),\n vAlign: z.enum([\"bottom\", \"center\", \"top\"]).default(\"center\"),\n /** Border drawn around the text: a rectangle, a circle, a slot (rounded\n * ends), a line under the text or under its first line. */\n frame: z\n .enum([\"none\", \"rectangle\", \"circle\", \"slot\", \"bottom\", \"firstLine\"])\n .optional(),\n /** The document text style this text follows (absent/dangling = the\n * document's first style). */\n styleId: z.string().optional(),\n /** Style keys the user set on THIS text (font, height, arrows, …);\n * absent = inherit the referenced style. */\n styleOverride: TextStyleOverrideSchema.optional(),\n rotation: z.number().default(0),\n /** Size multiplier for height + arrow size (same idea as\n * Dimension.scale). */\n scale: z.number().positive().default(1),\n});\nexport type Text = z.infer<typeof TextSchema>;\n\nexport const DimensionKindSchema = z.enum([\n \"linear\",\n \"angular\",\n \"radial\",\n \"diameter\",\n]);\n\n/** A named document dimension style; documents carry an ARRAY of these and\n * dimensions reference one by `styleId` (absent/dangling = the first). */\nexport const DimStyleSchema = z.object({\n id: z.string().default(() => crypto.randomUUID()),\n name: z.string().default(\"Standard\"),\n /** Font id for dimension text (model/fonts.ts). */\n font: z.string().default(\"arial\"),\n /** Horizontal glyph scale for dimension text. */\n widthFactor: z.number().positive().default(1),\n /** Bold / italic dimension text (same faces as TextStyle). */\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().default(2.5),\n /** Dimension line → text center distance (mm, × scale; DXF DIMGAP-ish). */\n textOffset: z.number().default(1.8),\n arrowType: ArrowTypeSchema.default(\"tick\"),\n arrowSize: z.number().positive().default(2.5),\n /** \"long\" runs each extension line from the measured point to the\n * dimension line; \"short\" draws only a 2×overshoot tick across it. */\n extensionType: z.enum([\"long\", \"short\"]).default(\"long\"),\n extensionOffset: z.number().default(1),\n extensionOvershoot: z.number().default(1.25),\n /** Decimal places for the measurement text. */\n precision: z.number().int().min(0).max(6).default(1),\n});\nexport type DimStyle = z.infer<typeof DimStyleSchema>;\n\nexport const DEFAULT_DIM_STYLE: DimStyle = {\n id: \"standard\",\n name: \"Standard\",\n font: \"arial\",\n widthFactor: 1,\n textHeight: 2.5,\n textOffset: 1.8,\n arrowType: \"tick\",\n arrowSize: 2.5,\n extensionType: \"long\",\n extensionOffset: 1,\n extensionOvershoot: 1,\n precision: 1,\n};\n\n/**\n * Per-object style override: keys the user actually set, nothing else.\n * NOT DimStyleSchema.partial() — zod's partial() still applies field\n * defaults, which would bake EVERY style value into the override and freeze\n * the object against document-style edits. Keep in sync with DimStyleSchema.\n */\n// Deliberately LENIENT (unknown keys strip, zod default): a strict schema\n// would refuse to open documents saved by a newer Linea whose override\n// gained a key — forward compatibility wins at the document boundary. The\n// classic agent mistake (`styleOverride: { scale }` — annotation scale is\n// the object's top-level `scale` field) is caught loudly at the SDK/tool\n// mutation boundary instead, via unknownStyleOverrideKeys below.\nexport const DimStyleOverrideSchema = z.object({\n font: z.string().optional(),\n widthFactor: z.number().positive().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().optional(),\n textOffset: z.number().optional(),\n arrowType: ArrowTypeSchema.optional(),\n arrowSize: z.number().positive().optional(),\n extensionType: z.enum([\"long\", \"short\"]).optional(),\n extensionOffset: z.number().optional(),\n extensionOvershoot: z.number().optional(),\n precision: z.number().int().min(0).max(6).optional(),\n});\n\n/**\n * Unknown keys in a raw object INPUT's `styleOverride` — the SDK and agent\n * tools call this before parsing so a wrong key (the classic\n * `styleOverride: { scale }`; annotation scale is the object's TOP-LEVEL\n * `scale` field) errors loudly instead of being silently stripped by the\n * deliberately lenient schema.\n */\nexport const unknownStyleOverrideKeys = (\n input: Record<string, unknown>,\n): string[] => {\n const so = input.styleOverride;\n if (so === null || typeof so !== \"object\" || Array.isArray(so)) return [];\n const shape =\n input.type === \"dimension\"\n ? DimStyleOverrideSchema.shape\n : input.type === \"text\"\n ? TextStyleOverrideSchema.shape\n : null;\n if (!shape) return [];\n return Object.keys(so).filter((k) => !(k in shape));\n};\n\n/** Throwing form of unknownStyleOverrideKeys for mutation boundaries (the\n * SDK and the editor's agent tools). `where` prefixes the error. */\nexport const assertKnownStyleOverrideKeys = (\n input: Record<string, unknown>,\n where: string,\n): void => {\n const unknown = unknownStyleOverrideKeys(input);\n if (unknown.length === 0) return;\n const hint = unknown.includes(\"scale\")\n ? ' — annotation scale is the TOP-LEVEL \"scale\" field (scale: 50 for 1:50), not a style key'\n : \"\";\n throw new Error(\n `${where}: styleOverride: unknown key(s) ${unknown\n .map((k) => `\"${k}\"`)\n .join(\", \")}${hint}`,\n );\n};\n\n/** The dim style a dimension references: by `styleId`, else the document's\n * first (absent/dangling ids degrade gracefully). */\nexport const dimStyleFor = (\n obj: { styleId?: string },\n styles: readonly DimStyle[],\n): DimStyle =>\n styles.find((s) => s.id === obj.styleId) ?? styles[0] ?? DEFAULT_DIM_STYLE;\n\n/** A (resolved) dim style's text font FACE — font id + bold/italic as one\n * face string (model/fonts.ts), like effectiveTextFont for texts. */\nexport const dimFontFace = (\n style: Pick<DimStyle, \"font\" | \"bold\" | \"italic\">,\n): string => fontFace(style.font, style.bold, style.italic)!;\n\n/** The token in a label's `content` that stands for the measurement. */\nexport const DIM_VALUE_TOKEN = \"{value}\";\n\n/**\n * One measured segment's label: where its text sits and what it says\n * (docs/dimension-labels.md). All fields optional — an empty object, or a\n * missing entry, means fully automatic.\n */\nexport const DimLabelSchema = z.object({\n /** mm along the dimension line from the segment's origin (linear: the\n * foot of the segment's first point; angular: where ray a meets the arc,\n * as arc length; radial/diameter: the center). Undefined = automatic\n * placement: centered when the text fits, else outside. */\n along: z.number().optional(),\n /** mm perpendicular to the dimension line, positive on the side the\n * dimension line is on (linear/angular) or to the left of `along`\n * (radial/diameter). Undefined or 0 = on the line; otherwise the text\n * floats, with a leader when it no longer overlaps its segment. */\n across: z.number().optional(),\n /** Text; `{value}` is replaced by the formatted measurement. Undefined =\n * the kind's default template (\"{value}\", \"{value}°\", \"R{value}\",\n * \"Ø{value}\"). */\n content: z.string().optional(),\n /** Character formatting over `content` (the TEMPLATE: a span covering\n * `{value}` formats the measurement). Needs `content` set. */\n spans: z.array(TextSpanSchema).optional(),\n});\nexport type DimLabel = z.infer<typeof DimLabelSchema>;\n\n/** Static (non-associative) definition points; placement as scalars and\n * per-segment labels — docs/dimension-labels.md. The plain shape; the\n * per-kind rules live in `dimensionRefinement` (zod can't `.omit()` a\n * refined object, and the block DTOs omit the base fields), and\n * `DimensionSchema` is the two combined. */\nexport const DimensionShapeSchema = ObjectBaseSchema.extend({\n type: z.literal(\"dimension\"),\n kind: DimensionKindSchema.default(\"linear\"),\n /**\n * Measured points. linear: 2+ (more than two render as a CHAIN — one\n * measurement per consecutive pair sharing the dimension line);\n * angular: [vertex, a, b]; radial: [center, curve point]; diameter:\n * [p1, p2] opposite on the curve.\n */\n points: z.array(Vec2Schema).min(2),\n /**\n * linear only: the measuring direction, radians CCW from +X (DXF's\n * \"rotated\" dimension, code 50). Undefined = aligned to\n * points[0] → points[last] (DXF \"aligned\"), so dragging a point turns the\n * dimension; set, the direction is locked and a point drag only changes\n * the measurement.\n */\n rotation: z.number().optional(),\n /**\n * linear: signed distance of the dimension line from points[0] along the\n * LEFT perpendicular of the measuring direction. angular: the arc radius,\n * positive for the arc running CCW from a to b, negative for the\n * complementary arc. radial/diameter: absent — the line's direction comes\n * from the points and the text position is labels[0].along.\n */\n offset: z.number().optional(),\n /** One label per measured segment (linear chain: points.length − 1,\n * every other kind: 1). Missing or short = automatic. */\n labels: z.array(DimLabelSchema).default([]),\n /** The document dimension style this dimension follows (absent/dangling =\n * the document's first style). */\n styleId: z.string().optional(),\n styleOverride: DimStyleOverrideSchema.optional(),\n /** Annotation size multiplier (text/arrows/offsets — same idea as\n * Text.scale; rides as DIMSCALE in DXF). */\n scale: z.number().positive().default(1),\n});\n\n/** Per-kind rules: point count, `offset` only (and always) on linear /\n * angular, `rotation` only on linear. */\nexport const dimensionRefinement = (\n d: Pick<\n z.infer<typeof DimensionShapeSchema>,\n \"kind\" | \"points\" | \"offset\" | \"rotation\"\n >,\n ctx: z.RefinementCtx,\n): void => {\n const need = d.kind === \"angular\" ? 3 : 2;\n if (d.points.length < need)\n ctx.addIssue({\n code: \"custom\",\n path: [\"points\"],\n message: `a ${d.kind} dimension needs at least ${need} points`,\n });\n if (d.kind !== \"linear\" && d.kind !== \"angular\") {\n if (d.offset !== undefined)\n ctx.addIssue({\n code: \"custom\",\n path: [\"offset\"],\n message: `offset does not apply to a ${d.kind} dimension (the text position is labels[0].along)`,\n });\n } else if (d.offset === undefined)\n ctx.addIssue({\n code: \"custom\",\n path: [\"offset\"],\n message: `a ${d.kind} dimension needs offset`,\n });\n if (d.kind !== \"linear\" && d.rotation !== undefined)\n ctx.addIssue({\n code: \"custom\",\n path: [\"rotation\"],\n message: \"rotation applies to linear dimensions only\",\n });\n};\n\nexport const DimensionSchema =\n DimensionShapeSchema.superRefine(dimensionRefinement);\nexport type Dimension = z.infer<typeof DimensionSchema>;\n\n/** The label `content` a kind shows when none is set. */\nexport const DIM_DEFAULT_CONTENT: Record<Dimension[\"kind\"], string> = {\n linear: DIM_VALUE_TOKEN,\n angular: `${DIM_VALUE_TOKEN}°`,\n radial: `R${DIM_VALUE_TOKEN}`,\n diameter: `Ø${DIM_VALUE_TOKEN}`,\n};\n\nexport const BlockSchema = ObjectBaseSchema.extend({\n type: z.literal(\"block\"),\n definitionId: z.string(),\n /** Applied LAST, about the pivot (the first point input). */\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n /** Per-instance parameter values (merged over the definition defaults). */\n params: z\n .record(\n z.string(),\n z.union([\n z.number(),\n z.string(),\n z.boolean(),\n // numberList / stringList parameters.\n z.array(z.number()),\n z.array(z.string()),\n ]),\n )\n .default({}),\n /**\n * The values the script's `place` acquired at insertion, in pick\n * order: points in WORLD coords, or referenced object ids (strings —\n * phase 2). The first point is the instance's PIVOT — it plays the role\n * of the insertion point: `draw` receives inputs localized against it,\n * rotation/scale apply about it, and it snaps as an endpoint.\n * Transforms map the points and the script recomputes, which is what\n * makes mirror correct for script-derived geometry.\n */\n inputs: z.array(z.union([Vec2Schema, z.string()])).default([]),\n});\nexport type Block = z.infer<typeof BlockSchema>;\n\n/**\n * Review note pinned to a point. Pure editor chrome: the EDITOR paints it as\n * a screen-fixed speech-bubble marker (lucide MessageCircle outline, tail tip\n * at `position`) and hit-tests it in screen scale — there is no shared-path\n * painter, so comments never reach PDF/SVG/PNG exports or viewport\n * projections, and DXF export skips them explicitly.\n */\nexport const CommentSchema = ObjectBaseSchema.extend({\n type: z.literal(\"comment\"),\n /** Tail tip of the bubble (world/sheet mm). */\n position: Vec2Schema,\n text: z.string().default(\"\"),\n tags: z.array(z.string()).default([]),\n});\nexport type Comment = z.infer<typeof CommentSchema>;\n\n/** A raw cell as written: a bare string is its content, and the pre-v22\n * `text` key (old files, block scripts, agents) reads as `content`. */\nconst cellInput = (v: unknown): unknown => {\n if (typeof v === \"string\") return { content: v };\n if (v && typeof v === \"object\" && \"text\" in v && !(\"content\" in v)) {\n const { text, ...rest } = v as Record<string, unknown>;\n return { ...rest, content: text };\n }\n return v;\n};\n\n/** One table cell (docs/table-object.md). Style keys absent = the table's,\n * then the document text style. */\nexport const TableCellSchema = z.object({\n /** Plain text; \"\\n\" = line break. Long lines wrap at the cell width.\n * (Named `text` before document v22 — still read, see `cellInput`.) */\n content: z.string().default(\"\"),\n /** Character formatting over `content` (core/table.ts `cellWithContent`\n * keeps it consistent when the content changes). */\n spans: z.array(TextSpanSchema).optional(),\n /** Merge, set on the ANCHOR (top-left) cell. Covered cells stay in the\n * grid with their content ignored — AutoCAD's model. */\n span: z\n .object({\n cols: z.number().int().min(1),\n rows: z.number().int().min(1),\n })\n .optional(),\n /** Where the text sits in the cell; absent = left / center. */\n hAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n vAlign: z.enum([\"top\", \"center\", \"bottom\"]).optional(),\n styleId: z.string().optional(),\n styleOverride: TextStyleOverrideSchema.optional(),\n /** Text color; absent = the table's. */\n color: ColorSchema.optional(),\n});\nexport type TableCell = z.infer<typeof TableCellSchema>;\n\n/**\n * A table: a grid of text cells hanging right/down from `position` (the\n * top-left corner). Sizes are sheet mm before `scale`, like text. Rows grow\n * to fit their wrapped text (`minHeight` is the floor); the derived geometry\n * — rules + one text per cell, in world space — comes from paint/tableLayout\n * and feeds every consumer (painter, snapping, DXF).\n */\n/** The table's fields without the grid refinement — block children reuse\n * it (zod cannot `.omit()` a refined object; same split as dimensions). */\nexport const TableShapeSchema = ObjectBaseSchema.extend({\n type: z.literal(\"table\"),\n position: Vec2Schema,\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n /** Column widths (mm). */\n columns: z.array(z.number().positive()).min(1),\n /** Per-row settings. Input may give a row COUNT (all auto-height). */\n rows: z.preprocess(\n (v) => (typeof v === \"number\" ? Array.from({ length: v }, () => ({})) : v),\n z.array(z.object({ minHeight: z.number().positive().optional() })).min(1),\n ),\n /** Row-major: `cells[row][column]`, exactly rows × columns. Input may\n * give a cell as a plain string (= `{ text }`). */\n cells: z.array(\n z.array(\n z.preprocess(cellInput, TableCellSchema),\n ),\n ),\n /** Rows above the heavier header rule. */\n headerRows: z.number().int().min(0).default(0),\n /** Text inset from the cell edges (mm). */\n cellMargin: z.number().min(0).default(1),\n borders: z.enum([\"all\", \"outer\", \"rows\", \"none\"]).default(\"all\"),\n /** Document text style for every cell (cells may override). */\n styleId: z.string().optional(),\n styleOverride: TextStyleOverrideSchema.optional(),\n});\n/** Grid consistency: cells are rows × columns and merges tile the grid. */\nexport const tableRefinement = (\n t:\n | z.infer<typeof TableShapeSchema>\n | Omit<z.infer<typeof TableShapeSchema>, \"id\" | \"layerId\">,\n ctx: z.RefinementCtx,\n): void => {\n const issue = (message: string) => ctx.addIssue({ code: \"custom\", message });\n const nr = t.rows.length;\n const nc = t.columns.length;\n if (t.cells.length !== nr || t.cells.some((row) => row.length !== nc)) {\n issue(`cells must be ${nr} rows × ${nc} columns`);\n return;\n }\n // Every grid slot is covered by at most one merge, inside the grid.\n const owner: (string | null)[][] = t.cells.map((row) => row.map(() => null));\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n const s = cell.span;\n if (!s || (s.cols === 1 && s.rows === 1)) return;\n if (r + s.rows > nr || c + s.cols > nc) {\n issue(`cell ${r},${c}: span leaves the grid`);\n return;\n }\n for (let i = r; i < r + s.rows; i++)\n for (let j = c; j < c + s.cols; j++) {\n if (owner[i][j]) issue(`cell ${i},${j}: overlapping merges`);\n owner[i][j] = `${r},${c}`;\n }\n }),\n );\n};\nexport const TableSchema = TableShapeSchema.superRefine(tableRefinement);\nexport type Table = z.infer<typeof TableSchema>;\n\n/** The instance's pivot: its first point input, or the origin if none. */\nexport const blockPivot = (b: Block): { x: number; y: number } => {\n for (const v of b.inputs) if (typeof v !== \"string\") return v;\n return { x: 0, y: 0 };\n};\n\n/**\n * Paper-space window into model space (DXF VIEWPORT). Only meaningful inside\n * a layout's object collection — never in model space or block children.\n */\nexport const ViewportSchema = ObjectBaseSchema.extend({\n type: z.literal(\"viewport\"),\n /** Placement on the sheet, mm, origin bottom-left of sheet. */\n rect: z.object({\n x: z.number(),\n y: z.number(),\n w: z.number().positive(),\n h: z.number().positive(),\n }),\n /** World point shown at the center of the rect. */\n modelCenter: Vec2Schema.default({ x: 0, y: 0 }),\n /** Drawing-scale denominator (model mm per paper mm); 1:50 => 50. */\n scale: z.number().positive().default(1),\n /** Pinned: no pan/zoom-through, no move/resize grips. */\n locked: z.boolean().default(false),\n hiddenLayerIds: z.array(z.string()).default([]),\n});\nexport type Viewport = z.infer<typeof ViewportSchema>;\n\n/**\n * Raster reference (uploaded PNG/JPEG, or a PDF page rasterized at import).\n * The pixels live in the document's `assets` map (data URL, content-hash\n * keyed — instances of the same image share one entry); the object is just\n * the placement. No DXF mapping (DXF IMAGE references external files) — the\n * exporter skips it explicitly.\n */\nexport const ImageSchema = ObjectBaseSchema.extend({\n type: z.literal(\"image\"),\n /** Key into `document.assets`. */\n assetId: z.string(),\n /** Bottom-left corner (world/sheet mm) — rotation pivots here. */\n origin: Vec2Schema,\n width: z.number().positive(),\n height: z.number().positive(),\n /** Radians CCW about `origin`. */\n rotation: z.number().default(0),\n // (opacity moved to ObjectBaseSchema — every object paints with it now;\n // documents that stored it per-image parse unchanged.)\n});\nexport type ImageObject = z.infer<typeof ImageSchema>;\n\n/** File formats a reference can link (docs/references.md). */\nexport const REFERENCE_FORMATS = [\n \"linea\",\n \"dxf\",\n \"dwg\",\n \"pdf\",\n \"png\",\n \"jpg\",\n] as const;\nexport type ReferenceFormat = (typeof REFERENCE_FORMATS)[number];\n\n/**\n * Where a reference's file lives. `path`: stored relative to the document's\n * folder when inside it (POSIX separators), else absolute; on the web, where\n * paths can't be read, the file's NAME plus `cacheKey` — this browser's copy\n * of the bytes. `url`: fetched.\n */\nexport const ReferenceSourceSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"path\"),\n path: z.string().min(1),\n cacheKey: z.string().min(1).optional(),\n }),\n z.object({ kind: z.literal(\"url\"), url: z.string().url() }),\n]);\nexport type ReferenceSource = z.infer<typeof ReferenceSourceSchema>;\n\n/**\n * A LINKED file drawn in place (an xref): the document holds this record,\n * never the file. The file's model space lands with its origin at\n * `position`, rotated, scaled and optionally mirrored (about its X axis).\n */\nexport const ReferenceSchema = ObjectBaseSchema.extend({\n type: z.literal(\"reference\"),\n format: z.enum(REFERENCE_FORMATS),\n name: z.string().min(1),\n source: ReferenceSourceSchema,\n position: Vec2Schema,\n /** Radians CCW about `position`. */\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n mirrored: z.boolean().optional(),\n /** PDF: the 1-based page drawn, and how (vector lines + text / raster). */\n pdfPage: z.number().int().positive().optional(),\n pdfMode: z.enum([\"vector\", \"raster\"]).optional(),\n /** The FILE's layers not drawn, by name (stable across reloads). */\n hiddenLayers: z.array(z.string()).default([]),\n /** Switched off in the References panel: not drawn, picked or snapped. */\n hidden: z.boolean().optional(),\n /** Locked in the References panel: drawn and snapped, but never hovered\n * or picked on the canvas — select it from the panel instead. */\n locked: z.boolean().optional(),\n /** Crop rectangle in FILE coordinates: only content inside is drawn and\n * snapped (AutoCAD's XCLIP, rectangular). */\n clip: z\n .object({\n minX: z.number(),\n minY: z.number(),\n maxX: z.number(),\n maxY: z.number(),\n })\n .optional(),\n /**\n * The content's bounds in file coordinates, recorded on each successful\n * load: a missing file still has a frame to draw, pick and snap to.\n */\n extent: z\n .object({\n minX: z.number(),\n minY: z.number(),\n maxX: z.number(),\n maxY: z.number(),\n })\n .optional(),\n});\nexport type ReferenceObject = z.infer<typeof ReferenceSchema>;\n\n/**\n * The property clipboard's cross-type transferable look: the shared\n * ObjectBase style fields. Never `id`, never geometry. There are NO per-type\n * property schemas — the clipboard payload is validated as a whole document\n * and apply only copies values between already-valid objects, so all that's\n * needed is these key lists (typed against the model so a renamed field\n * fails the compile). See docs/clipboard-copy-paste.md.\n */\nexport const BASE_PROPERTY_KEYS = [\n \"color\",\n \"lineType\",\n \"lineTypeScale\",\n \"lineWidth\",\n \"opacity\",\n] as const satisfies readonly (keyof ObjectBase)[];\n\n/**\n * Type-specific look keys — transfer ONLY between objects of the SAME type\n * (shared key names lie across types: text/dimension `styleId` index\n * different style arrays; `scale` means pattern spacing / annotation size /\n * instance scale depending on type). Types not listed transfer base keys\n * only.\n */\nexport const EXTRA_PROPERTY_KEYS: {\n [K in ModelObjectType]?: readonly (keyof Extract<ModelObject, { type: K }>)[];\n} = {\n text: [\"hAlign\", \"vAlign\", \"frame\", \"styleId\", \"styleOverride\", \"scale\"],\n dimension: [\"styleId\", \"styleOverride\", \"scale\"],\n hatch: [\"fill\", \"scale\"],\n};\n\nexport const ModelObjectSchema = z.discriminatedUnion(\"type\", [\n PointSchema,\n LineSchema,\n PolylineSchema,\n CircleSchema,\n ArcSchema,\n EllipseSchema,\n HatchSchema,\n TextSchema,\n DimensionSchema,\n BlockSchema,\n ImageSchema,\n ViewportSchema,\n CommentSchema,\n TableSchema,\n ReferenceSchema,\n]);\nexport type ModelObject = z.infer<typeof ModelObjectSchema>;\nexport type ModelObjectType = ModelObject[\"type\"];\n\n/** An object before an id is assigned (creation input). */\nexport type ModelObjectDto = {\n [K in ModelObjectType]: Omit<Extract<ModelObject, { type: K }>, \"id\">;\n}[ModelObjectType];\n","// The bundled font registry. Documents store font NAMES (ids), never font\n// data — same model as DXF/DWG, where a text style references \"arial.ttf\"\n// and missing fonts substitute. Unknown ids resolve to the default font for\n// display but are preserved in the model, so foreign names round-trip.\n// Background + the full design: docs/fonts.md.\n\nexport type FontId =\n | \"arial\"\n | \"osifont\"\n | \"osifont-italic\"\n | \"jetbrains-mono\"\n | \"source-serif\"\n | \"roboto-condensed\"\n | \"noto-sans\"\n | \"architects-daughter\"\n | \"comic-neue\";\n\nexport interface FontDef {\n id: FontId;\n /** User-facing name (property panel, dialogs). */\n label: string;\n /** CSS font-family stack for canvas/SVG rendering. */\n cssStack: string;\n /**\n * Cap height as a fraction of the em (OS/2 sCapHeight / unitsPerEm).\n * Text heights in the model are CAP heights (CAD convention: 2.5 mm text\n * has 2.5 mm capitals), so sinks set the font size to height/capHeight.\n */\n capHeight: number;\n /** STYLE table font file name (group 3) for DXF export. */\n dxfFontFile: string;\n /**\n * PDF strategy: a jsPDF built-in font name, or \"embed\" (the exporting\n * host must register the TTF via addFileToVFS/addFont under this font's\n * id before rendering).\n */\n pdf: \"helvetica\" | \"embed\";\n}\n\nexport const DEFAULT_FONT: FontId = \"arial\";\n\nexport const FONTS: Record<FontId, FontDef> = {\n arial: {\n id: \"arial\",\n label: \"Arial\",\n // Liberation Sans is the metric-compatible substitute on Linux.\n cssStack: \"Arial, 'Liberation Sans', 'Helvetica Neue', sans-serif\",\n capHeight: 1467 / 2048, // Arial OS/2 metrics\n dxfFontFile: \"arial.ttf\",\n // Embedded as Liberation Sans (SIL OFL, advance-identical to Arial, full\n // Cyrillic) so PDFs are self-contained and non-WinAnsi text survives.\n // When the host registers no TTF, the sink degrades to base-14 Helvetica\n // exactly as before.\n pdf: \"embed\",\n },\n osifont: {\n id: \"osifont\",\n label: \"osifont (ISO 3098)\",\n cssStack: \"osifont, Arial, sans-serif\",\n capHeight: 0.7397, // gen:fonts, from the bundled TTF\n dxfFontFile: \"osifont.ttf\",\n pdf: \"embed\",\n },\n \"osifont-italic\": {\n id: \"osifont-italic\",\n label: \"osifont Italic (ISO 3098)\",\n // Registered under its own family name; italic osifont text resolves\n // here (fontFace). The SVG sink adds font-style=\"italic\" so resvg, which\n // matches the TTF family \"osifont\", picks this file too.\n cssStack: \"'osifont-italic', osifont, Arial, sans-serif\",\n capHeight: 0.7397, // gen:fonts, from the bundled TTF\n dxfFontFile: \"osifont-italic.ttf\",\n pdf: \"embed\",\n },\n \"jetbrains-mono\": {\n id: \"jetbrains-mono\",\n label: \"JetBrains Mono\",\n cssStack: \"'JetBrains Mono', Consolas, monospace\",\n capHeight: 0.73, // gen:fonts, from the bundled TTF\n dxfFontFile: \"JetBrainsMono-Regular.ttf\",\n pdf: \"embed\",\n },\n \"source-serif\": {\n id: \"source-serif\",\n label: \"Source Serif 4\",\n cssStack: \"'Source Serif 4', Georgia, 'Times New Roman', serif\",\n capHeight: 0.67, // gen:fonts, from the bundled TTF\n dxfFontFile: \"SourceSerif4-Regular.ttf\",\n pdf: \"embed\",\n },\n \"roboto-condensed\": {\n id: \"roboto-condensed\",\n label: \"Roboto Condensed\",\n cssStack: \"'Roboto Condensed', 'Arial Narrow', Arial, sans-serif\",\n capHeight: 0.7109, // gen:fonts, from the bundled TTF\n dxfFontFile: \"RobotoCondensed-Regular.ttf\",\n pdf: \"embed\",\n },\n \"noto-sans\": {\n id: \"noto-sans\",\n label: \"Noto Sans\",\n cssStack: \"'Noto Sans', Arial, sans-serif\",\n capHeight: 0.714, // gen:fonts, from the bundled TTF\n dxfFontFile: \"NotoSans-Regular.ttf\",\n pdf: \"embed\",\n },\n \"architects-daughter\": {\n id: \"architects-daughter\",\n label: \"Architects Daughter\",\n cssStack: \"'Architects Daughter', 'Comic Sans MS', cursive\",\n capHeight: 0.6592, // gen:fonts, from the bundled TTF\n dxfFontFile: \"ArchitectsDaughter-Regular.ttf\",\n pdf: \"embed\",\n },\n \"comic-neue\": {\n id: \"comic-neue\",\n label: \"Comic Neue\",\n cssStack: \"'Comic Neue', 'Comic Sans MS', cursive\",\n capHeight: 0.67, // gen:fonts, from the bundled TTF\n dxfFontFile: \"ComicNeue-Regular.ttf\",\n pdf: \"embed\",\n },\n};\n\n// ---- faces (bold / italic) ---------------------------------------------------\n//\n// The model stores `font` plus `bold` / `italic` flags; everything downstream\n// of style resolution (measurers, sinks, exporters) receives ONE face string\n// in place of the bare font id: \"arial\", \"arial;b\", \"arial;i\", \"arial;bi\".\n// Code that only needs the font definition keeps calling resolveFont (it\n// strips the suffix); the style-aware places — canvas font string, measurer\n// tables, PDF face selection, SVG attributes, DXF STYLE flags — read it back\n// with parseFontFace.\n\n/** Font id + style → face string. osifont's italic is its own bundled face,\n * so italic osifont resolves to \"osifont-italic\" rather than a flag. */\nexport const fontFace = (\n font: string | undefined,\n bold = false,\n italic = false,\n): string | undefined => {\n let id = font;\n let i = italic;\n if (italic && resolveFont(font).id === \"osifont\") {\n id = \"osifont-italic\";\n i = false;\n }\n const suffix = (bold ? \"b\" : \"\") + (i ? \"i\" : \"\");\n return suffix ? `${id ?? DEFAULT_FONT};${suffix}` : id;\n};\n\n/** Face string → font id + style flags (the inverse of fontFace). */\nexport const parseFontFace = (\n face?: string,\n): { font: string | undefined; bold: boolean; italic: boolean } => {\n const at = face?.indexOf(\";\") ?? -1;\n if (!face || at === -1) return { font: face, bold: false, italic: false };\n const suffix = face.slice(at + 1);\n return {\n font: face.slice(0, at),\n bold: suffix.includes(\"b\"),\n italic: suffix.includes(\"i\"),\n };\n};\n\n/** Styled faces with their own bundled TTF (real bold / italic outlines).\n * Every other styled face is SYNTHESIZED by the sink from the regular one\n * (canvas: the browser; PDF: fill+stroke / skew), so all outputs agree. */\nexport const REAL_FACES: ReadonlySet<string> = new Set([\n \"arial;b\",\n \"arial;i\",\n \"arial;bi\",\n]);\n\n/** The face key a styled face renders with: itself when bundled (REAL_FACES),\n * else null (synthesized from the regular font). */\nexport const realFace = (face?: string): string | null => {\n const { font, bold, italic } = parseFontFace(face);\n if (!bold && !italic) return null;\n const key = `${resolveFont(font).id};${bold ? \"b\" : \"\"}${italic ? \"i\" : \"\"}`;\n return REAL_FACES.has(key) ? key : null;\n};\n\n/** Known id (or face string) → its definition; unknown/absent → the default\n * font. */\nexport const resolveFont = (font?: string): FontDef => {\n const id = font?.includes(\";\") ? font.slice(0, font.indexOf(\";\")) : font;\n return (id && FONTS[id as FontId]) || FONTS[DEFAULT_FONT];\n};\n\n/** TrueType typeface (family) name — the first family of the CSS stack.\n * The DXF export writes it as the STYLE record's ACAD xdata so CAD apps\n * resolve installed fonts by FAMILY instead of our bundle's file names. */\nexport const fontTypeface = (def: FontDef): string =>\n def.cssStack.split(\",\")[0].replace(/[\"']/g, \"\").trim();\n\n/** Font picker entries. osifont-italic is left out: osifont + the Italic\n * toggle IS that face (fontFace); stored values still resolve and show. */\nexport const FONT_OPTIONS: { value: FontId; label: string }[] = Object.values(\n FONTS,\n)\n .filter((f) => f.id !== \"osifont-italic\")\n .map((f) => ({ value: f.id, label: f.label }));\n\n/**\n * DXF STYLE record → the font it renders in here (docs/fonts.md §8.5). The\n * record names a font FILE (group 3) and, when AutoCAD wrote it, the\n * TrueType family (ACAD xdata 1000); either resolves a bundled font by its\n * own file / typeface, then by family heuristics (narrow → Roboto\n * Condensed, mono → JetBrains Mono, serif → Source Serif, comic → Comic\n * Neue). SHX stroke fonts all read as ISO lettering (osifont — `italic*`\n * faces slanted). Windows' Arial face files (arialbd/ariali/arialbi) keep\n * their bold/italic. An unknown TrueType family is PRESERVED as the font\n * id: it renders in the default and round-trips by name.\n */\n/** AutoCAD's stock stroke fonts, by file stem. */\nconst SHX_STEMS: ReadonlySet<string> = new Set([\n \"txt\",\n \"monotxt\",\n \"simplex\",\n \"complex\",\n \"romans\",\n \"romand\",\n \"romanc\",\n \"romant\",\n \"italic\",\n \"italicc\",\n \"italict\",\n \"scripts\",\n \"scriptc\",\n \"gothice\",\n \"gothicg\",\n \"gothici\",\n \"greeks\",\n \"greekc\",\n \"isocp\",\n \"isocp2\",\n \"isocp3\",\n \"isoct\",\n \"isoct2\",\n \"isoct3\",\n \"iso\",\n \"amgdt\",\n \"gdt\",\n \"symap\",\n \"syastro\",\n \"symath\",\n \"symeteo\",\n \"symusic\",\n \"bigfont\",\n \"ltypeshp\",\n \"swiss\",\n \"swissb\",\n \"swissi\",\n \"swissbi\",\n \"sansserif\",\n \"sanss\",\n \"sansserifb\",\n \"sanssb\",\n \"arc\",\n \"ic-romans\",\n \"ic-simplex\",\n \"txtalt\",\n]);\n\nexport const fontFromDxfStyle = (\n fontFile: string | undefined,\n typeface?: string,\n): { font: string; bold?: true; italic?: true } => {\n const file = (fontFile ?? \"\").trim();\n const stem = file.replace(/\\.[a-z0-9]+$/i, \"\").toLowerCase();\n const family = (typeface ?? \"\").trim();\n const familyLower = family.toLowerCase();\n for (const def of Object.values(FONTS)) {\n if (\n (file && def.dxfFontFile.toLowerCase() === file.toLowerCase()) ||\n (familyLower && fontTypeface(def).toLowerCase() === familyLower)\n )\n // osifont's italic is a face of its own in the registry; the model's\n // authoring form is osifont + italic (fontFace maps it back).\n return def.id === \"osifont-italic\"\n ? { font: \"osifont\", italic: true }\n : { font: def.id };\n }\n const arialFace = /^arial(bd|bi|i)$/.exec(stem);\n if (arialFace)\n return {\n font: \"arial\",\n ...(arialFace[1].includes(\"b\") ? { bold: true as const } : {}),\n ...(arialFace[1].includes(\"i\") ? { italic: true as const } : {}),\n };\n const key = `${familyLower} ${stem}`;\n if (/narrow|condensed|arialn/.test(key)) return { font: \"roboto-condensed\" };\n if (/mono|courier|\\bcour\\b|consola|lucon|menlo/.test(key))\n return { font: \"jetbrains-mono\" };\n if (/times|georgia|cambria|garamond|serif|\\bbook/.test(key))\n return { font: \"source-serif\" };\n if (/comic/.test(key)) return { font: \"comic-neue\" };\n // SHX by extension, or by name — DWG transcodes drop the extension.\n if (/\\.shx$/i.test(file) || (!file && !family) || SHX_STEMS.has(stem))\n return {\n font: \"osifont\",\n ...(/italic/.test(stem) ? { italic: true as const } : {}),\n };\n // Unknown TrueType: keep the name (family when AutoCAD wrote it).\n return { font: family || stem };\n};\n","// Named line types — the .lin dash model. A line type is a repeating\n// sequence of dash lengths: >0 pen-down, <0 gap, 0 dot. Lengths are mm PER\n// 1 MM OF LINE WIDTH — the paint layer multiplies them by the resolved\n// lineweight (ISO 128 style: pattern size tracks stroke weight), so a\n// 0.25 mm line gets quarter-size dashes. The curated set\n// (continuous/dashed/…) is kept for back-compat and takes precedence; the\n// built-in catalogue (builtin.lin — DXF-compatible LTYPE names, standards-\n// derived dash data) is embedded and merged in by name.\n//\n// Objects/layers store a line type by NAME (a plain string, resolved here);\n// unknown names fall back to continuous at paint time — mirrors hatchPatterns.\n\nimport { z } from \"zod\";\nimport { BUILTIN_LIN } from \"./builtinLin\";\n\nexport interface LinePattern {\n /** Canonical name as stored on objects/layers (curated names are lowercase). */\n name: string;\n /** Human label for the dropdown. */\n label: string;\n /**\n * Signed dash sequence, mm per 1 mm of line width: >0 dash, <0 gap, 0 dot.\n * Empty = continuous (no dashing).\n */\n dashesMm: number[];\n /** DXF LTYPE name for export (defaults to the catalogue name). */\n dxfName?: string;\n /**\n * Resolvable and DXF-exported but not offered in pickers — the catalogue's\n * `NAME2` (half) / `NAMEX2` (double) scale variants, which lineTypeScale\n * makes redundant as picker entries.\n */\n hidden?: boolean;\n}\n\n/**\n * Parse acad .lin text. Each entry is a `*NAME,description` header followed by\n * an `A,d1,d2,…` definition line (alignment code + signed dash lengths).\n * Dash lengths are taken as world mm (builtin.lin is already mm). Complex\n * linetypes (embedded shapes/text in `[...]`) are skipped — we can't render\n * SHX shapes, and dropping the shape would misrepresent them.\n */\nexport interface ParsedLinePattern {\n name: string;\n description?: string;\n dashesMm: number[];\n}\n\nexport const parseLinDefinitions = (text: string): ParsedLinePattern[] => {\n const out: ParsedLinePattern[] = [];\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line.startsWith(\"*\")) continue;\n const comma = line.indexOf(\",\");\n const name = (comma >= 0 ? line.slice(1, comma) : line.slice(1)).trim();\n const description = comma >= 0 ? line.slice(comma + 1).trim() : undefined;\n // The definition is the next non-blank, non-comment line.\n let j = i + 1;\n while (j < lines.length) {\n const d = lines[j].trim();\n if (d && !d.startsWith(\";\")) break;\n j++;\n }\n if (j >= lines.length) break;\n const def = lines[j].trim();\n if (def.startsWith(\"*\")) continue; // header with no body → skip\n i = j;\n if (def.includes(\"[\") || def.includes('\"')) continue; // complex → skip\n const tokens = def.split(\",\").map((t) => t.trim());\n // tokens[0] is the alignment code (always \"A\"); the rest are dash lengths.\n const nums = tokens\n .slice(1)\n .filter((t) => t.length > 0)\n .map(Number);\n if (nums.some((n) => Number.isNaN(n))) continue;\n out.push({ name, description, dashesMm: nums });\n }\n return out;\n};\n\n// Curated set — the historical defaults. Stored signed so they render exactly\n// as before (the render conversion turns 0 into a visible dot). These win over\n// the catalogue on name collision.\nconst CURATED: LinePattern[] = [\n { name: \"continuous\", label: \"Continuous\", dashesMm: [] },\n {\n name: \"dashed\",\n label: \"Dashed\",\n dashesMm: [12.7, -6.35],\n dxfName: \"DASHED\",\n },\n { name: \"dotted\", label: \"Dotted\", dashesMm: [0, -6.35], dxfName: \"DOT\" },\n {\n name: \"dashdot\",\n label: \"Dash-dot\",\n dashesMm: [12.7, -6.35, 0, -6.35],\n dxfName: \"DASHDOT\",\n },\n {\n name: \"center\",\n label: \"Center\",\n dashesMm: [31.75, -6.35, 6.35, -6.35],\n dxfName: \"CENTER\",\n },\n {\n name: \"hidden\",\n label: \"Hidden\",\n dashesMm: [6.35, -3.175],\n dxfName: \"HIDDEN\",\n },\n {\n name: \"phantom\",\n label: \"Phantom\",\n dashesMm: [31.75, -6.35, 6.35, -6.35, 6.35, -6.35],\n dxfName: \"PHANTOM\",\n },\n {\n name: \"border\",\n label: \"Border\",\n dashesMm: [12.7, -6.35, 12.7, -6.35, 0, -6.35],\n dxfName: \"BORDER\",\n },\n {\n name: \"divide\",\n label: \"Divide\",\n dashesMm: [12.7, -6.35, 0, -6.35, 0, -6.35],\n dxfName: \"DIVIDE\",\n },\n];\n\n// Fold the separator drift between .lin names, the DXF table, and AutoCAD\n// output (hyphens/dots/spaces → `_`) so lookups resolve regardless of style.\nconst normalizeName = (name: string): string =>\n name\n .trim()\n .toUpperCase()\n .replace(/[\\s.-]+/g, \"_\");\n\n/**\n * ~26-char ASCII depiction of a dash cycle, generated from the data itself so\n * it can never lie: >0 → underscores, <0 → spaces, 0 → a dot. Scaled per\n * pattern (longest element ≈ 5 chars) so long/short contrast survives both\n * the fine curated dashes and the coarse catalogue ones. Empty = solid line.\n */\nconst asciiPreview = (dashesMm: number[]): string => {\n const WIDTH = 15;\n if (!dashesMm.length) return \"_\".repeat(WIDTH * 0.8);\n const unit = Math.max(1.5875, Math.max(...dashesMm.map(Math.abs)) / 5);\n let out = \"\";\n while (out.length < WIDTH) {\n for (const d of dashesMm) {\n const n = Math.max(1, Math.min(10, Math.round(Math.abs(d) / unit)));\n out += d > 0 ? \"_\".repeat(n) : d < 0 ? \" \".repeat(n) : \".\";\n if (out.length >= WIDTH) break;\n }\n }\n return out.slice(0, WIDTH).trimEnd();\n};\n\n/** name → label without the ASCII preview (the pickers draw an SVG one). */\nconst PLAIN_LABELS: Record<string, string> = {};\n\n/** Label exported as the DXF LTYPE description. */\nconst withPreview = (p: LinePattern): LinePattern => {\n PLAIN_LABELS[p.name] = p.label;\n return { ...p, label: `${p.label} ${asciiPreview(p.dashesMm)}` };\n};\n\nconst BUILT_IN: LinePattern[] = CURATED.map(withPreview);\nconst BY_NAME = new Map(BUILT_IN.map((p) => [normalizeName(p.name), p]));\nfor (const p of parseLinDefinitions(BUILTIN_LIN)) {\n const key = normalizeName(p.name);\n if (BY_NAME.has(key)) continue; // curated precedence + dedup\n const pattern = withPreview({\n name: p.name,\n label: p.description || p.name,\n dashesMm: p.dashesMm,\n dxfName: p.name,\n });\n BY_NAME.set(key, pattern);\n BUILT_IN.push(pattern);\n}\n\n// Hide the .lin scale-variant convention (NAME2 = half, NAMEX2 = double) from\n// pickers: lineTypeScale covers scaling, so the variants are clutter there —\n// but they stay resolvable so imported DXF, old documents, and round-trips\n// keep rendering with their exact catalogue dashes.\nconst scaleVariantBase = (name: string): string | undefined => {\n if (/x2$/i.test(name)) return name.slice(0, -2);\n if (/2$/.test(name)) return name.slice(0, -1);\n return undefined;\n};\nfor (const p of BUILT_IN) {\n const base = scaleVariantBase(p.name);\n const target = base ? BY_NAME.get(normalizeName(base)) : undefined;\n if (target && target !== p) p.hidden = true;\n}\n\n/** Ordered picker line-type names (hidden scale variants excluded). */\nexport const LINE_TYPE_NAMES: string[] = BUILT_IN.filter((p) => !p.hidden).map(\n (p) => p.name,\n);\n\n/**\n * Every definition including hidden scale variants — DXF export emits them\n * all so any LTYPE a document references stays defined.\n */\nexport const LINE_TYPE_DEFS: readonly LinePattern[] = BUILT_IN;\n\n/** name → display label (covers hidden entries so stored values still show). */\nexport const LINE_TYPE_LABELS: Record<string, string> = PLAIN_LABELS;\n\n/** Default line type (solid). */\nexport const DEFAULT_LINE_TYPE = \"continuous\";\n\n/** Resolve a line-type name (case- and punctuation-insensitive) to its definition. */\nexport const getLineType = (name: string): LinePattern | undefined =>\n BY_NAME.get(normalizeName(name));\n\n/**\n * Render dash array (canvas/PDF style: all-positive mm, a 0-length dot becomes\n * a short 0.1 mm mark that reads as a dot with round caps). undefined = a solid\n * (continuous) line.\n */\nexport const renderDashes = (pattern: LinePattern): number[] | undefined =>\n pattern.dashesMm.length\n ? pattern.dashesMm.map((v) => (v === 0 ? 0.1 : Math.abs(v)))\n : undefined;\n\n// ---- document-defined line types --------------------------------------------\n//\n// A document may carry its own named line types (`document.lineTypes`): the\n// definitions a DXF/DWG file brought along, or ones a user imported from a\n// .lin file. Same dash model and the same per-mm-of-width convention as the\n// catalogue; objects and layers keep referencing by NAME. Resolution:\n// document first (a document entry shadows a catalogue name — the file's own\n// table is authoritative for that file), then the built-in catalogue.\n\nexport const LineTypeSchema = z.object({\n /** Stored on objects/layers as `lineType`; case-insensitive, unique per\n * document. */\n name: z.string().min(1),\n description: z.string().optional(),\n /** Signed dash cycle, mm per 1 mm of line width: >0 dash, <0 gap, 0 dot.\n * Empty = continuous. */\n dashesMm: z.array(z.number()),\n});\nexport type LineType = z.infer<typeof LineTypeSchema>;\n\n/** The key two line type names compare by (case- and punctuation-insensitive,\n * like DXF LTYPE names). */\nexport const lineTypeKey = (name: string): string => normalizeName(name);\n\n/** A document line type as the catalogue's pattern shape. */\nexport const lineTypeAsPattern = (t: LineType): LinePattern => ({\n name: t.name,\n label: t.description ?? t.name,\n dashesMm: t.dashesMm,\n dxfName: t.name.toUpperCase(),\n});\n\n/** Name → definition: the document's own line types first, then the\n * built-in catalogue; undefined = unknown (paints continuous). */\nexport const resolveLineType = (\n name: string | undefined,\n lineTypes?: readonly LineType[],\n): LinePattern | undefined => {\n if (!name) return undefined;\n if (lineTypes && lineTypes.length > 0) {\n const key = normalizeName(name);\n const own = lineTypes.find((t) => normalizeName(t.name) === key);\n if (own) return lineTypeAsPattern(own);\n }\n return getLineType(name);\n};\n\n/** Objects (every space) and layers whose line type is `name`. */\nexport const lineTypeUsers = (\n doc: {\n objects: readonly { lineType?: string }[];\n layouts: readonly { objects: readonly { lineType?: string }[] }[];\n layers: readonly { lineType: string }[];\n },\n name: string,\n): { objects: number; layers: number } => {\n const key = normalizeName(name);\n const uses = (o: { lineType?: string }) =>\n o.lineType !== undefined && normalizeName(o.lineType) === key;\n let objects = doc.objects.filter(uses).length;\n for (const l of doc.layouts) objects += l.objects.filter(uses).length;\n return {\n objects,\n layers: doc.layers.filter((l) => normalizeName(l.lineType) === key).length,\n };\n};\n\n/** `.lin` text for document line types (acad format: `*NAME,description`\n * then `A,` + the signed dash lengths). */\nexport const formatLinDefinitions = (lineTypes: readonly LineType[]): string =>\n lineTypes\n .map(\n (t) =>\n `*${t.name},${t.description ?? \"\"}\\nA,${t.dashesMm.map((d) => +d.toFixed(6)).join(\",\")}\\n`,\n )\n .join(\"\");\n","// GENERATED — do not edit. Mirror of builtin.lin (the built-in line type\n// library, lengths in mm). Regenerate with:\n// npm run gen:linetypes -w @lineadraw/core\n\nexport const BUILTIN_LIN = `;; Linea built-in line type library.\n;;\n;; Format: .lin syntax - a \\`*NAME,description\\` header line followed by an\n;; \\`A,...\\` definition (alignment code, then signed dash lengths: >0 pen-down,\n;; <0 gap, 0 dot). All lengths are millimeters, sized for a 1 mm pen (ISO\n;; scaling); scale the line type to suit other pen widths.\n;;\n;; The dash sequences are functional interchange data, kept name- and\n;; value-compatible with the DXF LTYPE identifiers other CAD applications\n;; resolve: the general set follows long-standing drafting conventions, the\n;; ACAD_ISO* set implements the ISO 128 line types, and the JIS_* set\n;; follows JIS Z 8312. Descriptions and organization are Linea's own.\n;;\n;; After editing, regenerate the embedded TS mirror:\n;; npm run gen:linetypes -w @lineadraw/core\n;;\n\n;; ISO 128 line types (1 mm pen width base).\n\n*ACAD_ISO02W100,ISO 1\nA,12,-3\n*ACAD_ISO03W100,ISO 2\nA,12,-18\n*ACAD_ISO04W100,ISO 3\nA,24,-3,0,-3\n*ACAD_ISO05W100,ISO 4\nA,24,-3,0,-3,0,-3\n*ACAD_ISO06W100,ISO 5\nA,24,-3,0,-3,0,-3,0,-3\n*ACAD_ISO07W100,ISO 6\nA,0,-3\n*ACAD_ISO08W100,ISO 7\nA,24,-3,6,-3\n*ACAD_ISO09W100,ISO 8\nA,24,-3,6,-3,6,-3\n*ACAD_ISO10W100,ISO 9\nA,12,-3,0,-3\n*ACAD_ISO11W100,ISO 10\nA,12,-3,12,-3,0,-3\n*ACAD_ISO12W100,ISO 11\nA,12,-3,0,-3,0,-3\n*ACAD_ISO13W100,ISO 12\nA,12,-3,12,-3,0,-3,0,-3\n*ACAD_ISO14W100,ISO 13\nA,12,-3,0,-3,0,-3,0,-3\n*ACAD_ISO15W100,ISO 14\nA,12,-3,12,-3,0,-3,0,-3,0,-3\n\n;; JIS Z 8312 line types.\n\n*JIS_08_11,JIS 1SASEN11\nA,11,-.60,.60,-.60\n*JIS_08_15,JIS 1SASEN15\nA,15,-.75,.75,-.75\n*JIS_08_25,JIS 1SASEN25\nA,25,-1.125,.75,-1.125\n*JIS_08_37,JIS 1SASEN37\nA,37.5,-1.125,.75,-1.125\n*JIS_08_50,JIS 1SASEN50\nA,50,-1.125,.75,-1.125\n*JIS_02_0.7,JIS HIDDEN0.75\nA,.75,-.60\n*JIS_02_1.0,JIS HIDDEN01\nA,1,-1\n*JIS_02_1.2,JIS HIDDEN01.25\nA,1.25,-1.25\n*JIS_02_2.0,JIS HIDDEN02\nA,2,-1\n*JIS_02_4.0,JIS HIDDEN04\nA,4,-1.5\n*JIS_09_08,JIS 2SASEN8\nA,8,-.55,.55,-.55,.55,-.55\n*JIS_09_15,JIS 2SASEN15\nA,15,-.90,.60,-.90,.60,-.90\n*JIS_09_29,JIS 2SASEN29\nA,29,-1.2,.70,-1.2,.70,-1.2\n*JIS_09_50,JIS 2SASEN50\nA,50,-1.2,.70,-1.2,.70,-1.2\n`;\n","// Pure 2D vector math. World units are millimeters, angles are radians, Y is up.\n\nexport interface Vec2 {\n x: number;\n y: number;\n}\n\nexport const vec2 = (x: number, y: number): Vec2 => ({ x, y });\n\nexport const add = (a: Vec2, b: Vec2): Vec2 => ({ x: a.x + b.x, y: a.y + b.y });\nexport const sub = (a: Vec2, b: Vec2): Vec2 => ({ x: a.x - b.x, y: a.y - b.y });\nexport const scale = (a: Vec2, s: number): Vec2 => ({ x: a.x * s, y: a.y * s });\nexport const neg = (a: Vec2): Vec2 => ({ x: -a.x, y: -a.y });\n\nexport const dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n/** 2D cross product (z component of the 3D cross). Positive when b is CCW from a. */\nexport const cross = (a: Vec2, b: Vec2): number => a.x * b.y - a.y * b.x;\n\nexport const lenSq = (a: Vec2): number => a.x * a.x + a.y * a.y;\nexport const len = (a: Vec2): number => Math.hypot(a.x, a.y);\nexport const distSq = (a: Vec2, b: Vec2): number => lenSq(sub(b, a));\nexport const dist = (a: Vec2, b: Vec2): number =>\n Math.hypot(b.x - a.x, b.y - a.y);\n\n/** Normalize; returns the zero vector unchanged. */\nexport const norm = (a: Vec2): Vec2 => {\n const l = len(a);\n return l === 0 ? a : { x: a.x / l, y: a.y / l };\n};\n\nexport const lerp = (a: Vec2, b: Vec2, t: number): Vec2 => ({\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n});\n\nexport const mid = (a: Vec2, b: Vec2): Vec2 => lerp(a, b, 0.5);\n\n/** Angle of the vector from +X axis, CCW, in (-π, π]. */\nexport const angle = (a: Vec2): number => Math.atan2(a.y, a.x);\n\n/** Rotate a vector by an angle (radians, CCW). */\nexport const rot = (a: Vec2, angle: number): Vec2 => {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { x: a.x * c - a.y * s, y: a.x * s + a.y * c };\n};\n\n/** Rotate point p around center by angle (radians, CCW). */\nexport const rotAround = (p: Vec2, center: Vec2, angle: number): Vec2 =>\n add(center, rot(sub(p, center), angle));\n\n/** Perpendicular vector, 90° CCW. */\nexport const perp = (a: Vec2): Vec2 => ({ x: -a.y, y: a.x });\n\n/** Unit vector at the given angle. */\nexport const fromAngle = (angle: number): Vec2 => ({\n x: Math.cos(angle),\n y: Math.sin(angle),\n});\n\n/** Point at distance d from origin p in direction angle (polar). */\nexport const polar = (angle: number, d: number, p: Vec2): Vec2 => ({\n x: Math.cos(angle) * d + p.x,\n y: Math.sin(angle) * d + p.y,\n});\n\nexport const eq = (a: Vec2, b: Vec2, epsilon = 1e-9): boolean =>\n Math.abs(a.x - b.x) <= epsilon && Math.abs(a.y - b.y) <= epsilon;\n\n/** Normalize an angle into [0, 2π). */\nexport const normAngle = (angle: number): number => {\n const t = angle % (Math.PI * 2);\n return t < 0 ? t + Math.PI * 2 : t;\n};\n","// The text form of list parameters (`numberList` / `stringList`): what the\n// properties panel shows and parses, and how legacy string values of a list\n// parameter are read. Space-separated, like a command line:\n//\n// stringList [\"yes\", \"hello sir\"] ⇄ yes \"hello sir\"\n// double quotes group words; \\\" and \\\\ escape inside quotes\n// numberList [0, 7200, 7200] ⇄ 0 2*7200\n// Tekla-style `N*d` repeats d N times (runs format back to it);\n// a decimal comma is accepted (\"2,5\")\n//\n// Pure — no DOM, shared by the editor, headless callers and scripts' hosts.\n\nconst NUMBER = /^[+-]?(\\d+([.,]\\d*)?|[.,]\\d+)(e[+-]?\\d+)?$/i;\nconst REPEAT = /^(\\d+)\\*(.+)$/;\n\nconst parseNumber = (token: string): number | null =>\n NUMBER.test(token) ? Number(token.replace(\",\", \".\")) : null;\n\n/** \"0 2*7200\" → [0, 7200, 7200]; null when any token isn't a number. */\nexport const parseNumberList = (text: string): number[] | null => {\n const out: number[] = [];\n for (const token of text.trim().split(/\\s+/).filter(Boolean)) {\n const repeat = REPEAT.exec(token);\n const count = repeat ? Number(repeat[1]) : 1;\n const value = parseNumber(repeat ? repeat[2] : token);\n if (value === null || !Number.isFinite(value) || count < 1) return null;\n for (let i = 0; i < count; i++) out.push(value);\n }\n return out;\n};\n\n/** Shortest exact-enough decimal: no float noise (0.1 + 0.2 → \"0.3\"). */\nconst formatNumber = (n: number): string => String(Number(n.toPrecision(12)));\n\n/** [0, 7200, 7200] → \"0 2*7200\" (consecutive equal values become N*d). */\nexport const formatNumberList = (nums: readonly number[]): string => {\n const parts: string[] = [];\n for (let i = 0; i < nums.length;) {\n let j = i + 1;\n while (j < nums.length && nums[j] === nums[i]) j++;\n const n = formatNumber(nums[i]);\n parts.push(j - i > 1 ? `${j - i}*${n}` : n);\n i = j;\n }\n return parts.join(\" \");\n};\n\n/** 'yes \"hello sir\"' → [\"yes\", \"hello sir\"]; null on an unclosed quote. */\nexport const parseStringList = (text: string): string[] | null => {\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n if (/\\s/.test(text[i])) {\n i++;\n continue;\n }\n let item = \"\";\n if (text[i] === '\"') {\n i++;\n let closed = false;\n while (i < text.length) {\n const c = text[i++];\n if (c === \"\\\\\" && i < text.length) item += text[i++];\n else if (c === '\"') {\n closed = true;\n break;\n } else item += c;\n }\n if (!closed) return null;\n } else {\n while (i < text.length && !/\\s/.test(text[i])) item += text[i++];\n }\n out.push(item);\n }\n return out;\n};\n\n/** [\"yes\", \"hello sir\"] → 'yes \"hello sir\"' (quoted only when needed). */\nexport const formatStringList = (strs: readonly string[]): string =>\n strs\n .map((s) =>\n s === \"\" || /[\\s\"\\\\]/.test(s)\n ? `\"${s.replace(/[\\\\\"]/g, (c) => `\\\\${c}`)}\"`\n : s,\n )\n .join(\" \");\n\n/**\n * A stored value read as a list parameter: arrays pass through (filtered to\n * the element type), and a STRING — what a parameter held before its block\n * switched to a list type — is parsed in the list syntax. Anything else, or\n * text that doesn't parse, yields null (callers fall back to the default).\n */\nexport const readListParam = (\n type: \"numberList\" | \"stringList\",\n value: unknown,\n): number[] | string[] | null => {\n if (type === \"numberList\") {\n if (Array.isArray(value))\n return value.every((v) => typeof v === \"number\" && Number.isFinite(v))\n ? (value as number[])\n : null;\n return typeof value === \"string\" ? parseNumberList(value) : null;\n }\n if (Array.isArray(value))\n return value.every((v) => typeof v === \"string\")\n ? (value as string[])\n : null;\n return typeof value === \"string\" ? parseStringList(value) : null;\n};\n","import { z } from \"zod\";\n\n// Discriminated by `type` so the default (and per-type constraints like\n// min/max or enum options) can't disagree with the declared type.\nconst paramBase = {\n name: z.string().regex(/^[a-zA-Z_]\\w*$/),\n label: z.string().optional(),\n /** What the parameter means: the label's tooltip in the panel. */\n hint: z.string().optional(),\n};\n\n/** `#rrggbb` — a color parameter's value. */\nexport const HEX_COLOR = /^#[0-9a-f]{6}$/i;\n\n/**\n * One enum choice: `value` is what the script receives, `label` what the\n * properties panel shows (falls back to the value). Plain strings — the\n * pre-label form still written by older documents — normalize to\n * `{ value }`.\n */\nexport const EnumOptionSchema = z.preprocess(\n (raw) => (typeof raw === \"string\" ? { value: raw } : raw),\n z.object({\n value: z.string(),\n label: z.string().optional(),\n /** A `#rrggbb` color square before the option's label. */\n swatch: z.string().regex(HEX_COLOR).optional(),\n }),\n);\nexport type EnumOption = z.infer<typeof EnumOptionSchema>;\n\nconst NumberParam = z.object({\n ...paramBase,\n type: z.literal(\"number\"),\n default: z.number(),\n min: z.number().optional(),\n max: z.number().optional(),\n /** Whole numbers only. */\n integer: z.boolean().optional(),\n /** ArrowUp / ArrowDown increment in the panel (default 1). */\n step: z.number().positive().optional(),\n /** Shown inside the field before / after the value (\"1:\", \"mm\"). */\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n /** Standard values offered in the field's dropdown; typing stays free. */\n presets: z.array(z.number()).optional(),\n});\nconst StringParam = z.object({\n ...paramBase,\n type: z.literal(\"string\"),\n default: z.string(),\n placeholder: z.string().optional(),\n /** A textarea; Shift+Enter starts a new line. */\n multiline: z.boolean().optional(),\n presets: z.array(z.string()).optional(),\n});\nconst BooleanParam = z.object({\n ...paramBase,\n type: z.literal(\"boolean\"),\n default: z.boolean(),\n /** \"toggle\": a toggle button showing the label (compact, e.g. in a row\n * beside a picker) instead of a switch. */\n display: z.enum([\"switch\", \"toggle\"]).optional(),\n});\n// Lists edit as space-separated text (extensions/paramLists.ts): numbers\n// with Tekla `N*d` repeats, words with \"quoted phrases\".\nconst NumberListParam = z.object({\n ...paramBase,\n type: z.literal(\"numberList\"),\n default: z.array(z.number()),\n /** Shown while the list is empty. */\n placeholder: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n presets: z.array(z.array(z.number())).optional(),\n});\nconst StringListParam = z.object({\n ...paramBase,\n type: z.literal(\"stringList\"),\n default: z.array(z.string()),\n /** Shown while the list is empty. */\n placeholder: z.string().optional(),\n presets: z.array(z.array(z.string())).optional(),\n});\n// A `#rrggbb` color: swatch + picker in the panel, presets as a palette.\nconst ColorParam = z.object({\n ...paramBase,\n type: z.literal(\"color\"),\n default: z.string().regex(HEX_COLOR),\n presets: z.array(z.string().regex(HEX_COLOR)).optional(),\n});\nconst EnumParam = z.object({\n ...paramBase,\n type: z.literal(\"enum\"),\n default: z.string(),\n options: z.array(EnumOptionSchema).min(1),\n /** \"buttons\": a segmented toggle group of the options (short choices);\n * the panel falls back to the dropdown when they don't fit. */\n display: z.enum([\"dropdown\", \"buttons\"]).optional(),\n});\n// Pickers over the document's resources. Values are ids / names (strings):\n// a style id (\"\" or unknown → the document's first style, the rule objects\n// follow), a font id, a linetype or hatch pattern name.\nconst resourceParam = <T extends string>(type: T, fallback: string) =>\n z.object({\n ...paramBase,\n type: z.literal(type),\n default: z.string().default(fallback),\n });\nconst TextStyleParam = resourceParam(\"textStyle\", \"\");\nconst DimStyleParam = resourceParam(\"dimStyle\", \"\");\nconst FontParam = resourceParam(\"font\", \"arial\");\nconst LineTypeParam = resourceParam(\"lineType\", \"continuous\");\nconst HatchPatternParam = resourceParam(\"hatchPattern\", \"ANSI31\");\n\n// A section label between rows in the properties panel — no value, no\n// default; never present in the `params` record scripts receive.\nconst LabelParam = z.object({ ...paramBase, type: z.literal(\"label\") });\n\nconst enumDefaultIsAnOption = (p: { type: string }): boolean =>\n p.type !== \"enum\" ||\n (p as z.infer<typeof EnumParam>).options.some(\n (o) => o.value === (p as z.infer<typeof EnumParam>).default,\n );\nconst ENUM_DEFAULT = { message: \"enum default must be one of its options\" };\n\n/** What a `row` may hold: compact, single-line kinds. */\nexport const RowItemSchema = z\n .discriminatedUnion(\"type\", [\n NumberParam,\n StringParam,\n BooleanParam,\n EnumParam,\n ColorParam,\n TextStyleParam,\n DimStyleParam,\n FontParam,\n LineTypeParam,\n HatchPatternParam,\n ])\n .refine(enumDefaultIsAnOption, ENUM_DEFAULT);\n\n/** Layout only: 2–3 params on one panel row, each item's label shown as a\n * short prefix (\"W\", \"H\"). The values stay flat — `params.w`, `params.h` —\n * so a row never changes the stored shape (see valueParams). */\nconst RowParam = z.object({\n ...paramBase,\n type: z.literal(\"row\"),\n items: z.array(RowItemSchema).min(2).max(3),\n});\n\nexport const BlockParamSchema = z\n .discriminatedUnion(\"type\", [\n NumberParam,\n StringParam,\n BooleanParam,\n NumberListParam,\n StringListParam,\n ColorParam,\n EnumParam,\n TextStyleParam,\n DimStyleParam,\n FontParam,\n LineTypeParam,\n HatchPatternParam,\n LabelParam,\n RowParam,\n ])\n .refine(enumDefaultIsAnOption, ENUM_DEFAULT);\nexport type BlockParameter = z.infer<typeof BlockParamSchema>;\n\n/** A param that carries a value (not a label heading, not a row container). */\nexport type ValueParameter = Exclude<BlockParameter, { type: \"label\" | \"row\" }>;\n\n/** The value-carrying params of a table, row items flattened in place —\n * what defaults, `params` records, checks and visibility work on. */\nexport const valueParams = (\n defs: readonly BlockParameter[],\n): ValueParameter[] =>\n defs.flatMap((d): ValueParameter[] =>\n d.type === \"label\" ? [] : d.type === \"row\" ? d.items : [d],\n );\n\n// NOTE: there is no BlockDefinition record anymore — a block IS an ES module\n// (JavaScript or TypeScript) whose source string lives in\n// `LineaDocument.blockDefinitions`. Identity and metadata (`id`, `name`,\n// `params`) are the module's own exports, derived via `getBlockMeta`\n// (blocks/evalBlock.ts). The schemas here only describe the shape of the\n// `params` export.\n","// Parametric block evaluation. A block IS an ES module (JavaScript or\n// TypeScript): the document stores raw module sources, and everything the\n// app knows about a block derives from the module's exports —\n// id → identity (instances reference it via `definitionId`)\n// name → list/panel label\n// params → optional parameter declarations (ParamDef[], default []) — a\n// table literal OR a zero-arg pure function returning one (the\n// function form lets const data tables live at the end of the\n// file; it runs once per compiled module version)\n// draw({ params, inputs }) → child DTOs in block-LOCAL coordinates\n// (pure; runs on every evaluation). Object-id\n// inputs arrive RESOLVED: the referenced\n// object localized against the pivot, or null\n// when the reference is gone.\n// place({ params, pickPoint, pickObject })\n// → optional; runs ONCE at insertion and\n// interactively acquires the instance's\n// inputs array (points / object ids).\n// May instead be an ARRAY of point labels\n// (one pick per label, in order).\n// Absent → a single \"Insertion point\" pick.\n// paramVisibility({ params }) → optional; pure, re-run per properties-\n// panel render: which parameter rows to show\n// given the current values. Omitted names\n// stay visible; hidden values are KEPT and\n// still reach `draw`.\n// previewInputs → optional; author-curated inputs array for\n// previews/thumbnails (dryRunBlockInputs\n// prefers it over the stand-in pickers).\n// The pre-rename export names `main` (→ draw) and `defineInput` (→ place)\n// are FROZEN aliases, resolved at compile like the \"linea\" import\n// specifiers — documents and .block.ts files carrying them keep evaluating\n// forever.\n// A module may also `export default defineBlock({...})` (defineBlock is a\n// runtime identity from \"lineadraw\"; its overloads give full cross-member\n// type inference) — the default-exported spec carries the same members and\n// is normalized over the named exports at compile.\n// Scripts are transpiled with sucrase (typescript + imports → CJS) and\n// executed with `new Function` (calculus getProfile pattern — the user's own\n// code, same-origin, no sandbox by design) against a `require` shim that\n// resolves only the virtual modules: \"lineadraw/helpers\" (named geometry\n// helpers; \"lineadraw\" itself carries only types, plus the legacy `helpers`\n// object migration-wrapped scripts import) and their pre-rename \"linea\"\n// aliases. Output is zod-validated and\n// cached. Evaluation is\n// SYNC so render/snap paths can evaluate lazily without stalls; sucrase\n// itself is lazy-loaded — until it arrives evaluation reports a transient\n// error and `setScriptTranspilerReadyCallback` lets the host re-render.\n//\n// Instance pose: `inputs` is a flat array of world points (or id strings).\n// The PIVOT is the first point input. `draw` receives the points localized\n// against the pivot; its output is scaled, rotated (the instance fields,\n// applied last) and translated back to the pivot. Transforms map the input\n// points and the script recomputes — pose lives in the points.\n//\n// Object references: an id input resolves at evaluation time through the\n// caller-supplied resolver (the mutation owner's document lookup) into the\n// referenced object localized against the pivot — or null when it no longer\n// resolves. Which instance references which objects is recorded here\n// (instanceDeps) so the mutation owner can EXPAND its invalidation id lists\n// via `expandWithBlockDependents`: editing a referenced object then drops the\n// dependent instances' memo/snap entries and they re-evaluate on next paint.\n//\n// KERNEL SEAM: this module owns the caches but has no store. The mutation\n// owner (the editor's modelStore, a headless SDK session) calls\n// `invalidateBlockCache` from its own invalidation path, and the document's\n// script list is passed into `getEvaluatedWorldChildren` rather than read\n// from a global.\n\nimport { readListParam } from \"./paramLists\";\nimport {\n BlockParamSchema,\n valueParams,\n type BlockParameter,\n} from \"../model/blockDefinition\";\nimport {\n blockPivot,\n DEFAULT_DIM_STYLE,\n DEFAULT_TEXT_STYLE,\n dimStyleFor,\n textStyleFor,\n type Block,\n type DimStyle,\n type ModelObject,\n type TextStyle,\n} from \"../model/objects\";\nimport { Vec2Schema } from \"../model/common\";\nimport { z } from \"zod\";\nimport { sub, type Vec2 } from \"../geometry/vec2\";\nimport {\n rotateObject,\n scaleObjectUniform,\n translateObject,\n} from \"../transform\";\nimport { BlockScriptResultSchema, type BlockChild } from \"./blockDtos\";\nimport {\n ensureScriptTranspiler,\n executeScriptModule,\n scriptTranspilerReady,\n transpilerLoadingError,\n} from \"./scriptRuntime\";\n\nconst hashString = (s: string): number => {\n let h = 5381;\n for (let i = 0; i < s.length; i++) h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n return h;\n};\n\n/** One acquired block input: a world point or a referenced object id. */\nexport type BlockInputValue = Vec2 | string;\n\n/**\n * One input as `draw` receives it: a pivot-local point, the referenced\n * object (localized against the pivot), or null for a dangling reference.\n */\nexport type ResolvedBlockInput = Vec2 | ModelObject | null;\n\n/**\n * Looks up a referenced object by id — supplied by whoever owns the\n * document (ids are document-unique, so a document-wide lookup is correct).\n */\nexport type BlockObjectResolver = (id: string) => ModelObject | undefined;\n\n/** Interactive pickers the host hands to `place` at insertion. */\nexport interface BlockInputPickers {\n pickPoint: (label?: string) => Promise<Vec2>;\n pickObject: (label?: string) => Promise<string>;\n}\n\n/** Identity + metadata derived from a block module's exports. The optional\n * fields are marketplace/listing metadata (docs/block-marketplace.md) —\n * absent ones change nothing about evaluation. */\nexport interface BlockMeta {\n id: string;\n name: string;\n params: BlockParameter[];\n description?: string;\n version?: string;\n authors?: string[];\n tags?: string[];\n /** Ids of block definitions this block's `draw` emits instances of.\n * Declared (a param-dependent path may emit only sometimes), but the\n * save-time dry run REJECTS emitted instances that are not declared. */\n dependencies?: string[];\n}\n\n/**\n * The well-known exports of a compiled block script module, NORMALIZED: the\n * transpiler resolves the frozen legacy export names (`main` → `draw`,\n * `defineInput` → `place`) and spreads a default-exported BlockSpec\n * (`export default defineBlock({...})`) over the named exports, so\n * everything downstream reads only one shape. `place` may be an array of\n * point labels — the declarative \"pick one point per label\" form.\n */\ntype BlockScriptModule = {\n draw: (props: {\n params: Record<string, unknown>;\n inputs: ResolvedBlockInput[];\n }) => unknown;\n place?:\n | ((\n props: {\n params: Record<string, unknown>;\n } & BlockInputPickers,\n ) => unknown)\n | readonly string[];\n paramVisibility?: (props: { params: Record<string, unknown> }) => unknown;\n /** Optional author-curated inputs for previews/thumbnails (points may be\n * [x, y] tuples; strings are object refs the stand-in resolver serves). */\n previewInputs?: unknown;\n};\n\n/** The declarative `place` form: point labels, one pick per entry. */\nconst isLabelArray = (v: unknown): v is readonly string[] =>\n Array.isArray(v) && v.every((s) => typeof s === \"string\");\n\ninterface CompiledBlock {\n mod: BlockScriptModule;\n meta: BlockMeta;\n}\n\n/**\n * Compile cache keyed by the raw SOURCE (collision-free — the sources live\n * in the document anyway). Bounded because live editing (the block editor's\n * preview debounce) mints an entry per keystroke burst; eviction is\n * insertion-ordered with a get-refresh, i.e. LRU-ish.\n */\nconst compileCache = new Map<string, CompiledBlock>();\nconst COMPILE_CACHE_MAX = 200;\n\n/** Shared results for input-less evaluations (cross-instance reuse pays). */\nconst resultCache = new Map<string, BlockChild[]>();\nconst RESULT_CACHE_MAX = 500;\n\n/**\n * Per-instance memo for evaluations WITH inputs: input points make keys\n * unique per instance, so a shared cache would just thrash (it's FIFO, and\n * painting re-evaluates every dirty frame). Entries drop via model\n * invalidation.\n */\nconst instanceMemo = new Map<string, { key: string; children: BlockChild[] }>();\n\n/**\n * Which objects each instance's inputs REFERENCE (instance id → referenced\n * ids). ACCUMULATED, never replaced: several documents can share one\n * process (MCP server, SDK, a Save As copy keeps object ids), and the union\n * can only over-expand an invalidation list — harmless — never miss a\n * dependent. Entries are only dropped wholesale (a per-id drop would have to\n * be ordered against `expandWithBlockDependents`, which reads this map).\n */\nconst instanceDeps = new Map<string, Set<string>>();\n\n/**\n * Expand a mutation's invalidation id list with every block instance whose\n * inputs reference one of the mutated objects. The mutation owner calls this\n * BEFORE fanning out to `invalidateBlockCache` and its cache listeners, so\n * dependent instances' memo/snap entries drop and they re-evaluate against\n * the fresh referenced object on the next paint.\n */\nexport const expandWithBlockDependents = (ids: string[]): string[] => {\n if (instanceDeps.size === 0) return ids;\n const idSet = new Set(ids);\n let extra: string[] | null = null;\n for (const [instanceId, deps] of instanceDeps) {\n if (idSet.has(instanceId)) continue;\n for (const d of deps)\n if (idSet.has(d)) {\n (extra ??= []).push(instanceId);\n break;\n }\n }\n return extra ? [...ids, ...extra] : ids;\n};\n\n/**\n * Drop cached instance evaluations + volatile errors. Called by whoever owns\n * mutations, exactly where the funnel fires invalidation listeners today:\n * `null` clears everything, otherwise the given instance ids are dropped.\n */\nexport const invalidateBlockCache = (ids: string[] | null): void => {\n if (ids === null) {\n instanceMemo.clear();\n evalErrors.clear();\n instanceDeps.clear();\n return;\n }\n for (const id of ids) {\n instanceMemo.delete(id);\n evalErrors.delete(id);\n }\n};\n\n/** Volatile per-instance evaluation errors (never persisted, not in history). */\nconst evalErrors = new Map<string, string>();\nexport const getBlockError = (instanceId: string): string | undefined =>\n evalErrors.get(instanceId);\n\nconst defaultParams = (meta: BlockMeta): Record<string, unknown> => {\n // Null prototype: a param named `constructor`/`__proto__` must stay a\n // plain property, not clobber the prototype chain.\n const params: Record<string, unknown> = Object.create(null);\n // Labels are panel chrome with no value — scripts never see them; row\n // items are ordinary params (a row is layout only).\n for (const param of valueParams(meta.params))\n params[param.name] = param.default;\n return params;\n};\n\n/** An instance's stored params over the defaults. A list parameter is read\n * through readListParam: a STRING stored before its block switched to a\n * list type is parsed, an unreadable value falls back to the default. */\nconst instanceParams = (\n meta: BlockMeta,\n stored: Readonly<Record<string, unknown>>,\n): Record<string, unknown> => {\n const params = defaultParams(meta);\n for (const [name, value] of Object.entries(stored)) params[name] = value;\n for (const p of valueParams(meta.params))\n if (\n (p.type === \"numberList\" || p.type === \"stringList\") &&\n p.name in stored\n )\n params[p.name] = readListParam(p.type, stored[p.name]) ?? p.default;\n return params;\n};\n\n// The transpiler + executor live in ./scriptRuntime (shared with command\n// modules); re-exported here so `@lineadraw/core` keeps one flat surface.\nexport {\n ensureScriptTranspiler,\n executeScriptModule,\n scriptTranspilerReady,\n setScriptTranspilerReadyCallback,\n type ModuleExecutor,\n} from \"./scriptRuntime\";\n\n/** Resolve the frozen legacy export aliases (`main` → `draw`, `defineInput`\n * → `place`) and validate the block-module shape. */\nconst toBlockModule = (mod: Record<string, unknown>): BlockScriptModule => {\n const draw = mod.draw ?? mod.main;\n if (typeof draw !== \"function\")\n throw new Error(\"Block script must export a `draw` function\");\n const place = mod.place ?? mod.defineInput;\n if (\n place !== undefined &&\n typeof place !== \"function\" &&\n !isLabelArray(place)\n )\n throw new Error(\n \"Block script export `place` must be a function or an array of point labels\",\n );\n if (\n mod.paramVisibility !== undefined &&\n typeof mod.paramVisibility !== \"function\"\n )\n throw new Error(\"Block script export `paramVisibility` must be a function\");\n if (mod.previewInputs !== undefined && !Array.isArray(mod.previewInputs))\n throw new Error(\n \"Block script export `previewInputs` must be an array of points / object ids\",\n );\n return { ...mod, draw, place } as BlockScriptModule;\n};\n\nconst ParamsExportSchema = z.array(BlockParamSchema);\n\n/** Optional listing metadata (same surface as command modules, plus the\n * block-only `dependencies` — commands don't nest). */\nconst OptionalBlockMetaSchema = z.object({\n description: z.string().optional(),\n version: z.string().optional(),\n authors: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n dependencies: z.array(z.string()).optional(),\n});\n\n/**\n * A module's `params` export — the table itself or a zero-arg function\n * returning it (the function form lets const data tables live below it in\n * the file) — validated with author-facing errors. Shared by blocks and\n * commands; absent → [].\n */\nexport const parseParamsExport = (paramsExport: unknown): BlockParameter[] => {\n if (typeof paramsExport === \"function\") {\n try {\n paramsExport = (paramsExport as () => unknown)();\n } catch (e) {\n throw new Error(\n `\\`params\\` function threw — ${e instanceof Error ? e.message : String(e)}`,\n { cause: e },\n );\n }\n }\n if (paramsExport === undefined) return [];\n const parsed = ParamsExportSchema.safeParse(paramsExport);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n throw new Error(\n `Invalid \\`params\\` export${\n issue ? ` — ${issue.path.join(\".\") || \"params\"}: ${issue.message}` : \"\"\n }`,\n );\n }\n // Names are unique across the table AND inside rows (row items share the\n // flat `params` record with everything else).\n const seen = new Set<string>();\n const names = parsed.data.flatMap((d) =>\n d.type === \"row\" ? [d.name, ...d.items.map((i) => i.name)] : [d.name],\n );\n for (const name of names) {\n if (seen.has(name))\n throw new Error(`Duplicate parameter name \"${name}\" in \\`params\\``);\n seen.add(name);\n }\n return parsed.data;\n};\n\n/** Validate a module's identity/metadata exports with author-facing errors. */\nconst extractMeta = (mod: Record<string, unknown>): BlockMeta => {\n if (typeof mod.id !== \"string\" || mod.id.trim() === \"\")\n throw new Error(\"Block script must export a non-empty string `id`\");\n if (typeof mod.name !== \"string\" || mod.name.trim() === \"\")\n throw new Error(\"Block script must export a non-empty string `name`\");\n const optional = OptionalBlockMetaSchema.safeParse(mod);\n if (!optional.success) {\n const issue = optional.error.issues[0];\n throw new Error(\n `Invalid block metadata${\n issue ? ` — ${issue.path.join(\".\")}: ${issue.message}` : \"\"\n }`,\n );\n }\n const params = parseParamsExport(mod.params);\n return { id: mod.id, name: mod.name, params, ...optional.data };\n};\n\nconst compileBlock = (script: string): CompiledBlock => {\n const cached = compileCache.get(script);\n if (cached) {\n // Refresh recency so live-edited drafts don't evict the document's defs.\n compileCache.delete(script);\n compileCache.set(script, cached);\n return cached;\n }\n const mod = toBlockModule(executeScriptModule(script));\n const meta = extractMeta(mod as unknown as Record<string, unknown>);\n if (compileCache.size >= COMPILE_CACHE_MAX) {\n const oldest = compileCache.keys().next().value;\n if (oldest !== undefined) compileCache.delete(oldest);\n }\n compileCache.set(script, { mod, meta });\n return { mod, meta };\n};\n\n/**\n * Identity/metadata of a block module. Sync; throws the transient\n * \"Compiling block script…\" until the lazy transpiler is loaded, and a\n * descriptive error for invalid modules (missing exports, bad params).\n */\nexport const getBlockMeta = (script: string): BlockMeta =>\n compileBlock(script).meta;\n\n/** Non-throwing meta lookup for list UIs. */\nexport type BlockMetaResult =\n | { ok: true; meta: BlockMeta }\n | {\n ok: false;\n error: string;\n /** True while the transient transpiler load is the only problem. */\n loading: boolean;\n };\n\nexport const getBlockMetaResult = (script: string): BlockMetaResult => {\n try {\n return { ok: true, meta: compileBlock(script).meta };\n } catch (e) {\n return {\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n loading: !scriptTranspilerReady(),\n };\n }\n};\n\n/** Meta for each script in a document's library (invalid entries report). */\nexport const listBlockMeta = (scripts: readonly string[]): BlockMetaResult[] =>\n scripts.map(getBlockMetaResult);\n\n/** Source-level `export const id = \"…\"` matcher (broken-module fallback). */\nconst ID_EXPORT_RE = /export\\s+const\\s+id\\s*=\\s*[\"']([^\"']+)[\"']/;\n\n/**\n * The script whose exported `id` matches — the definition lookup behind\n * `instance.definitionId`. Throws the transient loading error while the\n * transpiler is absent (a missing transpiler must read as \"compiling\", not\n * \"missing definition\"). A module that FAILS to compile still matches via a\n * source-level id scan, so its instances report the actual script error\n * instead of \"unknown definition\".\n */\nexport const findBlockScript = (\n scripts: readonly string[],\n id: string,\n): string | undefined => {\n if (!scriptTranspilerReady()) throw transpilerLoadingError();\n for (const script of scripts) {\n try {\n if (compileBlock(script).meta.id === id) return script;\n } catch {\n if (ID_EXPORT_RE.exec(script)?.[1] === id) return script;\n }\n }\n return undefined;\n};\n\n/**\n * A module's exported id without requiring it to be valid: compiled meta\n * when possible, source-level scan otherwise. Undefined only when neither\n * yields one (including while the transpiler still loads and no literal id\n * export is present).\n */\nexport const blockScriptId = (script: string): string | undefined => {\n try {\n return compileBlock(script).meta.id;\n } catch {\n return ID_EXPORT_RE.exec(script)?.[1];\n }\n};\n\n/**\n * Transitive dependency closure of the given definition ids, following each\n * module's declared `dependencies` against the library. Returns the input\n * ids plus every reachable dependency id — INCLUDING ids that don't resolve\n * to a module (the caller decides whether a missing dep is an error or just\n * has nothing to bundle). Cycle-safe. Throws the transient loading error\n * while the transpiler is absent (callers ship the whole library instead).\n */\nexport const blockDependencyClosure = (\n scripts: readonly string[],\n ids: Iterable<string>,\n): Set<string> => {\n const closure = new Set<string>();\n const queue = [...ids];\n while (queue.length > 0) {\n const id = queue.pop()!;\n if (closure.has(id)) continue;\n closure.add(id);\n const script = findBlockScript(scripts, id);\n if (script === undefined) continue;\n try {\n for (const dep of compileBlock(script).meta.dependencies ?? [])\n queue.push(dep);\n } catch {\n // Broken module — its declared deps are unreadable; ship what we have.\n }\n }\n return closure;\n};\n\n/**\n * Does any script in the library export this id? PERMISSIVE while the\n * transpiler is still loading (returns true) — used by ops validation,\n * where \"cannot verify yet\" must not reject a valid document.\n */\nexport const blockDefinitionExists = (\n scripts: readonly string[],\n id: string,\n): boolean => {\n if (!scriptTranspilerReady()) return true;\n return findBlockScript(scripts, id) !== undefined;\n};\n\n/**\n * Deep-clone + freeze the props handed to a script: freezing alone is\n * shallow, and a script mutating a Vec2 input would otherwise corrupt\n * cached state.\n */\nconst scriptProps = <T extends Record<string, unknown>>(props: T): T => {\n const cloned = structuredClone(props);\n for (const value of Object.values(cloned))\n if (value !== null && typeof value === \"object\") Object.freeze(value);\n return Object.freeze(cloned);\n};\n\n/** Run the script's `draw` and validate the result. */\nconst runScript = (\n script: string,\n params: Record<string, unknown>,\n inputs: ResolvedBlockInput[],\n styles: BlockStyleSources,\n): BlockChild[] => {\n const { mod } = compileBlock(script);\n // `styles` joins AFTER the deep clone (functions don't clone); what its\n // methods return is a frozen copy, like everything else a script sees.\n const props = Object.freeze({\n ...scriptProps({ params, inputs }),\n styles: stylesResolver(styles),\n });\n const raw = mod.draw(props);\n return BlockScriptResultSchema.parse(raw);\n};\n\n/** The document styles a block's `draw` can read (`styles.text(id)` /\n * `styles.dim(id)`), so a block can lay out with real text sizes. */\nexport interface BlockStyleSources {\n textStyles: readonly TextStyle[];\n dimStyles: readonly DimStyle[];\n}\n\n/** What a block sees without a document (dry runs, previews, headless\n * callers that pass none): the standard styles. */\nexport const DEFAULT_BLOCK_STYLES: BlockStyleSources = {\n textStyles: [DEFAULT_TEXT_STYLE],\n dimStyles: [DEFAULT_DIM_STYLE],\n};\n\n/** `draw`'s `styles`: id → the document style (\"\" / unknown → the first,\n * the same rule a stored object's `styleId` follows). */\nconst stylesResolver = (s: BlockStyleSources) =>\n Object.freeze({\n text: (id?: string) =>\n Object.freeze(\n structuredClone(textStyleFor({ styleId: id }, s.textStyles)),\n ),\n dim: (id?: string) =>\n Object.freeze(structuredClone(dimStyleFor({ styleId: id }, s.dimStyles))),\n });\n\n/** A short signature of the styles for evaluation cache keys — editing a\n * style re-evaluates blocks (they may read it). Hashed once per array. */\nconst styleSigs = new WeakMap<object, string>();\nconst stylesSig = (s: BlockStyleSources): string => {\n const sig = (styles: readonly object[]) => {\n let v = styleSigs.get(styles);\n if (v === undefined) {\n v = String(hashString(JSON.stringify(styles)));\n styleSigs.set(styles, v);\n }\n return v;\n };\n return `${sig(s.textStyles)}.${sig(s.dimStyles)}`;\n};\n\nconst ParamVisibilityResultSchema = z.record(z.string(), z.boolean());\n\n/**\n * Evaluate the module's optional `paramVisibility` export with the given\n * effective param values: per-parameter visibility flags for the properties\n * panel (names missing from the record stay visible). NON-THROWING — an\n * absent export, a compiling/broken module, a throwing function, or a bad\n * return shape all yield {} (everything visible); the save-time dry run is\n * where authors get those errors reported.\n */\nexport const getParamVisibility = (\n script: string,\n params: Record<string, unknown>,\n): Record<string, boolean> => {\n try {\n const { mod } = compileBlock(script);\n if (!mod.paramVisibility) return {};\n const raw = mod.paramVisibility(scriptProps({ params }));\n const parsed = ParamVisibilityResultSchema.safeParse(raw);\n return parsed.success ? parsed.data : {};\n } catch {\n return {};\n }\n};\n\nconst paramsKey = (params: Record<string, unknown>): string =>\n JSON.stringify(Object.entries(params).sort(([a], [b]) => a.localeCompare(b)));\n\n// ---------------------------------------------------------------------------\n// Input localization + cache signature\n// ---------------------------------------------------------------------------\n\n/** Round for the cache KEY only — kills float jitter without touching data. */\nconst r6 = (v: number): number => Math.round(v * 1e6) / 1e6;\nconst sigOf = (v: BlockInputValue): string =>\n typeof v === \"string\" ? `#${v}` : `${r6(v.x)},${r6(v.y)}`;\n\n/** A serial per referenced object RECORD. The kernel replaces an object on\n * every edit (and undo restores the old record), so the serial changes\n * exactly when the referenced content can have — and another document's\n * object under the same id is another record, another serial. */\nconst recordSerials = new WeakMap<object, number>();\nlet nextRecordSerial = 0;\nconst recordSig = (obj: ModelObject | undefined): string => {\n if (!obj) return \"-\";\n let n = recordSerials.get(obj);\n if (n === undefined) recordSerials.set(obj, (n = ++nextRecordSerial));\n return `@${n}`;\n};\n\n/**\n * The memo-key signature of the instance's inputs, localized against the\n * pivot. Object references contribute their id AND the resolved record's\n * identity (an O(1) index lookup): the memo is per instance id, which two\n * documents in one process can share — keying on the reference id alone\n * served one document the other's geometry.\n */\nconst inputsSig = (\n instance: Block,\n resolve: BlockObjectResolver | undefined,\n): string => {\n const pivot = blockPivot(instance);\n return instance.inputs\n .map((v) =>\n typeof v === \"string\"\n ? sigOf(v) + recordSig(resolve?.(v))\n : sigOf(sub(v, pivot)),\n )\n .join(\"|\");\n};\n\n/**\n * Resolve + localize inputs for a `draw` run: points localize against the\n * pivot (the pivot itself becomes {0,0}); id inputs resolve to the\n * referenced object translated into the same pivot-local frame, or null\n * when the reference no longer resolves.\n */\nconst resolveInputs = (\n inputs: readonly BlockInputValue[],\n pivot: Vec2,\n resolve: BlockObjectResolver | undefined,\n): ResolvedBlockInput[] => {\n const neg = { x: -pivot.x, y: -pivot.y };\n return inputs.map((v) => {\n if (typeof v !== \"string\") return sub(v, pivot);\n const obj = resolve?.(v);\n return obj ? translateObject(obj, neg) : null;\n });\n};\n\n/** What `place` must produce: an array of points / object ids. */\nconst BlockInputsSchema = z.array(z.union([Vec2Schema, z.string()]));\n\n/**\n * Run the script's `place` with the host's interactive pickers and\n * return the validated inputs array (world coords). A labels-array `place`\n * picks one point per label, in order; scripts without a `place` export\n * default to a single \"Insertion point\" pick. Await\n * `ensureScriptTranspiler` before calling from a flow that cannot tolerate\n * the transient compile error. Rejections from the pickers (user cancel)\n * propagate.\n */\nexport const acquireBlockInputs = async (\n script: string,\n pickers: BlockInputPickers,\n): Promise<BlockInputValue[]> => {\n const { mod, meta } = compileBlock(script);\n if (!mod.place) return [await pickers.pickPoint(\"Insertion point\")];\n if (isLabelArray(mod.place)) {\n const points: BlockInputValue[] = [];\n for (const label of mod.place) points.push(await pickers.pickPoint(label));\n return points;\n }\n const raw = await mod.place({\n params: scriptProps({ ...defaultParams(meta) }),\n pickPoint: pickers.pickPoint,\n pickObject: pickers.pickObject,\n });\n return BlockInputsSchema.parse(raw);\n};\n\n/**\n * Bounded stand-in pickers for dry-runs: points walk a small grid; after\n * `limit` picks they reject, so a `place` collecting \"until cancel\"\n * terminates the way a user's Escape would.\n */\nconst dryRunPickers = (limit = 16): BlockInputPickers => {\n let n = 0;\n const next = (): Vec2 => {\n if (n >= limit)\n throw new Error(`Input picking canceled (dry-run limit of ${limit})`);\n const i = n++;\n return { x: (i % 4) * 500, y: Math.floor(i / 4) * 500 };\n };\n return {\n pickPoint: (): Promise<Vec2> => new Promise((resolve) => resolve(next())),\n pickObject: (): Promise<string> => Promise.resolve(\"dry-run-object\"),\n };\n};\n\n/**\n * Stand-in resolver for dry runs and previews: hands every reference a\n * plausible object (a short line) so scripts that derive geometry from a\n * pick exercise their happy path instead of hitting null.\n */\nconst dryRunObjects = new Map<string, ModelObject>();\nexport const dryRunObjectResolver: BlockObjectResolver = (id) => {\n // One stable record per id, so previews keep their memo hits.\n let obj = dryRunObjects.get(id);\n if (!obj) {\n obj = {\n id,\n layerId: \"dry-run\",\n type: \"line\",\n a: { x: 0, y: 0 },\n b: { x: 100, y: 0 },\n };\n dryRunObjects.set(id, obj);\n }\n return obj;\n};\n\n/**\n * Acquire a module's inputs with the bounded stand-in pickers — the input\n * half of a dry run, shared by save-time testing and previews (a preview\n * instance built on these inputs paints exactly what inserting the block\n * would). An author-curated `previewInputs` export wins over the generic\n * stand-in picks, so previews/thumbnails can show the block at its best\n * (\"[x, y]\" tuples accepted; validated with an author-facing error).\n * Awaits the transpiler; script errors propagate.\n */\nexport const dryRunBlockInputs = async (\n script: string,\n): Promise<BlockInputValue[]> => {\n await ensureScriptTranspiler();\n const { mod } = compileBlock(script);\n if (mod.previewInputs !== undefined) {\n const parsed = BlockInputsSchema.safeParse(mod.previewInputs);\n if (!parsed.success)\n throw new Error(\n \"`previewInputs` must be an array of points ([x, y] or {x, y}) and/or object-id strings\",\n );\n return parsed.data;\n }\n return acquireBlockInputs(script, dryRunPickers());\n};\n\n/**\n * Dry-run a block module (editor's save): validate the identity exports,\n * acquire inputs via `place` with stand-in pickers, then run `draw`\n * on them with default params.\n */\nexport const testBlockDefinition = async (\n script: string,\n): Promise<{ ok: true } | { ok: false; error: string }> => {\n try {\n await ensureScriptTranspiler();\n const { mod, meta } = compileBlock(script);\n // `previewInputs` shortcuts the picker path for previews — but the dry\n // run must still exercise `place` (its errors would otherwise surface\n // only at insertion).\n if (mod.previewInputs !== undefined && mod.place !== undefined)\n await acquireBlockInputs(script, dryRunPickers());\n const inputs = await dryRunBlockInputs(script);\n const pivot = inputs.find((v): v is Vec2 => typeof v !== \"string\") ?? {\n x: 0,\n y: 0,\n };\n const local = resolveInputs(inputs, pivot, dryRunObjectResolver);\n const children = runScript(\n script,\n { ...defaultParams(meta) },\n local,\n DEFAULT_BLOCK_STYLES,\n );\n // Emitted nested instances must be DECLARED — dependencies is what\n // install/copy/export use to bundle the closure, so an undeclared one\n // would break every one of those paths silently.\n const declared = new Set(meta.dependencies ?? []);\n for (const child of children) {\n if (child.type === \"block\" && !declared.has(child.definitionId))\n throw new Error(\n `draw emits an instance of \"${child.definitionId}\" — declare it in \\`dependencies\\``,\n );\n }\n // The panel-facing paramVisibility is non-throwing (falls back to\n // all-visible), so the dry run is where its errors reach the author.\n if (mod.paramVisibility) {\n const raw = mod.paramVisibility(\n scriptProps({ params: { ...defaultParams(meta) } }),\n );\n if (!ParamVisibilityResultSchema.safeParse(raw).success)\n throw new Error(\n \"`paramVisibility` must return an object of boolean flags keyed by parameter name\",\n );\n }\n return { ok: true };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n};\n\n/**\n * Child DTO → full pseudo model object in block-LOCAL coordinates.\n * BlockChild is the model schema minus {id, hidden} with an OPTIONAL\n * layerId (blockDtos): a child without one follows the instance's layer;\n * one that names a layer keeps it (imported DXF blocks draw across\n * layers), falling back to the instance's when the id is not a layer of\n * this document.\n */\nconst childToObject = (\n child: BlockChild,\n instance: Block,\n index: number,\n): ModelObject => {\n return {\n color: instance.color,\n lineType: instance.lineType,\n lineTypeScale: instance.lineTypeScale,\n lineWidth: instance.lineWidth,\n ...child,\n id: `${instance.id}:${index}`,\n layerId: child.layerId ?? instance.layerId,\n } as ModelObject;\n};\n\n/**\n * Evaluated children of an instance in WORLD coordinates (pseudo objects with\n * synthetic ids). Painters, snapping, hit-testing, and Explode all consume\n * this. Errors are recorded volatile and yield an empty list. The document's\n * block module sources are passed in (the kernel holds no store).\n */\n// Blocks may contain nested block instances; guard against definition cycles\n// (a script emitting an instance of an ancestor def would recurse forever).\nconst evaluating = new Set<string>();\n\nexport const getEvaluatedWorldChildren = (\n instance: Block,\n scripts: readonly string[],\n resolveObject?: BlockObjectResolver,\n /** The document's styles, readable in `draw` (`styles.text(id)`). */\n styles: BlockStyleSources = DEFAULT_BLOCK_STYLES,\n): ModelObject[] => {\n // Keep the dependency registry current on EVERY call (cheap): expansion\n // must know about references even when this call ends as a memo hit.\n const refs = instance.inputs.filter(\n (v): v is string => typeof v === \"string\",\n );\n if (refs.length > 0) {\n const deps = instanceDeps.get(instance.id);\n if (deps) for (const r of refs) deps.add(r);\n else instanceDeps.set(instance.id, new Set(refs));\n }\n\n let guarded: string | null = null;\n try {\n if (!scriptTranspilerReady()) throw transpilerLoadingError();\n const script = findBlockScript(scripts, instance.definitionId);\n if (!script) {\n evalErrors.set(\n instance.id,\n `Unknown block definition (${instance.definitionId})`,\n );\n return [];\n }\n const { meta } = compileBlock(script);\n if (evaluating.has(meta.id)) {\n evalErrors.set(instance.id, `Recursive block definition (${meta.name})`);\n return [];\n }\n evaluating.add(meta.id);\n guarded = meta.id;\n\n const params = instanceParams(meta, instance.params);\n let children: BlockChild[];\n if (instance.inputs.length > 0) {\n const key = `${meta.id}:${hashString(script)}:${paramsKey(\n params,\n )}:${inputsSig(instance, resolveObject)}:${stylesSig(styles)}`;\n const hit = instanceMemo.get(instance.id);\n if (hit && hit.key === key) {\n children = hit.children;\n } else {\n const values = resolveInputs(\n instance.inputs,\n blockPivot(instance),\n resolveObject,\n );\n children = runScript(script, params, values, styles);\n instanceMemo.set(instance.id, { key, children });\n }\n } else {\n // Input-less instances share results across instances.\n const key = `${meta.id}:${hashString(script)}:${paramsKey(\n params,\n )}:${stylesSig(styles)}`;\n const cached = resultCache.get(key);\n if (cached) {\n children = cached;\n } else {\n children = runScript(script, params, [], styles);\n if (resultCache.size >= RESULT_CACHE_MAX) {\n const oldest = resultCache.keys().next().value;\n if (oldest !== undefined) resultCache.delete(oldest);\n }\n resultCache.set(key, children);\n }\n }\n evalErrors.delete(instance.id);\n const pivot = blockPivot(instance);\n return children.map((child, i) => {\n let obj = childToObject(child, instance, i);\n if (instance.scale !== 1) obj = scaleObjectUniform(obj, instance.scale);\n if (instance.rotation !== 0)\n obj = rotateObject(obj, { x: 0, y: 0 }, instance.rotation);\n return translateObject(obj, pivot);\n });\n } catch (e) {\n evalErrors.set(instance.id, e instanceof Error ? e.message : String(e));\n return [];\n } finally {\n if (guarded !== null) evaluating.delete(guarded);\n }\n};\n","// Segment / line utilities. All in world mm.\n\nimport type { Vec2 } from \"./vec2\";\nimport { add, cross, dist, dot, lenSq, scale, sub } from \"./vec2\";\n\nexport interface Segment {\n a: Vec2;\n b: Vec2;\n}\n\n/** Parameter t of the projection of p onto the infinite line through a-b (t=0 at a, t=1 at b). */\nexport const projectParam = (p: Vec2, a: Vec2, b: Vec2): number => {\n const ab = sub(b, a);\n const l2 = lenSq(ab);\n if (l2 === 0) return 0;\n return dot(sub(p, a), ab) / l2;\n};\n\n/** Closest point to p on the infinite line through a-b. */\nexport const projectOntoLine = (p: Vec2, a: Vec2, b: Vec2): Vec2 =>\n add(a, scale(sub(b, a), projectParam(p, a, b)));\n\n/** Closest point to p on the segment a-b. */\nexport const closestPointOnSegment = (p: Vec2, a: Vec2, b: Vec2): Vec2 => {\n const t = Math.max(0, Math.min(1, projectParam(p, a, b)));\n return add(a, scale(sub(b, a), t));\n};\n\nexport const distToSegment = (p: Vec2, a: Vec2, b: Vec2): number =>\n dist(p, closestPointOnSegment(p, a, b));\n\n/**\n * Intersection of infinite lines (p1-p2) and (p3-p4).\n * Returns null when parallel.\n */\nexport const lineLineIntersection = (\n p1: Vec2,\n p2: Vec2,\n p3: Vec2,\n p4: Vec2,\n): Vec2 | null => {\n const d1 = sub(p2, p1);\n const d2 = sub(p4, p3);\n const denom = cross(d1, d2);\n if (Math.abs(denom) < 1e-12) return null;\n const t = cross(sub(p3, p1), d2) / denom;\n return add(p1, scale(d1, t));\n};\n\n/**\n * Intersection point of segments a1-a2 and b1-b2, or null.\n * Endpoint touches count as intersections.\n */\nexport const segSegIntersection = (\n a1: Vec2,\n a2: Vec2,\n b1: Vec2,\n b2: Vec2,\n): Vec2 | null => {\n const d1 = sub(a2, a1);\n const d2 = sub(b2, b1);\n const denom = cross(d1, d2);\n if (Math.abs(denom) < 1e-12) return null;\n const t = cross(sub(b1, a1), d2) / denom;\n const u = cross(sub(b1, a1), d1) / denom;\n const eps = 1e-9;\n if (t < -eps || t > 1 + eps || u < -eps || u > 1 + eps) return null;\n return add(a1, scale(d1, t));\n};\n\n/** Reflect a point across the infinite line through a-b. */\nexport const reflectAcrossLine = (p: Vec2, a: Vec2, b: Vec2): Vec2 => {\n const foot = projectOntoLine(p, a, b);\n return { x: 2 * foot.x - p.x, y: 2 * foot.y - p.y };\n};\n\n/** Does segment a1-a2 intersect the axis-aligned rect (used by crossing selection)? */\nexport const segIntersectsRect = (\n a: Vec2,\n b: Vec2,\n min: Vec2,\n max: Vec2,\n): boolean => {\n // Either endpoint inside\n const inside = (p: Vec2) =>\n p.x >= min.x && p.x <= max.x && p.y >= min.y && p.y <= max.y;\n if (inside(a) || inside(b)) return true;\n // Or the segment crosses one of the 4 edges\n const corners = [\n { x: min.x, y: min.y },\n { x: max.x, y: min.y },\n { x: max.x, y: max.y },\n { x: min.x, y: max.y },\n ];\n for (let i = 0; i < 4; i++) {\n if (segSegIntersection(a, b, corners[i], corners[(i + 1) % 4])) return true;\n }\n return false;\n};\n","import type { Hatch, ModelObject, ModelObjectDto } from \"./model/objects\";\nimport type { Vec2 } from \"./geometry/vec2\";\nimport {\n add,\n angle,\n fromAngle,\n normAngle,\n rot,\n rotAround,\n scale,\n sub,\n} from \"./geometry/vec2\";\nimport { reflectAcrossLine } from \"./geometry/line\";\n\n/** Clone an object without its id (the funnel stamps a fresh one on add). */\nexport const stripId = (obj: ModelObject): ModelObjectDto => {\n const clone: Partial<ModelObject> = { ...obj };\n delete clone.id;\n return clone as ModelObjectDto;\n};\n\n/**\n * Remap a block instance's object-reference inputs through an old→new id\n * map (ids absent from the map pass through untouched). Non-block objects\n * return unchanged.\n */\nexport const remapBlockInputRefs = (\n obj: ModelObject,\n idMap: ReadonlyMap<string, string>,\n): ModelObject => {\n if (obj.type !== \"block\") return obj;\n if (!obj.inputs.some((v) => typeof v === \"string\" && idMap.has(v)))\n return obj;\n return {\n ...obj,\n inputs: obj.inputs.map((v) =>\n typeof v === \"string\" ? (idMap.get(v) ?? v) : v,\n ),\n };\n};\n\n/**\n * Clone a batch for duplication (copy / array / mirror-copy / paste): fresh\n * ids, with block object-reference inputs that point INSIDE the batch\n * following to the clones — a copied annotation tracks the copied geometry,\n * not the original. References to objects outside the batch keep pointing\n * at the originals (dangling ones stay dangling and evaluate as null).\n */\nexport const duplicateObjects = (\n objects: readonly ModelObject[],\n): ModelObject[] => {\n const idMap = new Map(objects.map((o) => [o.id, crypto.randomUUID()]));\n return objects.map((o) => ({\n ...remapBlockInputRefs(o, idMap),\n id: idMap.get(o.id) ?? o.id,\n }));\n};\n\ntype BlockObj = Extract<ModelObject, { type: \"block\" }>;\n\n/**\n * Map a block's input points (world coords) through a point transform.\n * Instances carry their pose IN these points — transforms move the points\n * and the script re-derives direction/size, which is also what makes mirror\n * come out right for script-derived geometry. Reference values (strings)\n * pass through untouched.\n */\nconst mapInputPoints = (\n obj: BlockObj,\n fn: (p: Vec2) => Vec2,\n): BlockObj[\"inputs\"] =>\n obj.inputs.map((value) => (typeof value === \"string\" ? value : fn(value)));\n\n/**\n * With ≥2 point inputs the pose is fully determined by the points — the\n * rotation/scale fields stay untouched under transforms (accumulating them\n * on top would double-apply). A single-point instance is a classic symbol:\n * its point only carries position, so rotate/scale/mirror ALSO accumulate\n * the instance fields (applied last, about that point). ANY object-reference\n * input also disqualifies accumulation: geometry derived from the referenced\n * object already follows it, so accumulating rotation/scale on top would\n * double-apply when the reference transforms along (e.g. rotating a\n * selection holding both the instance and its referenced object).\n */\nconst pointsCarryPose = (obj: BlockObj): boolean =>\n obj.inputs.some((v) => typeof v === \"string\") ||\n obj.inputs.filter((v) => typeof v !== \"string\").length >= 2;\n\ntype ImageObj = Extract<ModelObject, { type: \"image\" }>;\n\n/** World center of an image's (rotated) footprint. */\nexport const imageCenter = (obj: ImageObj): Vec2 =>\n add(obj.origin, rot({ x: obj.width / 2, y: obj.height / 2 }, obj.rotation));\n\n/** The four corners of an image's footprint, CCW from `origin`. */\nexport const imageCorners = (obj: ImageObj): [Vec2, Vec2, Vec2, Vec2] => {\n const c = (x: number, y: number) =>\n add(obj.origin, rot({ x, y }, obj.rotation));\n return [\n obj.origin,\n c(obj.width, 0),\n c(obj.width, obj.height),\n c(0, obj.height),\n ];\n};\n\n/**\n * Map every point field of an object through `fn` (polyline/hatch vertices\n * keep their bulges; viewports pass through untouched). The four transforms\n * layer their per-type scalar/angle/bulge fixups on top.\n */\nconst mapObjectPoints = (\n obj: ModelObject,\n fn: (p: Vec2) => Vec2,\n): ModelObject => {\n switch (obj.type) {\n case \"line\":\n return { ...obj, a: fn(obj.a), b: fn(obj.b) };\n case \"point\":\n return { ...obj, p: fn(obj.p) };\n case \"polyline\":\n return { ...obj, points: obj.points.map((v) => ({ ...v, ...fn(v) })) };\n case \"circle\":\n case \"arc\":\n case \"ellipse\":\n return { ...obj, center: fn(obj.center) };\n case \"hatch\":\n return {\n ...obj,\n // An anchored pattern frame moves with its region.\n fill:\n obj.fill.kind === \"pattern\" && obj.fill.origin\n ? { ...obj.fill, origin: fn(obj.fill.origin) }\n : obj.fill,\n loops: obj.loops.map((loop) => ({\n points: loop.points.map((v) => ({ ...v, ...fn(v) })),\n })),\n };\n case \"text\":\n return {\n ...obj,\n position: fn(obj.position),\n leaderLines: obj.leaderLines.map((l) => l.map(fn)),\n };\n case \"dimension\":\n // offset is anchor-relative — the caller decides how it maps.\n return { ...obj, points: obj.points.map(fn) };\n case \"block\":\n return { ...obj, inputs: mapInputPoints(obj, fn) };\n case \"viewport\":\n return obj;\n case \"image\":\n return { ...obj, origin: fn(obj.origin) };\n case \"comment\":\n // The marker stays upright (screen-chrome-like): only the pin moves.\n return { ...obj, position: fn(obj.position) };\n case \"table\":\n return { ...obj, position: fn(obj.position) };\n case \"reference\":\n return { ...obj, position: fn(obj.position) };\n }\n};\n\n/** Pure translation of any model object by a world-space delta. */\nexport const translateObject = (obj: ModelObject, delta: Vec2): ModelObject => {\n const mapped = mapObjectPoints(obj, (p) => add(p, delta));\n return mapped.type === \"viewport\"\n ? {\n ...mapped,\n rect: {\n ...mapped.rect,\n x: mapped.rect.x + delta.x,\n y: mapped.rect.y + delta.y,\n },\n }\n : mapped;\n};\n\n/** Translate a viewport so its frame center lands on `newCenter` of `map`. */\nconst moveViewportCenter = (\n obj: Extract<ModelObject, { type: \"viewport\" }>,\n map: (p: Vec2) => Vec2,\n): ModelObject => {\n const c = {\n x: obj.rect.x + obj.rect.w / 2,\n y: obj.rect.y + obj.rect.h / 2,\n };\n const nc = map(c);\n return translateObject(obj, sub(nc, c));\n};\n\n/** A hatch fill with its line angle remapped (pattern and lines fills have\n * one; solid and gradient fills are direction-free). */\nconst turnFill = (\n fill: Hatch[\"fill\"],\n f: (angle: number) => number,\n): Hatch[\"fill\"] =>\n fill.kind === \"pattern\" || fill.kind === \"lines\"\n ? { ...fill, angle: f(fill.angle) }\n : fill;\n\n/** Pure rotation of any model object around a center by `ang` radians CCW. */\nexport const rotateObject = (\n obj: ModelObject,\n center: Vec2,\n ang: number,\n): ModelObject => {\n const r = (p: Vec2) => rotAround(p, center, ang);\n const mapped = mapObjectPoints(obj, r);\n switch (mapped.type) {\n case \"arc\":\n return {\n ...mapped,\n startAngle: normAngle(mapped.startAngle + ang),\n endAngle: normAngle(mapped.endAngle + ang),\n };\n case \"ellipse\":\n return { ...mapped, majorAxis: rot(mapped.majorAxis, ang) };\n case \"text\":\n case \"table\":\n return { ...mapped, rotation: mapped.rotation + ang };\n case \"dimension\":\n // Labels live in the segments' own frames; only a locked measuring\n // axis has to turn with the geometry.\n return mapped.rotation === undefined\n ? mapped\n : { ...mapped, rotation: mapped.rotation + ang };\n case \"block\":\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, rotation: mapped.rotation + ang };\n case \"viewport\":\n // Frames stay axis-aligned: the placement orbits, content unrotated.\n return moveViewportCenter(mapped, r);\n case \"image\":\n case \"reference\":\n return { ...mapped, rotation: normAngle(mapped.rotation + ang) };\n case \"hatch\":\n // The pattern turns with its region (CAD semantics: a hatch's lines\n // are part of the object, not of the drawing's frame).\n return { ...mapped, fill: turnFill(mapped.fill, (a) => a + ang) };\n case \"line\":\n case \"point\":\n case \"polyline\":\n case \"circle\":\n case \"comment\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n\n/** Pure uniform scale of any model object about the origin. */\nexport const scaleObjectUniform = (\n obj: ModelObject,\n s: number,\n): ModelObject => {\n const m = (p: Vec2): Vec2 => ({ x: p.x * s, y: p.y * s });\n const mapped = mapObjectPoints(obj, m);\n switch (mapped.type) {\n case \"circle\":\n case \"arc\":\n return { ...mapped, radius: mapped.radius * s };\n case \"ellipse\":\n return { ...mapped, majorAxis: m(mapped.majorAxis) };\n case \"hatch\":\n return {\n ...mapped,\n fill:\n mapped.fill.kind === \"lines\"\n ? { ...mapped.fill, spacing: mapped.fill.spacing * s }\n : mapped.fill.kind === \"pattern\"\n ? { ...mapped.fill, scale: mapped.fill.scale * s }\n : mapped.fill,\n };\n case \"text\":\n case \"table\":\n // `scale` multiplies textHeight/arrowSize/width at paint time\n // (textGeometry), covering own AND inherited sizes — scaling\n // styleOverride or width here too would apply s twice.\n return { ...mapped, scale: mapped.scale * s };\n case \"dimension\":\n return {\n ...mapped,\n ...(mapped.offset === undefined ? {} : { offset: mapped.offset * s }),\n labels: mapped.labels.map((l) => ({\n ...l,\n ...(l.along === undefined ? {} : { along: l.along * s }),\n ...(l.across === undefined ? {} : { across: l.across * s }),\n })),\n scale: mapped.scale * s,\n };\n case \"block\":\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, scale: mapped.scale * s };\n case \"viewport\":\n // Frame and view scale together: the same model window, s× larger.\n return {\n ...mapped,\n rect: {\n x: mapped.rect.x * s,\n y: mapped.rect.y * s,\n w: mapped.rect.w * s,\n h: mapped.rect.h * s,\n },\n // Same model window through an s× frame: the 1:N denominator (model\n // mm per paper mm) shrinks as the frame grows.\n scale: mapped.scale / s,\n };\n case \"image\":\n return { ...mapped, width: mapped.width * s, height: mapped.height * s };\n case \"reference\":\n return { ...mapped, scale: mapped.scale * s };\n case \"point\":\n // The point dot's size is a lineweight, not geometry — position only.\n return mapped;\n case \"line\":\n case \"polyline\":\n case \"comment\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n\n/**\n * Pure mirror of any model object across the line a-b. Reflection reverses\n * orientation: bulges negate and CCW angle ranges swap ends.\n * Block instances only reflect their insertion point/rotation (their child\n * geometry is not handed — documented v1 limitation).\n */\nexport const mirrorObject = (\n obj: ModelObject,\n a: Vec2,\n b: Vec2,\n): ModelObject => {\n const m = (p: Vec2) => reflectAcrossLine(p, a, b);\n const axisAngle = angle(sub(b, a));\n const mirrorAngle = (t: number) => normAngle(2 * axisAngle - t);\n if (obj.type === \"ellipse\") {\n const center = m(obj.center);\n const majorAxis = sub(m(add(obj.center, obj.majorAxis)), center);\n return {\n ...obj,\n center: center,\n majorAxis,\n startAngle: normAngle(-obj.endAngle),\n endAngle: normAngle(-obj.startAngle),\n };\n }\n if (obj.type === \"reference\") {\n // A true reflection: the insertion point reflects and the left-right\n // flip toggles — Ref(α)·R(θ) = R(2α−θ+π)·flipX, and flipX² = I either\n // way — content, text included, mirrors.\n return {\n ...obj,\n position: m(obj.position),\n rotation: normAngle(mirrorAngle(obj.rotation) + Math.PI),\n mirrored: !obj.mirrored,\n };\n }\n if (obj.type === \"image\") {\n // Pixels can't reflect (no flip support): the CENTER reflects and the\n // rotation mirrors, keeping the footprint on the mirrored spot.\n const c = imageCenter(obj);\n const rotation = mirrorAngle(obj.rotation);\n const moved = { ...obj, rotation };\n return translateObject(moved, sub(m(c), imageCenter(moved)));\n }\n if (obj.type === \"table\") {\n // Readable like text (MIRRTEXT=0): the TOP EDGE reflects and the table\n // keeps hanging down from it. When the reflected baseline is flipped\n // 180° to stay readable, the reflected top-RIGHT becomes the new\n // top-left. Only the width is needed (the height depends on measured\n // text, which transforms can't see).\n const width = obj.columns.reduce((a, w) => a + w, 0) * obj.scale;\n const topRight = add(obj.position, scale(fromAngle(obj.rotation), width));\n const reflected = normAngle(mirrorAngle(obj.rotation));\n const readable =\n reflected <= Math.PI / 2 + 1e-9 || reflected > (3 * Math.PI) / 2 + 1e-9;\n return {\n ...obj,\n position: m(readable ? obj.position : topRight),\n rotation: readable ? reflected : normAngle(reflected + Math.PI),\n };\n }\n const mapped = mapObjectPoints(obj, m);\n switch (mapped.type) {\n case \"polyline\":\n return {\n ...mapped,\n points: mapped.points.map((v) => ({ ...v, bulge: -v.bulge })),\n };\n case \"arc\":\n return {\n ...mapped,\n startAngle: mirrorAngle(mapped.endAngle),\n endAngle: mirrorAngle(mapped.startAngle),\n };\n case \"hatch\":\n return {\n ...mapped,\n fill: turnFill(mapped.fill, mirrorAngle),\n loops: mapped.loops.map((loop) => ({\n points: loop.points.map((v) => ({ ...v, bulge: -v.bulge })),\n })),\n };\n case \"text\": {\n // Keep glyphs READABLE (CAD MIRRTEXT=0): the anchor and leaders\n // reflect, but when the reflected baseline would run upside-down\n // (outside the (-90°, 90°] reading band) it flips 180° and the\n // horizontal alignment swaps so the text covers the mirrored extent.\n const reflected = normAngle(mirrorAngle(mapped.rotation));\n const readable =\n reflected <= Math.PI / 2 + 1e-9 || reflected > (3 * Math.PI) / 2 + 1e-9;\n const swap = { left: \"right\", center: \"center\", right: \"left\" } as const;\n return {\n ...mapped,\n rotation: readable ? reflected : normAngle(reflected + Math.PI),\n hAlign: readable ? mapped.hAlign : swap[mapped.hAlign],\n };\n }\n case \"dimension\": {\n // Reflection flips handedness: a locked axis reflects, the signed\n // offset (which side the line is on / which arc) negates, and the\n // handed label frames of radial and diameter dims negate `across`\n // (linear and angular frames follow the offset, so theirs hold).\n const handed = mapped.kind === \"radial\" || mapped.kind === \"diameter\";\n return {\n ...mapped,\n ...(mapped.rotation === undefined\n ? {}\n : { rotation: mirrorAngle(mapped.rotation) }),\n ...(mapped.offset === undefined ? {} : { offset: -mapped.offset }),\n labels: handed\n ? mapped.labels.map((l) =>\n l.across === undefined ? l : { ...l, across: -l.across },\n )\n : mapped.labels,\n };\n }\n case \"block\":\n // Multi-point: reflected points make script-derived geometry mirror\n // correctly (single-point child geometry still can't reflect — the\n // rotation flip below only orbits it).\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, rotation: mirrorAngle(mapped.rotation) };\n case \"viewport\":\n // Frames stay axis-aligned: only the placement reflects.\n return moveViewportCenter(mapped, m);\n case \"line\":\n case \"point\":\n case \"circle\":\n case \"comment\":\n return mapped;\n // Mirrored above, before the point map.\n case \"ellipse\":\n case \"reference\":\n case \"image\":\n case \"table\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n","// Schema for what a block script may RETURN: model objects minus identity\n// (id/layerId/hidden), in block-local coordinates (mm, y-up, origin at the\n// insertion point). Derived from the model schemas so the two cannot drift.\n// Points accept both {x, y} and [x, y] (see Vec2Schema/PolylineVertexSchema).\n// Children inherit the instance's layer/color/lineWidth unless they carry\n// their own.\n\nimport { z } from \"zod\";\nimport {\n ArcSchema,\n BlockSchema,\n CircleSchema,\n DimensionShapeSchema,\n dimensionRefinement,\n EllipseSchema,\n HatchSchema,\n LineSchema,\n PointSchema,\n PolylineSchema,\n TableShapeSchema,\n tableRefinement,\n TextSchema,\n} from \"../model/objects\";\nimport {\n dimensionRawToLabels,\n dimensionRawToOffset,\n dimRawScaleToField,\n leaderRawToText,\n textRawStyleToOverride,\n} from \"../model/migrations\";\n\n/** Identity comes from the block instance, not the script. A child MAY\n * name a document layer (`layerId`); absent = the instance's layer — the\n * common case, and what keeps a definition portable between documents. */\nconst CHILD_OMIT = { id: true, layerId: true } as const;\nconst CHILD_LAYER = { layerId: z.string().optional() };\n\n// Every model object type except viewport (sheet furniture, never block\n// geometry), image, comment and reference. Block children allow nested instances via `definitionId`.\n// Nested instances MAY carry point input values (parent-local; the parent's\n// transform pass carries them to world) but never REFERENCE values (strings)\n// — script-emitted references to real model ids would evade dependency\n// tracking.\nexport const BlockChildSchema = z.preprocess(\n // Back-compat: scripts written before document v6 may still emit \"leader\"\n // children (→ text with leaderLines), pre-v9 scripts may emit dimensions\n // in the linePoint/rotation shape (→ offset), pre-v17 scripts may put\n // style fields (font/widthFactor/textHeight/arrowSize) directly on a text\n // (→ styleOverride), and pre-v18 scripts may put a dimension's scale in\n // its styleOverride (→ the direct field) — convert like the migrations do\n // (scripts are user code we can't rewrite).\n (raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n let obj = raw as Record<string, unknown>;\n if (obj.type === \"leader\") obj = leaderRawToText(obj);\n if (obj.type === \"dimension\")\n // v21 labels last (pre-v21 scripts emit a vector offset / textOverride).\n return dimensionRawToLabels(\n dimRawScaleToField(dimensionRawToOffset(obj)),\n );\n if (obj.type === \"text\") return textRawStyleToOverride(obj);\n return obj;\n },\n z.discriminatedUnion(\"type\", [\n LineSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n PointSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n PolylineSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n CircleSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n ArcSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n EllipseSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n HatchSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n TextSchema.omit(CHILD_OMIT).extend(CHILD_LAYER),\n TableShapeSchema.omit(CHILD_OMIT)\n .extend(CHILD_LAYER)\n .superRefine(tableRefinement),\n DimensionShapeSchema.omit(CHILD_OMIT)\n .extend(CHILD_LAYER)\n .superRefine(dimensionRefinement),\n BlockSchema.omit(CHILD_OMIT)\n .extend(CHILD_LAYER)\n .refine((b) => b.inputs.every((v) => typeof v !== \"string\"), {\n message: \"nested block instances may not carry object references\",\n }),\n ]),\n);\nexport type BlockChild = z.infer<typeof BlockChildSchema>;\n\nexport const BlockScriptResultSchema = z.array(BlockChildSchema);\n","// JS-literal serialization: generated block-script fragments should read like\n// hand-written JavaScript (unquoted keys, inline {x, y} points), not JSON.\n// Used by the BLOCK command's captured-geometry script and the v14 document\n// migration that folds stored definition metadata into module exports.\n\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nconst jsKey = (k: string): string =>\n IDENTIFIER.test(k) ? k : JSON.stringify(k);\n\nexport const toJsLiteral = (value: unknown, indent: string): string => {\n if (typeof value === \"number\") return String(Math.round(value * 1e6) / 1e6);\n if (value === null || typeof value === \"boolean\") return String(value);\n if (typeof value === \"string\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n const inner = indent + \" \";\n return `[\\n${value.map((item) => inner + toJsLiteral(item, inner)).join(\",\\n\")}\\n${indent}]`;\n }\n if (typeof value === \"object\") {\n // Own keys explicitly set to undefined (e.g. a \"by layer\" reset stored\n // as `{ ...o, color: undefined }`) mean the same as absent — omit them\n // instead of printing `key: undefined`.\n const entries = Object.entries(value).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return \"{}\";\n // Small flat objects ({x, y}, vertices) stay on one line.\n const flat = entries.every(([, v]) => typeof v !== \"object\" || v === null);\n if (flat && entries.length <= 4) {\n return `{ ${entries.map(([k, v]) => `${jsKey(k)}: ${toJsLiteral(v, indent)}`).join(\", \")} }`;\n }\n const inner = indent + \" \";\n return `{\\n${entries\n .map(([k, v]) => `${inner}${jsKey(k)}: ${toJsLiteral(v, inner)}`)\n .join(\",\\n\")}\\n${indent}}`;\n }\n return \"undefined\";\n};\n","/**\n * Document migrations. Runs inside the LineaDocument z.preprocess, so it is\n * shared by file load and working-copy load.\n *\n * Discipline (from calculus-app): prefer .optional()/.default() on new schema\n * fields; bump CURRENT_DOCUMENT_VERSION and add a migration step here only\n * when a field's shape actually changes.\n */\n\nimport { toJsLiteral } from \"../extensions/jsLiteral\";\n\nexport const CURRENT_DOCUMENT_VERSION = 22;\n\n/**\n * A raw v5 \"leader\" object → v6 \"text\" with leaderLines. Exported because\n * block scripts may still EMIT leader child DTOs (user code we can't\n * rewrite) — blockDtos runs the same conversion. The text position/alignment\n * reproduce the old painter's derived anchor (gap past the last point,\n * facing the last segment's direction), so documents render identically.\n */\nexport const leaderRawToText = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n const points = Array.isArray(raw.points)\n ? (raw.points as { x: number; y: number }[])\n : [];\n const extraLines = Array.isArray(raw.extraLines) ? raw.extraLines : [];\n const textHeight =\n typeof raw.textHeight === \"number\" && raw.textHeight > 0\n ? raw.textHeight\n : 2.5;\n const last = points[points.length - 1] ?? { x: 0, y: 0 };\n const prev = points[points.length - 2] ?? last;\n const rightward = last.x - prev.x >= 0;\n const gap = textHeight * 0.6;\n const rest = { ...raw };\n delete rest.points;\n delete rest.extraLines;\n delete rest.textHeight;\n return {\n ...rest,\n type: \"text\",\n position: { x: last.x + (rightward ? gap : -gap), y: last.y },\n height: textHeight,\n rotation: 0,\n // Model semantics name where the text SITS: past the last point.\n hAlign: rightward ? \"right\" : \"left\",\n vAlign: \"center\",\n leaderLines: points.length >= 2 ? [points, ...extraLines] : extraLines,\n scale: 1,\n };\n};\n\n/**\n * v1 → v2: paper-space viewports move from `layout.viewports` into\n * `layout.objects` as first-class \"viewport\" objects (they gain the object\n * base fields: layerId).\n */\nconst migrateV1toV2 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const layers = Array.isArray(doc.layers) ? doc.layers : [];\n const firstLayerId = (layers[0] as { id?: string } | undefined)?.id;\n const defaultLayerId =\n typeof doc.currentLayerId === \"string\" && doc.currentLayerId !== \"\"\n ? doc.currentLayerId\n : (firstLayerId ?? \"\");\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n const viewports = Array.isArray(layout.viewports)\n ? layout.viewports\n : [];\n const objects = Array.isArray(layout.objects) ? layout.objects : [];\n const migrated = viewports.map((vp) => ({\n ...(vp as Record<string, unknown>),\n type: \"viewport\",\n layerId: defaultLayerId,\n }));\n const rest = { ...layout, objects: [...migrated, ...objects] };\n return rest;\n })\n : doc.layouts;\n\n return { ...doc, layouts, version: 2 };\n};\n\n/**\n * v2 → v3: ellipse `startParam`/`endParam` renamed to `startAngle`/`endAngle`\n * (matching arcs, dxf-parser, and AutoCAD's property palette — the value is\n * still the DXF parametric angle).\n */\nconst migrateV2toV3 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameEllipse = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"ellipse\") return raw;\n const { startParam, endParam, ...rest } = obj;\n return {\n ...rest,\n startAngle: obj.startAngle ?? startParam ?? 0,\n endAngle: obj.endAngle ?? endParam ?? Math.PI * 2,\n };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameEllipse) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 3 };\n};\n\n/**\n * v3 → v4: `strokeWidth` renamed to `lineWidth` on layers and objects.\n * Block definition SCRIPTS are user code emitting child DTOs — they get a\n * textual rename (the token has no other meaning in block scripts; zod's\n * strip mode would otherwise silently drop the old key on evaluation).\n */\nconst migrateV3toV4 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameKey = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (!(\"strokeWidth\" in obj)) return raw;\n const { strokeWidth, ...rest } = obj;\n return { ...rest, lineWidth: obj.lineWidth ?? strokeWidth };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameKey) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? {\n ...def,\n script: def.script.replaceAll(\"strokeWidth\", \"lineWidth\"),\n }\n : def;\n })\n : doc.blockDefinitions;\n\n return {\n ...doc,\n layers: mapObjects(doc.layers),\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 4,\n };\n};\n\n/**\n * v4 → v5: text alignment semantics inverted — the value now names where the\n * text SITS relative to its anchor point (\"left\" = text left of the point)\n * instead of which edge is anchored. Stored values swap (left↔right,\n * top↔bottom) so existing documents render pixel-identically. Block scripts\n * emitting non-center text alignments are NOT rewritten (values are computed\n * data, not renameable tokens) and will render mirrored — acceptable, rare.\n */\n/** Every text object's alignment flipped (left↔right, top↔bottom), in\n * model space and every layout — the same rendering under the inverse\n * convention. Used by v4→v5 and, reversing it, v19→v20. */\nconst swapTextAlignments = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const swapH: Record<string, string> = { left: \"right\", right: \"left\" };\n const swapV: Record<string, string> = { top: \"bottom\", bottom: \"top\" };\n const swapAlign = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"text\") return raw;\n return {\n ...obj,\n ...(typeof obj.hAlign === \"string\" && swapH[obj.hAlign]\n ? { hAlign: swapH[obj.hAlign] }\n : {}),\n ...(typeof obj.vAlign === \"string\" && swapV[obj.vAlign]\n ? { vAlign: swapV[obj.vAlign] }\n : {}),\n };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(swapAlign) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts };\n};\n\nconst migrateV4toV5 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...swapTextAlignments(doc), version: 5 });\n\n/**\n * v5 → v6: the standalone \"leader\" type merges into \"text\" (which gains\n * leaderLines/arrowSize/scale). Existing text objects pick the new fields up\n * via schema defaults. Dimension styleOverrides are also cleaned: zod's\n * partial() used to bake ALL default values into any override, freezing the\n * object against document-style edits — override keys still equal to the\n * historic defaults are dropped (identical rendering, styles unfrozen).\n */\nconst DIM_OVERRIDE_HISTORIC_DEFAULTS: Record<string, number> = {\n textHeight: 2.5,\n arrowSize: 2.5,\n extensionOffset: 1,\n extensionOvershoot: 1.25,\n precision: 1,\n scale: 1,\n};\n\nconst migrateV5toV6 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type === \"leader\") return leaderRawToText(obj);\n if (\n obj.type === \"dimension\" &&\n obj.styleOverride !== null &&\n typeof obj.styleOverride === \"object\"\n ) {\n const cleaned = Object.fromEntries(\n Object.entries(obj.styleOverride).filter(\n ([k, v]) => DIM_OVERRIDE_HISTORIC_DEFAULTS[k] !== v,\n ),\n );\n return {\n ...obj,\n styleOverride: Object.keys(cleaned).length > 0 ? cleaned : undefined,\n };\n }\n return raw;\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 6 };\n};\n\n/**\n * v6 → v7: dimension `defPoints` renamed to `points` (consistent with\n * polylines). Block definition scripts get the same textual rename as the\n * v3→v4 strokeWidth migration — the token has no other meaning in scripts,\n * and zod's strip mode would otherwise silently drop the old key.\n */\nconst migrateV6toV7 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameKey = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"dimension\" || !(\"defPoints\" in obj)) return raw;\n const { defPoints, ...rest } = obj;\n return { ...rest, points: obj.points ?? defPoints };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameKey) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? { ...def, script: def.script.replaceAll(\"defPoints\", \"points\") }\n : def;\n })\n : doc.blockDefinitions;\n\n return {\n ...doc,\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 7,\n };\n};\n\n/**\n * v7 → v8: `dimStyle.scale` (the document-level annotation scale) is removed;\n * scale is per-dimension only (`styleOverride.scale`, absent = 1). A non-1\n * document scale is baked into every dimension that doesn't override it, so\n * existing drawings render identically. Block-script-emitted dimensions can't\n * be baked (their DTOs are recomputed on eval) — acceptable, rare.\n */\nconst migrateV7toV8 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const dimStyle =\n doc.dimStyle !== null && typeof doc.dimStyle === \"object\"\n ? { ...(doc.dimStyle as Record<string, unknown>) }\n : undefined;\n const docScale =\n dimStyle && typeof dimStyle.scale === \"number\" && dimStyle.scale > 0\n ? dimStyle.scale\n : 1;\n if (dimStyle) delete dimStyle.scale;\n\n const bake = (raw: unknown): unknown => {\n if (docScale === 1) return raw;\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"dimension\") return raw;\n const override =\n obj.styleOverride !== null && typeof obj.styleOverride === \"object\"\n ? (obj.styleOverride as Record<string, unknown>)\n : {};\n if (typeof override.scale === \"number\") return raw; // own scale wins\n return { ...obj, styleOverride: { ...override, scale: docScale } };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(bake) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return {\n ...doc,\n ...(dimStyle ? { dimStyle } : {}),\n objects: mapObjects(doc.objects),\n layouts,\n version: 8,\n };\n};\n\n/**\n * A raw legacy dimension → the current `offset` shape. Handles BOTH old\n * forms: the pre-v9 linePoint + rotation (\"aligned\" kind) placement, and\n * the v9–v12 `upVector` field (renamed to `offset` in v13). For\n * linear/aligned dims the offset is PERPENDICULAR to the measuring axis\n * (the axis is perp(offset) at paint time), so the conversion is\n * lossless — old axis-locked linear dims keep their points AND their\n * axis. Exported because block scripts may still EMIT legacy dimension\n * DTOs and the DXF importer builds them — blockDtos and the import\n * funnel run the same conversion.\n */\nexport const dimensionRawToOffset = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"dimension\") return raw;\n if (\"upVector\" in raw && !(\"offset\" in raw)) {\n const rest = { ...raw };\n delete rest.upVector;\n return { ...rest, offset: raw.upVector };\n }\n if (!(\"linePoint\" in raw)) return raw;\n const linePoint = raw.linePoint as { x: number; y: number };\n const points = (raw.points ?? []) as { x: number; y: number }[];\n let kind = typeof raw.kind === \"string\" ? raw.kind : \"linear\";\n if (points.length < 1 || typeof linePoint?.x !== \"number\") return raw;\n\n let offset: { x: number; y: number };\n if (kind === \"linear\" || kind === \"aligned\") {\n // Old measuring axis: the stored rotation (linear) or first→last\n // (aligned). offset = the perpendicular part of linePoint − first.\n const first = points[0];\n const last = points[points.length - 1];\n let ux = 1;\n let uy = 0;\n if (kind === \"aligned\") {\n const d = Math.hypot(last.x - first.x, last.y - first.y);\n if (d > 1e-9) {\n ux = (last.x - first.x) / d;\n uy = (last.y - first.y) / d;\n }\n } else {\n const rot = typeof raw.rotation === \"number\" ? raw.rotation : 0;\n ux = Math.cos(rot);\n uy = Math.sin(rot);\n }\n const h = -(linePoint.x - first.x) * uy + (linePoint.y - first.y) * ux;\n offset = { x: -uy * h + 0, y: ux * h + 0 }; // \"+ 0\" folds -0 into 0\n kind = \"linear\";\n } else {\n const anchor =\n kind === \"diameter\" && points.length >= 2\n ? {\n x: (points[0].x + points[1].x) / 2,\n y: (points[0].y + points[1].y) / 2,\n }\n : points[0];\n offset = { x: linePoint.x - anchor.x, y: linePoint.y - anchor.y };\n }\n\n const rest = { ...raw };\n delete rest.linePoint;\n delete rest.rotation;\n return { ...rest, kind, points, offset };\n};\n\n/**\n * v8 → v9: the dimension \"aligned\" kind merges into \"linear\" (which now\n * measures point to point), and `linePoint`/`rotation` are replaced by an\n * anchored offset vector (direction fixed at creation; the field lands\n * directly in its final v13 `offset` name).\n */\nconst migrateV8toV9 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToOffset(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 9 };\n};\n\n// The exact wrapper the v9→v10 migration produced (inputs were a RECORD\n// keyed by declared input name back then) — v10→v11 detects it to re-wrap.\n// Frozen bytes: real v10 files carry the pre-rename \"linea\" specifier, and\n// detection is a string match — never update this to \"lineadraw\".\nconst V10_WRAPPER_HEADER = `import { helpers } from \"linea\";\n\nexport const main = ({ params, inputs }) => {\n const p = { ...params, ...inputs };\n`;\nconst V10_WRAPPER_FOOTER = `\n};\n`;\n\n/**\n * v9 → v10: block scripts become ES modules — the stored string is no longer\n * a bare function body but a module exporting `main`, importing `helpers`\n * from the virtual module. Frozen historical form (pre-rename \"linea\"\n * specifier included): the wrapper it emits is the v10 (record-inputs)\n * shape; v10→v11 re-wraps it.\n */\nconst migrateV9toV10 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? {\n ...def,\n script: `${V10_WRAPPER_HEADER}${def.script}${V10_WRAPPER_FOOTER}`,\n }\n : def;\n })\n : doc.blockDefinitions;\n\n return { ...doc, blockDefinitions, version: 10 };\n};\n\n/** A pre-v11 declared input (from the definition's dropped inputs table). */\nexport interface LegacyBlockInput {\n name: string;\n repeat?: boolean;\n}\n\n/** Declared inputs of a RAW pre-v11 definition (invalid entries skipped). */\nconst legacyDeclaredInputs = (\n rawDef: Record<string, unknown>,\n): LegacyBlockInput[] => {\n if (!Array.isArray(rawDef.inputs)) return [];\n const out: LegacyBlockInput[] = [];\n for (const raw of rawDef.inputs) {\n if (raw === null || typeof raw !== \"object\") continue;\n const inp = raw as Record<string, unknown>;\n if (typeof inp.name !== \"string\" || !/^[a-zA-Z_]\\w*$/.test(inp.name))\n continue;\n out.push({ name: inp.name, repeat: inp.repeat === true });\n }\n return out;\n};\n\n/**\n * A legacy block script BODY (the pre-v10 `(p, helpers) => children` form) →\n * a v11 ES-module script. Purely mechanical: the instance's inputs array is\n * destructured back into the old declared input names (a trailing `repeat`\n * input collects the rest), and the body keeps reading `p` via a shim that\n * reproduces the old merged params+inputs object. Inputs arrive localized\n * against the pivot (the first point), which matches the old localization\n * against the insertion point. Exported because `.block` library files carry\n * the same scripts (blockFile.ts migrates old envelopes).\n */\nexport const blockScriptToModule = (\n body: string,\n declared: LegacyBlockInput[] = [],\n): string => {\n const bindings = declared.map((inp, i) =>\n inp.repeat && i === declared.length - 1 ? `...${inp.name}` : inp.name,\n );\n const destructure =\n bindings.length > 0 ? ` const [${bindings.join(\", \")}] = inputs;\\n` : \"\";\n const pSpread =\n declared.length > 0\n ? `{ ...params, ${declared.map((inp) => inp.name).join(\", \")} }`\n : \"{ ...params }\";\n return `import { helpers } from \"lineadraw\";\n\nexport const main = ({ params, inputs }) => {\n${destructure} const p = ${pSpread};\n${body}\n};\n`;\n};\n\n/**\n * A raw pre-v11 block definition → v11: the migration-generated v10 wrapper\n * is re-wrapped into the array-inputs form (other scripts pass through\n * unchanged) and the declared-inputs table is dropped. Exported because\n * `.block` library files carry the same definitions.\n */\nconst blockDefRawToV11 = (\n rawDef: Record<string, unknown>,\n): Record<string, unknown> => {\n let script = rawDef.script;\n if (\n typeof script === \"string\" &&\n script.startsWith(V10_WRAPPER_HEADER) &&\n script.endsWith(V10_WRAPPER_FOOTER)\n ) {\n const body = script.slice(\n V10_WRAPPER_HEADER.length,\n script.length - V10_WRAPPER_FOOTER.length,\n );\n script = blockScriptToModule(body, legacyDeclaredInputs(rawDef));\n }\n const rest: Record<string, unknown> = { ...rawDef, script };\n delete rest.inputs;\n return rest;\n};\n\n/**\n * v10 → v11: the block instance loses its own frame origin — `insert` is\n * replaced by the inputs array (the first point is the pivot), `args` is\n * renamed to `params`, and the record-of-named-values `inputs` flattens to\n * an array in declared order (repeat arrays splice in). Classic instances\n * become single-point instances (`inputs: [insert]`), so their pose —\n * including rotation/scale, which now apply about the pivot — survives\n * losslessly. Definitions drop the declared-inputs table (the script's\n * `place` — `defineInput` at the time — owns acquisition now) and\n * migration-shaped scripts are re-wrapped for array inputs.\n */\nconst migrateV10toV11 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const rawDefs = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.filter(\n (d): d is Record<string, unknown> =>\n d !== null && typeof d === \"object\",\n )\n : [];\n const declaredOf = new Map<string, LegacyBlockInput[]>();\n for (const def of rawDefs)\n if (typeof def.id === \"string\")\n declaredOf.set(def.id, legacyDeclaredInputs(def));\n\n const isPoint = (v: unknown): v is { x: number; y: number } =>\n v !== null &&\n typeof v === \"object\" &&\n typeof (v as { x?: unknown }).x === \"number\" &&\n typeof (v as { y?: unknown }).y === \"number\";\n\n const convert = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"block\") return raw;\n\n const declared =\n typeof obj.definitionId === \"string\"\n ? (declaredOf.get(obj.definitionId) ?? [])\n : [];\n const record =\n obj.inputs !== null &&\n typeof obj.inputs === \"object\" &&\n !Array.isArray(obj.inputs)\n ? (obj.inputs as Record<string, unknown>)\n : {};\n\n const inputs: unknown[] = [];\n if (declared.length === 0) {\n // Classic instance: the insertion point becomes the single input.\n if (isPoint(obj.insert)) inputs.push(obj.insert);\n } else {\n for (const inp of declared) {\n const v = record[inp.name];\n if (v === undefined) continue;\n if (Array.isArray(v)) inputs.push(...v);\n else inputs.push(v);\n }\n }\n\n const rest = { ...obj };\n delete rest.insert;\n delete rest.args;\n return { ...rest, params: obj.params ?? obj.args ?? {}, inputs };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) =>\n raw !== null && typeof raw === \"object\"\n ? blockDefRawToV11(raw as Record<string, unknown>)\n : raw,\n )\n : doc.blockDefinitions;\n\n return {\n ...doc,\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 11,\n };\n};\n\n/**\n * v11 → v12: viewport `scale` flips meaning from paper mm per model mm\n * (1:50 = 0.02) to the drawing-scale denominator, model mm per paper mm\n * (1:50 = 50). The stored value inverts; the projection is unchanged.\n */\nconst migrateV11toV12 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n if (!Array.isArray(layout.objects)) return raw;\n const objects = layout.objects.map((o) => {\n if (o === null || typeof o !== \"object\") return o;\n const obj = o as Record<string, unknown>;\n if (obj.type !== \"viewport\") return o;\n const scale =\n typeof obj.scale === \"number\" && obj.scale > 0 ? 1 / obj.scale : 1;\n return { ...obj, scale };\n });\n return { ...layout, objects };\n })\n : doc.layouts;\n return { ...doc, layouts, version: 12 };\n};\n\n/**\n * v12 → v13: dimension `upVector` renamed to `offset` (same anchored\n * placement vector; the old name suggested a unit direction).\n */\nconst migrateV12toV13 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToOffset(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 13 };\n};\n\n/**\n * A stored pre-v14 block definition record → a self-contained module source:\n * the record's id/name/params fold into the script as exports. Also used to\n * convert legacy `.block` library entries at import.\n */\nexport const blockDefRecordToModule = (raw: unknown): string | null => {\n if (typeof raw === \"string\") return raw; // already a module source\n if (raw === null || typeof raw !== \"object\") return null;\n const def = raw as Record<string, unknown>;\n if (typeof def.script !== \"string\") return null;\n const header: string[] = [\n `export const id = ${JSON.stringify(\n typeof def.id === \"string\" && def.id !== \"\"\n ? def.id\n : crypto.randomUUID(),\n )};`,\n `export const name = ${JSON.stringify(\n typeof def.name === \"string\" && def.name !== \"\" ? def.name : \"Block\",\n )};`,\n ];\n if (Array.isArray(def.params) && def.params.length > 0)\n header.push(`export const params = ${toJsLiteral(def.params, \"\")};`);\n return `${header.join(\"\\n\")}\\n\\n${def.script}`;\n};\n\n/**\n * v13 → v14: block definitions become raw ES-module sources — the stored\n * {id, name, params, script} record folds into the script as exports\n * (mechanical, same spirit as the v9→v11 script wrappers). Instances are\n * untouched: `definitionId` still matches the now-exported id.\n */\nconst migrateV13toV14 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions\n .map(blockDefRecordToModule)\n .filter((s): s is string => s !== null)\n : [];\n return { ...doc, blockDefinitions, version: 14 };\n};\n\n/**\n * v14 → v15: the format tag `type: \"linea\"` becomes `\"lineadraw\"` (the app\n * rename; the pre-rename tag is set unconditionally — files that predate the\n * field default-filled \"linea\" on parse).\n */\nconst migrateV14toV15 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...doc, type: \"lineadraw\", version: 15 });\n\n/**\n * A raw pre-v16 text's `arrowSize` field → `styleOverride.arrowSize`. The\n * historic per-object default (2.5) equals the new document-style default,\n * so a value still at it is dropped instead of frozen into an override —\n * identical rendering, style edits keep applying.\n */\nconst textRawArrowToOverride = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"text\" || !(\"arrowSize\" in raw)) return raw;\n const { arrowSize, ...rest } = raw;\n if (typeof arrowSize !== \"number\" || arrowSize === 2.5) return rest;\n const override =\n rest.styleOverride !== null && typeof rest.styleOverride === \"object\"\n ? (rest.styleOverride as Record<string, unknown>)\n : {};\n return {\n ...rest,\n styleOverride: { arrowSize, ...override }, // an existing key wins\n };\n};\n\n/**\n * A raw text with pre-v17 direct style fields (`font`, `widthFactor`,\n * `textHeight` — plus `arrowSize` and the `height` alias some early leader\n * conversions/scripts used) → the `styleOverride` form. Present keys fold in\n * unconditionally (they were explicit); existing override keys win.\n * `inheritTextHeight` drops a height equal to what inheritance would resolve\n * to anyway (the v16→v17 migration passes the document style's height so\n * unedited text stays unfrozen; script DTOs pass nothing — a script's height\n * is always intentional). Exported because block scripts may still EMIT the\n * old shapes (user code we can't rewrite) — blockDtos runs this conversion.\n */\nexport const textRawStyleToOverride = (\n raw: Record<string, unknown>,\n inheritTextHeight?: number,\n): Record<string, unknown> => {\n if (raw.type !== \"text\") return raw;\n const { font, widthFactor, textHeight, height, arrowSize, ...rest } = raw;\n const override: Record<string, unknown> = {};\n if (typeof font === \"string\") override.font = font;\n if (typeof widthFactor === \"number\") override.widthFactor = widthFactor;\n const h =\n typeof textHeight === \"number\"\n ? textHeight\n : typeof height === \"number\"\n ? height\n : undefined;\n if (h !== undefined && h !== inheritTextHeight) override.textHeight = h;\n if (typeof arrowSize === \"number\") override.arrowSize = arrowSize;\n const existing =\n rest.styleOverride !== null && typeof rest.styleOverride === \"object\"\n ? (rest.styleOverride as Record<string, unknown>)\n : {};\n const merged = { ...override, ...existing };\n return {\n ...rest,\n ...(Object.keys(merged).length > 0 ? { styleOverride: merged } : {}),\n };\n};\n\n/**\n * v15 → v16: text leader arrows join the document text style — the\n * per-object `arrowSize` field becomes an optional `styleOverride` entry\n * (mirroring dimensions), and the style gains `arrowSize`/`arrowType`.\n */\nconst migrateV15toV16 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? textRawArrowToOverride(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 16 };\n};\n\n/**\n * v16 → v17: the remaining direct text style fields (`font`, `widthFactor`,\n * `textHeight`) join `styleOverride`, completing the DimStyle-shaped split.\n * `textHeight` was required per-object before; a value equal to the\n * document style's height is dropped (inheritance resolves to the same\n * number — identical rendering, style edits keep applying), anything else\n * becomes an override.\n */\nconst migrateV16toV17 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const styleHeight =\n doc.textStyle !== null &&\n typeof doc.textStyle === \"object\" &&\n typeof (doc.textStyle as Record<string, unknown>).textHeight === \"number\"\n ? ((doc.textStyle as Record<string, unknown>).textHeight as number)\n : 2.5;\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? textRawStyleToOverride(raw as Record<string, unknown>, styleHeight)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 17 };\n};\n\n/**\n * A raw dimension with the pre-v18 `styleOverride.scale` key → the direct\n * `scale` field (a size multiplier is object pose, not a style override —\n * matching Text/Hatch/Block). An existing field wins; an emptied override\n * is dropped. Exported because block scripts may still EMIT the old shape\n * (user code we can't rewrite) — blockDtos runs the same conversion.\n */\nexport const dimRawScaleToField = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (\n raw.type !== \"dimension\" ||\n raw.styleOverride === null ||\n typeof raw.styleOverride !== \"object\" ||\n !(\"scale\" in raw.styleOverride)\n )\n return raw;\n const { scale, ...override } = raw.styleOverride as Record<string, unknown>;\n return {\n ...raw,\n styleOverride: Object.keys(override).length > 0 ? override : undefined,\n ...(typeof raw.scale === \"number\" || typeof scale !== \"number\"\n ? {}\n : { scale }),\n };\n};\n\n/**\n * v17 → v18: the dimension annotation scale moves from\n * `styleOverride.scale` to a direct `scale` field on the object.\n */\nconst migrateV17toV18 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimRawScaleToField(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 18 };\n};\n\n/**\n * v18 → v19: the single document `textStyle`/`dimStyle` become ARRAYS of\n * named styles (`textStyles`/`dimStyles`); the old singleton folds into the\n * first entry with a stable id (\"standard\") and name. Objects need no\n * change: `styleId` is optional and absent resolves to the first style.\n */\nconst migrateV18toV19 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const wrap = (style: unknown): Record<string, unknown>[] => [\n {\n id: \"standard\",\n name: \"Standard\",\n ...(style !== null && typeof style === \"object\"\n ? (style as Record<string, unknown>)\n : {}),\n },\n ];\n const { textStyle, dimStyle, ...rest } = doc;\n return {\n ...rest,\n textStyles: wrap(textStyle),\n dimStyles: wrap(dimStyle),\n version: 19,\n };\n};\n\n/**\n * v19 → v20: text alignment back to JUSTIFICATION — which edge sits on the\n * point, the AutoCAD / DXF meaning (\"right\" = text left of the point,\n * \"bottom\" = above it); v5 had inverted it to \"where the text sits\". The\n * swap keeps every document pixel-identical. Block scripts can't be\n * rewritten: their non-center text alignments render mirrored until the\n * block is updated (docs/adr/0002).\n */\nconst migrateV19toV20 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...swapTextAlignments(doc), version: 20 });\n\n/** Points a dimension kind needs (mirrors the schema's refinement). */\nconst dimensionPointCount = (kind: string): number =>\n kind === \"angular\" ? 3 : 2;\n\nconst wrapAngle = (a: number): number => {\n const twoPi = 2 * Math.PI;\n const r = a % twoPi;\n return r < 0 ? r + twoPi : r;\n};\n\n/**\n * A raw v20 dimension (vector `offset`, single `textOverride`) → the v21\n * shape (docs/dimension-labels.md): scalar `rotation` + `offset` for\n * linear/angular, `labels[0].along` for radial/diameter, `textOverride`\n * → per-segment label `content` (a stored `<>` becomes the kind's\n * template). Lossless for what rendered: every mapping is the projection\n * the v20 geometry applied. Returns null for a dimension with too few\n * points for its kind (it rendered nothing). Already-v21 input passes\n * through, so block scripts and agents emitting either shape are accepted\n * (blockDtos and the DXF importer run this after `dimensionRawToOffset`).\n */\nexport const dimensionRawToLabels = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"dimension\") return raw;\n // The v20 vector, as stored ({x, y}) or as a script/agent tuple.\n const legacyOffset = Array.isArray(raw.offset)\n ? { x: Number(raw.offset[0]), y: Number(raw.offset[1]) }\n : raw.offset !== null && typeof raw.offset === \"object\"\n ? (raw.offset as { x: number; y: number })\n : null;\n if (legacyOffset === null && !(\"textOverride\" in raw)) return raw;\n const kind = typeof raw.kind === \"string\" ? raw.kind : \"linear\";\n const points = (Array.isArray(raw.points) ? raw.points : []) as {\n x: number;\n y: number;\n }[];\n // Too few points for the kind: convert what can be (so the schema's\n // point-count message is the one error left), place nothing.\n const tooFew = points.length < dimensionPointCount(kind);\n\n const out: Record<string, unknown> = { ...raw };\n delete out.textOverride;\n const labels: Record<string, unknown>[] = Array.isArray(raw.labels)\n ? (raw.labels as Record<string, unknown>[]).map((l) => ({ ...l }))\n : [];\n const label = (i: number): Record<string, unknown> => (labels[i] ??= {});\n\n if (legacyOffset) {\n const v = legacyOffset;\n const vLen = Math.hypot(v.x, v.y);\n if (kind === \"linear\") {\n delete out.rotation;\n if (vLen < 1e-9 || tooFew) out.offset = 0;\n else {\n // v20 measured along perp(offset); keep that axis, normalized into\n // (-90°, 90°] so a horizontal dimension reads rotation 0 and the\n // offset's sign says which side (positive = left of the axis).\n let ux = -v.y / vLen;\n let uy = v.x / vLen;\n if (ux < 0 || (ux === 0 && uy < 0)) {\n ux = -ux;\n uy = -uy;\n }\n out.rotation = Math.atan2(uy, ux);\n out.offset = v.x * -uy + v.y * ux; // dot(v, perp(u))\n }\n } else if (kind === \"angular\") {\n if (tooFew) out.offset = vLen;\n else {\n const [vertex, a, b] = points;\n const angA = Math.atan2(a.y - vertex.y, a.x - vertex.x);\n const angB = Math.atan2(b.y - vertex.y, b.x - vertex.x);\n const angL = Math.atan2(v.y, v.x);\n const inAB = wrapAngle(angL - angA) <= wrapAngle(angB - angA);\n out.offset = inAB ? vLen : -vLen;\n }\n } else {\n delete out.offset;\n const [p0, p1] = points;\n const d = tooFew ? 0 : Math.hypot(p1.x - p0.x, p1.y - p0.y);\n if (d > 1e-9) {\n const ux = (p1.x - p0.x) / d;\n const uy = (p1.y - p0.y) / d;\n // radial: from the center along the ray; diameter: the v20 anchor\n // was the midpoint, which is the v21 origin (the center).\n label(0).along = v.x * ux + v.y * uy;\n }\n }\n }\n\n if (typeof raw.textOverride === \"string\") {\n const template: Record<string, string> = {\n linear: \"{value}\",\n angular: \"{value}°\",\n radial: \"R{value}\",\n diameter: \"Ø{value}\",\n };\n const content = raw.textOverride.replaceAll(\n \"<>\",\n template[kind] ?? \"{value}\",\n );\n const segments = kind === \"linear\" ? Math.max(1, points.length - 1) : 1;\n for (let i = 0; i < segments; i++) label(i).content = content;\n }\n\n if (labels.length > 0) out.labels = labels;\n return out;\n};\n\n/**\n * v20 → v21: dimension placement as scalars and per-segment labels\n * (docs/dimension-labels.md): `offset` vector → `rotation` + signed\n * `offset` (linear), signed radius (angular), `labels[0].along` (radial /\n * diameter); `textOverride` → `labels[i].content`. Dimensions with too few\n * points for their kind are dropped (they rendered nothing).\n */\nconst migrateV20toV21 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const degenerate = (raw: Record<string, unknown>): boolean =>\n raw.type === \"dimension\" &&\n (Array.isArray(raw.points) ? raw.points.length : 0) <\n dimensionPointCount(typeof raw.kind === \"string\" ? raw.kind : \"linear\");\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list)\n ? list\n .filter(\n (raw) =>\n raw === null ||\n typeof raw !== \"object\" ||\n !degenerate(raw as Record<string, unknown>),\n )\n .map((raw) =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToLabels(raw as Record<string, unknown>)\n : raw,\n )\n : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 21 };\n};\n\n/**\n * v21 → v22: no data change. Texts, table cells and dimension labels gained\n * optional `spans` (rich text, docs/rich-text.md §11.1), and table cells'\n * `text` became `content` — the cell schema still reads `text`\n * (objects.ts `cellInput`), so old bodies need no rewrite here. The bump\n * makes older builds REFUSE these files instead of silently dropping the\n * formatting / losing every cell's text on their next save.\n */\nconst migrateV21toV22 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...doc, version: 22 });\n\n/** Step N-1 migrates version N to N+1 (so the array has CURRENT-1 entries). */\nconst MIGRATION_STEPS = [\n migrateV1toV2,\n migrateV2toV3,\n migrateV3toV4,\n migrateV4toV5,\n migrateV5toV6,\n migrateV6toV7,\n migrateV7toV8,\n migrateV8toV9,\n migrateV9toV10,\n migrateV10toV11,\n migrateV11toV12,\n migrateV12toV13,\n migrateV13toV14,\n migrateV14toV15,\n migrateV15toV16,\n migrateV16toV17,\n migrateV17toV18,\n migrateV18toV19,\n migrateV19toV20,\n migrateV20toV21,\n migrateV21toV22,\n];\n\nexport function migrateDocument(raw: unknown): unknown {\n if (raw === null || typeof raw !== \"object\") return raw;\n let doc = raw as Record<string, unknown>;\n const version =\n typeof doc.version === \"number\" ? doc.version : CURRENT_DOCUMENT_VERSION;\n if (\n !Number.isInteger(version) ||\n version < 1 ||\n version > CURRENT_DOCUMENT_VERSION\n ) {\n // Loading a newer (or unknown) format \"as-is\" silently drops whatever\n // that version added, then SAVES the mangled result as the current\n // version — refuse instead and let the caller surface it.\n throw new Error(\n `Unsupported Linea document version ${version} (this build reads up to ${CURRENT_DOCUMENT_VERSION}). Open it with a newer Linea instead.`,\n );\n }\n for (let v = version; v < CURRENT_DOCUMENT_VERSION; v++) {\n doc = MIGRATION_STEPS[v - 1](doc);\n }\n return doc;\n}\n","// The geometry helpers block scripts import from the virtual \"lineadraw/helpers\"\n// module. SELF-CONTAINED ON PURPOSE: this file is a typings source for the\n// generated lineadraw.d.ts (npm run gen:lineadraw-dts) — no imports allowed; every\n// exported declaration lands verbatim inside `declare module \"lineadraw/helpers\"`,\n// so IntelliSense derives from the implementation and cannot drift.\n\n/** A 2D point (mm, y-up). A type ALIAS so editor hovers expand its shape. */\nexport type Vec2 = {\n x: number;\n y: number;\n};\n\n/** [0, 1, ..., n-1] — handy for repeating geometry. */\nexport const range = (n: number): number[] => [\n ...Array(Math.max(0, Math.floor(n))).keys(),\n];\n\n/** Point at `distance` from `p` in direction `angle` (radians, CCW). */\nexport const polar = (angle: number, distance: number, p?: Vec2): Vec2 => ({\n x: Math.cos(angle) * distance + (p ? p.x : 0),\n y: Math.sin(angle) * distance + (p ? p.y : 0),\n});\n\n/** Radians → degrees. */\nexport const toDeg = (r: number): number => (r * 180) / Math.PI;\n\n/** Degrees → radians. */\nexport const toRad = (d: number): number => (d * Math.PI) / 180;\n\n/** Length of a vector/point. */\nexport const len = (p: Vec2): number => Math.hypot(p.x, p.y);\n\n/** Distance between two points. */\nexport const dist = (a: Vec2, b: Vec2): number =>\n Math.hypot(b.x - a.x, b.y - a.y);\n\n/** Vector/point sum. */\nexport const add = (a: Vec2, b: Vec2): Vec2 => ({\n x: a.x + b.x,\n y: a.y + b.y,\n});\n\n/** Vector/point difference (a − b). */\nexport const sub = (a: Vec2, b: Vec2): Vec2 => ({\n x: a.x - b.x,\n y: a.y - b.y,\n});\n\n/** Scale a vector by a factor. */\nexport const scale = (p: Vec2, s: number): Vec2 => ({\n x: p.x * s,\n y: p.y * s,\n});\n\n/** Unit vector (a zero vector stays zero). */\nexport const norm = (p: Vec2): Vec2 => {\n const length = Math.hypot(p.x, p.y);\n return length === 0 ? { x: 0, y: 0 } : { x: p.x / length, y: p.y / length };\n};\n\n/** Dot product. */\nexport const dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n\n/** Rotate vector by `angle` (radians, CCW). */\nexport const rotate = (p: Vec2, angle: number): Vec2 => {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return { x: p.x * cos - p.y * sin, y: p.x * sin + p.y * cos };\n};\n\n/**\n * All helpers as one object — what migration-wrapped legacy scripts receive\n * via `import { helpers } from \"lineadraw\"`. New scripts import the named\n * functions from \"lineadraw/helpers\" instead.\n */\nexport const helpers = Object.freeze({\n range,\n polar,\n toDeg,\n toRad,\n len,\n dist,\n add,\n sub,\n scale,\n norm,\n dot,\n rotate,\n});\n","// The shared script runtime under BLOCK and COMMAND modules: lazy sucrase\n// transpilation (typescript + ESM→CJS) and `new Function` execution against\n// a `require` shim that resolves only the virtual \"lineadraw\" /\n// \"lineadraw/helpers\" modules (plus their frozen pre-rename \"linea\" aliases).\n// The user's own code, same-origin, no sandbox by design (calculus\n// getProfile pattern). Kind-specific normalization/validation stays with\n// evalBlock (blocks) and commandModules (commands).\n\n// The script-facing helpers live in their own SELF-CONTAINED module that\n// doubles as a typings source for the generated lineadraw.d.ts. The namespace\n// import IS what `require(\"lineadraw/helpers\")` hands to a compiled script, so\n// the typings match the runtime by construction.\nimport * as scriptHelpers from \"./scriptHelpers\";\n\n/**\n * Optional hook a reactive host registers so a re-render/re-evaluation is\n * triggered once the lazily-loaded transpiler finishes (scripts report a\n * transient error until then). No-op by default (headless).\n */\nlet onTranspilerReady: (() => void) | null = null;\nexport const setScriptTranspilerReadyCallback = (\n cb: (() => void) | null,\n): void => {\n onTranspilerReady = cb;\n};\n\n// Every script goes through sucrase: import/export syntax is a SyntaxError\n// to plain `new Function`, so there is no untranspiled fast path anymore.\n// sucrase is lazy-loaded so hosts without script documents never pay for it;\n// while it loads, evaluation reports a transient error and everything\n// re-evaluates on arrival (a reactive host should call\n// `ensureScriptTranspiler` eagerly to hide the flash).\nexport type ModuleExecutor = (script: string) => Record<string, unknown>;\nlet transpiler: ModuleExecutor | null = null;\nlet transpilerLoading: Promise<ModuleExecutor> | null = null;\n\n/** Load the script transpiler (idempotent). Awaited by save/insert flows.\n * Shared by block AND command modules. */\nexport const ensureScriptTranspiler = (): Promise<ModuleExecutor> => {\n if (transpiler) return Promise.resolve(transpiler);\n transpilerLoading ??= import(\"sucrase\").then(({ transform }) => {\n transpiler = (script: string) => {\n // ESM → CJS + type-stripping in one pass, then run the module body\n // once. Top-level code executes here (per script version, cached);\n // the exported functions run per evaluation.\n const code = transform(script, {\n transforms: [\"typescript\", \"imports\"],\n }).code;\n const moduleShim = { exports: {} as Record<string, unknown> };\n new Function(\"exports\", \"require\", \"module\", code)(\n moduleShim.exports,\n (spec: string) => {\n // \"linea\"/\"linea/helpers\" are the pre-rename specifiers — resolved\n // silently so documents and .block.ts files from before the\n // Lineadraw rename keep evaluating.\n if (spec === \"lineadraw/helpers\" || spec === \"linea/helpers\")\n return scriptHelpers;\n // \"lineadraw\" carries the runtime spec identities (defineBlock /\n // defineCommand — the types do all the work) plus the legacy\n // `helpers` object for migration-wrapped scripts; everything else\n // it declares is types, elided at transpile time.\n if (spec === \"lineadraw\" || spec === \"linea\")\n return {\n helpers: scriptHelpers.helpers,\n defineBlock: <T>(blockSpec: T): T => blockSpec,\n defineCommand: <T>(commandSpec: T): T => commandSpec,\n };\n throw new Error(\n `Cannot import \"${spec}\" — scripts may only import from \"lineadraw\" and \"lineadraw/helpers\"`,\n );\n },\n moduleShim,\n );\n const exported = moduleShim.exports;\n // A default-exported spec (`export default defineBlock({...})` or\n // `defineCommand({...})`) carries the same members as the named\n // exports — spread it over them so downstream reads one shape (spec\n // fields win).\n const spec = exported.default;\n return spec !== null && typeof spec === \"object\" && !Array.isArray(spec)\n ? { ...exported, ...(spec as Record<string, unknown>) }\n : exported;\n };\n // Scripts that failed while the transpiler loaded re-evaluate now.\n onTranspilerReady?.();\n return transpiler;\n });\n return transpilerLoading;\n};\n\n/**\n * Execute a raw script module: the transpiled exports with a default-exported\n * spec spread in, no kind-specific normalization or validation. The shared\n * lower layer under block and command compilation. Throws the transient\n * \"compiling\" error until the lazy transpiler has loaded.\n */\nexport const executeScriptModule = (\n script: string,\n): Record<string, unknown> => {\n if (!transpiler) throw transpilerLoadingError();\n return transpiler(script);\n};\n\n/** Whether the lazy transpiler has loaded (distinguishes \"compiling…\" from\n * a real script error in non-throwing meta lookups). */\nexport const scriptTranspilerReady = (): boolean => transpiler !== null;\n\n/** The transient not-yet-loaded error — kicks the load off as a side effect. */\nexport const transpilerLoadingError = (): Error => {\n void ensureScriptTranspiler();\n return new Error(\"Compiling block script…\");\n};\n","// Document-wide object lookup by id — model space plus every layout. Object\n// ids are uuids, unique across the whole document, so this is the correct\n// resolver for block object-reference inputs regardless of which space the\n// referencing instance lives in (BlockObjectResolver, blocks/evalBlock.ts).\n\nimport type { LineaDocument } from \"./document\";\nimport type { ModelObject } from \"./objects\";\n\n// One index per document VALUE: documents are replaced (never mutated) on\n// every change, so a WeakMap keyed by the document is self-invalidating.\n// Built lazily on the first miss-path lookup, not per mutation.\nconst indexCache = new WeakMap<LineaDocument, Map<string, ModelObject>>();\n\nconst indexOf = (doc: LineaDocument): Map<string, ModelObject> => {\n let index = indexCache.get(doc);\n if (!index) {\n index = new Map();\n for (const obj of doc.objects) index.set(obj.id, obj);\n for (const layout of doc.layouts)\n for (const obj of layout.objects) index.set(obj.id, obj);\n indexCache.set(doc, index);\n }\n return index;\n};\n\n/** Find an object anywhere in the document; undefined when absent. */\nexport const resolveDocumentObject = (\n doc: LineaDocument,\n id: string,\n): ModelObject | undefined => indexOf(doc).get(id);\n\n/** The lookup bound to one document — the shape block evaluation consumes. */\nexport const documentObjectResolver =\n (doc: LineaDocument): ((id: string) => ModelObject | undefined) =>\n (id) =>\n resolveDocumentObject(doc, id);\n","// Text measurement in world mm, independent of any render sink (used for\n// bounds, hit-testing, and alignment).\n//\n// The kernel cannot measure glyphs on its own — that needs either a canvas\n// (`measureText`) or precomputed font metrics — so measurement is INJECTED\n// via `TextMeasurer`. The editor supplies a canvas-backed implementation; a\n// Node consumer supplies an opentype.js / precomputed-Inter implementation.\n// `GeometrySink` already exposes a compatible `measureText`, so a sink can be\n// adapted to this interface directly.\n\n// AutoCAD's default MTEXT single line spacing: 1.66 × cap height.\nexport const LINE_HEIGHT_FACTOR = 1.66;\n\n// Tab stops every 4 × cap height (CAD convention). Tabs align columns WITHIN\n// one text object; separate objects line up because the interval convention\n// is shared — same as MTEXT.\nexport const TAB_SIZE_FACTOR = 4;\n\n/** Measures the on-screen width of a single line of text at a cap height. */\nexport interface TextMeasurer {\n /** Width of a single line in mm for the given cap height. Implementations\n * must honor `font` (id from model/fonts.ts) and `widthFactor`\n * (horizontal glyph scale) when provided. */\n measureTextWidth(\n text: string,\n heightMm: number,\n font?: string,\n widthFactor?: number,\n ): number;\n}\n\n/** A measurer with a font assignment baked in — lets object-aware callers\n * bind `(obj.font, obj.widthFactor)` once instead of threading them through\n * every wrap/width call. */\nexport const boundMeasurer = (\n measure: TextMeasurer,\n font?: string,\n widthFactor?: number,\n): TextMeasurer =>\n font === undefined && widthFactor === undefined\n ? measure\n : {\n measureTextWidth: (text, heightMm) =>\n measure.measureTextWidth(text, heightMm, font, widthFactor),\n };\n\nexport interface TextBlock {\n lines: string[];\n /** Widest line, mm. */\n width: number;\n /** Total block height, mm. */\n height: number;\n lineHeight: number;\n}\n\n/** One tab-delimited run of a line: its text and start offset from the\n * line's left edge (mm). */\nexport interface LineSegment {\n text: string;\n x: number;\n}\n\n/**\n * Split one line at tabs into positioned segments: each tab advances to the\n * next multiple of `TAB_SIZE_FACTOR × heightMm` past the previous segment's\n * measured end. Tab-less lines come back as one segment at x = 0.\n */\nexport const lineSegments = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n): LineSegment[] => {\n if (!line.includes(\"\\t\")) return [{ text: line, x: 0 }];\n const tab = heightMm * TAB_SIZE_FACTOR;\n const out: LineSegment[] = [];\n let x = 0;\n const parts = line.split(\"\\t\");\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) x = (Math.floor(x / tab + 1e-9) + 1) * tab;\n out.push({ text: parts[i], x });\n x += measure.measureTextWidth(parts[i], heightMm);\n }\n return out;\n};\n\n/** Width of one line in mm, tab stops expanded. */\nexport const lineWidthWithTabs = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n): number => {\n const segs = lineSegments(line, heightMm, measure);\n const last = segs[segs.length - 1];\n return last.x + measure.measureTextWidth(last.text, heightMm);\n};\n\n/** Greedy word-wrap of tab-less text to a max width (mm). Words wider than\n * the limit overflow on their own line rather than breaking mid-word. */\nconst wrapWords = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n maxWidthMm: number,\n): string[] => {\n const words = line.split(\" \");\n const out: string[] = [];\n let cur = \"\";\n for (const w of words) {\n const trial = cur ? `${cur} ${w}` : w;\n if (cur && measure.measureTextWidth(trial, heightMm) > maxWidthMm) {\n out.push(cur);\n cur = w;\n } else {\n cur = trial;\n }\n }\n out.push(cur);\n return out;\n};\n\n/** Word-wrap of one logical line to a max width (mm). */\nconst wrapLine = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n maxWidthMm: number,\n): string[] => {\n if (!line.includes(\"\\t\"))\n return wrapWords(line, heightMm, measure, maxWidthMm);\n // Tabbed line. A tabular row that FITS passes through unwrapped (breaking\n // a table row would misalign its columns). One that overflows is the MTEXT\n // bullet shape — \"-<tab>long paragraph\" — so wrap the text after the LAST\n // tab and hang continuation lines at its stop by re-prefixing the tabs\n // (stops are a fixed grid, so a leading tab run lands on the same stop).\n if (lineWidthWithTabs(line, heightMm, measure) <= maxWidthMm) return [line];\n const segs = lineSegments(line, heightMm, measure);\n const x0 = segs[segs.length - 1].x;\n if (maxWidthMm - x0 <= heightMm) return [line]; // stop ~past the box: give up\n const cut = line.lastIndexOf(\"\\t\") + 1;\n const tabs = \"\\t\".repeat(segs.length - 1);\n return wrapWords(line.slice(cut), heightMm, measure, maxWidthMm - x0).map(\n (l, i) => (i === 0 ? line.slice(0, cut) + l : tabs + l),\n );\n};\n\nexport const textBlock = (\n content: string,\n heightMm: number,\n measure: TextMeasurer,\n /** Word-wrap boundary in mm; also fixes the block width. */\n maxWidthMm?: number,\n): TextBlock => {\n const wrap = maxWidthMm !== undefined && maxWidthMm > 0;\n const lines = wrap\n ? content\n .split(\"\\n\")\n .flatMap((l) => wrapLine(l, heightMm, measure, maxWidthMm))\n : content.split(\"\\n\");\n const lineHeight = heightMm * LINE_HEIGHT_FACTOR;\n return {\n lines,\n // A fixed max width defines the box; otherwise it hugs the widest line.\n width: wrap\n ? maxWidthMm\n : Math.max(\n ...lines.map((l) => lineWidthWithTabs(l, heightMm, measure)),\n 0,\n ),\n height: heightMm + (lines.length - 1) * lineHeight,\n lineHeight,\n };\n};\n","// Rich text (docs/rich-text.md): character spans over a text's plain\n// `content` — normalization, range formatting, and the layout the painter,\n// bounds and snapping share. Texts without spans never come here; they keep\n// textMetrics' plain path, so their output cannot move.\n\nimport type { TextSpan } from \"../model/objects\";\nimport { fontFace, parseFontFace } from \"../model/fonts\";\nimport {\n LINE_HEIGHT_FACTOR,\n TAB_SIZE_FACTOR,\n type TextMeasurer,\n} from \"./textMetrics\";\n\n/** A span's formatting without its range. */\nexport type SpanAttrs = Omit<TextSpan, \"start\" | \"end\">;\n\nconst ATTR_KEYS = [\n \"font\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"color\",\n \"height\",\n \"script\",\n] as const satisfies readonly (keyof SpanAttrs)[];\n\n/** Sub/superscript glyphs: size and baseline shift, × the run's cap height.\n * The field (TextInputOverlay) renders with the same constants. */\nexport const SCRIPT_SCALE = 0.6;\nexport const SUPER_RISE = 0.45;\nexport const SUB_DROP = 0.2;\n\nconst attrsOf = (s: Partial<SpanAttrs>): SpanAttrs => {\n const out: Record<string, unknown> = {};\n for (const k of ATTR_KEYS) if (s[k] !== undefined) out[k] = s[k];\n return out as SpanAttrs;\n};\nconst sameAttrs = (a: SpanAttrs, b: SpanAttrs): boolean =>\n ATTR_KEYS.every((k) => a[k] === b[k]);\nconst isEmpty = (a: SpanAttrs): boolean =>\n ATTR_KEYS.every((k) => a[k] === undefined);\n\n/** Never put a boundary between the halves of a surrogate pair. */\nconst snap = (i: number, content: string): number => {\n const c = Math.max(0, Math.min(content.length, Math.round(i)));\n const code = content.charCodeAt(c);\n return c > 0 && code >= 0xdc00 && code <= 0xdfff ? c - 1 : c;\n};\n\ninterface Interval {\n start: number;\n end: number;\n attrs: SpanAttrs;\n}\n\n/** [0, length) cut at every span boundary (plus `extra` cuts), each piece\n * with the attributes of the spans covering it — later spans win. */\nconst toIntervals = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n extra: number[] = [],\n): Interval[] => {\n const cuts = new Set([0, content.length]);\n for (const s of spans ?? []) {\n cuts.add(snap(s.start, content));\n cuts.add(snap(s.end, content));\n }\n for (const c of extra) cuts.add(snap(c, content));\n const sorted = [...cuts].sort((a, b) => a - b);\n const out: Interval[] = [];\n for (let i = 0; i + 1 < sorted.length; i++) {\n const start = sorted[i];\n const end = sorted[i + 1];\n let attrs: SpanAttrs = {};\n for (const s of spans ?? [])\n if (snap(s.start, content) <= start && snap(s.end, content) >= end)\n attrs = { ...attrs, ...attrsOf(s) };\n out.push({ start, end, attrs });\n }\n return out;\n};\n\nconst fromIntervals = (intervals: Interval[]): TextSpan[] => {\n const out: TextSpan[] = [];\n for (const iv of intervals) {\n if (iv.end <= iv.start || isEmpty(iv.attrs)) continue;\n const last = out[out.length - 1];\n if (last && last.end === iv.start && sameAttrs(attrsOf(last), iv.attrs))\n last.end = iv.end;\n else out.push({ start: iv.start, end: iv.end, ...iv.attrs });\n }\n return out;\n};\n\n/** The canonical form: sorted, non-overlapping (later spans win), clamped\n * to the content, no empty or attribute-less spans, equal neighbours\n * merged. */\nexport const normalizeSpans = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n): TextSpan[] => fromIntervals(toIntervals(spans, content));\n\n/** Set (or, with `undefined`, clear) attributes over [start, end). */\nexport const formatSpans = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n start: number,\n end: number,\n patch: Partial<SpanAttrs>,\n): TextSpan[] => {\n const a = snap(Math.min(start, end), content);\n const b = snap(Math.max(start, end), content);\n return fromIntervals(\n toIntervals(spans, content, [a, b]).map((iv) => {\n if (iv.start < a || iv.end > b) return iv;\n const attrs: Record<string, unknown> = { ...iv.attrs, ...patch };\n for (const k of ATTR_KEYS) if (attrs[k] === undefined) delete attrs[k];\n return { ...iv, attrs: attrs as SpanAttrs };\n }),\n );\n};\n\n/** Attributes shared by every character of [start, end) — what a format\n * bar shows as \"on\". An empty range reads the character before it. */\nexport const spanAttrsAt = (\n spans: readonly TextSpan[] | undefined,\n content: string,\n start: number,\n end: number,\n): SpanAttrs => {\n const a = end > start ? start : Math.max(0, start - 1);\n const b = end > start ? end : a + 1;\n const hit = toIntervals(spans, content).filter(\n (iv) => iv.end > a && iv.start < b,\n );\n if (hit.length === 0) return {};\n const out: Record<string, unknown> = { ...hit[0].attrs };\n for (const iv of hit.slice(1))\n for (const k of ATTR_KEYS) if (out[k] !== iv.attrs[k]) delete out[k];\n return out as SpanAttrs;\n};\n\n/** The spans over [start, end), clipped to it and moved to start at `to`\n * — for text cut, joined or re-flowed (table wraps, merged cells). */\nexport const sliceSpans = (\n spans: readonly TextSpan[] | undefined,\n start: number,\n end: number,\n to = 0,\n): TextSpan[] =>\n (spans ?? [])\n .filter((s) => s.end > start && s.start < end)\n .map((s) => ({\n ...s,\n start: Math.max(s.start, start) - start + to,\n end: Math.min(s.end, end) - start + to,\n }));\n\n// ---- layout -----------------------------------------------------------------\n\n/** The text's resolved base style (what spans inherit). */\nexport interface RichBase {\n /** Face string (model/fonts.ts fontFace). */\n face: string | undefined;\n /** Cap height, mm, scale applied. */\n heightMm: number;\n widthFactor: number;\n}\n\n/** One drawn piece: uniform formatting, left edge at `x` (mm from the\n * line's left edge), baseline shifted `dy` (mm, up) for scripts. */\nexport interface RichPiece {\n text: string;\n x: number;\n width: number;\n dy: number;\n heightMm: number;\n face: string | undefined;\n color?: string;\n underline?: boolean;\n}\n\nexport interface RichLine {\n /** The content range this line shows. */\n start: number;\n end: number;\n pieces: RichPiece[];\n width: number;\n /** Tabbed / hanging lines run from the BLOCK's left edge whatever the\n * alignment (the plain painter's rule); others align on their own. */\n fromBlockEdge: boolean;\n /** Baseline, mm below the block's top edge (positive down). */\n baseline: number;\n}\n\nexport interface RichBlock {\n lines: RichLine[];\n width: number;\n height: number;\n}\n\ninterface Run extends Interval {\n face: string | undefined;\n /** The cap height the run's line is spaced by (scripts: their parent's). */\n cap: number;\n /** Drawn glyph cap height. */\n glyph: number;\n dy: number;\n}\n\n/**\n * Lay out formatted text: paragraphs at \"\\n\", tab stops every\n * TAB_SIZE_FACTOR × base height from the block's left edge (advanced with\n * `tabMeasure`, the deterministic measurer, like the plain painter), greedy\n * word wrap at `maxWidthMm` with a tabbed paragraph's continuation hanging\n * at its last tab stop. Lines are spaced LINE_HEIGHT_FACTOR × the mean cap\n * height of each neighbouring pair (uniform text: the plain spacing).\n */\nexport const richTextBlock = (\n content: string,\n spans: readonly TextSpan[] | undefined,\n base: RichBase,\n measure: TextMeasurer,\n tabMeasure: TextMeasurer,\n maxWidthMm?: number,\n): RichBlock => {\n const h = base.heightMm;\n const baseFace = parseFontFace(base.face);\n const runs: Run[] = toIntervals(spans, content).map((iv) => {\n const a = iv.attrs;\n const cap = h * (a.height ?? 1);\n return {\n ...iv,\n face: fontFace(\n a.font ?? baseFace.font,\n a.bold ?? baseFace.bold,\n a.italic ?? baseFace.italic,\n ),\n cap,\n glyph: a.script ? cap * SCRIPT_SCALE : cap,\n dy:\n a.script === \"super\"\n ? cap * SUPER_RISE\n : a.script === \"sub\"\n ? -cap * SUB_DROP\n : 0,\n };\n });\n const runsIn = (a: number, b: number) =>\n runs.filter((r) => r.end > a && r.start < b);\n const widthOf = (a: number, b: number, m: TextMeasurer) =>\n runsIn(a, b).reduce(\n (w, r) =>\n w +\n m.measureTextWidth(\n content.slice(Math.max(a, r.start), Math.min(b, r.end)),\n r.glyph,\n r.face,\n base.widthFactor,\n ),\n 0,\n );\n const tab = h * TAB_SIZE_FACTOR;\n const nextStop = (x: number) => (Math.floor(x / tab + 1e-9) + 1) * tab;\n\n /** Tab-split segments of [a, b) with their x (stops via tabMeasure). */\n const segments = (a: number, b: number) => {\n const out: { start: number; end: number; x: number }[] = [];\n let x = 0;\n let s = a;\n for (let i = a; i <= b; i++) {\n if (i < b && content[i] !== \"\\t\") continue;\n out.push({ start: s, end: i, x });\n x = nextStop(x + widthOf(s, i, tabMeasure));\n s = i + 1;\n }\n return out;\n };\n\n /** Greedy word wrap of [a, b) (no tabs) to `max`: [start, end) lines,\n * the breaking space dropped — textMetrics' wrapWords over ranges. */\n const wrapWords = (a: number, b: number, max: number) => {\n const out: [number, number][] = [];\n let lineStart = a;\n let cur = -1;\n for (let i = a; i <= b; i++) {\n if (i < b && content[i] !== \" \") continue;\n if (cur >= 0 && widthOf(lineStart, i, measure) > max) {\n out.push([lineStart, cur]);\n lineStart = cur + 1;\n }\n cur = i;\n }\n out.push([lineStart, b]);\n return out;\n };\n\n interface Raw {\n start: number;\n end: number;\n /** Continuation of a tabbed paragraph: hangs at this x. */\n hang?: number;\n tabbed: boolean;\n }\n const raw: Raw[] = [];\n let p0 = 0;\n for (const para of content.split(\"\\n\")) {\n const p1 = p0 + para.length;\n const tabbed = para.includes(\"\\t\");\n const wrap = maxWidthMm !== undefined && maxWidthMm > 0;\n if (!wrap) raw.push({ start: p0, end: p1, tabbed });\n else if (!tabbed)\n for (const [s, e] of wrapWords(p0, p1, maxWidthMm))\n raw.push({ start: s, end: e, tabbed });\n else {\n const segs = segments(p0, p1);\n const last = segs[segs.length - 1];\n const width = last.x + widthOf(last.start, last.end, measure);\n if (width <= maxWidthMm || maxWidthMm - last.x <= h)\n raw.push({ start: p0, end: p1, tabbed });\n else\n wrapWords(last.start, p1, maxWidthMm - last.x).forEach(([s, e], i) =>\n raw.push(\n i === 0\n ? { start: p0, end: e, tabbed }\n : { start: s, end: e, hang: last.x, tabbed },\n ),\n );\n }\n p0 = p1 + 1;\n }\n\n const lines: RichLine[] = [];\n let baseline = 0;\n let prevCap = 0;\n for (const r of raw) {\n const segs =\n r.hang !== undefined\n ? [{ start: r.start, end: r.end, x: r.hang }]\n : segments(r.start, r.end);\n const pieces: RichPiece[] = [];\n for (const seg of segs) {\n let x = seg.x;\n for (const run of runsIn(seg.start, seg.end)) {\n const text = content.slice(\n Math.max(seg.start, run.start),\n Math.min(seg.end, run.end),\n );\n const width = measure.measureTextWidth(\n text,\n run.glyph,\n run.face,\n base.widthFactor,\n );\n pieces.push({\n text,\n x,\n width,\n dy: run.dy,\n heightMm: run.glyph,\n face: run.face,\n ...(run.attrs.color ? { color: run.attrs.color } : {}),\n ...(run.attrs.underline ? { underline: true } : {}),\n });\n x += width;\n }\n }\n // An empty line spaces by the run at its position (or the base).\n const at = runsIn(r.start, Math.max(r.end, r.start + 1));\n const cap = Math.max(...at.map((run) => run.cap), at.length ? 0 : h);\n baseline +=\n lines.length === 0 ? cap : (LINE_HEIGHT_FACTOR * (prevCap + cap)) / 2;\n prevCap = cap;\n const last = pieces[pieces.length - 1];\n lines.push({\n start: r.start,\n end: r.end,\n pieces,\n width: last ? last.x + last.width : 0,\n fromBlockEdge: r.tabbed,\n baseline,\n });\n }\n return {\n lines,\n width:\n maxWidthMm !== undefined && maxWidthMm > 0\n ? maxWidthMm\n : Math.max(...lines.map((l) => l.width), 0),\n height: baseline,\n };\n};\n","// GENERATED — do not edit. Per-font advance widths (em units — ASCII,\n// Latin-1, Cyrillic, typography/CAD extras) and cap-height ratios,\n// extracted from the real TTFs for the headless measurer and the PDF\n// coverage checks. Regenerate with: npm run gen:fonts -w @lineadraw/core\nexport interface AdvanceTable {\n /** OS/2 sCapHeight / unitsPerEm. */\n capHeight: number;\n /** Fallback for characters outside the table (em). */\n defaultAdvance: number;\n /** Advance per character (em). */\n advances: Readonly<Record<string, number>>;\n}\n\n/** Codepoint ranges the tables extract — a char inside these but absent\n * from a font's table is a REAL coverage gap in that font. */\nexport const EXTRACTED_RANGES: readonly (readonly [number, number])[] = [\n [32, 126],\n [160, 255],\n [1024, 1119],\n];\nexport const EXTRACTED_EXTRAS = \"‐–—‘’‚“”„…‰•€™⌀№\";\n\n/** Keyed by font id, plus the bundled styled faces (\"arial;b\", …). */\nexport const ADVANCE_TABLES: Record<string, AdvanceTable> = {\n arial: {\n capHeight: 0.7163,\n defaultAdvance: 0.527,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.2778,\n '\"': 0.355,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.667,\n \"'\": 0.1909,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.2778,\n \";\": 0.2778,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.5562,\n \"@\": 1.0151,\n A: 0.667,\n B: 0.667,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5,\n K: 0.667,\n L: 0.5562,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.2778,\n \"\\\\\": 0.2778,\n \"]\": 0.2778,\n \"^\": 0.4692,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.5562,\n c: 0.5,\n d: 0.5562,\n e: 0.5562,\n f: 0.2778,\n g: 0.5562,\n h: 0.5562,\n i: 0.2222,\n j: 0.2222,\n k: 0.5,\n l: 0.2222,\n m: 0.833,\n n: 0.5562,\n o: 0.5562,\n p: 0.5562,\n q: 0.5562,\n r: 0.333,\n s: 0.5,\n t: 0.2778,\n u: 0.5562,\n v: 0.5,\n w: 0.7222,\n x: 0.5,\n y: 0.5,\n z: 0.5,\n \"{\": 0.334,\n \"|\": 0.2598,\n \"}\": 0.334,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2598,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"­\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5371,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.667,\n Á: 0.667,\n Â: 0.667,\n Ã: 0.667,\n Ä: 0.667,\n Å: 0.667,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.5562,\n ñ: 0.5562,\n ò: 0.5562,\n ó: 0.5562,\n ô: 0.5562,\n õ: 0.5562,\n ö: 0.5562,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.5562,\n ú: 0.5562,\n û: 0.5562,\n ü: 0.5562,\n ý: 0.5,\n þ: 0.5562,\n ÿ: 0.5,\n Ѐ: 0.667,\n Ё: 0.6675,\n Ђ: 0.8647,\n Ѓ: 0.5415,\n Є: 0.7188,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5,\n Љ: 1.0571,\n Њ: 1.0103,\n Ћ: 0.854,\n Ќ: 0.5825,\n Ѝ: 0.7188,\n Ў: 0.6353,\n Џ: 0.7188,\n А: 0.667,\n Б: 0.6563,\n В: 0.667,\n Г: 0.5415,\n Д: 0.6772,\n Е: 0.667,\n Ж: 0.9233,\n З: 0.604,\n И: 0.7188,\n Й: 0.7188,\n К: 0.5825,\n Л: 0.6563,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7188,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6353,\n Ф: 0.7603,\n Х: 0.667,\n Ц: 0.7397,\n Ч: 0.6665,\n Ш: 0.9165,\n Щ: 0.9375,\n Ъ: 0.7915,\n Ы: 0.8853,\n Ь: 0.6563,\n Э: 0.7188,\n Ю: 1.0103,\n Я: 0.7222,\n а: 0.5562,\n б: 0.5728,\n в: 0.5313,\n г: 0.3647,\n д: 0.5835,\n е: 0.5562,\n ж: 0.6689,\n з: 0.4585,\n и: 0.5586,\n й: 0.5586,\n к: 0.4375,\n л: 0.5835,\n м: 0.6875,\n н: 0.5522,\n о: 0.5562,\n п: 0.5415,\n р: 0.5562,\n с: 0.5,\n т: 0.458,\n у: 0.5,\n ф: 0.8228,\n х: 0.5,\n ц: 0.5728,\n ч: 0.521,\n ш: 0.8022,\n щ: 0.8228,\n ъ: 0.625,\n ы: 0.7188,\n ь: 0.521,\n э: 0.5103,\n ю: 0.75,\n я: 0.5415,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.5562,\n ѓ: 0.3647,\n є: 0.5103,\n ѕ: 0.5,\n і: 0.2222,\n ї: 0.2778,\n ј: 0.2222,\n љ: 0.9063,\n њ: 0.8125,\n ћ: 0.5562,\n ќ: 0.4375,\n ѝ: 0.5586,\n ў: 0.5,\n џ: 0.5522,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2222,\n \"’\": 0.2222,\n \"‚\": 0.2222,\n \"“\": 0.333,\n \"”\": 0.333,\n \"„\": 0.333,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.0728,\n },\n },\n \"arial;b\": {\n capHeight: 0.7163,\n defaultAdvance: 0.5513,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.333,\n '\"': 0.4741,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.7222,\n \"'\": 0.2378,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.333,\n \";\": 0.333,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.6108,\n \"@\": 0.9751,\n A: 0.7222,\n B: 0.7222,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5562,\n K: 0.7222,\n L: 0.6108,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.333,\n \"\\\\\": 0.2778,\n \"]\": 0.333,\n \"^\": 0.584,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.6108,\n c: 0.5562,\n d: 0.6108,\n e: 0.5562,\n f: 0.333,\n g: 0.6108,\n h: 0.6108,\n i: 0.2778,\n j: 0.2778,\n k: 0.5562,\n l: 0.2778,\n m: 0.8892,\n n: 0.6108,\n o: 0.6108,\n p: 0.6108,\n q: 0.6108,\n r: 0.3892,\n s: 0.5562,\n t: 0.333,\n u: 0.6108,\n v: 0.5562,\n w: 0.7778,\n x: 0.5562,\n y: 0.5562,\n z: 0.5,\n \"{\": 0.3892,\n \"|\": 0.2798,\n \"}\": 0.3892,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2798,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"­\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5562,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.7222,\n Á: 0.7222,\n Â: 0.7222,\n Ã: 0.7222,\n Ä: 0.7222,\n Å: 0.7222,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5562,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.6108,\n ñ: 0.6108,\n ò: 0.6108,\n ó: 0.6108,\n ô: 0.6108,\n õ: 0.6108,\n ö: 0.6108,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.6108,\n ú: 0.6108,\n û: 0.6108,\n ü: 0.6108,\n ý: 0.5562,\n þ: 0.6108,\n ÿ: 0.5562,\n Ѐ: 0.667,\n Ё: 0.6689,\n Ђ: 0.8853,\n Ѓ: 0.5669,\n Є: 0.7114,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2759,\n Ј: 0.5562,\n Љ: 1.0938,\n Њ: 1.0625,\n Ћ: 0.875,\n Ќ: 0.6104,\n Ѝ: 0.7188,\n Ў: 0.6221,\n Џ: 0.7188,\n А: 0.7222,\n Б: 0.7188,\n В: 0.7222,\n Г: 0.5669,\n Д: 0.7124,\n Е: 0.667,\n Ж: 0.9038,\n З: 0.6265,\n И: 0.7188,\n Й: 0.7188,\n К: 0.6104,\n Л: 0.7017,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7188,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6221,\n Ф: 0.8535,\n Х: 0.667,\n Ц: 0.7305,\n Ч: 0.7026,\n Ш: 1.0049,\n Щ: 1.019,\n Ъ: 0.8696,\n Ы: 0.979,\n Ь: 0.7188,\n Э: 0.7114,\n Ю: 1.0313,\n Я: 0.7188,\n а: 0.5562,\n б: 0.6177,\n в: 0.6147,\n г: 0.4165,\n д: 0.6348,\n е: 0.5562,\n ж: 0.709,\n з: 0.4971,\n и: 0.6147,\n й: 0.6147,\n к: 0.5005,\n л: 0.6353,\n м: 0.7397,\n н: 0.604,\n о: 0.6108,\n п: 0.604,\n р: 0.6108,\n с: 0.5562,\n т: 0.4897,\n у: 0.5562,\n ф: 0.875,\n х: 0.5562,\n ц: 0.6147,\n ч: 0.5806,\n ш: 0.8335,\n щ: 0.8438,\n ъ: 0.729,\n ы: 0.854,\n ь: 0.6147,\n э: 0.5522,\n ю: 0.854,\n я: 0.5835,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.6108,\n ѓ: 0.4165,\n є: 0.5522,\n ѕ: 0.5562,\n і: 0.2778,\n ї: 0.2813,\n ј: 0.2778,\n љ: 0.9688,\n њ: 0.9063,\n ћ: 0.6108,\n ќ: 0.5005,\n ѝ: 0.6147,\n ў: 0.5562,\n џ: 0.604,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2778,\n \"’\": 0.2778,\n \"‚\": 0.2778,\n \"“\": 0.5,\n \"”\": 0.5,\n \"„\": 0.5,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.1147,\n },\n },\n \"arial;i\": {\n capHeight: 0.7163,\n defaultAdvance: 0.527,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.2778,\n '\"': 0.355,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.667,\n \"'\": 0.1909,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.2778,\n \";\": 0.2778,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.5562,\n \"@\": 1.0151,\n A: 0.667,\n B: 0.667,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5,\n K: 0.667,\n L: 0.5562,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.2778,\n \"\\\\\": 0.2778,\n \"]\": 0.2778,\n \"^\": 0.4692,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.5562,\n c: 0.5,\n d: 0.5562,\n e: 0.5562,\n f: 0.2778,\n g: 0.5562,\n h: 0.5562,\n i: 0.2222,\n j: 0.2222,\n k: 0.5,\n l: 0.2222,\n m: 0.833,\n n: 0.5562,\n o: 0.5562,\n p: 0.5562,\n q: 0.5562,\n r: 0.333,\n s: 0.5,\n t: 0.2778,\n u: 0.5562,\n v: 0.5,\n w: 0.7222,\n x: 0.5,\n y: 0.5,\n z: 0.5,\n \"{\": 0.334,\n \"|\": 0.2598,\n \"}\": 0.334,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2598,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"­\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5371,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.667,\n Á: 0.667,\n Â: 0.667,\n Ã: 0.667,\n Ä: 0.667,\n Å: 0.667,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.5562,\n ñ: 0.5562,\n ò: 0.5562,\n ó: 0.5562,\n ô: 0.5562,\n õ: 0.5562,\n ö: 0.5562,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.5562,\n ú: 0.5562,\n û: 0.5562,\n ü: 0.5562,\n ý: 0.5,\n þ: 0.5562,\n ÿ: 0.5,\n Ѐ: 0.667,\n Ё: 0.667,\n Ђ: 0.8428,\n Ѓ: 0.5439,\n Є: 0.7075,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5,\n Љ: 1.0659,\n Њ: 0.9824,\n Ћ: 0.8442,\n Ќ: 0.5894,\n Ѝ: 0.7153,\n Ў: 0.6392,\n Џ: 0.7236,\n А: 0.667,\n Б: 0.6509,\n В: 0.667,\n Г: 0.5439,\n Д: 0.7041,\n Е: 0.667,\n Ж: 0.917,\n З: 0.6138,\n И: 0.7153,\n Й: 0.7153,\n К: 0.5894,\n Л: 0.6855,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7246,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6392,\n Ф: 0.7949,\n Х: 0.667,\n Ц: 0.7271,\n Ч: 0.6733,\n Ш: 0.9204,\n Щ: 0.9229,\n Ъ: 0.8052,\n Ы: 0.8862,\n Ь: 0.6509,\n Э: 0.6938,\n Ю: 1.0225,\n Я: 0.6816,\n а: 0.5562,\n б: 0.5625,\n в: 0.522,\n г: 0.4932,\n д: 0.5527,\n е: 0.5562,\n ж: 0.688,\n з: 0.4648,\n и: 0.5562,\n й: 0.5562,\n к: 0.4722,\n л: 0.564,\n м: 0.6855,\n н: 0.5503,\n о: 0.5562,\n п: 0.5503,\n р: 0.5562,\n с: 0.5,\n т: 0.833,\n у: 0.5,\n ф: 0.8354,\n х: 0.5,\n ц: 0.5718,\n ч: 0.5176,\n ш: 0.8301,\n щ: 0.8511,\n ъ: 0.6211,\n ы: 0.7358,\n ь: 0.5259,\n э: 0.4917,\n ю: 0.752,\n я: 0.5342,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.5562,\n ѓ: 0.3779,\n є: 0.4956,\n ѕ: 0.5,\n і: 0.2222,\n ї: 0.2222,\n ј: 0.2222,\n љ: 0.9102,\n њ: 0.8276,\n ћ: 0.5562,\n ќ: 0.4722,\n ѝ: 0.5562,\n ў: 0.5,\n џ: 0.5562,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2222,\n \"’\": 0.2222,\n \"‚\": 0.2222,\n \"“\": 0.333,\n \"”\": 0.333,\n \"„\": 0.333,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.083,\n },\n },\n \"arial;bi\": {\n capHeight: 0.7163,\n defaultAdvance: 0.5513,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.333,\n '\"': 0.4741,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.7222,\n \"'\": 0.2378,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.333,\n \";\": 0.333,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.6108,\n \"@\": 0.9751,\n A: 0.7222,\n B: 0.7222,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5562,\n K: 0.7222,\n L: 0.6108,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.333,\n \"\\\\\": 0.2778,\n \"]\": 0.333,\n \"^\": 0.584,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.6108,\n c: 0.5562,\n d: 0.6108,\n e: 0.5562,\n f: 0.333,\n g: 0.6108,\n h: 0.6108,\n i: 0.2778,\n j: 0.2778,\n k: 0.5562,\n l: 0.2778,\n m: 0.8892,\n n: 0.6108,\n o: 0.6108,\n p: 0.6108,\n q: 0.6108,\n r: 0.3892,\n s: 0.5562,\n t: 0.333,\n u: 0.6108,\n v: 0.5562,\n w: 0.7778,\n x: 0.5562,\n y: 0.5562,\n z: 0.5,\n \"{\": 0.3892,\n \"|\": 0.2798,\n \"}\": 0.3892,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2798,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"­\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5562,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.7222,\n Á: 0.7222,\n Â: 0.7222,\n Ã: 0.7222,\n Ä: 0.7222,\n Å: 0.7222,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5562,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.6108,\n ñ: 0.6108,\n ò: 0.6108,\n ó: 0.6108,\n ô: 0.6108,\n õ: 0.6108,\n ö: 0.6108,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.6108,\n ú: 0.6108,\n û: 0.6108,\n ü: 0.6108,\n ý: 0.5562,\n þ: 0.6108,\n ÿ: 0.5562,\n Ѐ: 0.667,\n Ё: 0.667,\n Ђ: 0.8857,\n Ѓ: 0.6138,\n Є: 0.7188,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5562,\n Љ: 1.0942,\n Њ: 1.042,\n Ћ: 0.8535,\n Ќ: 0.6147,\n Ѝ: 0.7192,\n Ў: 0.6772,\n Џ: 0.7192,\n А: 0.7222,\n Б: 0.708,\n В: 0.7222,\n Г: 0.6138,\n Д: 0.7222,\n Е: 0.667,\n Ж: 0.9272,\n З: 0.6426,\n И: 0.7192,\n Й: 0.7192,\n К: 0.6147,\n Л: 0.687,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7192,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6772,\n Ф: 0.7808,\n Х: 0.667,\n Ц: 0.729,\n Ч: 0.708,\n Ш: 0.979,\n Щ: 0.9888,\n Ъ: 0.854,\n Ы: 1,\n Ь: 0.708,\n Э: 0.7188,\n Ю: 1.042,\n Я: 0.729,\n а: 0.5562,\n б: 0.6191,\n в: 0.604,\n г: 0.5337,\n д: 0.6182,\n е: 0.5562,\n ж: 0.7363,\n з: 0.5103,\n и: 0.6108,\n й: 0.6108,\n к: 0.5068,\n л: 0.6221,\n м: 0.7397,\n н: 0.604,\n о: 0.6108,\n п: 0.6108,\n р: 0.6108,\n с: 0.5562,\n т: 0.8892,\n у: 0.5562,\n ф: 0.8848,\n х: 0.5562,\n ц: 0.646,\n ч: 0.583,\n ш: 0.8892,\n щ: 0.9351,\n ъ: 0.707,\n ы: 0.854,\n ь: 0.5938,\n э: 0.5518,\n ю: 0.8647,\n я: 0.5889,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.6108,\n ѓ: 0.4692,\n є: 0.563,\n ѕ: 0.5562,\n і: 0.2778,\n ї: 0.2778,\n ј: 0.2778,\n љ: 0.9692,\n њ: 0.9058,\n ћ: 0.6108,\n ќ: 0.5068,\n ѝ: 0.6108,\n ў: 0.5562,\n џ: 0.6108,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2778,\n \"’\": 0.2778,\n \"‚\": 0.2778,\n \"“\": 0.5,\n \"”\": 0.5,\n \"„\": 0.5,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.146,\n },\n },\n osifont: {\n capHeight: 0.7397,\n defaultAdvance: 0.4659,\n advances: {\n \"0\": 0.4678,\n \"1\": 0.3418,\n \"2\": 0.4663,\n \"3\": 0.4805,\n \"4\": 0.5132,\n \"5\": 0.4971,\n \"6\": 0.4946,\n \"7\": 0.478,\n \"8\": 0.5156,\n \"9\": 0.5029,\n \" \": 0.4346,\n \"!\": 0.2197,\n '\"': 0.3911,\n \"#\": 0.6133,\n $: 0.4658,\n \"%\": 0.7637,\n \"&\": 0.6143,\n \"'\": 0.2036,\n \"(\": 0.2549,\n \")\": 0.2549,\n \"*\": 0.4639,\n \"+\": 0.4648,\n \",\": 0.2329,\n \"-\": 0.4648,\n \".\": 0.2012,\n \"/\": 0.4912,\n \":\": 0.2222,\n \";\": 0.2549,\n \"<\": 0.4648,\n \"=\": 0.4639,\n \">\": 0.4648,\n \"?\": 0.4644,\n \"@\": 0.8105,\n A: 0.6143,\n B: 0.582,\n C: 0.4902,\n D: 0.5884,\n E: 0.4897,\n F: 0.4897,\n G: 0.5796,\n H: 0.5908,\n I: 0.2207,\n J: 0.4136,\n K: 0.564,\n L: 0.4917,\n M: 0.666,\n N: 0.5869,\n O: 0.5874,\n P: 0.5625,\n Q: 0.5967,\n R: 0.564,\n S: 0.5396,\n T: 0.5376,\n U: 0.5889,\n V: 0.6147,\n W: 0.7612,\n X: 0.6162,\n Y: 0.6143,\n Z: 0.54,\n \"[\": 0.2656,\n \"\\\\\": 0.4619,\n \"]\": 0.2656,\n \"^\": 0.3896,\n _: 0.4648,\n \"`\": 0.3154,\n a: 0.4814,\n b: 0.5029,\n c: 0.4048,\n d: 0.5034,\n e: 0.4956,\n f: 0.439,\n g: 0.5024,\n h: 0.5034,\n i: 0.2183,\n j: 0.2178,\n k: 0.4917,\n l: 0.2676,\n m: 0.6421,\n n: 0.4937,\n o: 0.4927,\n p: 0.5073,\n q: 0.5073,\n r: 0.4072,\n s: 0.4658,\n t: 0.3472,\n u: 0.4941,\n v: 0.4658,\n w: 0.6118,\n x: 0.4644,\n y: 0.4644,\n z: 0.4639,\n \"{\": 0.3145,\n \"|\": 0.2207,\n \"}\": 0.3145,\n \"~\": 0.4658,\n \" \": 0.4346,\n \"¡\": 0.2197,\n \"¢\": 0.4785,\n \"£\": 0.5649,\n \"¤\": 0.5313,\n \"§\": 0.5205,\n \"©\": 0.668,\n \"«\": 0.5391,\n \"®\": 0.668,\n \"°\": 0.3906,\n \"±\": 0.4648,\n \"²\": 0.3213,\n \"³\": 0.3281,\n \"´\": 0.3154,\n µ: 0.5488,\n \"¶\": 0.5942,\n \"·\": 0.2207,\n \"¹\": 0.293,\n \"»\": 0.5391,\n \"¼\": 0.6416,\n \"½\": 0.6172,\n \"¾\": 0.6572,\n \"¿\": 0.4644,\n À: 0.6143,\n Á: 0.6143,\n Â: 0.6143,\n Ã: 0.6143,\n Ä: 0.6143,\n Å: 0.6143,\n Æ: 0.7637,\n Ç: 0.4902,\n È: 0.4897,\n É: 0.4897,\n Ê: 0.4897,\n Ë: 0.4897,\n Ì: 0.2207,\n Í: 0.2207,\n Î: 0.2207,\n Ï: 0.2207,\n Ð: 0.6274,\n Ñ: 0.5869,\n Ò: 0.5874,\n Ó: 0.5874,\n Ô: 0.5874,\n Õ: 0.5874,\n Ö: 0.5874,\n \"×\": 0.4673,\n Ø: 0.5913,\n Ù: 0.5889,\n Ú: 0.5889,\n Û: 0.5889,\n Ü: 0.5889,\n Ý: 0.6143,\n Þ: 0.5029,\n ß: 0.5879,\n à: 0.4814,\n á: 0.4814,\n â: 0.4814,\n ã: 0.4814,\n ä: 0.4814,\n å: 0.4814,\n æ: 0.6387,\n ç: 0.4048,\n è: 0.4956,\n é: 0.4956,\n ê: 0.4956,\n ë: 0.4956,\n ì: 0.2183,\n í: 0.2183,\n î: 0.2183,\n ï: 0.2183,\n ð: 0.4946,\n ñ: 0.4937,\n ò: 0.4927,\n ó: 0.4927,\n ô: 0.4927,\n õ: 0.4927,\n ö: 0.4927,\n \"÷\": 0.4663,\n ø: 0.5454,\n ù: 0.4941,\n ú: 0.4941,\n û: 0.4941,\n ü: 0.4941,\n ý: 0.4644,\n þ: 0.5029,\n ÿ: 0.4644,\n Ѐ: 0.5,\n Ё: 0.5,\n Ђ: 0.6689,\n Ѓ: 0.5093,\n Є: 0.4902,\n Ѕ: 0.5396,\n І: 0.2207,\n Ї: 0.2969,\n Ј: 0.4136,\n Љ: 0.96,\n Њ: 0.9414,\n Ћ: 0.6689,\n Ќ: 0.5234,\n Ѝ: 0.5967,\n Ў: 0.4155,\n Џ: 0.6416,\n А: 0.6143,\n Б: 0.5591,\n В: 0.5713,\n Г: 0.5093,\n Д: 0.6157,\n Е: 0.5,\n Ж: 0.793,\n З: 0.4805,\n И: 0.5967,\n Й: 0.5967,\n К: 0.5234,\n Л: 0.6226,\n М: 0.6719,\n Н: 0.6045,\n О: 0.5337,\n П: 0.6045,\n Р: 0.5615,\n С: 0.458,\n Т: 0.4839,\n У: 0.4155,\n Ф: 0.6733,\n Х: 0.5293,\n Ц: 0.6416,\n Ч: 0.5015,\n Ш: 0.7891,\n Щ: 0.8145,\n Ъ: 0.7197,\n Ы: 0.7544,\n Ь: 0.5029,\n Э: 0.4492,\n Ю: 0.769,\n Я: 0.5386,\n а: 0.4814,\n б: 0.4487,\n в: 0.4775,\n г: 0.4463,\n д: 0.5425,\n е: 0.4468,\n ж: 0.5664,\n з: 0.4063,\n и: 0.6138,\n й: 0.6138,\n к: 0.4683,\n л: 0.52,\n м: 0.6025,\n н: 0.5273,\n о: 0.436,\n п: 0.5283,\n р: 0.4766,\n с: 0.3403,\n т: 0.4771,\n у: 0.3906,\n ф: 0.6021,\n х: 0.3804,\n ц: 0.54,\n ч: 0.4697,\n ш: 0.5913,\n щ: 0.6313,\n ъ: 0.4883,\n ы: 0.6509,\n ь: 0.4814,\n э: 0.4302,\n ю: 0.6201,\n я: 0.4497,\n ѐ: 0.4468,\n ё: 0.4468,\n ђ: 0.5259,\n ѓ: 0.4463,\n є: 0.4048,\n ѕ: 0.4658,\n і: 0.2183,\n ї: 0.2969,\n ј: 0.2178,\n љ: 0.7783,\n њ: 0.7622,\n ћ: 0.5259,\n ќ: 0.4683,\n ѝ: 0.6138,\n ў: 0.3906,\n џ: 0.54,\n \"–\": 0.5,\n \"—\": 0.6421,\n \"’\": 0.2329,\n \"‰\": 1.1665,\n \"•\": 0.3477,\n \"€\": 0.8516,\n \"™\": 0.8394,\n \"⌀\": 0.668,\n \"№\": 0.9233,\n },\n },\n \"osifont-italic\": {\n capHeight: 0.7397,\n defaultAdvance: 0.425,\n advances: {\n \"0\": 0.4326,\n \"1\": 0.3154,\n \"2\": 0.4316,\n \"3\": 0.4443,\n \"4\": 0.4756,\n \"5\": 0.4595,\n \"6\": 0.457,\n \"7\": 0.4419,\n \"8\": 0.4766,\n \"9\": 0.4648,\n \" \": 0.395,\n \"!\": 0.2012,\n '\"': 0.3613,\n \"#\": 0.5684,\n $: 0.4312,\n \"%\": 0.708,\n \"&\": 0.5688,\n \"'\": 0.187,\n \"(\": 0.2344,\n \")\": 0.2344,\n \"*\": 0.4292,\n \"+\": 0.4302,\n \",\": 0.2139,\n \"-\": 0.4302,\n \".\": 0.1841,\n \"/\": 0.4541,\n \":\": 0.2036,\n \";\": 0.2339,\n \"<\": 0.4302,\n \"=\": 0.4292,\n \">\": 0.4302,\n \"?\": 0.4297,\n \"@\": 0.7505,\n A: 0.5688,\n B: 0.5381,\n C: 0.4531,\n D: 0.5439,\n E: 0.4526,\n F: 0.4526,\n G: 0.5361,\n H: 0.5464,\n I: 0.2021,\n J: 0.3818,\n K: 0.522,\n L: 0.4546,\n M: 0.6162,\n N: 0.5425,\n O: 0.543,\n P: 0.5205,\n Q: 0.5532,\n R: 0.522,\n S: 0.4995,\n T: 0.4976,\n U: 0.5444,\n V: 0.5693,\n W: 0.7056,\n X: 0.5708,\n Y: 0.5688,\n Z: 0.5,\n \"[\": 0.2441,\n \"\\\\\": 0.4272,\n \"]\": 0.2441,\n \"^\": 0.3604,\n _: 0.4302,\n \"`\": 0.291,\n a: 0.4224,\n b: 0.4414,\n c: 0.354,\n d: 0.4424,\n e: 0.4351,\n f: 0.3853,\n g: 0.4419,\n h: 0.4424,\n i: 0.1963,\n j: 0.188,\n k: 0.4292,\n l: 0.2378,\n m: 0.563,\n n: 0.4331,\n o: 0.4321,\n p: 0.4458,\n q: 0.4458,\n r: 0.3584,\n s: 0.4082,\n t: 0.3018,\n u: 0.4336,\n v: 0.4058,\n w: 0.5303,\n x: 0.4146,\n y: 0.4146,\n z: 0.4141,\n \"{\": 0.29,\n \"|\": 0.2021,\n \"}\": 0.29,\n \"~\": 0.4312,\n \" \": 0.395,\n \"¡\": 0.2012,\n \"¢\": 0.4424,\n \"£\": 0.5244,\n \"¤\": 0.4922,\n \"§\": 0.4819,\n \"©\": 0.6191,\n \"«\": 0.499,\n \"®\": 0.6191,\n \"°\": 0.3613,\n \"±\": 0.4302,\n \"²\": 0.2964,\n \"³\": 0.3027,\n \"´\": 0.3154,\n µ: 0.4795,\n \"¶\": 0.5503,\n \"·\": 0.2021,\n \"¹\": 0.27,\n \"»\": 0.499,\n \"¼\": 0.5952,\n \"½\": 0.5718,\n \"¾\": 0.6094,\n \"¿\": 0.4297,\n À: 0.5688,\n Á: 0.5688,\n Â: 0.5688,\n Ã: 0.5688,\n Ä: 0.5688,\n Å: 0.5688,\n Æ: 0.708,\n Ç: 0.4531,\n È: 0.4526,\n É: 0.4526,\n Ê: 0.4526,\n Ë: 0.4526,\n Ì: 0.2021,\n Í: 0.2021,\n Î: 0.2021,\n Ï: 0.2021,\n Ð: 0.582,\n Ñ: 0.5425,\n Ò: 0.543,\n Ó: 0.543,\n Ô: 0.543,\n Õ: 0.543,\n Ö: 0.543,\n \"×\": 0.4326,\n Ø: 0.5498,\n Ù: 0.5444,\n Ú: 0.5444,\n Û: 0.5444,\n Ü: 0.5444,\n Ý: 0.5688,\n Þ: 0.4648,\n ß: 0.5151,\n à: 0.4224,\n á: 0.4224,\n â: 0.4224,\n ã: 0.4224,\n ä: 0.4224,\n å: 0.4224,\n æ: 0.5601,\n ç: 0.354,\n è: 0.4351,\n é: 0.4351,\n ê: 0.4351,\n ë: 0.4351,\n ì: 0.1963,\n í: 0.1963,\n î: 0.1963,\n ï: 0.1963,\n ð: 0.4341,\n ñ: 0.4331,\n ò: 0.4321,\n ó: 0.4321,\n ô: 0.4321,\n õ: 0.4321,\n ö: 0.4321,\n \"÷\": 0.4316,\n ø: 0.4727,\n ù: 0.4336,\n ú: 0.4336,\n û: 0.4336,\n ü: 0.4336,\n ý: 0.4146,\n þ: 0.4414,\n ÿ: 0.4146,\n Ѐ: 0.4619,\n Ё: 0.4619,\n Ђ: 0.6206,\n Ѓ: 0.4712,\n Є: 0.4531,\n Ѕ: 0.4995,\n І: 0.2021,\n Ї: 0.2759,\n Ј: 0.3818,\n Љ: 0.8916,\n Њ: 0.8726,\n Ћ: 0.6206,\n Ќ: 0.4849,\n Ѝ: 0.5513,\n Ў: 0.3853,\n Џ: 0.5928,\n А: 0.5688,\n Б: 0.5176,\n В: 0.5283,\n Г: 0.4712,\n Д: 0.5718,\n Е: 0.4619,\n Ж: 0.7373,\n З: 0.4443,\n И: 0.5513,\n Й: 0.5513,\n К: 0.4849,\n Л: 0.5771,\n М: 0.6216,\n Н: 0.5586,\n О: 0.5337,\n П: 0.5586,\n Р: 0.5195,\n С: 0.4238,\n Т: 0.4487,\n У: 0.3853,\n Ф: 0.6245,\n Х: 0.4917,\n Ц: 0.5942,\n Ч: 0.4634,\n Ш: 0.7305,\n Щ: 0.7549,\n Ъ: 0.6685,\n Ы: 0.6982,\n Ь: 0.4648,\n Э: 0.416,\n Ю: 0.7124,\n Я: 0.499,\n а: 0.4224,\n б: 0.3931,\n в: 0.4185,\n г: 0.3882,\n д: 0.4751,\n е: 0.3911,\n ж: 0.4912,\n з: 0.355,\n и: 0.5366,\n й: 0.5415,\n к: 0.4077,\n л: 0.4536,\n м: 0.5269,\n н: 0.4624,\n о: 0.3813,\n п: 0.4634,\n р: 0.418,\n с: 0.2954,\n т: 0.4121,\n у: 0.3472,\n ф: 0.5254,\n х: 0.3379,\n ц: 0.4741,\n ч: 0.4121,\n ш: 0.521,\n щ: 0.5547,\n ъ: 0.4233,\n ы: 0.5708,\n ь: 0.4414,\n э: 0.373,\n ю: 0.5425,\n я: 0.3936,\n ѐ: 0.3911,\n ё: 0.3931,\n ђ: 0.457,\n ѓ: 0.3882,\n є: 0.354,\n ѕ: 0.4082,\n і: 0.1963,\n ї: 0.2607,\n ј: 0.188,\n љ: 0.6753,\n њ: 0.6636,\n ћ: 0.457,\n ќ: 0.4077,\n ѝ: 0.5366,\n ў: 0.3472,\n џ: 0.4785,\n \"–\": 0.4629,\n \"—\": 0.5947,\n \"’\": 0.2139,\n \"‰\": 1.082,\n \"•\": 0.3203,\n \"€\": 0.7905,\n \"™\": 0.7778,\n \"⌀\": 0.6191,\n \"№\": 0.856,\n },\n },\n \"jetbrains-mono\": {\n capHeight: 0.73,\n defaultAdvance: 0.6,\n advances: {\n \"0\": 0.6,\n \"1\": 0.6,\n \"2\": 0.6,\n \"3\": 0.6,\n \"4\": 0.6,\n \"5\": 0.6,\n \"6\": 0.6,\n \"7\": 0.6,\n \"8\": 0.6,\n \"9\": 0.6,\n \" \": 0.6,\n \"!\": 0.6,\n '\"': 0.6,\n \"#\": 0.6,\n $: 0.6,\n \"%\": 0.6,\n \"&\": 0.6,\n \"'\": 0.6,\n \"(\": 0.6,\n \")\": 0.6,\n \"*\": 0.6,\n \"+\": 0.6,\n \",\": 0.6,\n \"-\": 0.6,\n \".\": 0.6,\n \"/\": 0.6,\n \":\": 0.6,\n \";\": 0.6,\n \"<\": 0.6,\n \"=\": 0.6,\n \">\": 0.6,\n \"?\": 0.6,\n \"@\": 0.6,\n A: 0.6,\n B: 0.6,\n C: 0.6,\n D: 0.6,\n E: 0.6,\n F: 0.6,\n G: 0.6,\n H: 0.6,\n I: 0.6,\n J: 0.6,\n K: 0.6,\n L: 0.6,\n M: 0.6,\n N: 0.6,\n O: 0.6,\n P: 0.6,\n Q: 0.6,\n R: 0.6,\n S: 0.6,\n T: 0.6,\n U: 0.6,\n V: 0.6,\n W: 0.6,\n X: 0.6,\n Y: 0.6,\n Z: 0.6,\n \"[\": 0.6,\n \"\\\\\": 0.6,\n \"]\": 0.6,\n \"^\": 0.6,\n _: 0.6,\n \"`\": 0.6,\n a: 0.6,\n b: 0.6,\n c: 0.6,\n d: 0.6,\n e: 0.6,\n f: 0.6,\n g: 0.6,\n h: 0.6,\n i: 0.6,\n j: 0.6,\n k: 0.6,\n l: 0.6,\n m: 0.6,\n n: 0.6,\n o: 0.6,\n p: 0.6,\n q: 0.6,\n r: 0.6,\n s: 0.6,\n t: 0.6,\n u: 0.6,\n v: 0.6,\n w: 0.6,\n x: 0.6,\n y: 0.6,\n z: 0.6,\n \"{\": 0.6,\n \"|\": 0.6,\n \"}\": 0.6,\n \"~\": 0.6,\n \" \": 0.6,\n \"¡\": 0.6,\n \"¢\": 0.6,\n \"£\": 0.6,\n \"¤\": 0.6,\n \"¥\": 0.6,\n \"¦\": 0.6,\n \"§\": 0.6,\n \"¨\": 0.6,\n \"©\": 0.6,\n ª: 0.6,\n \"«\": 0.6,\n \"¬\": 0.6,\n \"®\": 0.6,\n \"¯\": 0.6,\n \"°\": 0.6,\n \"±\": 0.6,\n \"²\": 0.6,\n \"³\": 0.6,\n \"´\": 0.6,\n µ: 0.6,\n \"¶\": 0.6,\n \"·\": 0.6,\n \"¸\": 0.6,\n \"¹\": 0.6,\n º: 0.6,\n \"»\": 0.6,\n \"¼\": 0.6,\n \"½\": 0.6,\n \"¾\": 0.6,\n \"¿\": 0.6,\n À: 0.6,\n Á: 0.6,\n Â: 0.6,\n Ã: 0.6,\n Ä: 0.6,\n Å: 0.6,\n Æ: 0.6,\n Ç: 0.6,\n È: 0.6,\n É: 0.6,\n Ê: 0.6,\n Ë: 0.6,\n Ì: 0.6,\n Í: 0.6,\n Î: 0.6,\n Ï: 0.6,\n Ð: 0.6,\n Ñ: 0.6,\n Ò: 0.6,\n Ó: 0.6,\n Ô: 0.6,\n Õ: 0.6,\n Ö: 0.6,\n \"×\": 0.6,\n Ø: 0.6,\n Ù: 0.6,\n Ú: 0.6,\n Û: 0.6,\n Ü: 0.6,\n Ý: 0.6,\n Þ: 0.6,\n ß: 0.6,\n à: 0.6,\n á: 0.6,\n â: 0.6,\n ã: 0.6,\n ä: 0.6,\n å: 0.6,\n æ: 0.6,\n ç: 0.6,\n è: 0.6,\n é: 0.6,\n ê: 0.6,\n ë: 0.6,\n ì: 0.6,\n í: 0.6,\n î: 0.6,\n ï: 0.6,\n ð: 0.6,\n ñ: 0.6,\n ò: 0.6,\n ó: 0.6,\n ô: 0.6,\n õ: 0.6,\n ö: 0.6,\n \"÷\": 0.6,\n ø: 0.6,\n ù: 0.6,\n ú: 0.6,\n û: 0.6,\n ü: 0.6,\n ý: 0.6,\n þ: 0.6,\n ÿ: 0.6,\n Ё: 0.6,\n Ђ: 0.6,\n Ѓ: 0.6,\n Є: 0.6,\n Ѕ: 0.6,\n І: 0.6,\n Ї: 0.6,\n Ј: 0.6,\n Љ: 0.6,\n Њ: 0.6,\n Ћ: 0.6,\n Ќ: 0.6,\n Ў: 0.6,\n Џ: 0.6,\n А: 0.6,\n Б: 0.6,\n В: 0.6,\n Г: 0.6,\n Д: 0.6,\n Е: 0.6,\n Ж: 0.6,\n З: 0.6,\n И: 0.6,\n Й: 0.6,\n К: 0.6,\n Л: 0.6,\n М: 0.6,\n Н: 0.6,\n О: 0.6,\n П: 0.6,\n Р: 0.6,\n С: 0.6,\n Т: 0.6,\n У: 0.6,\n Ф: 0.6,\n Х: 0.6,\n Ц: 0.6,\n Ч: 0.6,\n Ш: 0.6,\n Щ: 0.6,\n Ъ: 0.6,\n Ы: 0.6,\n Ь: 0.6,\n Э: 0.6,\n Ю: 0.6,\n Я: 0.6,\n а: 0.6,\n б: 0.6,\n в: 0.6,\n г: 0.6,\n д: 0.6,\n е: 0.6,\n ж: 0.6,\n з: 0.6,\n и: 0.6,\n й: 0.6,\n к: 0.6,\n л: 0.6,\n м: 0.6,\n н: 0.6,\n о: 0.6,\n п: 0.6,\n р: 0.6,\n с: 0.6,\n т: 0.6,\n у: 0.6,\n ф: 0.6,\n х: 0.6,\n ц: 0.6,\n ч: 0.6,\n ш: 0.6,\n щ: 0.6,\n ъ: 0.6,\n ы: 0.6,\n ь: 0.6,\n э: 0.6,\n ю: 0.6,\n я: 0.6,\n ё: 0.6,\n ђ: 0.6,\n ѓ: 0.6,\n є: 0.6,\n ѕ: 0.6,\n і: 0.6,\n ї: 0.6,\n ј: 0.6,\n љ: 0.6,\n њ: 0.6,\n ћ: 0.6,\n ќ: 0.6,\n ў: 0.6,\n џ: 0.6,\n \"‐\": 0.6,\n \"–\": 0.6,\n \"—\": 0.6,\n \"‘\": 0.6,\n \"’\": 0.6,\n \"‚\": 0.6,\n \"“\": 0.6,\n \"”\": 0.6,\n \"„\": 0.6,\n \"…\": 0.6,\n \"‰\": 0.6,\n \"•\": 0.6,\n \"€\": 0.6,\n \"™\": 0.6,\n \"№\": 0.6,\n },\n },\n \"source-serif\": {\n capHeight: 0.67,\n defaultAdvance: 0.5169,\n advances: {\n \"0\": 0.5,\n \"1\": 0.5,\n \"2\": 0.5,\n \"3\": 0.5,\n \"4\": 0.5,\n \"5\": 0.5,\n \"6\": 0.5,\n \"7\": 0.5,\n \"8\": 0.5,\n \"9\": 0.5,\n \" \": 0.233,\n \"!\": 0.289,\n '\"': 0.356,\n \"#\": 0.526,\n $: 0.5,\n \"%\": 0.88,\n \"&\": 0.72,\n \"'\": 0.183,\n \"(\": 0.339,\n \")\": 0.339,\n \"*\": 0.439,\n \"+\": 0.53,\n \",\": 0.3,\n \"-\": 0.312,\n \".\": 0.3,\n \"/\": 0.33,\n \":\": 0.3,\n \";\": 0.3,\n \"<\": 0.53,\n \"=\": 0.53,\n \">\": 0.53,\n \"?\": 0.416,\n \"@\": 0.835,\n A: 0.664,\n B: 0.629,\n C: 0.631,\n D: 0.71,\n E: 0.603,\n F: 0.579,\n G: 0.682,\n H: 0.788,\n I: 0.371,\n J: 0.374,\n K: 0.667,\n L: 0.596,\n M: 0.902,\n N: 0.735,\n O: 0.707,\n P: 0.589,\n Q: 0.707,\n R: 0.651,\n S: 0.512,\n T: 0.604,\n U: 0.727,\n V: 0.674,\n W: 0.962,\n X: 0.648,\n Y: 0.633,\n Z: 0.551,\n \"[\": 0.32,\n \"\\\\\": 0.33,\n \"]\": 0.32,\n \"^\": 0.531,\n _: 0.512,\n \"`\": 0.4,\n a: 0.509,\n b: 0.577,\n c: 0.488,\n d: 0.567,\n e: 0.51,\n f: 0.354,\n g: 0.518,\n h: 0.601,\n i: 0.298,\n j: 0.277,\n k: 0.547,\n l: 0.298,\n m: 0.901,\n n: 0.606,\n o: 0.549,\n p: 0.583,\n q: 0.557,\n r: 0.423,\n s: 0.434,\n t: 0.325,\n u: 0.583,\n v: 0.505,\n w: 0.764,\n x: 0.526,\n y: 0.512,\n z: 0.456,\n \"{\": 0.344,\n \"|\": 0.291,\n \"}\": 0.344,\n \"~\": 0.53,\n \" \": 0.233,\n \"¡\": 0.289,\n \"¢\": 0.5,\n \"£\": 0.5,\n \"¤\": 0.502,\n \"¥\": 0.5,\n \"¦\": 0.291,\n \"§\": 0.491,\n \"¨\": 0.4,\n \"©\": 0.755,\n ª: 0.351,\n \"«\": 0.487,\n \"¬\": 0.53,\n \"­\": 0.312,\n \"®\": 0.459,\n \"¯\": 0.4,\n \"°\": 0.328,\n \"±\": 0.53,\n \"²\": 0.37,\n \"³\": 0.37,\n \"´\": 0.4,\n µ: 0.569,\n \"¶\": 0.598,\n \"·\": 0.3,\n \"¸\": 0.4,\n \"¹\": 0.37,\n º: 0.377,\n \"»\": 0.487,\n \"¼\": 0.85,\n \"½\": 0.88,\n \"¾\": 0.85,\n \"¿\": 0.416,\n À: 0.664,\n Á: 0.664,\n Â: 0.664,\n Ã: 0.664,\n Ä: 0.664,\n Å: 0.664,\n Æ: 0.92,\n Ç: 0.631,\n È: 0.603,\n É: 0.603,\n Ê: 0.603,\n Ë: 0.603,\n Ì: 0.371,\n Í: 0.371,\n Î: 0.371,\n Ï: 0.371,\n Ð: 0.71,\n Ñ: 0.735,\n Ò: 0.707,\n Ó: 0.707,\n Ô: 0.707,\n Õ: 0.707,\n Ö: 0.707,\n \"×\": 0.53,\n Ø: 0.707,\n Ù: 0.727,\n Ú: 0.727,\n Û: 0.727,\n Ü: 0.727,\n Ý: 0.633,\n Þ: 0.611,\n ß: 0.592,\n à: 0.509,\n á: 0.509,\n â: 0.509,\n ã: 0.509,\n ä: 0.509,\n å: 0.509,\n æ: 0.786,\n ç: 0.488,\n è: 0.51,\n é: 0.51,\n ê: 0.51,\n ë: 0.51,\n ì: 0.298,\n í: 0.298,\n î: 0.298,\n ï: 0.298,\n ð: 0.546,\n ñ: 0.606,\n ò: 0.549,\n ó: 0.549,\n ô: 0.549,\n õ: 0.549,\n ö: 0.549,\n \"÷\": 0.53,\n ø: 0.549,\n ù: 0.583,\n ú: 0.583,\n û: 0.583,\n ü: 0.583,\n ý: 0.512,\n þ: 0.554,\n ÿ: 0.512,\n Ѐ: 0.603,\n Ё: 0.603,\n Ђ: 0.701,\n Ѓ: 0.56,\n Є: 0.615,\n Ѕ: 0.512,\n І: 0.371,\n Ї: 0.371,\n Ј: 0.374,\n Љ: 0.894,\n Њ: 1.002,\n Ћ: 0.755,\n Ќ: 0.653,\n Ѝ: 0.797,\n Ў: 0.67,\n Џ: 0.769,\n А: 0.664,\n Б: 0.618,\n В: 0.629,\n Г: 0.56,\n Д: 0.691,\n Е: 0.603,\n Ж: 0.918,\n З: 0.55,\n И: 0.797,\n Й: 0.797,\n К: 0.653,\n Л: 0.693,\n М: 0.902,\n Н: 0.788,\n О: 0.707,\n П: 0.775,\n Р: 0.589,\n С: 0.631,\n Т: 0.604,\n У: 0.67,\n Ф: 0.721,\n Х: 0.648,\n Ц: 0.769,\n Ч: 0.701,\n Ш: 1.043,\n Щ: 1.044,\n Ъ: 0.697,\n Ы: 0.914,\n Ь: 0.609,\n Э: 0.612,\n Ю: 0.995,\n Я: 0.642,\n а: 0.509,\n б: 0.543,\n в: 0.517,\n г: 0.447,\n д: 0.567,\n е: 0.51,\n ж: 0.758,\n з: 0.43,\n и: 0.645,\n й: 0.645,\n к: 0.553,\n л: 0.577,\n м: 0.742,\n н: 0.633,\n о: 0.549,\n п: 0.626,\n р: 0.583,\n с: 0.488,\n т: 0.528,\n у: 0.512,\n ф: 0.735,\n х: 0.526,\n ц: 0.622,\n ч: 0.554,\n ш: 0.856,\n щ: 0.858,\n ъ: 0.615,\n ы: 0.75,\n ь: 0.505,\n э: 0.48,\n ю: 0.8,\n я: 0.532,\n ѐ: 0.51,\n ё: 0.51,\n ђ: 0.535,\n ѓ: 0.447,\n є: 0.488,\n ѕ: 0.434,\n і: 0.298,\n ї: 0.298,\n ј: 0.277,\n љ: 0.754,\n њ: 0.818,\n ћ: 0.601,\n ќ: 0.553,\n ѝ: 0.645,\n ў: 0.512,\n џ: 0.634,\n \"‐\": 0.312,\n \"–\": 0.512,\n \"—\": 0.812,\n \"‘\": 0.212,\n \"’\": 0.212,\n \"‚\": 0.212,\n \"“\": 0.415,\n \"”\": 0.415,\n \"„\": 0.415,\n \"…\": 0.82,\n \"‰\": 1.25,\n \"•\": 0.305,\n \"€\": 0.5,\n \"™\": 0.722,\n \"№\": 1.009,\n },\n },\n \"roboto-condensed\": {\n capHeight: 0.7109,\n defaultAdvance: 0.453,\n advances: {\n \"0\": 0.4937,\n \"1\": 0.4937,\n \"2\": 0.4937,\n \"3\": 0.4937,\n \"4\": 0.4937,\n \"5\": 0.4937,\n \"6\": 0.4937,\n \"7\": 0.4937,\n \"8\": 0.4937,\n \"9\": 0.4937,\n \" \": 0.2295,\n \"!\": 0.2461,\n '\"': 0.3203,\n \"#\": 0.5479,\n $: 0.4937,\n \"%\": 0.6328,\n \"&\": 0.5439,\n \"'\": 0.1748,\n \"(\": 0.314,\n \")\": 0.3188,\n \"*\": 0.4307,\n \"+\": 0.4971,\n \",\": 0.1968,\n \"-\": 0.248,\n \".\": 0.2637,\n \"/\": 0.3711,\n \":\": 0.2334,\n \";\": 0.2026,\n \"<\": 0.4458,\n \"=\": 0.479,\n \">\": 0.4604,\n \"?\": 0.4224,\n \"@\": 0.769,\n A: 0.5767,\n B: 0.5459,\n C: 0.5669,\n D: 0.5708,\n E: 0.4971,\n F: 0.481,\n G: 0.5908,\n H: 0.6201,\n I: 0.25,\n J: 0.4834,\n K: 0.5454,\n L: 0.4756,\n M: 0.7554,\n N: 0.6196,\n O: 0.6011,\n P: 0.5542,\n Q: 0.6011,\n R: 0.5308,\n S: 0.5186,\n T: 0.5205,\n U: 0.5615,\n V: 0.5605,\n W: 0.7617,\n X: 0.5513,\n Y: 0.5249,\n Z: 0.5229,\n \"[\": 0.2505,\n \"\\\\\": 0.3696,\n \"]\": 0.2505,\n \"^\": 0.3711,\n _: 0.4048,\n \"`\": 0.3091,\n a: 0.479,\n b: 0.4932,\n c: 0.4619,\n d: 0.4961,\n e: 0.4688,\n f: 0.3164,\n g: 0.4932,\n h: 0.4829,\n i: 0.2295,\n j: 0.2241,\n k: 0.4507,\n l: 0.2295,\n m: 0.7529,\n n: 0.4844,\n o: 0.502,\n p: 0.4932,\n q: 0.5005,\n r: 0.3047,\n s: 0.4561,\n t: 0.2959,\n u: 0.4834,\n v: 0.4277,\n w: 0.6499,\n x: 0.439,\n y: 0.4165,\n z: 0.439,\n \"{\": 0.3066,\n \"|\": 0.2441,\n \"}\": 0.3066,\n \"~\": 0.5894,\n \" \": 0.2295,\n \"¡\": 0.2319,\n \"¢\": 0.48,\n \"£\": 0.5112,\n \"¤\": 0.7134,\n \"¥\": 0.4639,\n \"¦\": 0.2402,\n \"§\": 0.5376,\n \"¨\": 0.4185,\n \"©\": 0.7856,\n ª: 0.3965,\n \"«\": 0.418,\n \"¬\": 0.4873,\n \"­\": 0.248,\n \"®\": 0.7861,\n \"¯\": 0.4146,\n \"°\": 0.3735,\n \"±\": 0.4702,\n \"²\": 0.3296,\n \"³\": 0.3296,\n \"´\": 0.3135,\n µ: 0.4985,\n \"¶\": 0.4346,\n \"·\": 0.2437,\n \"¸\": 0.2295,\n \"¹\": 0.3296,\n º: 0.4033,\n \"»\": 0.418,\n \"¼\": 0.6377,\n \"½\": 0.6777,\n \"¾\": 0.6733,\n \"¿\": 0.4219,\n À: 0.5767,\n Á: 0.5767,\n Â: 0.5767,\n Ã: 0.5767,\n Ä: 0.5767,\n Å: 0.5767,\n Æ: 0.8125,\n Ç: 0.5669,\n È: 0.4971,\n É: 0.4971,\n Ê: 0.4971,\n Ë: 0.4971,\n Ì: 0.25,\n Í: 0.25,\n Î: 0.25,\n Ï: 0.25,\n Ð: 0.5854,\n Ñ: 0.6196,\n Ò: 0.6011,\n Ó: 0.6011,\n Ô: 0.6011,\n Õ: 0.6011,\n Ö: 0.6011,\n \"×\": 0.4707,\n Ø: 0.6011,\n Ù: 0.5615,\n Ú: 0.5615,\n Û: 0.5615,\n Ü: 0.5615,\n Ý: 0.5249,\n Þ: 0.5151,\n ß: 0.522,\n à: 0.479,\n á: 0.479,\n â: 0.479,\n ã: 0.479,\n ä: 0.479,\n å: 0.479,\n æ: 0.7285,\n ç: 0.4619,\n è: 0.4688,\n é: 0.4688,\n ê: 0.4688,\n ë: 0.4688,\n ì: 0.2354,\n í: 0.2354,\n î: 0.2354,\n ï: 0.2354,\n ð: 0.5137,\n ñ: 0.4844,\n ò: 0.502,\n ó: 0.502,\n ô: 0.502,\n õ: 0.502,\n ö: 0.502,\n \"÷\": 0.5,\n ø: 0.4985,\n ù: 0.4834,\n ú: 0.4834,\n û: 0.4834,\n ü: 0.4834,\n ý: 0.4165,\n þ: 0.5083,\n ÿ: 0.4165,\n Ѐ: 0.4971,\n Ё: 0.4971,\n Ђ: 0.6509,\n Ѓ: 0.4883,\n Є: 0.5903,\n Ѕ: 0.5186,\n І: 0.25,\n Ї: 0.25,\n Ј: 0.4834,\n Љ: 0.9243,\n Њ: 0.9272,\n Ћ: 0.7061,\n Ќ: 0.5454,\n Ѝ: 0.6196,\n Ў: 0.5479,\n Џ: 0.6211,\n А: 0.5767,\n Б: 0.5498,\n В: 0.5459,\n Г: 0.4883,\n Д: 0.6602,\n Е: 0.4971,\n Ж: 0.791,\n З: 0.5176,\n И: 0.6196,\n Й: 0.6196,\n К: 0.5605,\n Л: 0.6157,\n М: 0.7554,\n Н: 0.6201,\n О: 0.6011,\n П: 0.6206,\n Р: 0.5542,\n С: 0.5669,\n Т: 0.5205,\n У: 0.5479,\n Ф: 0.6772,\n Х: 0.5513,\n Ц: 0.6396,\n Ч: 0.6006,\n Ш: 0.8149,\n Щ: 0.8418,\n Ъ: 0.6519,\n Ы: 0.7559,\n Ь: 0.5513,\n Э: 0.5903,\n Ю: 0.7656,\n Я: 0.5625,\n а: 0.479,\n б: 0.4849,\n в: 0.5034,\n г: 0.3716,\n д: 0.5361,\n е: 0.4688,\n ж: 0.6626,\n з: 0.4468,\n и: 0.5093,\n й: 0.5093,\n к: 0.4805,\n л: 0.5103,\n м: 0.646,\n н: 0.5088,\n о: 0.502,\n п: 0.5093,\n р: 0.4932,\n с: 0.4619,\n т: 0.4253,\n у: 0.4165,\n ф: 0.6289,\n х: 0.439,\n ц: 0.5244,\n ч: 0.48,\n ш: 0.7041,\n щ: 0.7227,\n ъ: 0.5381,\n ы: 0.6802,\n ь: 0.4785,\n э: 0.4722,\n ю: 0.7061,\n я: 0.4824,\n ѐ: 0.4688,\n ё: 0.4688,\n ђ: 0.4829,\n ѓ: 0.3716,\n є: 0.4722,\n ѕ: 0.4561,\n і: 0.2295,\n ї: 0.2354,\n ј: 0.2241,\n љ: 0.73,\n њ: 0.7432,\n ћ: 0.4985,\n ќ: 0.4805,\n ѝ: 0.5093,\n ў: 0.4165,\n џ: 0.5093,\n \"‐\": 0.2485,\n \"–\": 0.5723,\n \"—\": 0.6782,\n \"‘\": 0.1948,\n \"’\": 0.1948,\n \"‚\": 0.1953,\n \"“\": 0.334,\n \"”\": 0.3374,\n \"„\": 0.3267,\n \"…\": 0.5903,\n \"‰\": 0.8188,\n \"•\": 0.3374,\n \"€\": 0.4937,\n \"™\": 0.5479,\n \"№\": 0.8862,\n },\n },\n \"noto-sans\": {\n capHeight: 0.714,\n defaultAdvance: 0.5336,\n advances: {\n \"0\": 0.572,\n \"1\": 0.572,\n \"2\": 0.572,\n \"3\": 0.572,\n \"4\": 0.572,\n \"5\": 0.572,\n \"6\": 0.572,\n \"7\": 0.572,\n \"8\": 0.572,\n \"9\": 0.572,\n \" \": 0.26,\n \"!\": 0.269,\n '\"': 0.408,\n \"#\": 0.646,\n $: 0.572,\n \"%\": 0.831,\n \"&\": 0.732,\n \"'\": 0.225,\n \"(\": 0.3,\n \")\": 0.3,\n \"*\": 0.551,\n \"+\": 0.572,\n \",\": 0.268,\n \"-\": 0.322,\n \".\": 0.268,\n \"/\": 0.372,\n \":\": 0.268,\n \";\": 0.268,\n \"<\": 0.572,\n \"=\": 0.572,\n \">\": 0.572,\n \"?\": 0.434,\n \"@\": 0.899,\n A: 0.639,\n B: 0.65,\n C: 0.632,\n D: 0.73,\n E: 0.556,\n F: 0.519,\n G: 0.728,\n H: 0.741,\n I: 0.339,\n J: 0.273,\n K: 0.619,\n L: 0.524,\n M: 0.907,\n N: 0.76,\n O: 0.781,\n P: 0.605,\n Q: 0.781,\n R: 0.622,\n S: 0.549,\n T: 0.556,\n U: 0.731,\n V: 0.6,\n W: 0.93,\n X: 0.586,\n Y: 0.566,\n Z: 0.572,\n \"[\": 0.329,\n \"\\\\\": 0.372,\n \"]\": 0.329,\n \"^\": 0.572,\n _: 0.444,\n \"`\": 0.281,\n a: 0.561,\n b: 0.615,\n c: 0.48,\n d: 0.615,\n e: 0.564,\n f: 0.344,\n g: 0.615,\n h: 0.618,\n i: 0.258,\n j: 0.258,\n k: 0.534,\n l: 0.258,\n m: 0.935,\n n: 0.618,\n o: 0.605,\n p: 0.615,\n q: 0.615,\n r: 0.413,\n s: 0.479,\n t: 0.361,\n u: 0.618,\n v: 0.508,\n w: 0.786,\n x: 0.529,\n y: 0.51,\n z: 0.47,\n \"{\": 0.38,\n \"|\": 0.551,\n \"}\": 0.38,\n \"~\": 0.572,\n \" \": 0.26,\n \"¡\": 0.269,\n \"¢\": 0.572,\n \"£\": 0.572,\n \"¤\": 0.572,\n \"¥\": 0.572,\n \"¦\": 0.551,\n \"§\": 0.513,\n \"¨\": 0.58,\n \"©\": 0.832,\n ª: 0.357,\n \"«\": 0.509,\n \"¬\": 0.572,\n \"­\": 0.322,\n \"®\": 0.832,\n \"¯\": 0.5,\n \"°\": 0.428,\n \"±\": 0.572,\n \"²\": 0.35,\n \"³\": 0.35,\n \"´\": 0.281,\n µ: 0.623,\n \"¶\": 0.655,\n \"·\": 0.268,\n \"¸\": 0.225,\n \"¹\": 0.35,\n º: 0.376,\n \"»\": 0.509,\n \"¼\": 0.745,\n \"½\": 0.771,\n \"¾\": 0.781,\n \"¿\": 0.434,\n À: 0.639,\n Á: 0.639,\n Â: 0.639,\n Ã: 0.639,\n Ä: 0.639,\n Å: 0.639,\n Æ: 0.881,\n Ç: 0.632,\n È: 0.556,\n É: 0.556,\n Ê: 0.556,\n Ë: 0.556,\n Ì: 0.339,\n Í: 0.339,\n Î: 0.339,\n Ï: 0.339,\n Ð: 0.73,\n Ñ: 0.76,\n Ò: 0.781,\n Ó: 0.781,\n Ô: 0.781,\n Õ: 0.781,\n Ö: 0.781,\n \"×\": 0.572,\n Ø: 0.781,\n Ù: 0.731,\n Ú: 0.731,\n Û: 0.731,\n Ü: 0.731,\n Ý: 0.566,\n Þ: 0.605,\n ß: 0.631,\n à: 0.561,\n á: 0.561,\n â: 0.561,\n ã: 0.561,\n ä: 0.561,\n å: 0.561,\n æ: 0.864,\n ç: 0.48,\n è: 0.564,\n é: 0.564,\n ê: 0.564,\n ë: 0.564,\n ì: 0.258,\n í: 0.258,\n î: 0.258,\n ï: 0.258,\n ð: 0.605,\n ñ: 0.618,\n ò: 0.605,\n ó: 0.605,\n ô: 0.605,\n õ: 0.605,\n ö: 0.605,\n \"÷\": 0.572,\n ø: 0.605,\n ù: 0.618,\n ú: 0.618,\n û: 0.618,\n ü: 0.618,\n ý: 0.51,\n þ: 0.615,\n ÿ: 0.51,\n Ѐ: 0.556,\n Ё: 0.556,\n Ђ: 0.716,\n Ѓ: 0.509,\n Є: 0.639,\n Ѕ: 0.549,\n І: 0.284,\n Ї: 0.284,\n Ј: 0.273,\n Љ: 1.01,\n Њ: 1.027,\n Ћ: 0.715,\n Ќ: 0.625,\n Ѝ: 0.756,\n Ў: 0.616,\n Џ: 0.731,\n А: 0.638,\n Б: 0.614,\n В: 0.65,\n Г: 0.509,\n Д: 0.729,\n Е: 0.556,\n Ж: 0.905,\n З: 0.577,\n И: 0.756,\n Й: 0.756,\n К: 0.625,\n Л: 0.698,\n М: 0.907,\n Н: 0.743,\n О: 0.761,\n П: 0.733,\n Р: 0.605,\n С: 0.64,\n Т: 0.556,\n У: 0.616,\n Ф: 0.817,\n Х: 0.588,\n Ц: 0.74,\n Ч: 0.673,\n Ш: 1.035,\n Щ: 1.026,\n Ъ: 0.685,\n Ы: 0.849,\n Ь: 0.607,\n Э: 0.647,\n Ю: 0.999,\n Я: 0.638,\n а: 0.556,\n б: 0.597,\n в: 0.564,\n г: 0.438,\n д: 0.607,\n е: 0.551,\n ж: 0.759,\n з: 0.488,\n и: 0.621,\n й: 0.621,\n к: 0.531,\n л: 0.587,\n м: 0.768,\n н: 0.614,\n о: 0.594,\n п: 0.606,\n р: 0.608,\n с: 0.493,\n т: 0.465,\n у: 0.509,\n ф: 0.737,\n х: 0.511,\n ц: 0.612,\n ч: 0.589,\n ш: 0.894,\n щ: 0.897,\n ъ: 0.623,\n ы: 0.759,\n ь: 0.545,\n э: 0.494,\n ю: 0.799,\n я: 0.577,\n ѐ: 0.551,\n ё: 0.551,\n ђ: 0.619,\n ѓ: 0.438,\n є: 0.493,\n ѕ: 0.468,\n і: 0.258,\n ї: 0.258,\n ј: 0.258,\n љ: 0.859,\n њ: 0.89,\n ћ: 0.621,\n ќ: 0.531,\n ѝ: 0.621,\n ў: 0.509,\n џ: 0.606,\n \"‐\": 0.322,\n \"–\": 0.5,\n \"—\": 1,\n \"‘\": 0.175,\n \"’\": 0.175,\n \"‚\": 0.25,\n \"“\": 0.359,\n \"”\": 0.359,\n \"„\": 0.416,\n \"…\": 0.791,\n \"‰\": 1.177,\n \"•\": 0.376,\n \"€\": 0.572,\n \"™\": 0.773,\n \"№\": 1.02,\n },\n },\n \"architects-daughter\": {\n capHeight: 0.6592,\n defaultAdvance: 0.5163,\n advances: {\n \"0\": 0.6309,\n \"1\": 0.1279,\n \"2\": 0.5723,\n \"3\": 0.5088,\n \"4\": 0.6807,\n \"5\": 0.708,\n \"6\": 0.627,\n \"7\": 0.6152,\n \"8\": 0.6484,\n \"9\": 0.5693,\n \" \": 0.4004,\n \"!\": 0.1348,\n '\"': 0.2363,\n \"#\": 0.6377,\n $: 0.5566,\n \"%\": 0.5186,\n \"&\": 0.6699,\n \"'\": 0.1621,\n \"(\": 0.2979,\n \")\": 0.3516,\n \"*\": 0.5078,\n \"+\": 0.5244,\n \",\": 0.1777,\n \"-\": 0.3105,\n \".\": 0.1406,\n \"/\": 0.4551,\n \":\": 0.167,\n \";\": 0.124,\n \"<\": 0.4756,\n \"=\": 0.4922,\n \">\": 0.4717,\n \"?\": 0.5059,\n \"@\": 1.043,\n A: 0.6406,\n B: 0.7109,\n C: 0.708,\n D: 0.6484,\n E: 0.5918,\n F: 0.6924,\n G: 0.6924,\n H: 0.6055,\n I: 0.1514,\n J: 0.5293,\n K: 0.6055,\n L: 0.6924,\n M: 0.8271,\n N: 0.627,\n O: 0.6699,\n P: 0.6377,\n Q: 0.7129,\n R: 0.7129,\n S: 0.6426,\n T: 0.623,\n U: 0.5615,\n V: 0.627,\n W: 0.9404,\n X: 0.5996,\n Y: 0.5342,\n Z: 0.7842,\n \"[\": 0.4248,\n \"\\\\\": 0.502,\n \"]\": 0.541,\n \"^\": 0.3066,\n _: 0.6865,\n \"`\": 0.1719,\n a: 0.5088,\n b: 0.5615,\n c: 0.6328,\n d: 0.5127,\n e: 0.541,\n f: 0.5938,\n g: 0.5156,\n h: 0.4951,\n i: 0.1514,\n j: 0.1777,\n k: 0.6143,\n l: 0.1572,\n m: 0.7783,\n n: 0.5,\n o: 0.5625,\n p: 0.5566,\n q: 0.5137,\n r: 0.5518,\n s: 0.502,\n t: 0.4043,\n u: 0.5078,\n v: 0.5186,\n w: 0.8086,\n x: 0.4707,\n y: 0.5488,\n z: 0.4951,\n \"{\": 0.3525,\n \"|\": 0.1455,\n \"}\": 0.4785,\n \"~\": 0.4443,\n \" \": 0.4004,\n \"¡\": 0.1348,\n \"¢\": 0.6328,\n \"£\": 0.5391,\n \"¤\": 0.5625,\n \"¥\": 0.5342,\n \"¦\": 0.1279,\n \"§\": 0.502,\n \"¨\": 0.3711,\n \"©\": 0.6309,\n ª: 0.249,\n \"«\": 0.7012,\n \"¬\": 0.5996,\n \"®\": 0.6309,\n \"¯\": 0.3105,\n \"°\": 0.2197,\n \"±\": 0.5244,\n \"²\": 0.375,\n \"³\": 0.3281,\n \"´\": 0.1719,\n µ: 0.4902,\n \"¶\": 0.3789,\n \"·\": 0.1406,\n \"¸\": 0.2666,\n \"¹\": 0.1123,\n º: 0.2715,\n \"»\": 0.6543,\n \"¼\": 0.6201,\n \"½\": 0.6484,\n \"¾\": 0.8623,\n \"¿\": 0.4844,\n À: 0.6406,\n Á: 0.6406,\n Â: 0.6406,\n Ã: 0.6406,\n Ä: 0.6406,\n Å: 0.6406,\n Æ: 0.877,\n Ç: 0.708,\n È: 0.5918,\n É: 0.5918,\n Ê: 0.5918,\n Ë: 0.5918,\n Ì: 0.1514,\n Í: 0.1514,\n Î: 0.1514,\n Ï: 0.1514,\n Ð: 0.6816,\n Ñ: 0.627,\n Ò: 0.6699,\n Ó: 0.6699,\n Ô: 0.6699,\n Õ: 0.6699,\n Ö: 0.6699,\n \"×\": 0.4707,\n Ø: 0.6699,\n Ù: 0.5615,\n Ú: 0.5615,\n Û: 0.5615,\n Ü: 0.5615,\n Ý: 0.5342,\n Þ: 0.5059,\n ß: 0.7109,\n à: 0.5088,\n á: 0.5088,\n â: 0.5088,\n ã: 0.5088,\n ä: 0.5088,\n å: 0.5088,\n æ: 0.9238,\n ç: 0.6328,\n è: 0.541,\n é: 0.541,\n ê: 0.541,\n ë: 0.541,\n ì: 0.1514,\n í: 0.1514,\n î: 0.1514,\n ï: 0.1514,\n ð: 0.5801,\n ñ: 0.5,\n ò: 0.5625,\n ó: 0.5625,\n ô: 0.5625,\n õ: 0.5625,\n ö: 0.5625,\n \"÷\": 0.3438,\n ø: 0.5625,\n ù: 0.5078,\n ú: 0.5078,\n û: 0.5078,\n ü: 0.5078,\n ý: 0.5488,\n þ: 0.5186,\n ÿ: 0.5488,\n \"–\": 0.3105,\n \"—\": 0.4111,\n \"‘\": 0.1621,\n \"’\": 0.1621,\n \"‚\": 0.1621,\n \"“\": 0.2363,\n \"”\": 0.2363,\n \"„\": 0.2803,\n \"…\": 0.4229,\n \"•\": 0.1924,\n \"€\": 0.7949,\n \"™\": 1.21,\n },\n },\n \"comic-neue\": {\n capHeight: 0.67,\n defaultAdvance: 0.4919,\n advances: {\n \"0\": 0.609,\n \"1\": 0.396,\n \"2\": 0.523,\n \"3\": 0.506,\n \"4\": 0.484,\n \"5\": 0.542,\n \"6\": 0.542,\n \"7\": 0.473,\n \"8\": 0.515,\n \"9\": 0.531,\n \" \": 0.334,\n \"!\": 0.245,\n '\"': 0.275,\n \"#\": 0.74,\n $: 0.602,\n \"%\": 0.72,\n \"&\": 0.644,\n \"'\": 0.196,\n \"(\": 0.346,\n \")\": 0.346,\n \"*\": 0.394,\n \"+\": 0.444,\n \",\": 0.164,\n \"-\": 0.402,\n \".\": 0.153,\n \"/\": 0.436,\n \":\": 0.181,\n \";\": 0.199,\n \"<\": 0.511,\n \"=\": 0.462,\n \">\": 0.541,\n \"?\": 0.501,\n \"@\": 0.832,\n A: 0.581,\n B: 0.62,\n C: 0.614,\n D: 0.629,\n E: 0.603,\n F: 0.577,\n G: 0.716,\n H: 0.723,\n I: 0.392,\n J: 0.457,\n K: 0.56,\n L: 0.5,\n M: 0.838,\n N: 0.658,\n O: 0.643,\n P: 0.56,\n Q: 0.708,\n R: 0.596,\n S: 0.552,\n T: 0.522,\n U: 0.691,\n V: 0.536,\n W: 0.867,\n X: 0.685,\n Y: 0.594,\n Z: 0.582,\n \"[\": 0.318,\n \"\\\\\": 0.549,\n \"]\": 0.318,\n \"^\": 0.504,\n _: 0.494,\n \"`\": 0.181,\n a: 0.516,\n b: 0.535,\n c: 0.482,\n d: 0.53,\n e: 0.501,\n f: 0.279,\n g: 0.53,\n h: 0.536,\n i: 0.227,\n j: 0.236,\n k: 0.484,\n l: 0.219,\n m: 0.827,\n n: 0.553,\n o: 0.529,\n p: 0.531,\n q: 0.52,\n r: 0.397,\n s: 0.416,\n t: 0.286,\n u: 0.511,\n v: 0.418,\n w: 0.598,\n x: 0.473,\n y: 0.447,\n z: 0.434,\n \"{\": 0.373,\n \"|\": 0.197,\n \"}\": 0.373,\n \"~\": 0.615,\n \" \": 0.334,\n \"¡\": 0.245,\n \"¢\": 0.48,\n \"£\": 0.661,\n \"¤\": 0.507,\n \"¥\": 0.494,\n \"¦\": 0.223,\n \"§\": 0.421,\n \"¨\": 0.265,\n \"©\": 0.547,\n ª: 0.302,\n \"«\": 0.563,\n \"¬\": 0.478,\n \"­\": 0.402,\n \"®\": 0.555,\n \"¯\": 0.263,\n \"°\": 0.247,\n \"±\": 0.445,\n \"²\": 0.249,\n \"³\": 0.245,\n \"´\": 0.181,\n µ: 0.504,\n \"¶\": 0.557,\n \"·\": 0.176,\n \"¸\": 0.172,\n \"¹\": 0.176,\n º: 0.281,\n \"»\": 0.559,\n \"¼\": 0.685,\n \"½\": 0.741,\n \"¾\": 0.734,\n \"¿\": 0.485,\n À: 0.581,\n Á: 0.581,\n Â: 0.581,\n Ã: 0.581,\n Ä: 0.581,\n Å: 0.581,\n Æ: 1.044,\n Ç: 0.614,\n È: 0.603,\n É: 0.603,\n Ê: 0.603,\n Ë: 0.603,\n Ì: 0.392,\n Í: 0.392,\n Î: 0.392,\n Ï: 0.392,\n Ð: 0.634,\n Ñ: 0.658,\n Ò: 0.643,\n Ó: 0.643,\n Ô: 0.643,\n Õ: 0.643,\n Ö: 0.643,\n \"×\": 0.376,\n Ø: 0.635,\n Ù: 0.691,\n Ú: 0.691,\n Û: 0.691,\n Ü: 0.691,\n Ý: 0.594,\n Þ: 0.542,\n ß: 0.526,\n à: 0.516,\n á: 0.516,\n â: 0.516,\n ã: 0.516,\n ä: 0.516,\n å: 0.516,\n æ: 0.822,\n ç: 0.482,\n è: 0.501,\n é: 0.501,\n ê: 0.501,\n ë: 0.501,\n ì: 0.228,\n í: 0.228,\n î: 0.228,\n ï: 0.228,\n ð: 0.47,\n ñ: 0.553,\n ò: 0.529,\n ó: 0.529,\n ô: 0.529,\n õ: 0.529,\n ö: 0.529,\n \"÷\": 0.432,\n ø: 0.529,\n ù: 0.511,\n ú: 0.511,\n û: 0.511,\n ü: 0.511,\n ý: 0.447,\n þ: 0.531,\n ÿ: 0.447,\n \"–\": 0.6,\n \"—\": 0.824,\n \"‘\": 0.185,\n \"’\": 0.185,\n \"‚\": 0.265,\n \"“\": 0.308,\n \"”\": 0.326,\n \"„\": 0.373,\n \"…\": 0.664,\n \"•\": 0.313,\n \"€\": 0.667,\n \"™\": 0.487,\n },\n },\n};\n","// Headless TextMeasurer implementation. The editor measures text with a\n// canvas (`ctx.measureText`); Node has no canvas, so measurement runs off\n// per-glyph advance-width tables extracted from the real TTFs\n// (advanceTables.ts, regenerated via `npm run gen:fonts`).\n//\n// approximateTextMeasurer is ZERO-CONFIG and per-font accurate on advances,\n// but APPROXIMATE overall: no kerning/shaping, ASCII table only (other\n// characters use the font's average advance). Good enough for bounds /\n// hit-testing / preview; NOT pixel-exact. When a sink is available its own\n// measureText is preferred (the painters already use it), so this mainly\n// serves sink-less calls (buildSnapEntry bounds).\n\nimport type { TextMeasurer } from \"./textMetrics\";\nimport { realFace, resolveFont } from \"../model/fonts\";\nimport { ADVANCE_TABLES } from \"./advanceTables\";\n\n/**\n * Zero-config headless measurer. Model text heights are CAP heights, so\n * measurement scales the em advances by heightMm / capHeight.\n */\nexport const approximateTextMeasurer: TextMeasurer = {\n measureTextWidth: (text, heightMm, font, widthFactor = 1) => {\n // A bundled bold/italic face has its own advances; a synthesized one\n // keeps the regular font's (synthesis doesn't change advances).\n const table = ADVANCE_TABLES[realFace(font) ?? resolveFont(font).id];\n let em = 0;\n for (const ch of text) em += table.advances[ch] ?? table.defaultAdvance;\n return (em * heightMm * widthFactor) / table.capHeight;\n },\n};\n","// Dimension geometry derivation, all kinds: linear (2+ chained points,\n// measuring along `rotation` or, unset, along the points), angular (3\n// points: vertex + two rays; `offset` = signed arc radius), radial (center +\n// curve point), and diameter (two opposite curve points). Pure — the\n// sink-bound painter, snap/hit-testing and DXF explosion reuse exactly what\n// is drawn. Label placement (docs/dimension-labels.md): each measured\n// segment carries a frame (`along` the line, `across` it); a label with no\n// position is placed automatically — centered when it fits between the\n// arrows, else outside (or raised, inside a chain) — and a label pulled off\n// the line gets a leader once it no longer overlaps its segment. Text is\n// measured with the headless `approximateTextMeasurer` so every sink (and\n// Node) places labels identically.\n\nimport type { Dimension, DimLabel, DimStyle, TextSpan } from \"../model/objects\";\nimport { normalizeSpans, richTextBlock } from \"./richText\";\nimport {\n DIM_DEFAULT_CONTENT,\n DIM_VALUE_TOKEN,\n dimFontFace,\n dimStyleFor,\n} from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport {\n add,\n angle,\n dist,\n dot,\n fromAngle,\n len,\n norm,\n normAngle,\n perp,\n scale,\n sub,\n} from \"../geometry/vec2\";\nimport type { Segment } from \"../geometry/line\";\nimport { approximateTextMeasurer } from \"./textMeasurer\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nexport interface DimArc {\n center: Vec2;\n radius: number;\n /** Radians, CCW from startAngle to endAngle (canvas/DXF convention). */\n startAngle: number;\n endAngle: number;\n}\n\nexport interface DimText {\n content: string;\n /** Character formatting over `content` (the label's spans, mapped). */\n spans?: TextSpan[];\n anchor: Vec2;\n rotation: number;\n height: number;\n /** Advance width of `content` in mm (the headless measurer's). */\n width: number;\n /** Font id + width factor from the resolved dimension style. */\n font?: string;\n widthFactor?: number;\n /** Index of the measured segment this label belongs to (`labels[i]`). */\n segment: number;\n /** The resolved placement, in the segment's label frame. */\n along: number;\n across: number;\n}\n\nexport interface DimGeometry {\n extensionLines: Segment[];\n /** Dimension lines, including any extension under an outside label. */\n dimLines: Segment[];\n /** Angular dimensions draw an arc instead of a straight dimension line. */\n dimArc: DimArc | null;\n /** Leader + landing segments of labels pulled away from their segment. */\n leaders: Segment[];\n arrows: { tip: Vec2; toward: Vec2; size: number }[];\n arrowType: DimStyle[\"arrowType\"];\n /** One entry per measured segment (chains carry several). */\n labels: DimText[];\n /** Primary measurement: total span / angle in radians / radius / diameter. */\n value: number;\n}\n\nexport const formatDimValue = (value: number, precision: number): string => {\n const fixed = value.toFixed(precision);\n return fixed.includes(\".\") ? fixed.replace(/\\.?0+$/, \"\") : fixed;\n};\n\n/** A label's shown text and its character formatting. */\nexport interface DimLabelText {\n content: string;\n spans?: TextSpan[];\n}\n\n/** A label's text: its template (or the kind's default) with `{value}`\n * replaced by the formatted measurement, and the template's spans moved\n * onto the result — a span covering the token formats the value. */\nexport const dimLabelContent = (\n kind: Dimension[\"kind\"],\n label: DimLabel | undefined,\n formatted: string,\n): DimLabelText => {\n const parts = (label?.content ?? DIM_DEFAULT_CONTENT[kind]).split(\n DIM_VALUE_TOKEN,\n );\n const content = parts.join(formatted);\n if (!label?.spans?.length || label.content === undefined) return { content };\n const T = DIM_VALUE_TOKEN.length;\n /** Template offset → content offset; inside a token, the value's start\n * (span start) or end (span end). */\n const map = (p: number, end: boolean): number => {\n let t = 0;\n let c = 0;\n for (let i = 0; i < parts.length; i++) {\n if (p <= t + parts[i].length) return c + (p - t);\n t += parts[i].length;\n c += parts[i].length;\n if (i === parts.length - 1) break;\n if (p < t + T) return end ? c + formatted.length : c;\n t += T;\n c += formatted.length;\n }\n return content.length;\n };\n const spans = normalizeSpans(\n label.spans.map((s) => ({\n ...s,\n start: map(s.start, false),\n end: map(s.end, true),\n })),\n content,\n );\n return spans.length ? { content, spans } : { content };\n};\n\n/** A label's advance width (mm), formatted runs measured per run. */\nconst labelWidth = (\n label: DimLabelText,\n h: number,\n font: string | undefined,\n widthFactor: number,\n): number =>\n label.spans?.length\n ? richTextBlock(\n label.content,\n label.spans,\n { face: font, heightMm: h, widthFactor },\n approximateTextMeasurer,\n approximateTextMeasurer,\n ).width\n : approximateTextMeasurer.measureTextWidth(\n label.content,\n h,\n font,\n widthFactor,\n );\n\n/** Referenced document style + per-object overrides, with the object's\n * annotation `scale` along for the ride (there is no document-level scale). */\nexport type ResolvedDimStyle = DimStyle & { scale: number };\n\nconst resolveDimStyle = (\n obj: Dimension,\n styles: readonly DimStyle[],\n): ResolvedDimStyle => ({\n ...dimStyleFor(obj, styles),\n ...obj.styleOverride,\n scale: obj.scale,\n});\n\n/** Readable text rotation for a direction: never upside down. */\nconst readableRotation = (u: Vec2): number => {\n const raw = normAngle(angle(u));\n const flipped = raw > Math.PI / 2 + 1e-9 && raw <= (3 * Math.PI) / 2 + 1e-9;\n return flipped ? raw - Math.PI : raw;\n};\n\n// ---- Label frames -----------------------------------------------------------\n\n/**\n * One measured segment's label frame: `along` runs with the dimension line\n * (arc length on an angular dimension) from the segment's origin, `across`\n * is perpendicular to it. `s0..s1` is the measured span in `along` units.\n */\nexport interface DimLabelFrame {\n s0: number;\n s1: number;\n toWorld(along: number, across: number): Vec2;\n fromWorld(p: Vec2): { along: number; across: number };\n /** Unit reading direction of the line at `along`. */\n tangent(along: number): Vec2;\n}\n\nconst straightFrame = (\n origin: Vec2,\n u: Vec2,\n n: Vec2,\n s0: number,\n s1: number,\n): DimLabelFrame => ({\n s0,\n s1,\n toWorld: (along, across) =>\n add(origin, add(scale(u, along), scale(n, across))),\n fromWorld: (p) => {\n const d = sub(p, origin);\n return { along: dot(d, u), across: dot(d, n) };\n },\n tangent: () => u,\n});\n\n/** The measuring direction of a linear dimension and the left perpendicular\n * its `offset` is measured along. */\nexport const linearAxis = (\n obj: Pick<Dimension, \"points\" | \"rotation\">,\n): { u: Vec2; n: Vec2 } => {\n const first = obj.points[0];\n const last = obj.points[obj.points.length - 1];\n const u =\n obj.rotation !== undefined\n ? fromAngle(obj.rotation)\n : dist(first, last) > 1e-9\n ? norm(sub(last, first))\n : { x: 1, y: 0 };\n return { u, n: perp(u) };\n};\n\n/** Feet of a linear dimension's points on its dimension line. */\nconst linearFeet = (obj: Dimension): { feet: Vec2[]; u: Vec2; n: Vec2 } => {\n const { u, n } = linearAxis(obj);\n const first = obj.points[0];\n const h = obj.offset ?? 0;\n const feet = obj.points.map((p) =>\n add(p, scale(n, h - dot(sub(p, first), n))),\n );\n return { feet, u, n };\n};\n\n/** The frames of a dimension's measured segments (one per label); empty\n * for a degenerate definition. Grips, import and export translate label\n * positions through these. */\nexport const dimensionLabelFrames = (obj: Dimension): DimLabelFrame[] => {\n switch (obj.kind) {\n case \"linear\": {\n if (obj.points.length < 2) return [];\n const { feet, u, n } = linearFeet(obj);\n const across = (obj.offset ?? 0) >= 0 ? n : scale(n, -1);\n const frames: DimLabelFrame[] = [];\n for (let i = 0; i + 1 < feet.length; i++) {\n const L = dot(sub(feet[i + 1], feet[i]), u);\n if (Math.abs(L) < 1e-9) continue;\n // Segments run in point order; a chain laid out against `u` still\n // reads left to right along u.\n const dir = L > 0 ? u : scale(u, -1);\n frames.push(straightFrame(feet[i], dir, across, 0, Math.abs(L)));\n }\n return frames;\n }\n case \"angular\": {\n const polar = angularFrame(obj);\n return polar ? [polar.frame] : [];\n }\n case \"radial\": {\n if (obj.points.length < 2) return [];\n const [center, p] = obj.points;\n const r = dist(center, p);\n if (r < 1e-9) return [];\n const u = norm(sub(p, center));\n return [straightFrame(center, u, perp(u), 0, r)];\n }\n case \"diameter\": {\n if (obj.points.length < 2) return [];\n const [p1, p2] = obj.points;\n const d = dist(p1, p2);\n if (d < 1e-9) return [];\n const u = norm(sub(p2, p1));\n const center = add(p1, scale(u, d / 2));\n return [straightFrame(center, u, perp(u), -d / 2, d / 2)];\n }\n }\n};\n\ninterface AngularFrame {\n vertex: Vec2;\n radius: number;\n start: number;\n sweep: number;\n frame: DimLabelFrame;\n}\n\nconst angularFrame = (obj: Dimension): AngularFrame | null => {\n if (obj.points.length < 3) return null;\n const [vertex, a, b] = obj.points;\n const signed = obj.offset ?? 0;\n const radius = Math.abs(signed);\n if (radius < 1e-9 || dist(vertex, a) < 1e-9 || dist(vertex, b) < 1e-9)\n return null;\n const angA = angle(sub(a, vertex));\n const angB = angle(sub(b, vertex));\n // Positive radius: the arc CCW from a to b; negative: the complement.\n const start = signed >= 0 ? angA : angB;\n const sweep = signed >= 0 ? normAngle(angB - angA) : normAngle(angA - angB);\n if (sweep < 1e-9) return null;\n const frame: DimLabelFrame = {\n s0: 0,\n s1: radius * sweep,\n toWorld: (along, across) =>\n add(vertex, scale(fromAngle(start + along / radius), radius + across)),\n fromWorld: (p) => {\n const d = sub(p, vertex);\n let w = normAngle(angle(d) - start);\n if (w > Math.PI) w -= 2 * Math.PI;\n return { along: w * radius, across: len(d) - radius };\n },\n tangent: (along) => perp(fromAngle(start + along / radius)),\n };\n return { vertex, radius, start, sweep, frame };\n};\n\n// ---- Label placement --------------------------------------------------------\n\n/** Where an automatically placed label goes when it does not fit: past the\n * segment's end, past its start, or raised above it (inside a chain). */\ntype OutsideMode = \"end\" | \"start\" | \"raise\";\n\ninterface PlacedLabel {\n text: DimText;\n /** `along` range the dimension line must cover for this label (an\n * outside label on the line), or null. */\n cover: [number, number] | null;\n leaders: Segment[];\n}\n\nconst overlaps = (a: [number, number], b: [number, number]): boolean =>\n a[0] < b[1] - 1e-9 && b[0] < a[1] - 1e-9;\n\nconst placeLabel = (\n frame: DimLabelFrame,\n spec: DimLabel | undefined,\n index: number,\n label: DimLabelText,\n style: ResolvedDimStyle,\n arrowCount: 1 | 2,\n mode: OutsideMode,\n stack: { row: number; interval: [number, number] } | null,\n): PlacedLabel & { row: number } => {\n const s = style.scale;\n const h = style.textHeight * s;\n const gap = style.textOffset * s;\n const A = style.arrowSize * s;\n const font = dimFontFace(style);\n const width = labelWidth(label, h, font, style.widthFactor);\n const L = frame.s1 - frame.s0;\n const arrowsInside = L >= arrowCount * A - 1e-9;\n let along = spec?.along;\n let across = spec?.across ?? 0;\n let row = 0;\n if (along === undefined) {\n const fits = L >= width + 2 * gap + arrowCount * A - 1e-9;\n const push = (arrowsInside ? 0 : A) + gap + width / 2;\n if (fits) along = (frame.s0 + frame.s1) / 2;\n else if (mode === \"end\") along = frame.s1 + push;\n else if (mode === \"start\") along = frame.s0 - push;\n else {\n along = (frame.s0 + frame.s1) / 2;\n row = 1;\n const interval: [number, number] = [along - width / 2, along + width / 2];\n if (stack && stack.row >= 1 && overlaps(interval, stack.interval))\n row = stack.row + 1;\n across = row * (h + gap);\n }\n }\n const interval: [number, number] = [along - width / 2, along + width / 2];\n\n let cover: [number, number] | null = null;\n if (across === 0 && (interval[1] > frame.s1 || interval[0] < frame.s0))\n cover = [\n Math.min(frame.s0, interval[0] - gap),\n Math.max(frame.s1, interval[1] + gap),\n ];\n\n // A label the user lifted off the line (a stored, non-zero `across`)\n // always gets its leader — even over its own segment; an automatically\n // raised one does not.\n const leaders: Segment[] = [];\n if (spec?.across !== undefined && spec.across !== 0) {\n const landingA = frame.toWorld(interval[0], across);\n const landingB = frame.toWorld(interval[1], across);\n const from = frame.toWorld((frame.s0 + frame.s1) / 2, 0);\n const to =\n dist(from, landingA) <= dist(from, landingB) ? landingA : landingB;\n leaders.push({ a: from, b: to }, { a: landingA, b: landingB });\n }\n\n const tangent = frame.tangent(along);\n const rotation = readableRotation(tangent);\n const textUp = perp(fromAngle(rotation));\n const text: DimText = {\n content: label.content,\n ...(label.spans ? { spans: label.spans } : {}),\n anchor: add(frame.toWorld(along, across), scale(textUp, gap)),\n rotation,\n height: h,\n width,\n font,\n widthFactor: style.widthFactor,\n segment: index,\n along,\n across,\n };\n return { text, cover, leaders, row };\n};\n\n// ---- Kinds ------------------------------------------------------------------\n\n/** Linear: 2+ points chained along one dimension line. */\nconst linearGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n if (obj.points.length < 2) return null;\n const s = style.scale;\n const A = style.arrowSize * s;\n const { feet, u } = linearFeet(obj);\n const frames = dimensionLabelFrames(obj);\n if (frames.length === 0) return null;\n\n const extensionLines: Segment[] = [];\n obj.points.forEach((p, i) => {\n const f = feet[i];\n const gap = dist(p, f);\n if (gap < 1e-9) return;\n const w = norm(sub(f, p));\n // \"short\": just a 2×overshoot tick across the dimension line.\n extensionLines.push({\n a:\n style.extensionType === \"short\"\n ? sub(f, scale(w, style.extensionOvershoot * s))\n : add(p, scale(w, Math.min(style.extensionOffset * s, gap))),\n b: add(f, scale(w, style.extensionOvershoot * s)),\n });\n });\n\n const dimLines: Segment[] = [];\n const arrows: DimGeometry[\"arrows\"] = [];\n const labels: DimText[] = [];\n const leaders: Segment[] = [];\n let stack: { row: number; interval: [number, number] } | null = null;\n frames.forEach((frame, i) => {\n const L = frame.s1 - frame.s0;\n const value = L;\n const mode: OutsideMode =\n frames.length === 1 || i === frames.length - 1\n ? \"end\"\n : i === 0\n ? \"start\"\n : \"raise\";\n const placed = placeLabel(\n frame,\n obj.labels[i],\n i,\n dimLabelContent(\n obj.kind,\n obj.labels[i],\n formatDimValue(value, style.precision),\n ),\n style,\n 2,\n mode,\n stack,\n );\n stack =\n placed.row > 0\n ? {\n row: placed.row,\n interval: [\n placed.text.along - placed.text.width / 2,\n placed.text.along + placed.text.width / 2,\n ],\n }\n : null;\n labels.push(placed.text);\n leaders.push(...placed.leaders);\n\n const a = frame.toWorld(frame.s0, 0);\n const b = frame.toWorld(frame.s1, 0);\n const arrowsInside = L >= 2 * A - 1e-9;\n let from = frame.s0;\n let to = frame.s1;\n if (!arrowsInside) {\n from -= 2 * A;\n to += 2 * A;\n }\n if (placed.cover) {\n from = Math.min(from, placed.cover[0]);\n to = Math.max(to, placed.cover[1]);\n }\n dimLines.push({ a: frame.toWorld(from, 0), b: frame.toWorld(to, 0) });\n arrows.push(\n arrowsInside\n ? { tip: a, toward: b, size: A }\n : { tip: a, toward: frame.toWorld(from, 0), size: A },\n arrowsInside\n ? { tip: b, toward: a, size: A }\n : { tip: b, toward: frame.toWorld(to, 0), size: A },\n );\n });\n\n return {\n extensionLines,\n dimLines,\n dimArc: null,\n leaders,\n arrows,\n arrowType: style.arrowType,\n labels,\n value: Math.abs(dot(sub(feet[feet.length - 1], feet[0]), u)),\n };\n};\n\n/** Angular: [vertex, a, b]; `offset` is the signed arc radius. */\nconst angularGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n const polar = angularFrame(obj);\n if (!polar) return null;\n const { vertex, radius, start, sweep, frame } = polar;\n const s = style.scale;\n const A = style.arrowSize * s;\n const [, a, b] = obj.points;\n\n // Extension lines: along each ray from the point out to the arc\n // (\"short\": just a 2×overshoot tick across it).\n const extensionLines: Segment[] = [];\n for (const p of [a, b]) {\n const d = dist(vertex, p);\n const w = norm(sub(p, vertex));\n const inner =\n style.extensionType === \"short\"\n ? radius - style.extensionOvershoot * s\n : Math.min(d + style.extensionOffset * s, radius);\n const outer = radius + style.extensionOvershoot * s;\n if (outer - inner > 1e-9)\n extensionLines.push({\n a: add(vertex, scale(w, inner)),\n b: add(vertex, scale(w, outer)),\n });\n }\n\n const placed = placeLabel(\n frame,\n obj.labels[0],\n 0,\n dimLabelContent(\n obj.kind,\n obj.labels[0],\n formatDimValue(sweep * RAD2DEG, style.precision),\n ),\n style,\n 2,\n \"end\",\n null,\n );\n\n const L = frame.s1;\n const arrowsInside = L >= 2 * A - 1e-9;\n let from = 0;\n let to = L;\n if (!arrowsInside) {\n from -= 2 * A;\n to += 2 * A;\n }\n if (placed.cover) {\n from = Math.min(from, placed.cover[0]);\n to = Math.max(to, placed.cover[1]);\n }\n // Arrow bodies point a short way along the arc (tangent-ish).\n const step = Math.min(sweep / 3, (A * 2) / radius) * radius;\n const at = (along: number): Vec2 => frame.toWorld(along, 0);\n\n return {\n extensionLines,\n dimLines: [],\n dimArc: {\n center: vertex,\n radius,\n startAngle: start + from / radius,\n endAngle: start + to / radius,\n },\n leaders: placed.leaders,\n arrows: [\n { tip: at(0), toward: at(arrowsInside ? step : -step), size: A },\n { tip: at(L), toward: at(arrowsInside ? L - step : L + step), size: A },\n ],\n arrowType: style.arrowType,\n labels: [placed.text],\n value: sweep,\n };\n};\n\n/** Radial: [center, point on curve]; the label sits on the ray (inside the\n * curve when it fits, else past it with the line extended). */\nconst radialGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n const [frame] = dimensionLabelFrames(obj);\n if (!frame) return null;\n const s = style.scale;\n const A = style.arrowSize * s;\n const [center, p] = obj.points;\n const r = frame.s1;\n const spec = obj.labels[0];\n const content = dimLabelContent(\n obj.kind,\n spec,\n formatDimValue(r, style.precision),\n );\n // Automatic: inside, just within the arrow, when the text fits the\n // radius; else outside (placeLabel's \"end\" rule).\n const width = labelWidth(\n content,\n style.textHeight * s,\n dimFontFace(style),\n style.widthFactor,\n );\n const gap = style.textOffset * s;\n const autoInside =\n spec?.along === undefined && r >= width + 2 * gap + A - 1e-9\n ? { ...spec, along: r - A - gap - width / 2 }\n : spec;\n const placed = placeLabel(\n frame,\n autoInside,\n 0,\n content,\n style,\n 1,\n \"end\",\n null,\n );\n const outside = placed.text.along > r + 1e-9;\n let to = r;\n if (placed.cover) to = Math.max(to, placed.cover[1]);\n return {\n extensionLines: [],\n dimLines: [{ a: center, b: frame.toWorld(to, 0) }],\n dimArc: null,\n leaders: placed.leaders,\n // Head at the curve: pointing outward with the text inside, inward\n // (body on the outside) with the text outside.\n arrows: [\n { tip: p, toward: outside ? frame.toWorld(r + A, 0) : center, size: A },\n ],\n arrowType: style.arrowType,\n labels: [placed.text],\n value: r,\n };\n};\n\n/** Diameter: [p1, p2] opposite points on the curve; the label sits on the\n * line through them, centered when it fits. */\nconst diameterGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n const [frame] = dimensionLabelFrames(obj);\n if (!frame) return null;\n const s = style.scale;\n const A = style.arrowSize * s;\n const [p1, p2] = obj.points;\n const d = frame.s1 - frame.s0;\n const placed = placeLabel(\n frame,\n obj.labels[0],\n 0,\n dimLabelContent(\n obj.kind,\n obj.labels[0],\n formatDimValue(d, style.precision),\n ),\n style,\n 2,\n \"end\",\n null,\n );\n const arrowsInside = d >= 2 * A - 1e-9;\n let from = frame.s0;\n let to = frame.s1;\n if (!arrowsInside) {\n from -= 2 * A;\n to += 2 * A;\n }\n if (placed.cover) {\n from = Math.min(from, placed.cover[0]);\n to = Math.max(to, placed.cover[1]);\n }\n return {\n extensionLines: [],\n dimLines: [{ a: frame.toWorld(from, 0), b: frame.toWorld(to, 0) }],\n dimArc: null,\n leaders: placed.leaders,\n arrows: arrowsInside\n ? [\n { tip: p1, toward: p2, size: A },\n { tip: p2, toward: p1, size: A },\n ]\n : [\n { tip: p1, toward: frame.toWorld(from, 0), size: A },\n { tip: p2, toward: frame.toWorld(to, 0), size: A },\n ],\n arrowType: style.arrowType,\n labels: [placed.text],\n value: d,\n };\n};\n\n/**\n * Derive the drawn geometry of a dimension (all kinds).\n * Returns null for degenerate definitions.\n */\nexport const dimensionGeometry = (\n obj: Dimension,\n styles: readonly DimStyle[],\n): DimGeometry | null => {\n const style = resolveDimStyle(obj, styles);\n switch (obj.kind) {\n case \"linear\":\n return linearGeometry(obj, style);\n case \"angular\":\n return angularGeometry(obj, style);\n case \"radial\":\n return radialGeometry(obj, style);\n case \"diameter\":\n return diameterGeometry(obj, style);\n }\n};\n","// Pure text geometry: alignment involutions and the corner points of a\n// text box, used by bounds, snapping, and hit-testing. Measurement is\n// injected (see textMetrics.ts); the sink-bound painter stays editor-side.\n\nimport type {\n ArrowType,\n PolylineVertex,\n Text,\n TextStyle,\n} from \"../model/objects\";\nimport { effectiveTextFont, textStyleFor } from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { add, fromAngle, perp, scale, sub } from \"../geometry/vec2\";\nimport { boundMeasurer, textBlock, type TextMeasurer } from \"./textMetrics\";\nimport { richTextBlock } from \"./richText\";\nimport { approximateTextMeasurer } from \"./textMeasurer\";\n\n// Text alignment is JUSTIFICATION — which edge of the text sits on its\n// point, the AutoCAD / DXF and canvas meaning (\"right\" = the text lies left\n// of the point, \"bottom\" = above it). Model, sinks and DXF share it, so no\n// mapping between them (docs/adr/0002).\n\n/** Effective cap height (override, else the referenced style's) with the\n * object's scale applied (like DimStyle.scale). */\nexport const textHeight = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): number =>\n (obj.styleOverride?.textHeight ?? textStyleFor(obj, textStyles).textHeight) *\n obj.scale;\n\n/** Effective leader arrowhead size (override, else the referenced style's)\n * with the object's scale applied. */\nexport const textArrowSize = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): number =>\n (obj.styleOverride?.arrowSize ?? textStyleFor(obj, textStyles).arrowSize) *\n obj.scale;\n\n/** Effective leader arrowhead style (override, else the referenced\n * style's). */\nexport const textArrowType = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): ArrowType =>\n obj.styleOverride?.arrowType ?? textStyleFor(obj, textStyles).arrowType;\n\n/** Wrap/box width with the object's scale applied, or undefined for no wrap. */\nexport const textWidth = (obj: Text): number | undefined =>\n obj.width === undefined ? undefined : obj.width * obj.scale;\n\n/** Frame border inset from the text box, proportional to cap height. */\nconst FRAME_MARGIN_FACTOR = 0.35;\n\n/** The rotated local frame + anchor-relative extents of a text's box. */\nconst textBoxLocal = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n) => {\n // Bind the object's effective font (own, else document style) — callers\n // pass generic measurers. (Already-bound measurers ignore the extra args,\n // so this can't double.)\n const { font, widthFactor } = effectiveTextFont(obj, textStyles);\n const block = obj.spans?.length\n ? // Formatted: per-run fonts, so the measurer stays unbound.\n richTextBlock(\n obj.content,\n obj.spans,\n {\n face: font,\n heightMm: textHeight(obj, textStyles),\n widthFactor,\n },\n measure,\n approximateTextMeasurer,\n textWidth(obj),\n )\n : textBlock(\n obj.content,\n textHeight(obj, textStyles),\n boundMeasurer(measure, font, widthFactor),\n textWidth(obj),\n );\n const u = fromAngle(obj.rotation);\n const vUp = perp(u);\n const hA = obj.hAlign;\n const vA = obj.vAlign;\n // Anchor-relative extents by (anchor-edge) alignment.\n const left =\n hA === \"left\" ? 0 : hA === \"center\" ? -block.width / 2 : -block.width;\n const top =\n vA === \"top\" ? 0 : vA === \"center\" ? block.height / 2 : block.height;\n const at = (dx: number, dy: number): Vec2 =>\n add(add(obj.position, scale(u, dx)), scale(vUp, dy));\n return {\n block,\n u,\n vUp,\n left,\n right: left + block.width,\n top,\n bottom: top - block.height,\n at,\n };\n};\n\n/** Corner points of the (rotated) text box, for bounds/hit-testing. */\nexport const textBoxCorners = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): Vec2[] => {\n const { left, right, top, bottom, at } = textBoxLocal(\n obj,\n measure,\n textStyles,\n );\n return [at(left, top), at(right, top), at(right, bottom), at(left, bottom)];\n};\n\n/**\n * Change a text's alignment and keep its box where it is (AutoCAD): the\n * position moves to the box's new justification point.\n */\nexport const realignText = (\n obj: Text,\n align: Partial<Pick<Text, \"hAlign\" | \"vAlign\">>,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): Text => {\n const next = { ...obj, ...align };\n const before = textBoxCorners(obj, measure, textStyles)[0];\n const after = textBoxCorners(next, measure, textStyles)[0];\n return { ...next, position: add(obj.position, sub(before, after)) };\n};\n\n/** A frame part: a vertex chain with DXF bulges (arcs), like a polyline. */\nexport interface TextFramePart {\n points: PolylineVertex[];\n closed: boolean;\n}\n\n/**\n * The text frame as polyline-shaped chains (none → empty), offset outward\n * from the text box by a cap-height-proportional margin: \"rectangle\" a box,\n * \"circle\" the circle around the box, \"slot\" a box with semicircular ends,\n * \"bottom\" a line under the text, \"firstLine\" one under its first line.\n */\nexport const textFrameGeometry = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): TextFramePart[] => {\n if (!obj.frame || obj.frame === \"none\") return [];\n const { left, right, top, bottom, at } = textBoxLocal(\n obj,\n measure,\n textStyles,\n );\n const h = textHeight(obj, textStyles);\n const m = h * FRAME_MARGIN_FACTOR;\n const l = left - m;\n const r = right + m;\n const t = top + m;\n const b = bottom - m;\n const v = (dx: number, dy: number, bulge = 0): PolylineVertex => ({\n ...at(dx, dy),\n bulge,\n });\n const line = (y: number) => [{ points: [v(l, y), v(r, y)], closed: false }];\n switch (obj.frame) {\n case \"bottom\":\n return line(b);\n case \"firstLine\":\n return line(top - h - m);\n case \"circle\": {\n // Circumscribes the box; bulge 1 = a half circle per vertex.\n const cy = (top + bottom) / 2;\n const rad = Math.hypot((right - left) / 2, (top - bottom) / 2) + m;\n const cx = (left + right) / 2;\n return [\n { points: [v(cx - rad, cy, 1), v(cx + rad, cy, 1)], closed: true },\n ];\n }\n case \"slot\":\n // Straight over the text, half circles past its ends (CCW chain).\n return [\n {\n points: [v(right, b, 1), v(right, t), v(left, t, 1), v(left, b)],\n closed: true,\n },\n ];\n default:\n return [{ points: [v(l, b), v(r, b), v(r, t), v(l, t)], closed: true }];\n }\n};\n","// Table layout: the ONE derivation of a table's geometry (docs/table-object.md).\n// A table resolves to world-space child objects — grid rules as `line`s and\n// one `text` per cell — so the painter, snapping and DXF export reuse their\n// existing per-type code (the block-instance pattern).\n//\n// Layout (wrapping and row heights) is measured with the DETERMINISTIC\n// approximate measurer, not a sink's: every output must agree on where rows\n// fall, so the cell text is pre-wrapped here and handed to the text painter\n// as explicit lines (the same reason the text painter lays out tab stops\n// with it). A canvas glyph run may over/underfill a line by the\n// approximation error instead.\n\nimport type {\n ModelObject,\n Table,\n Text,\n TextSpan,\n TextStyle,\n} from \"../model/objects\";\nimport { effectiveTextFont } from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { add, fromAngle, perp, scale } from \"../geometry/vec2\";\nimport { approximateTextMeasurer } from \"./textMeasurer\";\nimport { boundMeasurer, textBlock, type TextMeasurer } from \"./textMetrics\";\nimport { textHeight } from \"./textGeometry\";\nimport { richTextBlock, sliceSpans } from \"./richText\";\n\n/** One rule of the grid, in table-local coordinates (x right, y DOWN from\n * the top-left corner, scaled mm). */\ninterface LocalRule {\n a: Vec2;\n b: Vec2;\n header: boolean;\n}\n\nexport interface TableLayout {\n /** Column boundaries, local x (n + 1 values, from 0). */\n colX: number[];\n /** Row boundaries, local y downward (m + 1 values, from 0). */\n rowY: number[];\n /** World corners: top-left, top-right, bottom-right, bottom-left. */\n outline: Vec2[];\n /** Rules + cell texts as world objects (rules first, under the text). */\n children: ModelObject[];\n /** Anchor cells with their merged extents (merge-aware cell lookup). */\n anchors: { row: number; col: number; rows: number; cols: number }[];\n}\n\n/** Header rule weight when the table sets no lineWidth (ISO thick pen). */\nconst HEADER_RULE_MM = 0.5;\n\n/** Table-local point → world. */\nconst toWorld = (t: Table, p: Vec2): Vec2 => {\n const u = fromAngle(t.rotation);\n return add(add(t.position, scale(u, p.x)), scale(perp(u), -p.y));\n};\n\n/** The anchor index covering each grid slot (merges claim their area). */\nconst ownerGrid = (t: Table): number[][] => {\n const owner = t.cells.map((row) => row.map(() => -1));\n let next = 0;\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n if (owner[r][c] !== -1) return; // covered by an earlier merge\n const id = next++;\n const rows = cell.span?.rows ?? 1;\n const cols = cell.span?.cols ?? 1;\n for (let i = r; i < Math.min(r + rows, t.rows.length); i++)\n for (let j = c; j < Math.min(c + cols, t.columns.length); j++)\n if (owner[i][j] === -1) owner[i][j] = id;\n }),\n );\n return owner;\n};\n\n/** A cell's text as a stand-alone Text (styles merged over the table's),\n * not yet positioned. */\nconst cellText = (t: Table, row: number, col: number): Text => {\n const cell = t.cells[row][col];\n return {\n type: \"text\",\n id: `${t.id}:${row}:${col}`,\n layerId: t.layerId,\n position: { x: 0, y: 0 },\n content: cell.content,\n leaderLines: [],\n hAlign: \"center\",\n vAlign: \"center\",\n rotation: t.rotation,\n scale: t.scale,\n styleId: cell.styleId ?? t.styleId,\n styleOverride: { ...t.styleOverride, ...cell.styleOverride },\n ...(cell.color ? { color: cell.color } : {}),\n ...(t.opacity !== undefined ? { opacity: t.opacity } : {}),\n };\n};\n\n/** Word wrap leaves a single word wider than the cell on its own line,\n * running through the border; a cell breaks such a line between characters\n * instead (text objects keep word-only wrapping). */\nconst breakLongLines = (\n lines: string[],\n h: number,\n measure: TextMeasurer,\n width: number,\n): string[] =>\n lines.flatMap((line) => {\n if (measure.measureTextWidth(line, h) <= width) return [line];\n const out: string[] = [];\n let cur = \"\";\n for (const ch of line) {\n if (cur && measure.measureTextWidth(cur + ch, h) > width) {\n out.push(cur.trimEnd());\n cur = ch.trimStart();\n } else cur += ch;\n }\n if (cur) out.push(cur);\n return out;\n });\n\n/** Where a cell's text sits: its aligned anchor point inside the (merged)\n * cell rect, in world space, with the model alignment for it. */\nconst cellAnchor = (\n t: Table,\n colX: number[],\n rowY: number[],\n a: TableLayout[\"anchors\"][number],\n): Pick<Text, \"position\" | \"hAlign\" | \"vAlign\"> => {\n const cell = t.cells[a.row][a.col];\n const margin = t.cellMargin * t.scale;\n const x0 = colX[a.col] + margin;\n const x1 = colX[a.col + a.cols] - margin;\n const y0 = rowY[a.row] + margin;\n const y1 = rowY[a.row + a.rows] - margin;\n const h = cell.hAlign ?? \"left\";\n const v = cell.vAlign ?? \"center\";\n return {\n position: toWorld(t, {\n x: h === \"left\" ? x0 : h === \"right\" ? x1 : (x0 + x1) / 2,\n y: v === \"top\" ? y0 : v === \"bottom\" ? y1 : (y0 + y1) / 2,\n }),\n // The cell's justification is the text's: same edge on the point.\n hAlign: h,\n vAlign: v,\n };\n};\n\n/** A cell's editable frame: its text (styles merged, positioned as the\n * painter places it) and the wrap width inside the margins — what an\n * in-place editor needs to sit exactly over the painted text. `row`/`col`\n * may name any slot; a covered slot resolves to its merge anchor. */\nexport const tableCellFrame = (\n t: Table,\n textStyles: readonly TextStyle[],\n row: number,\n col: number,\n): { row: number; col: number; text: Text; innerWidth: number } => {\n const { colX, rowY, anchors } = tableLayout(t, textStyles);\n const a = anchors.find(\n (a) =>\n row >= a.row &&\n row < a.row + a.rows &&\n col >= a.col &&\n col < a.col + a.cols,\n ) ?? { row, col, rows: 1, cols: 1 };\n return {\n row: a.row,\n col: a.col,\n text: { ...cellText(t, a.row, a.col), ...cellAnchor(t, colX, rowY, a) },\n innerWidth: colX[a.col + a.cols] - colX[a.col] - 2 * t.cellMargin * t.scale,\n };\n};\n\nconst cache = new WeakMap<\n Table,\n { styles: readonly TextStyle[]; layout: TableLayout }\n>();\n\nexport const tableLayout = (\n t: Table,\n textStyles: readonly TextStyle[],\n): TableLayout => {\n const hit = cache.get(t);\n if (hit && hit.styles === textStyles) return hit.layout;\n\n const s = t.scale;\n const margin = t.cellMargin * s;\n const colX = [0];\n for (const w of t.columns) colX.push(colX[colX.length - 1] + w * s);\n\n // Anchors with their wrapped text.\n const owner = ownerGrid(t);\n const anchors: TableLayout[\"anchors\"] = [];\n const wrapped: { text: Text; lines: string[]; height: number }[] = [];\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n if (owner[r][c] !== anchors.length) return;\n const rows = Math.min(cell.span?.rows ?? 1, t.rows.length - r);\n const cols = Math.min(cell.span?.cols ?? 1, t.columns.length - c);\n anchors.push({ row: r, col: c, rows, cols });\n const text = cellText(t, r, c);\n const h = textHeight(text, textStyles);\n const { font, widthFactor } = effectiveTextFont(text, textStyles);\n const inner = colX[c + cols] - colX[c] - 2 * margin;\n if (cell.spans?.length) {\n // Formatted: wrap with per-run metrics, then join the lines like\n // the plain path with the spans carried over to the joined text.\n // ponytail: no mid-word breaking (breakLongLines) here — a word\n // wider than the cell overflows; port it to ranges if it bites.\n const rich = richTextBlock(\n cell.content,\n cell.spans,\n { face: font, heightMm: h, widthFactor },\n approximateTextMeasurer,\n approximateTextMeasurer,\n inner > 0 ? inner : undefined,\n );\n let content = \"\";\n const spans: TextSpan[] = [];\n rich.lines.forEach((l, k) => {\n if (k > 0) content += \"\\n\";\n spans.push(...sliceSpans(cell.spans, l.start, l.end, content.length));\n content += cell.content.slice(l.start, l.end);\n });\n wrapped.push({\n text: { ...text, spans },\n lines: [content],\n height: rich.height + 2 * margin,\n });\n return;\n }\n const measure = boundMeasurer(approximateTextMeasurer, font, widthFactor);\n const block = textBlock(\n cell.content,\n h,\n measure,\n inner > 0 ? inner : undefined,\n );\n const lines =\n inner > 0\n ? breakLongLines(block.lines, h, measure, inner)\n : block.lines;\n wrapped.push({\n text,\n lines,\n // An empty cell still reserves one line of its text height.\n height:\n (cell.content ? h + (lines.length - 1) * block.lineHeight : h) +\n 2 * margin,\n });\n }),\n );\n\n // Row heights: the floor, then single-row cells, then merges that still\n // don't fit grow their LAST row (in order of that row).\n const heights = t.rows.map((r) => (r.minHeight ?? 0) * s);\n anchors.forEach((a, i) => {\n if (a.rows === 1)\n heights[a.row] = Math.max(heights[a.row], wrapped[i].height);\n });\n anchors\n .map((a, i) => ({ a, need: wrapped[i].height }))\n .filter(({ a }) => a.rows > 1)\n .sort((x, y) => x.a.row + x.a.rows - (y.a.row + y.a.rows))\n .forEach(({ a, need }) => {\n let have = 0;\n for (let r = a.row; r < a.row + a.rows; r++) have += heights[r];\n if (have < need) heights[a.row + a.rows - 1] += need - have;\n });\n // Rows nobody sized (all covered by merges that fit) get the table's\n // one-line height so the grid never collapses.\n const oneLine = textHeight(cellText(t, 0, 0), textStyles) + 2 * margin;\n const rowY = [0];\n for (const h of heights) rowY.push(rowY[rowY.length - 1] + (h || oneLine));\n\n // Rules: boundaries between different owners (merges suppress their\n // interior), per the borders preset; collinear runs joined.\n const nr = t.rows.length;\n const nc = t.columns.length;\n const inner = t.borders === \"all\";\n const innerRows = t.borders === \"all\" || t.borders === \"rows\";\n const outer = t.borders !== \"none\";\n const rules: LocalRule[] = [];\n const run = (\n on: boolean[],\n seg: (k: number) => [Vec2, Vec2],\n header: boolean,\n ) => {\n let start = -1;\n for (let k = 0; k <= on.length; k++) {\n if (k < on.length && on[k]) {\n if (start === -1) start = k;\n continue;\n }\n if (start !== -1) {\n rules.push({ a: seg(start)[0], b: seg(k - 1)[1], header });\n start = -1;\n }\n }\n };\n for (let j = 0; j <= nc; j++) {\n const edge = j === 0 || j === nc;\n const on = Array.from({ length: nr }, (_, r) =>\n edge ? outer : inner && owner[r][j - 1] !== owner[r][j],\n );\n run(\n on,\n (r) => [\n { x: colX[j], y: rowY[r] },\n { x: colX[j], y: rowY[r + 1] },\n ],\n false,\n );\n }\n for (let i = 0; i <= nr; i++) {\n const edge = i === 0 || i === nr;\n const header = !edge && i === t.headerRows && outer;\n const on = Array.from({ length: nc }, (_, c) =>\n edge ? outer : (innerRows || header) && owner[i - 1][c] !== owner[i][c],\n );\n run(\n on,\n (c) => [\n { x: colX[c], y: rowY[i] },\n { x: colX[c + 1], y: rowY[i] },\n ],\n header,\n );\n }\n\n const children: ModelObject[] = rules.map((r, k) => ({\n type: \"line\",\n id: `${t.id}:rule:${k}`,\n layerId: t.layerId,\n a: toWorld(t, r.a),\n b: toWorld(t, r.b),\n ...(t.color ? { color: t.color } : {}),\n ...(t.opacity !== undefined ? { opacity: t.opacity } : {}),\n ...(r.header\n ? { lineWidth: t.lineWidth ? t.lineWidth * 2 : HEADER_RULE_MM }\n : t.lineWidth\n ? { lineWidth: t.lineWidth }\n : {}),\n }));\n\n // Cell texts at their aligned anchor points inside the merged rect.\n anchors.forEach((a, i) => {\n const { text, lines } = wrapped[i];\n if (!t.cells[a.row][a.col].content) return;\n children.push({\n ...text,\n ...cellAnchor(t, colX, rowY, a),\n content: lines.join(\"\\n\"),\n });\n });\n\n const w = colX[nc];\n const hTotal = rowY[nr];\n const layout: TableLayout = {\n colX,\n rowY,\n outline: [\n toWorld(t, { x: 0, y: 0 }),\n toWorld(t, { x: w, y: 0 }),\n toWorld(t, { x: w, y: hTotal }),\n toWorld(t, { x: 0, y: hTotal }),\n ],\n children,\n anchors,\n };\n cache.set(t, { styles: textStyles, layout });\n return layout;\n};\n","// AutoCAD Color Index mapping. Exports carry BOTH the nearest ACI (group 62,\n// legacy viewers) and the exact true color (group 420, wins where supported);\n// import resolves either back to hex.\n\nexport const hexToRgb = (hex: string): [number, number, number] | null => {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex);\n if (!m) return null;\n return [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16)];\n};\n\nexport const rgbToHex = (r: number, g: number, b: number): string =>\n `#${[r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\"),\n )\n .join(\"\")}`;\n\n// Full AutoCAD Color Index → hex palette (index 0 = ByBlock, 256 = ByLayer are\n// reserved and never looked up). Used on import to resolve an entity's ACI to a\n// concrete color. Generated from the standard ACAD palette.\nconst ACI_HEX: string[] = [\n \"#000000\",\n \"#ff0000\",\n \"#ffff00\",\n \"#00ff00\",\n \"#00ffff\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#ffffff\",\n \"#808080\",\n \"#c0c0c0\",\n \"#ff0000\",\n \"#ff7f7f\",\n \"#cc0000\",\n \"#cc6666\",\n \"#990000\",\n \"#994c4c\",\n \"#7f0000\",\n \"#7f3f3f\",\n \"#4c0000\",\n \"#4c2626\",\n \"#ff3f00\",\n \"#ff9f7f\",\n \"#cc3300\",\n \"#cc7f66\",\n \"#992600\",\n \"#995f4c\",\n \"#7f1f00\",\n \"#7f4f3f\",\n \"#4c1300\",\n \"#4c2f26\",\n \"#ff7f00\",\n \"#ffbf7f\",\n \"#cc6600\",\n \"#cc9966\",\n \"#994c00\",\n \"#99724c\",\n \"#7f3f00\",\n \"#7f5f3f\",\n \"#4c2600\",\n \"#4c3926\",\n \"#ffbf00\",\n \"#ffdf7f\",\n \"#cc9900\",\n \"#ccb266\",\n \"#997200\",\n \"#99854c\",\n \"#7f5f00\",\n \"#7f6f3f\",\n \"#4c3900\",\n \"#4c4226\",\n \"#ffff00\",\n \"#ffff7f\",\n \"#cccc00\",\n \"#cccc66\",\n \"#989800\",\n \"#98984c\",\n \"#7f7f00\",\n \"#7f7f3f\",\n \"#4c4c00\",\n \"#4c4c26\",\n \"#bfff00\",\n \"#dfff7f\",\n \"#99cc00\",\n \"#b2cc66\",\n \"#729800\",\n \"#85984c\",\n \"#5f7f00\",\n \"#6f7f3f\",\n \"#394c00\",\n \"#424c26\",\n \"#7fff00\",\n \"#bfff7f\",\n \"#66cc00\",\n \"#99cc66\",\n \"#4c9800\",\n \"#72984c\",\n \"#3f7f00\",\n \"#5f7f3f\",\n \"#264c00\",\n \"#394c26\",\n \"#3fff00\",\n \"#9fff7f\",\n \"#33cc00\",\n \"#7fcc66\",\n \"#269800\",\n \"#5f984c\",\n \"#1f7f00\",\n \"#4f7f3f\",\n \"#134c00\",\n \"#2f4c26\",\n \"#00ff00\",\n \"#7fff7f\",\n \"#00cc00\",\n \"#66cc66\",\n \"#009800\",\n \"#4c984c\",\n \"#007f00\",\n \"#3f7f3f\",\n \"#004c00\",\n \"#264c26\",\n \"#00ff3f\",\n \"#7fff9f\",\n \"#00cc33\",\n \"#66cc7f\",\n \"#009826\",\n \"#4c985f\",\n \"#007f1f\",\n \"#3f7f4f\",\n \"#004c13\",\n \"#264c2f\",\n \"#00ff7f\",\n \"#7fffbf\",\n \"#00cc66\",\n \"#66cc99\",\n \"#00984c\",\n \"#4c9872\",\n \"#007f3f\",\n \"#3f7f5f\",\n \"#004c26\",\n \"#264c39\",\n \"#00ffbf\",\n \"#7fffdf\",\n \"#00cc99\",\n \"#66ccb2\",\n \"#009872\",\n \"#4c9885\",\n \"#007f5f\",\n \"#3f7f6f\",\n \"#004c39\",\n \"#264c42\",\n \"#00ffff\",\n \"#7fffff\",\n \"#00cccc\",\n \"#66cccc\",\n \"#009898\",\n \"#4c9898\",\n \"#007f7f\",\n \"#3f7f7f\",\n \"#004c4c\",\n \"#264c4c\",\n \"#00bfff\",\n \"#7fdfff\",\n \"#0099cc\",\n \"#66b2cc\",\n \"#007298\",\n \"#4c8598\",\n \"#005f7f\",\n \"#3f6f7f\",\n \"#00394c\",\n \"#26424c\",\n \"#007fff\",\n \"#7fbfff\",\n \"#0066cc\",\n \"#6699cc\",\n \"#004c98\",\n \"#4c7298\",\n \"#003f7f\",\n \"#3f5f7f\",\n \"#00264c\",\n \"#26394c\",\n \"#003fff\",\n \"#7f9fff\",\n \"#0033cc\",\n \"#667fcc\",\n \"#002698\",\n \"#4c5f98\",\n \"#001f7f\",\n \"#3f4f7f\",\n \"#00134c\",\n \"#262f4c\",\n \"#0000ff\",\n \"#7f7fff\",\n \"#0000cc\",\n \"#6666cc\",\n \"#000098\",\n \"#4c4c98\",\n \"#00007f\",\n \"#3f3f7f\",\n \"#00004c\",\n \"#26264c\",\n \"#3f00ff\",\n \"#9f7fff\",\n \"#3300cc\",\n \"#7f66cc\",\n \"#260098\",\n \"#5f4c98\",\n \"#1f007f\",\n \"#4f3f7f\",\n \"#13004c\",\n \"#2f264c\",\n \"#7f00ff\",\n \"#bf7fff\",\n \"#6600cc\",\n \"#9966cc\",\n \"#4c0098\",\n \"#724c98\",\n \"#3f007f\",\n \"#5f3f7f\",\n \"#26004c\",\n \"#39264c\",\n \"#bf00ff\",\n \"#df7fff\",\n \"#9900cc\",\n \"#b266cc\",\n \"#720098\",\n \"#854c98\",\n \"#5f007f\",\n \"#6f3f7f\",\n \"#39004c\",\n \"#42264c\",\n \"#ff00ff\",\n \"#ff7fff\",\n \"#cc00cc\",\n \"#cc66cc\",\n \"#980098\",\n \"#984c98\",\n \"#7f007f\",\n \"#7f3f7f\",\n \"#4c004c\",\n \"#4c264c\",\n \"#ff00bf\",\n \"#ff7fdf\",\n \"#cc0099\",\n \"#cc66b2\",\n \"#980072\",\n \"#984c85\",\n \"#7f005f\",\n \"#7f3f6f\",\n \"#4c0039\",\n \"#4c2642\",\n \"#ff007f\",\n \"#ff7fbf\",\n \"#cc0066\",\n \"#cc6699\",\n \"#98004c\",\n \"#984c72\",\n \"#7f003f\",\n \"#7f3f5f\",\n \"#4c0026\",\n \"#4c2639\",\n \"#ff003f\",\n \"#ff7f9f\",\n \"#cc0033\",\n \"#cc667f\",\n \"#980026\",\n \"#984c5f\",\n \"#7f001f\",\n \"#7f3f4f\",\n \"#4c0013\",\n \"#4c262f\",\n \"#333333\",\n \"#5b5b5b\",\n \"#848484\",\n \"#adadad\",\n \"#d6d6d6\",\n \"#ffffff\",\n];\n\n/** Concrete ACI index (1–255) → hex; ByBlock/ByLayer/out-of-range → undefined. */\nexport const aciToHex = (index: number): string | undefined =>\n index > 0 && index < 256 ? ACI_HEX[index] : undefined;\n\n// RGB triples for the palette above, decoded once (index 0 stays unused).\nconst ACI_RGB: [number, number, number][] = ACI_HEX.map(\n (hex) => hexToRgb(hex) ?? [0, 0, 0],\n);\n\n/** Nearest ACI index (1–255, full palette) for a hex color. */\nexport const nearestAci = (hex: string): number => {\n const rgb = hexToRgb(hex);\n if (!rgb) return 7;\n let best = 7;\n let bestD = Infinity;\n for (let index = 1; index < 256; index++) {\n const c = ACI_RGB[index];\n const d =\n (rgb[0] - c[0]) ** 2 + (rgb[1] - c[1]) ** 2 + (rgb[2] - c[2]) ** 2;\n if (d < bestD) {\n bestD = d;\n best = index;\n }\n }\n return best;\n};\n\n/** Hex → packed 24-bit true color (DXF group 420); null for invalid hex. */\nexport const hexToTrueColor = (hex: string): number | null => {\n const rgb = hexToRgb(hex);\n return rgb ? (rgb[0] << 16) | (rgb[1] << 8) | rgb[2] : null;\n};\n","// DXF codecs: each mapping between a DXF value and the Linea model, BOTH\n// directions in one place, so an export reads back as what was written\n// (codecs.test.ts round-trips them). The import (import/dxf) decodes, the\n// export (export/dxf) encodes.\n\nimport type { TextSpan } from \"../../model/objects\";\nimport {\n fontFromDxfStyle,\n fontTypeface,\n parseFontFace,\n resolveFont,\n} from \"../../model/fonts\";\nimport { normalizeSpans, type SpanAttrs } from \"../../paint/richText\";\nimport { aciToHex, nearestAci } from \"./aci\";\n\n// --- lineweight (group 370, 1/100 mm) ---------------------------------------\n\n/** The DXF lineweight enum. */\nexport const LINE_WEIGHTS = [\n 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106,\n 120, 140, 158, 200, 211,\n];\n\n/** Group 370 → mm. Negative values inherit; 0 (\"thinnest\") is the finest\n * ISO pen, 0.05 mm. */\nexport const lineWeightToMm = (\n lineWeight: number | undefined,\n): number | undefined =>\n lineWeight === undefined || lineWeight < 0\n ? undefined\n : Math.max(lineWeight, 5) / 100;\n\n/** mm → the nearest enum value. */\nexport const mmToLineWeight = (mm: number): number =>\n LINE_WEIGHTS.reduce((best, w) =>\n Math.abs(w - mm * 100) < Math.abs(best - mm * 100) ? w : best,\n );\n\n// --- TEXT / MTEXT content ----------------------------------------------------\n\n/** Escape MTEXT specials, encode line breaks as \\P and tabs as ^I (the\n * caret control code AutoCAD stores tabs as — cleanText decodes it back).\n * A literal caret is \"^ \" (the DXF convention), so \"^I\" typed as text\n * reads back as written.\n * ponytail: a literal \"%%d\"/\"%%p\"/\"%%c\" still reads back as °/±/Ø — escaping\n * it (\"%%%\") would show as \"%%%\" in AutoCAD's MTEXT; worth it only if\n * someone types those codes as text. */\nexport const encodeMtext = (s: string): string =>\n s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\{/g, \"\\\\{\")\n .replace(/\\}/g, \"\\\\}\")\n .replace(/\\^/g, \"^ \")\n .replace(/\\n/g, \"\\\\P\")\n .replace(/\\t/g, \"^I\");\n\n/** Decode classic %%-escapes used in TEXT (°, ±, Ø; %%u/%%o toggles drop). */\nexport const decodeTextEscapes = (text: string): string =>\n text.replace(/%%([dpcuo%])/gi, (_, ch: string) => {\n switch (ch.toLowerCase()) {\n case \"d\":\n return \"°\";\n case \"p\":\n return \"±\";\n case \"c\":\n return \"Ø\";\n case \"u\":\n case \"o\":\n return \"\";\n default:\n return \"%\";\n }\n });\n\nconst SUPERSCRIPT: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"+\": \"⁺\",\n \"-\": \"⁻\",\n \"=\": \"⁼\",\n \"(\": \"⁽\",\n \")\": \"⁾\",\n n: \"ⁿ\",\n i: \"ⁱ\",\n};\nconst SUBSCRIPT: Record<string, string> = {\n \"0\": \"₀\",\n \"1\": \"₁\",\n \"2\": \"₂\",\n \"3\": \"₃\",\n \"4\": \"₄\",\n \"5\": \"₅\",\n \"6\": \"₆\",\n \"7\": \"₇\",\n \"8\": \"₈\",\n \"9\": \"₉\",\n \"+\": \"₊\",\n \"-\": \"₋\",\n \"=\": \"₌\",\n \"(\": \"₍\",\n \")\": \"₎\",\n};\n/** Script form when every character has one, else the plain text. */\nconst toScript = (s: string, map: Record<string, string>): string =>\n [...s].every((c) => map[c]) ? [...s].map((c) => map[c]).join(\"\") : s;\n\n/**\n * MTEXT stack `\\Stop^bottom;` / `\\Stop#bottom;` / `\\Stop/bottom;`. An empty\n * bottom is AutoCAD's superscript (`m\\S2^;` = m²), an empty top its subscript\n * (`λ\\S^D;` = λ with subscript D); both present is a fraction or tolerance\n * stack → \"a/b\".\n */\nconst stackText = (body: string): string => {\n const m = /^(.*?)([\\^#/])(.*)$/s.exec(body);\n if (!m) return body;\n const top = m[1].trim();\n const bottom = m[3].trim();\n if (top && !bottom) return toScript(top, SUPERSCRIPT);\n if (!top && bottom) return toScript(bottom, SUBSCRIPT);\n return `${top}/${bottom}`;\n};\n\n/** Symbol-font (symbol.ttf / \\fSymbol) code points → the glyphs they draw. */\nconst SYMBOL_FONT: Record<string, string> = {\n a: \"α\",\n b: \"β\",\n c: \"χ\",\n d: \"δ\",\n e: \"ε\",\n f: \"φ\",\n g: \"γ\",\n h: \"η\",\n i: \"ι\",\n k: \"κ\",\n l: \"λ\",\n m: \"μ\",\n n: \"ν\",\n p: \"π\",\n q: \"θ\",\n r: \"ρ\",\n s: \"σ\",\n t: \"τ\",\n u: \"υ\",\n w: \"ω\",\n x: \"ξ\",\n y: \"ψ\",\n z: \"ζ\",\n D: \"Δ\",\n F: \"Φ\",\n G: \"Γ\",\n L: \"Λ\",\n P: \"Π\",\n Q: \"Θ\",\n S: \"Σ\",\n W: \"Ω\",\n X: \"Ξ\",\n Y: \"Ψ\",\n \"£\": \"≤\",\n \"³\": \"≥\",\n \"¹\": \"≠\",\n \"»\": \"≈\",\n \"¥\": \"∞\",\n \"´\": \"×\",\n \"¸\": \"÷\",\n Ö: \"√\",\n \"®\": \"→\",\n \"¬\": \"←\",\n Æ: \"∅\",\n Î: \"∈\",\n \"¶\": \"∂\",\n};\n/** True for an inline \\f font code naming the Symbol font (\"Symbol|b0|i0\"). */\nconst isSymbolFont = (fontCode: string): boolean =>\n /^symbol(\\.ttf)?$/i.test(fontCode.split(\"|\")[0].trim());\n\n/** Formatting state while scanning MTEXT (one per `{…}` scope). */\ninterface MtextState {\n symbol: boolean;\n font?: string;\n bold?: boolean;\n italic?: boolean;\n /** × the entity height. */\n height?: number;\n color?: string;\n underline?: boolean;\n}\n\n/** One decoded stretch of MTEXT with uniform formatting. */\ninterface MtextChunk {\n text: string;\n attrs: SpanAttrs;\n}\n\n/**\n * Scan MTEXT inline codes. Without `opts`: the plain-text reduction (stacks\n * as Unicode super/subscripts, formatting dropped). With `opts`: formatting\n * kept per chunk — font (\\f), height (\\H, as a ratio of `heightMm`), ACI\n * colour (\\C), underline (\\L…\\l) and \\S super/subscripts as `script`.\n * ponytail: true colour (\\c) and oblique/tracking/width (\\Q \\T \\W) inside a\n * run are dropped; map them when a drawing needs it.\n */\nconst scanMtext = (text: string, opts?: { heightMm: number }): MtextChunk[] => {\n const chunks: MtextChunk[] = [];\n let st: MtextState = { symbol: false };\n const stack: MtextState[] = [];\n const attrs = (extra?: Partial<SpanAttrs>): SpanAttrs =>\n opts\n ? {\n ...(st.font !== undefined ? { font: st.font } : {}),\n ...(st.bold !== undefined ? { bold: st.bold } : {}),\n ...(st.italic !== undefined ? { italic: st.italic } : {}),\n ...(st.height !== undefined ? { height: st.height } : {}),\n ...(st.color !== undefined ? { color: st.color } : {}),\n ...(st.underline ? { underline: true } : {}),\n ...extra,\n }\n : {};\n const emit = (t: string, extra?: Partial<SpanAttrs>) => {\n if (!t) return;\n const a = attrs(extra);\n const last = chunks[chunks.length - 1];\n if (!extra && last && JSON.stringify(last.attrs) === JSON.stringify(a))\n last.text += t;\n else chunks.push({ text: t, attrs: a });\n };\n /** A `\\X…;` code's body starting at i; [body, index after \";\"], or\n * [\"\", i] when unterminated. */\n const codeBody = (i: number): [string, number] => {\n const end = text.indexOf(\";\", i);\n return end === -1 ? [\"\", i] : [text.slice(i, end), end + 1];\n };\n let i = 0;\n while (i < text.length) {\n const ch = text[i];\n if (ch === \"{\") {\n stack.push(st);\n st = { ...st };\n i++;\n } else if (ch === \"}\") {\n st = stack.pop() ?? st;\n i++;\n } else if (ch !== \"\\\\\") {\n emit(st.symbol ? (SYMBOL_FONT[ch] ?? ch) : ch);\n i++;\n } else {\n const next = text[i + 1] ?? \"\";\n if (next === \"\\\\\" || next === \"{\" || next === \"}\") {\n emit(next); // escaped literal\n i += 2;\n } else if (next === \"P\") {\n emit(\"\\n\"); // paragraph break\n i += 2;\n } else if (next === \"~\") {\n emit(\" \"); // non-breaking space\n i += 2;\n } else if (next === \"L\" || next === \"l\") {\n st = { ...st, underline: next === \"L\" };\n i += 2;\n } else if (\"OoKk\".includes(next)) {\n i += 2; // overline/strike toggles (no \";\")\n } else if (next === \"S\") {\n // Stack: fraction \\S1^2; / \\S1#2; → \"1/2\"; superscript \\S2^; and\n // subscript \\S^2; → a script span, or \"²\" / \"₂\" in plain text.\n const [body, at] = codeBody(i + 2);\n const m = /^(.*?)([\\^#/])(.*)$/s.exec(body);\n const top = m?.[1].trim() ?? \"\";\n const bottom = m?.[3].trim() ?? \"\";\n if (opts && m && m[2] === \"^\" && top && !bottom)\n emit(top, { script: \"super\" });\n else if (opts && m && m[2] === \"^\" && !top && bottom)\n emit(bottom, { script: \"sub\" });\n else emit(stackText(body));\n i = at === i + 2 ? i + 2 : at;\n } else if (\n (next === \"U\" || next === \"u\") &&\n /^\\+[0-9a-fA-F]{4}/.test(text.slice(i + 2, i + 7))\n ) {\n // Unicode escape \\U+2265 → \"≥\". It has no \";\" terminator, so the\n // generic branch below would swallow the text up to the next \";\".\n emit(String.fromCodePoint(parseInt(text.slice(i + 3, i + 7), 16)));\n i += 7;\n } else if (next === \"f\" || next === \"F\") {\n // Font switch \\fSymbol|b0|i0;… — Symbol glyphs need mapping.\n const [body, at] = codeBody(i + 2);\n st = { ...st, symbol: isSymbolFont(body) };\n if (opts && !st.symbol && body) {\n const [name, ...flags] = body.split(\"|\");\n const file = name.includes(\".\");\n const face = fontFromDxfStyle(\n file ? name : undefined,\n file ? undefined : name,\n );\n const flag = (k: string) => flags.find((f) => f[0] === k)?.slice(1);\n st.font = face.font;\n st.bold = flag(\"b\") !== undefined ? flag(\"b\") === \"1\" : face.bold;\n st.italic = flag(\"i\") !== undefined ? flag(\"i\") === \"1\" : face.italic;\n }\n i = at === i + 2 ? i + 2 : at;\n } else if (opts && next === \"H\") {\n // \\H2.5; absolute height, \\H0.7x; relative to the current one.\n const [body, at] = codeBody(i + 2);\n const v = Number.parseFloat(body);\n if (Number.isFinite(v) && v > 0)\n st = {\n ...st,\n height: /x$/i.test(body)\n ? (st.height ?? 1) * v\n : v / (opts.heightMm > 0 ? opts.heightMm : v),\n };\n i = at === i + 2 ? i + 2 : at;\n } else if (opts && next === \"C\") {\n const [body, at] = codeBody(i + 2);\n st = { ...st, color: aciToHex(Number.parseInt(body, 10)) };\n i = at === i + 2 ? i + 2 : at;\n } else {\n // Other \\X…; formatting codes (\\H… \\C… \\p…) — skip through \";\".\n const end = text.indexOf(\";\", i + 1);\n i = end === -1 ? i + 2 : end + 1;\n }\n }\n }\n return chunks;\n};\n\n/** Reduce MTEXT inline formatting codes to plain text (line breaks kept). */\nconst stripMtextCodes = (text: string): string =>\n scanMtext(text)\n .map((c) => c.text)\n .join(\"\");\n\n/** First inline \\W width-factor code, if any (\"\\W0.8;\" -> 0.8). */\nexport const mtextWidthFactor = (text: string): number | undefined => {\n const m = /\\\\W([0-9.]+);/.exec(text);\n const v = m ? Number(m[1]) : NaN;\n return Number.isFinite(v) && v > 0 && v !== 1 ? v : undefined;\n};\n\n/** Bold / italic from the first inline \\f font code\n * (\"{\\fArial|b1|i0|c0|p34;…}\" → { bold: true }); only flags that are ON. */\nexport const mtextFontFlags = (\n text: string,\n): { bold?: true; italic?: true } => {\n const m = /\\\\f[^|;]*((?:\\|[a-z]\\d+)*)/.exec(text);\n if (!m) return {};\n return {\n ...(/\\|b1/.test(m[1]) ? { bold: true as const } : {}),\n ...(/\\|i1/.test(m[1]) ? { italic: true as const } : {}),\n };\n};\n\n/**\n * Decode the caret control codes AutoCAD embeds in TEXT/MTEXT: `^I` is a tab,\n * `^J`/`^M` are line breaks, `^ ` a literal caret. Undecoded, the `^I` shows\n * up as a stray \"^|\" (the capital I reads as a pipe). Literal CR/LF are\n * normalized to \"\\n\" as well. One left-to-right pass, so \"^ I\" stays \"^I\".\n */\nconst decodeControlCodes = (text: string): string =>\n text.replace(/\\^M\\^J|\\^[IJM ]|\\r\\n?/g, (m) =>\n m === \"^I\" ? \"\\t\" : m === \"^ \" ? \"^\" : \"\\n\",\n );\n\n/**\n * Full TEXT/MTEXT content cleanup: MTEXT inline codes (MTEXT only) → classic\n * %%-escapes → caret control codes. Decoded tabs (`^I` → `\\t`) are KEPT:\n * the renderer aligns them at tab stops (paint/textMetrics), so imported\n * tabular text stays tabular. Exported for unit testing.\n */\nexport const cleanText = (raw: string, mtext: boolean): string =>\n decodeControlCodes(decodeTextEscapes(mtext ? stripMtextCodes(raw) : raw));\n\n/**\n * MTEXT → plain text + character spans (docs/rich-text.md §7): cleanText's\n * decoding per formatted chunk, offsets into the decoded text. `heightMm`\n * is the entity height (\\H absolute heights become ratios of it).\n */\nexport const cleanRichText = (\n raw: string,\n heightMm: number,\n): { content: string; spans: TextSpan[] } => {\n let content = \"\";\n const spans: TextSpan[] = [];\n for (const c of scanMtext(raw, { heightMm })) {\n const text = decodeControlCodes(decodeTextEscapes(c.text));\n spans.push({\n start: content.length,\n end: content.length + text.length,\n ...c.attrs,\n });\n content += text;\n }\n return { content, spans: normalizeSpans(spans, content) };\n};\n\n/** Stack text: MTEXT escapes plus the stack separators and terminator. */\nconst encodeStack = (s: string): string =>\n encodeMtext(s).replace(/[#/;]/g, (c) => `\\\\${c}`);\n\n/**\n * Text + spans → MTEXT inline codes: each formatted run in its own `{…}`\n * group (\\f font|b|i, \\H<ratio>x, \\C nearest ACI, \\L underline, \\S stacks\n * for scripts). `face` is the text's base face (bold/italic a run doesn't\n * set come from it).\n */\nexport const encodeRichMtext = (\n content: string,\n spans: readonly TextSpan[],\n face: string | undefined,\n): string => {\n const base = parseFontFace(face);\n let out = \"\";\n let at = 0;\n for (const s of normalizeSpans(spans, content)) {\n out += encodeMtext(content.slice(at, s.start));\n const fontCode =\n s.font !== undefined || s.bold !== undefined || s.italic !== undefined\n ? `\\\\f${fontTypeface(resolveFont(s.font ?? base.font))}|b${\n (s.bold ?? base.bold) ? 1 : 0\n }|i${(s.italic ?? base.italic) ? 1 : 0};`\n : \"\";\n const codes =\n fontCode +\n (s.height !== undefined ? `\\\\H${s.height}x;` : \"\") +\n (s.color ? `\\\\C${nearestAci(s.color)};` : \"\") +\n (s.underline ? \"\\\\L\" : \"\");\n const body = content.slice(s.start, s.end);\n // A stack holds one line: scripts over line breaks / tabs stay plain.\n const text =\n s.script && !/[\\n\\t]/.test(body)\n ? s.script === \"super\"\n ? `\\\\S${encodeStack(body)}^;`\n : `\\\\S^${encodeStack(body)};`\n : encodeMtext(body);\n out += codes || s.script ? `{${codes}${text}}` : text;\n at = s.end;\n }\n return out + encodeMtext(content.slice(at));\n};\n","// Hand-rolled DXF pieces @tarikjabiri/dxf lacks: the paper-space VIEWPORT\n// entity, LAYOUT objects (ACAD_LAYOUT dictionary), and MULTILEADER +\n// MLEADERSTYLE. All hook into the writer through its public extension points\n// (EntitiesManager.addEntity / DxfObjectsSection.addObject) so handles and\n// owner wiring stay consistent. The MULTILEADER tag stream mirrors ezdxf's\n// output (AutoCAD-validated) field for field.\n\nimport { Point, DxfObject, type Dxfier } from \"@tarikjabiri/dxf\";\n\n/** Raw AutoCAD color values (0xC?000000 method markers). */\nconst RAW_COLOR_BY_BLOCK = -1056964608;\nconst RAW_COLOR_NONE = -939524096;\n\n/** Zoom-lock bit of the VIEWPORT status flags (group 90). */\nconst VIEWPORT_LOCKED_FLAG = 16384;\n\ninterface ViewportEntityArgs {\n /** Viewport center on the sheet (paper mm). */\n center: { x: number; y: number };\n /** Frame size on the sheet (paper mm). */\n width: number;\n height: number;\n /** Model-space point shown at the viewport center. */\n viewCenter: { x: number; y: number };\n /** Model-space height visible through the frame (sets the scale). */\n viewHeight: number;\n /** 1 is the layout's own paper view; real viewports count from 2. */\n id: number;\n /** Stacking status; > 0 means on. */\n status: number;\n locked: boolean;\n /** Handles of layers frozen in this viewport (group 331). */\n frozenLayerHandles: string[];\n}\n\n/**\n * Paper-space VIEWPORT entity. Extends the writer's Point only to inherit the\n * Entity plumbing (handle, owner block record, common-group emission) — the\n * whole AcDbViewport body is emitted by dxfyChild.\n */\nexport class ViewportEntity extends Point {\n private readonly args: ViewportEntityArgs;\n\n constructor(args: ViewportEntityArgs) {\n super(args.center.x, args.center.y, 0);\n this.args = args;\n // The base Entity emits these (0 VIEWPORT … 100 AcDbViewport).\n this.type = \"VIEWPORT\";\n this.subclassMarker = \"AcDbViewport\";\n }\n\n override dxfyChild(dx: Dxfier): void {\n const a = this.args;\n dx.push(10, a.center.x);\n dx.push(20, a.center.y);\n dx.push(30, 0);\n dx.push(40, a.width);\n dx.push(41, a.height);\n dx.push(68, a.status);\n dx.push(69, a.id);\n dx.push(12, a.viewCenter.x);\n dx.push(22, a.viewCenter.y);\n dx.push(13, 0);\n dx.push(23, 0);\n dx.push(14, 10);\n dx.push(24, 10);\n dx.push(15, 10);\n dx.push(25, 10);\n dx.push(16, 0);\n dx.push(26, 0);\n dx.push(36, 1);\n dx.push(17, 0);\n dx.push(27, 0);\n dx.push(37, 0);\n dx.push(42, 50);\n dx.push(43, 0);\n dx.push(44, 0);\n dx.push(45, a.viewHeight);\n dx.push(50, 0);\n dx.push(51, 0);\n dx.push(72, 100);\n for (const handle of a.frozenLayerHandles) dx.push(331, handle);\n dx.push(90, a.locked ? VIEWPORT_LOCKED_FLAG : 0);\n dx.push(281, 0);\n dx.push(71, 1);\n dx.push(74, 0);\n }\n}\n\ninterface LayoutObjectArgs {\n name: string;\n /** 0 = Model tab; paper layouts count from 1, in tab order. */\n tabOrder: number;\n /** Sheet size in mm (PlotSettings always stores mm). */\n paperWidth: number;\n paperHeight: number;\n /** BLOCK_RECORD handle of the space this layout owns. */\n blockRecordHandle: string;\n}\n\n/**\n * LAYOUT object (AcDbPlotSettings + AcDbLayout) for the OBJECTS section.\n * The writer only provides generic dictionaries, so the body is emitted by\n * hand; margins and plot flags use plain defaults.\n */\nexport class LayoutObject extends DxfObject {\n private readonly args: LayoutObjectArgs;\n\n constructor(args: LayoutObjectArgs) {\n super(\"LAYOUT\");\n this.args = args;\n }\n\n override dxfy(dx: Dxfier): void {\n const a = this.args;\n dx.push(0, \"LAYOUT\");\n dx.push(5, this.handle);\n dx.push(330, this.ownerObjecthandle);\n dx.push(100, \"AcDbPlotSettings\");\n dx.push(1, \"\");\n dx.push(2, \"none_device\");\n dx.push(4, \"\");\n dx.push(6, \"\");\n dx.push(40, 0);\n dx.push(41, 0);\n dx.push(42, 0);\n dx.push(43, 0);\n dx.push(44, a.paperWidth);\n dx.push(45, a.paperHeight);\n dx.push(46, 0);\n dx.push(47, 0);\n dx.push(48, 0);\n dx.push(49, 0);\n dx.push(140, 0);\n dx.push(141, 0);\n dx.push(142, 1);\n dx.push(143, 1);\n dx.push(70, 688);\n dx.push(72, 1); // plot paper units: millimeters\n dx.push(73, 0);\n dx.push(74, 5);\n dx.push(7, \"\");\n dx.push(75, 16);\n dx.push(147, 1);\n dx.push(148, 0);\n dx.push(149, 0);\n dx.push(100, \"AcDbLayout\");\n dx.push(1, a.name);\n dx.push(70, 1);\n dx.push(71, a.tabOrder);\n dx.push(10, 0);\n dx.push(20, 0);\n dx.push(11, a.paperWidth);\n dx.push(21, a.paperHeight);\n dx.push(12, 0);\n dx.push(22, 0);\n dx.push(32, 0);\n dx.push(14, 0);\n dx.push(24, 0);\n dx.push(34, 0);\n dx.push(15, a.paperWidth);\n dx.push(25, a.paperHeight);\n dx.push(35, 0);\n dx.push(146, 0);\n dx.push(13, 0);\n dx.push(23, 0);\n dx.push(33, 0);\n dx.push(16, 1);\n dx.push(26, 0);\n dx.push(36, 0);\n dx.push(17, 0);\n dx.push(27, 1);\n dx.push(37, 0);\n dx.push(76, 0);\n dx.push(330, a.blockRecordHandle);\n }\n}\n\ninterface MultiLeaderArgs {\n /**\n * Leader lines in local order (primary first). Vertices run arrow tip →\n * junction; the shared junction itself is NOT included (it's the LEADER\n * node's \"last point\").\n */\n lines: { x: number; y: number }[][];\n /** Common junction where all lines meet (primary line's last point). */\n junction: { x: number; y: number };\n /** Dogleg from the junction toward the text (unit direction + length). */\n doglegDirection: { x: number; y: number };\n doglegLength: number;\n /** MTEXT-escaped note content. */\n content: string;\n /**\n * Base sizes BEFORE scale. The writer multiplies them by overallScale for\n * the stored tags — CONTEXT_DATA and entity-level override sizes hold\n * FINAL values in DXF; group 40/45 record the factor for later edits.\n */\n textHeight: number;\n arrowSize: number;\n overallScale: number;\n /** Text insertion point (past the dogleg). */\n textLocation: { x: number; y: number };\n /** Handles resolved by the exporter. */\n styleHandle: string;\n textStyleHandle: string;\n lineTypeHandle: string;\n /** Text attachment point 1–9 (TL TC TR / ML MC MR / BL BC BR, like MTEXT\n * group 71): which corner of the note sits at the text location. */\n attachment: number;\n}\n\n/**\n * MULTILEADER entity (mtext content + N leader lines). Tag order mirrors\n * ezdxf's writer output; the entity-level property-override mask is all-ones\n * so the values here win over the referenced MLEADERSTYLE.\n */\nexport class MultiLeaderEntity extends Point {\n private readonly args: MultiLeaderArgs;\n\n constructor(args: MultiLeaderArgs) {\n super(args.junction.x, args.junction.y, 0);\n this.args = args;\n this.type = \"MULTILEADER\";\n this.subclassMarker = \"AcDbMLeader\";\n }\n\n override dxfyChild(dx: Dxfier): void {\n const a = this.args;\n dx.push(270, 2); // version\n dx.push(300, \"CONTEXT_DATA{\");\n dx.push(40, a.overallScale); // overall scale (multiplies all sizes)\n // Content base point = end of the dogleg.\n dx.push(10, a.junction.x + a.doglegDirection.x * a.doglegLength);\n dx.push(20, a.junction.y + a.doglegDirection.y * a.doglegLength);\n dx.push(30, 0);\n dx.push(41, a.textHeight * a.overallScale);\n dx.push(140, a.arrowSize * a.overallScale);\n dx.push(145, 2 * a.overallScale); // landing gap\n dx.push(174, 1);\n dx.push(175, 1);\n dx.push(176, 0);\n dx.push(177, 0);\n dx.push(290, 1); // has mtext content\n dx.push(304, a.content);\n dx.push(11, 0);\n dx.push(21, 0);\n dx.push(31, 1); // text normal\n dx.push(340, a.textStyleHandle);\n dx.push(12, a.textLocation.x);\n dx.push(22, a.textLocation.y);\n dx.push(32, 0);\n dx.push(13, 1);\n dx.push(23, 0);\n dx.push(33, 0); // text direction\n dx.push(42, 0); // rotation\n dx.push(43, 0); // width\n dx.push(44, 0);\n dx.push(45, 1);\n dx.push(170, 1);\n dx.push(90, RAW_COLOR_BY_BLOCK); // text color\n dx.push(171, a.attachment); // text attachment point\n dx.push(172, 1); // flow direction\n dx.push(91, RAW_COLOR_NONE); // background fill color\n dx.push(141, 1.5);\n dx.push(92, 0);\n dx.push(291, 0);\n dx.push(292, 0);\n dx.push(173, 0);\n dx.push(293, 0);\n dx.push(142, 0);\n dx.push(143, 0);\n dx.push(294, 0);\n dx.push(295, 1);\n dx.push(296, 0);\n dx.push(110, 0);\n dx.push(120, 0);\n dx.push(130, 0); // plane origin\n dx.push(111, 1);\n dx.push(121, 0);\n dx.push(131, 0); // plane x axis\n dx.push(112, 0);\n dx.push(122, 1);\n dx.push(132, 0); // plane y axis\n dx.push(297, 0);\n dx.push(302, \"LEADER{\");\n dx.push(290, 1); // has last leader point\n dx.push(291, 1); // has dogleg\n dx.push(10, a.junction.x);\n dx.push(20, a.junction.y);\n dx.push(30, 0);\n dx.push(11, a.doglegDirection.x);\n dx.push(21, a.doglegDirection.y);\n dx.push(31, 0);\n dx.push(90, 0); // branch index\n dx.push(40, a.doglegLength);\n a.lines.forEach((line, i) => {\n dx.push(304, \"LEADER_LINE{\");\n for (const p of line) {\n dx.push(10, p.x);\n dx.push(20, p.y);\n dx.push(30, 0);\n }\n dx.push(91, i); // line index\n dx.push(92, RAW_COLOR_BY_BLOCK);\n dx.push(305, \"}\");\n });\n dx.push(303, \"}\");\n dx.push(301, \"}\");\n dx.push(340, a.styleHandle);\n dx.push(90, 2147483647); // property override flags: entity values win\n dx.push(170, 1); // straight leader lines\n dx.push(91, RAW_COLOR_BY_BLOCK);\n dx.push(341, a.lineTypeHandle);\n dx.push(171, -2); // lineweight ByBlock\n dx.push(290, 1); // landing enabled\n dx.push(291, 1); // dogleg enabled\n dx.push(41, a.doglegLength);\n dx.push(42, a.arrowSize * a.overallScale);\n dx.push(172, 2); // content type: mtext\n dx.push(343, a.textStyleHandle);\n dx.push(173, 1);\n dx.push(95, 1);\n dx.push(174, 1);\n dx.push(175, 0);\n dx.push(92, RAW_COLOR_BY_BLOCK);\n dx.push(292, 0);\n dx.push(93, RAW_COLOR_BY_BLOCK);\n dx.push(10, 1);\n dx.push(20, 1);\n dx.push(30, 1); // block content scale\n dx.push(43, 0);\n dx.push(176, 0);\n dx.push(293, 0);\n dx.push(294, 0);\n dx.push(178, 0);\n dx.push(179, 1);\n dx.push(45, a.overallScale); // entity scale, consistent with context 40\n }\n}\n\ninterface MLeaderStyleArgs {\n name: string;\n textStyleHandle: string;\n arrowSize: number;\n textHeight: number;\n /** ACAD_MLEADERSTYLE dictionary handle (owner + reactor). */\n dictionaryHandle: string;\n}\n\n/**\n * Minimal MLEADERSTYLE (mirrors ezdxf's \"Standard\"). Entities override every\n * property anyway (mask above), so the style mostly satisfies referential\n * integrity.\n */\nexport class MLeaderStyleObject extends DxfObject {\n private readonly args: MLeaderStyleArgs;\n\n constructor(args: MLeaderStyleArgs) {\n super(\"MLEADERSTYLE\");\n this.args = args;\n }\n\n override dxfy(dx: Dxfier): void {\n const a = this.args;\n dx.push(0, \"MLEADERSTYLE\");\n dx.push(5, this.handle);\n dx.push(102, \"{ACAD_REACTORS\");\n dx.push(330, a.dictionaryHandle);\n dx.push(102, \"}\");\n dx.push(330, a.dictionaryHandle);\n dx.push(100, \"AcDbMLeaderStyle\");\n dx.push(179, 2);\n dx.push(170, 2);\n dx.push(171, 1);\n dx.push(172, 0);\n dx.push(90, 2);\n dx.push(40, 0);\n dx.push(41, 0);\n dx.push(173, 1);\n dx.push(91, RAW_COLOR_BY_BLOCK);\n dx.push(92, -2);\n dx.push(290, 1);\n dx.push(42, 2); // landing gap\n dx.push(291, 1);\n dx.push(43, 8); // dogleg length\n dx.push(3, a.name);\n dx.push(44, a.arrowSize);\n dx.push(300, \"\");\n dx.push(342, a.textStyleHandle);\n dx.push(174, 1);\n dx.push(175, 1);\n dx.push(176, 0);\n dx.push(178, 1);\n dx.push(93, RAW_COLOR_BY_BLOCK);\n dx.push(45, a.textHeight);\n dx.push(292, 0);\n dx.push(297, 0);\n dx.push(46, a.textHeight);\n dx.push(94, RAW_COLOR_BY_BLOCK);\n dx.push(47, 1);\n dx.push(49, 1);\n dx.push(140, 1);\n dx.push(294, 1);\n dx.push(141, 0);\n dx.push(177, 0);\n dx.push(142, 1);\n dx.push(295, 0);\n dx.push(296, 0);\n dx.push(143, 3.75);\n dx.push(271, 0);\n dx.push(272, 9);\n dx.push(273, 9);\n }\n}\n","// Shared by DXF export and import (kept dependency-free so the lazy import\n// chunk doesn't pull in the writer library).\n\n/**\n * ANSI31 base: parallel lines at 45° spaced 3.175 mm at scale 1. Line-fill\n * hatches export as ANSI31 with angle = fill.angle − 45° and scale =\n * spacing / 3.175, which is exactly how AutoCAD renders them; the importer\n * inverts the same formula for any ANSI31 hatch.\n */\nexport const ANSI31_BASE_SPACING = 3.175;\nexport const ANSI31_BASE_ANGLE_DEG = 45;\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA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A;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAC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","names":["z","angle","len","angle","pattern","scale","perp","angle","z","z","z","z","z","normalizeName","pattern","normalizeName","pattern","z","angle","angle","z","z","a","z","textHeight","rest","rot","scale","z","add","dist","dot","len","norm","scale","sub","angle","spec","z","z","z","wrapWords","polar","interval","w","inner","i","RAD2DEG","textStyleFor","angle","scale"]}