@tsdraw/core 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +117 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +61 -19
- package/dist/index.d.ts +61 -19
- package/dist/index.js +113 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/utils/pathCodec.ts","../src/store/documentStore.ts","../src/store/stateNode.ts","../src/canvas/viewport.ts","../src/utils/colors.ts","../src/canvas/renderer.ts","../src/input/inputManager.ts","../src/tools/toolManager.ts","../src/tools/pen/states/PenIdleState.ts","../src/utils/vec.ts","../src/tools/pen/states/PenDrawingState.ts","../src/tools/square/states/SquareIdleState.ts","../src/tools/geometric/states/GeometricDrawingState.ts","../src/tools/geometric/geometricShapeHelpers.ts","../src/tools/square/states/SquareDrawingState.ts","../src/tools/circle/states/CircleIdleState.ts","../src/tools/circle/states/CircleDrawingState.ts","../src/tools/eraser/states/EraserIdleState.ts","../src/utils/geometry.ts","../src/tools/eraser/eraserHitTest.ts","../src/tools/eraser/states/EraserPointingState.ts","../src/tools/eraser/states/EraserErasingState.ts","../src/tools/select/states/SelectIdleState.ts","../src/tools/hand/states/HandIdleState.ts","../src/tools/hand/states/HandDraggingState.ts","../src/persistence/snapshots.ts","../src/editor/Editor.ts","../src/tools/select/selectHelpers.ts"],"names":["cloneValue","getShapeBounds"],"mappings":"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","file":"index.js","sourcesContent":["// Unique id assigned for each shape\nexport type ShapeId = string;\n\n// Point with optional pressure (z) for styluses\nexport interface Vec3 {\n x: number;\n y: number;\n z?: number;\n}\n\n// Segment of draw strokes can be free (curved) or straight\nexport type SegmentType = 'free' | 'straight';\n\nexport interface DrawSegment {\n type: SegmentType;\n path: string; // base64-encoded points for storage\n}\n\n// Available sizes for strokes\nexport type SizeStyle = 's' | 'm' | 'l' | 'xl';\n\n// Available dash styles for drawing\nexport type DashStyle = 'draw' | 'solid' | 'dashed' | 'dotted';\n\n// Fill styles used by shapes\nexport type FillStyle = 'none' | 'semi' | 'solid' | 'blank';\n\n// Color styles (css-compatible or by palette key)\nexport type ColorStyle = string;\n\n// A single draw shape (stroke)\nexport interface DrawShape {\n id: ShapeId;\n type: 'draw';\n x: number;\n y: number;\n props: {\n color: ColorStyle;\n dash: DashStyle;\n fill?: FillStyle;\n size: SizeStyle;\n scale: number;\n isPen: boolean;\n isComplete: boolean;\n segments: DrawSegment[];\n isClosed?: boolean;\n };\n}\n\nexport type Shape = DrawShape;\n\n// Page holds shapes and camera state\nexport interface PageState {\n id: string;\n shapes: Record<ShapeId, Shape>;\n erasingShapeIds: ShapeId[];\n}\n\n// Stroke sizes in px\nexport const STROKE_WIDTHS: Record<SizeStyle, number> = {\n s: 2,\n m: 3.5,\n l: 5,\n xl: 10,\n};\n\n// Default drag distance squared for segment-mode transitions\nexport const DRAG_DISTANCE_SQUARED = 36;\n\n// Default colors\nexport const DEFAULT_COLORS: Record<string, string> = {\n black: '#1d1d1d',\n grey: '#9fa8b2',\n 'light-violet': '#e085f4',\n violet: '#ae3ec9',\n blue: '#4465e9',\n 'light-blue': '#4ba1f1',\n yellow: '#f1ac4b',\n orange: '#e16919',\n green: '#099268',\n 'light-green': '#4cb05e',\n 'light-red': '#f87777',\n red: '#e03131',\n white: '#ffffff',\n};\n\n// Max points per single stroke before starting a new shape\nexport const MAX_POINTS_PER_SHAPE = 200;\n","import type { Vec3 } from '../types.js';\n\n// Encode points to base64 path (x,y,z alternating)\nexport function encodePoints(points: Vec3[]): string {\n const arr: number[] = [];\n for (const p of points) {\n arr.push(p.x, p.y, p.z ?? 0.5);\n }\n return btoa(JSON.stringify(arr));\n}\n\n// Decode path string to points in local shape space\nexport function decodePoints(path: string): Vec3[] {\n try {\n const arr = JSON.parse(atob(path)) as number[];\n const out: Vec3[] = [];\n for (let i = 0; i < arr.length; i += 3) {\n out.push({\n x: arr[i] ?? 0,\n y: arr[i + 1] ?? 0,\n z: arr[i + 2],\n });\n }\n return out;\n } catch {\n return [];\n }\n}\n\nexport function decodeFirstPoint(path: string): Vec3 | null {\n const pts = decodePoints(path);\n return pts.length > 0 ? pts[0]! : null;\n}\n\nexport function decodeLastPoint(path: string): Vec3 | null {\n const pts = decodePoints(path);\n return pts.length > 0 ? pts[pts.length - 1]! : null;\n}\n\n// Decode segments to flat list of page-space points to render\nexport function decodePathToPoints(\n segments: { path: string }[],\n ox: number,\n oy: number\n): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n for (const seg of segments) {\n const pts = decodePoints(seg.path);\n for (const p of pts) {\n out.push({ x: ox + p.x, y: oy + p.y });\n }\n }\n return out;\n}\n\n","import type { PageState, Shape, ShapeId } from '../types.js';\nimport { STROKE_WIDTHS } from '../types.js';\nimport { decodePathToPoints } from '../utils/pathCodec.js';\nimport type { DocumentStoreSnapshot } from '../persistence/snapshots.js';\n\ntype DocumentStoreListener = () => void;\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\n// In-memory document store for current page\nexport class DocumentStore {\n private state: PageState = {\n id: 'page-1',\n shapes: {},\n erasingShapeIds: [],\n };\n private order: ShapeId[] = [];\n private readonly listeners = new Set<DocumentStoreListener>();\n\n getPage(): PageState {\n return this.state;\n }\n\n getShape(id: ShapeId): Shape | undefined {\n return this.state.shapes[id];\n }\n\n // Shapes organised in sorted order (first at bottom)\n getCurrentPageShapesSorted(): Shape[] {\n const list = this.order.length > 0 ? this.order : Object.keys(this.state.shapes);\n return list\n .map((id) => this.state.shapes[id])\n .filter((s): s is Shape => s != null);\n }\n\n // Shapes in reverse order (topmost first) for hit-testing\n getCurrentPageRenderingShapesSorted(): Shape[] {\n return [...this.getCurrentPageShapesSorted()].reverse();\n }\n\n getErasingShapeIds(): ShapeId[] {\n return [...this.state.erasingShapeIds];\n }\n\n setErasingShapes(ids: ShapeId[]): void {\n this.state.erasingShapeIds = ids;\n this.emitChange();\n }\n\n createShape(shape: Shape): void {\n this.state.shapes[shape.id] = shape;\n this.order.push(shape.id);\n this.emitChange();\n }\n\n updateShape(id: ShapeId, partial: Partial<Shape>): void {\n const existing = this.state.shapes[id];\n if (!existing) return;\n this.state.shapes[id] = { ...existing, ...partial, id };\n this.emitChange();\n }\n\n deleteShapes(ids: ShapeId[]): void {\n for (const id of ids) {\n delete this.state.shapes[id];\n this.order = this.order.filter((i) => i !== id);\n }\n this.state.erasingShapeIds = this.state.erasingShapeIds.filter((i) => !ids.includes(i));\n this.emitChange();\n }\n\n getCurrentPageShapes(): Shape[] {\n return Object.values(this.state.shapes);\n }\n\n // Shape IDs whose bounds intersect the given box for eraser line-segment hit\n getShapeIdsInBounds(box: { minX: number; minY: number; maxX: number; maxY: number }): Set<ShapeId> {\n const ids = new Set<ShapeId>();\n for (const shape of this.getCurrentPageShapesSorted()) {\n const b = getShapeBounds(shape);\n if (\n b.maxX >= box.minX &&\n b.minX <= box.maxX &&\n b.maxY >= box.minY &&\n b.minY <= box.maxY\n ) {\n ids.add(shape.id);\n }\n }\n return ids;\n }\n\n getSnapshot(): DocumentStoreSnapshot {\n return {\n page: cloneValue(this.state),\n order: [...this.order],\n };\n }\n\n // Load snapshot into the document when loading a persistence snapshot (so on page reload)\n loadSnapshot(snapshot: DocumentStoreSnapshot): void {\n const pageState = cloneValue(snapshot.page);\n const normalizedOrder = [...snapshot.order].filter((shapeId) => pageState.shapes[shapeId] != null);\n const orderedSet = new Set(normalizedOrder);\n for (const shapeId of Object.keys(pageState.shapes)) {\n if (!orderedSet.has(shapeId)) {\n normalizedOrder.push(shapeId);\n }\n }\n this.state = {\n id: pageState.id,\n shapes: pageState.shapes,\n erasingShapeIds: pageState.erasingShapeIds.filter((shapeId) => pageState.shapes[shapeId] != null),\n };\n this.order = normalizedOrder;\n this.emitChange();\n }\n\n listen(listener: DocumentStoreListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emitChange(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n\nfunction getShapeBounds(shape: Shape): { minX: number; minY: number; maxX: number; maxY: number } {\n if (shape.type !== 'draw') {\n return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n }\n const pts = decodePathToPoints(shape.props.segments, shape.x, shape.y);\n if (pts.length === 0) return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n let minX = pts[0]!.x;\n let minY = pts[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (const p of pts) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n const stroke = STROKE_WIDTHS[shape.props.size] * shape.props.scale;\n return { minX: minX - stroke, minY: minY - stroke, maxX: maxX + stroke, maxY: maxY + stroke };\n}\n","import type { IEditor } from '../editor/editorTypes.js';\nimport type { Vec3 } from '../types.js';\n\n// Types for tool state events\nexport interface ToolPointerDownInfo {\n point: Vec3;\n}\n\nexport interface ToolPointerMoveInfo {\n screenDeltaX?: number;\n screenDeltaY?: number;\n}\n\nexport interface ToolKeyInfo {\n key: string;\n}\n\nexport type ToolStateTransitionInfo = | ToolPointerDownInfo | ToolPointerMoveInfo | ToolKeyInfo;\n\nexport interface ToolStateContext {\n transition(stateId: string, info?: ToolStateTransitionInfo): void;\n}\n\nexport interface StateNodeConstructor {\n id: string;\n new (ctx: ToolStateContext, editor: IEditor): StateNode;\n}\n\n// State node in the tool state machine\nexport abstract class StateNode {\n static id: string = 'base';\n\n constructor(\n protected ctx: ToolStateContext,\n protected editor: IEditor\n ) {}\n\n onEnter(_info?: ToolStateTransitionInfo): void {}\n onExit(_info?: ToolStateTransitionInfo, _to?: string): void {}\n onPointerDown(_info?: ToolPointerDownInfo): void {}\n onPointerMove(_info?: ToolPointerMoveInfo): void {}\n onPointerUp(): void {}\n onKeyDown(_info?: ToolKeyInfo): void {}\n onKeyUp(_info?: ToolKeyInfo): void {}\n onCancel(): void {}\n onInterrupt(): void {}\n}\n","// Viewport: pan (x,y) and zoom\nexport interface Viewport {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport function createViewport(): Viewport {\n return { x: 0, y: 0, zoom: 1 };\n}\n\n// Screen point to page point\nexport function screenToPage(viewport: Viewport, screenX: number, screenY: number): { x: number; y: number } {\n return {\n x: (screenX - viewport.x) / viewport.zoom,\n y: (screenY - viewport.y) / viewport.zoom,\n };\n}\n\n// Page point to screen point\nexport function pageToScreen(viewport: Viewport, pageX: number, pageY: number): { x: number; y: number } {\n return {\n x: pageX * viewport.zoom + viewport.x,\n y: pageY * viewport.zoom + viewport.y,\n };\n}\n\nexport function setViewport(\n viewport: Viewport,\n updater: { x?: number; y?: number; zoom?: number }\n): Viewport {\n return {\n x: updater.x ?? viewport.x,\n y: updater.y ?? viewport.y,\n zoom: updater.zoom ?? viewport.zoom,\n };\n}\n\nexport function panViewport(viewport: Viewport, dx: number, dy: number): Viewport {\n return { ...viewport, x: viewport.x + dx, y: viewport.y + dy };\n}\n\nexport function zoomViewport(viewport: Viewport, factor: number, centerX?: number, centerY?: number): Viewport {\n const zoom = Math.max(0.1, Math.min(4, viewport.zoom * factor));\n if (centerX == null || centerY == null) {\n return { ...viewport, zoom };\n }\n const pageBefore = screenToPage(viewport, centerX, centerY);\n const x = centerX - pageBefore.x * zoom;\n const y = centerY - pageBefore.y * zoom;\n return { x, y, zoom };\n}\n","import { DEFAULT_COLORS } from '../types.js';\n\nexport type TsdrawRenderTheme = 'light' | 'dark';\n\nconst DARK_COLORS: Record<string, string> = {\n black: '#f0f0f0',\n grey: '#aeb8c2',\n 'light-violet': '#cf6ef5',\n violet: '#a83ce0',\n blue: '#5b7dff',\n 'light-blue': '#4fb3ff',\n yellow: '#f4b13a',\n orange: '#ef7a24',\n green: '#1fb27a',\n 'light-green': '#4ecb66',\n 'light-red': '#ff6f78',\n red: '#f24343',\n white: '#ffffff',\n};\n\nexport function resolveThemeColor(colorStyle: string, theme: TsdrawRenderTheme): string {\n const lightThemeColor = DEFAULT_COLORS[colorStyle];\n if (!lightThemeColor) return colorStyle;\n if (theme === 'light') return lightThemeColor;\n return DARK_COLORS[colorStyle] ?? lightThemeColor;\n}\n","import type { Viewport } from './viewport.js';\nimport type { Shape, DrawShape, FillStyle } from '../types.js';\nimport { STROKE_WIDTHS } from '../types.js';\nimport { decodePoints } from '../utils/pathCodec.js';\nimport { resolveThemeColor, type TsdrawRenderTheme } from '../utils/colors.js';\nimport { getStroke } from 'perfect-freehand';\n\n// Renderer interface: renders shapes given 2d canvas context and viewport\nexport interface ICanvasRenderer {\n render(ctx: CanvasRenderingContext2D, viewport: Viewport, shapes: Shape[]): void;\n}\n\n// Default canvas renderer: draws shapes using (optionally) pressure-based width for ipads and whatnot\nexport class CanvasRenderer implements ICanvasRenderer {\n private theme: TsdrawRenderTheme = 'light';\n\n setTheme(theme: TsdrawRenderTheme): void {\n this.theme = theme;\n }\n\n render(ctx: CanvasRenderingContext2D, viewport: Viewport, shapes: Shape[]): void {\n ctx.save();\n ctx.translate(viewport.x, viewport.y);\n ctx.scale(viewport.zoom, viewport.zoom);\n for (const shape of shapes) {\n if (shape.type === 'draw') {\n this.paintStroke(ctx, shape);\n }\n }\n ctx.restore();\n }\n\n // Paints a single stroke\n private paintStroke(ctx: CanvasRenderingContext2D, shape: DrawShape): void {\n const width = (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n const samples = flattenSegments(shape);\n if (samples.length === 0) return;\n const color = resolveThemeColor(shape.props.color, this.theme);\n const fillStyle = shape.props.fill ?? 'none';\n\n if (shape.props.isClosed && fillStyle !== 'none') {\n this.paintClosedShapeFill(ctx, samples, color, fillStyle);\n }\n\n if (shape.props.dash !== 'draw') {\n this.paintDashedStroke(ctx, samples, width, color, shape.props.dash);\n return;\n }\n\n const config = strokeConfig(shape, width);\n const outline = getStroke(\n samples.map((p) => [p.x, p.y, p.pressure] as [number, number, number]),\n config\n );\n if (outline.length === 0) return;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n const first = outline[0];\n if (!first) return;\n ctx.moveTo(first[0], first[1]);\n for (let i = 1; i < outline.length; i++) {\n const p = outline[i];\n if (p) ctx.lineTo(p[0], p[1]);\n }\n ctx.closePath();\n ctx.fill();\n }\n\n private paintDashedStroke(\n ctx: CanvasRenderingContext2D,\n samples: Array<{ x: number; y: number }>,\n width: number,\n color: string,\n dash: DrawShape['props']['dash']\n ): void {\n if (samples.length === 1) {\n const p = samples[0]!;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(p.x, p.y, width / 2, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = width;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.setLineDash(getLineDash(dash, width));\n ctx.beginPath();\n ctx.moveTo(samples[0]!.x, samples[0]!.y);\n for (let i = 1; i < samples.length; i++) {\n const p = samples[i]!;\n ctx.lineTo(p.x, p.y);\n }\n ctx.stroke();\n ctx.restore();\n }\n\n // Closed shapes are shapes where their start and end point are the same\n private paintClosedShapeFill(\n ctx: CanvasRenderingContext2D,\n samples: Array<{ x: number; y: number }>,\n color: string,\n fillStyle: FillStyle\n ): void {\n if (samples.length < 3) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(samples[0]!.x, samples[0]!.y);\n for (let i = 1; i < samples.length; i++) {\n const sample = samples[i]!;\n ctx.lineTo(sample.x, sample.y);\n }\n ctx.closePath();\n\n if (fillStyle === 'solid') {\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.55;\n } else if (fillStyle === 'none') {\n ctx.fillStyle = this.theme === 'dark' ? '#0f0f0f' : '#fafafa';\n ctx.globalAlpha = 1;\n } else {\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.28;\n }\n\n ctx.fill();\n ctx.restore();\n }\n}\n\nconst PRESSURE_FLOOR = 0.025;\nconst STYLUS_CURVE = (t: number) => t * 0.65 + Math.sin((t * Math.PI) / 2) * 0.35;\nconst sineOut = (t: number) => Math.sin((t * Math.PI) / 2);\nconst cubicInOut = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\nfunction remap(\n value: number,\n inRange: [number, number],\n outRange: [number, number],\n clamp = false\n) {\n const [lo, hi] = inRange;\n const [outLo, outHi] = outRange;\n const t = (value - lo) / (hi - lo);\n const clamped = clamp ? Math.max(0, Math.min(1, t)) : t;\n return outLo + (outHi - outLo) * clamped;\n}\n\nfunction strokeConfig(shape: DrawShape, width: number) {\n const done = shape.props.isComplete || shape.props.isClosed === true;\n if (shape.props.isPen) {\n return {\n size: 1 + width * 1.2,\n thinning: 0.62,\n streamline: 0.62,\n smoothing: 0.62,\n simulatePressure: false,\n easing: STYLUS_CURVE,\n last: done,\n };\n }\n return {\n size: width,\n thinning: 0.5,\n streamline: remap(width, [9, 16], [0.64, 0.74], true),\n smoothing: 0.62,\n simulatePressure: true,\n easing: sineOut,\n last: done,\n };\n}\n\nfunction flattenSegments(shape: DrawShape) {\n const out: { x: number; y: number; pressure: number }[] = [];\n for (const seg of shape.props.segments) {\n const decoded = decodePoints(seg.path).map((p) => ({\n x: p.x + shape.x,\n y: p.y + shape.y,\n pressure: Math.max(PRESSURE_FLOOR, p.z ?? 0.5),\n }));\n\n if (seg.type === 'free' || decoded.length < 2) {\n out.push(...decoded);\n continue;\n }\n\n const A = decoded[0]!;\n const D = decoded[1]!;\n const len = Math.hypot(D.x - A.x, D.y - A.y);\n if (len === 0) {\n out.push(A);\n continue;\n }\n\n const ux = (D.x - A.x) / len;\n const uy = (D.y - A.y) / len;\n const nudge = Math.min(1, Math.floor(len / 4));\n const B = { x: A.x + ux * nudge, y: A.y + uy * nudge, pressure: A.pressure };\n const C = { x: D.x - ux * nudge, y: D.y - uy * nudge, pressure: D.pressure };\n const count = Math.max(4, Math.floor(len / 16));\n out.push(A);\n for (let i = 1; i <= count; i++) {\n const t = i / (count + 1);\n const e = cubicInOut(t);\n out.push({\n x: B.x + (C.x - B.x) * e,\n y: B.y + (C.y - B.y) * e,\n pressure: B.pressure + (C.pressure - B.pressure) * e,\n });\n }\n out.push(D);\n }\n\n return out;\n}\n\nfunction getLineDash(dash: DrawShape['props']['dash'], width: number): number[] {\n switch (dash) {\n case 'dashed': return [width * 2, width * 2];\n case 'dotted': return [Math.max(1, width * 0.25), width * 2];\n case 'solid':\n case 'draw':\n default:\n return [];\n }\n}\n","import type { Vec3 } from '../types.js';\n\n// Normalized pointer input (page space, with pressure)\nexport interface PointerInput {\n currentPagePoint: Vec3;\n originPagePoint: Vec3;\n previousPagePoint: Vec3;\n isPen: boolean;\n shiftKey: boolean;\n ctrlKey: boolean;\n isDragging: boolean;\n}\n\n// Input manager: captures pointer events and gives page-space coords + modifiers\nexport class InputManager {\n private _current: Vec3 = { x: 0, y: 0 };\n private _origin: Vec3 = { x: 0, y: 0 }; // Where pointer_down occured\n private _previous: Vec3 = { x: 0, y: 0 }; // Where pointer was before most recent update\n private _isPen = false; // Whether input is from a stylus\n private _shiftKey = false; // Whether shift is pressed\n private _ctrlKey = false; // Whether ctrl is pressed\n private _metaKey = false; // Whether meta is pressed\n private _isDragging = false; // Whether pointer is dragging\n\n getCurrentPagePoint(): Vec3 { return { ...this._current }; }\n getOriginPagePoint(): Vec3 { return { ...this._origin }; }\n getPreviousPagePoint(): Vec3 { return { ...this._previous }; }\n\n getIsPen(): boolean { return this._isPen; }\n\n getShiftKey(): boolean { return this._shiftKey; }\n getCtrlKey(): boolean { return this._ctrlKey; }\n getAccelKey(): boolean { return this._ctrlKey || this._metaKey; }\n\n getIsDragging(): boolean { return this._isDragging; }\n\n pointerDown(pageX: number, pageY: number, pressure?: number, isPen?: boolean): void {\n this._origin = { x: pageX, y: pageY, z: pressure ?? 0.5 };\n this._current = { ...this._origin };\n this._previous = { ...this._origin };\n this._isDragging = false;\n if (isPen !== undefined) this._isPen = isPen;\n }\n\n pointerMove(pageX: number, pageY: number, pressure?: number, isPen?: boolean): void {\n this._previous = { ...this._current };\n this._current = { x: pageX, y: pageY, z: pressure ?? this._current.z ?? 0.5 };\n this._isPen = isPen ?? this._isPen;\n if (this._origin.x !== this._current.x || this._origin.y !== this._current.y) {\n this._isDragging = true;\n }\n }\n\n pointerUp(): void {\n // Keep current. caller can reset if needed\n }\n\n setModifiers(shift: boolean, ctrl: boolean, meta?: boolean): void {\n this._shiftKey = shift;\n this._ctrlKey = ctrl;\n this._metaKey = meta ?? ctrl;\n }\n\n getInputs(): PointerInput {\n return {\n currentPagePoint: this.getCurrentPagePoint(),\n originPagePoint: this.getOriginPagePoint(),\n previousPagePoint: this.getPreviousPagePoint(),\n isPen: this._isPen,\n shiftKey: this._shiftKey,\n ctrlKey: this._ctrlKey,\n isDragging: this._isDragging,\n };\n }\n}\n","import type {\n StateNode,\n StateNodeConstructor,\n ToolKeyInfo,\n ToolPointerDownInfo,\n ToolPointerMoveInfo,\n ToolStateTransitionInfo,\n} from '../store/stateNode.js';\n\nexport type DefaultToolId = 'pen' | 'eraser' | 'select' | 'hand' | 'square' | 'circle';\n// lets devs pass arbitrary tool IDs while still getting autocomplete for defaults\nexport type ToolId = DefaultToolId | (string & {});\n\nexport interface ToolDefinition {\n id: ToolId;\n initialStateId: string;\n stateConstructors: StateNodeConstructor[];\n}\n\n// Manages current tool and routes pointer/key events to active state node\n// Each tool is a named entry point into a shared state pool. Calling setCurrentTool(\"pen\") exits current state and enters pen's initial state.\nexport class ToolManager {\n private currentToolId: ToolId = 'pen';\n private currentState: StateNode | null = null;\n private states: Map<string, StateNode> = new Map();\n private toolInitialStateIds: Map<ToolId, string> = new Map();\n\n registerState(state: StateNode): void {\n const ctor = state.constructor as StateNodeConstructor;\n if (this.states.has(ctor.id)) {\n throw new Error(`Tool state '${ctor.id}' is already registered.`);\n }\n this.states.set(ctor.id, state);\n }\n\n registerTool(id: ToolId, initialStateId: string): void {\n if (this.toolInitialStateIds.has(id)) {\n throw new Error(`Tool '${id}' is already registered.`);\n }\n this.toolInitialStateIds.set(id, initialStateId);\n }\n\n hasTool(id: ToolId): boolean {\n return this.toolInitialStateIds.has(id);\n }\n\n setCurrentTool(id: ToolId): void {\n const initialStateId = this.toolInitialStateIds.get(id);\n if (!initialStateId) return;\n const nextState = this.states.get(initialStateId);\n if (!nextState) return;\n\n this.currentState?.onExit?.(undefined, initialStateId);\n this.currentToolId = id;\n this.currentState = nextState;\n this.currentState.onEnter?.();\n }\n\n getCurrentToolId(): ToolId {\n return this.currentToolId;\n }\n\n getCurrentState(): StateNode | null {\n return this.currentState;\n }\n\n // Transition between states within the same tool (ex. pen_idle -> pen_drawing)\n transition(stateId: string, info?: ToolStateTransitionInfo): void {\n const next = this.states.get(stateId);\n if (!next) return;\n this.currentState?.onExit?.(undefined, stateId);\n this.currentState = next;\n this.currentState.onEnter?.(info);\n }\n\n pointerDown(info: ToolPointerDownInfo): void { this.currentState?.onPointerDown?.(info); }\n pointerMove(info: ToolPointerMoveInfo): void { this.currentState?.onPointerMove?.(info); }\n pointerUp(): void { this.currentState?.onPointerUp?.(); }\n\n keyDown(info: ToolKeyInfo): void { this.currentState?.onKeyDown?.(info); }\n keyUp(info: ToolKeyInfo): void { this.currentState?.onKeyUp?.(info); }\n\n cancel(): void { this.currentState?.onCancel?.(); }\n interrupt(): void { this.currentState?.onInterrupt?.(); }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class PenIdleState extends StateNode {\n static override id = 'pen_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('pen_drawing', info);\n }\n}","import type { Vec3 } from '../types.js';\n\nexport function dist(a: Vec3, b: Vec3): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function sqDist(a: Vec3, b: Vec3): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n}\n\nexport function withinRadius(a: Vec3, b: Vec3, r: number): boolean {\n return dist(a, b) <= r;\n}\n\nexport function toFixed(n: number, digits = 2): number {\n return Number(Number.prototype.toFixed.call(n, digits));\n}\n\nexport function roundPt(p: Vec3): Vec3 {\n return { x: toFixed(p.x), y: toFixed(p.y), z: p.z != null ? toFixed(p.z) : undefined };\n}\n\n// Calculate bwtween two interpolated points\nexport function lerpPath(from: Vec3, to: Vec3, steps: number): Vec3[] {\n if (steps <= 0) return [{ x: toFixed(from.x), y: toFixed(from.y), z: from.z }];\n const result: Vec3[] = [];\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n result.push({\n x: toFixed(from.x + (to.x - from.x) * t),\n y: toFixed(from.y + (to.y - from.y) * t),\n z: from.z != null && to.z != null ? toFixed(from.z + (to.z - from.z) * t) : to.z ?? from.z,\n });\n }\n return result;\n}\n\n// Snap angle to the nearest division\nexport function quantizeAngle(rad: number, divisions: number): number {\n const step = (Math.PI * 2) / divisions;\n return Math.round(rad / step) * step;\n}\n\n// Rotate point around an origin\nexport function rotateAround(pt: Vec3, origin: Vec3, angle: number): Vec3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const rx = pt.x - origin.x;\n const ry = pt.y - origin.y;\n return {\n x: origin.x + rx * c - ry * s,\n y: origin.y + rx * s + ry * c,\n z: pt.z,\n };\n}\n\nexport function tail<T>(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n","import {\n StateNode,\n type ToolKeyInfo,\n type ToolPointerDownInfo,\n} from '../../../store/stateNode.js';\nimport type { DrawShape, DrawSegment, Vec3 } from '../../../types.js';\nimport { STROKE_WIDTHS, MAX_POINTS_PER_SHAPE } from '../../../types.js';\nimport { encodePoints, decodePoints, decodeFirstPoint, decodeLastPoint } from '../../../utils/pathCodec.js';\nimport { dist, sqDist, withinRadius, toFixed, roundPt, lerpPath, tail, quantizeAngle, rotateAround } from '../../../utils/vec.js';\n\ntype StrokePhase = 'free' | 'straight' | 'starting_straight' | 'starting_free';\n\n// State for when pen is being used\nexport class PenDrawingState extends StateNode {\n static override id = 'pen_drawing';\n\n private _startInfo: ToolPointerDownInfo = { point: { x: 0, y: 0, z: 0.5 } };\n private _target: DrawShape | undefined;\n private _isPenDevice = false;\n private _hasPressure = false;\n private _phase: StrokePhase = 'free';\n private _extending = false;\n private _anchor: Vec3 = { x: 0, y: 0 };\n private _pendingAnchor: Vec3 | null = null;\n private _lastSample: Vec3 = { x: 0, y: 0 };\n private _shouldMerge = false;\n private _pathLen = 0;\n private _activePts: Vec3[] = [];\n\n override onEnter(info?: ToolPointerDownInfo): void {\n this._startInfo = info ?? { point: { x: 0, y: 0, z: 0.5 } };\n this._lastSample = { ...this.editor.input.getCurrentPagePoint() };\n this.beginStroke();\n }\n\n override onPointerMove(): void {\n const inputs = this.editor.input;\n const penActive = inputs.getIsPen();\n if (this._isPenDevice && !penActive) {\n this.beginStroke();\n return;\n }\n if (this._hasPressure) {\n const cur = inputs.getCurrentPagePoint();\n const threshold = 1 / this.editor.getZoomLevel();\n if (dist(cur, this._lastSample) >= threshold) {\n this._lastSample = { ...cur };\n this._shouldMerge = false;\n } else {\n this._shouldMerge = true;\n }\n } else {\n this._shouldMerge = false;\n }\n this.advanceStroke();\n }\n\n // Shift: start a new straight segment\n // Maybe add a specific key for snapping or turning drawing into a proper shape?\n\n override onKeyDown(info?: ToolKeyInfo): void {\n if (info?.key === 'Shift') {\n switch (this._phase) {\n case 'free':\n this._phase = 'starting_straight';\n this._pendingAnchor = { ...this.editor.input.getCurrentPagePoint() };\n break;\n case 'starting_free':\n this._phase = 'starting_straight';\n break;\n }\n }\n this.advanceStroke();\n }\n\n override onKeyUp(info?: ToolKeyInfo): void {\n if (info?.key === 'Shift') {\n switch (this._phase) {\n case 'straight':\n this._phase = 'starting_free';\n this._pendingAnchor = { ...this.editor.input.getCurrentPagePoint() };\n break;\n case 'starting_straight':\n this._pendingAnchor = null;\n this._phase = 'free';\n break;\n }\n }\n this.advanceStroke();\n }\n\n override onPointerUp(): void {\n this.endStroke();\n }\n\n override onCancel(): void {\n this.ctx.transition('pen_idle', this._startInfo);\n }\n\n override onInterrupt(): void {\n if (!this.editor.input.getIsDragging()) {\n this.ctx.transition('pen_idle', this._startInfo);\n }\n }\n\n private canClosePath(): boolean {\n return true;\n }\n\n private detectClosure(\n segments: DrawSegment[],\n size: DrawShape['props']['size'],\n scale: number\n ): boolean {\n if (!this.canClosePath() || segments.length === 0) return false;\n const w = STROKE_WIDTHS[size];\n const first = decodeFirstPoint(segments[0]!.path);\n const lastSeg = segments[segments.length - 1];\n const end = decodeLastPoint(lastSeg!.path);\n if (!first || !end) return false;\n if (first.x === end.x && first.y === end.y) return false;\n if (this._pathLen <= w * 4 * scale) return false;\n return withinRadius(first, end, w * 2 * scale);\n }\n\n private measurePath(segments: DrawSegment[]): number {\n let sum = 0;\n for (const seg of segments) {\n const pts = decodePoints(seg.path);\n for (let i = 0; i < pts.length - 1; i++) {\n sum += sqDist(pts[i]!, pts[i + 1]!);\n }\n }\n return Math.sqrt(sum);\n }\n\n // Start a new shape, when user starts a stroke\n private beginStroke(): void {\n const inputs = this.editor.input;\n const origin = inputs.getOriginPagePoint();\n const penActive = inputs.getIsPen();\n const z = this._startInfo?.point?.z ?? 0.5;\n this._isPenDevice = penActive;\n this._hasPressure = penActive || z !== 0.5;\n const pressure = this._hasPressure ? toFixed(z * 1.25) : 0.5;\n this._phase = inputs.getShiftKey() ? 'straight' : 'free';\n this._extending = false;\n this._lastSample = { ...origin };\n\n const sorted = this.editor.store.getCurrentPageShapesSorted();\n const prev = tail(sorted) as DrawShape | undefined;\n const existing = prev?.type === 'draw' ? prev : undefined;\n this._target = existing;\n\n if (existing && this._phase === 'straight') {\n const prevSeg = tail(existing.props.segments);\n if (!prevSeg) { this.spawnShape(origin, pressure); return; }\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) { this.spawnShape(origin, pressure); return; }\n this._extending = true;\n const local = this.editor.getPointInShapeSpace(existing, origin);\n const localPt: Vec3 = { x: toFixed(local.x), y: toFixed(local.y), z: pressure };\n const newSeg: DrawSegment = {\n type: 'straight',\n path: encodePoints([\n { x: prevEnd.x, y: prevEnd.y, z: pressure },\n localPt,\n ]),\n };\n this._anchor = {\n x: existing.x + prevEnd.x,\n y: existing.y + prevEnd.y,\n };\n this._pendingAnchor = null;\n const segs = [...existing.props.segments, newSeg];\n this._pathLen = this.measurePath(segs);\n this.editor.updateShapes([\n {\n id: existing.id,\n type: 'draw',\n props: {\n segments: segs,\n isClosed: this.detectClosure(segs, existing.props.size, existing.props.scale),\n },\n },\n ]);\n return;\n }\n\n this.spawnShape(origin, pressure);\n }\n\n // Create a new shape, when we need a new drawing shape \n private spawnShape(originPt: Vec3, pressure: number): void {\n this._anchor = { ...originPt };\n const drawStyle = this.editor.getCurrentDrawStyle();\n const id = this.editor.createShapeId();\n const firstPt: Vec3 = { x: 0, y: 0, z: pressure };\n this._activePts = [firstPt];\n this.editor.createShape({\n id,\n type: 'draw',\n x: originPt.x,\n y: originPt.y,\n props: {\n color: drawStyle.color,\n dash: drawStyle.dash,\n size: drawStyle.size,\n scale: 1,\n isPen: this._hasPressure,\n isComplete: false,\n segments: [\n {\n type: this._phase === 'straight' ? 'straight' : 'free',\n path: encodePoints([firstPt]),\n },\n ],\n },\n });\n const shape = this.editor.getShape(id) as DrawShape | undefined;\n if (!shape) {\n this.ctx.transition('pen_idle', this._startInfo);\n return;\n }\n this._pathLen = 0;\n this._target = shape;\n }\n\n // Update the drawing shape, while user is drawing\n private advanceStroke(): void {\n const target = this._target;\n const inputs = this.editor.input;\n if (!target) return;\n\n const shape = this.editor.getShape(target.id) as DrawShape | undefined;\n if (!shape) return;\n\n const { id, props: { size, scale } } = target;\n const { segments } = shape.props;\n const curPt = inputs.getCurrentPagePoint();\n\n if (!this._hasPressure) {\n const liveZ = curPt.z ?? 0.5;\n if ((liveZ > 0 && liveZ !== 0.5) || inputs.getIsPen()) {\n this._hasPressure = true;\n }\n }\n\n const local = this.editor.getPointInShapeSpace(shape, curPt);\n const pressure = this._hasPressure\n ? toFixed((curPt.z ?? 0.5) * 1.25)\n : 0.5;\n const pt: Vec3 = { x: toFixed(local.x), y: toFixed(local.y), z: pressure };\n\n // Straight: straight lines, eg. holding shift\n // Free: smooth drawings so drawings doesnt look geometrical\n\n switch (this._phase) {\n case 'starting_straight': {\n const pending = this._pendingAnchor;\n if (!pending) break;\n if (sqDist(pending, inputs.getCurrentPagePoint()) <= this.editor.options.dragDistanceSquared) break;\n this._anchor = { ...pending };\n this._pendingAnchor = null;\n this._phase = 'straight';\n const prevSeg = tail(segments);\n if (!prevSeg) break;\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) break;\n const anchorLocal = this.editor.getPointInShapeSpace(shape, this._anchor);\n const anchorPt = roundPt(anchorLocal);\n const seg: DrawSegment = {\n type: 'straight',\n path: encodePoints([prevEnd, { ...anchorPt, z: pressure }]),\n };\n const withStraightSeg = [...segments, seg];\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: withStraightSeg,\n isClosed: this.detectClosure(withStraightSeg, size, scale),\n },\n },\n ]);\n break;\n }\n case 'starting_free': {\n const pending = this._pendingAnchor;\n if (!pending) break;\n if (sqDist(pending, inputs.getCurrentPagePoint()) <= this.editor.options.dragDistanceSquared) break;\n this._anchor = { ...pending };\n this._pendingAnchor = null;\n this._phase = 'free';\n const prevSeg = tail(segments);\n if (!prevSeg) break;\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) break;\n const interpolated = lerpPath(prevEnd, pt, 6);\n this._activePts = interpolated;\n const freeSeg: DrawSegment = {\n type: 'free',\n path: encodePoints(interpolated),\n };\n const allSegs = [...segments, freeSeg];\n this._pathLen = this.measurePath(allSegs);\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: allSegs,\n isClosed: this.detectClosure(allSegs, size, scale),\n },\n },\n ]);\n break;\n }\n case 'straight': {\n const updated = segments.slice();\n const lastSeg = updated[updated.length - 1];\n if (!lastSeg) break;\n const anchorPage = this._anchor;\n const current = inputs.getCurrentPagePoint();\n const shouldSnap = !this._extending || inputs.getIsDragging();\n if (this._extending && inputs.getIsDragging()) {\n this._extending = false;\n }\n let pagePt: Vec3;\n if (shouldSnap) {\n const angle = Math.atan2(\n current.y - anchorPage.y,\n current.x - anchorPage.x\n );\n const snapped = quantizeAngle(angle, 24);\n const diff = snapped - angle;\n pagePt = rotateAround(current, anchorPage, diff);\n } else {\n pagePt = { ...current };\n }\n const localPt = this.editor.getPointInShapeSpace(shape, pagePt);\n const fixedPt = roundPt(localPt);\n const segStart = decodeFirstPoint(lastSeg.path);\n if (segStart) {\n this._pathLen += dist(segStart, fixedPt);\n }\n updated[updated.length - 1] = {\n ...lastSeg,\n type: 'straight',\n path: encodePoints([segStart ?? fixedPt, { ...fixedPt, z: pressure }]),\n };\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: updated,\n isClosed: this.detectClosure(updated, size, scale),\n },\n },\n ]);\n break;\n }\n case 'free': {\n const cached = this._activePts;\n if (cached.length && this._shouldMerge) {\n const last = cached[cached.length - 1]!;\n last.x = pt.x;\n last.y = pt.y;\n last.z = last.z != null ? Math.max(last.z, pt.z ?? 0) : pt.z;\n } else {\n this._pathLen += cached.length\n ? dist(cached[cached.length - 1]!, pt)\n : 0;\n cached.push({ x: pt.x, y: pt.y, z: pt.z });\n }\n const updated = segments.slice();\n const lastSeg = updated[updated.length - 1]!;\n updated[updated.length - 1] = {\n ...lastSeg,\n path: encodePoints(cached),\n };\n if (this._pathLen < STROKE_WIDTHS[shape.props.size] * 4) {\n this._pathLen = this.measurePath(updated);\n }\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: updated,\n isClosed: this.detectClosure(updated, size, scale),\n },\n },\n ]);\n if (cached.length > MAX_POINTS_PER_SHAPE) {\n this.editor.updateShapes([{ id, type: 'draw', props: { isComplete: true } }]);\n const newId = this.editor.createShapeId();\n const curPage = inputs.getCurrentPagePoint();\n const firstPt: Vec3 = {\n x: 0,\n y: 0,\n z: this._hasPressure ? toFixed((curPage.z ?? 0.5) * 1.25) : 0.5,\n };\n this._activePts = [firstPt];\n this.editor.createShape({\n id: newId,\n type: 'draw',\n x: curPage.x,\n y: curPage.y,\n props: {\n color: shape.props.color,\n dash: shape.props.dash,\n size: shape.props.size,\n scale: shape.props.scale,\n isPen: this._hasPressure,\n isComplete: false,\n segments: [{ type: 'free', path: encodePoints([firstPt]) }],\n },\n });\n const created = this.editor.getShape(newId) as DrawShape | undefined;\n if (created) {\n this._target = created;\n this._lastSample = { ...curPage };\n this._pathLen = 0;\n }\n }\n break;\n }\n }\n }\n\n private endStroke(): void {\n if (!this._target) return;\n this.editor.updateShapes([\n { id: this._target.id, type: 'draw', props: { isComplete: true, isPen: this._hasPressure } },\n ]);\n this.ctx.transition('pen_idle');\n }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class SquareIdleState extends StateNode {\n static override id = 'square_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('square_drawing', info);\n }\n}","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\nimport type { DrawSegment, DrawShape, ShapeId } from '../../../types.js';\nimport type { ShapeBounds } from '../geometricShapeHelpers.js';\n\ninterface GeometricDrawingStateConfig {\n idleStateId: string;\n buildConstrainedBounds: (\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n ) => ShapeBounds;\n buildUnconstrainedBounds: (\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n ) => ShapeBounds;\n buildSegments: (width: number, height: number) => DrawSegment[];\n}\n\n// Abstract base for geometric shape drawing states\n// Subclasses just provide a config with bound-builders and segment-builders\n// All pointer tracking, shape creation, and completion logic is here\nexport abstract class GeometricDrawingState extends StateNode {\n private currentShapeId: ShapeId | null = null;\n private startedAt: ToolPointerDownInfo = { point: { x: 0, y: 0, z: 0.5 } };\n\n protected abstract getConfig(): GeometricDrawingStateConfig;\n\n override onEnter(info?: ToolPointerDownInfo): void {\n this.startedAt = info ?? { point: { x: 0, y: 0, z: 0.5 } };\n const originPoint = this.editor.input.getOriginPagePoint();\n const drawStyle = this.editor.getCurrentDrawStyle();\n const nextShapeId = this.editor.createShapeId();\n const config = this.getConfig();\n\n this.editor.createShape({\n id: nextShapeId,\n type: 'draw',\n x: originPoint.x,\n y: originPoint.y,\n props: {\n color: drawStyle.color,\n dash: drawStyle.dash,\n fill: drawStyle.fill,\n size: drawStyle.size,\n scale: 1,\n isPen: false,\n isComplete: false,\n isClosed: true,\n segments: config.buildSegments(1, 1),\n },\n });\n\n this.currentShapeId = nextShapeId;\n }\n\n // Shift key switches between constrained and unconstrained bounds\n override onPointerMove(): void {\n const activeShape = this.getActiveShape();\n if (!activeShape) return;\n const config = this.getConfig();\n const originPoint = this.editor.input.getOriginPagePoint();\n const cursorPoint = this.editor.input.getCurrentPagePoint();\n const shapeBounds = this.editor.input.getShiftKey()\n ? config.buildConstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y)\n : config.buildUnconstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y);\n\n this.editor.store.updateShape(activeShape.id, {\n x: shapeBounds.x,\n y: shapeBounds.y,\n props: {\n ...activeShape.props,\n segments: config.buildSegments(shapeBounds.width, shapeBounds.height),\n isClosed: true,\n },\n });\n }\n\n override onPointerUp(): void {\n this.completeShape();\n }\n\n override onCancel(): void {\n this.removeCurrentShape();\n this.ctx.transition(this.getConfig().idleStateId, this.startedAt);\n }\n\n override onInterrupt(): void {\n this.completeShape();\n }\n\n override onKeyDown(): void {\n this.onPointerMove();\n }\n\n override onKeyUp(): void {\n this.onPointerMove();\n }\n\n // If user dragged, use the drag extents for the final shape\n // If they just clicked without dragging, use default-sized shape\n // If they dragged just a bit (most likely a click), remove the shape and go back to idle\n private completeShape(): void {\n const activeShape = this.getActiveShape();\n const config = this.getConfig();\n if (!activeShape) {\n this.ctx.transition(config.idleStateId, this.startedAt);\n return;\n }\n\n const originPoint = this.editor.input.getOriginPagePoint();\n const cursorPoint = this.editor.input.getCurrentPagePoint();\n const dx = cursorPoint.x - originPoint.x;\n const dy = cursorPoint.y - originPoint.y;\n const draggedFarEnough = (dx * dx + dy * dy) > this.editor.options.dragDistanceSquared;\n\n if (!draggedFarEnough) {\n this.removeCurrentShape();\n this.ctx.transition(config.idleStateId, this.startedAt);\n return;\n }\n const finalizedBounds = this.editor.input.getShiftKey()\n ? config.buildConstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y)\n : config.buildUnconstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y);\n\n this.editor.store.updateShape(activeShape.id, {\n x: finalizedBounds.x,\n y: finalizedBounds.y,\n props: {\n ...activeShape.props,\n fill: this.editor.getCurrentDrawStyle().fill,\n isComplete: true,\n isClosed: true,\n segments: config.buildSegments(finalizedBounds.width, finalizedBounds.height),\n },\n });\n\n this.currentShapeId = null;\n this.ctx.transition(config.idleStateId);\n }\n\n private removeCurrentShape(): void {\n if (!this.currentShapeId) return;\n this.editor.store.deleteShapes([this.currentShapeId]);\n this.currentShapeId = null;\n }\n\n private getActiveShape(): DrawShape | null {\n if (!this.currentShapeId) return null;\n const shape = this.editor.getShape(this.currentShapeId);\n if (!shape || shape.type !== 'draw') return null;\n return shape;\n }\n}\n","import type { DrawSegment, Vec3 } from '../../types.js';\nimport { encodePoints } from '../../utils/pathCodec.js';\n\n// Helpers for geometric shape tools\n// Each tool provides \"constrained\" and \"unconstrained\" bound-builders\n// Constrained forces equal aspect ratio sides (shift), unconstrained allows freeform\n// Segment-builders turn those bounds into encoded draw segments\n\nexport interface ShapeBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst MIN_SIDE_LENGTH = 1;\n\n// Turn anchor + cursor into a bounding box, optionally forcing both axes to the longer side to get a square or circle\nfunction toSizedBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number,\n forceEqualSides: boolean\n): ShapeBounds {\n const rawDeltaX = cursorX - anchorX;\n const rawDeltaY = cursorY - anchorY;\n const sideLength = Math.max(Math.abs(rawDeltaX), Math.abs(rawDeltaY), MIN_SIDE_LENGTH);\n\n if (forceEqualSides) {\n const nextDeltaX = rawDeltaX < 0 ? -sideLength : sideLength;\n const nextDeltaY = rawDeltaY < 0 ? -sideLength : sideLength;\n return normalizeBounds(anchorX, anchorY, anchorX + nextDeltaX, anchorY + nextDeltaY);\n }\n\n return normalizeBounds(anchorX, anchorY, cursorX, cursorY);\n}\n\nfunction normalizeBounds(\n startX: number,\n startY: number,\n endX: number,\n endY: number\n): ShapeBounds {\n const x = Math.min(startX, endX);\n const y = Math.min(startY, endY);\n const width = Math.max(Math.abs(endX - startX), MIN_SIDE_LENGTH);\n const height = Math.max(Math.abs(endY - startY), MIN_SIDE_LENGTH);\n return { x, y, width, height };\n}\n\nexport function buildSquareBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, true);\n}\n\nexport function buildRectangleBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, false);\n}\n\n// Four straight segments connecting the corners. encoded as draw segments so\n// the renderer handles them exactly like hand-drawn strokes.\nexport function buildRectangleSegments(width: number, height: number): DrawSegment[] {\n const topLeft: Vec3 = { x: 0, y: 0, z: 0.5 };\n const topRight: Vec3 = { x: width, y: 0, z: 0.5 };\n const bottomRight: Vec3 = { x: width, y: height, z: 0.5 };\n const bottomLeft: Vec3 = { x: 0, y: height, z: 0.5 };\n return [\n { type: 'straight', path: encodePoints([topLeft, topRight]) },\n { type: 'straight', path: encodePoints([topRight, bottomRight]) },\n { type: 'straight', path: encodePoints([bottomRight, bottomLeft]) },\n { type: 'straight', path: encodePoints([bottomLeft, topLeft]) },\n ];\n}\n\nexport function buildCircleBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, true);\n}\n\nexport function buildEllipseBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, false);\n}\n\n// Approximate the ellipse as a 64-sample polyline encoded as a single \"free\" segment.\n// good enough visually and means we can reuse all the same rendering/hit-testing\n// that works for regular draw strokes.\nexport function buildEllipseSegments(width: number, height: number): DrawSegment[] {\n const centerX = width / 2;\n const centerY = height / 2;\n const radiusX = width / 2;\n const radiusY = height / 2;\n const sampleCount = 64;\n const sampledPoints: Vec3[] = [];\n\n for (let sampleIndex = 0; sampleIndex <= sampleCount; sampleIndex += 1) {\n const progress = sampleIndex / sampleCount;\n const angle = progress * Math.PI * 2;\n sampledPoints.push({\n x: centerX + Math.cos(angle) * radiusX,\n y: centerY + Math.sin(angle) * radiusY,\n z: 0.5,\n });\n }\n\n return [{ type: 'free', path: encodePoints(sampledPoints) }];\n}","import { GeometricDrawingState } from '../../geometric/states/GeometricDrawingState.js';\nimport {\n buildRectangleBounds,\n buildRectangleSegments,\n buildSquareBounds,\n} from '../../geometric/geometricShapeHelpers.js';\n\n// Square drawing: shift constrains to a perfect square, otherwise creates a rectangle\nexport class SquareDrawingState extends GeometricDrawingState {\n static override id = 'square_drawing';\n\n protected override getConfig() {\n return {\n idleStateId: 'square_idle',\n buildConstrainedBounds: buildSquareBounds,\n buildUnconstrainedBounds: buildRectangleBounds,\n buildSegments: buildRectangleSegments,\n };\n }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class CircleIdleState extends StateNode {\n static override id = 'circle_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('circle_drawing', info);\n }\n}","import { GeometricDrawingState } from '../../geometric/states/GeometricDrawingState.js';\nimport {\n buildCircleBounds,\n buildEllipseBounds,\n buildEllipseSegments,\n} from '../../geometric/geometricShapeHelpers.js';\n\n// Circle drawing: shift constrains to a perfect circle, otherwise creates an ellipse\nexport class CircleDrawingState extends GeometricDrawingState {\n static override id = 'circle_drawing';\n\n protected override getConfig() {\n return {\n idleStateId: 'circle_idle',\n buildConstrainedBounds: buildCircleBounds,\n buildUnconstrainedBounds: buildEllipseBounds,\n buildSegments: buildEllipseSegments,\n };\n }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class EraserIdleState extends StateNode {\n static override id = 'eraser_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('eraser_pointing', info);\n }\n}","export interface Bounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function boundsOf(points: { x: number; y: number }[]): Bounds {\n if (points.length === 0) return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (const p of points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport function padBounds(b: Bounds, amount: number): Bounds {\n return {\n minX: b.minX - amount,\n minY: b.minY - amount,\n maxX: b.maxX + amount,\n maxY: b.maxY + amount,\n };\n}\n\nexport function sqDistance(ax: number, ay: number, bx: number, by: number): number {\n const dx = bx - ax;\n const dy = by - ay;\n return dx * dx + dy * dy;\n}\n\nexport function distance(ax: number, ay: number, bx: number, by: number): number {\n return Math.sqrt(sqDistance(ax, ay, bx, by));\n}\n\n// Closest point on segment A-B to point P\nexport function closestOnSegment(\n ax: number, ay: number,\n bx: number, by: number,\n px: number, py: number\n): { x: number; y: number } {\n const dx = bx - ax;\n const dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return { x: ax, y: ay };\n const t = Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / lenSq));\n return { x: ax + t * dx, y: ay + t * dy };\n}\n\n// Hit-test (does line segment (ax,ay) - (bx,by) come within margin of the polyline?)\nexport function segmentTouchesPolyline(\n polyline: { x: number; y: number }[],\n ax: number, ay: number,\n bx: number, by: number,\n margin: number\n): boolean {\n for (let i = 0; i < polyline.length - 1; i++) {\n const p = polyline[i]!;\n const q = polyline[i + 1]!;\n const n1 = closestOnSegment(p.x, p.y, q.x, q.y, ax, ay);\n if (distance(n1.x, n1.y, ax, ay) <= margin) return true;\n const n2 = closestOnSegment(p.x, p.y, q.x, q.y, bx, by);\n if (distance(n2.x, n2.y, bx, by) <= margin) return true;\n const n3 = closestOnSegment(ax, ay, bx, by, p.x, p.y);\n if (distance(n3.x, n3.y, p.x, p.y) <= margin) return true;\n }\n if (polyline.length === 1) {\n const p = polyline[0]!;\n return distance(p.x, p.y, ax, ay) <= margin || distance(p.x, p.y, bx, by) <= margin;\n }\n return false;\n}\n\n// Minimum distance from point to polyline\nexport function minDistanceToPolyline(\n px: number, py: number,\n polyline: { x: number; y: number }[]\n): number {\n if (polyline.length === 0) return Infinity;\n if (polyline.length === 1) return distance(px, py, polyline[0]!.x, polyline[0]!.y);\n let best = Infinity;\n for (let i = 0; i < polyline.length - 1; i++) {\n const a = polyline[i]!;\n const b = polyline[i + 1]!;\n const n = closestOnSegment(a.x, a.y, b.x, b.y, px, py);\n const d = distance(n.x, n.y, px, py);\n if (d < best) best = d;\n }\n return best;\n}\n","import type { DrawShape } from '../../types.js';\nimport { STROKE_WIDTHS } from '../../types.js';\nimport { decodePathToPoints } from '../../utils/pathCodec.js';\nimport { minDistanceToPolyline, segmentTouchesPolyline, boundsOf, padBounds } from '../../utils/geometry.js';\n\n// Hit-testing helpers for the eraser tool\n// All tests work in page-space and factor in the shape's stroke width so fat strokes are easier to hit\n\nexport const ERASER_MARGIN = 4;\n\nexport function shapePagePoints(shape: DrawShape): { x: number; y: number }[] {\n return decodePathToPoints(shape.props.segments, shape.x, shape.y);\n}\n\n// For single-point (click) test, does the point fall within stroke margin?\nexport function pointHitsShape(\n shape: DrawShape,\n pageX: number,\n pageY: number,\n margin: number\n): boolean {\n const pts = shapePagePoints(shape);\n if (pts.length === 0) return false;\n const strokeMargin = margin + (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return minDistanceToPolyline(pageX, pageY, pts) <= strokeMargin;\n}\n\n// For segment test (dragging), does the line between previous and current pointer positions come within margin of any part of the shape?\nexport function segmentHitsShape(\n shape: DrawShape,\n ax: number, ay: number,\n bx: number, by: number,\n margin: number\n): boolean {\n const pts = shapePagePoints(shape);\n if (pts.length === 0) return false;\n const strokeMargin = margin + (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return segmentTouchesPolyline(pts, ax, ay, bx, by, strokeMargin);\n}\n\nexport { boundsOf, padBounds };\n","import {\n StateNode,\n type ToolPointerMoveInfo,\n type ToolStateTransitionInfo,\n} from '../../../store/stateNode.js';\nimport type { DrawShape } from '../../../types.js';\nimport type { ShapeId } from '../../../types.js';\nimport { pointHitsShape, ERASER_MARGIN } from '../eraserHitTest.js';\n\n// State for when eraser is being pressed but not dragged\nexport class EraserPointingState extends StateNode {\n static override id = 'eraser_pointing';\n\n override onEnter(_info?: ToolStateTransitionInfo): void {\n const zoom = this.editor.getZoomLevel();\n const tolerance = ERASER_MARGIN / zoom;\n const pt = this.editor.input.getCurrentPagePoint();\n const allShapes = this.editor.store.getCurrentPageRenderingShapesSorted();\n const hits: ShapeId[] = [];\n\n for (const shape of allShapes) {\n if (shape.type !== 'draw') continue;\n if (pointHitsShape(shape as DrawShape, pt.x, pt.y, tolerance)) {\n hits.push(shape.id);\n }\n }\n this.editor.setErasingShapes(hits);\n }\n\n override onPointerMove(info?: ToolPointerMoveInfo): void {\n if (this.editor.input.getIsDragging()) {\n this.ctx.transition('eraser_erasing', info);\n }\n }\n\n override onPointerUp(): void {\n this.finish();\n }\n\n override onExit(_info?: ToolStateTransitionInfo, to?: string): void {\n if (to !== 'eraser_erasing') {\n this.editor.setErasingShapes([]);\n }\n }\n\n override onCancel(): void {\n this.editor.setErasingShapes([]);\n this.ctx.transition('eraser_idle');\n }\n\n private finish(): void {\n const ids = this.editor.getErasingShapeIds();\n if (ids.length > 0) {\n this.editor.store.deleteShapes(ids);\n this.editor.setErasingShapes([]);\n }\n this.ctx.transition('eraser_idle');\n }\n}\n","import { StateNode, type ToolStateTransitionInfo } from '../../../store/stateNode.js';\nimport type { DrawShape } from '../../../types.js';\nimport type { ShapeId } from '../../../types.js';\nimport { segmentHitsShape, boundsOf, padBounds, ERASER_MARGIN } from '../eraserHitTest.js';\n\n// State for when eraser is being used\nexport class EraserErasingState extends StateNode {\n static override id = 'eraser_erasing';\n\n private _marked: ShapeId[] = [];\n\n override onEnter(_info?: ToolStateTransitionInfo): void {\n this._marked = [...this.editor.getErasingShapeIds()];\n this.sweep();\n }\n\n override onPointerMove(): void { this.sweep(); }\n override onPointerUp(): void { this.finish(); }\n\n override onExit(): void { this.editor.setErasingShapes([]); }\n override onCancel(): void { this.ctx.transition('eraser_idle'); }\n\n // On every pointer move, test the line from previous pointer position to current one against nearby shapes\n // Only select shapes whose bounding box overlaps the sweep area to avoid testing all shapes\n private sweep(): void {\n const zoom = this.editor.getZoomLevel();\n const tolerance = ERASER_MARGIN / zoom;\n const cur = this.editor.input.getCurrentPagePoint();\n const prev = this.editor.input.getPreviousPagePoint();\n const hitIds = new Set<ShapeId>(this.editor.getErasingShapeIds());\n\n const sweepArea = padBounds(boundsOf([prev, cur]), tolerance);\n const nearby = this.editor.store.getShapeIdsInBounds(sweepArea);\n const candidates = this.editor.store\n .getCurrentPageRenderingShapesSorted()\n .filter((s) => nearby.has(s.id));\n\n for (const shape of candidates) {\n if (shape.type !== 'draw') continue;\n if (segmentHitsShape(shape as DrawShape, prev.x, prev.y, cur.x, cur.y, tolerance)) {\n hitIds.add(shape.id);\n }\n }\n this._marked = [...hitIds];\n this.editor.setErasingShapes(this._marked);\n }\n\n // Delete marked shapes and reset, then go back to idle\n private finish(): void {\n const ids = this.editor.getErasingShapeIds();\n if (ids.length > 0) {\n this.editor.store.deleteShapes(ids);\n }\n this.editor.setErasingShapes([]);\n this._marked = [];\n this.ctx.transition('eraser_idle');\n }\n}\n","import { StateNode } from '../../../store/stateNode.js';\n\nexport class SelectIdleState extends StateNode {\n static override id = 'select_idle';\n}","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class HandIdleState extends StateNode {\n static override id = 'hand_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('hand_dragging', info);\n }\n}","import { StateNode, type ToolPointerMoveInfo } from '../../../store/stateNode.js';\n\n// Pans viewport by screen-space delta each pointer move\n// Screen delta (not page delta) to get 1:1 tracking with finger\nexport class HandDraggingState extends StateNode {\n static override id = 'hand_dragging';\n\n override onPointerMove(info?: ToolPointerMoveInfo): void {\n const move = info ?? {};\n const dx = move.screenDeltaX ?? 0;\n const dy = move.screenDeltaY ?? 0;\n if (dx === 0 && dy === 0) return;\n this.editor.panBy(dx, dy);\n }\n\n override onPointerUp(): void {\n this.ctx.transition('hand_idle');\n }\n\n override onCancel(): void {\n this.ctx.transition('hand_idle');\n }\n\n override onInterrupt(): void {\n this.ctx.transition('hand_idle');\n }\n}","import type { DashStyle, DrawShape, PageState, Shape, ShapeId, SizeStyle, ColorStyle, FillStyle } from '../types.js';\n\nexport interface TsdrawPageRecord {\n id: string;\n typeName: 'page';\n pageId: string;\n shapeIds: ShapeId[];\n erasingShapeIds: ShapeId[];\n}\n\nexport interface TsdrawShapeRecord {\n id: ShapeId;\n typeName: 'shape';\n shape: Shape;\n}\n\nexport type TsdrawPersistedRecord = TsdrawPageRecord | TsdrawShapeRecord;\n\nexport interface TsdrawDocumentSnapshot {\n records: TsdrawPersistedRecord[];\n}\n\nexport interface TsdrawSessionStateSnapshot {\n version: 1;\n viewport: {\n x: number;\n y: number;\n zoom: number;\n };\n currentToolId: string;\n drawStyle: {\n color: ColorStyle;\n dash: DashStyle;\n fill?: FillStyle;\n size: SizeStyle;\n };\n selectedShapeIds: ShapeId[];\n}\n\nexport interface TsdrawEditorSnapshot {\n document: TsdrawDocumentSnapshot;\n state: TsdrawSessionStateSnapshot;\n}\n\nexport interface TsdrawHistorySnapshot {\n version: 1;\n undoStack: TsdrawDocumentSnapshot[];\n redoStack: TsdrawDocumentSnapshot[];\n}\n\nexport interface DocumentStoreSnapshot {\n page: PageState;\n order: ShapeId[];\n}\n\nconst PAGE_RECORD_ID = 'page:current';\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction asDrawShape(value: Shape): DrawShape {\n return cloneValue(value as DrawShape);\n}\n\nexport function documentSnapshotToRecords(snapshot: DocumentStoreSnapshot): TsdrawPersistedRecord[] {\n const shapeIds = [...snapshot.order].filter((id) => snapshot.page.shapes[id] != null);\n const pageRecord: TsdrawPageRecord = {\n id: PAGE_RECORD_ID,\n typeName: 'page',\n pageId: snapshot.page.id,\n shapeIds,\n erasingShapeIds: [...snapshot.page.erasingShapeIds],\n };\n const shapeRecords: TsdrawShapeRecord[] = shapeIds\n .map((shapeId) => snapshot.page.shapes[shapeId])\n .filter((shape): shape is Shape => shape != null)\n .map((shape) => ({\n id: shape.id,\n typeName: 'shape',\n shape: asDrawShape(shape),\n }));\n\n return [pageRecord, ...shapeRecords];\n}\n\nexport function recordsToDocumentSnapshot(records: TsdrawPersistedRecord[]): DocumentStoreSnapshot | null {\n const pageRecord = records.find((record): record is TsdrawPageRecord => record.typeName === 'page');\n if (!pageRecord) {\n return null;\n }\n\n const shapeRecordMap = new Map<string, TsdrawShapeRecord>();\n for (const record of records) {\n if (record.typeName === 'shape') {\n shapeRecordMap.set(record.id, record);\n }\n }\n\n const shapes: Record<ShapeId, Shape> = {};\n const order: ShapeId[] = [];\n\n for (const shapeId of pageRecord.shapeIds) {\n const shapeRecord = shapeRecordMap.get(shapeId);\n if (!shapeRecord) continue;\n shapes[shapeId] = asDrawShape(shapeRecord.shape);\n order.push(shapeId);\n }\n\n return {\n page: {\n id: pageRecord.pageId,\n shapes,\n erasingShapeIds: [...pageRecord.erasingShapeIds].filter((shapeId) => shapes[shapeId] != null),\n },\n order,\n };\n}\n","import { DocumentStore } from '../store/documentStore.js';\nimport type { Viewport } from '../canvas/viewport.js';\nimport { createViewport, screenToPage, zoomViewport } from '../canvas/viewport.js';\nimport { CanvasRenderer } from '../canvas/renderer.js';\nimport { InputManager } from '../input/inputManager.js';\nimport type { ToolStateContext } from '../store/stateNode.js';\nimport { ToolManager, type ToolDefinition, type ToolId } from '../tools/toolManager.js';\nimport { PenIdleState } from '../tools/pen/states/PenIdleState.js';\nimport { PenDrawingState } from '../tools/pen/states/PenDrawingState.js';\nimport { SquareIdleState } from '../tools/square/states/SquareIdleState.js';\nimport { SquareDrawingState } from '../tools/square/states/SquareDrawingState.js';\nimport { CircleIdleState } from '../tools/circle/states/CircleIdleState.js';\nimport { CircleDrawingState } from '../tools/circle/states/CircleDrawingState.js';\nimport { EraserIdleState } from '../tools/eraser/states/EraserIdleState.js';\nimport { EraserPointingState } from '../tools/eraser/states/EraserPointingState.js';\nimport { EraserErasingState } from '../tools/eraser/states/EraserErasingState.js';\nimport { SelectIdleState } from '../tools/select/states/SelectIdleState.js';\nimport { HandIdleState } from '../tools/hand/states/HandIdleState.js';\nimport { HandDraggingState } from '../tools/hand/states/HandDraggingState.js';\nimport type { ShapeId, Shape, DrawShape, ColorStyle, DashStyle, SizeStyle, FillStyle } from '../types.js';\nimport type { Vec3 } from '../types.js';\nimport { DRAG_DISTANCE_SQUARED } from '../types.js';\nimport {\n documentSnapshotToRecords,\n recordsToDocumentSnapshot,\n type TsdrawDocumentSnapshot,\n type TsdrawEditorSnapshot,\n type TsdrawHistorySnapshot,\n type TsdrawSessionStateSnapshot,\n} from '../persistence/snapshots.js';\n\nexport interface EditorOptions {\n dragDistanceSquared?: number;\n toolDefinitions?: ToolDefinition[];\n initialToolId?: ToolId;\n}\n\ntype EditorListener = () => void;\n\nlet shapeIdCounter = 0;\nconst shapeIdRuntimeSeed = Math.random().toString(36).slice(2, 8);\nconst MAX_HISTORY_ENTRIES = 100;\n\nfunction createShapeId(): ShapeId {\n shapeIdCounter += 1;\n return `shape:${Date.now().toString(36)}-${shapeIdRuntimeSeed}-${shapeIdCounter.toString(36)}`;\n}\n\nfunction cloneDocumentSnapshot(snapshot: TsdrawDocumentSnapshot): TsdrawDocumentSnapshot {\n if (typeof structuredClone === 'function') {\n return structuredClone(snapshot);\n }\n return JSON.parse(JSON.stringify(snapshot)) as TsdrawDocumentSnapshot;\n}\n\nfunction areDocumentSnapshotsEqual(left: TsdrawDocumentSnapshot, right: TsdrawDocumentSnapshot): boolean {\n if (left.records.length !== right.records.length) return false;\n for (let i = 0; i < left.records.length; i += 1) {\n if (JSON.stringify(left.records[i]) !== JSON.stringify(right.records[i])) {\n return false;\n }\n }\n return true;\n}\n\n// Main editor: document store, viewport, input, tools, renderer\nexport class Editor {\n readonly store: DocumentStore = new DocumentStore();\n readonly input: InputManager = new InputManager();\n readonly tools: ToolManager = new ToolManager();\n readonly renderer: CanvasRenderer = new CanvasRenderer();\n viewport: Viewport = createViewport();\n readonly options: { dragDistanceSquared: number };\n // Default draw style\n private drawStyle: { color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle } = {\n color: 'black',\n dash: 'draw',\n fill: 'none',\n size: 'm',\n };\n private readonly toolStateContext: ToolStateContext;\n private readonly listeners = new Set<EditorListener>();\n private readonly historyListeners = new Set<EditorListener>();\n private undoStack: TsdrawDocumentSnapshot[] = [];\n private redoStack: TsdrawDocumentSnapshot[] = [];\n private lastDocumentSnapshot: TsdrawDocumentSnapshot;\n private suppressHistoryCapture = false;\n private historyBatchDepth = 0;\n private historyBatchStartSnapshot: TsdrawDocumentSnapshot | null = null;\n private historyBatchChanged = false;\n\n // Creates a new editor instance with the given options (with defaults if not provided)\n constructor(opts: EditorOptions = {}) {\n this.options = { dragDistanceSquared: opts.dragDistanceSquared ?? DRAG_DISTANCE_SQUARED };\n this.lastDocumentSnapshot = this.getDocumentSnapshot();\n this.store.listen(() => {\n this.captureDocumentHistory();\n this.emitChange();\n });\n this.toolStateContext = {\n transition: (id, info) => this.tools.transition(id, info),\n };\n for (const defaultTool of this.getDefaultToolDefinitions()) {\n this.registerToolDefinition(defaultTool);\n }\n for (const customTool of opts.toolDefinitions ?? []) {\n this.registerToolDefinition(customTool);\n }\n this.setCurrentTool(opts.initialToolId ?? 'pen');\n this.lastDocumentSnapshot = this.getDocumentSnapshot();\n }\n\n private captureDocumentHistory(): void {\n const nextSnapshot = this.getDocumentSnapshot();\n const previousSnapshot = this.lastDocumentSnapshot;\n this.lastDocumentSnapshot = nextSnapshot;\n\n if (this.suppressHistoryCapture || areDocumentSnapshotsEqual(previousSnapshot, nextSnapshot)) {\n return;\n }\n\n if (this.historyBatchDepth > 0) {\n this.historyBatchChanged = true;\n return;\n }\n\n this.undoStack.push(cloneDocumentSnapshot(previousSnapshot));\n if (this.undoStack.length > MAX_HISTORY_ENTRIES) {\n this.undoStack.splice(0, this.undoStack.length - MAX_HISTORY_ENTRIES);\n }\n this.redoStack = [];\n this.emitHistoryChange();\n }\n\n registerToolDefinition(toolDefinition: ToolDefinition): void {\n for (const stateConstructor of toolDefinition.stateConstructors) {\n this.tools.registerState(new stateConstructor(this.toolStateContext, this));\n }\n this.tools.registerTool(toolDefinition.id, toolDefinition.initialStateId);\n }\n\n private getDefaultToolDefinitions(): ToolDefinition[] {\n return [\n { id: 'pen', initialStateId: PenIdleState.id, stateConstructors: [PenIdleState, PenDrawingState] },\n { id: 'square', initialStateId: SquareIdleState.id, stateConstructors: [SquareIdleState, SquareDrawingState] },\n { id: 'circle', initialStateId: CircleIdleState.id, stateConstructors: [CircleIdleState, CircleDrawingState] },\n { id: 'eraser', initialStateId: EraserIdleState.id, stateConstructors: [EraserIdleState, EraserPointingState, EraserErasingState] },\n { id: 'select', initialStateId: SelectIdleState.id, stateConstructors: [SelectIdleState] },\n { id: 'hand', initialStateId: HandIdleState.id, stateConstructors: [HandIdleState, HandDraggingState] },\n ];\n }\n\n createShapeId(): ShapeId { return createShapeId(); }\n getZoomLevel(): number { return this.viewport.zoom; }\n getShape(id: ShapeId): Shape | undefined { return this.store.getShape(id); }\n createShape(shape: Shape): void { this.store.createShape(shape); }\n\n updateShapes(\n partials: Array<{ id: ShapeId; type: string; props?: Partial<DrawShape['props']> }>\n ): void {\n for (const p of partials) {\n const existing = this.store.getShape(p.id) as DrawShape | undefined;\n if (existing && p.props) {\n this.store.updateShape(p.id, { props: { ...existing.props, ...p.props } });\n }\n }\n }\n\n // Page point to shape local point (for draw shapes: subtract shape pos)\n getPointInShapeSpace(shape: DrawShape, pagePoint: Vec3): Vec3 {\n return {\n x: pagePoint.x - shape.x,\n y: pagePoint.y - shape.y,\n z: pagePoint.z,\n };\n }\n\n getCurrentPageShapes() { return this.store.getCurrentPageShapes(); }\n getCurrentPageShapesSorted() { return this.store.getCurrentPageShapesSorted(); }\n getCurrentPageRenderingShapesSorted() { return this.store.getCurrentPageRenderingShapesSorted(); }\n\n getErasingShapeIds() { return this.store.getErasingShapeIds(); }\n setErasingShapes(ids: ShapeId[]) { this.store.setErasingShapes(ids); }\n\n setCurrentTool(id: ToolId) { this.tools.setCurrentTool(id); this.emitChange(); }\n getCurrentToolId(): ToolId { return this.tools.getCurrentToolId(); }\n\n getCurrentDrawStyle() { return { ...this.drawStyle }; }\n setCurrentDrawStyle(partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) {\n this.drawStyle = { ...this.drawStyle, ...partial };\n this.emitChange();\n }\n\n setViewport(partial: Partial<Viewport>) {\n const rawZoom = partial.zoom ?? this.viewport.zoom;\n this.viewport = {\n x: partial.x ?? this.viewport.x,\n y: partial.y ?? this.viewport.y,\n zoom: Math.max(0.1, Math.min(4, rawZoom)),\n };\n this.emitChange();\n }\n\n panBy(dx: number, dy: number) {\n this.setViewport({\n x: this.viewport.x + dx,\n y: this.viewport.y + dy,\n });\n }\n\n zoomAt(factor: number, screenX: number, screenY: number): void {\n this.viewport = zoomViewport(this.viewport, factor, screenX, screenY);\n this.emitChange();\n }\n\n deleteShapes(ids: ShapeId[]): void {\n if (ids.length === 0) return;\n this.store.deleteShapes(ids);\n }\n\n getDocumentSnapshot(): TsdrawDocumentSnapshot {\n return {\n records: documentSnapshotToRecords(this.store.getSnapshot()),\n };\n }\n\n loadDocumentSnapshot(snapshot: TsdrawDocumentSnapshot): void {\n const documentSnapshot = recordsToDocumentSnapshot(snapshot.records);\n if (!documentSnapshot) return;\n this.runWithoutHistoryCapture(() => { this.store.loadSnapshot(documentSnapshot) });\n }\n\n getSessionStateSnapshot(args?: { selectedShapeIds?: ShapeId[] }): TsdrawSessionStateSnapshot {\n return {\n version: 1,\n viewport: {\n x: this.viewport.x,\n y: this.viewport.y,\n zoom: this.viewport.zoom,\n },\n currentToolId: this.getCurrentToolId(),\n drawStyle: this.getCurrentDrawStyle(),\n selectedShapeIds: [...(args?.selectedShapeIds ?? [])],\n };\n }\n\n loadSessionStateSnapshot(snapshot: TsdrawSessionStateSnapshot): ShapeId[] {\n this.setViewport(snapshot.viewport);\n this.setCurrentDrawStyle({\n color: snapshot.drawStyle.color,\n dash: snapshot.drawStyle.dash,\n fill: snapshot.drawStyle.fill ?? 'none',\n size: snapshot.drawStyle.size,\n });\n if (this.tools.hasTool(snapshot.currentToolId)) {\n this.setCurrentTool(snapshot.currentToolId);\n }\n return [...snapshot.selectedShapeIds];\n }\n\n getPersistenceSnapshot(args?: { selectedShapeIds?: ShapeId[] }): TsdrawEditorSnapshot {\n return {\n document: this.getDocumentSnapshot(),\n state: this.getSessionStateSnapshot(args),\n };\n }\n\n loadPersistenceSnapshot(snapshot: Partial<TsdrawEditorSnapshot>): ShapeId[] {\n if (snapshot.document) {\n this.loadDocumentSnapshot(snapshot.document);\n }\n if (snapshot.state) {\n return this.loadSessionStateSnapshot(snapshot.state);\n }\n return [];\n }\n\n getHistorySnapshot(): TsdrawHistorySnapshot {\n return {\n version: 1,\n undoStack: this.undoStack.map(cloneDocumentSnapshot),\n redoStack: this.redoStack.map(cloneDocumentSnapshot),\n };\n }\n\n loadHistorySnapshot(snapshot: TsdrawHistorySnapshot | null | undefined): void {\n if (!snapshot || snapshot.version !== 1) return;\n this.undoStack = snapshot.undoStack.map(cloneDocumentSnapshot).slice(-MAX_HISTORY_ENTRIES);\n this.redoStack = snapshot.redoStack.map(cloneDocumentSnapshot).slice(-MAX_HISTORY_ENTRIES);\n this.emitHistoryChange();\n }\n\n clearRedoHistory(): void {\n if (this.redoStack.length === 0) return;\n this.redoStack = [];\n this.emitHistoryChange();\n }\n\n beginHistoryEntry(): void {\n if (this.historyBatchDepth === 0) {\n this.historyBatchStartSnapshot = cloneDocumentSnapshot(this.lastDocumentSnapshot);\n this.historyBatchChanged = false;\n }\n this.historyBatchDepth += 1;\n }\n\n endHistoryEntry(): void {\n if (this.historyBatchDepth === 0) return;\n this.historyBatchDepth -= 1;\n if (this.historyBatchDepth > 0) return;\n\n const startSnapshot = this.historyBatchStartSnapshot;\n this.historyBatchStartSnapshot = null;\n if (!startSnapshot) return;\n\n const endSnapshot = this.getDocumentSnapshot();\n this.lastDocumentSnapshot = endSnapshot;\n const didDocumentChange = this.historyBatchChanged || !areDocumentSnapshotsEqual(startSnapshot, endSnapshot);\n this.historyBatchChanged = false;\n if (!didDocumentChange) return;\n\n this.undoStack.push(cloneDocumentSnapshot(startSnapshot));\n if (this.undoStack.length > MAX_HISTORY_ENTRIES) {\n this.undoStack.splice(0, this.undoStack.length - MAX_HISTORY_ENTRIES);\n }\n this.redoStack = [];\n this.emitHistoryChange();\n }\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undo(): boolean {\n const previousSnapshot = this.undoStack.pop();\n if (!previousSnapshot) return false;\n\n const currentSnapshot = this.getDocumentSnapshot();\n this.redoStack.push(cloneDocumentSnapshot(currentSnapshot));\n if (this.redoStack.length > MAX_HISTORY_ENTRIES) {\n this.redoStack.splice(0, this.redoStack.length - MAX_HISTORY_ENTRIES);\n }\n\n this.loadDocumentSnapshot(previousSnapshot);\n this.emitHistoryChange();\n return true;\n }\n\n redo(): boolean {\n const nextSnapshot = this.redoStack.pop();\n if (!nextSnapshot) return false;\n\n const currentSnapshot = this.getDocumentSnapshot();\n this.undoStack.push(cloneDocumentSnapshot(currentSnapshot));\n if (this.undoStack.length > MAX_HISTORY_ENTRIES) {\n this.undoStack.splice(0, this.undoStack.length - MAX_HISTORY_ENTRIES);\n }\n\n this.loadDocumentSnapshot(nextSnapshot);\n this.emitHistoryChange();\n return true;\n }\n\n listen(listener: EditorListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n listenHistory(listener: EditorListener): () => void {\n this.historyListeners.add(listener);\n return () => {\n this.historyListeners.delete(listener);\n };\n }\n\n // Convert screen coords to page coords\n screenToPage(screenX: number, screenY: number): { x: number; y: number } {\n return screenToPage(this.viewport, screenX, screenY);\n }\n\n // Render current page to 2d canvas context\n render(ctx: CanvasRenderingContext2D) {\n const shapes = this.getCurrentPageShapesSorted();\n const erasingIds = new Set(this.getErasingShapeIds());\n const visible = shapes.filter((s) => !erasingIds.has(s.id));\n this.renderer.render(ctx, this.viewport, visible);\n }\n\n private emitChange() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n private emitHistoryChange() {\n for (const listener of this.historyListeners) {\n listener();\n }\n }\n\n private runWithoutHistoryCapture(fn: () => void): void {\n const previousValue = this.suppressHistoryCapture;\n this.suppressHistoryCapture = true;\n try {\n fn();\n } finally {\n this.suppressHistoryCapture = previousValue;\n this.lastDocumentSnapshot = this.getDocumentSnapshot();\n }\n }\n}\n","import { decodePoints, encodePoints, decodePathToPoints } from '../../utils/pathCodec.js';\nimport { STROKE_WIDTHS, type DrawShape, type DrawSegment, type ShapeId, type Vec3 } from '../../types.js';\nimport type { Editor } from '../../editor/Editor.js';\n\nexport interface SelectionBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se';\n\nexport interface TransformSnapshot {\n x: number;\n y: number;\n segments: Array<{ type: DrawSegment['type']; points: Vec3[] }>;\n}\n\nexport function isSelectTool(tool: string): boolean {\n return tool === 'select';\n}\n\nexport function getShapeBounds(shape: DrawShape): SelectionBounds {\n const points = decodePathToPoints(shape.props.segments, shape.x, shape.y);\n if (points.length === 0) {\n return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n }\n\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n\n for (const p of points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n\n const stroke = (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return { minX: minX - stroke, minY: minY - stroke, maxX: maxX + stroke, maxY: maxY + stroke };\n}\n\nexport function normalizeSelectionBounds(\n a: { x: number; y: number },\n b: { x: number; y: number }\n): SelectionBounds {\n return {\n minX: Math.min(a.x, b.x),\n minY: Math.min(a.y, b.y),\n maxX: Math.max(a.x, b.x),\n maxY: Math.max(a.y, b.y),\n };\n}\n\nexport function boundsContainPoint(bounds: SelectionBounds, x: number, y: number): boolean {\n return x >= bounds.minX && x <= bounds.maxX && y >= bounds.minY && y <= bounds.maxY;\n}\n\nexport function boundsIntersect(a: SelectionBounds, b: SelectionBounds): boolean {\n return a.maxX >= b.minX && a.minX <= b.maxX && a.maxY >= b.minY && a.minY <= b.maxY;\n}\n\nexport function rotatePoint(point: { x: number; y: number }, center: { x: number; y: number }, radians: number) {\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n return {\n x: center.x + dx * c - dy * s,\n y: center.y + dx * s + dy * c,\n };\n}\n\nexport function buildTransformSnapshots(editor: Editor, ids: ShapeId[]): Map<ShapeId, TransformSnapshot> {\n const snapshots = new Map<ShapeId, TransformSnapshot>();\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n snapshots.set(id, {\n x: shape.x,\n y: shape.y,\n segments: shape.props.segments.map((seg) => ({\n type: seg.type,\n points: decodePoints(seg.path),\n })),\n });\n }\n return snapshots;\n}\n\nexport function buildStartPositions(editor: Editor, ids: ShapeId[]): Map<ShapeId, { x: number; y: number }> {\n const positions = new Map<ShapeId, { x: number; y: number }>();\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape) continue;\n positions.set(id, { x: shape.x, y: shape.y });\n }\n return positions;\n}\n\nexport function getTopShapeAtPoint(editor: Editor, point: { x: number; y: number }) {\n const margin = 6 / editor.viewport.zoom;\n const shapes = editor.getCurrentPageRenderingShapesSorted();\n\n // Iterate in rendering order so first hit matches top shape\n for (const shape of shapes) {\n if (shape.type !== 'draw') continue;\n const b = getShapeBounds(shape);\n if (\n boundsContainPoint(\n {\n minX: b.minX - margin,\n minY: b.minY - margin,\n maxX: b.maxX + margin,\n maxY: b.maxY + margin,\n },\n point.x,\n point.y\n )\n ) {\n return shape;\n }\n }\n\n return null;\n}\n\nexport function getSelectionBoundsPage(editor: Editor, ids: ShapeId[]): SelectionBounds | null {\n if (ids.length === 0) return null;\n\n let union: SelectionBounds | null = null;\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n const b = getShapeBounds(shape);\n union = union\n ? {\n minX: Math.min(union.minX, b.minX),\n minY: Math.min(union.minY, b.minY),\n maxX: Math.max(union.maxX, b.maxX),\n maxY: Math.max(union.maxY, b.maxY),\n }\n : b;\n }\n\n return union;\n}\n\nexport function getShapesInBounds(editor: Editor, bounds: SelectionBounds): ShapeId[] {\n return editor\n .getCurrentPageShapesSorted()\n .filter((shape): shape is DrawShape => shape.type === 'draw')\n .filter((shape) => boundsIntersect(getShapeBounds(shape), bounds))\n .map((shape) => shape.id);\n}\n\nexport function applyMove(\n editor: Editor,\n startPositions: Map<ShapeId, { x: number; y: number }>,\n deltaX: number,\n deltaY: number\n) {\n for (const [id, start] of startPositions) {\n editor.store.updateShape(id, {\n x: start.x + deltaX,\n y: start.y + deltaY,\n });\n }\n}\n\nexport function applyRotation(\n editor: Editor,\n startShapes: Map<ShapeId, TransformSnapshot>,\n center: { x: number; y: number },\n delta: number\n) {\n for (const [id, snapshot] of startShapes) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n\n const rotatedOrigin = rotatePoint({ x: snapshot.x, y: snapshot.y }, center, delta);\n // Rotate absolute points around selection center, then re-localize back into the shapes coordinate space\n const segments = snapshot.segments.map((segment) => ({\n type: segment.type,\n path: encodePoints(\n segment.points.map((pt) => {\n const absolute = { x: snapshot.x + pt.x, y: snapshot.y + pt.y };\n const rotated = rotatePoint(absolute, center, delta);\n return {\n x: rotated.x - rotatedOrigin.x,\n y: rotated.y - rotatedOrigin.y,\n z: pt.z,\n };\n })\n ),\n }));\n\n editor.store.updateShape(id, {\n x: rotatedOrigin.x,\n y: rotatedOrigin.y,\n props: { ...shape.props, segments },\n });\n }\n}\n\nexport function applyResize(\n editor: Editor,\n handle: ResizeHandle,\n startBounds: SelectionBounds,\n startShapes: Map<ShapeId, TransformSnapshot>,\n pointer: { x: number; y: number },\n lockAspectRatio: boolean\n) {\n const minSize = 8 / editor.viewport.zoom;\n const startW = Math.max(0.0001, startBounds.maxX - startBounds.minX);\n const startH = Math.max(0.0001, startBounds.maxY - startBounds.minY);\n const aspectRatio = startW / startH;\n\n let minX = startBounds.minX;\n let minY = startBounds.minY;\n let maxX = startBounds.maxX;\n let maxY = startBounds.maxY;\n\n switch (handle) {\n case 'nw':\n minX = Math.min(pointer.x, startBounds.maxX - minSize);\n minY = Math.min(pointer.y, startBounds.maxY - minSize);\n break;\n case 'ne':\n maxX = Math.max(pointer.x, startBounds.minX + minSize);\n minY = Math.min(pointer.y, startBounds.maxY - minSize);\n break;\n case 'sw':\n minX = Math.min(pointer.x, startBounds.maxX - minSize);\n maxY = Math.max(pointer.y, startBounds.minY + minSize);\n break;\n case 'se':\n maxX = Math.max(pointer.x, startBounds.minX + minSize);\n maxY = Math.max(pointer.y, startBounds.minY + minSize);\n break;\n }\n\n if (lockAspectRatio) {\n // Keep dragged corner constrained to the original ratio while opposite corner stays to be the stationary anchor resize\n let nextW = Math.max(minSize, maxX - minX);\n let nextH = Math.max(minSize, maxY - minY);\n\n if (nextW / nextH > aspectRatio) {\n nextH = nextW / aspectRatio;\n } else {\n nextW = nextH * aspectRatio;\n }\n\n if (nextW < minSize) {\n nextW = minSize;\n nextH = nextW / aspectRatio;\n }\n\n if (nextH < minSize) {\n nextH = minSize;\n nextW = nextH * aspectRatio;\n }\n\n switch (handle) {\n case 'nw':\n minX = startBounds.maxX - nextW;\n minY = startBounds.maxY - nextH;\n maxX = startBounds.maxX;\n maxY = startBounds.maxY;\n break;\n case 'ne':\n minX = startBounds.minX;\n minY = startBounds.maxY - nextH;\n maxX = startBounds.minX + nextW;\n maxY = startBounds.maxY;\n break;\n case 'sw':\n minX = startBounds.maxX - nextW;\n minY = startBounds.minY;\n maxX = startBounds.maxX;\n maxY = startBounds.minY + nextH;\n break;\n case 'se':\n minX = startBounds.minX;\n minY = startBounds.minY;\n maxX = startBounds.minX + nextW;\n maxY = startBounds.minY + nextH;\n break;\n }\n }\n\n const newBounds: SelectionBounds = { minX, minY, maxX, maxY };\n const sx = (newBounds.maxX - newBounds.minX) / startW;\n const sy = (newBounds.maxY - newBounds.minY) / startH;\n\n for (const [id, snapshot] of startShapes) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n const nextX = newBounds.minX + (snapshot.x - startBounds.minX) * sx;\n const nextY = newBounds.minY + (snapshot.y - startBounds.minY) * sy;\n const segments = snapshot.segments.map((segment) => ({\n type: segment.type,\n path: encodePoints(\n segment.points.map((p) => ({\n x: p.x * sx,\n y: p.y * sy,\n z: p.z,\n }))\n ),\n }));\n\n editor.store.updateShape(id, {\n x: nextX,\n y: nextY,\n props: { ...shape.props, segments },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/utils/pathCodec.ts","../src/store/documentStore.ts","../src/store/stateNode.ts","../src/canvas/viewport.ts","../src/canvas/cameraPan.ts","../src/utils/colors.ts","../src/canvas/renderer.ts","../src/input/inputManager.ts","../src/tools/toolManager.ts","../src/tools/pen/states/PenIdleState.ts","../src/utils/vec.ts","../src/tools/pen/states/PenDrawingState.ts","../src/tools/square/states/SquareIdleState.ts","../src/tools/geometric/states/GeometricDrawingState.ts","../src/tools/geometric/geometricShapeHelpers.ts","../src/tools/square/states/SquareDrawingState.ts","../src/tools/circle/states/CircleIdleState.ts","../src/tools/circle/states/CircleDrawingState.ts","../src/tools/eraser/states/EraserIdleState.ts","../src/utils/geometry.ts","../src/tools/eraser/eraserHitTest.ts","../src/tools/eraser/states/EraserPointingState.ts","../src/tools/eraser/states/EraserErasingState.ts","../src/tools/select/states/SelectIdleState.ts","../src/tools/hand/states/HandIdleState.ts","../src/tools/hand/states/HandDraggingState.ts","../src/persistence/snapshots.ts","../src/editor/Editor.ts","../src/tools/select/selectHelpers.ts"],"names":["cloneValue","getShapeBounds"],"mappings":";;;AA2DO,IAAM,aAAA,GAA2C;AAAA,EACtD,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,EAAA,EAAI;AACN;AAGO,IAAM,qBAAA,GAAwB;AAG9B,IAAM,cAAA,GAAyC;AAAA,EACpD,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,cAAA,EAAgB,SAAA;AAAA,EAChB,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,YAAA,EAAc,SAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,aAAA,EAAe,SAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,GAAA,EAAK,SAAA;AAAA,EACL,KAAA,EAAO;AACT;AAGO,IAAM,oBAAA,GAAuB;;;ACpF7B,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AACjC;AAGO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AACjC,IAAA,MAAM,MAAc,EAAC;AACrB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAAA,QACb,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA;AAAA,QACjB,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,OACb,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,iBAAiB,IAAA,EAA2B;AAC1D,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAK,IAAA;AACpC;AAEO,SAAS,gBAAgB,IAAA,EAA2B;AACzD,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,IAAA;AACjD;AAGO,SAAS,kBAAA,CACd,QAAA,EACA,EAAA,EACA,EAAA,EAC4B;AAC5B,EAAA,MAAM,MAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,GAAG,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;AC9CA,SAAS,WAAc,KAAA,EAAa;AAClC,EAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,IAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACjB,KAAA,GAAmB;AAAA,IACzB,EAAA,EAAI,QAAA;AAAA,IACJ,QAAQ,EAAC;AAAA,IACT,iBAAiB;AAAC,GACpB;AAAA,EACQ,QAAmB,EAAC;AAAA,EACX,SAAA,uBAAgB,GAAA,EAA2B;AAAA,EAE5D,OAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,SAAS,EAAA,EAAgC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,0BAAA,GAAsC;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/E,IAAA,OAAO,IAAA,CACJ,GAAA,CAAI,CAAC,EAAA,KAAO,KAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAC,CAAA,CACjC,MAAA,CAAO,CAAC,CAAA,KAAkB,KAAK,IAAI,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,mCAAA,GAA+C;AAC7C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,0BAAA,EAA4B,EAAE,OAAA,EAAQ;AAAA,EACxD;AAAA,EAEA,kBAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAAA,EACvC;AAAA,EAEA,iBAAiB,GAAA,EAAsB;AACrC,IAAA,IAAA,CAAK,MAAM,eAAA,GAAkB,GAAA;AAC7B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,YAAY,KAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AACxB,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,WAAA,CAAY,IAAa,OAAA,EAA+B;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,GAAG,OAAA,EAAS,EAAA,EAAG;AACtD,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,aAAa,GAAA,EAAsB;AACjC,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAC3B,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,GAAA,CAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AACtF,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,oBAAA,GAAgC;AAC9B,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,oBAAoB,GAAA,EAA+E;AACjG,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAa;AAC7B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,0BAAA,EAA2B,EAAG;AACrD,MAAA,MAAM,CAAA,GAAI,eAAe,KAAK,CAAA;AAC9B,MAAA,IACE,CAAA,CAAE,IAAA,IAAQ,GAAA,CAAI,IAAA,IACd,EAAE,IAAA,IAAQ,GAAA,CAAI,IAAA,IACd,CAAA,CAAE,QAAQ,GAAA,CAAI,IAAA,IACd,CAAA,CAAE,IAAA,IAAQ,IAAI,IAAA,EACd;AACA,QAAA,GAAA,CAAI,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,WAAA,GAAqC;AACnC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,MAC3B,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAK;AAAA,KACvB;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,QAAA,EAAuC;AAClD,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AAC1C,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,QAAA,CAAS,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY,SAAA,CAAU,MAAA,CAAO,OAAO,KAAK,IAAI,CAAA;AACjG,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,eAAe,CAAA;AAC1C,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AACnD,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5B,QAAA,eAAA,CAAgB,KAAK,OAAO,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,IAAI,SAAA,CAAU,EAAA;AAAA,MACd,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,eAAA,EAAiB,SAAA,CAAU,eAAA,CAAgB,MAAA,CAAO,CAAC,YAAY,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA,IAAK,IAAI;AAAA,KAClG;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,eAAA;AACb,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,OAAO,QAAA,EAA6C;AAClD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,eAAe,KAAA,EAA0E;AAChG,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAE;AAAA,EACtE;AACA,EAAA,MAAM,GAAA,GAAM,mBAAmB,KAAA,CAAM,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACrE,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,GAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,MAAM,CAAA,EAAE;AAC1F,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA;AACnB,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA;AACnB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,EAC3B;AACA,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA,CAAM,MAAM,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,KAAA;AAC7D,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAO;AAC9F;;;AC1HO,IAAe,YAAf,MAAyB;AAAA,EAG9B,WAAA,CACY,KACA,MAAA,EACV;AAFU,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACT;AAAA,EALH,OAAO,EAAA,GAAa,MAAA;AAAA,EAOpB,QAAQ,KAAA,EAAuC;AAAA,EAAC;AAAA,EAChD,MAAA,CAAO,OAAiC,GAAA,EAAoB;AAAA,EAAC;AAAA,EAC7D,cAAc,KAAA,EAAmC;AAAA,EAAC;AAAA,EAClD,cAAc,KAAA,EAAmC;AAAA,EAAC;AAAA,EAClD,WAAA,GAAoB;AAAA,EAAC;AAAA,EACrB,UAAU,KAAA,EAA2B;AAAA,EAAC;AAAA,EACtC,QAAQ,KAAA,EAA2B;AAAA,EAAC;AAAA,EACpC,QAAA,GAAiB;AAAA,EAAC;AAAA,EAClB,WAAA,GAAoB;AAAA,EAAC;AACvB;;;AC3CO,SAAS,cAAA,GAA2B;AACzC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA,EAAE;AAC/B;AAGO,SAAS,YAAA,CAAa,QAAA,EAAoB,OAAA,EAAiB,OAAA,EAA2C;AAC3G,EAAA,OAAO;AAAA,IACL,CAAA,EAAA,CAAI,OAAA,GAAU,QAAA,CAAS,CAAA,IAAK,QAAA,CAAS,IAAA;AAAA,IACrC,CAAA,EAAA,CAAI,OAAA,GAAU,QAAA,CAAS,CAAA,IAAK,QAAA,CAAS;AAAA,GACvC;AACF;AAGO,SAAS,YAAA,CAAa,QAAA,EAAoB,KAAA,EAAe,KAAA,EAAyC;AACvG,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,CAAA;AAAA,IACpC,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS;AAAA,GACtC;AACF;AAEO,SAAS,WAAA,CACd,UACA,OAAA,EACU;AACV,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,OAAA,CAAQ,CAAA,IAAK,QAAA,CAAS,CAAA;AAAA,IACzB,CAAA,EAAG,OAAA,CAAQ,CAAA,IAAK,QAAA,CAAS,CAAA;AAAA,IACzB,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,QAAA,CAAS;AAAA,GACjC;AACF;AAEO,SAAS,WAAA,CAAY,QAAA,EAAoB,EAAA,EAAY,EAAA,EAAsB;AAChF,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,CAAA,EAAG,QAAA,CAAS,IAAI,EAAA,EAAI,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,EAAA,EAAG;AAC/D;AAOO,IAAM,kBAAA,GAAgC,EAAE,GAAA,EAAK,GAAA,EAAK,KAAK,CAAA;AAEvD,SAAS,SAAA,CAAU,MAAc,KAAA,EAA2B;AACjE,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,KAAA,IAAS,kBAAA;AAC9B,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAC1C;AAEO,SAAS,YAAA,CAAa,QAAA,EAAoB,MAAA,EAAgB,OAAA,EAAkB,SAAkB,SAAA,EAAiC;AACpI,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,QAAA,CAAS,IAAA,GAAO,QAAQ,SAAS,CAAA;AACxD,EAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,OAAA,IAAW,IAAA,EAAM;AACtC,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,IAAA,EAAK;AAAA,EAC7B;AACA,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC1D,EAAA,MAAM,CAAA,GAAI,OAAA,GAAU,UAAA,CAAW,CAAA,GAAI,IAAA;AACnC,EAAA,MAAM,CAAA,GAAI,OAAA,GAAU,UAAA,CAAW,CAAA,GAAI,IAAA;AACnC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,EAAK;AACtB;;;AC7DA,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,uBAAA,GAA0B,IAAA;AAczB,SAAS,cAAA,CACd,QAAA,EACA,OAAA,EACA,OAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,kBAAkB,QAAA,CAAS,CAAA;AAAA,IAC3B,kBAAkB,QAAA,CAAS,CAAA;AAAA,IAC3B,aAAA,EAAe,OAAA;AAAA,IACf,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,CAAA;AAAA,IACX,SAAA,EAAW,CAAA;AAAA,IACX,eAAA,EAAiB,OAAA;AAAA,IACjB,eAAA,EAAiB,OAAA;AAAA,IACjB,YAAA,EAAc,YAAY,GAAA;AAAI,GAChC;AACF;AAGO,SAAS,aAAA,CACd,OAAA,EACA,cAAA,EACA,cAAA,EAC0B;AAC1B,EAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,YAAA;AAE9B,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAM,MAAA,GAAS,iBAAiB,OAAA,CAAQ,eAAA;AACxC,IAAA,MAAM,MAAA,GAAS,iBAAiB,OAAA,CAAQ,eAAA;AACxC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAA;AAEzC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,OAAO,MAAA,GAAS,OAAA;AACtB,MAAA,MAAM,OAAO,MAAA,GAAS,OAAA;AACtB,MAAA,MAAM,QAAQ,OAAA,GAAU,OAAA;AACxB,MAAA,OAAA,CAAQ,SAAA,IAAA,CAAc,IAAA,GAAO,KAAA,GAAQ,OAAA,CAAQ,SAAA,IAAa,oBAAA;AAC1D,MAAA,OAAA,CAAQ,SAAA,IAAA,CAAc,IAAA,GAAO,KAAA,GAAQ,OAAA,CAAQ,SAAA,IAAa,oBAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,KAAK,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,GAAI,uBAAA,UAAiC,SAAA,GAAY,CAAA;AAC/E,IAAA,IAAI,KAAK,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,GAAI,uBAAA,UAAiC,SAAA,GAAY,CAAA;AAAA,EACjF;AAEA,EAAA,OAAA,CAAQ,eAAA,GAAkB,cAAA;AAC1B,EAAA,OAAA,CAAQ,eAAA,GAAkB,cAAA;AAC1B,EAAA,OAAA,CAAQ,YAAA,GAAe,GAAA;AAEvB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,OAAA,CAAQ,gBAAA,IAAoB,cAAA,GAAiB,OAAA,CAAQ,aAAA,CAAA;AAAA,IACxD,CAAA,EAAG,OAAA,CAAQ,gBAAA,IAAoB,cAAA,GAAiB,OAAA,CAAQ,aAAA;AAAA,GAC1D;AACF;AAEA,IAAM,cAAA,GAAiB,IAAA;AACvB,IAAM,eAAA,GAAkB,IAAA;AACxB,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,2BAAA,GAA8B,GAAA;AAW7B,SAAS,gBAAA,CACd,OAAA,EACA,QAAA,EACA,OAAA,EACA,YAAA,EAC6B;AAC7B,EAAA,MAAM,QAAA,GAAW,cAAc,QAAA,IAAY,cAAA;AAC3C,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,GAAA,EAAI,GAAI,OAAA,CAAQ,YAAA;AACtD,EAAA,MAAM,cAAA,GAAiB,EAAA;AACvB,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,oBAAA,EAAsB,oBAAoB,cAAc,CAAA;AACzF,EAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,GAAY,WAAA;AACxC,EAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,GAAY,WAAA;AAExC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,WAAW,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,eAAe,CAAA;AACpD,EAAA,IAAI,YAAA,GAAe,6BAA6B,OAAO,IAAA;AAEvD,EAAA,MAAM,OAAO,WAAA,GAAc,KAAA;AAC3B,EAAA,MAAM,OAAO,WAAA,GAAc,KAAA;AAC3B,EAAA,IAAI,YAAA,GAAe,YAAA;AACnB,EAAA,IAAI,QAAA,GAAW,YAAY,GAAA,EAAI;AAC/B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,IAAA,MAAM,UAAU,GAAA,GAAM,QAAA;AACtB,IAAA,QAAA,GAAW,GAAA;AAEX,IAAA,QAAA,CAAS,IAAA,GAAO,YAAA,GAAe,OAAA,EAAS,IAAA,GAAO,eAAe,OAAO,CAAA;AACrE,IAAA,OAAA,EAAQ;AAER,IAAA,YAAA,IAAgB,QAAA;AAEhB,IAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,EACpC,CAAA;AAEA,EAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAElC,EAAA,OAAO;AAAA,IACL,IAAA,GAAO;AACL,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,QAAA,KAAA,GAAQ,CAAA;AAAA,MACV;AAAA,IACF;AAAA,GACF;AACF;;;ACpIA,IAAM,WAAA,GAAsC;AAAA,EAC1C,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,cAAA,EAAgB,SAAA;AAAA,EAChB,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,YAAA,EAAc,SAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,aAAA,EAAe,SAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,GAAA,EAAK,SAAA;AAAA,EACL,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,iBAAA,CAAkB,YAAoB,KAAA,EAAkC;AACtF,EAAA,MAAM,eAAA,GAAkB,eAAe,UAAU,CAAA;AACjD,EAAA,IAAI,CAAC,iBAAiB,OAAO,UAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,eAAA;AAC9B,EAAA,OAAO,WAAA,CAAY,UAAU,CAAA,IAAK,eAAA;AACpC;ACZO,IAAM,iBAAN,MAAgD;AAAA,EAC7C,KAAA,GAA2B,OAAA;AAAA,EAEnC,SAAS,KAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,MAAA,CAAO,GAAA,EAA+B,QAAA,EAAoB,MAAA,EAAuB;AAC/E,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA;AACpC,IAAA,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AACtC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,IAAA,CAAK,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EACd;AAAA;AAAA,EAGQ,WAAA,CAAY,KAA+B,KAAA,EAAwB;AACzE,IAAA,MAAM,KAAA,GAAA,CAAS,cAAc,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,IAAK,GAAA,IAAO,MAAM,KAAA,CAAM,KAAA;AACrE,IAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,QAAQ,iBAAA,CAAkB,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,KAAK,KAAK,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,IAAA,IAAQ,MAAA;AAEtC,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,QAAA,IAAY,SAAA,KAAc,MAAA,EAAQ;AAChD,MAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC/B,MAAA,IAAA,CAAK,kBAAkB,GAAA,EAAK,OAAA,EAAS,OAAO,KAAA,EAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,KAAA,EAAO,KAAK,CAAA;AACxC,IAAA,MAAM,OAAA,GAAU,SAAA;AAAA,MACd,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,QAAQ,CAA6B,CAAA;AAAA,MACrE;AAAA,KACF;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,GAAA,CAAI,OAAO,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,IAAI,CAAA,MAAO,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC9B;AACA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,iBAAA,CACN,GAAA,EACA,OAAA,EACA,KAAA,EACA,OACA,IAAA,EACM;AACN,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC3C,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,GAAA,CAAI,WAAA,CAAY,WAAA,CAAY,IAAA,EAAM,KAAK,CAAC,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAG,GAAG,OAAA,CAAQ,CAAC,EAAG,CAAC,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,IACrB;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EACd;AAAA;AAAA,EAGQ,oBAAA,CACN,GAAA,EACA,OAAA,EACA,KAAA,EACA,SAAA,EACM;AACN,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AAExB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAG,GAAG,OAAA,CAAQ,CAAC,EAAG,CAAC,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,SAAA,EAAU;AAEd,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,IACpB,CAAA,MAAA,IAAW,cAAc,MAAA,EAAQ;AAC/B,MAAA,GAAA,CAAI,SAAA,GAAY,IAAA,CAAK,KAAA,KAAU,MAAA,GAAS,SAAA,GAAY,SAAA;AACpD,MAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAAA,IACpB;AAEA,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EACd;AACF;AAEA,IAAM,cAAA,GAAiB,KAAA;AACvB,IAAM,YAAA,GAAe,CAAC,CAAA,KAAc,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,CAAC,CAAA,GAAI,IAAA;AAC7E,IAAM,OAAA,GAAU,CAAC,CAAA,KAAc,IAAA,CAAK,IAAK,CAAA,GAAI,IAAA,CAAK,KAAM,CAAC,CAAA;AACzD,IAAM,aAAa,CAAC,CAAA,KAClB,CAAA,GAAI,GAAA,GAAM,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAE1D,SAAS,KAAA,CACP,KAAA,EACA,OAAA,EACA,QAAA,EACA,QAAQ,KAAA,EACR;AACA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,OAAA;AACjB,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,QAAA;AACvB,EAAA,MAAM,CAAA,GAAA,CAAK,KAAA,GAAQ,EAAA,KAAO,EAAA,GAAK,EAAA,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA,GAAI,CAAA;AACtD,EAAA,OAAO,KAAA,GAAA,CAAS,QAAQ,KAAA,IAAS,OAAA;AACnC;AAEA,SAAS,YAAA,CAAa,OAAkB,KAAA,EAAe;AACrD,EAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,MAAM,QAAA,KAAa,IAAA;AAChE,EAAA,IAAI,KAAA,CAAM,MAAM,KAAA,EAAO;AACrB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAI,KAAA,GAAQ,GAAA;AAAA,MAClB,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,gBAAA,EAAkB,KAAA;AAAA,MAClB,MAAA,EAAQ,YAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,UAAA,EAAY,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA,EAAG,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IACpD,SAAA,EAAW,IAAA;AAAA,IACX,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,gBAAgB,KAAA,EAAkB;AACzC,EAAA,MAAM,MAAoD,EAAC;AAC3D,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU;AACtC,IAAA,MAAM,UAAU,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjD,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACf,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACf,UAAU,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,CAAA,CAAE,KAAK,GAAG;AAAA,KAC/C,CAAE,CAAA;AAEF,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7C,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,OAAO,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC3C,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,GAAK,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,KAAA,EAAO,QAAA,EAAU,EAAE,QAAA,EAAS;AAC3E,IAAA,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,GAAK,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,KAAA,EAAO,QAAA,EAAU,EAAE,QAAA,EAAS;AAC3E,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,GAAM,EAAE,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,CAAA,GAAI,KAAK,KAAA,GAAQ,CAAA,CAAA;AACvB,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,GAAG,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AAAA,QACvB,GAAG,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AAAA,QACvB,UAAU,CAAA,CAAE,QAAA,GAAA,CAAY,CAAA,CAAE,QAAA,GAAW,EAAE,QAAA,IAAY;AAAA,OACpD,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAA,CAAY,MAAkC,KAAA,EAAyB;AAC9E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AAAU,MAAA,OAAO,CAAC,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA;AAAA,IAC3C,KAAK,QAAA;AAAU,MAAA,OAAO,CAAC,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,IAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IAC3D,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;;;ACzNO,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAA,GAAiB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC9B,OAAA,GAAgB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA;AAAA,EAC7B,SAAA,GAAkB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA;AAAA,EAC/B,MAAA,GAAS,KAAA;AAAA;AAAA,EACT,SAAA,GAAY,KAAA;AAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA;AAAA,EACX,WAAA,GAAc,KAAA;AAAA;AAAA,EAEtB,mBAAA,GAA4B;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAAA,EAAG;AAAA,EAC3D,kBAAA,GAA2B;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAAG;AAAA,EACzD,oBAAA,GAA6B;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,SAAA,EAAU;AAAA,EAAG;AAAA,EAE7D,QAAA,GAAoB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EAE1C,WAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAAW;AAAA,EAChD,UAAA,GAAsB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA,EAC9C,WAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA,EAEhE,aAAA,GAAyB;AAAE,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAAa;AAAA,EAEpD,WAAA,CAAY,KAAA,EAAe,KAAA,EAAe,QAAA,EAAmB,KAAA,EAAuB;AAClF,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAO,CAAA,EAAG,YAAY,GAAA,EAAI;AACxD,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AACnC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,EACzC;AAAA,EAEA,WAAA,CAAY,KAAA,EAAe,KAAA,EAAe,QAAA,EAAmB,KAAA,EAAuB;AAClF,IAAA,IAAA,CAAK,SAAA,GAAY,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,CAAA,IAAK,GAAA,EAAI;AAC5E,IAAA,IAAA,CAAK,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG;AAC5E,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,SAAA,GAAkB;AAAA,EAElB;AAAA,EAEA,YAAA,CAAa,KAAA,EAAgB,IAAA,EAAe,IAAA,EAAsB;AAChE,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,WAAW,IAAA,IAAQ,IAAA;AAAA,EAC1B;AAAA,EAEA,SAAA,GAA0B;AACxB,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB,KAAK,mBAAA,EAAoB;AAAA,MAC3C,eAAA,EAAiB,KAAK,kBAAA,EAAmB;AAAA,MACzC,iBAAA,EAAmB,KAAK,oBAAA,EAAqB;AAAA,MAC7C,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACF;;;ACrDO,IAAM,cAAN,MAAkB;AAAA,EACf,aAAA,GAAwB,KAAA;AAAA,EACxB,YAAA,GAAiC,IAAA;AAAA,EACjC,MAAA,uBAAqC,GAAA,EAAI;AAAA,EACzC,mBAAA,uBAA+C,GAAA,EAAI;AAAA,EAE3D,cAAc,KAAA,EAAwB;AACpC,IAAA,MAAM,OAAO,KAAA,CAAM,WAAA;AACnB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,EAAE,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAClE;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,YAAA,CAAa,IAAY,cAAA,EAA8B;AACrD,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,EAAE,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACvD;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAA,EAAI,cAAc,CAAA;AAAA,EACjD;AAAA,EAEA,QAAQ,EAAA,EAAqB;AAC3B,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA;AAAA,EACxC;AAAA,EAEA,eAAe,EAAA,EAAkB;AAC/B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA;AACtD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAA,CAAK,YAAA,EAAc,MAAA,GAAS,MAAA,EAAW,cAAc,CAAA;AACrD,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,IAAA,IAAA,CAAK,aAAa,OAAA,IAAU;AAAA,EAC9B;AAAA,EAEA,gBAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,CAAW,SAAiB,IAAA,EAAsC;AAChE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,YAAA,EAAc,MAAA,GAAS,MAAA,EAAW,OAAO,CAAA;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,YAAY,IAAA,EAAiC;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,gBAAgB,IAAI,CAAA;AAAA,EAAG;AAAA,EACzF,YAAY,IAAA,EAAiC;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,gBAAgB,IAAI,CAAA;AAAA,EAAG;AAAA,EACzF,SAAA,GAAkB;AAAE,IAAA,IAAA,CAAK,cAAc,WAAA,IAAc;AAAA,EAAG;AAAA,EAExD,QAAQ,IAAA,EAAyB;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,YAAY,IAAI,CAAA;AAAA,EAAG;AAAA,EACzE,MAAM,IAAA,EAAyB;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,UAAU,IAAI,CAAA;AAAA,EAAG;AAAA,EAErE,MAAA,GAAe;AAAE,IAAA,IAAA,CAAK,cAAc,QAAA,IAAW;AAAA,EAAG;AAAA,EAClD,SAAA,GAAkB;AAAE,IAAA,IAAA,CAAK,cAAc,WAAA,IAAc;AAAA,EAAG;AAC1D;;;AClFO,IAAM,YAAA,GAAN,cAA2B,SAAA,CAAU;AAAA,EAC1C,OAAgB,EAAA,GAAK,UAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,aAAA,EAAe,IAAI,CAAA;AAAA,EACzC;AACF;;;ACNO,SAAS,IAAA,CAAK,GAAS,CAAA,EAAiB;AAC7C,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACxC;AAEO,SAAS,MAAA,CAAO,GAAS,CAAA,EAAiB;AAC/C,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAEO,SAAS,YAAA,CAAa,CAAA,EAAS,CAAA,EAAS,CAAA,EAAoB;AACjE,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA;AACvB;AAEO,SAAS,OAAA,CAAQ,CAAA,EAAW,MAAA,GAAS,CAAA,EAAW;AACrD,EAAA,OAAO,OAAO,MAAA,CAAO,SAAA,CAAU,QAAQ,IAAA,CAAK,CAAA,EAAG,MAAM,CAAC,CAAA;AACxD;AAEO,SAAS,QAAQ,CAAA,EAAe;AACrC,EAAA,OAAO,EAAE,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAC,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,GAAO,QAAQ,CAAA,CAAE,CAAC,IAAI,MAAA,EAAU;AACvF;AAGO,SAAS,QAAA,CAAS,IAAA,EAAY,EAAA,EAAU,KAAA,EAAuB;AAEpE,EAAA,MAAM,SAAiB,EAAC;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,IAAI,CAAA,GAAI,KAAA;AACd,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,CAAA,EAAG,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvC,CAAA,EAAG,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvC,GAAG,IAAA,CAAK,CAAA,IAAK,QAAQ,EAAA,CAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,EAAA,CAAG,IAAI,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,GAAI,EAAA,CAAG,KAAK,IAAA,CAAK;AAAA,KAC1F,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,aAAA,CAAc,KAAa,SAAA,EAA2B;AACpE,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,SAAA;AAC7B,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAA,GAAI,IAAA;AAClC;AAGO,SAAS,YAAA,CAAa,EAAA,EAAU,MAAA,EAAc,KAAA,EAAqB;AACxE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,MAAA,CAAO,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,MAAA,CAAO,CAAA;AACzB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAAA,IAC5B,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAAA,IAC5B,GAAG,EAAA,CAAG;AAAA,GACR;AACF;AAEO,SAAS,KAAQ,GAAA,EAAyB;AAC/C,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC3B;;;AC/CO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AAAA,EAEb,UAAA,GAAkC,EAAE,KAAA,EAAO,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI,EAAE;AAAA,EAClE,OAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,YAAA,GAAe,KAAA;AAAA,EACf,MAAA,GAAsB,MAAA;AAAA,EACtB,UAAA,GAAa,KAAA;AAAA,EACb,OAAA,GAAgB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC7B,cAAA,GAA8B,IAAA;AAAA,EAC9B,WAAA,GAAoB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EACjC,YAAA,GAAe,KAAA;AAAA,EACf,QAAA,GAAW,CAAA;AAAA,EACX,aAAqB,EAAC;AAAA,EAErB,QAAQ,IAAA,EAAkC;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,IAAQ,EAAE,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI,EAAE;AAC1D,IAAA,IAAA,CAAK,cAAc,EAAE,GAAG,KAAK,MAAA,CAAO,KAAA,CAAM,qBAAoB,EAAE;AAChE,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,OAAO,QAAA,EAAS;AAClC,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,SAAA,EAAW;AACnC,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,MAAA,MAAM,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AAC/C,MAAA,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,WAAW,KAAK,SAAA,EAAW;AAC5C,QAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,GAAA,EAAI;AAC5B,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACtB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA;AAAA,EAKS,UAAU,IAAA,EAA0B;AAC3C,IAAA,IAAI,IAAA,EAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,QAAQ,KAAK,MAAA;AAAQ,QACnB,KAAK,MAAA;AACH,UAAA,IAAA,CAAK,MAAA,GAAS,mBAAA;AACd,UAAA,IAAA,CAAK,iBAAiB,EAAE,GAAG,KAAK,MAAA,CAAO,KAAA,CAAM,qBAAoB,EAAE;AACnE,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,IAAA,CAAK,MAAA,GAAS,mBAAA;AACd,UAAA;AAAA;AACJ,IACF;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAES,QAAQ,IAAA,EAA0B;AACzC,IAAA,IAAI,IAAA,EAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,QAAQ,KAAK,MAAA;AAAQ,QACnB,KAAK,UAAA;AACH,UAAA,IAAA,CAAK,MAAA,GAAS,eAAA;AACd,UAAA,IAAA,CAAK,iBAAiB,EAAE,GAAG,KAAK,MAAA,CAAO,KAAA,CAAM,qBAAoB,EAAE;AACnE,UAAA;AAAA,QACF,KAAK,mBAAA;AACH,UAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,UAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,UAAA;AAAA;AACJ,IACF;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAAA,EACjD;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAc,EAAG;AACtC,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,YAAA,GAAwB;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CACN,QAAA,EACA,IAAA,EACA,KAAA,EACS;AACT,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,MAAkB,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,KAAA;AAC1D,IAAA,MAAM,CAAA,GAAI,cAAc,IAAI,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,QAAA,CAAS,CAAC,EAAG,IAAI,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,OAAA,CAAS,IAAI,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK,OAAO,KAAA;AAC3B,IAAA,IAAI,KAAA,CAAM,MAAM,GAAA,CAAI,CAAA,IAAK,MAAM,CAAA,KAAM,GAAA,CAAI,GAAG,OAAO,KAAA;AACnD,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAA,GAAI,CAAA,GAAI,OAAO,OAAO,KAAA;AAC3C,IAAA,OAAO,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,CAAA,GAAI,IAAI,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEQ,YAAY,QAAA,EAAiC;AACnD,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACvC,QAAA,GAAA,IAAO,OAAO,GAAA,CAAI,CAAC,GAAI,GAAA,CAAI,CAAA,GAAI,CAAC,CAAE,CAAA;AAAA,MACpC;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACtB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,OAAO,kBAAA,EAAmB;AACzC,IAAA,MAAM,SAAA,GAAY,OAAO,QAAA,EAAS;AAClC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,CAAA,IAAK,GAAA;AACvC,IAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,aAAa,CAAA,KAAM,GAAA;AACvC,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,WAAA,EAAY,GAAI,UAAA,GAAa,MAAA;AAClD,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,MAAA,EAAO;AAE/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA2B;AAC5D,IAAA,MAAM,IAAA,GAAO,KAAK,MAAM,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,IAAA,GAAO,MAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA;AAEf,IAAA,IAAI,QAAA,IAAY,IAAA,CAAK,MAAA,KAAW,UAAA,EAAY;AAC1C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAA,EAAS;AAAE,QAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,QAAQ,CAAA;AAAG,QAAA;AAAA,MAAQ;AAC3D,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAA,EAAS;AAAE,QAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,QAAQ,CAAA;AAAG,QAAA;AAAA,MAAQ;AAC3D,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,UAAU,MAAM,CAAA;AAC/D,MAAA,MAAM,OAAA,GAAgB,EAAE,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,GAAG,QAAA,EAAS;AAC9E,MAAA,MAAM,MAAA,GAAsB;AAAA,QAC1B,IAAA,EAAM,UAAA;AAAA,QACN,MAAM,YAAA,CAAa;AAAA,UACjB,EAAE,GAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,QAAA,EAAS;AAAA,UAC1C;AAAA,SACD;AAAA,OACH;AACA,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,QACxB,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,OAAA,CAAQ;AAAA,OAC1B;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,MAAM,OAAO,CAAC,GAAG,QAAA,CAAS,KAAA,CAAM,UAAU,MAAM,CAAA;AAChD,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,QACvB;AAAA,UACE,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,IAAA;AAAA,YACV,QAAA,EAAU,KAAK,aAAA,CAAc,IAAA,EAAM,SAAS,KAAA,CAAM,IAAA,EAAM,QAAA,CAAS,KAAA,CAAM,KAAK;AAAA;AAC9E;AACF,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,QAAQ,CAAA;AAAA,EAClC;AAAA;AAAA,EAGQ,UAAA,CAAW,UAAgB,QAAA,EAAwB;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,QAAA,EAAS;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB;AAClD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc;AACrC,IAAA,MAAM,UAAgB,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,QAAA,EAAS;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,OAAO,CAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,MACtB,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,GAAG,QAAA,CAAS,CAAA;AAAA,MACZ,GAAG,QAAA,CAAS,CAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,OAAO,SAAA,CAAU,KAAA;AAAA,QACjB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,KAAA,EAAO,CAAA;AAAA,QACP,OAAO,IAAA,CAAK,YAAA;AAAA,QACZ,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAM,IAAA,CAAK,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,MAAA;AAAA,YAChD,IAAA,EAAM,YAAA,CAAa,CAAC,OAAO,CAAC;AAAA;AAC9B;AACF;AACF,KACD,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA;AAAA,EAGQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AACpB,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,IAAQ,GAAI,MAAA;AACvC,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,KAAA,CAAM,KAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAO,mBAAA,EAAoB;AAEzC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,IAAK,GAAA;AACzB,MAAA,IAAK,QAAQ,CAAA,IAAK,KAAA,KAAU,GAAA,IAAQ,MAAA,CAAO,UAAS,EAAG;AACrD,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,OAAO,KAAK,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,KAAK,YAAA,GAClB,OAAA,CAAA,CAAS,MAAM,CAAA,IAAK,GAAA,IAAO,IAAI,CAAA,GAC/B,GAAA;AACJ,IAAA,MAAM,EAAA,GAAW,EAAE,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,GAAG,QAAA,EAAS;AAKzE,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,mBAAA,EAAqB;AACxB,QAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,CAAO,mBAAA,EAAqB,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB;AAC9F,QAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AACd,QAAA,MAAM,OAAA,GAAU,KAAK,QAAQ,CAAA;AAC7B,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAC5C,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,cAAc,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,KAAA,EAAO,KAAK,OAAO,CAAA;AACxE,QAAA,MAAM,QAAA,GAAW,QAAQ,WAAW,CAAA;AACpC,QAAA,MAAM,GAAA,GAAmB;AAAA,UACvB,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,YAAA,CAAa,CAAC,OAAA,EAAS,EAAE,GAAG,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAC;AAAA,SAC5D;AACA,QAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,QAAA,EAAU,GAAG,CAAA;AACzC,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,eAAA;AAAA,cACV,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,eAAA,EAAiB,MAAM,KAAK;AAAA;AAC3D;AACF,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,CAAO,mBAAA,EAAqB,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB;AAC9F,QAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,MAAM,OAAA,GAAU,KAAK,QAAQ,CAAA;AAC7B,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAC5C,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,EAAS,EAAA,EAAI,CAAC,CAAA;AAC5C,QAAA,IAAA,CAAK,UAAA,GAAa,YAAA;AAClB,QAAA,MAAM,OAAA,GAAuB;AAAA,UAC3B,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,aAAa,YAAY;AAAA,SACjC;AACA,QAAA,MAAM,OAAA,GAAU,CAAC,GAAG,QAAA,EAAU,OAAO,CAAA;AACrC,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACxC,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,OAAA;AAAA,cACV,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAM,KAAK;AAAA;AACnD;AACF,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,OAAA,GAAU,SAAS,KAAA,EAAM;AAC/B,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC1C,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,aAAa,IAAA,CAAK,OAAA;AACxB,QAAA,MAAM,OAAA,GAAU,OAAO,mBAAA,EAAoB;AAC3C,QAAA,MAAM,UAAA,GAAa,CAAC,IAAA,CAAK,UAAA,IAAc,OAAO,aAAA,EAAc;AAC5D,QAAA,IAAI,IAAA,CAAK,UAAA,IAAc,MAAA,CAAO,aAAA,EAAc,EAAG;AAC7C,UAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,QACpB;AACA,QAAA,IAAI,MAAA;AACJ,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAAA,YACjB,OAAA,CAAQ,IAAI,UAAA,CAAW,CAAA;AAAA,YACvB,OAAA,CAAQ,IAAI,UAAA,CAAW;AAAA,WACzB;AACA,UAAA,MAAM,OAAA,GAAU,aAAA,CAAc,KAAA,EAAO,EAAE,CAAA;AACvC,UAAA,MAAM,OAAO,OAAA,GAAU,KAAA;AACvB,UAAA,MAAA,GAAS,YAAA,CAAa,OAAA,EAAS,UAAA,EAAY,IAAI,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,EAAE,GAAG,OAAA,EAAQ;AAAA,QACxB;AACA,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,OAAO,MAAM,CAAA;AAC9D,QAAA,MAAM,OAAA,GAAU,QAAQ,OAAO,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,OAAA,CAAQ,IAAI,CAAA;AAC9C,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAAA,QACzC;AACA,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI;AAAA,UAC5B,GAAG,OAAA;AAAA,UACH,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,YAAA,CAAa,CAAC,QAAA,IAAY,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,CAAA,EAAG,QAAA,EAAU,CAAC;AAAA,SACvE;AACA,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,OAAA;AAAA,cACV,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAM,KAAK;AAAA;AACnD;AACF,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,QAAA,IAAI,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,YAAA,EAAc;AACtC,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,UAAA,IAAA,CAAK,IAAI,EAAA,CAAG,CAAA;AACZ,UAAA,IAAA,CAAK,IAAI,EAAA,CAAG,CAAA;AACZ,UAAA,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,CAAC,CAAA,GAAI,EAAA,CAAG,CAAA;AAAA,QAC7D,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,MAAA,GACpB,IAAA,CAAK,MAAA,CAAO,OAAO,MAAA,GAAS,CAAC,CAAA,EAAI,EAAE,CAAA,GACnC,CAAA;AACJ,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA;AAAA,QAC3C;AACA,QAAA,MAAM,OAAA,GAAU,SAAS,KAAA,EAAM;AAC/B,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC1C,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI;AAAA,UAC5B,GAAG,OAAA;AAAA,UACH,IAAA,EAAM,aAAa,MAAM;AAAA,SAC3B;AACA,QAAA,IAAI,KAAK,QAAA,GAAW,aAAA,CAAc,MAAM,KAAA,CAAM,IAAI,IAAI,CAAA,EAAG;AACvD,UAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,QAC1C;AACA,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,OAAA;AAAA,cACV,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAM,KAAK;AAAA;AACnD;AACF,SACD,CAAA;AACD,QAAA,IAAI,MAAA,CAAO,SAAS,oBAAA,EAAsB;AACxC,UAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,EAAK,EAAG,CAAC,CAAA;AAC5E,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc;AACxC,UAAA,MAAM,OAAA,GAAU,OAAO,mBAAA,EAAoB;AAC3C,UAAA,MAAM,OAAA,GAAgB;AAAA,YACpB,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,KAAK,YAAA,GAAe,OAAA,CAAA,CAAS,QAAQ,CAAA,IAAK,GAAA,IAAO,IAAI,CAAA,GAAI;AAAA,WAC9D;AACA,UAAA,IAAA,CAAK,UAAA,GAAa,CAAC,OAAO,CAAA;AAC1B,UAAA,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,YACtB,EAAA,EAAI,KAAA;AAAA,YACJ,IAAA,EAAM,MAAA;AAAA,YACN,GAAG,OAAA,CAAQ,CAAA;AAAA,YACX,GAAG,OAAA,CAAQ,CAAA;AAAA,YACX,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,cACnB,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,cAClB,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,cAClB,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,cACnB,OAAO,IAAA,CAAK,YAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,YAAA,CAAa,CAAC,OAAO,CAAC,CAAA,EAAG;AAAA;AAC5D,WACD,CAAA;AACD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAC1C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,YAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,OAAA,EAAQ;AAChC,YAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,UAClB;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,MACvB,EAAE,EAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,cAAa;AAAE,KAC5F,CAAA;AACD,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,UAAU,CAAA;AAAA,EAChC;AACF;;;ACtbO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,IAAI,CAAA;AAAA,EAC5C;AACF;;;ACgBO,IAAe,qBAAA,GAAf,cAA6C,SAAA,CAAU;AAAA,EACpD,cAAA,GAAiC,IAAA;AAAA,EACjC,SAAA,GAAiC,EAAE,KAAA,EAAO,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI,EAAE;AAAA,EAIhE,QAAQ,IAAA,EAAkC;AACjD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,IAAQ,EAAE,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI,EAAE;AACzD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,kBAAA,EAAmB;AACzD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB;AAClD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc;AAC9C,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAE9B,IAAA,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,MACtB,EAAA,EAAI,WAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,GAAG,WAAA,CAAY,CAAA;AAAA,MACf,GAAG,WAAA,CAAY,CAAA;AAAA,MACf,KAAA,EAAO;AAAA,QACL,OAAO,SAAA,CAAU,KAAA;AAAA,QACjB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA,QACP,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,MAAA,CAAO,aAAA,CAAc,CAAA,EAAG,CAAC;AAAA;AACrC,KACD,CAAA;AAED,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAA;AAAA,EACxB;AAAA;AAAA,EAGS,aAAA,GAAsB;AAC7B,IAAA,MAAM,WAAA,GAAc,KAAK,cAAA,EAAe;AACxC,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,kBAAA,EAAmB;AACzD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAoB;AAC1D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,GAC9C,MAAA,CAAO,sBAAA,CAAuB,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,GAAG,WAAA,CAAY,CAAC,CAAA,GACxF,MAAA,CAAO,wBAAA,CAAyB,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA;AAE9F,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,WAAA,CAAY,EAAA,EAAI;AAAA,MAC5C,GAAG,WAAA,CAAY,CAAA;AAAA,MACf,GAAG,WAAA,CAAY,CAAA;AAAA,MACf,KAAA,EAAO;AAAA,QACL,GAAG,WAAA,CAAY,KAAA;AAAA,QACf,UAAU,MAAA,CAAO,aAAA,CAAc,WAAA,CAAY,KAAA,EAAO,YAAY,MAAM,CAAA;AAAA,QACpE,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAAA,EACH;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,IAAI,UAAA,CAAW,IAAA,CAAK,WAAU,CAAE,WAAA,EAAa,KAAK,SAAS,CAAA;AAAA,EAClE;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAES,SAAA,GAAkB;AACzB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,WAAA,GAAc,KAAK,cAAA,EAAe;AACxC,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,CAAO,WAAA,EAAa,KAAK,SAAS,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,kBAAA,EAAmB;AACzD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAoB;AAC1D,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,GAAI,WAAA,CAAY,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,GAAI,WAAA,CAAY,CAAA;AACvC,IAAA,MAAM,mBAAoB,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,mBAAA;AAEnE,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,CAAO,WAAA,EAAa,KAAK,SAAS,CAAA;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,GAClD,MAAA,CAAO,sBAAA,CAAuB,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,GAAG,WAAA,CAAY,CAAC,CAAA,GACxF,MAAA,CAAO,wBAAA,CAAyB,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA;AAE9F,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,WAAA,CAAY,EAAA,EAAI;AAAA,MAC5C,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,GAAG,eAAA,CAAgB,CAAA;AAAA,MACnB,KAAA,EAAO;AAAA,QACL,GAAG,WAAA,CAAY,KAAA;AAAA,QACf,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB,CAAE,IAAA;AAAA,QACxC,UAAA,EAAY,IAAA;AAAA,QACZ,QAAA,EAAU,IAAA;AAAA,QACV,UAAU,MAAA,CAAO,aAAA,CAAc,eAAA,CAAgB,KAAA,EAAO,gBAAgB,MAAM;AAAA;AAC9E,KACD,CAAA;AAED,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA;AAAA,EACxC;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,YAAA,CAAa,CAAC,IAAA,CAAK,cAAc,CAAC,CAAA;AACpD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEQ,cAAA,GAAmC;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,OAAO,IAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,cAAc,CAAA;AACtD,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,QAAQ,OAAO,IAAA;AAC5C,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;;;AC5IA,IAAM,eAAA,GAAkB,CAAA;AAGxB,SAAS,aAAA,CACP,OAAA,EACA,OAAA,EACA,OAAA,EACA,SACA,eAAA,EACa;AACb,EAAA,MAAM,YAAY,OAAA,GAAU,OAAA;AAC5B,EAAA,MAAM,YAAY,OAAA,GAAU,OAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,eAAe,CAAA;AAErF,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,UAAA,GAAa,SAAA,GAAY,CAAA,GAAI,CAAC,UAAA,GAAa,UAAA;AACjD,IAAA,MAAM,UAAA,GAAa,SAAA,GAAY,CAAA,GAAI,CAAC,UAAA,GAAa,UAAA;AACjD,IAAA,OAAO,gBAAgB,OAAA,EAAS,OAAA,EAAS,OAAA,GAAU,UAAA,EAAY,UAAU,UAAU,CAAA;AAAA,EACrF;AAEA,EAAA,OAAO,eAAA,CAAgB,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAC3D;AAEA,SAAS,eAAA,CACP,MAAA,EACA,MAAA,EACA,IAAA,EACA,IAAA,EACa;AACb,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,GAAO,MAAM,GAAG,eAAe,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,GAAO,MAAM,GAAG,eAAe,CAAA;AAChE,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,EAAO;AAC/B;AAEO,SAAS,iBAAA,CACd,OAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACa;AACb,EAAA,OAAO,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,SAAS,IAAI,CAAA;AAC/D;AAEO,SAAS,oBAAA,CACd,OAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACa;AACb,EAAA,OAAO,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,SAAS,KAAK,CAAA;AAChE;AAIO,SAAS,sBAAA,CAAuB,OAAe,MAAA,EAA+B;AACnF,EAAA,MAAM,UAAgB,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAC3C,EAAA,MAAM,WAAiB,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA,EAAG,GAAG,GAAA,EAAI;AAChD,EAAA,MAAM,cAAoB,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,GAAA,EAAI;AACxD,EAAA,MAAM,aAAmB,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,MAAA,EAAQ,GAAG,GAAA,EAAI;AACnD,EAAA,OAAO;AAAA,IACL,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,aAAa,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA,EAAE;AAAA,IAC5D,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,aAAa,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA,EAAE;AAAA,IAChE,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,aAAa,CAAC,WAAA,EAAa,UAAU,CAAC,CAAA,EAAE;AAAA,IAClE,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,aAAa,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAAE,GAChE;AACF;AAEO,SAAS,iBAAA,CACd,OAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACa;AACb,EAAA,OAAO,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,SAAS,IAAI,CAAA;AAC/D;AAEO,SAAS,kBAAA,CACd,OAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACa;AACb,EAAA,OAAO,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,SAAS,KAAK,CAAA;AAChE;AAKO,SAAS,oBAAA,CAAqB,OAAe,MAAA,EAA+B;AACjF,EAAA,MAAM,UAAU,KAAA,GAAQ,CAAA;AACxB,EAAA,MAAM,UAAU,MAAA,GAAS,CAAA;AACzB,EAAA,MAAM,UAAU,KAAA,GAAQ,CAAA;AACxB,EAAA,MAAM,UAAU,MAAA,GAAS,CAAA;AACzB,EAAA,MAAM,WAAA,GAAc,EAAA;AACpB,EAAA,MAAM,gBAAwB,EAAC;AAE/B,EAAA,KAAA,IAAS,WAAA,GAAc,CAAA,EAAG,WAAA,IAAe,WAAA,EAAa,eAAe,CAAA,EAAG;AACtE,IAAA,MAAM,WAAW,WAAA,GAAc,WAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,CAAA;AACnC,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,OAAA;AAAA,MAC/B,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,OAAA;AAAA,MAC/B,CAAA,EAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,YAAA,CAAa,aAAa,GAAG,CAAA;AAC7D;;;ACpHO,IAAM,kBAAA,GAAN,cAAiC,qBAAA,CAAsB;AAAA,EAC5D,OAAgB,EAAA,GAAK,gBAAA;AAAA,EAEF,SAAA,GAAY;AAC7B,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,aAAA;AAAA,MACb,sBAAA,EAAwB,iBAAA;AAAA,MACxB,wBAAA,EAA0B,oBAAA;AAAA,MAC1B,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AACF;;;ACjBO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,IAAI,CAAA;AAAA,EAC5C;AACF;;;ACAO,IAAM,kBAAA,GAAN,cAAiC,qBAAA,CAAsB;AAAA,EAC5D,OAAgB,EAAA,GAAK,gBAAA;AAAA,EAEF,SAAA,GAAY;AAC7B,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,aAAA;AAAA,MACb,sBAAA,EAAwB,iBAAA;AAAA,MACxB,wBAAA,EAA0B,kBAAA;AAAA,MAC1B,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AACF;;;ACjBO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,IAAI,CAAA;AAAA,EAC7C;AACF;;;ACDO,SAAS,SAAS,MAAA,EAA4C;AACnE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AACrE,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAClC;AAEO,SAAS,SAAA,CAAU,GAAW,MAAA,EAAwB;AAC3D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,IACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,IACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,IACf,IAAA,EAAM,EAAE,IAAA,GAAO;AAAA,GACjB;AACF;AAEO,SAAS,UAAA,CAAW,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AACjF,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAEO,SAAS,QAAA,CAAS,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC/E,EAAA,OAAO,KAAK,IAAA,CAAK,UAAA,CAAW,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AAC7C;AAGO,SAAS,iBACd,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,IAAY,EAAA,EACc;AAC1B,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,UAAU,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACvC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,EAAE,GAAG,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,EAAG,EAAA,GAAK,IAAI,EAAA,EAAG;AAC1C;AAGO,SAAS,uBACd,QAAA,EACA,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,IACZ,MAAA,EACS;AACT,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACtD,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,EAAI,EAAE,CAAA,IAAK,MAAA,EAAQ,OAAO,IAAA;AACnD,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACtD,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,EAAI,EAAE,CAAA,IAAK,MAAA,EAAQ,OAAO,IAAA;AACnD,IAAA,MAAM,EAAA,GAAK,iBAAiB,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACpD,IAAA,IAAI,QAAA,CAAS,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,MAAA,EAAQ,OAAO,IAAA;AAAA,EACvD;AACA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,OAAO,SAAS,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAI,EAAE,CAAA,IAAK,MAAA,IAAU,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,IAAK,MAAA;AAAA,EAC/E;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,qBAAA,CACd,EAAA,EAAY,EAAA,EACZ,QAAA,EACQ;AACR,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAClC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,SAAS,EAAA,EAAI,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,CAAG,CAAA,EAAG,QAAA,CAAS,CAAC,EAAG,CAAC,CAAA;AACjF,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AACxB,IAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACrD,IAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,IAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,IAAA;AACT;;;ACvFO,IAAM,aAAA,GAAgB;AAEtB,SAAS,gBAAgB,KAAA,EAA8C;AAC5E,EAAA,OAAO,mBAAmB,KAAA,CAAM,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAClE;AAGO,SAAS,cAAA,CACd,KAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,UAAU,aAAA,CAAc,KAAA,CAAM,MAAM,IAAI,CAAA,IAAK,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,KAAA;AACrF,EAAA,OAAO,qBAAA,CAAsB,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA,IAAK,YAAA;AACrD;AAGO,SAAS,iBACd,KAAA,EACA,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,IACZ,MAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,UAAU,aAAA,CAAc,KAAA,CAAM,MAAM,IAAI,CAAA,IAAK,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,KAAA;AACrF,EAAA,OAAO,uBAAuB,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,YAAY,CAAA;AACjE;;;AC5BO,IAAM,mBAAA,GAAN,cAAkC,SAAA,CAAU;AAAA,EACjD,OAAgB,EAAA,GAAK,iBAAA;AAAA,EAEZ,QAAQ,KAAA,EAAuC;AACtD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACtC,IAAA,MAAM,YAAY,aAAA,GAAgB,IAAA;AAClC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAoB;AACjD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAoC;AACxE,IAAA,MAAM,OAAkB,EAAC;AAEzB,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,MAAA,IAAI,eAAe,KAAA,EAAoB,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,SAAS,CAAA,EAAG;AAC7D,QAAA,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,IAAI,CAAA;AAAA,EACnC;AAAA,EAES,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,aAAA,EAAc,EAAG;AACrC,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,IAAI,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,MAAA,CAAO,OAAiC,EAAA,EAAmB;AAClE,IAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAC/B,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EACnC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAmB;AAC3C,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EACnC;AACF;;;ACpDO,IAAM,kBAAA,GAAN,cAAiC,SAAA,CAAU;AAAA,EAChD,OAAgB,EAAA,GAAK,gBAAA;AAAA,EAEb,UAAqB,EAAC;AAAA,EAErB,QAAQ,KAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,UAAU,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,oBAAoB,CAAA;AACnD,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAES,aAAA,GAAsB;AAAE,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EAAG;AAAA,EACtC,WAAA,GAAoB;AAAE,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EAAG;AAAA,EAErC,MAAA,GAAe;AAAE,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAAA,EAAG;AAAA,EACnD,QAAA,GAAiB;AAAE,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EAAG;AAAA;AAAA;AAAA,EAIxD,KAAA,GAAc;AACpB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACtC,IAAA,MAAM,YAAY,aAAA,GAAgB,IAAA;AAClC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAoB;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,oBAAA,EAAqB;AACpD,IAAA,MAAM,SAAS,IAAI,GAAA,CAAa,IAAA,CAAK,MAAA,CAAO,oBAAoB,CAAA;AAEhE,IAAA,MAAM,SAAA,GAAY,UAAU,QAAA,CAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,oBAAoB,SAAS,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,KAAA,CAC5B,mCAAA,EAAoC,CACpC,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAEjC,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,MAAA,IAAI,gBAAA,CAAiB,KAAA,EAAoB,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,EAAG;AACjF,QAAA,MAAA,CAAO,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,CAAC,GAAG,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGQ,MAAA,GAAe;AACrB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAmB;AAC3C,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAAA,IACpC;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAC/B,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EACnC;AACF;;;ACvDO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AACvB;;;ACFO,IAAM,aAAA,GAAN,cAA4B,SAAA,CAAU;AAAA,EAC3C,OAAgB,EAAA,GAAK,WAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,IAAI,CAAA;AAAA,EAC3C;AACF;;;ACHO,IAAM,iBAAA,GAAN,cAAgC,SAAA,CAAU;AAAA,EAC/C,OAAgB,EAAA,GAAK,eAAA;AAAA,EAEb,UAAA,GAAsC,IAAA;AAAA,EAErC,QAAQ,IAAA,EAAsC;AACrD,IAAA,MAAM,QAAA,GAAW,IAAA;AACjB,IAAA,MAAM,OAAA,GAAU,UAAU,OAAA,IAAW,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,UAAU,OAAA,IAAW,CAAA;AACrC,IAAA,IAAA,CAAK,aAAa,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,EACzE;AAAA,EAES,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,SAAS,OAAO,CAAA;AAC9D,IAAA,IAAA,CAAK,MAAA,CAAO,YAAY,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAA;AAAA,EACtD;AAAA,EAEA,aAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,EACjC;AAAA,EAES,MAAA,GAAe;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACpB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,EACjC;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,EACjC;AACF;;;ACWA,IAAM,cAAA,GAAiB,cAAA;AAEvB,SAASA,YAAc,KAAA,EAAa;AAClC,EAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,IAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;AAEA,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,OAAOA,YAAW,KAAkB,CAAA;AACtC;AAEO,SAAS,0BAA0B,QAAA,EAA0D;AAClG,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,QAAA,CAAS,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,EAAE,KAAK,IAAI,CAAA;AACpF,EAAA,MAAM,UAAA,GAA+B;AAAA,IACnC,EAAA,EAAI,cAAA;AAAA,IACJ,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,SAAS,IAAA,CAAK,EAAA;AAAA,IACtB,QAAA;AAAA,IACA,eAAA,EAAiB,CAAC,GAAG,QAAA,CAAS,KAAK,eAAe;AAAA,GACpD;AACA,EAAA,MAAM,eAAoC,QAAA,CACvC,GAAA,CAAI,CAAC,OAAA,KAAY,QAAA,CAAS,KAAK,MAAA,CAAO,OAAO,CAAC,CAAA,CAC9C,MAAA,CAAO,CAAC,KAAA,KAA0B,KAAA,IAAS,IAAI,CAAA,CAC/C,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACf,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,QAAA,EAAU,OAAA;AAAA,IACV,KAAA,EAAO,YAAY,KAAK;AAAA,GAC1B,CAAE,CAAA;AAEJ,EAAA,OAAO,CAAC,UAAA,EAAY,GAAG,YAAY,CAAA;AACrC;AAEO,SAAS,0BAA0B,OAAA,EAAgE;AACxG,EAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAuC,MAAA,CAAO,aAAa,MAAM,CAAA;AAClG,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAA+B;AAC1D,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAC/B,MAAA,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,QAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,OAAA,IAAW,WAAW,QAAA,EAAU;AACzC,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAA,CAAO,OAAO,CAAA,GAAI,WAAA,CAAY,WAAA,CAAY,KAAK,CAAA;AAC/C,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,IAAI,UAAA,CAAW,MAAA;AAAA,MACf,MAAA;AAAA,MACA,eAAA,EAAiB,CAAC,GAAG,UAAA,CAAW,eAAe,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY,MAAA,CAAO,OAAO,CAAA,IAAK,IAAI;AAAA,KAC9F;AAAA,IACA;AAAA,GACF;AACF;;;AChFA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAM,kBAAA,GAAqB,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAChE,IAAM,mBAAA,GAAsB,GAAA;AAE5B,SAAS,aAAA,GAAyB;AAChC,EAAA,cAAA,IAAkB,CAAA;AAClB,EAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,EAAI,cAAA,CAAe,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC9F;AAEA,SAAS,sBAAsB,QAAA,EAA0D;AACvF,EAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,IAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC5C;AAEA,SAAS,yBAAA,CAA0B,MAA8B,KAAA,EAAwC;AACvG,EAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,KAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,OAAO,KAAA;AACzD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACxE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGO,IAAM,SAAN,MAAa;AAAA,EACT,KAAA,GAAuB,IAAI,aAAA,EAAc;AAAA,EACzC,KAAA,GAAsB,IAAI,YAAA,EAAa;AAAA,EACvC,KAAA,GAAqB,IAAI,WAAA,EAAY;AAAA,EACrC,QAAA,GAA2B,IAAI,cAAA,EAAe;AAAA,EACvD,WAAqB,cAAA,EAAe;AAAA,EAC3B,OAAA;AAAA;AAAA,EAED,SAAA,GAAsF;AAAA,IAC5F,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACiB,gBAAA;AAAA,EACA,SAAA,uBAAgB,GAAA,EAAoB;AAAA,EACpC,gBAAA,uBAAuB,GAAA,EAAoB;AAAA,EACpD,YAAsC,EAAC;AAAA,EACvC,YAAsC,EAAC;AAAA,EACvC,oBAAA;AAAA,EACA,sBAAA,GAAyB,KAAA;AAAA,EACzB,iBAAA,GAAoB,CAAA;AAAA,EACpB,yBAAA,GAA2D,IAAA;AAAA,EAC3D,mBAAA,GAAsB,KAAA;AAAA;AAAA,EAG9B,WAAA,CAAY,IAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,mBAAA,EAAqB,IAAA,CAAK,uBAAuB,qBAAA,EAAuB,SAAA,EAAW,KAAK,SAAA,EAAU;AACnH,IAAA,IAAA,CAAK,oBAAA,GAAuB,KAAK,mBAAA,EAAoB;AACrD,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM;AACtB,MAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,GAAmB;AAAA,MACtB,UAAA,EAAY,CAAC,EAAA,EAAI,IAAA,KAAS,KAAK,KAAA,CAAM,UAAA,CAAW,IAAI,IAAI;AAAA,KAC1D;AACA,IAAA,KAAA,MAAW,WAAA,IAAe,IAAA,CAAK,yBAAA,EAA0B,EAAG;AAC1D,MAAA,IAAA,CAAK,uBAAuB,WAAW,CAAA;AAAA,IACzC;AACA,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,eAAA,IAAmB,EAAC,EAAG;AACnD,MAAA,IAAA,CAAK,uBAAuB,UAAU,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,aAAA,IAAiB,KAAK,CAAA;AAC/C,IAAA,IAAA,CAAK,oBAAA,GAAuB,KAAK,mBAAA,EAAoB;AAAA,EACvD;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,MAAM,YAAA,GAAe,KAAK,mBAAA,EAAoB;AAC9C,IAAA,MAAM,mBAAmB,IAAA,CAAK,oBAAA;AAC9B,IAAA,IAAA,CAAK,oBAAA,GAAuB,YAAA;AAE5B,IAAA,IAAI,IAAA,CAAK,sBAAA,IAA0B,yBAAA,CAA0B,gBAAA,EAAkB,YAAY,CAAA,EAAG;AAC5F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,oBAAoB,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,qBAAA,CAAsB,gBAAgB,CAAC,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,mBAAA,EAAqB;AAC/C,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,SAAS,mBAAmB,CAAA;AAAA,IACtE;AACA,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEA,uBAAuB,cAAA,EAAsC;AAC3D,IAAA,KAAA,MAAW,gBAAA,IAAoB,eAAe,iBAAA,EAAmB;AAC/D,MAAA,IAAA,CAAK,MAAM,aAAA,CAAc,IAAI,iBAAiB,IAAA,CAAK,gBAAA,EAAkB,IAAI,CAAC,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,cAAA,CAAe,EAAA,EAAI,eAAe,cAAc,CAAA;AAAA,EAC1E;AAAA,EAEQ,yBAAA,GAA8C;AACpD,IAAA,OAAO;AAAA,MACL,EAAE,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,YAAA,CAAa,IAAI,iBAAA,EAAmB,CAAC,YAAA,EAAc,eAAe,CAAA,EAAE;AAAA,MACjG,EAAE,EAAA,EAAI,QAAA,EAAU,cAAA,EAAgB,eAAA,CAAgB,IAAI,iBAAA,EAAmB,CAAC,eAAA,EAAiB,kBAAkB,CAAA,EAAE;AAAA,MAC7G,EAAE,EAAA,EAAI,QAAA,EAAU,cAAA,EAAgB,eAAA,CAAgB,IAAI,iBAAA,EAAmB,CAAC,eAAA,EAAiB,kBAAkB,CAAA,EAAE;AAAA,MAC7G,EAAE,EAAA,EAAI,QAAA,EAAU,cAAA,EAAgB,eAAA,CAAgB,EAAA,EAAI,iBAAA,EAAmB,CAAC,eAAA,EAAiB,mBAAA,EAAqB,kBAAkB,CAAA,EAAE;AAAA,MAClI,EAAE,IAAI,QAAA,EAAU,cAAA,EAAgB,gBAAgB,EAAA,EAAI,iBAAA,EAAmB,CAAC,eAAe,CAAA,EAAE;AAAA,MACzF,EAAE,EAAA,EAAI,MAAA,EAAQ,cAAA,EAAgB,aAAA,CAAc,IAAI,iBAAA,EAAmB,CAAC,aAAA,EAAe,iBAAiB,CAAA;AAAE,KACxG;AAAA,EACF;AAAA,EAEA,aAAA,GAAyB;AAAE,IAAA,OAAO,aAAA,EAAc;AAAA,EAAG;AAAA,EACnD,YAAA,GAAuB;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EAAM;AAAA,EACpD,SAAS,EAAA,EAAgC;AAAE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA;AAAA,EAAG;AAAA,EAC3E,YAAY,KAAA,EAAoB;AAAE,IAAA,IAAA,CAAK,KAAA,CAAM,YAAY,KAAK,CAAA;AAAA,EAAG;AAAA,EAEjE,aACE,QAAA,EACM;AACN,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,EAAE,EAAE,CAAA;AACzC,MAAA,IAAI,QAAA,IAAY,EAAE,KAAA,EAAO;AACvB,QAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,CAAE,EAAA,EAAI,EAAE,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA,CAAE,KAAA,IAAS,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,oBAAA,CAAqB,OAAkB,SAAA,EAAuB;AAC5D,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACvB,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACvB,GAAG,SAAA,CAAU;AAAA,KACf;AAAA,EACF;AAAA,EAEA,oBAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,oBAAA,EAAqB;AAAA,EAAG;AAAA,EACnE,0BAAA,GAA6B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,0BAAA,EAA2B;AAAA,EAAG;AAAA,EAC/E,mCAAA,GAAsC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,mCAAA,EAAoC;AAAA,EAAG;AAAA,EAEjG,kBAAA,GAAqB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,kBAAA,EAAmB;AAAA,EAAG;AAAA,EAC/D,iBAAiB,GAAA,EAAgB;AAAE,IAAA,IAAA,CAAK,KAAA,CAAM,iBAAiB,GAAG,CAAA;AAAA,EAAG;AAAA,EAErE,eAAe,EAAA,EAAY;AAAE,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,EAAE,CAAA;AAAG,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAAG;AAAA,EAC/E,gBAAA,GAA2B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,gBAAA,EAAiB;AAAA,EAAG;AAAA,EAEnE,mBAAA,GAAsB;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,SAAA,EAAU;AAAA,EAAG;AAAA,EACtD,oBAAoB,OAAA,EAA4F;AAC9G,IAAA,IAAA,CAAK,YAAY,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,GAAG,OAAA,EAAQ;AACjD,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,YAAY,OAAA,EAA4B;AACtC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,QAAA,CAAS,IAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,CAAA,EAAG,OAAA,CAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,CAAA;AAAA,MAC9B,CAAA,EAAG,OAAA,CAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,CAAA;AAAA,MAC9B,IAAA,EAAM,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,QAAQ,SAAS;AAAA,KACjD;AACA,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,KAAA,CAAM,IAAY,EAAA,EAAY;AAC5B,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,EAAA;AAAA,MACrB,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI;AAAA,KACtB,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CAAO,MAAA,EAAgB,OAAA,EAAiB,OAAA,EAAuB;AAC7D,IAAA,IAAA,CAAK,QAAA,GAAW,aAAa,IAAA,CAAK,QAAA,EAAU,QAAQ,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC5F,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,aAAa,GAAA,EAAsB;AACjC,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,aAAa,GAAG,CAAA;AAAA,EAC7B;AAAA,EAEA,mBAAA,GAA8C;AAC5C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,yBAAA,CAA0B,IAAA,CAAK,KAAA,CAAM,aAAa;AAAA,KAC7D;AAAA,EACF;AAAA,EAEA,qBAAqB,QAAA,EAAwC;AAC3D,IAAA,MAAM,gBAAA,GAAmB,yBAAA,CAA0B,QAAA,CAAS,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,yBAAyB,MAAM;AAAE,MAAA,IAAA,CAAK,KAAA,CAAM,aAAa,gBAAgB,CAAA;AAAA,IAAE,CAAC,CAAA;AAAA,EACnF;AAAA,EAEA,wBAAwB,IAAA,EAAqE;AAC3F,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,CAAA,EAAG,KAAK,QAAA,CAAS,CAAA;AAAA,QACjB,CAAA,EAAG,KAAK,QAAA,CAAS,CAAA;AAAA,QACjB,IAAA,EAAM,KAAK,QAAA,CAAS;AAAA,OACtB;AAAA,MACA,aAAA,EAAe,KAAK,gBAAA,EAAiB;AAAA,MACrC,SAAA,EAAW,KAAK,mBAAA,EAAoB;AAAA,MACpC,kBAAkB,CAAC,GAAI,IAAA,EAAM,gBAAA,IAAoB,EAAG;AAAA,KACtD;AAAA,EACF;AAAA,EAEA,yBAAyB,QAAA,EAAiD;AACxE,IAAA,IAAA,CAAK,WAAA,CAAY,SAAS,QAAQ,CAAA;AAClC,IAAA,IAAA,CAAK,mBAAA,CAAoB;AAAA,MACvB,KAAA,EAAO,SAAS,SAAA,CAAU,KAAA;AAAA,MAC1B,IAAA,EAAM,SAAS,SAAA,CAAU,IAAA;AAAA,MACzB,IAAA,EAAM,QAAA,CAAS,SAAA,CAAU,IAAA,IAAQ,MAAA;AAAA,MACjC,IAAA,EAAM,SAAS,SAAA,CAAU;AAAA,KAC1B,CAAA;AACD,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,cAAA,CAAe,SAAS,aAAa,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,CAAC,GAAG,QAAA,CAAS,gBAAgB,CAAA;AAAA,EACtC;AAAA,EAEA,uBAAuB,IAAA,EAA+D;AACpF,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAK,mBAAA,EAAoB;AAAA,MACnC,KAAA,EAAO,IAAA,CAAK,uBAAA,CAAwB,IAAI;AAAA,KAC1C;AAAA,EACF;AAAA,EAEA,wBAAwB,QAAA,EAAoD;AAC1E,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,oBAAA,CAAqB,SAAS,QAAQ,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,QAAA,CAAS,KAAK,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,kBAAA,GAA4C;AAC1C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,qBAAqB,CAAA;AAAA,MACnD,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,qBAAqB;AAAA,KACrD;AAAA,EACF;AAAA,EAEA,oBAAoB,QAAA,EAA0D;AAC5E,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,OAAA,KAAY,CAAA,EAAG;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,CAAU,GAAA,CAAI,qBAAqB,CAAA,CAAE,KAAA,CAAM,CAAC,mBAAmB,CAAA;AACzF,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,CAAU,GAAA,CAAI,qBAAqB,CAAA,CAAE,KAAA,CAAM,CAAC,mBAAmB,CAAA;AACzF,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEA,iBAAA,GAA0B;AACxB,IAAA,IAAI,IAAA,CAAK,sBAAsB,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,yBAAA,GAA4B,qBAAA,CAAsB,IAAA,CAAK,oBAAoB,CAAA;AAChF,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,iBAAA,IAAqB,CAAA;AAAA,EAC5B;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAI,IAAA,CAAK,sBAAsB,CAAA,EAAG;AAClC,IAAA,IAAA,CAAK,iBAAA,IAAqB,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,oBAAoB,CAAA,EAAG;AAEhC,IAAA,MAAM,gBAAgB,IAAA,CAAK,yBAAA;AAC3B,IAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AACjC,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,MAAM,WAAA,GAAc,KAAK,mBAAA,EAAoB;AAC7C,IAAA,IAAA,CAAK,oBAAA,GAAuB,WAAA;AAC5B,IAAA,MAAM,oBAAoB,IAAA,CAAK,mBAAA,IAAuB,CAAC,yBAAA,CAA0B,eAAe,WAAW,CAAA;AAC3G,IAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,IAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,qBAAA,CAAsB,aAAa,CAAC,CAAA;AACxD,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,mBAAA,EAAqB;AAC/C,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,SAAS,mBAAmB,CAAA;AAAA,IACtE;AACA,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AAAA,EACjC;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AAAA,EACjC;AAAA,EAEA,IAAA,GAAgB;AACd,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,SAAA,CAAU,GAAA,EAAI;AAC5C,IAAA,IAAI,CAAC,kBAAkB,OAAO,KAAA;AAE9B,IAAA,MAAM,eAAA,GAAkB,KAAK,mBAAA,EAAoB;AACjD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,qBAAA,CAAsB,eAAe,CAAC,CAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,mBAAA,EAAqB;AAC/C,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,SAAS,mBAAmB,CAAA;AAAA,IACtE;AAEA,IAAA,IAAA,CAAK,qBAAqB,gBAAgB,CAAA;AAC1C,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAgB;AACd,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,GAAA,EAAI;AACxC,IAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAE1B,IAAA,MAAM,eAAA,GAAkB,KAAK,mBAAA,EAAoB;AACjD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,qBAAA,CAAsB,eAAe,CAAC,CAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,mBAAA,EAAqB;AAC/C,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,SAAS,mBAAmB,CAAA;AAAA,IACtE;AAEA,IAAA,IAAA,CAAK,qBAAqB,YAAY,CAAA;AACtC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAA,EAAsC;AAC3C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA,EAEA,cAAc,QAAA,EAAsC;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAClC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,YAAA,CAAa,SAAiB,OAAA,EAA2C;AACvE,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,OAAO,GAAA,EAA+B;AACpC,IAAA,MAAM,MAAA,GAAS,KAAK,0BAAA,EAA2B;AAC/C,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAClD;AAAA,EAEQ,UAAA,GAAa;AACnB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,iBAAA,GAAoB;AAC1B,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,gBAAA,EAAkB;AAC5C,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,yBAAyB,EAAA,EAAsB;AACrD,IAAA,MAAM,gBAAgB,IAAA,CAAK,sBAAA;AAC3B,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,IAAA,IAAI;AACF,MAAA,EAAA,EAAG;AAAA,IACL,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,sBAAA,GAAyB,aAAA;AAC9B,MAAA,IAAA,CAAK,oBAAA,GAAuB,KAAK,mBAAA,EAAoB;AAAA,IACvD;AAAA,EACF;AACF;;;AC9YO,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,OAAO,IAAA,KAAS,QAAA;AAClB;AAEO,SAASC,gBAAe,KAAA,EAAmC;AAChE,EAAA,MAAM,MAAA,GAAS,mBAAmB,KAAA,CAAM,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACxE,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAE;AAAA,EACtE;AAEA,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,IAAA,GAAO,IAAA;AAEX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,MAAA,GAAA,CAAU,cAAc,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,IAAK,GAAA,IAAO,MAAM,KAAA,CAAM,KAAA;AACtE,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAO;AAC9F;AAEO,SAAS,wBAAA,CACd,GACA,CAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACvB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACvB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACvB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC;AAAA,GACzB;AACF;AAEO,SAAS,kBAAA,CAAmB,MAAA,EAAyB,CAAA,EAAW,CAAA,EAAoB;AACzF,EAAA,OAAO,CAAA,IAAK,MAAA,CAAO,IAAA,IAAQ,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,IAAK,MAAA,CAAO,IAAA,IAAQ,CAAA,IAAK,MAAA,CAAO,IAAA;AACjF;AAEO,SAAS,eAAA,CAAgB,GAAoB,CAAA,EAA6B;AAC/E,EAAA,OAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,EAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA;AACjF;AAEO,SAAS,WAAA,CAAY,KAAA,EAAiC,MAAA,EAAkC,OAAA,EAAiB;AAC9G,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAC1B,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAAA,IAC5B,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK;AAAA,GAC9B;AACF;AAEO,SAAS,uBAAA,CAAwB,QAAgB,GAAA,EAAiD;AACvG,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgC;AACtD,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AACrC,IAAA,SAAA,CAAU,IAAI,EAAA,EAAI;AAAA,MAChB,GAAG,KAAA,CAAM,CAAA;AAAA,MACT,GAAG,KAAA,CAAM,CAAA;AAAA,MACT,UAAU,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC3C,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,MAAA,EAAQ,YAAA,CAAa,GAAA,CAAI,IAAI;AAAA,OAC/B,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,mBAAA,CAAoB,QAAgB,GAAA,EAAwD;AAC1G,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuC;AAC7D,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,SAAA,CAAU,GAAA,CAAI,IAAI,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,QAAgB,KAAA,EAAiC;AAClF,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,IAAA;AACnC,EAAA,MAAM,MAAA,GAAS,OAAO,mCAAA,EAAoC;AAG1D,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,CAAA,GAAIA,gBAAe,KAAK,CAAA;AAC9B,IAAA,IACE,kBAAA;AAAA,MACE;AAAA,QACE,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,GAAO;AAAA,OACjB;AAAA,MACA,KAAA,CAAM,CAAA;AAAA,MACN,KAAA,CAAM;AAAA,KACR,EACA;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sBAAA,CAAuB,QAAgB,GAAA,EAAwC;AAC7F,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE7B,EAAA,IAAI,KAAA,GAAgC,IAAA;AACpC,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AACrC,IAAA,MAAM,CAAA,GAAIA,gBAAe,KAAK,CAAA;AAC9B,IAAA,KAAA,GAAQ,KAAA,GACJ;AAAA,MACE,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,MACjC,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,MACjC,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,MACjC,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI;AAAA,KACnC,GACA,CAAA;AAAA,EACN;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,QAAgB,MAAA,EAAoC;AACpF,EAAA,OAAO,MAAA,CACJ,0BAAA,EAA2B,CAC3B,MAAA,CAAO,CAAC,UAA8B,KAAA,CAAM,IAAA,KAAS,MAAM,CAAA,CAC3D,MAAA,CAAO,CAAC,UAAU,eAAA,CAAgBA,eAAAA,CAAe,KAAK,CAAA,EAAG,MAAM,CAAC,EAChE,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAA;AAC5B;AAEO,SAAS,SAAA,CACd,MAAA,EACA,cAAA,EACA,MAAA,EACA,MAAA,EACA;AACA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,cAAA,EAAgB;AACxC,IAAA,MAAA,CAAO,KAAA,CAAM,YAAY,EAAA,EAAI;AAAA,MAC3B,CAAA,EAAG,MAAM,CAAA,GAAI,MAAA;AAAA,MACb,CAAA,EAAG,MAAM,CAAA,GAAI;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,SAAS,aAAA,CACd,MAAA,EACA,WAAA,EACA,MAAA,EACA,KAAA,EACA;AACA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,QAAQ,CAAA,IAAK,WAAA,EAAa;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAErC,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAE,EAAG,MAAA,EAAQ,KAAK,CAAA;AAEjF,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACnD,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,IAAA,EAAM,YAAA;AAAA,QACJ,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,EAAA,KAAO;AACzB,UAAA,MAAM,QAAA,GAAW,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,EAAA,CAAG,CAAA,EAAE;AAC9D,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AACnD,UAAA,OAAO;AAAA,YACL,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,aAAA,CAAc,CAAA;AAAA,YAC7B,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,aAAA,CAAc,CAAA;AAAA,YAC7B,GAAG,EAAA,CAAG;AAAA,WACR;AAAA,QACF,CAAC;AAAA;AACH,KACF,CAAE,CAAA;AAEF,IAAA,MAAA,CAAO,KAAA,CAAM,YAAY,EAAA,EAAI;AAAA,MAC3B,GAAG,aAAA,CAAc,CAAA;AAAA,MACjB,GAAG,aAAA,CAAc,CAAA;AAAA,MACjB,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,OAAO,QAAA;AAAS,KACnC,CAAA;AAAA,EACH;AACF;AAEO,SAAS,YACd,MAAA,EACA,MAAA,EACA,WAAA,EACA,WAAA,EACA,SACA,eAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAU,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,IAAA;AACpC,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAQ,WAAA,CAAY,IAAA,GAAO,YAAY,IAAI,CAAA;AACnE,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAQ,WAAA,CAAY,IAAA,GAAO,YAAY,IAAI,CAAA;AACnE,EAAA,MAAM,cAAc,MAAA,GAAS,MAAA;AAE7B,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AACvB,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AACvB,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AACvB,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AAEvB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA;AAGJ,EAAA,IAAI,eAAA,EAAiB;AAEnB,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAO,IAAI,CAAA;AACzC,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAO,IAAI,CAAA;AAEzC,IAAA,IAAI,KAAA,GAAQ,QAAQ,WAAA,EAAa;AAC/B,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,KAAA,GAAQ,OAAA;AACR,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,KAAA,GAAQ,OAAA;AACR,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB;AAEA,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,MAAM,SAAA,GAA6B,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAK;AAC5D,EAAA,MAAM,EAAA,GAAA,CAAM,SAAA,CAAU,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,MAAA;AAC/C,EAAA,MAAM,EAAA,GAAA,CAAM,SAAA,CAAU,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,MAAA;AAE/C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,QAAQ,CAAA,IAAK,WAAA,EAAa;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AACrC,IAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,GAAA,CAAQ,QAAA,CAAS,CAAA,GAAI,YAAY,IAAA,IAAQ,EAAA;AACjE,IAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,GAAA,CAAQ,QAAA,CAAS,CAAA,GAAI,YAAY,IAAA,IAAQ,EAAA;AACjE,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACnD,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,IAAA,EAAM,YAAA;AAAA,QACJ,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACzB,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,UACT,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,UACT,GAAG,CAAA,CAAE;AAAA,SACP,CAAE;AAAA;AACJ,KACF,CAAE,CAAA;AAEF,IAAA,MAAA,CAAO,KAAA,CAAM,YAAY,EAAA,EAAI;AAAA,MAC3B,CAAA,EAAG,KAAA;AAAA,MACH,CAAA,EAAG,KAAA;AAAA,MACH,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,OAAO,QAAA;AAAS,KACnC,CAAA;AAAA,EACH;AACF","file":"index.js","sourcesContent":["// Unique id assigned for each shape\nexport type ShapeId = string;\n\n// Point with optional pressure (z) for styluses\nexport interface Vec3 {\n x: number;\n y: number;\n z?: number;\n}\n\n// Segment of draw strokes can be free (curved) or straight\nexport type SegmentType = 'free' | 'straight';\n\nexport interface DrawSegment {\n type: SegmentType;\n path: string; // base64-encoded points for storage\n}\n\n// Available sizes for strokes\nexport type SizeStyle = 's' | 'm' | 'l' | 'xl';\n\n// Available dash styles for drawing\nexport type DashStyle = 'draw' | 'solid' | 'dashed' | 'dotted';\n\n// Fill styles used by shapes\nexport type FillStyle = 'none' | 'semi' | 'solid' | 'blank';\n\n// Color styles (css-compatible or by palette key)\nexport type ColorStyle = string;\n\n// A single draw shape (stroke)\nexport interface DrawShape {\n id: ShapeId;\n type: 'draw';\n x: number;\n y: number;\n props: {\n color: ColorStyle;\n dash: DashStyle;\n fill?: FillStyle;\n size: SizeStyle;\n scale: number;\n isPen: boolean;\n isComplete: boolean;\n segments: DrawSegment[];\n isClosed?: boolean;\n };\n}\n\nexport type Shape = DrawShape;\n\n// Page holds shapes and camera state\nexport interface PageState {\n id: string;\n shapes: Record<ShapeId, Shape>;\n erasingShapeIds: ShapeId[];\n}\n\n// Stroke sizes in px\nexport const STROKE_WIDTHS: Record<SizeStyle, number> = {\n s: 2,\n m: 3.5,\n l: 5,\n xl: 10,\n};\n\n// Default drag distance squared for segment-mode transitions\nexport const DRAG_DISTANCE_SQUARED = 36;\n\n// Default colors\nexport const DEFAULT_COLORS: Record<string, string> = {\n black: '#1d1d1d',\n grey: '#9fa8b2',\n 'light-violet': '#e085f4',\n violet: '#ae3ec9',\n blue: '#4465e9',\n 'light-blue': '#4ba1f1',\n yellow: '#f1ac4b',\n orange: '#e16919',\n green: '#099268',\n 'light-green': '#4cb05e',\n 'light-red': '#f87777',\n red: '#e03131',\n white: '#ffffff',\n};\n\n// Max points per single stroke before starting a new shape\nexport const MAX_POINTS_PER_SHAPE = 200;\n","import type { Vec3 } from '../types.js';\n\n// Encode points to base64 path (x,y,z alternating)\nexport function encodePoints(points: Vec3[]): string {\n const arr: number[] = [];\n for (const p of points) {\n arr.push(p.x, p.y, p.z ?? 0.5);\n }\n return btoa(JSON.stringify(arr));\n}\n\n// Decode path string to points in local shape space\nexport function decodePoints(path: string): Vec3[] {\n try {\n const arr = JSON.parse(atob(path)) as number[];\n const out: Vec3[] = [];\n for (let i = 0; i < arr.length; i += 3) {\n out.push({\n x: arr[i] ?? 0,\n y: arr[i + 1] ?? 0,\n z: arr[i + 2],\n });\n }\n return out;\n } catch {\n return [];\n }\n}\n\nexport function decodeFirstPoint(path: string): Vec3 | null {\n const pts = decodePoints(path);\n return pts.length > 0 ? pts[0]! : null;\n}\n\nexport function decodeLastPoint(path: string): Vec3 | null {\n const pts = decodePoints(path);\n return pts.length > 0 ? pts[pts.length - 1]! : null;\n}\n\n// Decode segments to flat list of page-space points to render\nexport function decodePathToPoints(\n segments: { path: string }[],\n ox: number,\n oy: number\n): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n for (const seg of segments) {\n const pts = decodePoints(seg.path);\n for (const p of pts) {\n out.push({ x: ox + p.x, y: oy + p.y });\n }\n }\n return out;\n}\n\n","import type { PageState, Shape, ShapeId } from '../types.js';\nimport { STROKE_WIDTHS } from '../types.js';\nimport { decodePathToPoints } from '../utils/pathCodec.js';\nimport type { DocumentStoreSnapshot } from '../persistence/snapshots.js';\n\ntype DocumentStoreListener = () => void;\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\n// In-memory document store for current page\nexport class DocumentStore {\n private state: PageState = {\n id: 'page-1',\n shapes: {},\n erasingShapeIds: [],\n };\n private order: ShapeId[] = [];\n private readonly listeners = new Set<DocumentStoreListener>();\n\n getPage(): PageState {\n return this.state;\n }\n\n getShape(id: ShapeId): Shape | undefined {\n return this.state.shapes[id];\n }\n\n // Shapes organised in sorted order (first at bottom)\n getCurrentPageShapesSorted(): Shape[] {\n const list = this.order.length > 0 ? this.order : Object.keys(this.state.shapes);\n return list\n .map((id) => this.state.shapes[id])\n .filter((s): s is Shape => s != null);\n }\n\n // Shapes in reverse order (topmost first) for hit-testing\n getCurrentPageRenderingShapesSorted(): Shape[] {\n return [...this.getCurrentPageShapesSorted()].reverse();\n }\n\n getErasingShapeIds(): ShapeId[] {\n return [...this.state.erasingShapeIds];\n }\n\n setErasingShapes(ids: ShapeId[]): void {\n this.state.erasingShapeIds = ids;\n this.emitChange();\n }\n\n createShape(shape: Shape): void {\n this.state.shapes[shape.id] = shape;\n this.order.push(shape.id);\n this.emitChange();\n }\n\n updateShape(id: ShapeId, partial: Partial<Shape>): void {\n const existing = this.state.shapes[id];\n if (!existing) return;\n this.state.shapes[id] = { ...existing, ...partial, id };\n this.emitChange();\n }\n\n deleteShapes(ids: ShapeId[]): void {\n for (const id of ids) {\n delete this.state.shapes[id];\n this.order = this.order.filter((i) => i !== id);\n }\n this.state.erasingShapeIds = this.state.erasingShapeIds.filter((i) => !ids.includes(i));\n this.emitChange();\n }\n\n getCurrentPageShapes(): Shape[] {\n return Object.values(this.state.shapes);\n }\n\n // Shape IDs whose bounds intersect the given box for eraser line-segment hit\n getShapeIdsInBounds(box: { minX: number; minY: number; maxX: number; maxY: number }): Set<ShapeId> {\n const ids = new Set<ShapeId>();\n for (const shape of this.getCurrentPageShapesSorted()) {\n const b = getShapeBounds(shape);\n if (\n b.maxX >= box.minX &&\n b.minX <= box.maxX &&\n b.maxY >= box.minY &&\n b.minY <= box.maxY\n ) {\n ids.add(shape.id);\n }\n }\n return ids;\n }\n\n getSnapshot(): DocumentStoreSnapshot {\n return {\n page: cloneValue(this.state),\n order: [...this.order],\n };\n }\n\n // Load snapshot into the document when loading a persistence snapshot (so on page reload)\n loadSnapshot(snapshot: DocumentStoreSnapshot): void {\n const pageState = cloneValue(snapshot.page);\n const normalizedOrder = [...snapshot.order].filter((shapeId) => pageState.shapes[shapeId] != null);\n const orderedSet = new Set(normalizedOrder);\n for (const shapeId of Object.keys(pageState.shapes)) {\n if (!orderedSet.has(shapeId)) {\n normalizedOrder.push(shapeId);\n }\n }\n this.state = {\n id: pageState.id,\n shapes: pageState.shapes,\n erasingShapeIds: pageState.erasingShapeIds.filter((shapeId) => pageState.shapes[shapeId] != null),\n };\n this.order = normalizedOrder;\n this.emitChange();\n }\n\n listen(listener: DocumentStoreListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emitChange(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n\nfunction getShapeBounds(shape: Shape): { minX: number; minY: number; maxX: number; maxY: number } {\n if (shape.type !== 'draw') {\n return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n }\n const pts = decodePathToPoints(shape.props.segments, shape.x, shape.y);\n if (pts.length === 0) return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n let minX = pts[0]!.x;\n let minY = pts[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (const p of pts) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n const stroke = STROKE_WIDTHS[shape.props.size] * shape.props.scale;\n return { minX: minX - stroke, minY: minY - stroke, maxX: maxX + stroke, maxY: maxY + stroke };\n}\n","import type { IEditor } from '../editor/editorTypes.js';\nimport type { Vec3 } from '../types.js';\n\n// Types for tool state events\nexport interface ToolPointerDownInfo {\n point: Vec3;\n screenX?: number;\n screenY?: number;\n}\n\nexport interface ToolPointerMoveInfo {\n screenDeltaX?: number;\n screenDeltaY?: number;\n screenX?: number;\n screenY?: number;\n}\n\nexport interface ToolKeyInfo {\n key: string;\n}\n\nexport type ToolStateTransitionInfo = | ToolPointerDownInfo | ToolPointerMoveInfo | ToolKeyInfo;\n\nexport interface ToolStateContext {\n transition(stateId: string, info?: ToolStateTransitionInfo): void;\n}\n\nexport interface StateNodeConstructor {\n id: string;\n new (ctx: ToolStateContext, editor: IEditor): StateNode;\n}\n\n// State node in the tool state machine\nexport abstract class StateNode {\n static id: string = 'base';\n\n constructor(\n protected ctx: ToolStateContext,\n protected editor: IEditor\n ) {}\n\n onEnter(_info?: ToolStateTransitionInfo): void {}\n onExit(_info?: ToolStateTransitionInfo, _to?: string): void {}\n onPointerDown(_info?: ToolPointerDownInfo): void {}\n onPointerMove(_info?: ToolPointerMoveInfo): void {}\n onPointerUp(): void {}\n onKeyDown(_info?: ToolKeyInfo): void {}\n onKeyUp(_info?: ToolKeyInfo): void {}\n onCancel(): void {}\n onInterrupt(): void {}\n}\n","// Viewport: pan (x,y) and zoom\nexport interface Viewport {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport function createViewport(): Viewport {\n return { x: 0, y: 0, zoom: 1 };\n}\n\n// Screen point to page point\nexport function screenToPage(viewport: Viewport, screenX: number, screenY: number): { x: number; y: number } {\n return {\n x: (screenX - viewport.x) / viewport.zoom,\n y: (screenY - viewport.y) / viewport.zoom,\n };\n}\n\n// Page point to screen point\nexport function pageToScreen(viewport: Viewport, pageX: number, pageY: number): { x: number; y: number } {\n return {\n x: pageX * viewport.zoom + viewport.x,\n y: pageY * viewport.zoom + viewport.y,\n };\n}\n\nexport function setViewport(\n viewport: Viewport,\n updater: { x?: number; y?: number; zoom?: number }\n): Viewport {\n return {\n x: updater.x ?? viewport.x,\n y: updater.y ?? viewport.y,\n zoom: updater.zoom ?? viewport.zoom,\n };\n}\n\nexport function panViewport(viewport: Viewport, dx: number, dy: number): Viewport {\n return { ...viewport, x: viewport.x + dx, y: viewport.y + dy };\n}\n\nexport interface ZoomRange {\n min: number;\n max: number;\n}\n\nexport const DEFAULT_ZOOM_RANGE: ZoomRange = { min: 0.1, max: 4 };\n\nexport function clampZoom(zoom: number, range?: ZoomRange): number {\n const { min, max } = range ?? DEFAULT_ZOOM_RANGE;\n return Math.max(min, Math.min(max, zoom));\n}\n\nexport function zoomViewport(viewport: Viewport, factor: number, centerX?: number, centerY?: number, zoomRange?: ZoomRange): Viewport {\n const zoom = clampZoom(viewport.zoom * factor, zoomRange);\n if (centerX == null || centerY == null) {\n return { ...viewport, zoom };\n }\n const pageBefore = screenToPage(viewport, centerX, centerY);\n const x = centerX - pageBefore.x * zoom;\n const y = centerY - pageBefore.y * zoom;\n return { x, y, zoom };\n}\n","import type { Viewport } from './viewport.js';\n\nconst VELOCITY_LERP_FACTOR = 0.5; // How much to blend new velocity into the current velocity (linear interpolation)\nconst VELOCITY_ZERO_THRESHOLD = 0.01; // The velocity is considered zero if it's less than this threshold\n\nexport interface CameraPanSession {\n initialViewportX: number;\n initialViewportY: number;\n originScreenX: number;\n originScreenY: number;\n velocityX: number;\n velocityY: number;\n previousScreenX: number;\n previousScreenY: number;\n lastMoveTime: number;\n}\n\nexport function beginCameraPan(\n viewport: Viewport,\n screenX: number,\n screenY: number\n): CameraPanSession {\n return {\n initialViewportX: viewport.x,\n initialViewportY: viewport.y,\n originScreenX: screenX,\n originScreenY: screenY,\n velocityX: 0,\n velocityY: 0,\n previousScreenX: screenX,\n previousScreenY: screenY,\n lastMoveTime: performance.now(),\n };\n}\n\n// Calculates target viewport position from session origin and updates session velocity\nexport function moveCameraPan(\n session: CameraPanSession,\n currentScreenX: number,\n currentScreenY: number\n): { x: number; y: number } {\n const now = performance.now();\n const elapsed = now - session.lastMoveTime;\n\n if (elapsed > 0) {\n const moveDx = currentScreenX - session.previousScreenX;\n const moveDy = currentScreenY - session.previousScreenY;\n const moveLen = Math.hypot(moveDx, moveDy);\n\n if (moveLen > 0) {\n const dirX = moveDx / moveLen;\n const dirY = moveDy / moveLen;\n const speed = moveLen / elapsed;\n session.velocityX += (dirX * speed - session.velocityX) * VELOCITY_LERP_FACTOR;\n session.velocityY += (dirY * speed - session.velocityY) * VELOCITY_LERP_FACTOR;\n }\n\n if (Math.abs(session.velocityX) < VELOCITY_ZERO_THRESHOLD) session.velocityX = 0;\n if (Math.abs(session.velocityY) < VELOCITY_ZERO_THRESHOLD) session.velocityY = 0;\n }\n\n session.previousScreenX = currentScreenX;\n session.previousScreenY = currentScreenY;\n session.lastMoveTime = now;\n\n return {\n x: session.initialViewportX + (currentScreenX - session.originScreenX),\n y: session.initialViewportY + (currentScreenY - session.originScreenY),\n };\n}\n\nconst SLIDE_FRICTION = 0.92;\nconst SLIDE_MIN_SPEED = 0.01;\nconst SLIDE_MAX_SPEED = 2;\nconst SLIDE_MIN_VELOCITY_TO_START = 0.1;\n\nexport interface CameraSlideAnimation {\n stop: () => void;\n}\n\nexport interface CameraSlideOptions {\n friction?: number;\n}\n\n// Start a camera slide animation from the given session and apply the pan to the viewport\nexport function startCameraSlide(\n session: CameraPanSession,\n applyPan: (dx: number, dy: number) => void,\n onFrame: () => void,\n slideOptions?: CameraSlideOptions\n): CameraSlideAnimation | null {\n const friction = slideOptions?.friction ?? SLIDE_FRICTION;\n const timeSinceLastMove = performance.now() - session.lastMoveTime;\n const FRAME_DURATION = 16;\n const decayFactor = Math.pow(1 - VELOCITY_LERP_FACTOR, timeSinceLastMove / FRAME_DURATION);\n const effectiveVx = session.velocityX * decayFactor;\n const effectiveVy = session.velocityY * decayFactor;\n\n const speed = Math.hypot(effectiveVx, effectiveVy);\n const clampedSpeed = Math.min(speed, SLIDE_MAX_SPEED);\n if (clampedSpeed < SLIDE_MIN_VELOCITY_TO_START) return null;\n\n const dirX = effectiveVx / speed;\n const dirY = effectiveVy / speed;\n let currentSpeed = clampedSpeed;\n let lastTime = performance.now();\n let rafId = 0;\n\n const tick = () => {\n const now = performance.now();\n const elapsed = now - lastTime;\n lastTime = now;\n\n applyPan(dirX * currentSpeed * elapsed, dirY * currentSpeed * elapsed);\n onFrame();\n\n currentSpeed *= friction;\n\n if (currentSpeed < SLIDE_MIN_SPEED) {\n rafId = 0;\n return;\n }\n\n rafId = requestAnimationFrame(tick);\n };\n\n rafId = requestAnimationFrame(tick);\n\n return {\n stop() {\n if (rafId !== 0) {\n cancelAnimationFrame(rafId);\n rafId = 0;\n }\n },\n };\n}","import { DEFAULT_COLORS } from '../types.js';\n\nexport type TsdrawRenderTheme = 'light' | 'dark';\n\nconst DARK_COLORS: Record<string, string> = {\n black: '#f0f0f0',\n grey: '#aeb8c2',\n 'light-violet': '#cf6ef5',\n violet: '#a83ce0',\n blue: '#5b7dff',\n 'light-blue': '#4fb3ff',\n yellow: '#f4b13a',\n orange: '#ef7a24',\n green: '#1fb27a',\n 'light-green': '#4ecb66',\n 'light-red': '#ff6f78',\n red: '#f24343',\n white: '#ffffff',\n};\n\nexport function resolveThemeColor(colorStyle: string, theme: TsdrawRenderTheme): string {\n const lightThemeColor = DEFAULT_COLORS[colorStyle];\n if (!lightThemeColor) return colorStyle;\n if (theme === 'light') return lightThemeColor;\n return DARK_COLORS[colorStyle] ?? lightThemeColor;\n}\n","import type { Viewport } from './viewport.js';\nimport type { Shape, DrawShape, FillStyle } from '../types.js';\nimport { STROKE_WIDTHS } from '../types.js';\nimport { decodePoints } from '../utils/pathCodec.js';\nimport { resolveThemeColor, type TsdrawRenderTheme } from '../utils/colors.js';\nimport { getStroke } from 'perfect-freehand';\n\n// Renderer interface: renders shapes given 2d canvas context and viewport\nexport interface ICanvasRenderer {\n render(ctx: CanvasRenderingContext2D, viewport: Viewport, shapes: Shape[]): void;\n}\n\n// Default canvas renderer: draws shapes using (optionally) pressure-based width for ipads and whatnot\nexport class CanvasRenderer implements ICanvasRenderer {\n private theme: TsdrawRenderTheme = 'light';\n\n setTheme(theme: TsdrawRenderTheme): void {\n this.theme = theme;\n }\n\n render(ctx: CanvasRenderingContext2D, viewport: Viewport, shapes: Shape[]): void {\n ctx.save();\n ctx.translate(viewport.x, viewport.y);\n ctx.scale(viewport.zoom, viewport.zoom);\n for (const shape of shapes) {\n if (shape.type === 'draw') {\n this.paintStroke(ctx, shape);\n }\n }\n ctx.restore();\n }\n\n // Paints a single stroke\n private paintStroke(ctx: CanvasRenderingContext2D, shape: DrawShape): void {\n const width = (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n const samples = flattenSegments(shape);\n if (samples.length === 0) return;\n const color = resolveThemeColor(shape.props.color, this.theme);\n const fillStyle = shape.props.fill ?? 'none';\n\n if (shape.props.isClosed && fillStyle !== 'none') {\n this.paintClosedShapeFill(ctx, samples, color, fillStyle);\n }\n\n if (shape.props.dash !== 'draw') {\n this.paintDashedStroke(ctx, samples, width, color, shape.props.dash);\n return;\n }\n\n const config = strokeConfig(shape, width);\n const outline = getStroke(\n samples.map((p) => [p.x, p.y, p.pressure] as [number, number, number]),\n config\n );\n if (outline.length === 0) return;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n const first = outline[0];\n if (!first) return;\n ctx.moveTo(first[0], first[1]);\n for (let i = 1; i < outline.length; i++) {\n const p = outline[i];\n if (p) ctx.lineTo(p[0], p[1]);\n }\n ctx.closePath();\n ctx.fill();\n }\n\n private paintDashedStroke(\n ctx: CanvasRenderingContext2D,\n samples: Array<{ x: number; y: number }>,\n width: number,\n color: string,\n dash: DrawShape['props']['dash']\n ): void {\n if (samples.length === 1) {\n const p = samples[0]!;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(p.x, p.y, width / 2, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = width;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.setLineDash(getLineDash(dash, width));\n ctx.beginPath();\n ctx.moveTo(samples[0]!.x, samples[0]!.y);\n for (let i = 1; i < samples.length; i++) {\n const p = samples[i]!;\n ctx.lineTo(p.x, p.y);\n }\n ctx.stroke();\n ctx.restore();\n }\n\n // Closed shapes are shapes where their start and end point are the same\n private paintClosedShapeFill(\n ctx: CanvasRenderingContext2D,\n samples: Array<{ x: number; y: number }>,\n color: string,\n fillStyle: FillStyle\n ): void {\n if (samples.length < 3) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(samples[0]!.x, samples[0]!.y);\n for (let i = 1; i < samples.length; i++) {\n const sample = samples[i]!;\n ctx.lineTo(sample.x, sample.y);\n }\n ctx.closePath();\n\n if (fillStyle === 'solid') {\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.55;\n } else if (fillStyle === 'none') {\n ctx.fillStyle = this.theme === 'dark' ? '#0f0f0f' : '#fafafa';\n ctx.globalAlpha = 1;\n } else {\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.28;\n }\n\n ctx.fill();\n ctx.restore();\n }\n}\n\nconst PRESSURE_FLOOR = 0.025;\nconst STYLUS_CURVE = (t: number) => t * 0.65 + Math.sin((t * Math.PI) / 2) * 0.35;\nconst sineOut = (t: number) => Math.sin((t * Math.PI) / 2);\nconst cubicInOut = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\nfunction remap(\n value: number,\n inRange: [number, number],\n outRange: [number, number],\n clamp = false\n) {\n const [lo, hi] = inRange;\n const [outLo, outHi] = outRange;\n const t = (value - lo) / (hi - lo);\n const clamped = clamp ? Math.max(0, Math.min(1, t)) : t;\n return outLo + (outHi - outLo) * clamped;\n}\n\nfunction strokeConfig(shape: DrawShape, width: number) {\n const done = shape.props.isComplete || shape.props.isClosed === true;\n if (shape.props.isPen) {\n return {\n size: 1 + width * 1.2,\n thinning: 0.62,\n streamline: 0.62,\n smoothing: 0.62,\n simulatePressure: false,\n easing: STYLUS_CURVE,\n last: done,\n };\n }\n return {\n size: width,\n thinning: 0.5,\n streamline: remap(width, [9, 16], [0.64, 0.74], true),\n smoothing: 0.62,\n simulatePressure: true,\n easing: sineOut,\n last: done,\n };\n}\n\nfunction flattenSegments(shape: DrawShape) {\n const out: { x: number; y: number; pressure: number }[] = [];\n for (const seg of shape.props.segments) {\n const decoded = decodePoints(seg.path).map((p) => ({\n x: p.x + shape.x,\n y: p.y + shape.y,\n pressure: Math.max(PRESSURE_FLOOR, p.z ?? 0.5),\n }));\n\n if (seg.type === 'free' || decoded.length < 2) {\n out.push(...decoded);\n continue;\n }\n\n const A = decoded[0]!;\n const D = decoded[1]!;\n const len = Math.hypot(D.x - A.x, D.y - A.y);\n if (len === 0) {\n out.push(A);\n continue;\n }\n\n const ux = (D.x - A.x) / len;\n const uy = (D.y - A.y) / len;\n const nudge = Math.min(1, Math.floor(len / 4));\n const B = { x: A.x + ux * nudge, y: A.y + uy * nudge, pressure: A.pressure };\n const C = { x: D.x - ux * nudge, y: D.y - uy * nudge, pressure: D.pressure };\n const count = Math.max(4, Math.floor(len / 16));\n out.push(A);\n for (let i = 1; i <= count; i++) {\n const t = i / (count + 1);\n const e = cubicInOut(t);\n out.push({\n x: B.x + (C.x - B.x) * e,\n y: B.y + (C.y - B.y) * e,\n pressure: B.pressure + (C.pressure - B.pressure) * e,\n });\n }\n out.push(D);\n }\n\n return out;\n}\n\nfunction getLineDash(dash: DrawShape['props']['dash'], width: number): number[] {\n switch (dash) {\n case 'dashed': return [width * 2, width * 2];\n case 'dotted': return [Math.max(1, width * 0.25), width * 2];\n case 'solid':\n case 'draw':\n default:\n return [];\n }\n}\n","import type { Vec3 } from '../types.js';\n\n// Normalized pointer input (page space, with pressure)\nexport interface PointerInput {\n currentPagePoint: Vec3;\n originPagePoint: Vec3;\n previousPagePoint: Vec3;\n isPen: boolean;\n shiftKey: boolean;\n ctrlKey: boolean;\n isDragging: boolean;\n}\n\n// Input manager: captures pointer events and gives page-space coords + modifiers\nexport class InputManager {\n private _current: Vec3 = { x: 0, y: 0 };\n private _origin: Vec3 = { x: 0, y: 0 }; // Where pointer_down occured\n private _previous: Vec3 = { x: 0, y: 0 }; // Where pointer was before most recent update\n private _isPen = false; // Whether input is from a stylus\n private _shiftKey = false; // Whether shift is pressed\n private _ctrlKey = false; // Whether ctrl is pressed\n private _metaKey = false; // Whether meta is pressed\n private _isDragging = false; // Whether pointer is dragging\n\n getCurrentPagePoint(): Vec3 { return { ...this._current }; }\n getOriginPagePoint(): Vec3 { return { ...this._origin }; }\n getPreviousPagePoint(): Vec3 { return { ...this._previous }; }\n\n getIsPen(): boolean { return this._isPen; }\n\n getShiftKey(): boolean { return this._shiftKey; }\n getCtrlKey(): boolean { return this._ctrlKey; }\n getAccelKey(): boolean { return this._ctrlKey || this._metaKey; }\n\n getIsDragging(): boolean { return this._isDragging; }\n\n pointerDown(pageX: number, pageY: number, pressure?: number, isPen?: boolean): void {\n this._origin = { x: pageX, y: pageY, z: pressure ?? 0.5 };\n this._current = { ...this._origin };\n this._previous = { ...this._origin };\n this._isDragging = false;\n if (isPen !== undefined) this._isPen = isPen;\n }\n\n pointerMove(pageX: number, pageY: number, pressure?: number, isPen?: boolean): void {\n this._previous = { ...this._current };\n this._current = { x: pageX, y: pageY, z: pressure ?? this._current.z ?? 0.5 };\n this._isPen = isPen ?? this._isPen;\n if (this._origin.x !== this._current.x || this._origin.y !== this._current.y) {\n this._isDragging = true;\n }\n }\n\n pointerUp(): void {\n // Keep current. caller can reset if needed\n }\n\n setModifiers(shift: boolean, ctrl: boolean, meta?: boolean): void {\n this._shiftKey = shift;\n this._ctrlKey = ctrl;\n this._metaKey = meta ?? ctrl;\n }\n\n getInputs(): PointerInput {\n return {\n currentPagePoint: this.getCurrentPagePoint(),\n originPagePoint: this.getOriginPagePoint(),\n previousPagePoint: this.getPreviousPagePoint(),\n isPen: this._isPen,\n shiftKey: this._shiftKey,\n ctrlKey: this._ctrlKey,\n isDragging: this._isDragging,\n };\n }\n}\n","import type {\n StateNode,\n StateNodeConstructor,\n ToolKeyInfo,\n ToolPointerDownInfo,\n ToolPointerMoveInfo,\n ToolStateTransitionInfo,\n} from '../store/stateNode.js';\n\nexport type DefaultToolId = 'pen' | 'eraser' | 'select' | 'hand' | 'square' | 'circle';\n// lets devs pass arbitrary tool IDs while still getting autocomplete for defaults\nexport type ToolId = DefaultToolId | (string & {});\n\nexport interface ToolDefinition {\n id: ToolId;\n initialStateId: string;\n stateConstructors: StateNodeConstructor[];\n}\n\n// Manages current tool and routes pointer/key events to active state node\n// Each tool is a named entry point into a shared state pool. Calling setCurrentTool(\"pen\") exits current state and enters pen's initial state.\nexport class ToolManager {\n private currentToolId: ToolId = 'pen';\n private currentState: StateNode | null = null;\n private states: Map<string, StateNode> = new Map();\n private toolInitialStateIds: Map<ToolId, string> = new Map();\n\n registerState(state: StateNode): void {\n const ctor = state.constructor as StateNodeConstructor;\n if (this.states.has(ctor.id)) {\n throw new Error(`Tool state '${ctor.id}' is already registered.`);\n }\n this.states.set(ctor.id, state);\n }\n\n registerTool(id: ToolId, initialStateId: string): void {\n if (this.toolInitialStateIds.has(id)) {\n throw new Error(`Tool '${id}' is already registered.`);\n }\n this.toolInitialStateIds.set(id, initialStateId);\n }\n\n hasTool(id: ToolId): boolean {\n return this.toolInitialStateIds.has(id);\n }\n\n setCurrentTool(id: ToolId): void {\n const initialStateId = this.toolInitialStateIds.get(id);\n if (!initialStateId) return;\n const nextState = this.states.get(initialStateId);\n if (!nextState) return;\n\n this.currentState?.onExit?.(undefined, initialStateId);\n this.currentToolId = id;\n this.currentState = nextState;\n this.currentState.onEnter?.();\n }\n\n getCurrentToolId(): ToolId {\n return this.currentToolId;\n }\n\n getCurrentState(): StateNode | null {\n return this.currentState;\n }\n\n // Transition between states within the same tool (ex. pen_idle -> pen_drawing)\n transition(stateId: string, info?: ToolStateTransitionInfo): void {\n const next = this.states.get(stateId);\n if (!next) return;\n this.currentState?.onExit?.(undefined, stateId);\n this.currentState = next;\n this.currentState.onEnter?.(info);\n }\n\n pointerDown(info: ToolPointerDownInfo): void { this.currentState?.onPointerDown?.(info); }\n pointerMove(info: ToolPointerMoveInfo): void { this.currentState?.onPointerMove?.(info); }\n pointerUp(): void { this.currentState?.onPointerUp?.(); }\n\n keyDown(info: ToolKeyInfo): void { this.currentState?.onKeyDown?.(info); }\n keyUp(info: ToolKeyInfo): void { this.currentState?.onKeyUp?.(info); }\n\n cancel(): void { this.currentState?.onCancel?.(); }\n interrupt(): void { this.currentState?.onInterrupt?.(); }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class PenIdleState extends StateNode {\n static override id = 'pen_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('pen_drawing', info);\n }\n}","import type { Vec3 } from '../types.js';\n\nexport function dist(a: Vec3, b: Vec3): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function sqDist(a: Vec3, b: Vec3): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n}\n\nexport function withinRadius(a: Vec3, b: Vec3, r: number): boolean {\n return dist(a, b) <= r;\n}\n\nexport function toFixed(n: number, digits = 2): number {\n return Number(Number.prototype.toFixed.call(n, digits));\n}\n\nexport function roundPt(p: Vec3): Vec3 {\n return { x: toFixed(p.x), y: toFixed(p.y), z: p.z != null ? toFixed(p.z) : undefined };\n}\n\n// Calculate bwtween two interpolated points\nexport function lerpPath(from: Vec3, to: Vec3, steps: number): Vec3[] {\n if (steps <= 0) return [{ x: toFixed(from.x), y: toFixed(from.y), z: from.z }];\n const result: Vec3[] = [];\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n result.push({\n x: toFixed(from.x + (to.x - from.x) * t),\n y: toFixed(from.y + (to.y - from.y) * t),\n z: from.z != null && to.z != null ? toFixed(from.z + (to.z - from.z) * t) : to.z ?? from.z,\n });\n }\n return result;\n}\n\n// Snap angle to the nearest division\nexport function quantizeAngle(rad: number, divisions: number): number {\n const step = (Math.PI * 2) / divisions;\n return Math.round(rad / step) * step;\n}\n\n// Rotate point around an origin\nexport function rotateAround(pt: Vec3, origin: Vec3, angle: number): Vec3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const rx = pt.x - origin.x;\n const ry = pt.y - origin.y;\n return {\n x: origin.x + rx * c - ry * s,\n y: origin.y + rx * s + ry * c,\n z: pt.z,\n };\n}\n\nexport function tail<T>(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n","import {\n StateNode,\n type ToolKeyInfo,\n type ToolPointerDownInfo,\n} from '../../../store/stateNode.js';\nimport type { DrawShape, DrawSegment, Vec3 } from '../../../types.js';\nimport { STROKE_WIDTHS, MAX_POINTS_PER_SHAPE } from '../../../types.js';\nimport { encodePoints, decodePoints, decodeFirstPoint, decodeLastPoint } from '../../../utils/pathCodec.js';\nimport { dist, sqDist, withinRadius, toFixed, roundPt, lerpPath, tail, quantizeAngle, rotateAround } from '../../../utils/vec.js';\n\ntype StrokePhase = 'free' | 'straight' | 'starting_straight' | 'starting_free';\n\n// State for when pen is being used\nexport class PenDrawingState extends StateNode {\n static override id = 'pen_drawing';\n\n private _startInfo: ToolPointerDownInfo = { point: { x: 0, y: 0, z: 0.5 } };\n private _target: DrawShape | undefined;\n private _isPenDevice = false;\n private _hasPressure = false;\n private _phase: StrokePhase = 'free';\n private _extending = false;\n private _anchor: Vec3 = { x: 0, y: 0 };\n private _pendingAnchor: Vec3 | null = null;\n private _lastSample: Vec3 = { x: 0, y: 0 };\n private _shouldMerge = false;\n private _pathLen = 0;\n private _activePts: Vec3[] = [];\n\n override onEnter(info?: ToolPointerDownInfo): void {\n this._startInfo = info ?? { point: { x: 0, y: 0, z: 0.5 } };\n this._lastSample = { ...this.editor.input.getCurrentPagePoint() };\n this.beginStroke();\n }\n\n override onPointerMove(): void {\n const inputs = this.editor.input;\n const penActive = inputs.getIsPen();\n if (this._isPenDevice && !penActive) {\n this.beginStroke();\n return;\n }\n if (this._hasPressure) {\n const cur = inputs.getCurrentPagePoint();\n const threshold = 1 / this.editor.getZoomLevel();\n if (dist(cur, this._lastSample) >= threshold) {\n this._lastSample = { ...cur };\n this._shouldMerge = false;\n } else {\n this._shouldMerge = true;\n }\n } else {\n this._shouldMerge = false;\n }\n this.advanceStroke();\n }\n\n // Shift: start a new straight segment\n // Maybe add a specific key for snapping or turning drawing into a proper shape?\n\n override onKeyDown(info?: ToolKeyInfo): void {\n if (info?.key === 'Shift') {\n switch (this._phase) {\n case 'free':\n this._phase = 'starting_straight';\n this._pendingAnchor = { ...this.editor.input.getCurrentPagePoint() };\n break;\n case 'starting_free':\n this._phase = 'starting_straight';\n break;\n }\n }\n this.advanceStroke();\n }\n\n override onKeyUp(info?: ToolKeyInfo): void {\n if (info?.key === 'Shift') {\n switch (this._phase) {\n case 'straight':\n this._phase = 'starting_free';\n this._pendingAnchor = { ...this.editor.input.getCurrentPagePoint() };\n break;\n case 'starting_straight':\n this._pendingAnchor = null;\n this._phase = 'free';\n break;\n }\n }\n this.advanceStroke();\n }\n\n override onPointerUp(): void {\n this.endStroke();\n }\n\n override onCancel(): void {\n this.ctx.transition('pen_idle', this._startInfo);\n }\n\n override onInterrupt(): void {\n if (!this.editor.input.getIsDragging()) {\n this.ctx.transition('pen_idle', this._startInfo);\n }\n }\n\n private canClosePath(): boolean {\n return true;\n }\n\n private detectClosure(\n segments: DrawSegment[],\n size: DrawShape['props']['size'],\n scale: number\n ): boolean {\n if (!this.canClosePath() || segments.length === 0) return false;\n const w = STROKE_WIDTHS[size];\n const first = decodeFirstPoint(segments[0]!.path);\n const lastSeg = segments[segments.length - 1];\n const end = decodeLastPoint(lastSeg!.path);\n if (!first || !end) return false;\n if (first.x === end.x && first.y === end.y) return false;\n if (this._pathLen <= w * 4 * scale) return false;\n return withinRadius(first, end, w * 2 * scale);\n }\n\n private measurePath(segments: DrawSegment[]): number {\n let sum = 0;\n for (const seg of segments) {\n const pts = decodePoints(seg.path);\n for (let i = 0; i < pts.length - 1; i++) {\n sum += sqDist(pts[i]!, pts[i + 1]!);\n }\n }\n return Math.sqrt(sum);\n }\n\n // Start a new shape, when user starts a stroke\n private beginStroke(): void {\n const inputs = this.editor.input;\n const origin = inputs.getOriginPagePoint();\n const penActive = inputs.getIsPen();\n const z = this._startInfo?.point?.z ?? 0.5;\n this._isPenDevice = penActive;\n this._hasPressure = penActive || z !== 0.5;\n const pressure = this._hasPressure ? toFixed(z * 1.25) : 0.5;\n this._phase = inputs.getShiftKey() ? 'straight' : 'free';\n this._extending = false;\n this._lastSample = { ...origin };\n\n const sorted = this.editor.store.getCurrentPageShapesSorted();\n const prev = tail(sorted) as DrawShape | undefined;\n const existing = prev?.type === 'draw' ? prev : undefined;\n this._target = existing;\n\n if (existing && this._phase === 'straight') {\n const prevSeg = tail(existing.props.segments);\n if (!prevSeg) { this.spawnShape(origin, pressure); return; }\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) { this.spawnShape(origin, pressure); return; }\n this._extending = true;\n const local = this.editor.getPointInShapeSpace(existing, origin);\n const localPt: Vec3 = { x: toFixed(local.x), y: toFixed(local.y), z: pressure };\n const newSeg: DrawSegment = {\n type: 'straight',\n path: encodePoints([\n { x: prevEnd.x, y: prevEnd.y, z: pressure },\n localPt,\n ]),\n };\n this._anchor = {\n x: existing.x + prevEnd.x,\n y: existing.y + prevEnd.y,\n };\n this._pendingAnchor = null;\n const segs = [...existing.props.segments, newSeg];\n this._pathLen = this.measurePath(segs);\n this.editor.updateShapes([\n {\n id: existing.id,\n type: 'draw',\n props: {\n segments: segs,\n isClosed: this.detectClosure(segs, existing.props.size, existing.props.scale),\n },\n },\n ]);\n return;\n }\n\n this.spawnShape(origin, pressure);\n }\n\n // Create a new shape, when we need a new drawing shape \n private spawnShape(originPt: Vec3, pressure: number): void {\n this._anchor = { ...originPt };\n const drawStyle = this.editor.getCurrentDrawStyle();\n const id = this.editor.createShapeId();\n const firstPt: Vec3 = { x: 0, y: 0, z: pressure };\n this._activePts = [firstPt];\n this.editor.createShape({\n id,\n type: 'draw',\n x: originPt.x,\n y: originPt.y,\n props: {\n color: drawStyle.color,\n dash: drawStyle.dash,\n size: drawStyle.size,\n scale: 1,\n isPen: this._hasPressure,\n isComplete: false,\n segments: [\n {\n type: this._phase === 'straight' ? 'straight' : 'free',\n path: encodePoints([firstPt]),\n },\n ],\n },\n });\n const shape = this.editor.getShape(id) as DrawShape | undefined;\n if (!shape) {\n this.ctx.transition('pen_idle', this._startInfo);\n return;\n }\n this._pathLen = 0;\n this._target = shape;\n }\n\n // Update the drawing shape, while user is drawing\n private advanceStroke(): void {\n const target = this._target;\n const inputs = this.editor.input;\n if (!target) return;\n\n const shape = this.editor.getShape(target.id) as DrawShape | undefined;\n if (!shape) return;\n\n const { id, props: { size, scale } } = target;\n const { segments } = shape.props;\n const curPt = inputs.getCurrentPagePoint();\n\n if (!this._hasPressure) {\n const liveZ = curPt.z ?? 0.5;\n if ((liveZ > 0 && liveZ !== 0.5) || inputs.getIsPen()) {\n this._hasPressure = true;\n }\n }\n\n const local = this.editor.getPointInShapeSpace(shape, curPt);\n const pressure = this._hasPressure\n ? toFixed((curPt.z ?? 0.5) * 1.25)\n : 0.5;\n const pt: Vec3 = { x: toFixed(local.x), y: toFixed(local.y), z: pressure };\n\n // Straight: straight lines, eg. holding shift\n // Free: smooth drawings so drawings doesnt look geometrical\n\n switch (this._phase) {\n case 'starting_straight': {\n const pending = this._pendingAnchor;\n if (!pending) break;\n if (sqDist(pending, inputs.getCurrentPagePoint()) <= this.editor.options.dragDistanceSquared) break;\n this._anchor = { ...pending };\n this._pendingAnchor = null;\n this._phase = 'straight';\n const prevSeg = tail(segments);\n if (!prevSeg) break;\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) break;\n const anchorLocal = this.editor.getPointInShapeSpace(shape, this._anchor);\n const anchorPt = roundPt(anchorLocal);\n const seg: DrawSegment = {\n type: 'straight',\n path: encodePoints([prevEnd, { ...anchorPt, z: pressure }]),\n };\n const withStraightSeg = [...segments, seg];\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: withStraightSeg,\n isClosed: this.detectClosure(withStraightSeg, size, scale),\n },\n },\n ]);\n break;\n }\n case 'starting_free': {\n const pending = this._pendingAnchor;\n if (!pending) break;\n if (sqDist(pending, inputs.getCurrentPagePoint()) <= this.editor.options.dragDistanceSquared) break;\n this._anchor = { ...pending };\n this._pendingAnchor = null;\n this._phase = 'free';\n const prevSeg = tail(segments);\n if (!prevSeg) break;\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) break;\n const interpolated = lerpPath(prevEnd, pt, 6);\n this._activePts = interpolated;\n const freeSeg: DrawSegment = {\n type: 'free',\n path: encodePoints(interpolated),\n };\n const allSegs = [...segments, freeSeg];\n this._pathLen = this.measurePath(allSegs);\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: allSegs,\n isClosed: this.detectClosure(allSegs, size, scale),\n },\n },\n ]);\n break;\n }\n case 'straight': {\n const updated = segments.slice();\n const lastSeg = updated[updated.length - 1];\n if (!lastSeg) break;\n const anchorPage = this._anchor;\n const current = inputs.getCurrentPagePoint();\n const shouldSnap = !this._extending || inputs.getIsDragging();\n if (this._extending && inputs.getIsDragging()) {\n this._extending = false;\n }\n let pagePt: Vec3;\n if (shouldSnap) {\n const angle = Math.atan2(\n current.y - anchorPage.y,\n current.x - anchorPage.x\n );\n const snapped = quantizeAngle(angle, 24);\n const diff = snapped - angle;\n pagePt = rotateAround(current, anchorPage, diff);\n } else {\n pagePt = { ...current };\n }\n const localPt = this.editor.getPointInShapeSpace(shape, pagePt);\n const fixedPt = roundPt(localPt);\n const segStart = decodeFirstPoint(lastSeg.path);\n if (segStart) {\n this._pathLen += dist(segStart, fixedPt);\n }\n updated[updated.length - 1] = {\n ...lastSeg,\n type: 'straight',\n path: encodePoints([segStart ?? fixedPt, { ...fixedPt, z: pressure }]),\n };\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: updated,\n isClosed: this.detectClosure(updated, size, scale),\n },\n },\n ]);\n break;\n }\n case 'free': {\n const cached = this._activePts;\n if (cached.length && this._shouldMerge) {\n const last = cached[cached.length - 1]!;\n last.x = pt.x;\n last.y = pt.y;\n last.z = last.z != null ? Math.max(last.z, pt.z ?? 0) : pt.z;\n } else {\n this._pathLen += cached.length\n ? dist(cached[cached.length - 1]!, pt)\n : 0;\n cached.push({ x: pt.x, y: pt.y, z: pt.z });\n }\n const updated = segments.slice();\n const lastSeg = updated[updated.length - 1]!;\n updated[updated.length - 1] = {\n ...lastSeg,\n path: encodePoints(cached),\n };\n if (this._pathLen < STROKE_WIDTHS[shape.props.size] * 4) {\n this._pathLen = this.measurePath(updated);\n }\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: updated,\n isClosed: this.detectClosure(updated, size, scale),\n },\n },\n ]);\n if (cached.length > MAX_POINTS_PER_SHAPE) {\n this.editor.updateShapes([{ id, type: 'draw', props: { isComplete: true } }]);\n const newId = this.editor.createShapeId();\n const curPage = inputs.getCurrentPagePoint();\n const firstPt: Vec3 = {\n x: 0,\n y: 0,\n z: this._hasPressure ? toFixed((curPage.z ?? 0.5) * 1.25) : 0.5,\n };\n this._activePts = [firstPt];\n this.editor.createShape({\n id: newId,\n type: 'draw',\n x: curPage.x,\n y: curPage.y,\n props: {\n color: shape.props.color,\n dash: shape.props.dash,\n size: shape.props.size,\n scale: shape.props.scale,\n isPen: this._hasPressure,\n isComplete: false,\n segments: [{ type: 'free', path: encodePoints([firstPt]) }],\n },\n });\n const created = this.editor.getShape(newId) as DrawShape | undefined;\n if (created) {\n this._target = created;\n this._lastSample = { ...curPage };\n this._pathLen = 0;\n }\n }\n break;\n }\n }\n }\n\n private endStroke(): void {\n if (!this._target) return;\n this.editor.updateShapes([\n { id: this._target.id, type: 'draw', props: { isComplete: true, isPen: this._hasPressure } },\n ]);\n this.ctx.transition('pen_idle');\n }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class SquareIdleState extends StateNode {\n static override id = 'square_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('square_drawing', info);\n }\n}","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\nimport type { DrawSegment, DrawShape, ShapeId } from '../../../types.js';\nimport type { ShapeBounds } from '../geometricShapeHelpers.js';\n\ninterface GeometricDrawingStateConfig {\n idleStateId: string;\n buildConstrainedBounds: (\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n ) => ShapeBounds;\n buildUnconstrainedBounds: (\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n ) => ShapeBounds;\n buildSegments: (width: number, height: number) => DrawSegment[];\n}\n\n// Abstract base for geometric shape drawing states\n// Subclasses just provide a config with bound-builders and segment-builders\n// All pointer tracking, shape creation, and completion logic is here\nexport abstract class GeometricDrawingState extends StateNode {\n private currentShapeId: ShapeId | null = null;\n private startedAt: ToolPointerDownInfo = { point: { x: 0, y: 0, z: 0.5 } };\n\n protected abstract getConfig(): GeometricDrawingStateConfig;\n\n override onEnter(info?: ToolPointerDownInfo): void {\n this.startedAt = info ?? { point: { x: 0, y: 0, z: 0.5 } };\n const originPoint = this.editor.input.getOriginPagePoint();\n const drawStyle = this.editor.getCurrentDrawStyle();\n const nextShapeId = this.editor.createShapeId();\n const config = this.getConfig();\n\n this.editor.createShape({\n id: nextShapeId,\n type: 'draw',\n x: originPoint.x,\n y: originPoint.y,\n props: {\n color: drawStyle.color,\n dash: drawStyle.dash,\n fill: drawStyle.fill,\n size: drawStyle.size,\n scale: 1,\n isPen: false,\n isComplete: false,\n isClosed: true,\n segments: config.buildSegments(1, 1),\n },\n });\n\n this.currentShapeId = nextShapeId;\n }\n\n // Shift key switches between constrained and unconstrained bounds\n override onPointerMove(): void {\n const activeShape = this.getActiveShape();\n if (!activeShape) return;\n const config = this.getConfig();\n const originPoint = this.editor.input.getOriginPagePoint();\n const cursorPoint = this.editor.input.getCurrentPagePoint();\n const shapeBounds = this.editor.input.getShiftKey()\n ? config.buildConstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y)\n : config.buildUnconstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y);\n\n this.editor.store.updateShape(activeShape.id, {\n x: shapeBounds.x,\n y: shapeBounds.y,\n props: {\n ...activeShape.props,\n segments: config.buildSegments(shapeBounds.width, shapeBounds.height),\n isClosed: true,\n },\n });\n }\n\n override onPointerUp(): void {\n this.completeShape();\n }\n\n override onCancel(): void {\n this.removeCurrentShape();\n this.ctx.transition(this.getConfig().idleStateId, this.startedAt);\n }\n\n override onInterrupt(): void {\n this.completeShape();\n }\n\n override onKeyDown(): void {\n this.onPointerMove();\n }\n\n override onKeyUp(): void {\n this.onPointerMove();\n }\n\n // If user dragged, use the drag extents for the final shape\n // If they just clicked without dragging, use default-sized shape\n // If they dragged just a bit (most likely a click), remove the shape and go back to idle\n private completeShape(): void {\n const activeShape = this.getActiveShape();\n const config = this.getConfig();\n if (!activeShape) {\n this.ctx.transition(config.idleStateId, this.startedAt);\n return;\n }\n\n const originPoint = this.editor.input.getOriginPagePoint();\n const cursorPoint = this.editor.input.getCurrentPagePoint();\n const dx = cursorPoint.x - originPoint.x;\n const dy = cursorPoint.y - originPoint.y;\n const draggedFarEnough = (dx * dx + dy * dy) > this.editor.options.dragDistanceSquared;\n\n if (!draggedFarEnough) {\n this.removeCurrentShape();\n this.ctx.transition(config.idleStateId, this.startedAt);\n return;\n }\n const finalizedBounds = this.editor.input.getShiftKey()\n ? config.buildConstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y)\n : config.buildUnconstrainedBounds(originPoint.x, originPoint.y, cursorPoint.x, cursorPoint.y);\n\n this.editor.store.updateShape(activeShape.id, {\n x: finalizedBounds.x,\n y: finalizedBounds.y,\n props: {\n ...activeShape.props,\n fill: this.editor.getCurrentDrawStyle().fill,\n isComplete: true,\n isClosed: true,\n segments: config.buildSegments(finalizedBounds.width, finalizedBounds.height),\n },\n });\n\n this.currentShapeId = null;\n this.ctx.transition(config.idleStateId);\n }\n\n private removeCurrentShape(): void {\n if (!this.currentShapeId) return;\n this.editor.store.deleteShapes([this.currentShapeId]);\n this.currentShapeId = null;\n }\n\n private getActiveShape(): DrawShape | null {\n if (!this.currentShapeId) return null;\n const shape = this.editor.getShape(this.currentShapeId);\n if (!shape || shape.type !== 'draw') return null;\n return shape;\n }\n}\n","import type { DrawSegment, Vec3 } from '../../types.js';\nimport { encodePoints } from '../../utils/pathCodec.js';\n\n// Helpers for geometric shape tools\n// Each tool provides \"constrained\" and \"unconstrained\" bound-builders\n// Constrained forces equal aspect ratio sides (shift), unconstrained allows freeform\n// Segment-builders turn those bounds into encoded draw segments\n\nexport interface ShapeBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst MIN_SIDE_LENGTH = 1;\n\n// Turn anchor + cursor into a bounding box, optionally forcing both axes to the longer side to get a square or circle\nfunction toSizedBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number,\n forceEqualSides: boolean\n): ShapeBounds {\n const rawDeltaX = cursorX - anchorX;\n const rawDeltaY = cursorY - anchorY;\n const sideLength = Math.max(Math.abs(rawDeltaX), Math.abs(rawDeltaY), MIN_SIDE_LENGTH);\n\n if (forceEqualSides) {\n const nextDeltaX = rawDeltaX < 0 ? -sideLength : sideLength;\n const nextDeltaY = rawDeltaY < 0 ? -sideLength : sideLength;\n return normalizeBounds(anchorX, anchorY, anchorX + nextDeltaX, anchorY + nextDeltaY);\n }\n\n return normalizeBounds(anchorX, anchorY, cursorX, cursorY);\n}\n\nfunction normalizeBounds(\n startX: number,\n startY: number,\n endX: number,\n endY: number\n): ShapeBounds {\n const x = Math.min(startX, endX);\n const y = Math.min(startY, endY);\n const width = Math.max(Math.abs(endX - startX), MIN_SIDE_LENGTH);\n const height = Math.max(Math.abs(endY - startY), MIN_SIDE_LENGTH);\n return { x, y, width, height };\n}\n\nexport function buildSquareBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, true);\n}\n\nexport function buildRectangleBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, false);\n}\n\n// Four straight segments connecting the corners. encoded as draw segments so\n// the renderer handles them exactly like hand-drawn strokes.\nexport function buildRectangleSegments(width: number, height: number): DrawSegment[] {\n const topLeft: Vec3 = { x: 0, y: 0, z: 0.5 };\n const topRight: Vec3 = { x: width, y: 0, z: 0.5 };\n const bottomRight: Vec3 = { x: width, y: height, z: 0.5 };\n const bottomLeft: Vec3 = { x: 0, y: height, z: 0.5 };\n return [\n { type: 'straight', path: encodePoints([topLeft, topRight]) },\n { type: 'straight', path: encodePoints([topRight, bottomRight]) },\n { type: 'straight', path: encodePoints([bottomRight, bottomLeft]) },\n { type: 'straight', path: encodePoints([bottomLeft, topLeft]) },\n ];\n}\n\nexport function buildCircleBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, true);\n}\n\nexport function buildEllipseBounds(\n anchorX: number,\n anchorY: number,\n cursorX: number,\n cursorY: number\n): ShapeBounds {\n return toSizedBounds(anchorX, anchorY, cursorX, cursorY, false);\n}\n\n// Approximate the ellipse as a 64-sample polyline encoded as a single \"free\" segment.\n// good enough visually and means we can reuse all the same rendering/hit-testing\n// that works for regular draw strokes.\nexport function buildEllipseSegments(width: number, height: number): DrawSegment[] {\n const centerX = width / 2;\n const centerY = height / 2;\n const radiusX = width / 2;\n const radiusY = height / 2;\n const sampleCount = 64;\n const sampledPoints: Vec3[] = [];\n\n for (let sampleIndex = 0; sampleIndex <= sampleCount; sampleIndex += 1) {\n const progress = sampleIndex / sampleCount;\n const angle = progress * Math.PI * 2;\n sampledPoints.push({\n x: centerX + Math.cos(angle) * radiusX,\n y: centerY + Math.sin(angle) * radiusY,\n z: 0.5,\n });\n }\n\n return [{ type: 'free', path: encodePoints(sampledPoints) }];\n}","import { GeometricDrawingState } from '../../geometric/states/GeometricDrawingState.js';\nimport {\n buildRectangleBounds,\n buildRectangleSegments,\n buildSquareBounds,\n} from '../../geometric/geometricShapeHelpers.js';\n\n// Square drawing: shift constrains to a perfect square, otherwise creates a rectangle\nexport class SquareDrawingState extends GeometricDrawingState {\n static override id = 'square_drawing';\n\n protected override getConfig() {\n return {\n idleStateId: 'square_idle',\n buildConstrainedBounds: buildSquareBounds,\n buildUnconstrainedBounds: buildRectangleBounds,\n buildSegments: buildRectangleSegments,\n };\n }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class CircleIdleState extends StateNode {\n static override id = 'circle_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('circle_drawing', info);\n }\n}","import { GeometricDrawingState } from '../../geometric/states/GeometricDrawingState.js';\nimport {\n buildCircleBounds,\n buildEllipseBounds,\n buildEllipseSegments,\n} from '../../geometric/geometricShapeHelpers.js';\n\n// Circle drawing: shift constrains to a perfect circle, otherwise creates an ellipse\nexport class CircleDrawingState extends GeometricDrawingState {\n static override id = 'circle_drawing';\n\n protected override getConfig() {\n return {\n idleStateId: 'circle_idle',\n buildConstrainedBounds: buildCircleBounds,\n buildUnconstrainedBounds: buildEllipseBounds,\n buildSegments: buildEllipseSegments,\n };\n }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class EraserIdleState extends StateNode {\n static override id = 'eraser_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('eraser_pointing', info);\n }\n}","export interface Bounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function boundsOf(points: { x: number; y: number }[]): Bounds {\n if (points.length === 0) return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (const p of points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport function padBounds(b: Bounds, amount: number): Bounds {\n return {\n minX: b.minX - amount,\n minY: b.minY - amount,\n maxX: b.maxX + amount,\n maxY: b.maxY + amount,\n };\n}\n\nexport function sqDistance(ax: number, ay: number, bx: number, by: number): number {\n const dx = bx - ax;\n const dy = by - ay;\n return dx * dx + dy * dy;\n}\n\nexport function distance(ax: number, ay: number, bx: number, by: number): number {\n return Math.sqrt(sqDistance(ax, ay, bx, by));\n}\n\n// Closest point on segment A-B to point P\nexport function closestOnSegment(\n ax: number, ay: number,\n bx: number, by: number,\n px: number, py: number\n): { x: number; y: number } {\n const dx = bx - ax;\n const dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return { x: ax, y: ay };\n const t = Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / lenSq));\n return { x: ax + t * dx, y: ay + t * dy };\n}\n\n// Hit-test (does line segment (ax,ay) - (bx,by) come within margin of the polyline?)\nexport function segmentTouchesPolyline(\n polyline: { x: number; y: number }[],\n ax: number, ay: number,\n bx: number, by: number,\n margin: number\n): boolean {\n for (let i = 0; i < polyline.length - 1; i++) {\n const p = polyline[i]!;\n const q = polyline[i + 1]!;\n const n1 = closestOnSegment(p.x, p.y, q.x, q.y, ax, ay);\n if (distance(n1.x, n1.y, ax, ay) <= margin) return true;\n const n2 = closestOnSegment(p.x, p.y, q.x, q.y, bx, by);\n if (distance(n2.x, n2.y, bx, by) <= margin) return true;\n const n3 = closestOnSegment(ax, ay, bx, by, p.x, p.y);\n if (distance(n3.x, n3.y, p.x, p.y) <= margin) return true;\n }\n if (polyline.length === 1) {\n const p = polyline[0]!;\n return distance(p.x, p.y, ax, ay) <= margin || distance(p.x, p.y, bx, by) <= margin;\n }\n return false;\n}\n\n// Minimum distance from point to polyline\nexport function minDistanceToPolyline(\n px: number, py: number,\n polyline: { x: number; y: number }[]\n): number {\n if (polyline.length === 0) return Infinity;\n if (polyline.length === 1) return distance(px, py, polyline[0]!.x, polyline[0]!.y);\n let best = Infinity;\n for (let i = 0; i < polyline.length - 1; i++) {\n const a = polyline[i]!;\n const b = polyline[i + 1]!;\n const n = closestOnSegment(a.x, a.y, b.x, b.y, px, py);\n const d = distance(n.x, n.y, px, py);\n if (d < best) best = d;\n }\n return best;\n}\n","import type { DrawShape } from '../../types.js';\nimport { STROKE_WIDTHS } from '../../types.js';\nimport { decodePathToPoints } from '../../utils/pathCodec.js';\nimport { minDistanceToPolyline, segmentTouchesPolyline, boundsOf, padBounds } from '../../utils/geometry.js';\n\n// Hit-testing helpers for the eraser tool\n// All tests work in page-space and factor in the shape's stroke width so fat strokes are easier to hit\n\nexport const ERASER_MARGIN = 4;\n\nexport function shapePagePoints(shape: DrawShape): { x: number; y: number }[] {\n return decodePathToPoints(shape.props.segments, shape.x, shape.y);\n}\n\n// For single-point (click) test, does the point fall within stroke margin?\nexport function pointHitsShape(\n shape: DrawShape,\n pageX: number,\n pageY: number,\n margin: number\n): boolean {\n const pts = shapePagePoints(shape);\n if (pts.length === 0) return false;\n const strokeMargin = margin + (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return minDistanceToPolyline(pageX, pageY, pts) <= strokeMargin;\n}\n\n// For segment test (dragging), does the line between previous and current pointer positions come within margin of any part of the shape?\nexport function segmentHitsShape(\n shape: DrawShape,\n ax: number, ay: number,\n bx: number, by: number,\n margin: number\n): boolean {\n const pts = shapePagePoints(shape);\n if (pts.length === 0) return false;\n const strokeMargin = margin + (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return segmentTouchesPolyline(pts, ax, ay, bx, by, strokeMargin);\n}\n\nexport { boundsOf, padBounds };\n","import {\n StateNode,\n type ToolPointerMoveInfo,\n type ToolStateTransitionInfo,\n} from '../../../store/stateNode.js';\nimport type { DrawShape } from '../../../types.js';\nimport type { ShapeId } from '../../../types.js';\nimport { pointHitsShape, ERASER_MARGIN } from '../eraserHitTest.js';\n\n// State for when eraser is being pressed but not dragged\nexport class EraserPointingState extends StateNode {\n static override id = 'eraser_pointing';\n\n override onEnter(_info?: ToolStateTransitionInfo): void {\n const zoom = this.editor.getZoomLevel();\n const tolerance = ERASER_MARGIN / zoom;\n const pt = this.editor.input.getCurrentPagePoint();\n const allShapes = this.editor.store.getCurrentPageRenderingShapesSorted();\n const hits: ShapeId[] = [];\n\n for (const shape of allShapes) {\n if (shape.type !== 'draw') continue;\n if (pointHitsShape(shape as DrawShape, pt.x, pt.y, tolerance)) {\n hits.push(shape.id);\n }\n }\n this.editor.setErasingShapes(hits);\n }\n\n override onPointerMove(info?: ToolPointerMoveInfo): void {\n if (this.editor.input.getIsDragging()) {\n this.ctx.transition('eraser_erasing', info);\n }\n }\n\n override onPointerUp(): void {\n this.finish();\n }\n\n override onExit(_info?: ToolStateTransitionInfo, to?: string): void {\n if (to !== 'eraser_erasing') {\n this.editor.setErasingShapes([]);\n }\n }\n\n override onCancel(): void {\n this.editor.setErasingShapes([]);\n this.ctx.transition('eraser_idle');\n }\n\n private finish(): void {\n const ids = this.editor.getErasingShapeIds();\n if (ids.length > 0) {\n this.editor.store.deleteShapes(ids);\n this.editor.setErasingShapes([]);\n }\n this.ctx.transition('eraser_idle');\n }\n}\n","import { StateNode, type ToolStateTransitionInfo } from '../../../store/stateNode.js';\nimport type { DrawShape } from '../../../types.js';\nimport type { ShapeId } from '../../../types.js';\nimport { segmentHitsShape, boundsOf, padBounds, ERASER_MARGIN } from '../eraserHitTest.js';\n\n// State for when eraser is being used\nexport class EraserErasingState extends StateNode {\n static override id = 'eraser_erasing';\n\n private _marked: ShapeId[] = [];\n\n override onEnter(_info?: ToolStateTransitionInfo): void {\n this._marked = [...this.editor.getErasingShapeIds()];\n this.sweep();\n }\n\n override onPointerMove(): void { this.sweep(); }\n override onPointerUp(): void { this.finish(); }\n\n override onExit(): void { this.editor.setErasingShapes([]); }\n override onCancel(): void { this.ctx.transition('eraser_idle'); }\n\n // On every pointer move, test the line from previous pointer position to current one against nearby shapes\n // Only select shapes whose bounding box overlaps the sweep area to avoid testing all shapes\n private sweep(): void {\n const zoom = this.editor.getZoomLevel();\n const tolerance = ERASER_MARGIN / zoom;\n const cur = this.editor.input.getCurrentPagePoint();\n const prev = this.editor.input.getPreviousPagePoint();\n const hitIds = new Set<ShapeId>(this.editor.getErasingShapeIds());\n\n const sweepArea = padBounds(boundsOf([prev, cur]), tolerance);\n const nearby = this.editor.store.getShapeIdsInBounds(sweepArea);\n const candidates = this.editor.store\n .getCurrentPageRenderingShapesSorted()\n .filter((s) => nearby.has(s.id));\n\n for (const shape of candidates) {\n if (shape.type !== 'draw') continue;\n if (segmentHitsShape(shape as DrawShape, prev.x, prev.y, cur.x, cur.y, tolerance)) {\n hitIds.add(shape.id);\n }\n }\n this._marked = [...hitIds];\n this.editor.setErasingShapes(this._marked);\n }\n\n // Delete marked shapes and reset, then go back to idle\n private finish(): void {\n const ids = this.editor.getErasingShapeIds();\n if (ids.length > 0) {\n this.editor.store.deleteShapes(ids);\n }\n this.editor.setErasingShapes([]);\n this._marked = [];\n this.ctx.transition('eraser_idle');\n }\n}\n","import { StateNode } from '../../../store/stateNode.js';\n\nexport class SelectIdleState extends StateNode {\n static override id = 'select_idle';\n}","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class HandIdleState extends StateNode {\n static override id = 'hand_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('hand_dragging', info);\n }\n}","import { StateNode, type ToolPointerDownInfo, type ToolPointerMoveInfo, type ToolStateTransitionInfo } from '../../../store/stateNode.js';\nimport { beginCameraPan, moveCameraPan, type CameraPanSession } from '../../../canvas/cameraPan.js';\n\n// Pans viewport by screen-space delta each pointer move\n// Screen delta (not page delta) to get 1:1 tracking with finger\nexport class HandDraggingState extends StateNode {\n static override id = 'hand_dragging';\n\n private panSession: CameraPanSession | null = null;\n\n override onEnter(info?: ToolStateTransitionInfo): void {\n const downInfo = info as ToolPointerDownInfo | undefined;\n const screenX = downInfo?.screenX ?? 0;\n const screenY = downInfo?.screenY ?? 0;\n this.panSession = beginCameraPan(this.editor.viewport, screenX, screenY);\n }\n\n override onPointerMove(info?: ToolPointerMoveInfo): void {\n if (!this.panSession) return;\n const screenX = info?.screenX ?? 0;\n const screenY = info?.screenY ?? 0;\n const target = moveCameraPan(this.panSession, screenX, screenY);\n this.editor.setViewport({ x: target.x, y: target.y });\n }\n\n getPanSession(): CameraPanSession | null {\n return this.panSession;\n }\n\n override onPointerUp(): void {\n this.ctx.transition('hand_idle');\n }\n\n override onExit(): void {\n this.panSession = null;\n }\n\n override onCancel(): void {\n this.ctx.transition('hand_idle');\n }\n\n override onInterrupt(): void {\n this.ctx.transition('hand_idle');\n }\n}","import type { DashStyle, DrawShape, PageState, Shape, ShapeId, SizeStyle, ColorStyle, FillStyle } from '../types.js';\n\nexport interface TsdrawPageRecord {\n id: string;\n typeName: 'page';\n pageId: string;\n shapeIds: ShapeId[];\n erasingShapeIds: ShapeId[];\n}\n\nexport interface TsdrawShapeRecord {\n id: ShapeId;\n typeName: 'shape';\n shape: Shape;\n}\n\nexport type TsdrawPersistedRecord = TsdrawPageRecord | TsdrawShapeRecord;\n\nexport interface TsdrawDocumentSnapshot {\n records: TsdrawPersistedRecord[];\n}\n\nexport interface TsdrawSessionStateSnapshot {\n version: 1;\n viewport: {\n x: number;\n y: number;\n zoom: number;\n };\n currentToolId: string;\n drawStyle: {\n color: ColorStyle;\n dash: DashStyle;\n fill?: FillStyle;\n size: SizeStyle;\n };\n selectedShapeIds: ShapeId[];\n}\n\nexport interface TsdrawEditorSnapshot {\n document: TsdrawDocumentSnapshot;\n state: TsdrawSessionStateSnapshot;\n}\n\nexport interface TsdrawHistorySnapshot {\n version: 1;\n undoStack: TsdrawDocumentSnapshot[];\n redoStack: TsdrawDocumentSnapshot[];\n}\n\nexport interface DocumentStoreSnapshot {\n page: PageState;\n order: ShapeId[];\n}\n\nconst PAGE_RECORD_ID = 'page:current';\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction asDrawShape(value: Shape): DrawShape {\n return cloneValue(value as DrawShape);\n}\n\nexport function documentSnapshotToRecords(snapshot: DocumentStoreSnapshot): TsdrawPersistedRecord[] {\n const shapeIds = [...snapshot.order].filter((id) => snapshot.page.shapes[id] != null);\n const pageRecord: TsdrawPageRecord = {\n id: PAGE_RECORD_ID,\n typeName: 'page',\n pageId: snapshot.page.id,\n shapeIds,\n erasingShapeIds: [...snapshot.page.erasingShapeIds],\n };\n const shapeRecords: TsdrawShapeRecord[] = shapeIds\n .map((shapeId) => snapshot.page.shapes[shapeId])\n .filter((shape): shape is Shape => shape != null)\n .map((shape) => ({\n id: shape.id,\n typeName: 'shape',\n shape: asDrawShape(shape),\n }));\n\n return [pageRecord, ...shapeRecords];\n}\n\nexport function recordsToDocumentSnapshot(records: TsdrawPersistedRecord[]): DocumentStoreSnapshot | null {\n const pageRecord = records.find((record): record is TsdrawPageRecord => record.typeName === 'page');\n if (!pageRecord) {\n return null;\n }\n\n const shapeRecordMap = new Map<string, TsdrawShapeRecord>();\n for (const record of records) {\n if (record.typeName === 'shape') {\n shapeRecordMap.set(record.id, record);\n }\n }\n\n const shapes: Record<ShapeId, Shape> = {};\n const order: ShapeId[] = [];\n\n for (const shapeId of pageRecord.shapeIds) {\n const shapeRecord = shapeRecordMap.get(shapeId);\n if (!shapeRecord) continue;\n shapes[shapeId] = asDrawShape(shapeRecord.shape);\n order.push(shapeId);\n }\n\n return {\n page: {\n id: pageRecord.pageId,\n shapes,\n erasingShapeIds: [...pageRecord.erasingShapeIds].filter((shapeId) => shapes[shapeId] != null),\n },\n order,\n };\n}\n","import { DocumentStore } from '../store/documentStore.js';\nimport type { Viewport, ZoomRange } from '../canvas/viewport.js';\nimport { createViewport, screenToPage, zoomViewport, clampZoom } from '../canvas/viewport.js';\nimport { CanvasRenderer } from '../canvas/renderer.js';\nimport { InputManager } from '../input/inputManager.js';\nimport type { ToolStateContext } from '../store/stateNode.js';\nimport { ToolManager, type ToolDefinition, type ToolId } from '../tools/toolManager.js';\nimport { PenIdleState } from '../tools/pen/states/PenIdleState.js';\nimport { PenDrawingState } from '../tools/pen/states/PenDrawingState.js';\nimport { SquareIdleState } from '../tools/square/states/SquareIdleState.js';\nimport { SquareDrawingState } from '../tools/square/states/SquareDrawingState.js';\nimport { CircleIdleState } from '../tools/circle/states/CircleIdleState.js';\nimport { CircleDrawingState } from '../tools/circle/states/CircleDrawingState.js';\nimport { EraserIdleState } from '../tools/eraser/states/EraserIdleState.js';\nimport { EraserPointingState } from '../tools/eraser/states/EraserPointingState.js';\nimport { EraserErasingState } from '../tools/eraser/states/EraserErasingState.js';\nimport { SelectIdleState } from '../tools/select/states/SelectIdleState.js';\nimport { HandIdleState } from '../tools/hand/states/HandIdleState.js';\nimport { HandDraggingState } from '../tools/hand/states/HandDraggingState.js';\nimport type { ShapeId, Shape, DrawShape, ColorStyle, DashStyle, SizeStyle, FillStyle } from '../types.js';\nimport type { Vec3 } from '../types.js';\nimport { DRAG_DISTANCE_SQUARED } from '../types.js';\nimport {\n documentSnapshotToRecords,\n recordsToDocumentSnapshot,\n type TsdrawDocumentSnapshot,\n type TsdrawEditorSnapshot,\n type TsdrawHistorySnapshot,\n type TsdrawSessionStateSnapshot,\n} from '../persistence/snapshots.js';\n\nexport interface EditorOptions {\n dragDistanceSquared?: number;\n toolDefinitions?: ToolDefinition[];\n initialToolId?: ToolId;\n zoomRange?: ZoomRange;\n}\n\ntype EditorListener = () => void;\n\nlet shapeIdCounter = 0;\nconst shapeIdRuntimeSeed = Math.random().toString(36).slice(2, 8);\nconst MAX_HISTORY_ENTRIES = 100;\n\nfunction createShapeId(): ShapeId {\n shapeIdCounter += 1;\n return `shape:${Date.now().toString(36)}-${shapeIdRuntimeSeed}-${shapeIdCounter.toString(36)}`;\n}\n\nfunction cloneDocumentSnapshot(snapshot: TsdrawDocumentSnapshot): TsdrawDocumentSnapshot {\n if (typeof structuredClone === 'function') {\n return structuredClone(snapshot);\n }\n return JSON.parse(JSON.stringify(snapshot)) as TsdrawDocumentSnapshot;\n}\n\nfunction areDocumentSnapshotsEqual(left: TsdrawDocumentSnapshot, right: TsdrawDocumentSnapshot): boolean {\n if (left.records.length !== right.records.length) return false;\n for (let i = 0; i < left.records.length; i += 1) {\n if (JSON.stringify(left.records[i]) !== JSON.stringify(right.records[i])) {\n return false;\n }\n }\n return true;\n}\n\n// Main editor: document store, viewport, input, tools, renderer\nexport class Editor {\n readonly store: DocumentStore = new DocumentStore();\n readonly input: InputManager = new InputManager();\n readonly tools: ToolManager = new ToolManager();\n readonly renderer: CanvasRenderer = new CanvasRenderer();\n viewport: Viewport = createViewport();\n readonly options: { dragDistanceSquared: number; zoomRange?: ZoomRange };\n // Default draw style\n private drawStyle: { color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle } = {\n color: 'black',\n dash: 'draw',\n fill: 'none',\n size: 'm',\n };\n private readonly toolStateContext: ToolStateContext;\n private readonly listeners = new Set<EditorListener>();\n private readonly historyListeners = new Set<EditorListener>();\n private undoStack: TsdrawDocumentSnapshot[] = [];\n private redoStack: TsdrawDocumentSnapshot[] = [];\n private lastDocumentSnapshot: TsdrawDocumentSnapshot;\n private suppressHistoryCapture = false;\n private historyBatchDepth = 0;\n private historyBatchStartSnapshot: TsdrawDocumentSnapshot | null = null;\n private historyBatchChanged = false;\n\n // Creates a new editor instance with the given options (with defaults if not provided)\n constructor(opts: EditorOptions = {}) {\n this.options = { dragDistanceSquared: opts.dragDistanceSquared ?? DRAG_DISTANCE_SQUARED, zoomRange: opts.zoomRange };\n this.lastDocumentSnapshot = this.getDocumentSnapshot();\n this.store.listen(() => {\n this.captureDocumentHistory();\n this.emitChange();\n });\n this.toolStateContext = {\n transition: (id, info) => this.tools.transition(id, info),\n };\n for (const defaultTool of this.getDefaultToolDefinitions()) {\n this.registerToolDefinition(defaultTool);\n }\n for (const customTool of opts.toolDefinitions ?? []) {\n this.registerToolDefinition(customTool);\n }\n this.setCurrentTool(opts.initialToolId ?? 'pen');\n this.lastDocumentSnapshot = this.getDocumentSnapshot();\n }\n\n private captureDocumentHistory(): void {\n const nextSnapshot = this.getDocumentSnapshot();\n const previousSnapshot = this.lastDocumentSnapshot;\n this.lastDocumentSnapshot = nextSnapshot;\n\n if (this.suppressHistoryCapture || areDocumentSnapshotsEqual(previousSnapshot, nextSnapshot)) {\n return;\n }\n\n if (this.historyBatchDepth > 0) {\n this.historyBatchChanged = true;\n return;\n }\n\n this.undoStack.push(cloneDocumentSnapshot(previousSnapshot));\n if (this.undoStack.length > MAX_HISTORY_ENTRIES) {\n this.undoStack.splice(0, this.undoStack.length - MAX_HISTORY_ENTRIES);\n }\n this.redoStack = [];\n this.emitHistoryChange();\n }\n\n registerToolDefinition(toolDefinition: ToolDefinition): void {\n for (const stateConstructor of toolDefinition.stateConstructors) {\n this.tools.registerState(new stateConstructor(this.toolStateContext, this));\n }\n this.tools.registerTool(toolDefinition.id, toolDefinition.initialStateId);\n }\n\n private getDefaultToolDefinitions(): ToolDefinition[] {\n return [\n { id: 'pen', initialStateId: PenIdleState.id, stateConstructors: [PenIdleState, PenDrawingState] },\n { id: 'square', initialStateId: SquareIdleState.id, stateConstructors: [SquareIdleState, SquareDrawingState] },\n { id: 'circle', initialStateId: CircleIdleState.id, stateConstructors: [CircleIdleState, CircleDrawingState] },\n { id: 'eraser', initialStateId: EraserIdleState.id, stateConstructors: [EraserIdleState, EraserPointingState, EraserErasingState] },\n { id: 'select', initialStateId: SelectIdleState.id, stateConstructors: [SelectIdleState] },\n { id: 'hand', initialStateId: HandIdleState.id, stateConstructors: [HandIdleState, HandDraggingState] },\n ];\n }\n\n createShapeId(): ShapeId { return createShapeId(); }\n getZoomLevel(): number { return this.viewport.zoom; }\n getShape(id: ShapeId): Shape | undefined { return this.store.getShape(id); }\n createShape(shape: Shape): void { this.store.createShape(shape); }\n\n updateShapes(\n partials: Array<{ id: ShapeId; type: string; props?: Partial<DrawShape['props']> }>\n ): void {\n for (const p of partials) {\n const existing = this.store.getShape(p.id) as DrawShape | undefined;\n if (existing && p.props) {\n this.store.updateShape(p.id, { props: { ...existing.props, ...p.props } });\n }\n }\n }\n\n // Page point to shape local point (for draw shapes: subtract shape pos)\n getPointInShapeSpace(shape: DrawShape, pagePoint: Vec3): Vec3 {\n return {\n x: pagePoint.x - shape.x,\n y: pagePoint.y - shape.y,\n z: pagePoint.z,\n };\n }\n\n getCurrentPageShapes() { return this.store.getCurrentPageShapes(); }\n getCurrentPageShapesSorted() { return this.store.getCurrentPageShapesSorted(); }\n getCurrentPageRenderingShapesSorted() { return this.store.getCurrentPageRenderingShapesSorted(); }\n\n getErasingShapeIds() { return this.store.getErasingShapeIds(); }\n setErasingShapes(ids: ShapeId[]) { this.store.setErasingShapes(ids); }\n\n setCurrentTool(id: ToolId) { this.tools.setCurrentTool(id); this.emitChange(); }\n getCurrentToolId(): ToolId { return this.tools.getCurrentToolId(); }\n\n getCurrentDrawStyle() { return { ...this.drawStyle }; }\n setCurrentDrawStyle(partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) {\n this.drawStyle = { ...this.drawStyle, ...partial };\n this.emitChange();\n }\n\n setViewport(partial: Partial<Viewport>) {\n const rawZoom = partial.zoom ?? this.viewport.zoom;\n this.viewport = {\n x: partial.x ?? this.viewport.x,\n y: partial.y ?? this.viewport.y,\n zoom: clampZoom(rawZoom, this.options.zoomRange),\n };\n this.emitChange();\n }\n\n panBy(dx: number, dy: number) {\n this.setViewport({\n x: this.viewport.x + dx,\n y: this.viewport.y + dy,\n });\n }\n\n zoomAt(factor: number, screenX: number, screenY: number): void {\n this.viewport = zoomViewport(this.viewport, factor, screenX, screenY, this.options.zoomRange);\n this.emitChange();\n }\n\n deleteShapes(ids: ShapeId[]): void {\n if (ids.length === 0) return;\n this.store.deleteShapes(ids);\n }\n\n getDocumentSnapshot(): TsdrawDocumentSnapshot {\n return {\n records: documentSnapshotToRecords(this.store.getSnapshot()),\n };\n }\n\n loadDocumentSnapshot(snapshot: TsdrawDocumentSnapshot): void {\n const documentSnapshot = recordsToDocumentSnapshot(snapshot.records);\n if (!documentSnapshot) return;\n this.runWithoutHistoryCapture(() => { this.store.loadSnapshot(documentSnapshot) });\n }\n\n getSessionStateSnapshot(args?: { selectedShapeIds?: ShapeId[] }): TsdrawSessionStateSnapshot {\n return {\n version: 1,\n viewport: {\n x: this.viewport.x,\n y: this.viewport.y,\n zoom: this.viewport.zoom,\n },\n currentToolId: this.getCurrentToolId(),\n drawStyle: this.getCurrentDrawStyle(),\n selectedShapeIds: [...(args?.selectedShapeIds ?? [])],\n };\n }\n\n loadSessionStateSnapshot(snapshot: TsdrawSessionStateSnapshot): ShapeId[] {\n this.setViewport(snapshot.viewport);\n this.setCurrentDrawStyle({\n color: snapshot.drawStyle.color,\n dash: snapshot.drawStyle.dash,\n fill: snapshot.drawStyle.fill ?? 'none',\n size: snapshot.drawStyle.size,\n });\n if (this.tools.hasTool(snapshot.currentToolId)) {\n this.setCurrentTool(snapshot.currentToolId);\n }\n return [...snapshot.selectedShapeIds];\n }\n\n getPersistenceSnapshot(args?: { selectedShapeIds?: ShapeId[] }): TsdrawEditorSnapshot {\n return {\n document: this.getDocumentSnapshot(),\n state: this.getSessionStateSnapshot(args),\n };\n }\n\n loadPersistenceSnapshot(snapshot: Partial<TsdrawEditorSnapshot>): ShapeId[] {\n if (snapshot.document) {\n this.loadDocumentSnapshot(snapshot.document);\n }\n if (snapshot.state) {\n return this.loadSessionStateSnapshot(snapshot.state);\n }\n return [];\n }\n\n getHistorySnapshot(): TsdrawHistorySnapshot {\n return {\n version: 1,\n undoStack: this.undoStack.map(cloneDocumentSnapshot),\n redoStack: this.redoStack.map(cloneDocumentSnapshot),\n };\n }\n\n loadHistorySnapshot(snapshot: TsdrawHistorySnapshot | null | undefined): void {\n if (!snapshot || snapshot.version !== 1) return;\n this.undoStack = snapshot.undoStack.map(cloneDocumentSnapshot).slice(-MAX_HISTORY_ENTRIES);\n this.redoStack = snapshot.redoStack.map(cloneDocumentSnapshot).slice(-MAX_HISTORY_ENTRIES);\n this.emitHistoryChange();\n }\n\n clearRedoHistory(): void {\n if (this.redoStack.length === 0) return;\n this.redoStack = [];\n this.emitHistoryChange();\n }\n\n beginHistoryEntry(): void {\n if (this.historyBatchDepth === 0) {\n this.historyBatchStartSnapshot = cloneDocumentSnapshot(this.lastDocumentSnapshot);\n this.historyBatchChanged = false;\n }\n this.historyBatchDepth += 1;\n }\n\n endHistoryEntry(): void {\n if (this.historyBatchDepth === 0) return;\n this.historyBatchDepth -= 1;\n if (this.historyBatchDepth > 0) return;\n\n const startSnapshot = this.historyBatchStartSnapshot;\n this.historyBatchStartSnapshot = null;\n if (!startSnapshot) return;\n\n const endSnapshot = this.getDocumentSnapshot();\n this.lastDocumentSnapshot = endSnapshot;\n const didDocumentChange = this.historyBatchChanged || !areDocumentSnapshotsEqual(startSnapshot, endSnapshot);\n this.historyBatchChanged = false;\n if (!didDocumentChange) return;\n\n this.undoStack.push(cloneDocumentSnapshot(startSnapshot));\n if (this.undoStack.length > MAX_HISTORY_ENTRIES) {\n this.undoStack.splice(0, this.undoStack.length - MAX_HISTORY_ENTRIES);\n }\n this.redoStack = [];\n this.emitHistoryChange();\n }\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undo(): boolean {\n const previousSnapshot = this.undoStack.pop();\n if (!previousSnapshot) return false;\n\n const currentSnapshot = this.getDocumentSnapshot();\n this.redoStack.push(cloneDocumentSnapshot(currentSnapshot));\n if (this.redoStack.length > MAX_HISTORY_ENTRIES) {\n this.redoStack.splice(0, this.redoStack.length - MAX_HISTORY_ENTRIES);\n }\n\n this.loadDocumentSnapshot(previousSnapshot);\n this.emitHistoryChange();\n return true;\n }\n\n redo(): boolean {\n const nextSnapshot = this.redoStack.pop();\n if (!nextSnapshot) return false;\n\n const currentSnapshot = this.getDocumentSnapshot();\n this.undoStack.push(cloneDocumentSnapshot(currentSnapshot));\n if (this.undoStack.length > MAX_HISTORY_ENTRIES) {\n this.undoStack.splice(0, this.undoStack.length - MAX_HISTORY_ENTRIES);\n }\n\n this.loadDocumentSnapshot(nextSnapshot);\n this.emitHistoryChange();\n return true;\n }\n\n listen(listener: EditorListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n listenHistory(listener: EditorListener): () => void {\n this.historyListeners.add(listener);\n return () => {\n this.historyListeners.delete(listener);\n };\n }\n\n // Convert screen coords to page coords\n screenToPage(screenX: number, screenY: number): { x: number; y: number } {\n return screenToPage(this.viewport, screenX, screenY);\n }\n\n // Render current page to 2d canvas context\n render(ctx: CanvasRenderingContext2D) {\n const shapes = this.getCurrentPageShapesSorted();\n const erasingIds = new Set(this.getErasingShapeIds());\n const visible = shapes.filter((s) => !erasingIds.has(s.id));\n this.renderer.render(ctx, this.viewport, visible);\n }\n\n private emitChange() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n private emitHistoryChange() {\n for (const listener of this.historyListeners) {\n listener();\n }\n }\n\n private runWithoutHistoryCapture(fn: () => void): void {\n const previousValue = this.suppressHistoryCapture;\n this.suppressHistoryCapture = true;\n try {\n fn();\n } finally {\n this.suppressHistoryCapture = previousValue;\n this.lastDocumentSnapshot = this.getDocumentSnapshot();\n }\n }\n}\n","import { decodePoints, encodePoints, decodePathToPoints } from '../../utils/pathCodec.js';\nimport { STROKE_WIDTHS, type DrawShape, type DrawSegment, type ShapeId, type Vec3 } from '../../types.js';\nimport type { Editor } from '../../editor/Editor.js';\n\nexport interface SelectionBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se';\n\nexport interface TransformSnapshot {\n x: number;\n y: number;\n segments: Array<{ type: DrawSegment['type']; points: Vec3[] }>;\n}\n\nexport function isSelectTool(tool: string): boolean {\n return tool === 'select';\n}\n\nexport function getShapeBounds(shape: DrawShape): SelectionBounds {\n const points = decodePathToPoints(shape.props.segments, shape.x, shape.y);\n if (points.length === 0) {\n return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n }\n\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n\n for (const p of points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n\n const stroke = (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return { minX: minX - stroke, minY: minY - stroke, maxX: maxX + stroke, maxY: maxY + stroke };\n}\n\nexport function normalizeSelectionBounds(\n a: { x: number; y: number },\n b: { x: number; y: number }\n): SelectionBounds {\n return {\n minX: Math.min(a.x, b.x),\n minY: Math.min(a.y, b.y),\n maxX: Math.max(a.x, b.x),\n maxY: Math.max(a.y, b.y),\n };\n}\n\nexport function boundsContainPoint(bounds: SelectionBounds, x: number, y: number): boolean {\n return x >= bounds.minX && x <= bounds.maxX && y >= bounds.minY && y <= bounds.maxY;\n}\n\nexport function boundsIntersect(a: SelectionBounds, b: SelectionBounds): boolean {\n return a.maxX >= b.minX && a.minX <= b.maxX && a.maxY >= b.minY && a.minY <= b.maxY;\n}\n\nexport function rotatePoint(point: { x: number; y: number }, center: { x: number; y: number }, radians: number) {\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n return {\n x: center.x + dx * c - dy * s,\n y: center.y + dx * s + dy * c,\n };\n}\n\nexport function buildTransformSnapshots(editor: Editor, ids: ShapeId[]): Map<ShapeId, TransformSnapshot> {\n const snapshots = new Map<ShapeId, TransformSnapshot>();\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n snapshots.set(id, {\n x: shape.x,\n y: shape.y,\n segments: shape.props.segments.map((seg) => ({\n type: seg.type,\n points: decodePoints(seg.path),\n })),\n });\n }\n return snapshots;\n}\n\nexport function buildStartPositions(editor: Editor, ids: ShapeId[]): Map<ShapeId, { x: number; y: number }> {\n const positions = new Map<ShapeId, { x: number; y: number }>();\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape) continue;\n positions.set(id, { x: shape.x, y: shape.y });\n }\n return positions;\n}\n\nexport function getTopShapeAtPoint(editor: Editor, point: { x: number; y: number }) {\n const margin = 6 / editor.viewport.zoom;\n const shapes = editor.getCurrentPageRenderingShapesSorted();\n\n // Iterate in rendering order so first hit matches top shape\n for (const shape of shapes) {\n if (shape.type !== 'draw') continue;\n const b = getShapeBounds(shape);\n if (\n boundsContainPoint(\n {\n minX: b.minX - margin,\n minY: b.minY - margin,\n maxX: b.maxX + margin,\n maxY: b.maxY + margin,\n },\n point.x,\n point.y\n )\n ) {\n return shape;\n }\n }\n\n return null;\n}\n\nexport function getSelectionBoundsPage(editor: Editor, ids: ShapeId[]): SelectionBounds | null {\n if (ids.length === 0) return null;\n\n let union: SelectionBounds | null = null;\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n const b = getShapeBounds(shape);\n union = union\n ? {\n minX: Math.min(union.minX, b.minX),\n minY: Math.min(union.minY, b.minY),\n maxX: Math.max(union.maxX, b.maxX),\n maxY: Math.max(union.maxY, b.maxY),\n }\n : b;\n }\n\n return union;\n}\n\nexport function getShapesInBounds(editor: Editor, bounds: SelectionBounds): ShapeId[] {\n return editor\n .getCurrentPageShapesSorted()\n .filter((shape): shape is DrawShape => shape.type === 'draw')\n .filter((shape) => boundsIntersect(getShapeBounds(shape), bounds))\n .map((shape) => shape.id);\n}\n\nexport function applyMove(\n editor: Editor,\n startPositions: Map<ShapeId, { x: number; y: number }>,\n deltaX: number,\n deltaY: number\n) {\n for (const [id, start] of startPositions) {\n editor.store.updateShape(id, {\n x: start.x + deltaX,\n y: start.y + deltaY,\n });\n }\n}\n\nexport function applyRotation(\n editor: Editor,\n startShapes: Map<ShapeId, TransformSnapshot>,\n center: { x: number; y: number },\n delta: number\n) {\n for (const [id, snapshot] of startShapes) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n\n const rotatedOrigin = rotatePoint({ x: snapshot.x, y: snapshot.y }, center, delta);\n // Rotate absolute points around selection center, then re-localize back into the shapes coordinate space\n const segments = snapshot.segments.map((segment) => ({\n type: segment.type,\n path: encodePoints(\n segment.points.map((pt) => {\n const absolute = { x: snapshot.x + pt.x, y: snapshot.y + pt.y };\n const rotated = rotatePoint(absolute, center, delta);\n return {\n x: rotated.x - rotatedOrigin.x,\n y: rotated.y - rotatedOrigin.y,\n z: pt.z,\n };\n })\n ),\n }));\n\n editor.store.updateShape(id, {\n x: rotatedOrigin.x,\n y: rotatedOrigin.y,\n props: { ...shape.props, segments },\n });\n }\n}\n\nexport function applyResize(\n editor: Editor,\n handle: ResizeHandle,\n startBounds: SelectionBounds,\n startShapes: Map<ShapeId, TransformSnapshot>,\n pointer: { x: number; y: number },\n lockAspectRatio: boolean\n) {\n const minSize = 8 / editor.viewport.zoom;\n const startW = Math.max(0.0001, startBounds.maxX - startBounds.minX);\n const startH = Math.max(0.0001, startBounds.maxY - startBounds.minY);\n const aspectRatio = startW / startH;\n\n let minX = startBounds.minX;\n let minY = startBounds.minY;\n let maxX = startBounds.maxX;\n let maxY = startBounds.maxY;\n\n switch (handle) {\n case 'nw':\n minX = Math.min(pointer.x, startBounds.maxX - minSize);\n minY = Math.min(pointer.y, startBounds.maxY - minSize);\n break;\n case 'ne':\n maxX = Math.max(pointer.x, startBounds.minX + minSize);\n minY = Math.min(pointer.y, startBounds.maxY - minSize);\n break;\n case 'sw':\n minX = Math.min(pointer.x, startBounds.maxX - minSize);\n maxY = Math.max(pointer.y, startBounds.minY + minSize);\n break;\n case 'se':\n maxX = Math.max(pointer.x, startBounds.minX + minSize);\n maxY = Math.max(pointer.y, startBounds.minY + minSize);\n break;\n }\n\n if (lockAspectRatio) {\n // Keep dragged corner constrained to the original ratio while opposite corner stays to be the stationary anchor resize\n let nextW = Math.max(minSize, maxX - minX);\n let nextH = Math.max(minSize, maxY - minY);\n\n if (nextW / nextH > aspectRatio) {\n nextH = nextW / aspectRatio;\n } else {\n nextW = nextH * aspectRatio;\n }\n\n if (nextW < minSize) {\n nextW = minSize;\n nextH = nextW / aspectRatio;\n }\n\n if (nextH < minSize) {\n nextH = minSize;\n nextW = nextH * aspectRatio;\n }\n\n switch (handle) {\n case 'nw':\n minX = startBounds.maxX - nextW;\n minY = startBounds.maxY - nextH;\n maxX = startBounds.maxX;\n maxY = startBounds.maxY;\n break;\n case 'ne':\n minX = startBounds.minX;\n minY = startBounds.maxY - nextH;\n maxX = startBounds.minX + nextW;\n maxY = startBounds.maxY;\n break;\n case 'sw':\n minX = startBounds.maxX - nextW;\n minY = startBounds.minY;\n maxX = startBounds.maxX;\n maxY = startBounds.minY + nextH;\n break;\n case 'se':\n minX = startBounds.minX;\n minY = startBounds.minY;\n maxX = startBounds.minX + nextW;\n maxY = startBounds.minY + nextH;\n break;\n }\n }\n\n const newBounds: SelectionBounds = { minX, minY, maxX, maxY };\n const sx = (newBounds.maxX - newBounds.minX) / startW;\n const sy = (newBounds.maxY - newBounds.minY) / startH;\n\n for (const [id, snapshot] of startShapes) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n const nextX = newBounds.minX + (snapshot.x - startBounds.minX) * sx;\n const nextY = newBounds.minY + (snapshot.y - startBounds.minY) * sy;\n const segments = snapshot.segments.map((segment) => ({\n type: segment.type,\n path: encodePoints(\n segment.points.map((p) => ({\n x: p.x * sx,\n y: p.y * sy,\n z: p.z,\n }))\n ),\n }));\n\n editor.store.updateShape(id, {\n x: nextX,\n y: nextY,\n props: { ...shape.props, segments },\n });\n }\n}\n"]}
|