@eyeon/map 2.0.36 → 2.0.39
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/assets/MapViewer.css +1 -1
- package/dist/assets/index.css +1 -1
- package/dist/basemap/GoogleBasemap.d.ts +18 -0
- package/dist/basemap/GoogleBasemap.d.ts.map +1 -0
- package/dist/basemap/SurroundingsPanel.d.ts +14 -0
- package/dist/basemap/SurroundingsPanel.d.ts.map +1 -0
- package/dist/basemap/googleMaps.d.ts +98 -0
- package/dist/basemap/googleMaps.d.ts.map +1 -0
- package/dist/chunks/MapViewer.js +2849 -2576
- package/dist/chunks/MapViewer.js.map +1 -1
- package/dist/chunks/responsive.js +824 -779
- package/dist/chunks/responsive.js.map +1 -1
- package/dist/chunks/wheelZoom.js +28 -28
- package/dist/core/georeference.d.ts +19 -0
- package/dist/core/georeference.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +176 -172
- package/dist/core/publish/index.d.ts +2 -0
- package/dist/core/publish/index.d.ts.map +1 -1
- package/dist/core/types.d.ts +18 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/editor/MapEditor.d.ts +7 -1
- package/dist/editor/MapEditor.d.ts.map +1 -1
- package/dist/editor/draftOps.d.ts +2 -1
- package/dist/editor/draftOps.d.ts.map +1 -1
- package/dist/editor/index.css +175 -2
- package/dist/editor/index.js +5083 -4675
- package/dist/editor/index.js.map +1 -1
- package/dist/editor/panels/LeftRail.d.ts +5 -2
- package/dist/editor/panels/LeftRail.d.ts.map +1 -1
- package/dist/editor/panels/PreviewOverlay.d.ts +8 -2
- package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -1
- package/dist/editor/previewDocument.d.ts.map +1 -1
- package/dist/viewer/MapViewer.d.ts +6 -0
- package/dist/viewer/MapViewer.d.ts.map +1 -1
- package/dist/viewer/components/CameraRig.d.ts +3 -1
- package/dist/viewer/components/CameraRig.d.ts.map +1 -1
- package/dist/viewer/components/MapScene.d.ts +4 -1
- package/dist/viewer/components/MapScene.d.ts.map +1 -1
- package/dist/viewer/index.css +21 -1
- package/dist/viewer/index.js +1 -1
- package/package.json +1 -1
package/dist/editor/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/editor/portalSurface.ts","../../src/editor/history.ts","../../src/editor/tools.tsx","../../src/editor/pathRings.ts","../../src/editor/geometryEdit.ts","../../src/editor/splitJoin.ts","../../src/editor/snapPoint.ts","../../src/editor/ortho.ts","../../src/editor/ellipseDraw.ts","../../src/editor/labelText.ts","../../src/editor/entranceIcon.ts","../../src/editor/canvas/coords.ts","../../src/editor/canvas/editorFill.ts","../../src/editor/canvas/editorHover.ts","../../src/editor/assignmentOverlay.ts","../../src/editor/canvas/AssignedShapeOverlay.tsx","../../src/editor/canvas/OutdoorSvgUnderlay.tsx","../../src/editor/canvas/underlayHint.ts","../../src/editor/routeStubs.ts","../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/dirty.ts","../../src/editor/connectorAssignments.ts","../../src/editor/draftOps.ts","../../src/editor/FieldResetButton.tsx","../../src/editor/hexColor.ts","../../src/editor/panels/formRows.tsx","../../src/editor/panels/AssignmentStyleFields.tsx","../../src/editor/panels/ConnectorAssign.tsx","../../src/editor/labels.ts","../../src/editor/railAssignments.ts","../../src/editor/railKiosks.ts","../../src/editor/railListCopy.ts","../../src/editor/panels/FloorsPanel.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/ClassicMapFooter.tsx","../../src/editor/panels/CatalogKioskForm.tsx","../../src/editor/shapeCopy.ts","../../src/editor/panels/AssignForm.tsx","../../src/editor/panels/BulkAssignForm.tsx","../../src/editor/panels/CopyToLevelButton.tsx","../../src/editor/panels/EntranceIconForm.tsx","../../src/editor/panels/TextLabelForm.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/shapeSelection.ts","../../src/editor/previewDocument.ts","../../src/editor/editorSectionReturn.ts","../../src/editor/floorsListReturn.ts","../../src/editor/GridPrefsControl.tsx","../../src/editor/MapEditor.tsx","../../src/editor/panels/ImportReviewPanel.tsx"],"sourcesContent":["import {\n defaultViewerLevelId,\n floorSwitcherLevels,\n type MapEditorHost,\n type StackLevel,\n} from '../core';\nimport type { RailSection } from './panels/LeftRail';\n\n/** What occupies the PORTAL center pane (rail is always Map options). */\nexport type PortalCenterSurface = 'viewer' | 'editor';\n\n/** Geometry canvas: Edit Map (shapes) or Wayfinding (routes). */\nexport function isEditorSection(section: RailSection | null): boolean {\n return section === 'edit-map' || section === 'wayfinding';\n}\n\n/**\n * PORTAL default is MapViewer (assign on the real map, no editor grid).\n * Edit Map and Wayfinding swap in EditorCanvas + grid. Non-PORTAL editor\n * hosts stay on the geometry canvas.\n */\nexport function portalCenterSurface(\n host: MapEditorHost,\n section: RailSection | null,\n): PortalCenterSurface {\n if (host === 'PORTAL' && !isEditorSection(section)) return 'viewer';\n return 'editor';\n}\n\n/** Building floors only — Outdoor is not routed. */\nexport function wayfindingSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n return floorSwitcherLevels(levels);\n}\n\n/** Floors in admin list order, then Outdoor at the bottom. */\nexport function editMapSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n return [...floorSwitcherLevels(levels), ...outdoor];\n}\n\n/** Lowest building floor (bottom of the Floors list). */\nexport function defaultEditorFloorId(levels: StackLevel[]): number | null {\n return floorSwitcherLevels(levels).at(-1)?.id ?? null;\n}\n\n/**\n * Wayfinding always opens on the ground floor (bottom of the Floors list),\n * not Outdoor or the floor last used in Edit Map.\n */\nexport function levelIdOnEnterWayfinding(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/** Edit Map opens on the lowest building floor; Outdoor only if there are no floors. */\nexport function levelIdOnEnterEditMap(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/**\n * PORTAL default map always lands on the ground floor. Outdoor as the\n * active level hides building floors (`viewerLevelStack`).\n */\nexport function levelIdOnEnterDefaultMap(levels: StackLevel[]): number | null {\n return defaultViewerLevelId(levels);\n}\n\n/**\n * Top-right floor switcher. Edit Map lists floors then Outdoor.\n * Wayfinding lists building floors only.\n */\nexport function editorFloorControlLevels<T extends StackLevel & { name: string }>(\n section: RailSection | null,\n levels: T[],\n): Array<{ id: number; name: string }> {\n const selected =\n section === 'wayfinding'\n ? wayfindingSelectableLevels(levels)\n : editMapSelectableLevels(levels);\n return selected.map((level) => ({\n id: level.id,\n name: level.kind === 'outdoor' ? 'Outdoor' : level.name,\n }));\n}\n\n/** Outdoor can be viewed in Wayfinding but routes and drawing stay off. */\nexport function wayfindingOutdoorReadOnly(\n section: RailSection | null,\n level: { kind?: string } | null | undefined,\n): boolean {\n return section === 'wayfinding' && level?.kind === 'outdoor';\n}\n","import type { BatchOp } from '../core';\n\nexport const EDITOR_HISTORY_LIMIT = 100;\n\nexport type EditorHistorySnapshot = {\n ops: BatchOp[];\n nextTempId: number;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n};\n\nexport type EditorHistory = {\n past: EditorHistorySnapshot[];\n future: EditorHistorySnapshot[];\n};\n\nexport function emptyEditorHistory(): EditorHistory {\n return { past: [], future: [] };\n}\n\nexport function cloneHistorySnapshot(\n snapshot: EditorHistorySnapshot,\n): EditorHistorySnapshot {\n return {\n ops: snapshot.ops.map((op) => JSON.parse(JSON.stringify(op)) as BatchOp),\n nextTempId: snapshot.nextTempId,\n selectedShapeId: snapshot.selectedShapeId,\n selectedAnchorIds: [...snapshot.selectedAnchorIds],\n };\n}\n\nexport function pushEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): EditorHistory {\n return {\n past: [...history.past, cloneHistorySnapshot(current)].slice(-EDITOR_HISTORY_LIMIT),\n future: [],\n };\n}\n\nexport function undoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.past.length === 0) return null;\n const restored = history.past[history.past.length - 1];\n return {\n history: {\n past: history.past.slice(0, -1),\n future: [...history.future, cloneHistorySnapshot(current)],\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function redoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.future.length === 0) return null;\n const restored = history.future[history.future.length - 1];\n return {\n history: {\n past: [...history.past, cloneHistorySnapshot(current)],\n future: history.future.slice(0, -1),\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function isEditableTypingTarget(target: EventTarget | null): boolean {\n if (target == null || typeof target !== 'object') return false;\n const el = target as { tagName?: string; isContentEditable?: boolean };\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return Boolean(el.isContentEditable);\n}\n\ntype HotkeyEvent = Pick<\n KeyboardEvent,\n 'key' | 'metaKey' | 'ctrlKey' | 'shiftKey' | 'altKey'\n>;\n\n/** Ctrl/Cmd+Z — Windows, Linux, and macOS undo. */\nexport function isEditorUndoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey || e.shiftKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n return e.key === 'z' || e.key === 'Z';\n}\n\n/** Ctrl/Cmd+Shift+Z or Ctrl/Cmd+Y — redo on every desktop OS. */\nexport function isEditorRedoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n const key = e.key.toLowerCase();\n if (key === 'z' && e.shiftKey) return true;\n return key === 'y' && !e.shiftKey;\n}\n","import React from 'react';\n\nexport type EditorTool =\n | 'select'\n | 'pan'\n | 'draw-unit'\n | 'draw-polygon'\n | 'draw-circle'\n | 'curve'\n | 'split-join'\n | 'draw-text'\n | 'draw-entrance'\n | 'draw-route'\n | 'create-route'\n | 'create-route-multi';\n\nexport const EDITOR_TOOLS: Array<{\n id: EditorTool;\n label: string;\n draw?: boolean;\n /** Route tools sit after a separator, apart from shape tools. */\n group?: 'map' | 'route';\n /** When set, the label is shown beside the icon instead of only as a tooltip. */\n caption?: string;\n /** Draw a toolbar separator immediately before this tool. */\n sepBefore?: boolean;\n /** Also show this tool on the other toolbar. Curve is shared with Wayfinding. */\n also?: 'map' | 'route';\n}> = [\n { id: 'select', label: 'Select', group: 'map' },\n { id: 'pan', label: 'Pan', group: 'map' },\n { id: 'draw-unit', label: 'Draw rectangle', draw: true, group: 'map' },\n { id: 'draw-polygon', label: 'Draw polygon', draw: true, group: 'map' },\n { id: 'draw-circle', label: 'Draw circle', draw: true, group: 'map' },\n { id: 'curve', label: 'Curve', draw: true, group: 'map', also: 'route' },\n { id: 'split-join', label: 'Split / Join', draw: true, group: 'map' },\n { id: 'draw-text', label: 'Text', draw: true, group: 'map' },\n { id: 'draw-entrance', label: 'Entrance', draw: true, group: 'map' },\n {\n id: 'draw-route',\n label: 'Wayfinding Routes',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route',\n label: 'Create Route',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route-multi',\n label: 'Multi Route',\n draw: true,\n group: 'route',\n },\n];\n\nexport function isRouteTool(tool: string): boolean {\n return (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n );\n}\n\n/** Empty-canvas clicks start a new path with Create Route or Multi Route. */\nexport function canPlaceNewRoute(tool: string): boolean {\n return tool === 'create-route' || tool === 'create-route-multi';\n}\n\n/** Tools that may be active while the Wayfinding section owns the canvas. */\nexport function isWayfindingEditorTool(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || canPlaceNewRoute(tool);\n}\n\n/** Destructive route gestures are intentionally confined to Select. */\nexport function canDeleteWayfindingItem(tool: string): boolean {\n return tool === 'select';\n}\n\n/** Multi Route keeps adding segments until Esc or another tool. */\nexport function canChainRoute(tool: string): boolean {\n return tool === 'create-route-multi';\n}\n\n/** After a segment is committed, keep the end only for Multi Route. */\nexport function nextRouteChainAnchor(\n tool: string,\n endAnchorId: number | null | undefined,\n): number | null {\n if (!canChainRoute(tool)) return null;\n return typeof endAnchorId === 'number' ? endAnchorId : null;\n}\n\nconst ICON_PROPS = {\n width: 16,\n height: 16,\n viewBox: '0 0 16 16',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction SelectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.2 2.4 12.4 8.1l-4.1.6 1.8 4.6-1.8.7-1.8-4.6-2.6 2.4z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction PanIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M4.15 8.05V6.7a.95.95 0 0 1 1.9 0V8.15M6.05 7.2V4.1a.95.95 0 1 1 1.9 0V7.05M7.95 6.9V3.2a.95.95 0 1 1 1.9 0V6.95M9.85 7V3.9a.95.95 0 1 1 1.9 0v5.05c0 2.05-1.5 3.4-3.6 3.4-1.75 0-3.15-1.05-3.35-2.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.45\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n />\n </svg>\n );\n}\n\nfunction DrawPolygonIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M8 2.5 13.2 6.2 11.2 12.5H4.8L2.8 6.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <ellipse\n cx=\"8\"\n cy=\"8\"\n rx=\"5.4\"\n ry=\"5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n />\n </svg>\n );\n}\n\nfunction CurveIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.3 11.6 C4.6 2.4 6.4 2.4 8 8 S11.4 13.6 13.7 4.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n <circle cx=\"2.3\" cy=\"11.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.7\" cy=\"4.4\" r=\"1.35\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SplitJoinIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M1.7 8H5.2M10.8 8h3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"6.15\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n <circle cx=\"9.85\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction DrawTextIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3 4.2h10M8 4.2V13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 13h5.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawEntranceIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M5.4 2.8h6.4A2.8 2.8 0 0 1 14.6 5.6v4.8a2.8 2.8 0 0 1-2.8 2.8H5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M1.7 8h8.1M7.3 5.15 10.4 8l-3.1 2.85\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 12.5c2.2-3.4 3.2-3.6 4.5-3.6 1.6 0 2.2 1.8 4.5 1.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.5\" cy=\"12.5\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8.9\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"12.5\" cy=\"10.7\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction CreateRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12c1.7-2.6 3-3.3 4.8-3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12\" r=\"1.35\" fill=\"currentColor\" />\n <path\n d=\"M11.2 3.4v6.2M8.1 6.5h6.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction CreateRouteMultiIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12.2 6.2 6.4 9.6 9.6 13.2 3.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12.2\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"6.2\" cy=\"6.4\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"9.6\" cy=\"9.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.2\" cy=\"3.6\" r=\"1.35\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 7.5H9a3.5 3.5 0 1 1 0 7H7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6 4.5 3 7.5 6 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction RedoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M12.5 7.5H7a3.5 3.5 0 1 0 0 7h1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10 4.5 13 7.5 10 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst TOOL_ICONS: Record<EditorTool, () => React.ReactElement> = {\n select: SelectIcon,\n pan: PanIcon,\n 'draw-unit': DrawRectIcon,\n 'draw-polygon': DrawPolygonIcon,\n 'draw-circle': DrawCircleIcon,\n curve: CurveIcon,\n 'split-join': SplitJoinIcon,\n 'draw-text': DrawTextIcon,\n 'draw-entrance': DrawEntranceIcon,\n 'draw-route': DrawRouteIcon,\n 'create-route': CreateRouteIcon,\n 'create-route-multi': CreateRouteMultiIcon,\n};\n\n/** Select and Curve can click a shape to make it the edit target. */\nexport function canSelectShapes(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\n/** Store geometry belongs to Edit Map; Wayfinding only edits the route graph. */\nexport function canEditShapeGeometry(\n tool: EditorTool,\n routeMode = false,\n): boolean {\n return !routeMode && canSelectShapes(tool);\n}\n\nexport function isSplitJoinTool(tool: EditorTool): boolean {\n return tool === 'split-join';\n}\n\n/** Click-to-place closed polygons. */\nexport function isPolygonDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-polygon';\n}\n\n/**\n * Points placed for a store that is not closed yet. Undo removes the last\n * one and leaves earlier finished stores in history.\n */\nexport function popPolygonDraftPoint<T>(points: readonly T[]): {\n points: T[];\n consumed: boolean;\n} {\n if (points.length === 0) return { points: [...points], consumed: false };\n return { points: points.slice(0, -1), consumed: true };\n}\n\n/** Click-drag oval / circle. */\nexport function isEllipseDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-circle';\n}\n\n/** Rectangle, polygon, and circle — plus cursor for placement. */\nexport function isShapeDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-unit' || tool === 'draw-polygon' || tool === 'draw-circle';\n}\n\n/** Click-to-place text or entrance stamps. */\nexport function isStampDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-text' || tool === 'draw-entrance';\n}\n\n/** Click two open ends to join them — Select after a split, or Split / Join. */\nexport function canJoinOpenEnds(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'split-join';\n}\n\n/** Corner anchors — Select, Curve, and Split / Join. */\nexport function showsShapeAnchors(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\n/** Midpoint bend dots and cubic handles — only the Curve tool. */\nexport function showsCurveHandles(tool: EditorTool): boolean {\n return tool === 'curve';\n}\n\n/** Empty-canvas drag pans in Select, Curve, Pan, and Wayfinding edit. */\nexport function emptyCanvasDragPans(tool: EditorTool): boolean {\n return (\n tool === 'select' ||\n tool === 'curve' ||\n tool === 'split-join' ||\n tool === 'pan' ||\n tool === 'draw-route'\n );\n}\n\n/** Create Route or Multi Route again returns to Select. */\nexport function nextEditorTool(current: EditorTool, next: EditorTool): EditorTool {\n if (next === current && canPlaceNewRoute(next)) return 'select';\n return next;\n}\n\nexport function toolHint(tool: EditorTool, group?: 'map' | 'route'): string {\n if (group === 'route') {\n switch (tool) {\n case 'curve':\n return 'Click a walking path to show its curve handles. Drag the midpoint to pull an arch, then use the two handles to fine-tune. Double-click a handle to flatten it back to a line.';\n case 'create-route':\n return 'Click two points to create one route. Click two more to add another. Esc or Undo steps back.';\n case 'create-route-multi':\n return 'Keep clicking to add connected routes. Esc or Undo steps back without changing the tool.';\n case 'pan':\n return 'Drag the map to move around. Walking paths stay on the selected floor.';\n case 'select':\n default:\n return 'Click an anchor or a walking path to select it. Drag empty space to pan. Double-click a walking path to delete it. Use Create Route or Multi Route in the toolbar to add a point on an existing path.';\n }\n }\n switch (tool) {\n case 'pan':\n return 'Drag the map to move around.';\n case 'draw-unit':\n return 'Click and drag to draw a store rectangle.';\n case 'draw-polygon':\n return 'Click to place points. Hold Shift to draw a straight horizontal or vertical line. Hover an existing anchor to snap to it. Click the first point or press Enter to close. Undo removes the last point. Esc cancels.';\n case 'draw-circle':\n return 'Click and drag to draw an oval. Hold Shift to keep it a circle.';\n case 'curve':\n return 'Select a shape to see its anchors. Drag a midpoint to pull an arch, then use the two handles to fine-tune. Double-click a handle to flatten it back to a line.';\n case 'split-join':\n return 'Click a wall to split it open. Click an open end to switch to Select and join it to another end. To merge, click the shared wall on each store.';\n case 'draw-text':\n return 'Click the map to place text. Click existing text to select it.';\n case 'draw-entrance':\n return 'Click the map to place an entrance marker. Click an existing marker to select it.';\n case 'draw-route':\n return '';\n case 'create-route':\n return 'Click two points to create one route. Click two more to add another. Esc or Undo steps back.';\n case 'create-route-multi':\n return 'Keep clicking to add connected routes. Esc or Undo steps back without changing the tool.';\n case 'select':\n default:\n return 'Click a shape to select it. Drag empty space to pan, or hold Space to pan while another tool is active. Drag a shape to move it. Hover a side to highlight it, then click to add an anchor. Click and drag a side to move both ends and expand the shape. Hold Shift while dragging an anchor to keep the line straight. Double-click an anchor to delete it. Click two open endpoints to join them.';\n }\n}\n\nexport interface EditorToolButtonsProps {\n tool: EditorTool;\n onToolChange: (tool: EditorTool) => void;\n canEdit: boolean;\n /** Omit to show every tool. PORTAL Edit Map is `map`; Wayfinding is `route`. */\n group?: 'map' | 'route';\n}\n\nexport function EditorToolButtons({\n tool,\n onToolChange,\n canEdit,\n group,\n}: EditorToolButtonsProps) {\n const mapTools = EDITOR_TOOLS.filter((t) => t.group !== 'route');\n const routeTools = EDITOR_TOOLS.filter(\n (t) => t.group === 'route' && t.id !== 'draw-route',\n );\n const routeCurveTools =\n group === 'route' ? EDITOR_TOOLS.filter((t) => t.also === 'route') : [];\n const showMap = group !== 'route';\n const showRoute = group !== 'map';\n const selectTool = EDITOR_TOOLS.find((t) => t.id === 'select');\n const routeToolbar =\n group === 'route' && selectTool\n ? [selectTool, ...routeTools, ...routeCurveTools]\n : routeTools;\n\n const renderButton = (t: (typeof EDITOR_TOOLS)[number]) => {\n const Icon = TOOL_ICONS[t.id];\n return (\n <button\n key={t.id}\n type=\"button\"\n className={`eyeon-map-editor__tool-icon${t.caption ? ' eyeon-map-editor__tool-icon--labeled' : ''}${tool === t.id ? ' is-active' : ''}`}\n data-tooltip={t.caption ? undefined : t.label}\n aria-label={t.label}\n aria-pressed={tool === t.id}\n onClick={() => onToolChange(t.id)}\n disabled={!canEdit && t.draw}\n >\n <Icon />\n {t.caption ? (\n <span className=\"eyeon-map-editor__tool-caption\">{t.caption}</span>\n ) : null}\n </button>\n );\n };\n\n return (\n <div className=\"eyeon-map-editor__tool-icons\" role=\"toolbar\" aria-label=\"Map tools\">\n {showMap\n ? mapTools.map((t) => (\n <React.Fragment key={t.id}>\n {t.sepBefore ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {renderButton(t)}\n </React.Fragment>\n ))\n : null}\n {showMap && showRoute ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {showRoute ? routeToolbar.map(renderButton) : null}\n </div>\n );\n}\n\nexport interface EditorHistoryButtonsProps {\n canUndo: boolean;\n canRedo: boolean;\n disabled?: boolean;\n onUndo: () => void;\n onRedo: () => void;\n}\n\nexport function EditorHistoryButtons({\n canUndo,\n canRedo,\n disabled = false,\n onUndo,\n onRedo,\n}: EditorHistoryButtonsProps) {\n return (\n <div className=\"eyeon-map-editor__history\" role=\"group\" aria-label=\"Undo and redo\">\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Undo\"\n aria-label=\"Undo\"\n onClick={onUndo}\n disabled={disabled || !canUndo}\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Redo\"\n aria-label=\"Redo\"\n onClick={onRedo}\n disabled={disabled || !canRedo}\n >\n <RedoIcon />\n </button>\n </div>\n );\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport {\n approximateCubic,\n buildGeometryFromPaths,\n distance,\n projectOntoSegment,\n tokenizePathData,\n} from '../core';\n\nexport type PathEdge =\n | { kind: 'line' }\n | { kind: 'cubic'; c1: Vec2; c2: Vec2 };\n\n/** One closed or open subpath as corner anchors + one edge between each pair. */\nexport interface PathRing {\n closed: boolean;\n anchors: Vec2[];\n /** `edges[i]` runs from `anchors[i]` to the next anchor (wraps when closed). */\n edges: PathEdge[];\n}\n\nconst EPS = 1e-4;\n\nexport function vecEq(a: Vec2, b: Vec2, eps = EPS): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n\nexport function cloneVec(p: Vec2): Vec2 {\n return { x: p.x, y: p.y };\n}\n\nexport function addVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function subVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x - b.x, y: a.y - b.y };\n}\n\nexport function scaleVec(a: Vec2, s: number): Vec2 {\n return { x: a.x * s, y: a.y * s };\n}\n\nexport function lerpVec(a: Vec2, b: Vec2, t: number): Vec2 {\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };\n}\n\nexport function edgeCount(ring: PathRing): number {\n if (ring.anchors.length < 2) return 0;\n return ring.closed ? ring.anchors.length : ring.anchors.length - 1;\n}\n\nexport function edgeFrom(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[edgeIndex];\n}\n\nexport function edgeTo(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[(edgeIndex + 1) % ring.anchors.length];\n}\n\nexport function edgeToPathD(ring: PathRing, edgeIndex: number): string {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n return `M ${from.x} ${from.y} C ${edge.c1.x} ${edge.c1.y} ${edge.c2.x} ${edge.c2.y} ${to.x} ${to.y}`;\n }\n return `M ${from.x} ${from.y} L ${to.x} ${to.y}`;\n}\n\nexport function fmtCoord(n: number): string {\n const r = Math.round(n * 1000) / 1000;\n return Object.is(r, -0) ? '0' : String(r);\n}\n\nexport function ringFromPolygon(poly: Vec2[], closed = true): PathRing {\n const anchors = poly.map(cloneVec);\n if (\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const edges: PathEdge[] = anchors.map(() => ({ kind: 'line' }));\n if (!closed && edges.length > 0) edges.pop();\n return { closed, anchors, edges };\n}\n\n/**\n * Quadratic (p0, q, p2) → cubic handles.\n */\nexport function quadraticToCubic(p0: Vec2, q: Vec2, p2: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n return {\n c1: lerpVec(p0, q, 2 / 3),\n c2: lerpVec(p2, q, 2 / 3),\n };\n}\n\n/**\n * Symmetric cubic that passes through `pull` at t = 0.5.\n * Used when the user drags a straight side into an arch.\n */\nexport function cubicHandlesForPull(from: Vec2, to: Vec2, pull: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n const mid = lerpVec(from, to, 0.5);\n const offset = scaleVec(subVec(pull, mid), 4 / 3);\n const chord = subVec(to, from);\n return {\n c1: addVec(addVec(from, scaleVec(chord, 1 / 3)), offset),\n c2: addVec(addVec(from, scaleVec(chord, 2 / 3)), offset),\n };\n}\n\nexport function cubicPoint(p0: Vec2, c1: Vec2, c2: Vec2, p3: Vec2, t: number): Vec2 {\n const u = 1 - t;\n return {\n x: u * u * u * p0.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * p3.x,\n y: u * u * u * p0.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * p3.y,\n };\n}\n\nexport function splitCubic(\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n t: number,\n): {\n left: { c1: Vec2; c2: Vec2; to: Vec2 };\n right: { c1: Vec2; c2: Vec2; to: Vec2 };\n} {\n const a = lerpVec(p0, c1, t);\n const b = lerpVec(c1, c2, t);\n const c = lerpVec(c2, p3, t);\n const d = lerpVec(a, b, t);\n const e = lerpVec(b, c, t);\n const mid = lerpVec(d, e, t);\n return {\n left: { c1: a, c2: d, to: mid },\n right: { c1: e, c2: c, to: p3 },\n };\n}\n\n/**\n * Split an SVG elliptical arc into cubics (one per ≤90° sweep) so Edit Map\n * can treat each arch as two anchors + two handles.\n */\nexport function ellipticalArcToCubics(\n p0: Vec2,\n rx: number,\n ry: number,\n xAxisRotationDeg: number,\n largeArc: boolean,\n sweep: boolean,\n p1: Vec2,\n): Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> {\n if (vecEq(p0, p1)) return [];\n let arx = Math.abs(rx);\n let ary = Math.abs(ry);\n if (arx === 0 || ary === 0 || !Number.isFinite(arx) || !Number.isFinite(ary)) {\n return [];\n }\n\n const phi = ((xAxisRotationDeg % 360) * Math.PI) / 180;\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n const dx2 = (p0.x - p1.x) / 2;\n const dy2 = (p0.y - p1.y) / 2;\n const x1p = cosPhi * dx2 + sinPhi * dy2;\n const y1p = -sinPhi * dx2 + cosPhi * dy2;\n const lambda = (x1p * x1p) / (arx * arx) + (y1p * y1p) / (ary * ary);\n if (lambda > 1) {\n const scale = Math.sqrt(lambda);\n arx *= scale;\n ary *= scale;\n }\n const rxSq = arx * arx;\n const rySq = ary * ary;\n const numerator = rxSq * rySq - rxSq * y1p * y1p - rySq * x1p * x1p;\n const denominator = rxSq * y1p * y1p + rySq * x1p * x1p;\n const factor =\n Math.sqrt(Math.max(0, numerator / denominator)) * (largeArc === sweep ? -1 : 1);\n const cxp = (factor * arx * y1p) / ary;\n const cyp = (-factor * ary * x1p) / arx;\n const cx = cosPhi * cxp - sinPhi * cyp + (p0.x + p1.x) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (p0.y + p1.y) / 2;\n const ux = (x1p - cxp) / arx;\n const uy = (y1p - cyp) / ary;\n const vx = (-x1p - cxp) / arx;\n const vy = (-y1p - cyp) / ary;\n const theta1 = Math.atan2(uy, ux);\n let deltaTheta = Math.atan2(ux * vy - uy * vx, ux * vx + uy * vy);\n if (!sweep && deltaTheta > 0) deltaTheta -= 2 * Math.PI;\n else if (sweep && deltaTheta < 0) deltaTheta += 2 * Math.PI;\n\n const ellipsePoint = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n return {\n x: cx + arx * cosPhi * cosT - ary * sinPhi * sinT,\n y: cy + arx * sinPhi * cosT + ary * cosPhi * sinT,\n };\n };\n const ellipseDeriv = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n const dx = -arx * sinT;\n const dy = ary * cosT;\n return {\n x: cosPhi * dx - sinPhi * dy,\n y: sinPhi * dx + cosPhi * dy,\n };\n };\n\n const out: Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> = [];\n let t0 = theta1;\n let remaining = deltaTheta;\n while (Math.abs(remaining) > 1e-8) {\n const step =\n Math.sign(remaining) * Math.min(Math.abs(remaining), Math.PI / 2);\n const t1 = t0 + step;\n const k = (4 / 3) * Math.tan(step / 4);\n const start = ellipsePoint(t0);\n const end = ellipsePoint(t1);\n const d0 = ellipseDeriv(t0);\n const d1 = ellipseDeriv(t1);\n out.push({\n c1: { x: start.x + k * d0.x, y: start.y + k * d0.y },\n c2: { x: end.x - k * d1.x, y: end.y - k * d1.y },\n to: end,\n });\n t0 = t1;\n remaining -= step;\n }\n if (out.length > 0) {\n out[out.length - 1].to = cloneVec(p1);\n }\n return out;\n}\n\nexport function parsePathToRings(d: string): PathRing[] {\n const tokens = tokenizePathData(d);\n const rings: PathRing[] = [];\n let anchors: Vec2[] = [];\n let edges: PathEdge[] = [];\n let x = 0;\n let y = 0;\n let startX = 0;\n let startY = 0;\n let lastCtrl: Vec2 | null = null;\n let i = 0;\n let cmd = '';\n let started = false;\n\n const readNum = () => Number(tokens[i++]);\n\n const flush = (closed: boolean) => {\n if (\n closed &&\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const expected = closed ? anchors.length : Math.max(0, anchors.length - 1);\n while (edges.length > expected) edges.pop();\n while (edges.length < expected) edges.push({ kind: 'line' });\n if (anchors.length >= 2) {\n rings.push({\n closed,\n anchors: anchors.map(cloneVec),\n edges: edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) },\n ),\n });\n }\n anchors = [];\n edges = [];\n started = false;\n };\n\n const pushAnchor = (p: Vec2): boolean => {\n if (anchors.length > 0 && vecEq(anchors[anchors.length - 1], p)) return false;\n anchors.push(cloneVec(p));\n return true;\n };\n\n while (i < tokens.length) {\n const t = tokens[i];\n if (/[a-zA-Z]/.test(t)) {\n cmd = t;\n i++;\n }\n\n switch (cmd) {\n case 'M':\n case 'm': {\n const isRel = cmd === 'm';\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (started) flush(false);\n x = nx;\n y = ny;\n startX = x;\n startY = y;\n pushAnchor({ x, y });\n started = true;\n lastCtrl = null;\n cmd = isRel ? 'l' : 'L';\n break;\n }\n case 'L':\n case 'l': {\n const isRel = cmd === 'l';\n x = isRel ? x + readNum() : readNum();\n y = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'H':\n case 'h': {\n x = cmd === 'h' ? x + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'V':\n case 'v': {\n y = cmd === 'v' ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'C':\n case 'c': {\n const isRel = cmd === 'c';\n const x1 = isRel ? x + readNum() : readNum();\n const y1 = isRel ? y + readNum() : readNum();\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1: { x: x1, y: y1 },\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'S':\n case 's': {\n const isRel = cmd === 's';\n const c1 = lastCtrl\n ? { x: 2 * x - lastCtrl.x, y: 2 * y - lastCtrl.y }\n : { x, y };\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1,\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'Q':\n case 'q': {\n const isRel = cmd === 'q';\n const qx = isRel ? x + readNum() : readNum();\n const qy = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'T':\n case 't': {\n const isRel = cmd === 't';\n const qx: number = lastCtrl ? 2 * x - lastCtrl.x : x;\n const qy: number = lastCtrl ? 2 * y - lastCtrl.y : y;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'A':\n case 'a': {\n const isRel = cmd === 'a';\n const rx = readNum();\n const ry = readNum();\n const rot = readNum();\n const largeArc = readNum() !== 0;\n const sweep = readNum() !== 0;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const cubics = ellipticalArcToCubics(\n { x, y },\n rx,\n ry,\n rot,\n largeArc,\n sweep,\n { x: nx, y: ny },\n );\n if (cubics.length === 0) {\n if (pushAnchor({ x: nx, y: ny })) edges.push({ kind: 'line' });\n } else {\n for (const cubic of cubics) {\n if (pushAnchor(cubic.to)) {\n edges.push({ kind: 'cubic', c1: cubic.c1, c2: cubic.c2 });\n }\n }\n }\n lastCtrl = null;\n x = nx;\n y = ny;\n break;\n }\n case 'Z':\n case 'z': {\n if (!vecEq({ x, y }, { x: startX, y: startY })) {\n edges.push({ kind: 'line' });\n }\n x = startX;\n y = startY;\n flush(true);\n lastCtrl = null;\n break;\n }\n default:\n i++;\n break;\n }\n }\n\n if (started) flush(false);\n return rings;\n}\n\nexport function ringToPathD(ring: PathRing): string {\n if (ring.anchors.length === 0) return '';\n const a0 = ring.anchors[0];\n let d = `M ${fmtCoord(a0.x)} ${fmtCoord(a0.y)}`;\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const to = edgeTo(ring, i);\n const edge = ring.edges[i];\n const closingLine =\n ring.closed && i === n - 1 && (!edge || edge.kind === 'line');\n if (closingLine) continue;\n if (!edge || edge.kind === 'line') {\n d += ` L ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n } else {\n d += ` C ${fmtCoord(edge.c1.x)} ${fmtCoord(edge.c1.y)} ${fmtCoord(edge.c2.x)} ${fmtCoord(edge.c2.y)} ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n }\n }\n if (ring.closed) d += ' Z';\n return d;\n}\n\nexport function ringsToGeometry(rings: PathRing[]): ShapeGeometry {\n const ds = rings\n .filter((ring) => ring.anchors.length >= 2)\n .map(ringToPathD)\n .filter(Boolean);\n if (ds.length === 0) {\n return { paths: [], polygons: [] };\n }\n const geometry = buildGeometryFromPaths(ds);\n return {\n ...geometry,\n polygons: geometry.polygons.map((poly) =>\n poly.length > 1 && vecEq(poly[0], poly[poly.length - 1])\n ? poly.slice(0, -1)\n : poly,\n ),\n };\n}\n\nconst ARCH_CORNER_RAD = (28 * Math.PI) / 180;\nconst MIN_ARCH_POINTS = 4;\nconst MIN_ARCH_BULGE = 3;\nconst MIN_ARCH_BULGE_RATIO = 0.035;\n/** Wider than a semicircle (0.5) is a loop, not a storefront arch. */\nconst MAX_ARCH_BULGE_RATIO = 0.65;\n\nfunction signedTurn(prev: Vec2, cur: Vec2, next: Vec2): number {\n const ax = cur.x - prev.x;\n const ay = cur.y - prev.y;\n const bx = next.x - cur.x;\n const by = next.y - cur.y;\n return Math.atan2(ax * by - ay * bx, ax * bx + ay * by);\n}\n\nfunction runLooksLikeArch(pts: Vec2[]): boolean {\n if (pts.length < MIN_ARCH_POINTS) return false;\n const a = pts[0];\n const b = pts[pts.length - 1];\n const chord = distance(a, b);\n if (chord < EPS) return false;\n let maxDev = 0;\n let side = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const proj = projectOntoSegment(pts[i], a, b);\n maxDev = Math.max(maxDev, proj.distance);\n const s = Math.sign(\n (b.x - a.x) * (pts[i].y - a.y) - (b.y - a.y) * (pts[i].x - a.x),\n );\n if (s === 0) continue;\n if (side === 0) side = s;\n else if (s !== side) return false;\n }\n if (maxDev < Math.max(MIN_ARCH_BULGE, chord * MIN_ARCH_BULGE_RATIO)) {\n return false;\n }\n if (maxDev > chord * MAX_ARCH_BULGE_RATIO) {\n return false;\n }\n for (let i = 1; i < pts.length - 1; i++) {\n if (Math.abs(signedTurn(pts[i - 1], pts[i], pts[i + 1])) > ARCH_CORNER_RAD) {\n return false;\n }\n }\n return true;\n}\n\nfunction fitCubicThroughRun(pts: Vec2[]): PathEdge {\n const from = pts[0];\n const to = pts[pts.length - 1];\n let pull = pts[Math.floor(pts.length / 2)];\n let maxDev = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = projectOntoSegment(pts[i], from, to).distance;\n if (d > maxDev) {\n maxDev = d;\n pull = pts[i];\n }\n }\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n return { kind: 'cubic', c1, c2 };\n}\n\n/**\n * Designer SVGs often flatten an arch into many short lines. Collapse those\n * runs to one cubic (2 anchors + 2 handles) when the bulge is unambiguous.\n */\nfunction cubicDeviationFromChord(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): number {\n const samples = approximateCubic(from, c1, c2, to, 16);\n let maxDev = 0;\n for (const point of samples) {\n maxDev = Math.max(maxDev, projectOntoSegment(point, from, to).distance);\n }\n return maxDev;\n}\n\n/** A cubic whose bulge is much longer than its chord is a leftover loop, not an arch. */\nexport function cubicIsRunaway(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): boolean {\n const chord = distance(from, to);\n const dev = cubicDeviationFromChord(from, c1, c2, to);\n if (chord < EPS) return dev > EPS;\n return dev > chord * MAX_ARCH_BULGE_RATIO;\n}\n\nfunction flattenRunawayCubics(ring: PathRing): PathRing {\n const n = edgeCount(ring);\n let changed = false;\n const edges = ring.edges.map((edge, i) => {\n if (i >= n || edge.kind !== 'cubic') return edge;\n if (!cubicIsRunaway(edgeFrom(ring, i), edge.c1, edge.c2, edgeTo(ring, i))) {\n return edge;\n }\n changed = true;\n return { kind: 'line' as const };\n });\n return changed ? { ...ring, edges } : ring;\n}\n\nexport function collapseLineRunsToCubics(ring: PathRing): PathRing {\n const n = ring.anchors.length;\n if (n < MIN_ARCH_POINTS) return ring;\n const idx = (i: number) => ((i % n) + n) % n;\n\n const incoming = (i: number) =>\n ring.closed ? ring.edges[idx(i - 1)] : i > 0 ? ring.edges[i - 1] : undefined;\n const outgoing = (i: number) =>\n ring.closed ? ring.edges[i] : i < n - 1 ? ring.edges[i] : undefined;\n\n const isSharp = (i: number): boolean => {\n if (!ring.closed && (i === 0 || i === n - 1)) return true;\n if (incoming(i)?.kind === 'cubic' || outgoing(i)?.kind === 'cubic') {\n return true;\n }\n return (\n Math.abs(\n signedTurn(ring.anchors[idx(i - 1)], ring.anchors[i], ring.anchors[idx(i + 1)]),\n ) > ARCH_CORNER_RAD\n );\n };\n\n let start = 0;\n if (ring.closed) {\n const sharp = [...Array(n).keys()].find(isSharp);\n if (sharp == null) return ring;\n start = sharp;\n }\n\n const outA: Vec2[] = [];\n const outE: PathEdge[] = [];\n const walk = ring.closed ? n : n - 1;\n\n const emitRun = (fromW: number, toW: number) => {\n const pts: Vec2[] = [];\n for (let w = fromW; w <= toW; w++) {\n pts.push(ring.anchors[idx(start + w)]);\n }\n const linesOnly = pts.slice(0, -1).every((_, k) => {\n const edge = ring.edges[idx(start + fromW + k)];\n return !edge || edge.kind === 'line';\n });\n if (outA.length === 0) outA.push(cloneVec(pts[0]));\n if (linesOnly && runLooksLikeArch(pts)) {\n outA.push(cloneVec(pts[pts.length - 1]));\n outE.push(fitCubicThroughRun(pts));\n return;\n }\n for (let k = 1; k < pts.length; k++) {\n outA.push(cloneVec(pts[k]));\n outE.push(ring.edges[idx(start + fromW + k - 1)] ?? { kind: 'line' });\n }\n };\n\n let last = 0;\n for (let w = 1; w <= walk; w++) {\n const i = idx(start + w);\n if (w === walk || isSharp(i)) {\n emitRun(last, w);\n last = w;\n }\n }\n\n if (\n ring.closed &&\n outA.length > 1 &&\n vecEq(outA[0], outA[outA.length - 1])\n ) {\n outA.pop();\n }\n const expected = ring.closed ? outA.length : Math.max(0, outA.length - 1);\n while (outE.length > expected) outE.pop();\n if (outA.length < 2) return ring;\n return { closed: ring.closed, anchors: outA, edges: outE };\n}\n\nexport function geometryToRings(geometry: ShapeGeometry): PathRing[] {\n const fromPaths = geometry.paths.flatMap((p) => parsePathToRings(p.d));\n const source = fromPaths.some((ring) => ring.anchors.length >= 2)\n ? fromPaths.filter((ring) => ring.anchors.length >= 2)\n : geometry.polygons\n .filter((poly) => poly.length >= 2)\n .map((poly) => ringFromPolygon(poly, true));\n return source.map((ring) => flattenRunawayCubics(collapseLineRunsToCubics(ring)));\n}\n\n/** Closest point on one ring edge — keeps the add-anchor preview on the line. */\nexport function pointOnRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): Vec2 {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).point;\n }\n return projectOntoSegment(point, from, to).point;\n}\n\nexport function nearestTOnCubic(\n point: Vec2,\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n): { t: number; point: Vec2; distance: number } {\n const samples = approximateCubic(p0, c1, c2, p3, 16);\n let bestT = 0;\n let bestPt = samples[0];\n let bestD = distance(point, samples[0]);\n for (let i = 1; i < samples.length; i++) {\n const d = distance(point, samples[i]);\n if (d < bestD) {\n bestD = d;\n bestPt = samples[i];\n bestT = i / (samples.length - 1);\n }\n }\n return { t: bestT, point: bestPt, distance: bestD };\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { geometryBBox, projectOntoSegment } from '../core';\nimport {\n addVec,\n cloneVec,\n cubicHandlesForPull,\n cubicPoint,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n subVec,\n type PathRing,\n} from './pathRings';\n\nfunction clonePolygons(polygons: Vec2[][]): Vec2[][] {\n return polygons.map((poly) => poly.map((p) => ({ x: p.x, y: p.y })));\n}\n\n/** Rebuild absolute path `d` strings from polygon rings (lossy for beziers). */\nexport function polygonsToPathD(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) {\n d += ` L ${poly[i].x} ${poly[i].y}`;\n }\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nexport function polygonsToGeometry(polygons: Vec2[][]): ShapeGeometry {\n const cleaned = polygons\n .map((poly) => {\n if (\n poly.length > 1 &&\n poly[0].x === poly[poly.length - 1].x &&\n poly[0].y === poly[poly.length - 1].y\n ) {\n return poly.slice(0, -1);\n }\n return poly;\n })\n .filter((poly) => poly.length >= 3);\n return {\n paths: cleaned.map((poly) => ({\n d: polygonsToPathD([poly]),\n closed: true,\n })),\n polygons: cleaned,\n };\n}\n\nfunction commitRings(rings: PathRing[]): ShapeGeometry {\n return ringsToGeometry(rings);\n}\n\nfunction incomingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) {\n return (anchorIndex - 1 + ring.anchors.length) % ring.anchors.length;\n }\n return anchorIndex > 0 ? anchorIndex - 1 : null;\n}\n\nfunction outgoingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) return anchorIndex;\n return anchorIndex < ring.anchors.length - 1 ? anchorIndex : null;\n}\n\nexport function translateGeometry(\n geometry: ShapeGeometry,\n dx: number,\n dy: number,\n): ShapeGeometry {\n const delta = { x: dx, y: dy };\n const rings = geometryToRings(geometry).map((ring) => ({\n closed: ring.closed,\n anchors: ring.anchors.map((p) => addVec(p, delta)),\n edges: ring.edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' as const }\n : {\n kind: 'cubic' as const,\n c1: addVec(edge.c1, delta),\n c2: addVec(edge.c2, delta),\n },\n ),\n }));\n if (rings.length === 0) {\n const polygons = clonePolygons(geometry.polygons).map((poly) =>\n poly.map((p) => ({ x: p.x + dx, y: p.y + dy })),\n );\n return polygonsToGeometry(polygons);\n }\n return commitRings(rings);\n}\n\n/** Slide one side: both endpoints (and that edge's handles) move together. */\nexport function translateEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n delta: Vec2,\n): ShapeGeometry {\n if (delta.x === 0 && delta.y === 0) return geometry;\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % ring.anchors.length;\n ring.anchors[fromIdx] = addVec(ring.anchors[fromIdx], delta);\n ring.anchors[toIdx] = addVec(ring.anchors[toIdx], delta);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n edge.c1 = addVec(edge.c1, delta);\n edge.c2 = addVec(edge.c2, delta);\n }\n const incoming = incomingEdgeIndex(ring, fromIdx);\n if (incoming != null && incoming !== edgeIndex) {\n const prev = ring.edges[incoming];\n if (prev?.kind === 'cubic') prev.c2 = addVec(prev.c2, delta);\n }\n const outgoing = outgoingEdgeIndex(ring, toIdx);\n if (outgoing != null && outgoing !== edgeIndex) {\n const next = ring.edges[outgoing];\n if (next?.kind === 'cubic') next.c1 = addVec(next.c1, delta);\n }\n return commitRings(rings);\n}\n\n/** Connected corners used to keep a dragged anchor horizontal or vertical. */\nexport function vertexNeighborPoints(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): Vec2[] {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || ring.anchors.length < 2) return [];\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return [];\n const count = ring.anchors.length;\n const prev = ring.anchors[(vertexIndex - 1 + count) % count];\n const next = ring.anchors[(vertexIndex + 1) % count];\n const points = [cloneVec(prev)];\n if (prev.x !== next.x || prev.y !== next.y) points.push(cloneVec(next));\n return points;\n}\n\nexport function moveVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || vertexIndex < 0 || vertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const prev = ring.anchors[vertexIndex];\n const delta = subVec(point, prev);\n ring.anchors[vertexIndex] = cloneVec(point);\n const incoming = incomingEdgeIndex(ring, vertexIndex);\n const outgoing = outgoingEdgeIndex(ring, vertexIndex);\n if (incoming != null) {\n const edge = ring.edges[incoming];\n if (edge?.kind === 'cubic') edge.c2 = addVec(edge.c2, delta);\n }\n if (outgoing != null) {\n const edge = ring.edges[outgoing];\n if (edge?.kind === 'cubic') edge.c1 = addVec(edge.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveHandle(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n handle: 1 | 2,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n if (handle === 1) edge.c1 = cloneVec(point);\n else edge.c2 = cloneVec(point);\n return commitRings(rings);\n}\n\n/** Drop both handles so the arch becomes a straight side. */\nexport function flattenCubicEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n ring.edges[edgeIndex] = { kind: 'line' };\n return commitRings(rings);\n}\n\n/** Pull a straight side into a cubic arch (or reshape a cubic from its chord). */\nexport function bendEdgeToCubic(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n pull: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n ring.edges[edgeIndex] = { kind: 'cubic', c1, c2 };\n return commitRings(rings);\n}\n\n/**\n * Insert a vertex after `vertexIndex` on the given ring (before the next point).\n */\nexport function insertVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n afterVertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || afterVertexIndex < 0 || afterVertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const edgeIndex = outgoingEdgeIndex(ring, afterVertexIndex);\n if (edgeIndex == null) return geometry;\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n\n if (edge.kind === 'cubic') {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const splitT = Math.min(0.95, Math.max(0.05, t));\n const split = splitCubic(from, edge.c1, edge.c2, to, splitT);\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(split.left.to));\n ring.edges.splice(edgeIndex, 1, { kind: 'cubic', c1: split.left.c1, c2: split.left.c2 }, {\n kind: 'cubic',\n c1: split.right.c1,\n c2: split.right.c2,\n });\n } else {\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(point));\n ring.edges.splice(edgeIndex, 1, { kind: 'line' }, { kind: 'line' });\n }\n return commitRings(rings);\n}\n\n/** Remove a vertex; refuses to go below 3 points on a closed ring. */\nexport function removeVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring) return geometry;\n const min = ring.closed ? 3 : 2;\n if (ring.anchors.length <= min) return geometry;\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return geometry;\n\n const n = ring.anchors.length;\n if (ring.closed) {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n const join = vertexIndex === 0 ? ring.anchors.length - 1 : vertexIndex - 1;\n if (ring.edges[join]) ring.edges[join] = { kind: 'line' };\n } else if (vertexIndex === 0) {\n ring.anchors.splice(0, 1);\n ring.edges.splice(0, 1);\n } else if (vertexIndex === n - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n } else {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n ring.edges[vertexIndex - 1] = { kind: 'line' };\n }\n return commitRings(rings);\n}\n\nexport interface VertexHit {\n polygonIndex: number;\n vertexIndex: number;\n point: Vec2;\n distance: number;\n}\n\n/** Nearest path anchor within `tolerance` world units, or null. */\nexport function hitTestVertex(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): VertexHit | null {\n let best: VertexHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n ring.anchors.forEach((vertex, vertexIndex) => {\n const distance = Math.hypot(vertex.x - point.x, vertex.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = {\n polygonIndex,\n vertexIndex,\n point: { x: vertex.x, y: vertex.y },\n distance,\n };\n }\n });\n });\n return best;\n}\n\nexport interface HandleHit {\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n point: Vec2;\n distance: number;\n}\n\nexport function hitTestHandle(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): HandleHit | null {\n let best: HandleHit | null = null;\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n const n = edgeCount(ring);\n for (let edgeIndex = 0; edgeIndex < n; edgeIndex++) {\n const edge = ring.edges[edgeIndex];\n if (edge?.kind !== 'cubic') continue;\n for (const handle of [1, 2] as const) {\n const hp = handle === 1 ? edge.c1 : edge.c2;\n const distance = Math.hypot(hp.x - point.x, hp.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = { ringIndex, edgeIndex, handle, point: cloneVec(hp), distance };\n }\n }\n }\n });\n return best;\n}\n\nexport interface EdgeHit {\n polygonIndex: number;\n /** Insert after this vertex index. */\n afterVertexIndex: number;\n point: Vec2;\n distance: number;\n kind: 'line' | 'cubic';\n}\n\nfunction hitEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n preferMidpoint: boolean,\n): EdgeHit | null {\n let best: EdgeHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const a = edgeFrom(ring, i);\n const b = edgeTo(ring, i);\n const edge = ring.edges[i] ?? { kind: 'line' as const };\n let candidate: Vec2;\n let dist: number;\n if (preferMidpoint) {\n candidate =\n edge.kind === 'cubic'\n ? cubicPoint(a, edge.c1, edge.c2, b, 0.5)\n : { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n dist = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n } else if (edge.kind === 'cubic') {\n const near = nearestTOnCubic(point, a, edge.c1, edge.c2, b);\n candidate = near.point;\n dist = near.distance;\n } else {\n const proj = projectOntoSegment(point, a, b);\n candidate = proj.point;\n dist = proj.distance;\n }\n if (dist <= tolerance && (!best || dist < best.distance)) {\n best = {\n polygonIndex,\n afterVertexIndex: i,\n point: candidate,\n distance: dist,\n kind: edge.kind,\n };\n }\n }\n });\n return best;\n}\n\n/** Nearest edge midpoint within tolerance for insert. */\nexport function hitTestEdgeMidpoint(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, true);\n}\n\n/** Nearest point on any edge (for dragging a line into an arch). */\nexport function hitTestEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, false);\n}\n\nexport function geometryWithBBox(geometry: ShapeGeometry): {\n geometry: ShapeGeometry;\n bbox: ReturnType<typeof geometryBBox>;\n} {\n return { geometry, bbox: geometryBBox(geometry) };\n}\n\nexport {\n geometryToRings,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n pointOnRingEdge,\n ringToPathD,\n} from './pathRings';\nexport type { PathRing, PathEdge } from './pathRings';\n","import type { ShapeGeometry, ShapeKind, ShapeStyle, Vec2 } from '../core';\nimport { DEFAULT_WELD_TOLERANCE, distance, projectOntoSegment } from '../core';\nimport {\n cloneVec,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n vecEq,\n type PathEdge,\n type PathRing,\n} from './pathRings';\nimport { hitTestEdge } from './geometryEdit';\n\nconst SHARED_EDGE_TOL = 4;\n\nexport type OpenEndId = {\n shapeId: number;\n ringIndex: number;\n end: 'start' | 'end';\n};\n\nexport type OpenEndHit = OpenEndId & { point: Vec2; distance: number };\n\nexport type SplitJoinEdgeHit = {\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n shared: boolean;\n distance: number;\n};\n\nexport type ShapeGeo = {\n id: number;\n kind: ShapeKind;\n style?: ShapeStyle;\n geometry: ShapeGeometry;\n};\n\nexport type ShapeBatchEdit =\n | { action: 'update'; shapeId: number; geometry: ShapeGeometry }\n | {\n action: 'create';\n kind: ShapeKind;\n geometry: ShapeGeometry;\n style?: ShapeStyle;\n }\n | { action: 'delete'; shapeId: number };\n\nexport function canSplitJoinKind(kind: ShapeKind): boolean {\n return kind === 'unit' || kind === 'amenity' || kind === 'parking_zone';\n}\n\nexport function sameOpenEnd(a: OpenEndId, b: OpenEndId): boolean {\n return a.shapeId === b.shapeId && a.ringIndex === b.ringIndex && a.end === b.end;\n}\n\nfunction cloneEdge(edge: PathEdge): PathEdge {\n return edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) };\n}\n\nfunction cloneRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec),\n edges: ring.edges.map(cloneEdge),\n };\n}\n\nfunction reverseEdge(edge: PathEdge): PathEdge {\n if (edge.kind === 'line') return { kind: 'line' };\n return { kind: 'cubic', c1: cloneVec(edge.c2), c2: cloneVec(edge.c1) };\n}\n\nfunction reverseRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec).reverse(),\n edges: ring.edges.map(cloneEdge).reverse().map(reverseEdge),\n };\n}\n\nfunction maybeCloseCoincident(ring: PathRing, tol: number): PathRing {\n if (ring.closed || ring.anchors.length < 3) return ring;\n const first = ring.anchors[0];\n const last = ring.anchors[ring.anchors.length - 1];\n if (!vecEq(first, last, tol)) return ring;\n const next = cloneRing(ring);\n next.anchors.pop();\n next.closed = true;\n const expected = next.anchors.length;\n while (next.edges.length > expected) next.edges.pop();\n while (next.edges.length < expected) next.edges.push({ kind: 'line' });\n return next;\n}\n\nexport function listOpenEnds(geometry: ShapeGeometry): Array<{\n ringIndex: number;\n end: 'start' | 'end';\n point: Vec2;\n}> {\n const out: Array<{ ringIndex: number; end: 'start' | 'end'; point: Vec2 }> = [];\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n if (ring.closed || ring.anchors.length < 2) return;\n out.push({\n ringIndex,\n end: 'start',\n point: cloneVec(ring.anchors[0]),\n });\n out.push({\n ringIndex,\n end: 'end',\n point: cloneVec(ring.anchors[ring.anchors.length - 1]),\n });\n });\n return out;\n}\n\nfunction distToRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): number {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).distance;\n }\n return projectOntoSegment(point, from, to).distance;\n}\n\nfunction pointOnRingBoundary(point: Vec2, ring: PathRing, tol: number): boolean {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n if (distToRingEdge(ring, i, point) <= tol) return true;\n }\n return false;\n}\n\nexport function edgeLiesOnOtherShape(\n from: Vec2,\n to: Vec2,\n others: Array<{ geometry: ShapeGeometry }>,\n tol = SHARED_EDGE_TOL,\n): boolean {\n const mid = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n for (const other of others) {\n const rings = geometryToRings(other.geometry);\n const onBoundary = rings.some(\n (ring) =>\n pointOnRingBoundary(from, ring, tol) &&\n pointOnRingBoundary(to, ring, tol) &&\n pointOnRingBoundary(mid, ring, tol),\n );\n if (onBoundary) return true;\n const open = listOpenEnds(other.geometry);\n if (open.length >= 2) {\n const near = (p: Vec2) =>\n open.some((end) => distance(end.point, p) <= tol);\n if (near(from) && near(to)) return true;\n }\n }\n return false;\n}\n\nfunction cutPointsOnLine(\n from: Vec2,\n to: Vec2,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-6) return null;\n const half = Math.min(Math.max(gap, 0.35) / 2, len * 0.2);\n if (half < 0.12) return null;\n const ux = dx / len;\n const uy = dy / len;\n const proj = projectOntoSegment(point, from, to).point;\n let t = (proj.x - from.x) * ux + (proj.y - from.y) * uy;\n t = Math.min(len - half, Math.max(half, t));\n return {\n p1: { x: from.x + ux * (t - half), y: from.y + uy * (t - half) },\n p2: { x: from.x + ux * (t + half), y: from.y + uy * (t + half) },\n };\n}\n\nfunction cutPointsOnCubic(\n from: Vec2,\n edge: Extract<PathEdge, { kind: 'cubic' }>,\n to: Vec2,\n point: Vec2,\n gap: number,\n): {\n p1: Vec2;\n p2: Vec2;\n leftEdge: PathEdge;\n rightEdge: PathEdge;\n} | null {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const chord = Math.hypot(to.x - from.x, to.y - from.y);\n const dt =\n chord > 1e-6\n ? Math.min(0.04, Math.max(0.006, gap / (2 * chord)))\n : 0.015;\n const t1 = Math.min(0.92, Math.max(0.04, t - dt));\n const t2 = Math.min(0.96, Math.max(t1 + 0.012, t + dt));\n if (t2 - t1 < 0.01) return null;\n const first = splitCubic(from, edge.c1, edge.c2, to, t1);\n const local = (t2 - t1) / Math.max(1e-6, 1 - t1);\n const second = splitCubic(\n first.left.to,\n first.right.c1,\n first.right.c2,\n to,\n local,\n );\n return {\n p1: cloneVec(first.left.to),\n p2: cloneVec(second.left.to),\n leftEdge: { kind: 'cubic', c1: first.left.c1, c2: first.left.c2 },\n rightEdge: { kind: 'cubic', c1: second.right.c1, c2: second.right.c2 },\n };\n}\n\nfunction rebuildOpenFromClosedCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing {\n const n = ring.anchors.length;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(p2), cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [cloneEdge(rightEdge)];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n anchors.push(cloneVec(p1));\n edges.push(cloneEdge(leftEdge));\n return { closed: false, anchors, edges };\n}\n\nfunction splitOpenRingAtCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing[] {\n const fromIdx = edgeIndex;\n const toIdx = edgeIndex + 1;\n const left: PathRing = {\n closed: false,\n anchors: [...ring.anchors.slice(0, fromIdx + 1).map(cloneVec), cloneVec(p1)],\n edges: [\n ...ring.edges.slice(0, fromIdx).map(cloneEdge),\n cloneEdge(leftEdge),\n ],\n };\n const right: PathRing = {\n closed: false,\n anchors: [cloneVec(p2), ...ring.anchors.slice(toIdx).map(cloneVec)],\n edges: [cloneEdge(rightEdge), ...ring.edges.slice(toIdx).map(cloneEdge)],\n };\n return [left, right].filter((item) => item.anchors.length >= 2);\n}\n\nexport function openWholeEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n\n if (ring.closed) {\n const n = ring.anchors.length;\n if (n < 3) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n rings[ringIndex] = { closed: false, anchors, edges };\n return ringsToGeometry(rings);\n }\n\n if (edgeIndex === 0) {\n ring.anchors.shift();\n ring.edges.shift();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n if (edgeIndex === ring.edges.length - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n\n const left: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(0, edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(0, edgeIndex).map(cloneEdge),\n };\n const right: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(edgeIndex + 1).map(cloneEdge),\n };\n const next = [left, right].filter((item) => item.anchors.length >= 2);\n rings.splice(ringIndex, 1, ...next);\n return ringsToGeometry(rings);\n}\n\nexport function cutEdgeOpen(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n\n let p1: Vec2;\n let p2: Vec2;\n let leftEdge: PathEdge;\n let rightEdge: PathEdge;\n\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = cut.leftEdge;\n rightEdge = cut.rightEdge;\n } else {\n const cut = cutPointsOnLine(from, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = { kind: 'line' };\n rightEdge = { kind: 'line' };\n }\n\n if (ring.closed) {\n rings[ringIndex] = rebuildOpenFromClosedCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n return ringsToGeometry(rings);\n }\n\n const pieces = splitOpenRingAtCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n rings.splice(ringIndex, 1, ...pieces);\n return ringsToGeometry(rings);\n}\n\nfunction concatOpenRings(left: PathRing, right: PathRing, tol: number): PathRing {\n const leftEnd = left.anchors[left.anchors.length - 1];\n const rightStart = right.anchors[0];\n const weld = vecEq(leftEnd, rightStart, tol);\n const anchors = weld\n ? [...left.anchors.map(cloneVec), ...right.anchors.slice(1).map(cloneVec)]\n : [...left.anchors.map(cloneVec), ...right.anchors.map(cloneVec)];\n const edges = weld\n ? [...left.edges.map(cloneEdge), ...right.edges.map(cloneEdge)]\n : [...left.edges.map(cloneEdge), { kind: 'line' as const }, ...right.edges.map(cloneEdge)];\n return maybeCloseCoincident({ closed: false, anchors, edges }, tol);\n}\n\nfunction closeOpenRing(ring: PathRing, tol: number): PathRing {\n const coincident = vecEq(\n ring.anchors[0],\n ring.anchors[ring.anchors.length - 1],\n tol,\n );\n if (coincident) return maybeCloseCoincident(ring, tol);\n return {\n closed: true,\n anchors: ring.anchors.map(cloneVec),\n edges: [...ring.edges.map(cloneEdge), { kind: 'line' }],\n };\n}\n\nexport function joinOpenEndpoints(\n geometry: ShapeGeometry,\n a: { ringIndex: number; end: 'start' | 'end' },\n b: { ringIndex: number; end: 'start' | 'end' },\n tol = DEFAULT_WELD_TOLERANCE,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ra = rings[a.ringIndex];\n const rb = rings[b.ringIndex];\n if (!ra || !rb || ra.closed || rb.closed) return geometry;\n\n if (a.ringIndex === b.ringIndex) {\n if (a.end === b.end) return geometry;\n rings[a.ringIndex] = closeOpenRing(ra, tol);\n return ringsToGeometry(rings);\n }\n\n const left = a.end === 'end' ? cloneRing(ra) : reverseRing(ra);\n const right = b.end === 'start' ? cloneRing(rb) : reverseRing(rb);\n const joined = concatOpenRings(left, right, tol);\n const keep = Math.min(a.ringIndex, b.ringIndex);\n const drop = Math.max(a.ringIndex, b.ringIndex);\n rings[keep] = joined;\n rings.splice(drop, 1);\n return ringsToGeometry(rings);\n}\n\nfunction joinAcrossShapes(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n tol: number,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n const ia = shapes.findIndex((s) => s.id === a.shapeId);\n const ib = shapes.findIndex((s) => s.id === b.shapeId);\n if (ia < 0 || ib < 0) return { shapes, deleteIds: [] };\n\n if (a.shapeId === b.shapeId) {\n const next = shapes.slice();\n next[ia] = {\n ...next[ia],\n geometry: joinOpenEndpoints(next[ia].geometry, a, b, tol),\n };\n return { shapes: next, deleteIds: [] };\n }\n\n const ringsA = geometryToRings(shapes[ia].geometry).map(cloneRing);\n const ringsB = geometryToRings(shapes[ib].geometry).map(cloneRing);\n const offset = ringsA.length;\n const merged = ringsToGeometry([...ringsA, ...ringsB]);\n const joined = joinOpenEndpoints(\n merged,\n a,\n { ringIndex: b.ringIndex + offset, end: b.end },\n tol,\n );\n const next = shapes\n .filter((s) => s.id !== b.shapeId)\n .map((s) => (s.id === a.shapeId ? { ...s, geometry: joined } : s));\n return { shapes: next, deleteIds: [b.shapeId] };\n}\n\nexport function weldCoincidentOpenEnds(\n shapes: ShapeGeo[],\n tol = DEFAULT_WELD_TOLERANCE,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n let current = shapes;\n const deleteIds: number[] = [];\n for (let n = 0; n < 24; n++) {\n const ends: OpenEndHit[] = [];\n for (const shape of current) {\n for (const end of listOpenEnds(shape.geometry)) {\n ends.push({\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n point: end.point,\n distance: 0,\n });\n }\n }\n let best: { a: OpenEndHit; b: OpenEndHit; dist: number } | null = null;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const a = ends[i];\n const b = ends[j];\n if (a.shapeId === b.shapeId && a.ringIndex === b.ringIndex) continue;\n const dist = distance(a.point, b.point);\n const pairTol = a.shapeId === b.shapeId ? Math.min(tol, 0.75) : tol;\n if (dist <= pairTol && (!best || dist < best.dist)) {\n best = { a, b, dist };\n }\n }\n }\n if (!best) break;\n const joined = joinAcrossShapes(current, best.a, best.b, tol);\n current = joined.shapes;\n deleteIds.push(...joined.deleteIds);\n }\n return { shapes: current, deleteIds };\n}\n\nexport function forkClosedRings(shape: ShapeGeo): {\n keep: ShapeGeo;\n extras: ShapeGeometry[];\n} {\n const rings = geometryToRings(shape.geometry);\n const closed = rings.filter((ring) => ring.closed && ring.anchors.length >= 3);\n const opens = rings.filter((ring) => !ring.closed && ring.anchors.length >= 2);\n if (closed.length <= 1) {\n return { keep: shape, extras: [] };\n }\n return {\n keep: {\n ...shape,\n geometry: ringsToGeometry([closed[0], ...opens]),\n },\n extras: closed.slice(1).map((ring) => ringsToGeometry([ring])),\n };\n}\n\nfunction finishEdits(\n before: ShapeGeo[],\n working: ShapeGeo[],\n extraDeletes: number[],\n): ShapeBatchEdit[] {\n const welded = weldCoincidentOpenEnds(working);\n const deleteSet = new Set([...extraDeletes, ...welded.deleteIds]);\n const extras: Array<{ fromId: number; geometry: ShapeGeometry; kind: ShapeKind; style?: ShapeStyle }> =\n [];\n const kept: ShapeGeo[] = [];\n for (const shape of welded.shapes) {\n if (deleteSet.has(shape.id)) continue;\n const forked = forkClosedRings(shape);\n kept.push(forked.keep);\n for (const geometry of forked.extras) {\n extras.push({\n fromId: shape.id,\n geometry,\n kind: shape.kind,\n style: shape.style,\n });\n }\n }\n\n const edits: ShapeBatchEdit[] = [];\n const beforeById = new Map(before.map((s) => [s.id, s]));\n for (const shape of kept) {\n const prev = beforeById.get(shape.id);\n if (!prev) continue;\n if (JSON.stringify(prev.geometry) !== JSON.stringify(shape.geometry)) {\n edits.push({\n action: 'update',\n shapeId: shape.id,\n geometry: shape.geometry,\n });\n }\n }\n for (const extra of extras) {\n edits.push({\n action: 'create',\n kind: extra.kind,\n geometry: extra.geometry,\n style: extra.style,\n });\n }\n for (const id of deleteSet) {\n if (beforeById.has(id)) edits.push({ action: 'delete', shapeId: id });\n }\n return edits;\n}\n\nexport function applySplitJoinCut(\n shapes: ShapeGeo[],\n hit: { shapeId: number; ringIndex: number; edgeIndex: number; point: Vec2 },\n gap: number,\n): ShapeBatchEdit[] {\n const target = shapes.find((s) => s.id === hit.shapeId);\n if (!target) return [];\n const others = shapes.filter((s) => s.id !== hit.shapeId);\n const rings = geometryToRings(target.geometry);\n const ring = rings[hit.ringIndex];\n if (!ring) return [];\n const from = edgeFrom(ring, hit.edgeIndex);\n const to = edgeTo(ring, hit.edgeIndex);\n const shared = edgeLiesOnOtherShape(from, to, others);\n const nextGeo = shared\n ? openWholeEdge(target.geometry, hit.ringIndex, hit.edgeIndex)\n : cutEdgeOpen(target.geometry, hit.ringIndex, hit.edgeIndex, hit.point, gap);\n const next = shapes.map((s) =>\n s.id === hit.shapeId ? { ...s, geometry: nextGeo } : s,\n );\n return finishEdits(shapes, next, []);\n}\n\nexport function applySplitJoinJoin(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n): ShapeBatchEdit[] {\n if (sameOpenEnd(a, b)) return [];\n const joined = joinAcrossShapes(shapes, a, b, DEFAULT_WELD_TOLERANCE);\n return finishEdits(shapes, joined.shapes, joined.deleteIds);\n}\n\nexport function hitOpenEnd(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n skip?: OpenEndId | null,\n): OpenEndHit | null {\n let best: OpenEndHit | null = null;\n for (const shape of shapes) {\n for (const end of listOpenEnds(shape.geometry)) {\n const id: OpenEndId = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n if (skip && sameOpenEnd(skip, id)) continue;\n const dist = distance(point, end.point);\n if (dist > tol) continue;\n const preferOther =\n skip &&\n (shape.id !== skip.shapeId || end.ringIndex !== skip.ringIndex);\n const bestPrefer =\n best &&\n skip &&\n (best.shapeId !== skip.shapeId || best.ringIndex !== skip.ringIndex);\n if (\n !best ||\n (preferOther && !bestPrefer) ||\n (preferOther === bestPrefer && dist < best.distance)\n ) {\n best = { ...id, point: end.point, distance: dist };\n }\n }\n }\n return best;\n}\n\nexport function hitSplitJoinEdge(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n): SplitJoinEdgeHit | null {\n let best: SplitJoinEdgeHit | null = null;\n for (const shape of shapes) {\n const hit = hitTestEdge(shape.geometry, point, tol);\n if (!hit) continue;\n if (!best || hit.distance < best.distance) {\n const rings = geometryToRings(shape.geometry);\n const ring = rings[hit.polygonIndex];\n const from = ring ? edgeFrom(ring, hit.afterVertexIndex) : point;\n const to = ring ? edgeTo(ring, hit.afterVertexIndex) : point;\n best = {\n shapeId: shape.id,\n ringIndex: hit.polygonIndex,\n edgeIndex: hit.afterVertexIndex,\n point: hit.point,\n shared: edgeLiesOnOtherShape(\n from,\n to,\n shapes.filter((s) => s.id !== shape.id),\n ),\n distance: hit.distance,\n };\n }\n }\n return best;\n}\n\nexport function previewCutPoints(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring) return null;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n return cut ? { p1: cut.p1, p2: cut.p2 } : null;\n }\n return cutPointsOnLine(from, to, point, gap);\n}\n","import type { Vec2 } from '../core';\n\n/** Closest candidate within `tol` world units, or null. */\nexport function nearestSnapPoint(\n point: Vec2,\n candidates: Vec2[],\n tol: number,\n): Vec2 | null {\n let best: { point: Vec2; distance: number } | null = null;\n for (const candidate of candidates) {\n const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n if (distance <= tol && (!best || distance < best.distance)) {\n best = { point: candidate, distance };\n }\n }\n return best ? { x: best.point.x, y: best.point.y } : null;\n}\n\nexport function sameSnapPoint(a: Vec2 | null, b: Vec2 | null, eps = 1e-4): boolean {\n if (!a || !b) return false;\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n","import type { Vec2 } from '../core';\n\nexport type OrthoAxis = 'horizontal' | 'vertical';\n\nexport interface OrthoConstraint {\n point: Vec2;\n axis: OrthoAxis;\n /** Point the guide line passes through. */\n through: Vec2;\n}\n\n/** Snap `cursor` to the dominant 0° or 90° axis through `origin`. */\nexport function constrainOrthogonal(origin: Vec2, cursor: Vec2): OrthoConstraint {\n const dx = Math.abs(cursor.x - origin.x);\n const dy = Math.abs(cursor.y - origin.y);\n if (dx >= dy) {\n return {\n point: { x: cursor.x, y: origin.y },\n axis: 'horizontal',\n through: origin,\n };\n }\n return {\n point: { x: origin.x, y: cursor.y },\n axis: 'vertical',\n through: origin,\n };\n}\n\n/**\n * Move a dragged anchor onto the nearest horizontal or vertical line through\n * one of its connected neighbors.\n */\nexport function constrainVertexOrthogonal(\n cursor: Vec2,\n neighbors: readonly Vec2[],\n): OrthoConstraint | null {\n let best: (OrthoConstraint & { dist: number }) | null = null;\n for (const neighbor of neighbors) {\n const options: OrthoConstraint[] = [\n {\n point: { x: cursor.x, y: neighbor.y },\n axis: 'horizontal',\n through: neighbor,\n },\n {\n point: { x: neighbor.x, y: cursor.y },\n axis: 'vertical',\n through: neighbor,\n },\n ];\n for (const option of options) {\n const dist = Math.hypot(option.point.x - cursor.x, option.point.y - cursor.y);\n if (\n !best ||\n dist < best.dist - 1e-6 ||\n (Math.abs(dist - best.dist) <= 1e-6 && option.axis === 'horizontal' && best.axis !== 'horizontal')\n ) {\n best = { ...option, dist };\n }\n }\n }\n if (!best) return null;\n return { point: best.point, axis: best.axis, through: best.through };\n}\n\nexport function isSpacePanKey(event: { key: string; code?: string }): boolean {\n return event.key === ' ' || event.code === 'Space';\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { buildGeometryFromPaths } from '../core';\n\nexport interface EllipseBounds {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n}\n\n/** Drag from corner `from` to `to`. Shift / lockCircle keeps rx === ry. */\nexport function ellipseBoundsFromDrag(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): EllipseBounds {\n let x1 = to.x;\n let y1 = to.y;\n if (lockCircle) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx === 0 ? (dy === 0 ? 1 : Math.sign(dy)) : Math.sign(dx);\n const sy = dy === 0 ? (dx === 0 ? 1 : Math.sign(dx)) : Math.sign(dy);\n x1 = from.x + sx * side;\n y1 = from.y + sy * side;\n }\n const rx = Math.abs(x1 - from.x) / 2;\n const ry = Math.abs(y1 - from.y) / 2;\n return {\n cx: (from.x + x1) / 2,\n cy: (from.y + y1) / 2,\n rx,\n ry,\n };\n}\n\nexport function ellipsePathD(bounds: EllipseBounds): string {\n const { cx, cy, rx, ry } = bounds;\n const arx = Math.max(rx, 1e-4);\n const ary = Math.max(ry, 1e-4);\n return `M ${cx - arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx + arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx - arx} ${cy} Z`;\n}\n\nexport function ellipseGeometry(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): ShapeGeometry {\n return buildGeometryFromPaths([\n ellipsePathD(ellipseBoundsFromDrag(from, to, lockCircle)),\n ]);\n}\n","import type { BBox, ShapeGeometry, ShapeLabel, Vec2, ViewBox } from '../core';\nimport { geometryBBox } from '../core';\nimport { MAP_FONT_FAMILY, MAP_LABEL_LINE_HEIGHT } from '../fonts/mapFont';\nimport { polygonsToGeometry } from './geometryEdit';\n\nexport const DEFAULT_LABEL_TEXT = 'Text';\nexport const DEFAULT_LABEL_SIZE = 48;\nexport const LABEL_FONT_FAMILY = MAP_FONT_FAMILY;\nexport const LABEL_LINE_HEIGHT = MAP_LABEL_LINE_HEIGHT;\n/** Fallback advance when canvas measurement is unavailable (tests / SSR). */\nconst FALLBACK_CHAR_ADVANCE = 0.5;\n\nexport function isTextLabel(shape: {\n kind: string;\n label?: { text?: string } | null;\n}): boolean {\n return shape.kind === 'label' && Boolean(shape.label?.text?.trim());\n}\n\nexport function defaultLabelSize(_viewbox?: ViewBox): number {\n return DEFAULT_LABEL_SIZE;\n}\n\nexport function labelTextLines(text: string): string[] {\n const source = text.replace(/\\r\\n/g, '\\n').trim() || DEFAULT_LABEL_TEXT;\n return source.split('\\n');\n}\n\nlet measureCtx: CanvasRenderingContext2D | null | undefined;\n\nfunction textMeasureContext(): CanvasRenderingContext2D | null {\n if (measureCtx !== undefined) return measureCtx;\n if (typeof document === 'undefined') {\n measureCtx = null;\n return null;\n }\n const canvas = document.createElement('canvas');\n measureCtx = canvas.getContext('2d');\n return measureCtx;\n}\n\nexport function measureLabelText(\n text: string,\n size: number,\n): { width: number; height: number; lines: string[] } {\n const lines = labelTextLines(text);\n const ctx = textMeasureContext();\n let width = 0;\n if (ctx) {\n ctx.font = `${size}px ${LABEL_FONT_FAMILY}`;\n for (const line of lines) {\n width = Math.max(width, ctx.measureText(line || ' ').width);\n }\n } else {\n const longest = lines.reduce((max, line) => Math.max(max, line.length), 1);\n width = longest * size * FALLBACK_CHAR_ADVANCE;\n }\n return {\n width: Math.max(width, size * 0.2),\n height: Math.max(lines.length, 1) * size * LABEL_LINE_HEIGHT,\n lines,\n };\n}\n\nexport function labelBoxCenter(box: BBox): Vec2 {\n return { x: (box.minX + box.maxX) / 2, y: (box.minY + box.maxY) / 2 };\n}\n\nexport function textLabelPolygon(origin: Vec2, text: string, size: number): Vec2[] {\n const { width, height } = measureLabelText(text, size);\n return [\n { x: origin.x, y: origin.y - height },\n { x: origin.x + width, y: origin.y - height },\n { x: origin.x + width, y: origin.y },\n { x: origin.x, y: origin.y },\n ];\n}\n\nexport function textLabelGeometry(\n origin: Vec2,\n text: string,\n size: number,\n): ShapeGeometry {\n return polygonsToGeometry([textLabelPolygon(origin, text, size)]);\n}\n\nexport function defaultTextLabel(text: string, size: number, color?: string): ShapeLabel {\n return {\n text: text.trim() || DEFAULT_LABEL_TEXT,\n size,\n color,\n autoFit: true,\n };\n}\n\n/** Keep the box anchored at the current bottom-left when the string changes. */\nexport function geometryForLabelText(\n geometry: ShapeGeometry,\n text: string,\n size: number,\n): ShapeGeometry {\n const box = geometryBBox(geometry);\n return textLabelGeometry({ x: box.minX, y: box.maxY }, text, size);\n}\n","import type { ShapeGeometry, ShapeLabel, Vec2 } from '../core';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n geometryBBox,\n isEntranceIcon,\n} from '../core';\nimport { polygonsToGeometry } from './geometryEdit';\nimport { isTextLabel, labelBoxCenter } from './labelText';\n\nexport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n isEntranceIcon,\n};\n\nexport function isStampShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return isTextLabel(shape) || isEntranceIcon(shape);\n}\n\nexport function defaultEntranceLabel(size: number, color?: string): ShapeLabel {\n return {\n imageKey: ENTRANCE_ICON_ID,\n size: clampEntranceSize(size),\n color,\n rotate: 0,\n };\n}\n\nexport function entranceIconPolygon(center: Vec2, size: number): Vec2[] {\n const half = clampEntranceSize(size) / 2;\n return [\n { x: center.x - half, y: center.y - half },\n { x: center.x + half, y: center.y - half },\n { x: center.x + half, y: center.y + half },\n { x: center.x - half, y: center.y + half },\n ];\n}\n\nexport function entranceIconGeometry(center: Vec2, size: number): ShapeGeometry {\n return polygonsToGeometry([entranceIconPolygon(center, size)]);\n}\n\n/** Keep the icon centred when Size changes. */\nexport function geometryForEntranceIcon(\n geometry: ShapeGeometry,\n size: number,\n): ShapeGeometry {\n return entranceIconGeometry(labelBoxCenter(geometryBBox(geometry)), size);\n}\n","import type { Vec2 } from '../../core';\nimport { nextZoomFromWheel } from '../../core/wheelZoom';\n\n/** 2D affine matrix in DOMMatrix / SVGMatrix layout (a c e / b d f). */\nexport interface Affine2 {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport interface ViewBoxRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ClientRectLike {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * Prefer {@link clientRectToViewBox} for pointer mapping — `getScreenCTM()` on\n * the root `<svg>` is wrong inside transformed admin-portal layout.\n */\nexport function clientToUser(ctm: Affine2, clientX: number, clientY: number): Vec2 {\n const det = ctm.a * ctm.d - ctm.b * ctm.c;\n if (det === 0) return { x: 0, y: 0 };\n const x = clientX - ctm.e;\n const y = clientY - ctm.f;\n return {\n x: (ctm.d * x - ctm.c * y) / det,\n y: (-ctm.b * x + ctm.a * y) / det,\n };\n}\n\n/**\n * Viewport point → SVG viewBox user space, same method OrbitControls uses\n * (`getBoundingClientRect` + letterboxed viewBox). Default map zoom-to-cursor\n * works in admin-portal because of this; Edit Map must not use `getScreenCTM()`.\n *\n * Assumes `preserveAspectRatio=\"xMidYMid meet\"` (editor canvas default).\n */\nexport function clientRectToViewBox(\n rect: ClientRectLike,\n viewBox: ViewBoxRect,\n clientX: number,\n clientY: number,\n): Vec2 {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n if (!(scale > 0) || !Number.isFinite(scale)) {\n return { x: viewBox.x, y: viewBox.y };\n }\n const originX = rect.left + (rect.width - vbW * scale) / 2;\n const originY = rect.top + (rect.height - vbH * scale) / 2;\n return {\n x: viewBox.x + (clientX - originX) / scale,\n y: viewBox.y + (clientY - originY) / scale,\n };\n}\n\nexport function pxPerUserFromViewBox(rect: ClientRectLike, viewBox: ViewBoxRect): number {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n return scale > 0 && Number.isFinite(scale) ? scale : 1;\n}\n\nfunction readSvgViewBox(svg: SVGSVGElement): ViewBoxRect | null {\n const vb = svg.viewBox?.baseVal;\n if (vb && vb.width > 0 && vb.height > 0) {\n return { x: vb.x, y: vb.y, width: vb.width, height: vb.height };\n }\n const attr = svg.getAttribute('viewBox');\n if (!attr) return null;\n const parts = attr.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return null;\n if (parts[2] <= 0 || parts[3] <= 0) return null;\n return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) {\n return clientRectToViewBox(svg.getBoundingClientRect(), viewBox, clientX, clientY);\n }\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\nexport function pxPerUserFromSvg(svg: SVGSVGElement): number {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) return pxPerUserFromViewBox(svg.getBoundingClientRect(), viewBox);\n const ctm = svg.getScreenCTM();\n if (!ctm) return 1;\n return pxPerUserFromCtm(ctm);\n}\n\n/** Invert `translate(pan) scale(zoom)` so a user-space point becomes world geometry. */\nexport function userToWorld(user: Vec2, pan: Vec2, zoom: number): Vec2 {\n const z = zoom === 0 ? 1 : zoom;\n return {\n x: (user.x - pan.x) / z,\n y: (user.y - pan.y) / z,\n };\n}\n\nexport const EDITOR_MIN_ZOOM = 0.2;\n/** High enough that designers can park on a single storefront or route node. */\nexport const EDITOR_MAX_ZOOM = 128;\n\nexport function clampEditorZoom(zoom: number): number {\n return Math.min(EDITOR_MAX_ZOOM, Math.max(EDITOR_MIN_ZOOM, zoom));\n}\n\n/** Same per-event step as PORTAL default MapViewer (three-stdlib OrbitControls). */\nexport function nextEditorZoomFromWheel(\n currentZoom: number,\n event: Pick<WheelEvent, 'deltaY'>,\n): number {\n return nextZoomFromWheel(currentZoom, event.deltaY, {\n min: EDITOR_MIN_ZOOM,\n max: EDITOR_MAX_ZOOM,\n });\n}\n\n/** CSS pixels per SVG user unit from a screen CTM (ignores translation). */\nexport function pxPerUserFromCtm(ctm: Affine2): number {\n return Math.hypot(ctm.a, ctm.b);\n}\n\n/** World-space length that draws as `px` CSS pixels after `scale(zoom)`. */\nexport function screenPxToWorld(px: number, zoom: number, pxPerUser: number): number {\n const z = zoom === 0 ? 1 : zoom;\n const scale = pxPerUser > 0 ? pxPerUser : 1;\n return px / (scale * z);\n}\n\n/**\n * Counter-scale for editor handles whose world radius was computed at\n * `sizeZoom` while the SVG group is already at `liveZoom`.\n *\n * Wheel zoom paints `scale(liveZoom)` immediately and defers React, so\n * handle radii stay at the last settled zoom. This ratio keeps those\n * circles screen-constant without re-rendering the floor.\n */\nexport function editorHandleScale(sizeZoom: number, liveZoom: number): number {\n const size = sizeZoom === 0 ? 1 : sizeZoom;\n const live = liveZoom === 0 ? 1 : liveZoom;\n return size / live;\n}\n\n/**\n * Next pan so `user` (cursor or pinch midpoint in viewBox space) stays over\n * the same world point after `zoom` → `nextZoom`. Without this, SVG\n * `scale()` pivots around the viewBox origin (top-left).\n */\nexport function panAfterZoom(\n user: Vec2,\n pan: Vec2,\n zoom: number,\n nextZoom: number,\n): Vec2 {\n const world = userToWorld(user, pan, zoom);\n return {\n x: user.x - nextZoom * world.x,\n y: user.y - nextZoom * world.y,\n };\n}\n\n/** Pan that keeps a known world point under `user` at `zoom`. */\nexport function panKeepingWorldAtUser(user: Vec2, world: Vec2, zoom: number): Vec2 {\n return {\n x: user.x - zoom * world.x,\n y: user.y - zoom * world.y,\n };\n}\n\nexport const EDITOR_ZOOM_ANIM_MS = 240;\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Interpolate pan + zoom for a smooth +/− / Reset. */\nexport function interpolateView(\n from: { pan: Vec2; zoom: number },\n to: { pan: Vec2; zoom: number },\n t: number,\n): { pan: Vec2; zoom: number } {\n const e = easeOutCubic(t);\n return {\n pan: {\n x: lerp(from.pan.x, to.pan.x, e),\n y: lerp(from.pan.y, to.pan.y, e),\n },\n zoom: lerp(from.zoom, to.zoom, e),\n };\n}\n","import type { ShapeKind, ThemeDefaults } from '../../core';\nimport {\n isTransparentColor,\n isTransparentPadKind,\n resolvedShapeFill,\n staffPadPlaceholderFill,\n WALKING_PATH_COLOR,\n} from '../../core';\n\n/**\n * Edit Map and Wayfinding fills. The graph paper paints above the canvas,\n * so shapes can stay close to their published color.\n */\nexport function editorShapeFillOpacity(kind: ShapeKind): number {\n if (kind === 'void') return 0.45;\n if (kind === 'amenity') return 0.7;\n if (kind === 'unit' || kind === 'parking_zone' || kind === 'custom') return 0.88;\n return 0.78;\n}\n\nexport function editorShapeFill(\n shape: { kind: ShapeKind; style?: { fill?: string } },\n theme: ThemeDefaults,\n assignment?: { bgColor?: string | null } | null,\n): string {\n if (shape.kind === 'walkable') return WALKING_PATH_COLOR;\n if (shape.kind === 'void') return shape.style?.fill ?? '#94a3b8';\n const published = resolvedShapeFill(\n shape.kind,\n theme,\n shape.style?.fill,\n assignment,\n );\n if (\n isTransparentPadKind(shape.kind) &&\n isTransparentColor(published)\n ) {\n return staffPadPlaceholderFill(shape.kind, theme);\n }\n return published;\n}\n","import {\n darkenShapeFill,\n INTERACTIVE_SHAPE_KINDS,\n type ShapeKind,\n} from '../../core';\nimport {\n canPlaceNewRoute,\n emptyCanvasDragPans,\n isShapeDrawTool,\n isStampDrawTool,\n type EditorTool,\n} from '../tools';\n\n/** Wayfinding / vertex chrome — not a customer Style color. */\nexport const EDITOR_GUIDE_COLOR = '#2563eb';\n\n/** Stores and other assignable items that can be highlighted by an editor tool. */\nexport function isHoverHighlightShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind) || kind === 'label' || kind === 'void';\n}\n\n/** Cursor for the map surface. Space pan wins over the active tool. */\nexport function editorMapCursor(args: {\n tool: EditorTool;\n readOnly?: boolean;\n spaceHeld?: boolean;\n panning?: boolean;\n shapeDragging?: boolean;\n /** Mid-edge hit on a walking path (insert-point target). */\n routeEdgeHover?: boolean;\n /** Any snap onto the route graph (junction or edge). */\n routeNetworkHover?: boolean;\n /** Create Route / Multi Route: hide OS cursor while the drawn + shows. */\n routeInsertHover?: boolean;\n /** Create Route / Multi Route: pointer is over a linkable store or amenity. */\n wayfindingStoreHover?: boolean;\n /** Select tool: pointer is over a wayfinding anchor. */\n anchorHover?: boolean;\n anchorDragging?: boolean;\n edgeDragging?: boolean;\n edgeHover?: boolean;\n}): string | undefined {\n if (args.spaceHeld && !args.panning) return 'grab';\n if (args.spaceHeld && args.panning) return 'grabbing';\n if (args.anchorDragging) return 'grabbing';\n if (args.edgeDragging) return 'grabbing';\n if (args.panning || args.shapeDragging) return 'grabbing';\n // Pan is spatially stable: actionable items never replace the hand.\n if (args.tool === 'pan' || args.tool === 'draw-route') return 'grab';\n if (args.tool === 'select') {\n if (args.wayfindingStoreHover) return 'pointer';\n if (args.routeNetworkHover || args.routeEdgeHover || args.anchorHover) {\n return 'pointer';\n }\n return 'grab';\n }\n if (args.tool === 'curve') {\n if (args.routeNetworkHover || args.routeEdgeHover || args.anchorHover) {\n return 'pointer';\n }\n return 'grab';\n }\n if (canPlaceNewRoute(args.tool)) {\n if (args.wayfindingStoreHover) return 'cell';\n if (args.routeInsertHover) return 'none';\n return args.readOnly ? undefined : 'cell';\n }\n if (args.tool === 'draw-text') return 'text';\n if (args.tool === 'draw-entrance') return 'cell';\n if (args.edgeHover) return 'none';\n if (emptyCanvasDragPans(args.tool)) return 'grab';\n if (isShapeDrawTool(args.tool) && !args.readOnly) return 'cell';\n return undefined;\n}\n\nexport function editorSelectCursor(args: {\n tool: EditorTool;\n selected: boolean;\n highlightable: boolean;\n dragging?: boolean;\n /** Wayfinding: only route-creation tools can act on store geometry. */\n wayfinding?: boolean;\n /** Map text placed with the Text tool. */\n textLabel?: boolean;\n /** Entrance stamp placed with the Entrance tool. */\n entranceIcon?: boolean;\n}): 'pointer' | 'grab' | 'grabbing' | 'cell' | undefined {\n if (args.dragging) return 'grabbing';\n if (isShapeDrawTool(args.tool)) return 'cell';\n if (args.wayfinding && args.highlightable) {\n return canPlaceNewRoute(args.tool) ? 'cell' : undefined;\n }\n if (isStampDrawTool(args.tool) && (args.textLabel || args.entranceIcon)) {\n return 'pointer';\n }\n if (args.tool === 'curve' || args.tool === 'split-join') {\n if (args.selected) return undefined;\n if (args.highlightable) return 'pointer';\n return undefined;\n }\n if (args.tool !== 'select') return undefined;\n if (args.selected) return 'grab';\n if (args.highlightable) return 'pointer';\n return undefined;\n}\n\nexport function editorHoverFillOpacity(\n kind: ShapeKind,\n base: number,\n hovered: boolean,\n): number {\n if (!hovered || !isHoverHighlightShape(kind)) return base;\n return Math.min(1, base + 0.1);\n}\n\n/** Hover and selection share the same darker shade of the shape fill. */\nexport function editorShapeEmphasisColor(\n fill: string,\n emphasized: boolean,\n): string {\n if (!emphasized) return fill;\n return darkenShapeFill(fill);\n}\n","import type {\n AssignmentIconTheme,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignRetailer,\n} from '../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n assignmentSpecialIconId,\n DEFAULT_ASSIGNMENT_SIZE,\n geometryBBox,\n normalizeLabelAlign,\n publishedShapeLabel,\n resolveFetchUrl,\n resolvedAssignmentIconColor,\n} from '../core';\nimport { getMapSpecialSvg, mapSpecialSvgToDataUrl } from '../specialIcons';\n\nexport type WayfindingAssignedOverlay = {\n shapeId: number;\n x: number;\n y: number;\n rotate: number;\n /** Text font size, or image width (logos are already scaled). */\n size: number;\n color: string;\n align: LabelAlign;\n text?: string;\n imageUrl?: string;\n iconId?: string;\n};\n\ntype OverlayShape = Pick<CmShape, 'id' | 'kind' | 'geometry' | 'label' | 'style'>;\n\n/**\n * Live editor display uses the session CDN URL, not the persisted S3 key —\n * same as `compileDocument` when `persistMediaKeys` is off.\n */\nexport function liveDisplayRetailer(\n retailer?: MapAssignRetailer | null,\n): MapAssignRetailer | null {\n if (!retailer) return null;\n const key = retailer.logoKey?.trim() ?? '';\n if (!retailer.logoUrl && /^https?:\\/\\//i.test(key)) return retailer;\n return { ...retailer, logoKey: null };\n}\n\n/**\n * Name, logo, or amenity / kiosk icon for an assigned polygon. Unassigned\n * leftover text is dropped. Used by the wayfinding canvas only.\n */\nexport function wayfindingAssignedOverlay(\n shape: OverlayShape,\n assignment: CmShapeAssignment | null | undefined,\n retailer: MapAssignRetailer | null | undefined,\n amenities: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>> = [],\n theme: AssignmentIconTheme,\n): WayfindingAssignedOverlay | null {\n if (shape.kind === 'label' || shape.kind === 'entrance') return null;\n const displayRetailer = liveDisplayRetailer(retailer);\n const label = publishedShapeLabel(shape, assignment, displayRetailer);\n if (!assignmentOverlayVisible(assignment, label)) return null;\n const box = geometryBBox(shape.geometry);\n const fontSize =\n label.size || assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const imageUrl = assignmentOverlayImageUrl(\n assignment,\n displayRetailer,\n label,\n );\n const iconId = imageUrl\n ? undefined\n : assignmentSpecialIconId(assignment, amenities);\n const text = imageUrl || iconId ? undefined : label.text?.trim() || undefined;\n if (!imageUrl && !iconId && !text) return null;\n return {\n shapeId: shape.id,\n x: (box.minX + box.maxX) / 2 + (label.offsetX ?? 0),\n y: (box.minY + box.maxY) / 2 + (label.offsetY ?? 0),\n rotate: label.rotate ?? 0,\n size: imageUrl\n ? assignmentOverlayRenderSize(fontSize, assignment)\n : fontSize,\n color: resolvedAssignmentIconColor(\n assignment,\n theme,\n label.color,\n shape.kind,\n ),\n align: normalizeLabelAlign(label.align),\n text,\n imageUrl,\n iconId,\n };\n}\n\nexport function wayfindingAssignedOverlays(input: {\n shapes: OverlayShape[];\n /** Outdoor/base shapes shown beneath the active building floor. */\n underlayShapes?: OverlayShape[];\n assignments: CmShapeAssignment[];\n retailers?: MapAssignRetailer[];\n amenities?: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>>;\n theme: AssignmentIconTheme;\n}): WayfindingAssignedOverlay[] {\n const retailerById = new Map(\n (input.retailers ?? []).map((item) => [item.id, item]),\n );\n const assignmentByShapeId = new Map(\n input.assignments.map((row) => [row.shapeId, row]),\n );\n const amenities = input.amenities ?? [];\n const overlays: WayfindingAssignedOverlay[] = [];\n for (const shape of [...(input.underlayShapes ?? []), ...input.shapes]) {\n const assignment = assignmentByShapeId.get(shape.id);\n const retailer =\n assignment?.retailerId != null\n ? retailerById.get(assignment.retailerId) ?? null\n : null;\n const overlay = wayfindingAssignedOverlay(\n shape,\n assignment,\n retailer,\n amenities,\n input.theme,\n );\n if (overlay) overlays.push(overlay);\n }\n return overlays;\n}\n\nexport function wayfindingOverlayHref(\n overlay: Pick<WayfindingAssignedOverlay, 'imageUrl' | 'iconId' | 'color'>,\n imageProxyUrl?: string | null,\n): string | undefined {\n if (overlay.imageUrl) return resolveFetchUrl(overlay.imageUrl, imageProxyUrl);\n if (!overlay.iconId) return undefined;\n const svg = getMapSpecialSvg(overlay.iconId);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, overlay.color);\n}\n","import React from 'react';\nimport { labelSvgTextAnchor } from '../../core';\nimport {\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n labelTextLines,\n} from '../labelText';\nimport {\n wayfindingOverlayHref,\n type WayfindingAssignedOverlay,\n} from '../assignmentOverlay';\n\n/** Pointer-events none so wayfinding hover / click stay on the polygon. */\nexport function AssignedShapeOverlay({\n overlay,\n imageProxyUrl,\n}: {\n overlay: WayfindingAssignedOverlay;\n imageProxyUrl?: string | null;\n}) {\n const { x, y, rotate, size, color, align, text } = overlay;\n const href = wayfindingOverlayHref(overlay, imageProxyUrl);\n const transform = rotate ? `rotate(${rotate} ${x} ${y})` : undefined;\n return (\n <g\n className=\"eyeon-map-canvas__assigned-overlay\"\n data-shape-id={overlay.shapeId}\n transform={transform}\n pointerEvents=\"none\"\n >\n {href ? (\n <image\n href={href}\n x={x - size / 2}\n y={y - size / 2}\n width={size}\n height={size}\n preserveAspectRatio=\"xMidYMid meet\"\n />\n ) : text ? (\n <AssignedOverlayText\n text={text}\n x={x}\n y={y}\n size={size}\n color={color}\n align={align}\n />\n ) : null}\n </g>\n );\n}\n\nfunction AssignedOverlayText({\n text,\n x,\n y,\n size,\n color,\n align,\n}: {\n text: string;\n x: number;\n y: number;\n size: number;\n color: string;\n align: WayfindingAssignedOverlay['align'];\n}) {\n const lines = labelTextLines(text);\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n return (\n <text\n fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={color}\n textAnchor={labelSvgTextAnchor(align)}\n style={{ userSelect: 'none' }}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={x}\n y={y - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n outdoorDecorationFromSvg,\n resolveFetchUrl,\n type StaticLayerTheme,\n} from '../../core';\n\nexport function OutdoorSvgUnderlay({\n url,\n imageProxyUrl,\n suppressIds,\n theme,\n}: {\n url: string;\n imageProxyUrl?: string | null;\n suppressIds?: ReadonlySet<string>;\n theme?: StaticLayerTheme | null;\n}) {\n const [svgText, setSvgText] = useState<string | null>(null);\n const suppressKey = useMemo(\n () => (suppressIds ? [...suppressIds].sort().join('\\0') : ''),\n [suppressIds],\n );\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n setSvgText(text);\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setSvgText(null);\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapEditor.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const paths = useMemo(() => {\n if (!svgText) return [];\n const blocked = suppressKey\n ? new Set(suppressKey.split('\\0').filter(Boolean))\n : undefined;\n return outdoorDecorationFromSvg(svgText, blocked, theme);\n }, [svgText, suppressKey, theme]);\n\n if (paths.length === 0) return null;\n\n return (\n <g className=\"eyeon-map-canvas__outdoor-svg\" pointerEvents=\"none\">\n {paths.map((item, index) => (\n <path\n key={`${item.id}-${index}`}\n d={item.d}\n fill={item.fill ?? 'none'}\n stroke={item.stroke ?? 'none'}\n strokeWidth={item.strokeWidth ?? 0}\n opacity={item.opacity ?? 1}\n />\n ))}\n </g>\n );\n}\n","import type { ShapeKind } from '../../core';\nimport { INTERACTIVE_SHAPE_KINDS } from '../../core';\nimport { isStampShape } from '../entranceIcon';\n\n/** Outdoor underlay items that look clickable on a floor. */\nexport function isUnderlayHintShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Text and entrance hit-boxes stay on Outdoor — do not ghost them onto building floors. */\nexport function isUnderlayDrawnShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return !isStampShape(shape);\n}\n\nexport function underlaySwitchHint(kind: ShapeKind): string {\n if (kind === 'unit' || kind === 'parking_zone') {\n return 'Outdoor store — click to switch to Outdoor and edit';\n }\n if (kind === 'amenity') {\n return 'Outdoor amenity — click to switch to Outdoor and edit';\n }\n if (kind === 'kiosk_screen') {\n return 'Outdoor kiosk — click to switch to Outdoor and edit';\n }\n return 'Outdoor item — click to switch to Outdoor and edit';\n}\n","import type {\n AnchorKind,\n BatchOp,\n CmAnchor,\n CmRouteEdge,\n CmShape,\n ShapeKind,\n Vec2,\n} from '../core';\nimport {\n DEFAULT_WELD_TOLERANCE,\n INTERACTIVE_SHAPE_KINDS,\n distance,\n geometryBBox,\n projectOntoRouteEdge,\n routeCurveOf,\n splitRouteCurve,\n routeAnchorKindForShape,\n type RouteCurve,\n} from '../core';\n\nexport const WAYFINDING_SNAP_PX = 28;\n/**\n * One pick radius (CSS pixels) for wayfinding: the anchor dot, the + on a\n * route, and click-to-connect. On-route and off-route use the same circle.\n */\nexport const WAYFINDING_ANCHOR_HIT_PX = 10;\n\nexport function showsWayfinding(tool: string, routeMode = false): boolean {\n if (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n ) {\n return true;\n }\n return routeMode && (tool === 'select' || tool === 'curve');\n}\n\n/**\n * First empty Create Route click is a preview. A second click commits both\n * ends. Leaving the tool drops the draft so a lone start is never kept.\n */\n/** Esc and Undo share this: a lone preview start is local; anything else undoes. */\nexport function routeSessionUndoKind(session: {\n routeDraftPoint: Vec2 | null;\n storeLinkPreview: unknown;\n}): 'clear-only' | 'clear-and-undo' {\n if (session.routeDraftPoint != null && session.storeLinkPreview == null) {\n return 'clear-only';\n }\n return 'clear-and-undo';\n}\n\nexport function beginOrContinueRouteDraft(\n draft: Vec2 | null,\n world: Vec2,\n): { nextDraft: Vec2 | null; start: Vec2 | null; end: Vec2 | null } {\n if (!draft) return { nextDraft: world, start: null, end: null };\n return { nextDraft: null, start: draft, end: world };\n}\n\n/** Preview line from a started route/store-link to the cursor or snap. */\nexport function routeRubberBand(\n from: Vec2 | null | undefined,\n to: Vec2 | null | undefined,\n): { from: Vec2; to: Vec2 } | null {\n if (!from || !to) return null;\n if (distance(from, to) <= 0.01) return null;\n return { from, to };\n}\n\nexport function isWayfindingShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Outdoor pad sites are not routed — helpers and store links stay indoor. */\nexport function wayfindingLinksShapes(\n level: { kind?: string } | null | undefined,\n): boolean {\n return level?.kind !== 'outdoor';\n}\n\nexport function anchorKindForShape(kind: ShapeKind): AnchorKind {\n return routeAnchorKindForShape(kind);\n}\n\nexport function shapeRoutePoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const box = geometryBBox(shape.geometry);\n if (box.maxX > box.minX || box.maxY > box.minY) {\n return {\n x: (box.minX + box.maxX) / 2,\n y: (box.minY + box.maxY) / 2,\n };\n }\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function shapeRouteAnchor(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId'>>,\n): Pick<CmAnchor, 'id' | 'shapeId'> | undefined {\n return anchors.find((anchor) => anchor.shapeId === shapeId);\n}\n\nexport function anchorHasEdge(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): boolean {\n return edges.some(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n}\n\nexport function routeComponentAnchorIds(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): Set<number> {\n const ids = new Set([anchorId]);\n const pending = [anchorId];\n while (pending.length > 0) {\n const current = pending.pop()!;\n for (const edge of edges) {\n let next: number | null = null;\n if (edge.fromAnchorId === current) next = edge.toAnchorId;\n if (edge.toAnchorId === current) next = edge.fromAnchorId;\n if (next == null || ids.has(next)) continue;\n ids.add(next);\n pending.push(next);\n }\n }\n return ids;\n}\n\nexport function walkEdgeExists(\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n a: number,\n b: number,\n): boolean {\n return edges.some(\n (edge) =>\n (edge.fromAnchorId === a && edge.toAnchorId === b) ||\n (edge.fromAnchorId === b && edge.toAnchorId === a),\n );\n}\n\nexport type RouteSnapTarget =\n | { type: 'junction'; anchorId: number; point: Vec2; distance: number }\n | {\n type: 'edge';\n edgeId: number;\n fromAnchorId: number;\n toAnchorId: number;\n point: Vec2;\n distance: number;\n };\n\n/** Walking segments that can bend. Floor changes stay straight. */\nexport function isCurvableRouteEdge(edge: Pick<CmRouteEdge, 'kind'>): boolean {\n return (\n edge.kind === 'walk' ||\n edge.kind === 'unit_link' ||\n edge.kind === 'entrance_link'\n );\n}\n\nfunction isSnappableRouteEdge(edge: Pick<CmRouteEdge, 'kind'>): boolean {\n return isCurvableRouteEdge(edge);\n}\n\nfunction edgeWithCurve(edge: CmRouteEdge, curve: RouteCurve | null): CmRouteEdge {\n return curve ? { ...edge, curve } : edge;\n}\n\n/** Replace one segment with two, keeping a cubic arch on both halves. */\nfunction splitWalkEdge(\n source: CmRouteEdge,\n junctionId: number,\n point: Vec2,\n mapId: number,\n allocId: () => number,\n anchorById: ReadonlyMap<number, Pick<CmAnchor, 'x' | 'y'>>,\n): { point: Vec2; left: CmRouteEdge; right: CmRouteEdge } {\n const from = anchorById.get(source.fromAnchorId);\n const to = anchorById.get(source.toAnchorId);\n const curve = routeCurveOf(source);\n if (from && to && curve) {\n const split = splitRouteCurve(from, to, curve, point);\n return {\n point: split.point,\n left: edgeWithCurve(\n walkEdge(allocId(), mapId, source.fromAnchorId, junctionId, source.kind),\n split.left,\n ),\n right: edgeWithCurve(\n walkEdge(allocId(), mapId, junctionId, source.toAnchorId, source.kind),\n split.right,\n ),\n };\n }\n return {\n point,\n left: walkEdge(allocId(), mapId, source.fromAnchorId, junctionId, source.kind),\n right: walkEdge(allocId(), mapId, junctionId, source.toAnchorId, source.kind),\n };\n}\n\n/** The orange point we are linking from — not every destination on that store. */\nexport function storeLinkOriginIds(\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId' | 'x' | 'y'>>,\n preview: { shapeId: number; origin: Vec2 } | null | undefined,\n): Set<number> {\n if (!preview) return new Set();\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (\n anchor.shapeId === preview.shapeId &&\n distance(anchor, preview.origin) <= DEFAULT_WELD_TOLERANCE\n ) {\n ids.add(anchor.id);\n }\n }\n return ids;\n}\n\n/**\n * Nearest route point or edge within `maxDist` (same circular hit on and off\n * the path). An existing anchor wins only when the cursor is inside that\n * circle; otherwise a mid-edge hit stays a split so the + can sit close to\n * a neighboring point.\n */\nexport function nearestRouteSnap(\n point: Vec2,\n anchors: CmAnchor[],\n edges: CmRouteEdge[],\n excludeIds: ReadonlySet<number>,\n maxDist: number,\n anchorById: ReadonlyMap<number, CmAnchor> = new Map(\n anchors.map((anchor) => [anchor.id, anchor]),\n ),\n /** Curve tool selects the line under the pointer, even beside an anchor. */\n prefer: 'junction' | 'edge' = 'junction',\n): RouteSnapTarget | null {\n let bestJunction: RouteSnapTarget | null = null;\n let bestEdge: RouteSnapTarget | null = null;\n\n for (const anchor of anchors) {\n if (excludeIds.has(anchor.id)) continue;\n const d = distance(anchor, point);\n if (d > maxDist) continue;\n if (!bestJunction || d < bestJunction.distance) {\n bestJunction = {\n type: 'junction',\n anchorId: anchor.id,\n point: { x: anchor.x, y: anchor.y },\n distance: d,\n };\n }\n }\n\n for (const edge of edges) {\n if (!isSnappableRouteEdge(edge)) continue;\n if (excludeIds.has(edge.fromAnchorId) || excludeIds.has(edge.toAnchorId)) {\n continue;\n }\n const from = anchorById.get(edge.fromAnchorId);\n const to = anchorById.get(edge.toAnchorId);\n if (!from || !to) continue;\n const hit = projectOntoRouteEdge(point, from, to, routeCurveOf(edge));\n if (hit.distance > maxDist) continue;\n if (!bestEdge || hit.distance < bestEdge.distance) {\n bestEdge = {\n type: 'edge',\n edgeId: edge.id,\n fromAnchorId: edge.fromAnchorId,\n toAnchorId: edge.toAnchorId,\n point: hit.point,\n distance: hit.distance,\n };\n }\n }\n\n if (prefer === 'edge') return bestEdge;\n return bestJunction ?? bestEdge;\n}\n\nexport interface ConnectShapeToRouteInput {\n shape: CmShape;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n from: Vec2;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}\n\nfunction walkEdge(\n id: number,\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n kind: CmRouteEdge['kind'] = 'walk',\n): CmRouteEdge {\n return {\n id,\n mapId,\n fromAnchorId,\n toAnchorId,\n weight: null,\n directed: false,\n accessible: true,\n kind,\n };\n}\n\n/** Create a store/amenity route point at the click. Another click elsewhere adds another. */\nexport function ensureShapeRouteAnchorOps(input: {\n shape: CmShape;\n anchors: CmAnchor[];\n allocId: () => number;\n point?: Vec2;\n}): { ops: BatchOp[]; anchorId: number } {\n const { shape, anchors, allocId } = input;\n const point = input.point ?? shapeRoutePoint(shape);\n const existing = anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, point) <= DEFAULT_WELD_TOLERANCE,\n );\n if (existing) return { ops: [], anchorId: existing.id };\n const unit: CmAnchor = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: point.x,\n y: point.y,\n connectorId: null,\n };\n return { ops: [{ op: 'upsert_anchor', anchor: unit }], anchorId: unit.id };\n}\n\n/**\n * Ensure the shape has a destination anchor, then hook it to the walking path\n * at `drop` (existing junction or a split in a walk edge).\n */\nexport function connectShapeToRouteOps(input: ConnectShapeToRouteInput): BatchOp[] {\n const { shape, anchors, edges, mapId, from, drop, maxDist, allocId } = input;\n const ops: BatchOp[] = [];\n let unit =\n anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, from) <= DEFAULT_WELD_TOLERANCE,\n ) ?? null;\n\n if (!unit) {\n unit = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: from.x,\n y: from.y,\n connectorId: null,\n };\n ops.push({ op: 'upsert_anchor', anchor: unit });\n }\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n new Set([unit.id]),\n maxDist,\n );\n if (!snap) return ops;\n if (distance(unit, snap.point) <= DEFAULT_WELD_TOLERANCE) return ops;\n\n let junctionId: number;\n const nextEdges = edges.slice();\n\n if (snap.type === 'junction') {\n junctionId = snap.anchorId;\n } else {\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return ops;\n junctionId = allocId();\n const split = splitWalkEdge(\n source,\n junctionId,\n snap.point,\n mapId,\n allocId,\n new Map(anchors.map((anchor) => [anchor.id, anchor])),\n );\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId: shape.levelId,\n shapeId: null,\n kind: 'junction',\n x: split.point.x,\n y: split.point.y,\n connectorId: null,\n },\n });\n ops.push({ op: 'delete_edge', edgeId: source.id });\n const left = split.left;\n const right = split.right;\n ops.push({ op: 'upsert_edge', edge: left });\n ops.push({ op: 'upsert_edge', edge: right });\n nextEdges.push(left, right);\n }\n\n if (walkEdgeExists(nextEdges, unit.id, junctionId)) return ops;\n\n const linkKind = unit.kind === 'entrance' ? 'entrance_link' : 'unit_link';\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, unit.id, junctionId, linkKind),\n });\n return ops;\n}\n\n/** Snap a loose route junction onto an existing route and join the graph. */\nexport function connectRouteAnchorToRouteOps(input: {\n anchor: CmAnchor;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}): BatchOp[] {\n const { anchor, anchors, edges, mapId, drop, maxDist, allocId } = input;\n const incident = edges.filter(\n (edge) =>\n edge.fromAnchorId === anchor.id || edge.toAnchorId === anchor.id,\n );\n if (anchor.shapeId != null || incident.length > 1) return [];\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n routeComponentAnchorIds(anchor.id, edges),\n maxDist,\n );\n if (!snap) return [];\n\n if (snap.type === 'junction') {\n if (incident.length === 1) {\n const source = incident[0];\n const otherId =\n source.fromAnchorId === anchor.id\n ? source.toAnchorId\n : source.fromAnchorId;\n const ops: BatchOp[] = [];\n if (!walkEdgeExists(edges, otherId, snap.anchorId)) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n ...source,\n fromAnchorId:\n source.fromAnchorId === anchor.id\n ? snap.anchorId\n : source.fromAnchorId,\n toAnchorId:\n source.toAnchorId === anchor.id\n ? snap.anchorId\n : source.toAnchorId,\n },\n });\n } else {\n ops.push({ op: 'delete_edge', edgeId: source.id });\n }\n ops.push({ op: 'delete_anchor', anchorId: anchor.id });\n return ops;\n }\n\n const link = linkRouteAnchorsOp(\n mapId,\n anchor.id,\n snap.anchorId,\n edges,\n allocId,\n );\n const ops: BatchOp[] = [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n ];\n if (link) ops.push(link);\n return ops;\n }\n\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return [];\n const split = splitWalkEdge(\n source,\n anchor.id,\n snap.point,\n mapId,\n allocId,\n new Map(anchors.map((item) => [item.id, item])),\n );\n return [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: split.point.x, y: split.point.y },\n },\n { op: 'delete_edge', edgeId: source.id },\n { op: 'upsert_edge', edge: split.left },\n { op: 'upsert_edge', edge: split.right },\n ];\n}\n\nexport function linkRouteAnchorsOp(\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n allocId: () => number,\n): BatchOp | null {\n if (fromAnchorId === toAnchorId) return null;\n if (walkEdgeExists(edges, fromAnchorId, toAnchorId)) return null;\n return {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, fromAnchorId, toAnchorId),\n };\n}\n\nexport function insertJunctionOnWalkEdgeOps(input: {\n levelId: number;\n mapId: number;\n edge: CmRouteEdge;\n point: Vec2;\n allocId: () => number;\n anchors?: Array<Pick<CmAnchor, 'id' | 'x' | 'y'>>;\n}): { ops: BatchOp[]; junctionId: number } {\n const { levelId, mapId, edge, point, allocId, anchors = [] } = input;\n const junctionId = allocId();\n const split = splitWalkEdge(\n edge,\n junctionId,\n point,\n mapId,\n allocId,\n new Map(anchors.map((anchor) => [anchor.id, anchor])),\n );\n return {\n junctionId,\n ops: [\n {\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId,\n shapeId: null,\n kind: 'junction',\n x: split.point.x,\n y: split.point.y,\n connectorId: null,\n },\n },\n { op: 'delete_edge', edgeId: edge.id },\n { op: 'upsert_edge', edge: split.left },\n { op: 'upsert_edge', edge: split.right },\n ],\n };\n}\n\n/**\n * Remove a walking path. Endpoints that still join other routes stay;\n * endpoints that would be left with no connections are removed too.\n */\nexport function deleteRouteEdgeOps(\n edgeId: number,\n edges: Array<Pick<CmRouteEdge, 'id' | 'fromAnchorId' | 'toAnchorId'>>,\n): BatchOp[] {\n const edge = edges.find((item) => item.id === edgeId);\n if (!edge) return [];\n const remaining = edges.filter((item) => item.id !== edgeId);\n const ops: BatchOp[] = [{ op: 'delete_edge', edgeId }];\n for (const anchorId of [edge.fromAnchorId, edge.toAnchorId]) {\n if (!anchorHasEdge(anchorId, remaining)) {\n ops.push({ op: 'delete_anchor', anchorId });\n }\n }\n return ops;\n}\n\ntype RouteAnchorRef = Pick<\n CmRouteEdge,\n 'id' | 'fromAnchorId' | 'toAnchorId' | 'kind'\n>;\n\n/**\n * What disappears with an anchor. A 2-way corridor is healed, so those\n * neighbors stay. Any other neighbor left with no route is removed too.\n */\nfunction planRouteAnchorRemoval<T extends RouteAnchorRef>(\n anchorId: number,\n edges: T[],\n): {\n incident: T[];\n heal: [number, number] | null;\n removedAnchorIds: number[];\n} {\n const incident = edges.filter(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n const removedEdgeIds = new Set(incident.map((edge) => edge.id));\n const remaining: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>> =\n edges.filter((edge) => !removedEdgeIds.has(edge.id));\n const walkNeighbors = [\n ...new Set(\n incident\n .filter((edge) => edge.kind === 'walk')\n .map((edge) =>\n edge.fromAnchorId === anchorId ? edge.toAnchorId : edge.fromAnchorId,\n ),\n ),\n ];\n const heal: [number, number] | null =\n walkNeighbors.length === 2 &&\n !walkEdgeExists(edges, walkNeighbors[0], walkNeighbors[1])\n ? [walkNeighbors[0], walkNeighbors[1]]\n : null;\n if (heal) {\n remaining.push({ fromAnchorId: heal[0], toAnchorId: heal[1] });\n }\n\n const removedAnchorIds = [anchorId];\n const seen = new Set<number>([anchorId]);\n for (const edge of incident) {\n for (const id of [edge.fromAnchorId, edge.toAnchorId]) {\n if (seen.has(id)) continue;\n seen.add(id);\n if (!anchorHasEdge(id, remaining)) removedAnchorIds.push(id);\n }\n }\n return { incident, heal, removedAnchorIds };\n}\n\n/** Anchors deleted together with `anchorId`, including ones left with no route. */\nexport function anchorsRemovedWithRouteAnchor(\n anchorId: number,\n edges: RouteAnchorRef[],\n): number[] {\n return planRouteAnchorRemoval(anchorId, edges).removedAnchorIds;\n}\n\n/**\n * Remove a route point. A 2-way corridor is healed so the path stays joined.\n * Neighbors that would be left with no route are removed too.\n */\nexport function deleteRouteAnchorOps(\n anchorId: number,\n mapId: number,\n edges: CmRouteEdge[],\n allocId: () => number,\n): BatchOp[] {\n const { incident, heal, removedAnchorIds } = planRouteAnchorRemoval(\n anchorId,\n edges,\n );\n const ops: BatchOp[] = incident.map((edge) => ({\n op: 'delete_edge' as const,\n edgeId: edge.id,\n }));\n if (heal) {\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, heal[0], heal[1]),\n });\n }\n for (const id of removedAnchorIds) {\n ops.push({ op: 'delete_anchor', anchorId: id });\n }\n return ops;\n}\n","import React, {\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n MapAssignRetailer,\n ShapeGeometry,\n ShapeKind,\n ShapeLabel,\n RouteCurve,\n ThemeDefaults,\n Vec2,\n ViewBox,\n} from '../../core';\nimport {\n bendRouteToCubic,\n displayRouteCurve,\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n labelAlignX,\n labelSvgTextAnchor,\n normalizeLabelAlign,\n moveRouteHandle,\n routeCurveOf,\n routeEdgePathD,\n svgIdsOwnedByShapes,\n unionViewBox,\n} from '../../core';\nimport { isEditableTypingTarget } from '../history';\nimport {\n canDeleteWayfindingItem,\n canEditShapeGeometry,\n canJoinOpenEnds,\n canPlaceNewRoute,\n emptyCanvasDragPans,\n isEllipseDrawTool,\n isPolygonDrawTool,\n popPolygonDraftPoint,\n isShapeDrawTool,\n isSplitJoinTool,\n isStampDrawTool,\n isWayfindingEditorTool,\n nextRouteChainAnchor,\n showsCurveHandles,\n showsShapeAnchors,\n type EditorTool,\n} from '../tools';\nimport {\n applySplitJoinCut,\n applySplitJoinJoin,\n canSplitJoinKind,\n hitOpenEnd,\n hitSplitJoinEdge,\n listOpenEnds,\n previewCutPoints,\n sameOpenEnd,\n type OpenEndHit,\n type OpenEndId,\n type ShapeBatchEdit,\n type ShapeGeo,\n type SplitJoinEdgeHit,\n} from '../splitJoin';\nimport { nearestSnapPoint, sameSnapPoint } from '../snapPoint';\nimport {\n constrainOrthogonal,\n constrainVertexOrthogonal,\n isSpacePanKey,\n type OrthoConstraint,\n} from '../ortho';\nimport {\n bendEdgeToCubic,\n flattenCubicEdge,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n geometryToRings,\n pointOnRingEdge,\n ringToPathD,\n hitTestEdge,\n hitTestEdgeMidpoint,\n hitTestHandle,\n hitTestVertex,\n insertVertex,\n moveHandle,\n moveVertex,\n vertexNeighborPoints,\n polygonsToGeometry,\n removeVertex,\n translateEdge,\n translateGeometry,\n} from '../geometryEdit';\nimport {\n ellipseBoundsFromDrag,\n ellipseGeometry,\n} from '../ellipseDraw';\nimport {\n DEFAULT_LABEL_TEXT,\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n defaultLabelSize,\n defaultTextLabel,\n isTextLabel,\n labelBoxCenter,\n labelTextLines,\n textLabelGeometry,\n} from '../labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n defaultEntranceLabel,\n entranceIconGeometry,\n isEntranceIcon,\n isStampShape,\n} from '../entranceIcon';\nimport { entranceIconDataUrl } from '../../specialIcons';\nimport { ensureMapFont } from '../../fonts/mapFontUrl';\nimport {\n clampEditorZoom,\n clientToSvgUser,\n EDITOR_ZOOM_ANIM_MS,\n editorHandleScale,\n interpolateView,\n nextEditorZoomFromWheel,\n panAfterZoom,\n panKeepingWorldAtUser,\n pxPerUserFromSvg,\n screenPxToWorld,\n userToWorld,\n} from './coords';\nimport { editorShapeFill, editorShapeFillOpacity } from './editorFill';\nimport {\n EDITOR_GUIDE_COLOR,\n editorHoverFillOpacity,\n editorMapCursor,\n editorSelectCursor,\n editorShapeEmphasisColor,\n isHoverHighlightShape,\n} from './editorHover';\nimport { wayfindingAssignedOverlays } from '../assignmentOverlay';\nimport { AssignedShapeOverlay } from './AssignedShapeOverlay';\nimport { OutdoorSvgUnderlay } from './OutdoorSvgUnderlay';\nimport {\n isUnderlayDrawnShape,\n isUnderlayHintShape,\n underlaySwitchHint,\n} from './underlayHint';\nimport {\n WAYFINDING_ANCHOR_HIT_PX,\n WAYFINDING_SNAP_PX,\n anchorHasEdge,\n anchorsRemovedWithRouteAnchor,\n beginOrContinueRouteDraft,\n isWayfindingShape,\n routeRubberBand,\n routeComponentAnchorIds,\n routeSessionUndoKind,\n nearestRouteSnap,\n isCurvableRouteEdge,\n showsWayfinding,\n storeLinkOriginIds,\n wayfindingLinksShapes,\n type RouteSnapTarget,\n} from '../routeStubs';\n\nconst ANCHOR_R_PX = 9;\nconst ANCHOR_R_SELECTED_PX = 11;\nconst ANCHOR_HIT_PX = 16;\nconst ANCHOR_STROKE_PX = 2;\n/** Store / amenity / kiosk route points — distinct from selected (accent) junctions. */\nconst SHAPE_ROUTE_ANCHOR_FILL = '#ea580c';\nconst VERTEX_R_PX = 7;\nconst VERTEX_R_SELECTED_PX = 9;\nconst VERTEX_HIT_PX = 14;\nconst VERTEX_STROKE_PX = 2;\nconst HANDLE_R_PX = 5;\nconst HANDLE_R_SELECTED_PX = 6;\nconst HANDLE_HIT_PX = 12;\nconst HANDLE_LINE_PX = 2.25;\nconst HANDLE_LINE_HALO_PX = 4;\nconst BEND_R_PX = 4;\nconst EDGE_DRAG_PX = 4;\n/** Hover / cut pair — tight enough to read as one break, not two far dots. */\nconst SPLIT_JOIN_GAP_PX = 7;\nconst SNAP_HIT_PX = 16;\n\nfunction rectPolygon(a: Vec2, b: Vec2): Vec2[] {\n return [\n { x: a.x, y: a.y },\n { x: b.x, y: a.y },\n { x: b.x, y: b.y },\n { x: a.x, y: b.y },\n ];\n}\n\nfunction dragSize(a: Vec2, b: Vec2): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\n/** Settled world stroke; CSS multiplies by --map-handle-scale during wheel. */\nfunction screenStrokeStyle(width: number): React.CSSProperties {\n return { ['--map-stroke-width']: width } as React.CSSProperties;\n}\n\nfunction HandleDot({\n cx,\n cy,\n r,\n hitR,\n fill,\n stroke,\n strokeWidth,\n cursor,\n fillOpacity = 1,\n strokeDasharray,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onDoubleClick,\n}: {\n cx: number;\n cy: number;\n r: number;\n hitR: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n cursor?: string;\n fillOpacity?: number;\n strokeDasharray?: string;\n onPointerDown?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerEnter?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerLeave?: (e: React.PointerEvent<SVGGElement>) => void;\n onDoubleClick?: (e: React.MouseEvent<SVGGElement>) => void;\n}) {\n return (\n <g\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onMouseDown={(e) => e.preventDefault()}\n onDoubleClick={onDoubleClick}\n style={cursor ? { cursor } : undefined}\n >\n <g transform={`translate(${cx} ${cy})`}>\n <g className=\"eyeon-map-screen-const\">\n <circle cx={0} cy={0} r={hitR} fill=\"transparent\" />\n <circle\n cx={0}\n cy={0}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n </g>\n </g>\n </g>\n );\n}\n\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n /** Center retailers — wayfinding draws assigned names / logos from these. */\n retailers?: MapAssignRetailer[];\n /** Amenity catalog — wayfinding draws assigned amenity / kiosk icons. */\n amenities?: CmAmenityCatalogItem[];\n theme: ThemeDefaults;\n tool: EditorTool;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n /** Outdoor SVG underlay (designer-owned). */\n baseSvgUrl: string | null;\n baseViewbox?: ViewBox | null;\n /**\n * Live outdoor SVG. Drawn on every Edit Map and Wayfinding floor (and\n * Outdoor) so green areas, parking lanes, and icons match the assign view.\n */\n outdoorSvgUrl?: string | null;\n /** Same proxy as MapViewer — required when the SVG is cross-origin. */\n imageProxyUrl?: string | null;\n /** @deprecated Use outdoorSvgUrl. Kept so existing hosts keep compiling. */\n levelSvgUrl?: string | null;\n /** Outdoor/base shapes drawn behind the active building floor (non-interactive). */\n underlayShapes?: CmShape[];\n /** Floor below, clipped to openings so Edit Map previews the atrium. */\n openingUnderlayShapes?: CmShape[];\n /** When true (outdoor), only interactive shapes are editable. */\n interactiveOnly?: boolean;\n /** Graph-paper grid. PORTAL only mounts this canvas after Edit Map. Always above shapes. */\n showGrid?: boolean;\n /** 0–1 strength of the grid lines. */\n gridOpacity?: number;\n /** Wayfinding section: Select also shows and edits the route graph. */\n routeMode?: boolean;\n /** Pan and zoom only — used for Outdoor in Wayfinding. */\n readOnly?: boolean;\n onSelectShape: (id: number | null) => void;\n onSelectAnchors: (ids: number[]) => void;\n onCreateRoutePoint: (\n point: Vec2,\n prevAnchorId: number | null,\n ) => number | null | void;\n /** First committed Create Route segment (two points + one edge). */\n onCreateRouteSegment: (start: Vec2, end: Vec2) => number | null | void;\n /** Connect two existing junctions with a walk edge. */\n onLinkRouteAnchors?: (fromAnchorId: number, toAnchorId: number) => void;\n onInsertRouteJunction: (edgeId: number, point: Vec2) => number | null | void;\n /** Esc on a route draft uses the same path as the Undo control. */\n onUndo?: () => void;\n onRouteDraftActiveChange?: (active: boolean) => void;\n /** Esc on Multi Route (or Create Route) used to return to Select. */\n onToolChange?: (tool: EditorTool) => void;\n onDeleteRouteAnchor: (anchorId: number) => void;\n /** Double-click a walking path to remove it and any leftover endpoints. */\n onDeleteRouteEdge: (edgeId: number) => void;\n onConnectShapeToRoute: (\n shapeId: number,\n from: Vec2,\n drop: Vec2,\n maxDist: number,\n ) => void;\n onConnectRouteAnchorToRoute: (\n anchorId: number,\n drop: Vec2,\n maxDist: number,\n ) => void;\n /** Click inside a store to place its orange destination at that point. */\n onEnsureShapeAnchor: (shapeId: number, point: Vec2) => number | null | void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n /** Curve tool: bend a walking segment or flatten it back to a line. */\n onUpdateRouteCurve?: (\n edgeId: number,\n curve: RouteCurve | null,\n opts?: { live?: boolean },\n ) => void;\n onCreateShape: (\n kind: ShapeKind,\n geometry: ShapeGeometry,\n extras?: { label?: ShapeLabel },\n ) => void;\n onUpdateShapeGeometry: (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => void;\n onBatchShapeEdits?: (edits: ShapeBatchEdit[]) => void;\n /** End a live drag so the next edit starts a new undo step. */\n onHistoryGestureEnd?: () => void;\n /** Shown when no floor or Outdoor is selected. */\n emptyMessage?: string;\n}\n\nexport interface EditorCanvasHandle {\n consumeRouteUndo: () => 'clear-only' | 'clear-and-undo';\n zoomIn: () => void;\n zoomOut: () => void;\n resetView: () => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nfunction isEditableShape(shape: CmShape, interactiveOnly: boolean): boolean {\n if (shape.orphanedAt) return false;\n if (isStampShape(shape)) return true;\n if (!interactiveOnly) return true;\n return INTERACTIVE_SHAPE_KINDS.includes(shape.kind);\n}\n\nfunction editorCanvasClass(showGrid: boolean): string {\n if (!showGrid) return 'eyeon-map-canvas';\n return 'eyeon-map-canvas eyeon-map-canvas--grid';\n}\n\nfunction editorCanvasStyle(\n showGrid: boolean,\n gridOpacity: number,\n): React.CSSProperties | undefined {\n if (!showGrid) return undefined;\n return {\n '--eyeon-map-grid-opacity': String(gridOpacity),\n } as React.CSSProperties;\n}\n\nexport const EditorCanvas = React.forwardRef<EditorCanvasHandle, EditorCanvasProps>(\nfunction EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n assignments,\n retailers = [],\n amenities = [],\n theme,\n tool,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n baseViewbox = null,\n outdoorSvgUrl = null,\n imageProxyUrl = null,\n levelSvgUrl = null,\n underlayShapes = [],\n openingUnderlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n gridOpacity = 0.13,\n routeMode = false,\n readOnly = false,\n emptyMessage = 'Choose a floor or Outdoor to edit',\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onCreateRouteSegment,\n onLinkRouteAnchors,\n onInsertRouteJunction,\n onDeleteRouteAnchor,\n onDeleteRouteEdge,\n onConnectShapeToRoute,\n onConnectRouteAnchorToRoute,\n onEnsureShapeAnchor,\n onMoveAnchor,\n onUpdateRouteCurve,\n onCreateShape,\n onUpdateShapeGeometry,\n onBatchShapeEdits,\n onHistoryGestureEnd,\n onUndo,\n onRouteDraftActiveChange,\n onToolChange,\n}, ref) {\n ensureMapFont();\n const wayfindingOn = showsWayfinding(tool, routeMode);\n const svgRef = useRef<SVGSVGElement>(null);\n const viewGroupRef = useRef<SVGGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const [, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const viewRef = useRef({ pan: { x: 0, y: 0 }, zoom: 1 });\n /** Zoom last used to compute `worldPx` handle radii in React. */\n const sizeZoomRef = useRef(1);\n const wheelFrameRef = useRef<number | null>(null);\n const wheelSettleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [pxPerUser, setPxPerUser] = useState(1);\n const pointersRef = useRef(new Map<number, Vec2>());\n const pinchRef = useRef<{\n startDist: number;\n startZoom: number;\n world: Vec2;\n } | null>(null);\n const [drawing, setDrawing] = useState<Vec2[]>([]);\n const [drawLockCircle, setDrawLockCircle] = useState(false);\n const [spaceHeld, setSpaceHeld] = useState(false);\n const spaceHeldRef = useRef(false);\n const [axisGuide, setAxisGuide] = useState<OrthoConstraint | null>(null);\n const [polygonPoints, setPolygonPoints] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [dragAnchorPoint, setDragAnchorPoint] = useState<Vec2 | null>(null);\n const [routeCurveDrag, setRouteCurveDrag] = useState<\n | { type: 'bend'; edgeId: number }\n | { type: 'handle'; edgeId: number; handle: 1 | 2 }\n | null\n >(null);\n const [selectedRouteHandle, setSelectedRouteHandle] = useState<{\n edgeId: number;\n handle: 1 | 2;\n } | null>(null);\n const [lastRouteAnchor, setLastRouteAnchor] = useState<number | null>(null);\n const [routeDraftPoint, setRouteDraftPoint] = useState<Vec2 | null>(null);\n const [storeLinkPreview, setStoreLinkPreview] = useState<{\n shapeId: number;\n origin: Vec2;\n } | null>(null);\n const [rubberCursor, setRubberCursor] = useState<Vec2 | null>(null);\n const [splitJoinPending, setSplitJoinPending] = useState<OpenEndId | null>(\n null,\n );\n const [splitJoinHover, setSplitJoinHover] = useState<SplitJoinEdgeHit | null>(\n null,\n );\n const [splitJoinSnapEnd, setSplitJoinSnapEnd] = useState<OpenEndHit | null>(\n null,\n );\n const [polygonSnap, setPolygonSnap] = useState<Vec2 | null>(null);\n const clearRouteSession = () => {\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n };\n useEffect(() => {\n onRouteDraftActiveChange?.(\n routeDraftPoint != null || polygonPoints.length > 0 || drawing.length > 0,\n );\n }, [drawing.length, onRouteDraftActiveChange, polygonPoints.length, routeDraftPoint]);\n useEffect(() => {\n if (lastRouteAnchor == null) return;\n if (anchors.some((anchor) => anchor.id === lastRouteAnchor)) return;\n setLastRouteAnchor(null);\n setRubberCursor(null);\n }, [anchors, lastRouteAnchor]);\n const [stubDrag, setStubDrag] = useState<{\n shapeId: number;\n origin: Vec2;\n cursor: Vec2;\n clientX: number;\n clientY: number;\n } | null>(null);\n const [shapeDrag, setShapeDrag] = useState<{\n shapeId: number;\n start: Vec2;\n originGeometry: ShapeGeometry;\n } | null>(null);\n const [shapeOffset, setShapeOffset] = useState<Vec2>({ x: 0, y: 0 });\n const [vertexDrag, setVertexDrag] = useState<{\n type: 'anchor';\n shapeId: number;\n polygonIndex: number;\n vertexIndex: number;\n } | {\n type: 'handle';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | {\n type: 'bend';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n } | null>(null);\n const [selectedVertex, setSelectedVertex] = useState<{\n polygonIndex: number;\n vertexIndex: number;\n } | null>(null);\n const [selectedHandle, setSelectedHandle] = useState<{\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | null>(null);\n const [hoveredEdge, setHoveredEdge] = useState<{\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n } | null>(null);\n const [edgePress, setEdgePress] = useState<{\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n start: Vec2;\n clientX: number;\n clientY: number;\n insertAt: Vec2;\n originGeometry: ShapeGeometry;\n dragging: boolean;\n } | null>(null);\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [hoveredAnchorId, setHoveredAnchorId] = useState<number | null>(null);\n const [routePointerSnap, setRoutePointerSnap] =\n useState<RouteSnapTarget | null>(null);\n const [selectedRouteEdgeId, setSelectedRouteEdgeId] = useState<number | null>(\n null,\n );\n const reportAnchors = onSelectAnchors;\n const selectAnchors = (ids: number[]) => {\n setSelectedRouteEdgeId(null);\n reportAnchors(ids);\n };\n useEffect(() => {\n if (selectedRouteEdgeId == null) return;\n if (!edges.some((edge) => edge.id === selectedRouteEdgeId)) {\n setSelectedRouteEdgeId(null);\n }\n }, [edges, selectedRouteEdgeId]);\n const routeHover =\n routePointerSnap?.type === 'edge'\n ? { edgeId: routePointerSnap.edgeId, point: routePointerSnap.point }\n : null;\n const [underlayTip, setUnderlayTip] = useState<{\n x: number;\n y: number;\n text: string;\n } | null>(null);\n const panStart = useRef<{\n x: number;\n y: number;\n panX: number;\n panY: number;\n clientX: number;\n clientY: number;\n fromEmptySelect: boolean;\n } | null>(null);\n const [isPanning, setIsPanning] = useState(false);\n\n const worldPx = (px: number) =>\n screenPxToWorld(px, viewRef.current.zoom, pxPerUser);\n\n const syncViewDom = (nextPan: Vec2, nextZoom: number) => {\n const g = viewGroupRef.current;\n if (!g) return;\n g.setAttribute(\n 'transform',\n `translate(${nextPan.x}, ${nextPan.y}) scale(${nextZoom})`,\n );\n // One CSS var — not a React re-render of every store/route node.\n g.style.setProperty(\n '--map-handle-scale',\n String(editorHandleScale(sizeZoomRef.current, nextZoom)),\n );\n };\n\n const applyView = (nextPan: Vec2, nextZoom: number) => {\n cancelWheelWork();\n viewRef.current = { pan: nextPan, zoom: nextZoom };\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n // Wheel input can fire much faster than paint. Move the SVG group\n // imperatively once per frame, then let React reconcile once scrolling ends.\n // Handle dots counter-scale in that same frame so they do not swell/shrink.\n const paintView = () => {\n wheelFrameRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n syncViewDom(nextPan, nextZoom);\n };\n\n const settleWheelView = () => {\n wheelSettleRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n const scheduleWheelPaint = () => {\n if (wheelFrameRef.current == null) {\n wheelFrameRef.current = requestAnimationFrame(paintView);\n }\n if (wheelSettleRef.current != null) clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = setTimeout(settleWheelView, 80);\n };\n\n const cancelWheelWork = () => {\n if (wheelFrameRef.current != null) {\n cancelAnimationFrame(wheelFrameRef.current);\n wheelFrameRef.current = null;\n }\n if (wheelSettleRef.current != null) {\n clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = null;\n }\n };\n\n const zoomAnimRef = useRef<number | null>(null);\n const cancelZoomAnim = () => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n };\n\n const animateViewTo = (targetPan: Vec2, targetZoom: number) => {\n cancelWheelWork();\n cancelZoomAnim();\n const from = {\n pan: { ...viewRef.current.pan },\n zoom: viewRef.current.zoom,\n };\n const to = { pan: targetPan, zoom: targetZoom };\n if (\n from.zoom === to.zoom &&\n from.pan.x === to.pan.x &&\n from.pan.y === to.pan.y\n ) {\n return;\n }\n const started = performance.now();\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / EDITOR_ZOOM_ANIM_MS);\n const next = interpolateView(from, to, t);\n applyView(next.pan, next.zoom);\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n };\n\n const zoomAroundCenter = (factor: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const user = clientToSvgUser(\n svg,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = clampEditorZoom(currentZoom * factor);\n if (nextZoom === currentZoom) return;\n animateViewTo(panAfterZoom(user, currentPan, currentZoom, nextZoom), nextZoom);\n };\n\n useImperativeHandle(ref, () => ({\n consumeRouteUndo: () => {\n const polygon = popPolygonDraftPoint(polygonPoints);\n if (polygon.consumed) {\n setPolygonPoints(polygon.points);\n setPolygonSnap(null);\n setAxisGuide(null);\n if (polygon.points.length === 0) setRubberCursor(null);\n return 'clear-only';\n }\n if (drawing.length > 0) {\n setDrawing([]);\n setDrawLockCircle(false);\n return 'clear-only';\n }\n const kind = routeSessionUndoKind({\n routeDraftPoint,\n storeLinkPreview,\n });\n clearRouteSession();\n return kind;\n },\n zoomIn: () => zoomAroundCenter(1.25),\n zoomOut: () => zoomAroundCenter(0.8),\n resetView: () => animateViewTo({ x: 0, y: 0 }, 1),\n }));\n\n const renderedZoom = viewRef.current.zoom;\n useLayoutEffect(() => {\n // Every commit: mid-wheel hover re-renders recompute worldPx from live\n // viewRef, so the CSS scale must reset in that same paint.\n sizeZoomRef.current = renderedZoom;\n syncViewDom(viewRef.current.pan, viewRef.current.zoom);\n });\n\n useEffect(\n () => () => {\n cancelZoomAnim();\n cancelWheelWork();\n },\n [],\n );\n\n useEffect(() => {\n setDrawing([]);\n setDrawLockCircle(false);\n setPolygonPoints([]);\n setLastRouteAnchor(null);\n setRouteDraftPoint(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n setStubDrag(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setRouteCurveDrag(null);\n setSelectedRouteHandle(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setRoutePointerSnap(null);\n setEdgePress(null);\n setSplitJoinHover(null);\n if (!canJoinOpenEnds(tool)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n }\n setPolygonSnap(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [tool]);\n\n useEffect(() => {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setEdgePress(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [selectedShapeId]);\n\n useEffect(() => {\n clearRouteSession();\n setStubDrag(null);\n setRoutePointerSnap(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n }, [level?.id]);\n\n const viewbox = unionViewBox(level?.sourceViewbox, baseViewbox);\n const svgUnderlayUrl =\n outdoorSvgUrl ?? levelSvgUrl ?? (level?.kind === 'outdoor' ? baseSvgUrl : null);\n const svgSuppressIds = useMemo(\n () =>\n svgIdsOwnedByShapes([...underlayShapes, ...shapes], {\n omitStaticLayers: interactiveOnly,\n }),\n [underlayShapes, shapes, interactiveOnly],\n );\n\n useLayoutEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n const measure = () => {\n const next = pxPerUserFromSvg(svg);\n setPxPerUser((prev) => (Math.abs(prev - next) < 1e-6 ? prev : next));\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [level?.id, viewbox.x, viewbox.y, viewbox.width, viewbox.height]);\n\n const editableShapes = useMemo(\n () => shapes.filter((s) => isEditableShape(s, interactiveOnly)),\n [shapes, interactiveOnly],\n );\n const openingShapes = useMemo(\n () => editableShapes.filter((s) => s.kind === 'void'),\n [editableShapes],\n );\n const openingClipId = `eyeon-opening-clip-${level?.id ?? 'none'}`;\n const openingHatchId = `eyeon-opening-hatch-${level?.id ?? 'none'}`;\n\n const selectedShape =\n editableShapes.find((s) => s.id === selectedShapeId) ?? null;\n\n const displayGeometry = useMemo(() => {\n if (!selectedShape) return null;\n if (shapeDrag && shapeDrag.shapeId === selectedShape.id) {\n return translateGeometry(shapeDrag.originGeometry, shapeOffset.x, shapeOffset.y);\n }\n return selectedShape.geometry;\n }, [selectedShape, shapeDrag, shapeOffset]);\n\n const splitJoinShapes = useMemo<ShapeGeo[]>(\n () =>\n editableShapes\n .filter((s) => canSplitJoinKind(s.kind) && !isStampShape(s))\n .map((s) => ({\n id: s.id,\n kind: s.kind,\n style: s.style,\n geometry: s.geometry,\n })),\n [editableShapes],\n );\n\n const polygonAnchorCandidates = useMemo(() => {\n const pts: Vec2[] = [];\n for (const shape of editableShapes) {\n if (isStampShape(shape)) continue;\n for (const ring of geometryToRings(shape.geometry)) {\n pts.push(...ring.anchors);\n }\n }\n return pts;\n }, [editableShapes]);\n\n const nearSplitJoinAnchor = (world: Vec2, tol: number): boolean => {\n if (hitOpenEnd(splitJoinShapes, world, tol)) return true;\n return splitJoinShapes.some(\n (shape) => hitTestVertex(shape.geometry, world, tol) != null,\n );\n };\n\n const snapPolygonPoint = (world: Vec2): Vec2 | null => {\n const own = polygonPoints.length >= 3 ? [polygonPoints[0]] : [];\n return nearestSnapPoint(\n world,\n [...own, ...polygonAnchorCandidates],\n worldPx(SNAP_HIT_PX),\n );\n };\n\n const commitSplitJoinEdits = (edits: ShapeBatchEdit[]) => {\n if (!edits.length) return;\n onBatchShapeEdits?.(edits);\n const deleted = new Set(\n edits.filter((e) => e.action === 'delete').map((e) => e.shapeId),\n );\n if (selectedShapeId != null && deleted.has(selectedShapeId)) {\n const survivor = edits.find((e) => e.action === 'update');\n onSelectShape(survivor && survivor.action === 'update' ? survivor.shapeId : null);\n }\n };\n\n const tryJoinOpenEnd = (world: Vec2): boolean => {\n if (!canJoinOpenEnds(tool) || readOnly) return false;\n const endHit =\n splitJoinSnapEnd ??\n hitOpenEnd(splitJoinShapes, world, worldPx(SNAP_HIT_PX), splitJoinPending);\n if (!endHit) return false;\n if (!splitJoinPending) {\n setSplitJoinPending(endHit);\n onSelectShape(endHit.shapeId);\n if (isSplitJoinTool(tool)) onToolChange?.('select');\n return true;\n }\n if (sameOpenEnd(splitJoinPending, endHit)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n commitSplitJoinEdits(applySplitJoinJoin(splitJoinShapes, splitJoinPending, endHit));\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return true;\n };\n\n const handleSplitJoinAt = (world: Vec2): boolean => {\n if (tryJoinOpenEnd(world)) return true;\n if (!isSplitJoinTool(tool) || readOnly) return false;\n const endTol = worldPx(SNAP_HIT_PX);\n const edgeTol = worldPx(VERTEX_HIT_PX);\n const edgeHit = hitSplitJoinEdge(splitJoinShapes, world, edgeTol);\n if (edgeHit && !nearSplitJoinAnchor(world, endTol)) {\n commitSplitJoinEdits(\n applySplitJoinCut(splitJoinShapes, edgeHit, worldPx(SPLIT_JOIN_GAP_PX)),\n );\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n onSelectShape(edgeHit.shapeId);\n return true;\n }\n if (splitJoinPending) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n return false;\n };\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n return userToWorld(\n clientToSvgUser(svg, clientX, clientY),\n currentPan,\n currentZoom,\n );\n };\n\n const moveUnderlayTip = (e: React.PointerEvent, kind: ShapeKind) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (!rect) return;\n setUnderlayTip({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n text: underlaySwitchHint(kind),\n });\n };\n\n const insertAnchorOnEdge = (\n shape: CmShape,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n ) => {\n const next = insertVertex(shape.geometry, ringIndex, edgeIndex, point);\n onUpdateShapeGeometry(shape.id, next);\n setSelectedVertex({\n polygonIndex: ringIndex,\n vertexIndex: edgeIndex + 1,\n });\n setSelectedHandle(null);\n setHoveredEdge(null);\n };\n\n const beginEdgePress = (\n ringIndex: number,\n edgeIndex: number,\n insertAt: Vec2,\n e: React.PointerEvent,\n ) => {\n if (!selectedShape) return;\n e.stopPropagation();\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setEdgePress({\n shapeId: selectedShape.id,\n ringIndex,\n edgeIndex,\n start: toWorld(e.clientX, e.clientY),\n clientX: e.clientX,\n clientY: e.clientY,\n insertAt,\n originGeometry: displayGeometry ?? selectedShape.geometry,\n dragging: false,\n });\n };\n\n const deleteShapeAnchor = (ringIndex: number, vertexIndex: number) => {\n if (!selectedShape) return;\n const next = removeVertex(selectedShape.geometry, ringIndex, vertexIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const beginSplitJoinVertexDrag = (\n world: Vec2,\n e: React.PointerEvent,\n ): boolean => {\n if (!selectedShape || !displayGeometry) return false;\n const vertexHit = hitTestVertex(\n displayGeometry,\n world,\n worldPx(VERTEX_HIT_PX),\n );\n if (!vertexHit) return false;\n if (hitOpenEnd(splitJoinShapes, vertexHit.point, worldPx(4))) return false;\n if (e.detail >= 2) {\n deleteShapeAnchor(vertexHit.polygonIndex, vertexHit.vertexIndex);\n return true;\n }\n setSelectedVertex({\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return true;\n };\n\n const deleteShapeHandle = (ringIndex: number, edgeIndex: number) => {\n if (!selectedShape) return;\n const next = flattenCubicEdge(selectedShape.geometry, ringIndex, edgeIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const hoverEdgeAt = (\n ringIndex: number,\n edgeIndex: number,\n clientX: number,\n clientY: number,\n ) => {\n if (!selectedShape) return;\n const world = toWorld(clientX, clientY);\n const ring = geometryToRings(displayGeometry ?? selectedShape.geometry)[\n ringIndex\n ];\n setHoveredEdge({\n ringIndex,\n edgeIndex,\n point: ring ? pointOnRingEdge(ring, edgeIndex, world) : world,\n });\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n const connectedAnchorIds = useMemo(() => {\n const ids = new Set<number>();\n edges.forEach((edge) => {\n ids.add(edge.fromAnchorId);\n ids.add(edge.toAnchorId);\n });\n return ids;\n }, [edges]);\n const routeAnchorDegreeById = useMemo(() => {\n const degree = new Map<number, number>();\n edges.forEach((edge) => {\n degree.set(\n edge.fromAnchorId,\n (degree.get(edge.fromAnchorId) ?? 0) + 1,\n );\n degree.set(\n edge.toAnchorId,\n (degree.get(edge.toAnchorId) ?? 0) + 1,\n );\n });\n return degree;\n }, [edges]);\n const dragRouteExcludeIds = useMemo(\n () =>\n dragAnchor == null\n ? new Set<number>()\n : routeComponentAnchorIds(dragAnchor, edges),\n [dragAnchor, edges],\n );\n const draggingOpenRouteAnchor =\n tool === 'select' &&\n dragAnchor != null &&\n anchorById.get(dragAnchor)?.shapeId == null &&\n (routeAnchorDegreeById.get(dragAnchor) ?? 0) <= 1;\n const dragRouteSnap =\n draggingOpenRouteAnchor && dragAnchorPoint\n ? nearestRouteSnap(\n dragAnchorPoint,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n )\n : null;\n const displayAnchorById = useMemo(() => {\n if (dragAnchor == null || !dragAnchorPoint) return anchorById;\n const dragged = anchorById.get(dragAnchor);\n if (!dragged) return anchorById;\n const next = new Map(anchorById);\n next.set(dragAnchor, {\n ...dragged,\n ...(dragRouteSnap?.point ?? dragAnchorPoint),\n });\n return next;\n }, [anchorById, dragAnchor, dragAnchorPoint, dragRouteSnap]);\n const routeEdgePath = useMemo(\n () =>\n edges\n .map((edge) => {\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n if (!from || !to) return '';\n return routeEdgePathD(\n from,\n to,\n displayRouteCurve(edge, anchorById, displayAnchorById),\n );\n })\n .filter(Boolean)\n .join(' '),\n [anchorById, displayAnchorById, edges],\n );\n const assignmentByShapeId = useMemo(\n () => new Map(assignments.map((row) => [row.shapeId, row])),\n [assignments],\n );\n const assignedOverlays = useMemo(\n () =>\n wayfindingOn\n ? wayfindingAssignedOverlays({\n shapes: editableShapes,\n underlayShapes,\n assignments,\n retailers,\n amenities,\n theme,\n })\n : [],\n [\n amenities,\n assignments,\n editableShapes,\n retailers,\n theme,\n underlayShapes,\n wayfindingOn,\n ],\n );\n\n const updateRoutePointerSnap = (clientX: number, clientY: number) => {\n const world = toWorld(clientX, clientY);\n if (\n routeDraftPoint ||\n storeLinkPreview ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null)\n ) {\n setRubberCursor(world);\n }\n setRoutePointerSnap(\n nearestRouteSnap(\n world,\n anchors,\n edges,\n storeLinkOriginIds(anchors, storeLinkPreview),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n showsCurveHandles(tool) ? 'edge' : 'junction',\n ),\n );\n };\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n return;\n }\n onCreateShape('unit', polygonsToGeometry([polygonPoints]));\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n };\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Shift') {\n const down = e.type === 'keydown';\n if (isEllipseDrawTool(tool)) setDrawLockCircle(down);\n if (!down) setAxisGuide(null);\n return;\n }\n if (!isSpacePanKey(e)) return;\n if (isEditableTypingTarget(e.target)) return;\n e.preventDefault();\n if (e.type === 'keydown' && e.repeat) return;\n const down = e.type === 'keydown';\n spaceHeldRef.current = down;\n setSpaceHeld(down);\n };\n const onBlur = () => {\n spaceHeldRef.current = false;\n setSpaceHeld(false);\n };\n window.addEventListener('keydown', onKey);\n window.addEventListener('keyup', onKey);\n window.addEventListener('blur', onBlur);\n return () => {\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('keyup', onKey);\n window.removeEventListener('blur', onBlur);\n };\n }, [tool]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (isPolygonDrawTool(tool)) {\n if (e.key === 'Enter') {\n e.preventDefault();\n closePolygon();\n } else if (e.key === 'Escape') {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n setAxisGuide(null);\n }\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n splitJoinPending != null\n ) {\n e.preventDefault();\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return;\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n (canPlaceNewRoute(tool) ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n lastRouteAnchor != null)\n ) {\n e.preventDefault();\n onUndo?.();\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n canEditShapeGeometry(tool, routeMode) &&\n showsShapeAnchors(tool) &&\n selectedVertex\n ) {\n e.preventDefault();\n const next = removeVertex(\n selectedShape.geometry,\n selectedVertex.polygonIndex,\n selectedVertex.vertexIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n }\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n canEditShapeGeometry(tool, routeMode) &&\n showsCurveHandles(tool) &&\n selectedHandle\n ) {\n e.preventDefault();\n const next = flattenCubicEdge(\n selectedShape.geometry,\n selectedHandle.ringIndex,\n selectedHandle.edgeIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n }\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n tool,\n polygonPoints,\n selectedShape,\n selectedVertex,\n selectedHandle,\n storeLinkPreview,\n routeDraftPoint,\n lastRouteAnchor,\n splitJoinPending,\n onUndo,\n ]);\n\n useEffect(() => {\n const node = canvasRef.current;\n if (!node) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n if (e.deltaY === 0) return;\n const svg = svgRef.current;\n if (!svg) return;\n cancelZoomAnim();\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = nextEditorZoomFromWheel(currentZoom, e);\n if (nextZoom === currentZoom) return;\n viewRef.current = {\n pan: panAfterZoom(user, currentPan, currentZoom, nextZoom),\n zoom: nextZoom,\n };\n scheduleWheelPaint();\n };\n node.addEventListener('wheel', onWheel, { passive: false, capture: true });\n return () => {\n cancelWheelWork();\n node.removeEventListener('wheel', onWheel, { capture: true });\n };\n }, [Boolean(level)]);\n\n const beginPinch = () => {\n cancelWheelWork();\n cancelZoomAnim();\n const svg = svgRef.current;\n const pts = [...pointersRef.current.values()];\n if (!svg || pts.length < 2) return;\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n pinchRef.current = {\n startDist: Math.max(1, Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y)),\n startZoom: currentZoom,\n world: userToWorld(user, currentPan, currentZoom),\n };\n panStart.current = null;\n setIsPanning(false);\n setDrawing([]);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n };\n\n const onCanvasPointerDownCapture = (e: React.PointerEvent) => {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (pointersRef.current.size >= 2) {\n e.preventDefault();\n e.stopPropagation();\n beginPinch();\n return;\n }\n // Space pan wins over shape, vertex, and route drags, including a press\n // that starts on the selected store.\n if (!spaceHeldRef.current || e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n beginPan(e, false);\n };\n\n const onCanvasPointerMoveCapture = (e: React.PointerEvent) => {\n if (pointersRef.current.has(e.pointerId)) {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n }\n if (!pinchRef.current || pointersRef.current.size < 2) return;\n const svg = svgRef.current;\n if (!svg) return;\n e.stopPropagation();\n const pts = [...pointersRef.current.values()];\n const dist = Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y);\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const nextZoom = clampEditorZoom(\n pinchRef.current.startZoom * (dist / pinchRef.current.startDist),\n );\n applyView(panKeepingWorldAtUser(user, pinchRef.current.world, nextZoom), nextZoom);\n };\n\n const onCanvasPointerUpCapture = (e: React.PointerEvent) => {\n const wasPinching = pinchRef.current != null;\n pointersRef.current.delete(e.pointerId);\n if (pointersRef.current.size < 2) pinchRef.current = null;\n if (wasPinching) e.stopPropagation();\n };\n\n const beginPan = (e: React.PointerEvent, fromEmptySelect: boolean) => {\n cancelZoomAnim();\n const svg = svgRef.current;\n const user = svg\n ? clientToSvgUser(svg, e.clientX, e.clientY)\n : { x: e.clientX, y: e.clientY };\n panStart.current = {\n x: user.x,\n y: user.y,\n panX: viewRef.current.pan.x,\n panY: viewRef.current.pan.y,\n clientX: e.clientX,\n clientY: e.clientY,\n fromEmptySelect,\n };\n setIsPanning(true);\n const captureNode = svgRef.current ?? e.currentTarget;\n captureNode.setPointerCapture?.(e.pointerId);\n };\n\n const insertHoveredRoutePoint = (edgeId: number, point: Vec2) => {\n const created = onInsertRouteJunction(edgeId, point);\n if (canPlaceNewRoute(tool) && typeof created === 'number') {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, created);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== created) {\n onLinkRouteAnchors?.(lastRouteAnchor, created);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else {\n setLastRouteAnchor(created);\n }\n }\n selectAnchors(typeof created === 'number' ? [created] : []);\n };\n\n const removeWayfindingEdge = (edgeId: number) => {\n if (readOnly || !wayfindingOn) return;\n const edge = edges.find((item) => item.id === edgeId);\n onDeleteRouteEdge(edgeId);\n if (edge) {\n const remaining = edges.filter((item) => item.id !== edgeId);\n const orphans = [edge.fromAnchorId, edge.toAnchorId].filter(\n (id) => !anchorHasEdge(id, remaining),\n );\n setLastRouteAnchor((prev) =>\n prev != null && orphans.includes(prev) ? null : prev,\n );\n }\n setRoutePointerSnap(null);\n };\n\n const removeWayfindingAnchor = (anchorId: number) => {\n if (readOnly || !wayfindingOn) return;\n const removed = new Set(anchorsRemovedWithRouteAnchor(anchorId, edges));\n onDeleteRouteAnchor(anchorId);\n setLastRouteAnchor((prev) =>\n prev != null && removed.has(prev) ? null : prev,\n );\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setStoreLinkPreview(null);\n setRouteDraftPoint(null);\n setRubberCursor(null);\n setHoveredAnchorId((id) => (id != null && removed.has(id) ? null : id));\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (spaceHeldRef.current) {\n beginPan(e, false);\n return;\n }\n if (readOnly || tool === 'pan' || e.button === 1) {\n beginPan(e, false);\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n if (routeMode && !isWayfindingEditorTool(tool)) {\n onToolChange?.('select');\n return;\n }\n\n if (isSplitJoinTool(tool)) {\n if (beginSplitJoinVertexDrag(world, e)) return;\n if (handleSplitJoinAt(world)) return;\n beginPan(e, true);\n return;\n }\n\n if (isPolygonDrawTool(tool)) {\n const snapped = snapPolygonPoint(world) ?? polygonSnap;\n const constrained =\n e.shiftKey && !snapped && polygonPoints.length > 0\n ? constrainOrthogonal(polygonPoints[polygonPoints.length - 1], world)\n : null;\n const placed = snapped ?? constrained?.point ?? world;\n setAxisGuide(constrained);\n if (polygonPoints.length >= 3) {\n const first = polygonPoints[0];\n if (Math.hypot(placed.x - first.x, placed.y - first.y) <= worldPx(SNAP_HIT_PX)) {\n closePolygon();\n return;\n }\n }\n setPolygonPoints((prev) => [...prev, placed]);\n setRubberCursor(placed);\n setPolygonSnap(null);\n return;\n }\n\n if (wayfindingOn) {\n if (showsCurveHandles(tool)) {\n const curveSnap = nearestRouteSnap(\n world,\n anchors,\n edges,\n new Set(),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n 'edge',\n );\n const curveEdge =\n curveSnap?.type === 'edge'\n ? edges.find((edge) => edge.id === curveSnap.edgeId)\n : null;\n if (curveEdge && isCurvableRouteEdge(curveEdge)) {\n reportAnchors([]);\n setSelectedRouteEdgeId(curveEdge.id);\n return;\n }\n beginPan(e, true);\n return;\n }\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (storeLinkPreview) {\n if (snap?.type === 'edge' || snap?.type === 'junction') {\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n snap.point,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n }\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (canDeleteWayfindingItem(tool) && e.detail >= 2) return;\n if (snap?.type === 'edge') {\n if (!canPlaceNewRoute(tool)) {\n reportAnchors([]);\n setSelectedRouteEdgeId(snap.edgeId);\n return;\n }\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n return;\n }\n if (snap?.type === 'junction') {\n if (canPlaceNewRoute(tool)) {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, snap.anchorId);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== snap.anchorId) {\n onLinkRouteAnchors?.(lastRouteAnchor, snap.anchorId);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else {\n setLastRouteAnchor(snap.anchorId);\n }\n }\n selectAnchors([snap.anchorId]);\n return;\n }\n if (canPlaceNewRoute(tool)) {\n if (lastRouteAnchor != null) {\n const created = onCreateRoutePoint(world, lastRouteAnchor);\n setLastRouteAnchor(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\n setRubberCursor(world);\n return;\n }\n const next = beginOrContinueRouteDraft(routeDraftPoint, world);\n setRouteDraftPoint(next.nextDraft);\n setRubberCursor(world);\n if (next.start && next.end) {\n const created = onCreateRouteSegment(next.start, next.end);\n setLastRouteAnchor(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\n }\n return;\n }\n beginPan(e, true);\n return;\n }\n if (tool === 'draw-text') {\n const size = defaultLabelSize(viewbox);\n onCreateShape(\n 'label',\n textLabelGeometry(world, DEFAULT_LABEL_TEXT, size),\n { label: defaultTextLabel(DEFAULT_LABEL_TEXT, size, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-entrance') {\n onCreateShape(\n 'entrance',\n entranceIconGeometry(world, DEFAULT_ENTRANCE_SIZE),\n { label: defaultEntranceLabel(DEFAULT_ENTRANCE_SIZE, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-unit' || isEllipseDrawTool(tool)) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setDrawLockCircle(e.shiftKey);\n setDrawing([world, world]);\n return;\n }\n\n if (showsCurveHandles(tool) && selectedShape && displayGeometry) {\n const handleHit = hitTestHandle(displayGeometry, world, worldPx(HANDLE_HIT_PX));\n if (handleHit) {\n if (e.detail >= 2) {\n deleteShapeHandle(handleHit.ringIndex, handleHit.edgeIndex);\n return;\n }\n setSelectedHandle({\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n const midHit = hitTestEdgeMidpoint(\n displayGeometry,\n world,\n worldPx(HANDLE_HIT_PX),\n );\n if (midHit && midHit.kind === 'line') {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setVertexDrag({\n type: 'bend',\n shapeId: selectedShape.id,\n ringIndex: midHit.polygonIndex,\n edgeIndex: midHit.afterVertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (canJoinOpenEnds(tool) && tryJoinOpenEnd(world)) return;\n\n if (showsShapeAnchors(tool) && selectedShape && displayGeometry) {\n const handleTol = worldPx(VERTEX_HIT_PX);\n const hit = hitTestVertex(displayGeometry, world, handleTol);\n if (hit) {\n if (e.detail >= 2) {\n deleteShapeAnchor(hit.polygonIndex, hit.vertexIndex);\n return;\n }\n setSelectedVertex({\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (tool === 'select' && selectedShape && displayGeometry) {\n const edgeHit = hitTestEdge(displayGeometry, world, worldPx(VERTEX_HIT_PX));\n if (edgeHit) {\n beginEdgePress(\n edgeHit.polygonIndex,\n edgeHit.afterVertexIndex,\n edgeHit.point,\n e,\n );\n return;\n }\n }\n\n if (emptyCanvasDragPans(tool)) {\n beginPan(e, tool === 'select');\n }\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (panStart.current) {\n const svg = svgRef.current;\n if (!svg) return;\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const nextPan = {\n x: panStart.current.panX + (user.x - panStart.current.x),\n y: panStart.current.panY + (user.y - panStart.current.y),\n };\n applyView(nextPan, viewRef.current.zoom);\n return;\n }\n if (edgePress && selectedShape) {\n const world = toWorld(e.clientX, e.clientY);\n const screenMove = Math.hypot(\n e.clientX - edgePress.clientX,\n e.clientY - edgePress.clientY,\n );\n if (!edgePress.dragging && screenMove < EDGE_DRAG_PX) return;\n if (!edgePress.dragging) {\n setEdgePress({ ...edgePress, dragging: true });\n setHoveredEdge(null);\n }\n const next = translateEdge(\n edgePress.originGeometry,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n { x: world.x - edgePress.start.x, y: world.y - edgePress.start.y },\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (stubDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setStubDrag({ ...stubDrag, cursor: world });\n return;\n }\n if (dragAnchor != null) {\n setDragAnchorPoint(toWorld(e.clientX, e.clientY));\n return;\n }\n if (routeCurveDrag && onUpdateRouteCurve) {\n const edge = edges.find((item) => item.id === routeCurveDrag.edgeId);\n const from = edge ? displayAnchorById.get(edge.fromAnchorId) : undefined;\n const to = edge ? displayAnchorById.get(edge.toAnchorId) : undefined;\n if (edge && from && to) {\n const world = toWorld(e.clientX, e.clientY);\n const curve =\n routeCurveDrag.type === 'bend'\n ? bendRouteToCubic(from, to, world)\n : moveRouteHandle(\n routeCurveOf(edge) ?? bendRouteToCubic(from, to, world),\n routeCurveDrag.handle,\n world,\n );\n onUpdateRouteCurve(edge.id, curve, { live: true });\n }\n return;\n }\n if (vertexDrag && selectedShape) {\n try {\n svgRef.current?.setPointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be held */\n }\n const world = toWorld(e.clientX, e.clientY);\n const constrained =\n e.shiftKey && vertexDrag.type === 'anchor'\n ? constrainVertexOrthogonal(\n world,\n vertexNeighborPoints(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n ),\n )\n : null;\n const point = constrained?.point ?? world;\n setAxisGuide(vertexDrag.type === 'anchor' ? constrained : null);\n const next =\n vertexDrag.type === 'handle'\n ? moveHandle(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n vertexDrag.handle,\n world,\n )\n : vertexDrag.type === 'bend'\n ? bendEdgeToCubic(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n world,\n )\n : moveVertex(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n point,\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (shapeDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setShapeOffset({\n x: world.x - shapeDrag.start.x,\n y: world.y - shapeDrag.start.y,\n });\n return;\n }\n if (\n (tool === 'draw-unit' || isEllipseDrawTool(tool)) &&\n drawing.length > 0\n ) {\n const world = toWorld(e.clientX, e.clientY);\n if (isEllipseDrawTool(tool)) setDrawLockCircle(e.shiftKey);\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [prev[0], world];\n });\n }\n if (isPolygonDrawTool(tool) && polygonPoints.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n const snap = snapPolygonPoint(world);\n if (snap) {\n setPolygonSnap(snap);\n setRubberCursor(snap);\n setAxisGuide(null);\n } else if (e.shiftKey) {\n const constrained = constrainOrthogonal(\n polygonPoints[polygonPoints.length - 1],\n world,\n );\n setPolygonSnap(null);\n setRubberCursor(constrained.point);\n setAxisGuide(constrained);\n } else {\n setPolygonSnap(null);\n setRubberCursor(world);\n setAxisGuide(null);\n }\n }\n if (\n wayfindingOn &&\n !stubDrag &&\n dragAnchor == null &&\n routeCurveDrag == null\n ) {\n updateRoutePointerSnap(e.clientX, e.clientY);\n }\n if (canJoinOpenEnds(tool) && !readOnly) {\n const world = toWorld(e.clientX, e.clientY);\n const snapTol = worldPx(SNAP_HIT_PX);\n const endHit = hitOpenEnd(\n splitJoinShapes,\n world,\n snapTol,\n splitJoinPending,\n );\n if (endHit && splitJoinPending) {\n setSplitJoinSnapEnd(endHit);\n setRubberCursor(endHit.point);\n setSplitJoinHover(null);\n } else {\n setSplitJoinSnapEnd(null);\n setRubberCursor(splitJoinPending ? world : null);\n setSplitJoinHover(\n isSplitJoinTool(tool) && !nearSplitJoinAnchor(world, snapTol)\n ? hitSplitJoinEdge(splitJoinShapes, world, worldPx(VERTEX_HIT_PX))\n : null,\n );\n }\n }\n };\n\n const finishRect = () => {\n if (drawing.length < 2) {\n setDrawing([]);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n return;\n }\n const poly = rectPolygon(a, b);\n onCreateShape('unit', polygonsToGeometry([poly]));\n setDrawing([]);\n setDrawLockCircle(false);\n };\n\n const finishEllipse = (lockCircle: boolean) => {\n if (drawing.length < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n onCreateShape('unit', ellipseGeometry(a, b, lockCircle));\n setDrawing([]);\n setDrawLockCircle(false);\n };\n\n const onPointerUp = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n const endedPan = panStart.current;\n panStart.current = null;\n setIsPanning(false);\n if (!e.shiftKey) setAxisGuide(null);\n if (endedPan?.fromEmptySelect) {\n const moved = Math.hypot(\n e.clientX - endedPan.clientX,\n e.clientY - endedPan.clientY,\n );\n if (moved < 4) {\n onSelectShape(null);\n selectAnchors([]);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n setRubberCursor(null);\n }\n }\n onHistoryGestureEnd?.();\n if (stubDrag) {\n try {\n svgRef.current?.releasePointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be released */\n }\n const moved = Math.hypot(\n e.clientX - stubDrag.clientX,\n e.clientY - stubDrag.clientY,\n );\n if (moved >= 4) {\n onConnectShapeToRoute(\n stubDrag.shapeId,\n stubDrag.origin,\n stubDrag.cursor,\n worldPx(WAYFINDING_SNAP_PX),\n );\n }\n setStubDrag(null);\n return;\n }\n if (edgePress) {\n if (!edgePress.dragging && selectedShape) {\n insertAnchorOnEdge(\n selectedShape,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n edgePress.insertAt,\n );\n }\n setEdgePress(null);\n return;\n }\n if (vertexDrag) {\n setVertexDrag(null);\n return;\n }\n if (routeCurveDrag) {\n if (onUpdateRouteCurve) {\n const edge = edges.find((item) => item.id === routeCurveDrag.edgeId);\n const curve = edge ? routeCurveOf(edge) : null;\n if (curve) {\n onUpdateRouteCurve(edge!.id, curve);\n }\n }\n setRouteCurveDrag(null);\n return;\n }\n if (shapeDrag && selectedShape) {\n const next = translateGeometry(\n shapeDrag.originGeometry,\n shapeOffset.x,\n shapeOffset.y,\n );\n if (Math.hypot(shapeOffset.x, shapeOffset.y) >= 0.5) {\n onUpdateShapeGeometry(selectedShape.id, next);\n }\n setShapeDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n return;\n }\n if (dragAnchor != null) {\n const moved = anchors.find((a) => a.id === dragAnchor);\n const point = dragAnchorPoint ?? moved;\n if (moved && point) {\n if (\n tool === 'select' &&\n moved.shapeId == null &&\n (routeAnchorDegreeById.get(moved.id) ?? 0) <= 1\n ) {\n const drop = toWorld(e.clientX, e.clientY);\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (snap) {\n onConnectRouteAnchorToRoute(\n moved.id,\n drop,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n selectAnchors([\n snap.type === 'junction' ? snap.anchorId : moved.id,\n ]);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setRoutePointerSnap(null);\n return;\n }\n }\n if (Math.hypot(point.x - moved.x, point.y - moved.y) >= 0.01) {\n onMoveAnchor(moved.id, point.x, point.y);\n onHistoryGestureEnd?.();\n }\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - point.x, a.y - point.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) selectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n setDragAnchorPoint(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (isEllipseDrawTool(tool)) finishEllipse(e.shiftKey);\n };\n\n const pathDFromGeometry = (geometry: CmShape['geometry']): string => {\n const rings = geometryToRings(geometry);\n if (rings.length > 0) {\n return rings.map(ringToPathD).join(' ');\n }\n return (\n geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(geometry.polygons)\n );\n };\n\n const shapePathD = (shape: CmShape): string => {\n if (\n selectedShapeId === shape.id &&\n displayGeometry &&\n shapeDrag?.shapeId === shape.id\n ) {\n return pathDFromGeometry(displayGeometry);\n }\n return pathDFromGeometry(shape.geometry);\n };\n\n const stubExcludeIds = stubDrag\n ? storeLinkOriginIds(anchors, stubDrag)\n : storeLinkPreview\n ? storeLinkOriginIds(anchors, storeLinkPreview)\n : null;\n const stubSnap =\n stubDrag && stubExcludeIds\n ? nearestRouteSnap(\n stubDrag.cursor,\n anchors,\n edges,\n stubExcludeIds,\n worldPx(WAYFINDING_SNAP_PX),\n anchorById,\n )\n : storeLinkPreview && rubberCursor && stubExcludeIds\n ? routePointerSnap\n : null;\n const lastRoutePoint =\n lastRouteAnchor != null ? anchorById.get(lastRouteAnchor) : undefined;\n const routeRubberSnap =\n !stubDrag &&\n !storeLinkPreview &&\n rubberCursor &&\n (routeDraftPoint ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null))\n ? routePointerSnap\n : null;\n const hoveredRouteEdgeId =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.edgeId : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.edgeId : null) ??\n routeHover?.edgeId ??\n null;\n const highlightedRouteEdgeId =\n hoveredRouteEdgeId ??\n ((tool === 'select' || tool === 'curve') ? selectedRouteEdgeId : null);\n const highlightedRouteEdge =\n highlightedRouteEdgeId == null\n ? null\n : edges.find((edge) => edge.id === highlightedRouteEdgeId) ?? null;\n const highlightedRouteFrom = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.fromAnchorId)\n : null;\n const highlightedRouteTo = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.toAnchorId)\n : null;\n const highlightedRoutePath =\n highlightedRouteEdge && highlightedRouteFrom && highlightedRouteTo\n ? routeEdgePathD(\n highlightedRouteFrom,\n highlightedRouteTo,\n displayRouteCurve(highlightedRouteEdge, anchorById, displayAnchorById),\n )\n : null;\n const routePlusAt =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.point : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.point : null) ??\n routeHover?.point ??\n null;\n const rubberFrom =\n stubDrag?.origin ??\n storeLinkPreview?.origin ??\n routeDraftPoint ??\n (canPlaceNewRoute(tool) && lastRoutePoint\n ? { x: lastRoutePoint.x, y: lastRoutePoint.y }\n : null);\n const rubberTo =\n stubDrag != null\n ? stubSnap?.point ?? stubDrag.cursor\n : stubSnap?.point ??\n routeRubberSnap?.point ??\n routeHover?.point ??\n rubberCursor;\n const rubberBand =\n (stubDrag != null ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null && rubberCursor != null))\n ? routeRubberBand(rubberFrom, rubberTo)\n : null;\n const polygonFollow =\n isPolygonDrawTool(tool) && polygonPoints.length > 0\n ? routeRubberBand(polygonPoints[polygonPoints.length - 1], rubberCursor)\n : null;\n const polygonClose =\n isPolygonDrawTool(tool) && polygonPoints.length >= 2\n ? routeRubberBand(rubberCursor, polygonPoints[0])\n : null;\n const hoveredLinkShape =\n hoveredShapeId != null\n ? editableShapes.find((shape) => shape.id === hoveredShapeId)\n : null;\n const wayfindingStoreHover =\n wayfindingOn &&\n !readOnly &&\n canPlaceNewRoute(tool) &&\n hoveredLinkShape != null &&\n isWayfindingShape(hoveredLinkShape.kind) &&\n !isTextLabel(hoveredLinkShape) &&\n !isEntranceIcon(hoveredLinkShape);\n const routeInsertHover =\n canPlaceNewRoute(tool) &&\n routePointerSnap?.type === 'edge' &&\n !stubDrag;\n const routeNetworkHover = routePointerSnap != null && !stubDrag;\n const mapCursor = editorMapCursor({\n tool,\n readOnly,\n spaceHeld,\n panning: isPanning,\n shapeDragging: shapeDrag != null,\n routeEdgeHover: routeHover != null && !stubDrag,\n routeNetworkHover,\n routeInsertHover,\n wayfindingStoreHover,\n anchorHover:\n (tool === 'select' || tool === 'curve') && hoveredAnchorId != null,\n anchorDragging:\n dragAnchor != null || stubDrag != null || routeCurveDrag != null,\n edgeDragging: !!edgePress?.dragging,\n edgeHover: hoveredEdge != null,\n });\n const canvasStyle: React.CSSProperties = {\n ...(editorCanvasStyle(showGrid, gridOpacity) ?? {}),\n ...(mapCursor ? { cursor: mapCursor } : {}),\n };\n\n if (!level) {\n return (\n <div\n className={editorCanvasClass(showGrid)}\n style={canvasStyle}\n >\n <div className=\"eyeon-map-canvas__empty\">{emptyMessage}</div>\n </div>\n );\n }\n\n return (\n <div\n ref={canvasRef}\n className={editorCanvasClass(showGrid)}\n style={canvasStyle}\n onPointerDownCapture={onCanvasPointerDownCapture}\n onPointerMoveCapture={onCanvasPointerMoveCapture}\n onPointerUpCapture={onCanvasPointerUpCapture}\n onPointerCancelCapture={onCanvasPointerUpCapture}\n >\n <svg\n ref={svgRef}\n className={`eyeon-map-canvas__svg${wayfindingOn ? ' is-wayfinding' : ''}`}\n viewBox={`${viewbox.x} ${viewbox.y} ${viewbox.width} ${viewbox.height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onPointerLeave={() => {\n setRoutePointerSnap(null);\n }}\n onMouseDown={(e) => {\n if (tool !== 'draw-text') e.preventDefault();\n }}\n onDoubleClick={(e) => {\n e.preventDefault();\n window.getSelection()?.removeAllRanges();\n if (\n readOnly ||\n !wayfindingOn ||\n !canDeleteWayfindingItem(tool)\n ) {\n return;\n }\n const hoverId =\n routePointerSnap?.type === 'edge'\n ? routePointerSnap.edgeId\n : null;\n if (hoverId == null) return;\n e.stopPropagation();\n removeWayfindingEdge(hoverId);\n }}\n >\n <g\n ref={viewGroupRef}\n className=\"eyeon-map-canvas__view\"\n transform={`translate(${viewRef.current.pan.x}, ${viewRef.current.pan.y}) scale(${viewRef.current.zoom})`}\n >\n <defs>\n <pattern\n id={openingHatchId}\n patternUnits=\"userSpaceOnUse\"\n width={14}\n height={14}\n >\n <rect width=\"14\" height=\"14\" fill=\"#94a3b8\" fillOpacity=\"0.16\" />\n <path d=\"M-2 16 L16 -2\" stroke=\"#64748b\" strokeWidth=\"1.15\" />\n </pattern>\n {openingShapes.length > 0 ? (\n <clipPath id={openingClipId}>\n {openingShapes.map((shape) => (\n <path key={shape.id} d={shapePathD(shape)} />\n ))}\n </clipPath>\n ) : null}\n </defs>\n {svgUnderlayUrl ? (\n <OutdoorSvgUnderlay\n url={svgUnderlayUrl}\n imageProxyUrl={imageProxyUrl}\n suppressIds={svgSuppressIds}\n theme={theme}\n />\n ) : null}\n\n {underlayShapes.filter(isUnderlayDrawnShape).map((shape) => {\n const hintable = !wayfindingOn && isUnderlayHintShape(shape.kind);\n const hovered = hintable && hoveredShapeId === shape.id;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\n return (\n <path\n key={`base-${shape.id}`}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={editorShapeEmphasisColor(publishedFill, hovered)}\n fillOpacity={hovered ? 0.4 : hintable ? 0.22 : 0.32}\n stroke={hovered ? editorShapeEmphasisColor(publishedFill, true) : '#94a3b8'}\n strokeWidth={(hovered ? 2 : 1) / zoom}\n strokeDasharray={hintable ? `${5 / zoom} ${4 / zoom}` : undefined}\n pointerEvents={hintable ? 'auto' : 'none'}\n style={{ cursor: hintable ? 'pointer' : undefined }}\n onPointerEnter={\n hintable\n ? (e) => {\n setHoveredShapeId(shape.id);\n moveUnderlayTip(e, shape.kind);\n }\n : undefined\n }\n onPointerMove={\n hintable ? (e) => moveUnderlayTip(e, shape.kind) : undefined\n }\n onPointerLeave={\n hintable\n ? () => {\n setHoveredShapeId((id) => (id === shape.id ? null : id));\n setUnderlayTip(null);\n }\n : undefined\n }\n onPointerDown={\n hintable\n ? (e) => {\n e.stopPropagation();\n setUnderlayTip(null);\n onSelectShape(shape.id);\n }\n : undefined\n }\n />\n );\n })}\n\n {openingShapes.length > 0 && openingUnderlayShapes.length > 0 ? (\n <g clipPath={`url(#${openingClipId})`} pointerEvents=\"none\">\n {openingUnderlayShapes.filter(isUnderlayDrawnShape).map((shape) => (\n <path\n key={`below-${shape.id}`}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )}\n fillOpacity={0.55}\n stroke=\"#94a3b8\"\n strokeWidth={0.8 / zoom}\n />\n ))}\n </g>\n ) : null}\n\n {editableShapes.map((shape) => {\n const highlightable = isHoverHighlightShape(shape.kind);\n const selected = selectedShapeId === shape.id;\n const hovered = highlightable && hoveredShapeId === shape.id && !selected;\n const dragging = shapeDrag?.shapeId === shape.id;\n const textLabel = isTextLabel(shape);\n const entranceIcon = isEntranceIcon(shape);\n const stamp = textLabel || entranceIcon;\n const cursor = spaceHeld\n ? undefined\n : editorSelectCursor({\n tool,\n selected,\n highlightable,\n dragging,\n wayfinding:\n wayfindingOn &&\n !readOnly &&\n isWayfindingShape(shape.kind) &&\n !stamp,\n textLabel,\n entranceIcon,\n }) ??\n (isStampDrawTool(tool) ||\n (canEditShapeGeometry(tool, routeMode) && !readOnly)\n ? undefined\n : isShapeDrawTool(tool)\n ? 'cell'\n : 'default');\n const beginShapePointerDown = (e: React.PointerEvent) => {\n if (spaceHeldRef.current) {\n e.stopPropagation();\n beginPan(e, false);\n return;\n }\n if (readOnly) return;\n if (storeLinkPreview) return;\n // In Wayfinding, Curve and Select are route-only. Give the route\n // graph priority when a rendered store sits underneath it.\n if (wayfindingOn && (tool === 'select' || tool === 'curve')) {\n const world = toWorld(e.clientX, e.clientY);\n const routeSnap = nearestRouteSnap(\n world,\n anchors,\n edges,\n new Set(),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n tool === 'curve' ? 'edge' : 'junction',\n );\n if (tool === 'curve' || routeSnap != null) return;\n if (\n tool === 'select' &&\n (!isWayfindingShape(shape.kind) || stamp)\n ) {\n return;\n }\n }\n if (\n wayfindingOn &&\n canPlaceNewRoute(tool) &&\n wayfindingLinksShapes(level) &&\n isWayfindingShape(shape.kind) &&\n !stamp\n ) {\n e.stopPropagation();\n const origin = toWorld(e.clientX, e.clientY);\n onEnsureShapeAnchor(shape.id, origin);\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview({ shapeId: shape.id, origin });\n setRubberCursor(origin);\n return;\n }\n if (stamp && isStampDrawTool(tool)) {\n e.stopPropagation();\n onSelectShape(shape.id);\n onToolChange?.('select');\n return;\n }\n if (!canEditShapeGeometry(tool, routeMode)) return;\n e.stopPropagation();\n const worldAt = toWorld(e.clientX, e.clientY);\n if (isSplitJoinTool(tool)) {\n if (beginSplitJoinVertexDrag(worldAt, e)) return;\n if (\n !canSplitJoinKind(shape.kind) ||\n !handleSplitJoinAt(worldAt)\n ) {\n onSelectShape(shape.id);\n }\n return;\n }\n if (tryJoinOpenEnd(worldAt)) return;\n onSelectShape(shape.id);\n if (tool !== 'select') return;\n const canDrag = selected || highlightable;\n if (!canDrag) return;\n const world = toWorld(e.clientX, e.clientY);\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n setShapeDrag({\n shapeId: shape.id,\n start: world,\n originGeometry: geometry,\n });\n setShapeOffset({ x: 0, y: 0 });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n };\n const hoverHandlers = highlightable\n ? {\n onPointerEnter: () => setHoveredShapeId(shape.id),\n onPointerLeave: () =>\n setHoveredShapeId((id) => (id === shape.id ? null : id)),\n }\n : undefined;\n if (entranceIcon) {\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n const box = geometryBBox(geometry);\n const size = shape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const iconUrl = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\n );\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={\n wayfindingOn ? undefined : { cursor: cursor ?? 'pointer' }\n }\n {...hoverHandlers}\n >\n <path\n d={shapePathD({ ...shape, geometry })}\n fill=\"transparent\"\n stroke={\n selected || hovered ? emphasisStroke : 'transparent'\n }\n strokeWidth={selected || hovered ? 1.5 / zoom : 0}\n onPointerDown={beginShapePointerDown}\n />\n {iconUrl ? (\n <image\n href={iconUrl}\n x={box.minX}\n y={box.minY}\n width={box.maxX - box.minX}\n height={box.maxY - box.minY}\n style={{ pointerEvents: 'none' }}\n />\n ) : null}\n </g>\n );\n }\n if (isTextLabel(shape)) {\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n const box = geometryBBox(geometry);\n const size = shape.label.size ?? defaultLabelSize(viewbox);\n const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const align = normalizeLabelAlign(shape.label.align);\n const textX = labelAlignX(box, align);\n const lines = labelTextLines(shape.label.text ?? '');\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\n );\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={\n wayfindingOn ? undefined : { cursor: cursor ?? 'pointer' }\n }\n {...hoverHandlers}\n >\n <path\n d={shapePathD({ ...shape, geometry })}\n fill=\"transparent\"\n stroke={\n selected || hovered ? emphasisStroke : 'transparent'\n }\n strokeWidth={selected || hovered ? 1.5 / zoom : 0}\n onPointerDown={beginShapePointerDown}\n />\n <text\n fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={shape.label.color ?? theme.STORE_TEXT_COLOR}\n textAnchor={labelSvgTextAnchor(align)}\n style={{\n userSelect: 'none',\n ...(wayfindingOn\n ? {}\n : { cursor: cursor ?? 'pointer' }),\n }}\n onPointerDown={beginShapePointerDown}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={textX}\n y={cy - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n </g>\n );\n }\n const baseOpacity = editorShapeFillOpacity(shape.kind);\n const opening = shape.kind === 'void';\n const emphasized = selected || hovered;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\n const emphasisFill = editorShapeEmphasisColor(\n opening ? '#94a3b8' : publishedFill,\n emphasized,\n );\n return (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={\n opening\n ? `url(#${openingHatchId})`\n : editorShapeEmphasisColor(publishedFill, emphasized)\n }\n fillOpacity={\n opening\n ? 1\n : editorHoverFillOpacity(\n shape.kind,\n baseOpacity,\n emphasized,\n )\n }\n stroke={emphasized ? emphasisFill : '#64748b'}\n strokeWidth={\n selected ? 2.5 / zoom : hovered ? 2 / zoom : 1 / zoom\n }\n strokeDasharray={\n opening && !selected && !hovered\n ? `${6 / zoom} ${4 / zoom}`\n : undefined\n }\n onPointerDown={beginShapePointerDown}\n style={wayfindingOn ? undefined : cursor ? { cursor } : undefined}\n {...hoverHandlers}\n />\n );\n })}\n\n {assignedOverlays.map((overlay) => (\n <AssignedShapeOverlay\n key={`assign-overlay-${overlay.shapeId}`}\n overlay={overlay}\n imageProxyUrl={imageProxyUrl}\n />\n ))}\n\n {/* Anchors (Select, Curve, Split / Join) + curve helpers (Curve only) */}\n {canEditShapeGeometry(tool, routeMode) &&\n selectedShape &&\n !isStampShape(selectedShape) &&\n geometryToRings(displayGeometry ?? selectedShape.geometry).map(\n (ring, ri) => {\n const n = edgeCount(ring);\n const items: React.ReactNode[] = [];\n for (let ei = 0; ei < n; ei++) {\n const edge = ring.edges[ei];\n const from = edgeFrom(ring, ei);\n const to = edgeTo(ring, ei);\n const hovered =\n hoveredEdge?.ringIndex === ri && hoveredEdge.edgeIndex === ei;\n const strokeD = edgeToPathD(ring, ei);\n if (tool === 'select') {\n items.push(\n <path\n key={`edge-hit-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={worldPx(VERTEX_HIT_PX * 2)}\n strokeLinecap=\"round\"\n style={{\n cursor: edgePress?.dragging ? 'grabbing' : 'none',\n }}\n onPointerEnter={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerMove={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerLeave={() =>\n setHoveredEdge((prev) =>\n prev?.ringIndex === ri && prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n if (tool !== 'select') return;\n const world = toWorld(e.clientX, e.clientY);\n const clickRing = geometryToRings(\n displayGeometry ?? selectedShape.geometry,\n )[ri];\n beginEdgePress(\n ri,\n ei,\n clickRing\n ? pointOnRingEdge(clickRing, ei, world)\n : world,\n e,\n );\n }}\n />,\n );\n if (hovered && hoveredEdge && !edgePress?.dragging) {\n const preview = hoveredEdge.point;\n const plus = worldPx(5);\n items.push(\n <path\n key={`edge-glow-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(14)}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <path\n key={`edge-hi-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(3.5)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <g\n key={`edge-add-${selectedShape.id}-${ri}-${ei}`}\n className=\"eyeon-map-screen-const\"\n pointerEvents=\"none\"\n >\n <circle\n cx={preview.x}\n cy={preview.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${preview.x} ${preview.y - plus} L ${preview.x} ${preview.y + plus} M ${preview.x - plus} ${preview.y} L ${preview.x + plus} ${preview.y}`}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>,\n );\n }\n }\n if (!showsCurveHandles(tool)) continue;\n if (edge?.kind === 'cubic') {\n const h1 = selectedHandle?.ringIndex === ri &&\n selectedHandle.edgeIndex === ei &&\n selectedHandle.handle === 1;\n const h2 = selectedHandle?.ringIndex === ri &&\n selectedHandle.edgeIndex === ei &&\n selectedHandle.handle === 2;\n items.push(\n <line\n key={`hl1-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={from.x}\n y1={from.y}\n x2={edge.c1.x}\n y2={edge.c1.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl1-${selectedShape.id}-${ri}-${ei}`}\n x1={from.x}\n y1={from.y}\n x2={edge.c1.x}\n y2={edge.c1.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl2-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={to.x}\n y1={to.y}\n x2={edge.c2.x}\n y2={edge.c2.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl2-${selectedShape.id}-${ri}-${ei}`}\n x1={to.x}\n y1={to.y}\n x2={edge.c2.x}\n y2={edge.c2.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <HandleDot\n key={`h1-${selectedShape.id}-${ri}-${ei}`}\n cx={edge.c1.x}\n cy={edge.c1.y}\n r={worldPx(h1 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h1 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsCurveHandles(tool)) return;\n deleteShapeHandle(ri, ei);\n }}\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeHandle(ri, ei);\n return;\n }\n setSelectedHandle({\n ringIndex: ri,\n edgeIndex: ei,\n handle: 1,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n handle: 1,\n });\n }}\n />,\n <HandleDot\n key={`h2-${selectedShape.id}-${ri}-${ei}`}\n cx={edge.c2.x}\n cy={edge.c2.y}\n r={worldPx(h2 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h2 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsCurveHandles(tool)) return;\n deleteShapeHandle(ri, ei);\n }}\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeHandle(ri, ei);\n return;\n }\n setSelectedHandle({\n ringIndex: ri,\n edgeIndex: ei,\n handle: 2,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n handle: 2,\n });\n }}\n />,\n );\n } else {\n const mid = {\n x: (from.x + to.x) / 2,\n y: (from.y + to.y) / 2,\n };\n items.push(\n <HandleDot\n key={`bend-${selectedShape.id}-${ri}-${ei}`}\n cx={mid.x}\n cy={mid.y}\n r={worldPx(BEND_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"grab\"\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setVertexDrag({\n type: 'bend',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n />,\n );\n }\n }\n if (!showsShapeAnchors(tool)) return items;\n ring.anchors.forEach((vertex, vi) => {\n if (\n canJoinOpenEnds(tool) &&\n !ring.closed &&\n (vi === 0 || vi === ring.anchors.length - 1)\n ) {\n return;\n }\n const selected =\n selectedVertex?.polygonIndex === ri &&\n selectedVertex?.vertexIndex === vi;\n items.push(\n <HandleDot\n key={`v-${selectedShape.id}-${ri}-${vi}`}\n cx={vertex.x}\n cy={vertex.y}\n r={worldPx(selected ? VERTEX_R_SELECTED_PX : VERTEX_R_PX)}\n hitR={worldPx(VERTEX_HIT_PX)}\n fill={selected ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsShapeAnchors(tool)) return;\n deleteShapeAnchor(ri, vi);\n }}\n onPointerDown={(e) => {\n if (!showsShapeAnchors(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeAnchor(ri, vi);\n return;\n }\n setSelectedVertex({ polygonIndex: ri, vertexIndex: vi });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: ri,\n vertexIndex: vi,\n });\n }}\n />,\n );\n });\n return items;\n },\n )}\n\n {wayfindingOn && routeEdgePath ? (\n <path\n className=\"eyeon-map-screen-stroke\"\n d={routeEdgePath}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n strokeOpacity={0.95}\n pointerEvents=\"none\"\n />\n ) : null}\n\n {wayfindingOn && highlightedRoutePath ? (\n <g pointerEvents=\"none\">\n <path\n className=\"eyeon-map-screen-stroke\"\n d={highlightedRoutePath}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(12)}\n style={screenStrokeStyle(worldPx(12))}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n />\n <path\n className=\"eyeon-map-screen-stroke\"\n d={highlightedRoutePath}\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n />\n {canPlaceNewRoute(tool) && routePlusAt && !stubDrag ? (\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={routePlusAt.x}\n cy={routePlusAt.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${routePlusAt.x} ${routePlusAt.y - worldPx(5)} L ${routePlusAt.x} ${routePlusAt.y + worldPx(5)} M ${routePlusAt.x - worldPx(5)} ${routePlusAt.y} L ${routePlusAt.x + worldPx(5)} ${routePlusAt.y}`}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>\n ) : null}\n </g>\n ) : null}\n\n {wayfindingOn && rubberBand && (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={rubberBand.from.x}\n y1={rubberBand.from.y}\n x2={rubberBand.to.x}\n y2={rubberBand.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeOpacity={0.85}\n strokeLinecap=\"round\"\n />\n {(stubDrag || storeLinkPreview) && (\n <HandleDot\n cx={rubberBand.to.x}\n cy={rubberBand.to.y}\n r={worldPx(stubSnap ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill={stubSnap ? '#22c55e' : EDITOR_GUIDE_COLOR}\n fillOpacity={0.85}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"grabbing\"\n />\n )}\n </g>\n )}\n\n {wayfindingOn && routeDraftPoint && (\n <HandleDot\n cx={routeDraftPoint.x}\n cy={routeDraftPoint.y}\n r={worldPx(ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill=\"#0f172a\"\n fillOpacity={1}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"default\"\n />\n )}\n\n {wayfindingOn && showsCurveHandles(tool)\n ? edges.filter((edge) => edge.id === selectedRouteEdgeId).map((edge) => {\n if (!isCurvableRouteEdge(edge)) return null;\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n if (!from || !to || from.levelId !== to.levelId) return null;\n const curve = displayRouteCurve(edge, anchorById, displayAnchorById);\n if (curve) {\n const h1 =\n selectedRouteHandle?.edgeId === edge.id &&\n selectedRouteHandle.handle === 1;\n const h2 =\n selectedRouteHandle?.edgeId === edge.id &&\n selectedRouteHandle.handle === 2;\n const beginHandle = (\n handle: 1 | 2,\n event: React.PointerEvent,\n ) => {\n if (readOnly || !onUpdateRouteCurve) return;\n event.stopPropagation();\n if (event.detail >= 2) {\n onUpdateRouteCurve(edge.id, null);\n setSelectedRouteHandle(null);\n setRouteCurveDrag(null);\n return;\n }\n setSelectedRouteHandle({ edgeId: edge.id, handle });\n setRouteCurveDrag({ type: 'handle', edgeId: edge.id, handle });\n svgRef.current?.setPointerCapture?.(event.pointerId);\n };\n return (\n <g key={`route-curve-${edge.id}`}>\n <line\n x1={from.x}\n y1={from.y}\n x2={curve.c1.x}\n y2={curve.c1.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <line\n x1={from.x}\n y1={from.y}\n x2={curve.c1.x}\n y2={curve.c1.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <line\n x1={to.x}\n y1={to.y}\n x2={curve.c2.x}\n y2={curve.c2.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <line\n x1={to.x}\n y1={to.y}\n x2={curve.c2.x}\n y2={curve.c2.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <HandleDot\n cx={curve.c1.x}\n cy={curve.c1.y}\n r={worldPx(h1 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h1 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n if (readOnly || !onUpdateRouteCurve) return;\n onUpdateRouteCurve(edge.id, null);\n setSelectedRouteHandle(null);\n setRouteCurveDrag(null);\n }}\n onPointerDown={(event) => beginHandle(1, event)}\n />\n <HandleDot\n cx={curve.c2.x}\n cy={curve.c2.y}\n r={worldPx(h2 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h2 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n if (readOnly || !onUpdateRouteCurve) return;\n onUpdateRouteCurve(edge.id, null);\n setSelectedRouteHandle(null);\n setRouteCurveDrag(null);\n }}\n onPointerDown={(event) => beginHandle(2, event)}\n />\n </g>\n );\n }\n const mid = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n return (\n <HandleDot\n key={`route-bend-${edge.id}`}\n cx={mid.x}\n cy={mid.y}\n r={worldPx(BEND_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"grab\"\n onPointerDown={(event) => {\n if (readOnly || !onUpdateRouteCurve) return;\n event.stopPropagation();\n setSelectedRouteHandle(null);\n setRouteCurveDrag({ type: 'bend', edgeId: edge.id });\n svgRef.current?.setPointerCapture?.(event.pointerId);\n }}\n />\n );\n })\n : null}\n\n {wayfindingOn &&\n anchors\n .filter((anchor) => wayfindingLinksShapes(level) || anchor.shapeId == null)\n .map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const hovered = hoveredAnchorId === anchor.id;\n const shapeNode = anchor.shapeId != null;\n const connected = connectedAnchorIds.has(anchor.id);\n const displayAnchor = displayAnchorById.get(anchor.id) ?? anchor;\n const dragConnect = dragAnchor === anchor.id && dragRouteSnap != null;\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return (\n other &&\n Math.hypot(\n other.x - displayAnchor.x,\n other.y - displayAnchor.y,\n ) <= 2.5\n );\n });\n const visR = selected || shapeNode ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX;\n return (\n <g key={anchor.id}>\n <HandleDot\n cx={displayAnchor.x}\n cy={displayAnchor.y}\n r={worldPx(visR)}\n hitR={worldPx(WAYFINDING_ANCHOR_HIT_PX)}\n fill={\n dragConnect\n ? '#22c55e'\n : nearWeld\n ? '#22c55e'\n : shapeNode\n ? hovered\n ? '#f97316'\n : SHAPE_ROUTE_ANCHOR_FILL\n : selected\n ? hovered\n ? '#3b82f6'\n : EDITOR_GUIDE_COLOR\n : hovered\n ? '#334155'\n : '#0f172a'\n }\n fillOpacity={1}\n stroke={selected && shapeNode ? EDITOR_GUIDE_COLOR : '#fff'}\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor={\n wayfindingOn\n ? undefined\n : readOnly\n ? 'default'\n : dragAnchor === anchor.id\n ? 'grabbing'\n : 'pointer'\n }\n onPointerEnter={() => {\n if (!readOnly) setHoveredAnchorId(anchor.id);\n }}\n onPointerLeave={() =>\n setHoveredAnchorId((id) => (id === anchor.id ? null : id))\n }\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!canDeleteWayfindingItem(tool)) return;\n removeWayfindingAnchor(anchor.id);\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (readOnly || !wayfindingOn) return;\n if (canDeleteWayfindingItem(tool) && e.detail >= 2) return;\n const world = toWorld(e.clientX, e.clientY);\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (storeLinkPreview) {\n if (\n storeExclude.has(anchor.id) &&\n snap?.type !== 'edge' &&\n snap?.type !== 'junction'\n ) {\n return;\n }\n if (snap?.type === 'edge' || snap?.type === 'junction') {\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n snap.point,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (storeExclude.has(anchor.id)) return;\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n { x: displayAnchor.x, y: displayAnchor.y },\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (snap?.type === 'edge' && canPlaceNewRoute(tool)) {\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n return;\n }\n if (canPlaceNewRoute(tool) && routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, anchor.id);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, anchor.id));\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.y });\n selectAnchors([anchor.id]);\n return;\n }\n if (\n canPlaceNewRoute(tool) &&\n lastRouteAnchor != null &&\n lastRouteAnchor !== anchor.id\n ) {\n onLinkRouteAnchors?.(lastRouteAnchor, anchor.id);\n setLastRouteAnchor(nextRouteChainAnchor(tool, anchor.id));\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.y });\n selectAnchors([anchor.id]);\n return;\n }\n if (canPlaceNewRoute(tool) && shapeNode && !connected) {\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview({\n shapeId: anchor.shapeId!,\n origin: { x: displayAnchor.x, y: displayAnchor.y },\n });\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.y });\n return;\n }\n setLastRouteAnchor(anchor.id);\n selectAnchors(\n e.shiftKey\n ? selectedAnchorIds.includes(anchor.id)\n ? selectedAnchorIds.filter((id) => id !== anchor.id)\n : [...selectedAnchorIds, anchor.id]\n : [anchor.id],\n );\n setDragAnchor(anchor.id);\n setDragAnchorPoint({\n x: displayAnchor.x,\n y: displayAnchor.y,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n />\n </g>\n );\n })}\n\n {canJoinOpenEnds(tool) &&\n !readOnly &&\n splitJoinShapes.flatMap((shape) => {\n const rings = geometryToRings(shape.geometry);\n const items: React.ReactNode[] = [];\n if (isSplitJoinTool(tool)) {\n rings.forEach((ring, ri) => {\n const n = edgeCount(ring);\n for (let ei = 0; ei < n; ei++) {\n const hovered =\n splitJoinHover?.shapeId === shape.id &&\n splitJoinHover.ringIndex === ri &&\n splitJoinHover.edgeIndex === ei;\n items.push(\n <path\n key={`sj-hit-${shape.id}-${ri}-${ei}`}\n d={edgeToPathD(ring, ei)}\n fill=\"none\"\n stroke={hovered ? EDITOR_GUIDE_COLOR : 'transparent'}\n strokeWidth={worldPx(hovered ? 10 : VERTEX_HIT_PX * 2)}\n strokeOpacity={hovered ? 0.28 : 1}\n strokeLinecap=\"round\"\n style={{ cursor: 'cell' }}\n onPointerLeave={() =>\n setSplitJoinHover((prev) =>\n prev?.shapeId === shape.id &&\n prev.ringIndex === ri &&\n prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n e.stopPropagation();\n handleSplitJoinAt(toWorld(e.clientX, e.clientY));\n }}\n />,\n );\n }\n });\n }\n listOpenEnds(shape.geometry).forEach((end) => {\n const id = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n const pending =\n splitJoinPending != null && sameOpenEnd(splitJoinPending, id);\n const snapped =\n splitJoinSnapEnd != null && sameOpenEnd(splitJoinSnapEnd, id);\n items.push(\n <HandleDot\n key={`sj-end-${shape.id}-${end.ringIndex}-${end.end}`}\n cx={end.point.x}\n cy={end.point.y}\n r={worldPx(VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={pending || snapped ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"pointer\"\n onPointerDown={(e) => {\n e.stopPropagation();\n tryJoinOpenEnd(end.point);\n }}\n />,\n );\n });\n return items;\n })}\n\n {isSplitJoinTool(tool) &&\n splitJoinHover &&\n !splitJoinHover.shared &&\n !splitJoinSnapEnd &&\n !nearSplitJoinAnchor(splitJoinHover.point, worldPx(SNAP_HIT_PX)) &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinHover.shapeId,\n );\n if (!shape) return null;\n const preview = previewCutPoints(\n shape.geometry,\n splitJoinHover.ringIndex,\n splitJoinHover.edgeIndex,\n splitJoinHover.point,\n worldPx(SPLIT_JOIN_GAP_PX),\n );\n if (!preview) return null;\n const hideOnAnchor = worldPx(VERTEX_R_PX + 2);\n if (\n nearSplitJoinAnchor(preview.p1, hideOnAnchor) ||\n nearSplitJoinAnchor(preview.p2, hideOnAnchor)\n ) {\n return null;\n }\n return (\n <g pointerEvents=\"none\">\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p1.x}\n cy={preview.p1.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p2.x}\n cy={preview.p2.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n </g>\n );\n })()}\n\n {canJoinOpenEnds(tool) &&\n splitJoinPending &&\n rubberCursor &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinPending.shapeId,\n );\n const from = shape\n ? listOpenEnds(shape.geometry).find(\n (end) =>\n end.ringIndex === splitJoinPending.ringIndex &&\n end.end === splitJoinPending.end,\n )?.point\n : null;\n if (!from) return null;\n const snapped = splitJoinSnapEnd != null;\n return (\n <line\n x1={from.x}\n y1={from.y}\n x2={rubberCursor.x}\n y2={rubberCursor.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={(snapped ? 2.6 : 2) / zoom}\n strokeDasharray={\n snapped ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n );\n })()}\n\n {drawing.length > 1 && isEllipseDrawTool(tool) && (() => {\n const bounds = ellipseBoundsFromDrag(\n drawing[0],\n drawing[drawing.length - 1],\n drawLockCircle,\n );\n return (\n <ellipse\n cx={bounds.cx}\n cy={bounds.cy}\n rx={Math.max(bounds.rx, 0)}\n ry={Math.max(bounds.ry, 0)}\n fill={theme.STORE_DEFAULT_COLOR}\n fillOpacity={0.2}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n pointerEvents=\"none\"\n />\n );\n })()}\n {drawing.length > 1 && tool === 'draw-unit' && (\n <rect\n x={Math.min(drawing[0].x, drawing[1].x)}\n y={Math.min(drawing[0].y, drawing[1].y)}\n width={Math.abs(drawing[1].x - drawing[0].x)}\n height={Math.abs(drawing[1].y - drawing[0].y)}\n fill={theme.STORE_DEFAULT_COLOR}\n fillOpacity={0.2}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n )}\n {axisGuide && (\n <line\n x1={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.x - 100000\n : axisGuide.through.x\n }\n y1={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.y\n : axisGuide.through.y - 100000\n }\n x2={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.x + 100000\n : axisGuide.through.x\n }\n y2={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.y\n : axisGuide.through.y + 100000\n }\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={1.25 / zoom}\n strokeDasharray={`${3 / zoom} ${5 / zoom}`}\n pointerEvents=\"none\"\n />\n )}\n {polygonPoints.length > 0 && isPolygonDrawTool(tool) && (\n <>\n <polyline\n points={polygonPoints.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n {polygonFollow && (\n <line\n x1={polygonFollow.from.x}\n y1={polygonFollow.from.y}\n x2={polygonFollow.to.x}\n y2={polygonFollow.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={(polygonSnap ? 2.6 : 2) / zoom}\n strokeDasharray={\n polygonSnap ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n />\n )}\n {polygonClose && (\n <line\n x1={polygonClose.from.x}\n y1={polygonClose.from.y}\n x2={polygonClose.to.x}\n y2={polygonClose.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeOpacity={polygonSnap ? 0.7 : 0.4}\n strokeDasharray={\n polygonSnap ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n />\n )}\n {polygonPoints.map((p, i) => {\n const snapped = sameSnapPoint(polygonSnap, p);\n return (\n <HandleDot\n key={`pp-${i}`}\n cx={p.x}\n cy={p.y}\n r={worldPx(i === 0 ? VERTEX_R_SELECTED_PX : VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={i === 0 || snapped ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n />\n );\n })}\n {polygonSnap &&\n !polygonPoints.some((p) => sameSnapPoint(polygonSnap, p)) && (\n <HandleDot\n cx={polygonSnap.x}\n cy={polygonSnap.y}\n r={worldPx(VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={EDITOR_GUIDE_COLOR}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n />\n )}\n </>\n )}\n </g>\n </svg>\n {underlayTip ? (\n <div\n className=\"eyeon-map-canvas__underlay-tip\"\n style={{ left: underlayTip.x, top: underlayTip.y }}\n role=\"tooltip\"\n >\n {underlayTip.text}\n </div>\n ) : null}\n </div>\n );\n});\n\nEditorCanvas.displayName = 'EditorCanvas';\n","/** True while leaving the editor would drop work that is not in the saved draft. */\nexport function editorShouldWarnOnLeave(state: {\n pendingEdits: boolean;\n needsPublish: boolean;\n cameraDirty: boolean;\n gesture: boolean;\n saving: boolean;\n}): boolean {\n return (\n state.saving ||\n state.pendingEdits ||\n state.needsPublish ||\n state.cameraDirty ||\n state.gesture\n );\n}\n\n/**\n * Ask the browser to confirm close, reload, or navigation away from this\n * document. Switching to another tab does not unload the page, so browsers\n * do not fire this event for that.\n */\nexport function applyBeforeUnloadWarning(\n event: { preventDefault: () => void; returnValue: string },\n shouldWarn: boolean,\n): void {\n if (!shouldWarn) return;\n event.preventDefault();\n event.returnValue = '';\n}\n\n/**\n * Storybook renders the editor in a preview iframe. Chrome only shows the\n * leave dialog for the top-level document, so the listener has to sit on\n * that window as well as the editor frame.\n */\nexport function beforeUnloadTargets(frame: Window): Window[] {\n const targets: Window[] = [frame];\n try {\n const top = frame.top;\n if (top && top !== frame) targets.push(top);\n } catch {\n // Parent frame is cross-origin; the editor frame is the only hook.\n }\n return targets;\n}\n","import type {\n BatchOp,\n CmAnchor,\n CmConnector,\n CmLevel,\n CmRouteEdge,\n CmShape,\n ConnectorDirection,\n ConnectorKind,\n Vec2,\n} from '../core';\nimport { distance, geometryCentroid } from '../core';\n\nexport type VerticalRailKind = 'escalator' | 'elevator';\n\nexport interface ParsedConnectorSource {\n family: ConnectorKind;\n group: string;\n direction?: 'up' | 'down';\n role?: 'start' | 'end';\n}\n\nconst FAMILY_PREFIXES: Array<{ prefix: string; family: ConnectorKind }> = [\n { prefix: 'escalator', family: 'escalator' },\n { prefix: 'elevator', family: 'elevator' },\n { prefix: 'travelator', family: 'travelator' },\n { prefix: 'stairs', family: 'stairs' },\n { prefix: 'ramp', family: 'ramp' },\n];\n\nfunction normalizeId(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase().replace(/_/g, '-');\n}\n\n/** Parse v1-style ids: `escalator-5-up-start`, `elevator-2`. */\nexport function parseConnectorSourceId(\n value: string | null | undefined,\n): ParsedConnectorSource | null {\n const raw = normalizeId(value);\n if (!raw) return null;\n const family = FAMILY_PREFIXES.find(\n (item) => raw === item.prefix || raw.startsWith(`${item.prefix}-`),\n );\n if (!family) return null;\n const rest = raw.slice(family.prefix.length).replace(/^-+/, '');\n const parts = rest.split('-').filter(Boolean);\n let direction: 'up' | 'down' | undefined;\n let role: 'start' | 'end' | undefined;\n const groupParts: string[] = [];\n for (const part of parts) {\n if (part === 'up' || part === 'down') direction = part;\n else if (part === 'start' || part === 'end') role = part;\n else groupParts.push(part);\n }\n return {\n family: family.family,\n group: groupParts.join('-') || '1',\n direction,\n role,\n };\n}\n\nexport function guessConnectorKind(shape: {\n kind: string;\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorKind | null {\n return (\n parseConnectorSourceId(shape.sourceSvgId)?.family ??\n parseConnectorSourceId(shape.key)?.family ??\n null\n );\n}\n\nexport function connectorIdForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number | null {\n for (const anchor of anchors) {\n if (anchor.shapeId === shapeId && anchor.connectorId != null) {\n return anchor.connectorId;\n }\n }\n return null;\n}\n\nexport function connectorForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): CmConnector | null {\n const id = connectorIdForShape(shapeId, anchors);\n if (id == null) return null;\n return connectors.find((item) => item.id === id) ?? null;\n}\n\nexport function resolvedConnectorKind(\n shape: { id: number; kind: string; key: string; sourceSvgId?: string | null },\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): ConnectorKind | null {\n return connectorForShape(shape.id, anchors, connectors)?.kind ?? guessConnectorKind(shape);\n}\n\nexport function railConnectorShapes<\n T extends { id: number; kind: string; key: string; sourceSvgId?: string | null; orphanedAt?: string | null },\n>(\n shapes: T[],\n kind: VerticalRailKind,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): T[] {\n return shapes.filter((shape) => {\n if (shape.orphanedAt) return false;\n if (shape.kind !== 'connector' && guessConnectorKind(shape) !== kind) return false;\n return resolvedConnectorKind(shape, anchors, connectors) === kind;\n });\n}\n\nexport function landingAnchor(\n shapeId: number,\n anchors: CmAnchor[],\n): CmAnchor | undefined {\n return (\n anchors.find((a) => a.shapeId === shapeId && a.kind === 'connector') ??\n anchors.find((a) => a.shapeId === shapeId && a.connectorId != null) ??\n anchors.find((a) => a.shapeId === shapeId)\n );\n}\n\nexport function shapeLandingPoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const c = geometryCentroid(shape.geometry);\n if (Number.isFinite(c.x) && Number.isFinite(c.y)) return c;\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function inferTravelDirection(\n fromLevelIndex: number,\n toLevelIndex: number,\n hint?: 'up' | 'down',\n): ConnectorDirection {\n if (hint) return hint;\n if (toLevelIndex > fromLevelIndex) return 'up';\n if (toLevelIndex < fromLevelIndex) return 'down';\n return 'both';\n}\n\nexport function defaultConnectorName(\n kind: VerticalRailKind,\n shapes: Array<{ key: string; sourceSvgId?: string | null }>,\n): string {\n for (const shape of shapes) {\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (parsed) {\n const label = kind === 'elevator' ? 'Elevator' : 'Escalator';\n return parsed.group && parsed.group !== '1' ? `${label} ${parsed.group}` : label;\n }\n }\n return kind === 'elevator' ? 'Elevator' : 'Escalator';\n}\n\nexport function nearestWalkAnchor(\n anchors: CmAnchor[],\n levelId: number,\n point: Vec2,\n excludeIds: ReadonlySet<number> = new Set(),\n): CmAnchor | null {\n let best: CmAnchor | null = null;\n let bestDist = Infinity;\n for (const anchor of anchors) {\n if (anchor.levelId !== levelId || excludeIds.has(anchor.id)) continue;\n if (anchor.kind !== 'junction' && anchor.kind !== 'unit') continue;\n const d = distance(anchor, point);\n if (d < bestDist) {\n best = anchor;\n bestDist = d;\n }\n }\n return best;\n}\n\nexport function memberShapeIds(\n connectorId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number[] {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.connectorId === connectorId && anchor.shapeId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return [...ids];\n}\n\nexport type ConnectorEdgeLike = Pick<\n CmRouteEdge,\n 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'\n>;\n\nexport type ConnectorAnchorLike = Pick<CmAnchor, 'id' | 'shapeId' | 'connectorId'>;\n\nexport function partnerShapesForConnector<T extends { id: number }>(\n shapeId: number,\n anchors: ConnectorAnchorLike[],\n connectors: CmConnector[],\n shapes: T[],\n): T[] {\n const connector = connectorForShape(shapeId, anchors, connectors);\n if (!connector) return [];\n const ids = memberShapeIds(connector.id, anchors);\n return shapes.filter((s) => ids.includes(s.id) && s.id !== shapeId);\n}\n\nexport function levelsWithLandings<T extends { levelId: number }>(\n landings: T[],\n levels: CmLevel[],\n): CmLevel[] {\n const ids = new Set(landings.map((item) => item.levelId));\n return levels\n .filter((level) => ids.has(level.id))\n .slice()\n .sort((a, b) => a.ordering - b.ordering || a.levelIndex - b.levelIndex);\n}\n\nexport function escalatorDirectedEnds<T extends { id: number }>(\n connectorId: number,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): { from: T; to: T } | null {\n const memberAnchors = anchors.filter((a) => a.connectorId === connectorId);\n const memberIds = new Set(memberAnchors.map((a) => a.id));\n const ride = edges.find(\n (edge) =>\n edge.kind === 'connector' &&\n edge.directed &&\n memberIds.has(edge.fromAnchorId) &&\n memberIds.has(edge.toAnchorId),\n );\n if (!ride) return null;\n const fromAnchor = anchors.find((a) => a.id === ride.fromAnchorId);\n const toAnchor = anchors.find((a) => a.id === ride.toAnchorId);\n const from = shapes.find((s) => s.id === fromAnchor?.shapeId);\n const to = shapes.find((s) => s.id === toAnchor?.shapeId);\n if (!from || !to) return null;\n return { from, to };\n}\n\nfunction floorName(\n levelId: number,\n levels: Array<{ id: number; name: string }>,\n): string {\n return levels.find((level) => level.id === levelId)?.name ?? 'Floor';\n}\n\nfunction landingRideId(\n shape: { key: string; levelId: number },\n levels: Array<{ id: number; name: string }>,\n): string {\n return `${floorName(shape.levelId, levels)} · ${shape.key}`;\n}\n\nexport type EscalatorRideEnds<T extends { id: number; key: string; levelId: number }> = {\n connectorId: number;\n from: T;\n to: T;\n};\n\nexport type EscalatorRideLandingLine = {\n shapeId: number;\n key: string;\n levelName: string;\n};\n\n/**\n * One sidebar row per linked ride. Boarding is `from`, exit is `to`.\n * Unlinked landings are omitted — they stay in the Unassigned list.\n */\nexport function groupEscalatorRides<T extends { id: number; key: string; levelId: number }>(\n connectors: Array<Pick<CmConnector, 'id' | 'kind'>>,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): EscalatorRideEnds<T>[] {\n const rides: EscalatorRideEnds<T>[] = [];\n for (const connector of connectors) {\n if (connector.kind !== 'escalator') continue;\n const directed = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (directed) {\n rides.push({ connectorId: connector.id, from: directed.from, to: directed.to });\n continue;\n }\n const ids = new Set(memberShapeIds(connector.id, anchors));\n const members = shapes.filter((shape) => ids.has(shape.id));\n if (members.length < 2) continue;\n rides.push({ connectorId: connector.id, from: members[0], to: members[1] });\n }\n return rides;\n}\n\n/** Boarding on top, exit below — each with its floor name. */\nexport function escalatorRideLandingLines<\n T extends { id: number; key: string; levelId: number },\n>(\n ride: EscalatorRideEnds<T>,\n levels: Array<{ id: number; name: string }>,\n): [EscalatorRideLandingLine, EscalatorRideLandingLine] {\n return [\n {\n shapeId: ride.from.id,\n key: ride.from.key,\n levelName: floorName(ride.from.levelId, levels),\n },\n {\n shapeId: ride.to.id,\n key: ride.to.key,\n levelName: floorName(ride.to.levelId, levels),\n },\n ];\n}\n\n/** Assigned-list title: boarding → exit (escalator) or floor landings ↔ (elevator). */\nexport function connectorRideLabel(\n shape: { id: number; key: string; levelId: number },\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n connectors: CmConnector[],\n shapes: Array<{ id: number; key: string; levelId: number }>,\n levels: Array<{ id: number; name: string; ordering?: number; levelIndex?: number }> = [],\n): string | null {\n const connector = connectorForShape(shape.id, anchors, connectors);\n if (!connector) return null;\n\n if (connector.kind === 'escalator') {\n const ride = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (ride) {\n return `${ride.from.key} → ${ride.to.key}`;\n }\n const partners = partnerShapesForConnector(shape.id, anchors, connectors, shapes);\n if (partners.length === 1) {\n return `${shape.key} → ${partners[0].key}`;\n }\n return null;\n }\n\n const members = [shape, ...partnerShapesForConnector(shape.id, anchors, connectors, shapes)];\n if (members.length < 2) return null;\n const order = new Map(\n levels.map((level, index) => [\n level.id,\n (level.ordering ?? level.levelIndex ?? index) * 1000 + (level.levelIndex ?? index),\n ]),\n );\n const sorted = members.slice().sort((a, b) => {\n const ai = order.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = order.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n return sorted.map((item) => landingRideId(item, levels)).join(' ↔ ');\n}\n\nfunction connectorEdgesBetween(\n edges: CmRouteEdge[],\n anchorIds: ReadonlySet<number>,\n): CmRouteEdge[] {\n return edges.filter(\n (edge) =>\n edge.kind === 'connector' &&\n anchorIds.has(edge.fromAnchorId) &&\n anchorIds.has(edge.toAnchorId),\n );\n}\n\nexport interface ConnectorPlanContext {\n mapId: number;\n levels: CmLevel[];\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n allocId: () => number;\n}\n\nfunction ensureLanding(\n ctx: ConnectorPlanContext,\n shape: CmShape,\n connectorId: number,\n ops: BatchOp[],\n): CmAnchor {\n const existing = landingAnchor(shape.id, ctx.anchors);\n const point = existing\n ? { x: existing.x, y: existing.y }\n : shapeLandingPoint(shape);\n if (existing) {\n if (existing.connectorId !== connectorId || existing.kind !== 'connector') {\n const next: CmAnchor = {\n ...existing,\n kind: 'connector',\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: next });\n ctx.anchors = ctx.anchors.map((a) => (a.id === next.id ? next : a));\n return next;\n }\n return existing;\n }\n const created: CmAnchor = {\n id: ctx.allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: 'connector',\n x: point.x,\n y: point.y,\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: created });\n ctx.anchors = [...ctx.anchors, created];\n return created;\n}\n\nfunction linkLandingToWalk(\n ctx: ConnectorPlanContext,\n landing: CmAnchor,\n ops: BatchOp[],\n) {\n const near = nearestWalkAnchor(ctx.anchors, landing.levelId, landing, new Set([landing.id]));\n if (!near) return;\n const exists = ctx.edges.some(\n (e) =>\n (e.fromAnchorId === landing.id && e.toAnchorId === near.id) ||\n (e.fromAnchorId === near.id && e.toAnchorId === landing.id),\n );\n if (exists) return;\n const edge: CmRouteEdge = {\n id: ctx.allocId(),\n mapId: ctx.mapId,\n fromAnchorId: landing.id,\n toAnchorId: near.id,\n weight: null,\n directed: false,\n accessible: true,\n kind: 'walk',\n };\n ops.push({ op: 'upsert_edge', edge });\n ctx.edges = [...ctx.edges, edge];\n}\n\nfunction applyUnlinkLocal(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n const memberAnchors = ctx.anchors.filter((a) => a.connectorId === connectorId);\n const ids = new Set(memberAnchors.map((a) => a.id));\n const ops: BatchOp[] = [];\n for (const edge of connectorEdgesBetween(ctx.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n }\n ctx.edges = ctx.edges.filter(\n (e) =>\n !(e.kind === 'connector' && ids.has(e.fromAnchorId) && ids.has(e.toAnchorId)),\n );\n for (const anchor of memberAnchors) {\n ops.push({\n op: 'upsert_anchor',\n anchor: { ...anchor, connectorId: null },\n });\n }\n ctx.anchors = ctx.anchors.map((a) =>\n a.connectorId === connectorId ? { ...a, connectorId: null } : a,\n );\n ctx.connectors = ctx.connectors.filter((c) => c.id !== connectorId);\n ops.push({ op: 'delete_connector', connectorId });\n return ops;\n}\n\nfunction unlinkConnectorOps(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n return applyUnlinkLocal(ctx, connectorId);\n}\n\nexport function buildUnlinkConnectorOps(\n ctx: ConnectorPlanContext,\n connectorId: number,\n): BatchOp[] {\n return unlinkConnectorOps(ctx, connectorId);\n}\n\nexport function buildEscalatorLinkOps(\n ctx: ConnectorPlanContext,\n fromShape: CmShape,\n toShape: CmShape,\n options?: { name?: string; direction?: 'up' | 'down' },\n): BatchOp[] {\n const fromLevel = ctx.levels.find((l) => l.id === fromShape.levelId);\n const toLevel = ctx.levels.find((l) => l.id === toShape.levelId);\n const direction = inferTravelDirection(\n fromLevel?.levelIndex ?? 0,\n toLevel?.levelIndex ?? 0,\n options?.direction ??\n parseConnectorSourceId(fromShape.sourceSvgId)?.direction ??\n parseConnectorSourceId(toShape.sourceSvgId)?.direction,\n );\n const name =\n options?.name ?? defaultConnectorName('escalator', [fromShape, toShape]);\n\n const existingFrom = connectorIdForShape(fromShape.id, ctx.anchors);\n const existingTo = connectorIdForShape(toShape.id, ctx.anchors);\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n\n for (const id of new Set([existingFrom, existingTo].filter((v): v is number => v != null))) {\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'escalator',\n name,\n direction,\n accessible: false,\n };\n ops.push({ op: 'upsert_connector', connector });\n working.connectors = [...working.connectors, connector];\n\n const fromAnchor = ensureLanding(working, fromShape, connectorId, ops);\n const toAnchor = ensureLanding(working, toShape, connectorId, ops);\n linkLandingToWalk(working, fromAnchor, ops);\n linkLandingToWalk(working, toAnchor, ops);\n\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: fromAnchor.id,\n toAnchorId: toAnchor.id,\n weight: null,\n directed: true,\n accessible: false,\n kind: 'connector',\n },\n });\n return ops;\n}\n\nexport function buildElevatorShaftOps(\n ctx: ConnectorPlanContext,\n memberShapes: CmShape[],\n options?: { name?: string; accessible?: boolean; connectorId?: number },\n): BatchOp[] {\n const unique = new Map(memberShapes.map((s) => [s.id, s]));\n const members = [...unique.values()];\n if (members.length < 2) return [];\n\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n const existingIds = new Set(\n members\n .map((s) => connectorIdForShape(s.id, working.anchors))\n .filter((id): id is number => id != null),\n );\n const keepId =\n options?.connectorId ??\n (existingIds.size === 1 ? [...existingIds][0] : undefined);\n\n for (const id of existingIds) {\n if (id === keepId) {\n const memberAnchors = working.anchors.filter((a) => a.connectorId === id);\n const ids = new Set(memberAnchors.map((a) => a.id));\n for (const edge of connectorEdgesBetween(working.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n working.edges = working.edges.filter((e) => e.id !== edge.id);\n }\n continue;\n }\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = keepId ?? working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'elevator',\n name: options?.name ?? defaultConnectorName('elevator', members),\n direction: 'both',\n accessible: options?.accessible ?? true,\n };\n ops.push({ op: 'upsert_connector', connector });\n\n const landings = members.map((shape) => ensureLanding(working, shape, connectorId, ops));\n for (const landing of landings) linkLandingToWalk(working, landing, ops);\n\n for (let i = 0; i < landings.length; i++) {\n for (let j = i + 1; j < landings.length; j++) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: landings[i].id,\n toAnchorId: landings[j].id,\n weight: null,\n directed: false,\n accessible: connector.accessible,\n kind: 'connector',\n },\n });\n }\n }\n return ops;\n}\n\nexport function suggestEscalatorPairs(\n shapes: CmShape[],\n levels: CmLevel[],\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): Array<{ fromShapeId: number; toShapeId: number; label: string }> {\n const groups = new Map<string, CmShape[]>();\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n if (guessConnectorKind(shape) !== 'escalator') continue;\n if (connectorIdForShape(shape.id, anchors) != null) continue;\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (!parsed) continue;\n const key = `${parsed.group}:${parsed.direction ?? ''}`;\n const list = groups.get(key) ?? [];\n list.push(shape);\n groups.set(key, list);\n }\n const suggestions: Array<{ fromShapeId: number; toShapeId: number; label: string }> = [];\n for (const [key, group] of groups) {\n if (group.length !== 2) continue;\n if (group[0].levelId === group[1].levelId) continue;\n const parsed =\n parseConnectorSourceId(group[0].sourceSvgId) ?? parseConnectorSourceId(group[0].key);\n const start =\n group.find((s) => parseConnectorSourceId(s.sourceSvgId)?.role === 'start') ??\n group[0];\n const end = group.find((s) => s.id !== start.id)!;\n const fromName = levels.find((l) => l.id === start.levelId)?.name ?? 'Floor';\n const toName = levels.find((l) => l.id === end.levelId)?.name ?? 'Floor';\n const dir = parsed?.direction ? ` ${parsed.direction}` : '';\n suggestions.push({\n fromShapeId: start.id,\n toShapeId: end.id,\n label: `Escalator ${key.split(':')[0]}${dir}: ${fromName} → ${toName}`,\n });\n }\n return suggestions;\n}\n","import type {\n BatchOp,\n BBox,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmConnector,\n CmLevel,\n CmResponsiveOverride,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ThemeDefaults,\n} from '../core';\nimport {\n bboxOf,\n canonicalizeEntranceLabel,\n geometryBBox,\n mergeEntranceAwareLabel,\n normalizeGeometrySpace,\n parseShapeAssignment,\n routeCurveOf,\n} from '../core';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n responsiveOverrides?: CmResponsiveOverride[];\n}\n\nfunction geometryBbox(geometry?: ShapeGeometry | null): BBox {\n const points = (geometry?.polygons ?? []).flat();\n return bboxOf(points);\n}\n\n/** True when another live shape already uses this ID on the floor. */\nexport function shapeKeyTakenOnLevel(\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n shapeId: number,\n levelId: number,\n key: string,\n): boolean {\n return shapes.some(\n (shape) =>\n shape.id !== shapeId &&\n shape.levelId === levelId &&\n shape.key === key &&\n !shape.orphanedAt,\n );\n}\n\nfunction upsertById<T extends { id: number }>(\n rows: T[],\n next: T,\n): T[] {\n const idx = rows.findIndex((row) => row.id === next.id);\n if (idx < 0) return [...rows, next];\n const copy = rows.slice();\n copy[idx] = next;\n return copy;\n}\n\nexport function applyDraftOp(\n draft: EditorDraftState,\n op: BatchOp,\n): EditorDraftState {\n switch (op.op) {\n case 'upsert_shape': {\n const incoming = op.shape;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.shapes.find((s) => s.id === id);\n const geometry = incoming.geometry ?? existing?.geometry ?? {\n paths: [],\n polygons: [],\n };\n const shape: CmShape = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n key: incoming.key ?? existing?.key ?? `shape-${id}`,\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n geometry,\n bbox:\n incoming.bbox ??\n (incoming.geometry != null\n ? geometryBbox(geometry)\n : existing?.bbox) ??\n geometryBbox(geometry),\n zIndex: incoming.zIndex ?? existing?.zIndex ?? 0,\n style: incoming.style ?? existing?.style ?? {},\n sourceSvgId: incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n label: mergeEntranceAwareLabel(existing?.label, incoming.label, {\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n sourceSvgId:\n incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n }),\n geometryLocked:\n incoming.geometryLocked ??\n (incoming.geometry != null ? true : existing?.geometryLocked) ??\n false,\n orphanedAt: incoming.orphanedAt ?? existing?.orphanedAt ?? null,\n };\n return { ...draft, shapes: upsertById(draft.shapes, shape) };\n }\n case 'delete_shape':\n return {\n ...draft,\n shapes: draft.shapes.filter((s) => s.id !== op.shapeId),\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_assignment': {\n const kind =\n draft.shapes.find((s) => s.id === op.assignment.shapeId)?.kind ?? 'unit';\n const assignment = parseShapeAssignment(op.assignment, kind);\n const rest = draft.assignments.filter((a) => a.shapeId !== assignment.shapeId);\n return { ...draft, assignments: [...rest, assignment] };\n }\n case 'delete_assignment':\n return {\n ...draft,\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_anchor': {\n const incoming = op.anchor;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.anchors.find((a) => a.id === id);\n const anchor: CmAnchor = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n shapeId: incoming.shapeId ?? existing?.shapeId ?? null,\n kind: incoming.kind ?? existing?.kind ?? 'junction',\n x: incoming.x ?? existing?.x ?? 0,\n y: incoming.y ?? existing?.y ?? 0,\n connectorId:\n incoming.connectorId !== undefined\n ? incoming.connectorId\n : existing?.connectorId ?? null,\n };\n return { ...draft, anchors: upsertById(draft.anchors, anchor) };\n }\n case 'delete_anchor':\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => a.id !== op.anchorId),\n edges: draft.edges.filter(\n (e) => e.fromAnchorId !== op.anchorId && e.toAnchorId !== op.anchorId,\n ),\n };\n case 'upsert_edge': {\n const incoming = op.edge;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.edges.find((e) => e.id === id);\n const curve =\n incoming.curve !== undefined\n ? routeCurveOf({ curve: incoming.curve })\n : routeCurveOf(existing);\n const edge: CmRouteEdge = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n fromAnchorId: incoming.fromAnchorId ?? existing?.fromAnchorId ?? 0,\n toAnchorId: incoming.toAnchorId ?? existing?.toAnchorId ?? 0,\n weight: incoming.weight ?? existing?.weight ?? null,\n directed: incoming.directed ?? existing?.directed ?? false,\n accessible: incoming.accessible ?? existing?.accessible ?? true,\n kind: incoming.kind ?? existing?.kind ?? 'walk',\n ...(curve ? { curve } : {}),\n };\n return { ...draft, edges: upsertById(draft.edges, edge) };\n }\n case 'delete_edge':\n return { ...draft, edges: draft.edges.filter((e) => e.id !== op.edgeId) };\n case 'weld_anchors': {\n const ids = (op.anchorIds ?? []).filter((id) => Number.isFinite(id));\n if (ids.length < 2) return draft;\n const keep = ids[0];\n const removed = new Set(ids.slice(1));\n const edges = draft.edges\n .map((e) => ({\n ...e,\n fromAnchorId: removed.has(e.fromAnchorId) ? keep : e.fromAnchorId,\n toAnchorId: removed.has(e.toAnchorId) ? keep : e.toAnchorId,\n }))\n .filter((e) => e.fromAnchorId !== e.toAnchorId);\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => !removed.has(a.id)),\n edges,\n };\n }\n case 'update_theme':\n return { ...draft, theme: { ...draft.theme, ...op.theme } };\n case 'upsert_connector': {\n const incoming = op.connector;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.connectors.find((c) => c.id === id);\n const connector: CmConnector = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n kind: incoming.kind ?? existing?.kind ?? 'escalator',\n name: incoming.name ?? existing?.name ?? 'Connector',\n direction: incoming.direction ?? existing?.direction ?? 'both',\n accessible: incoming.accessible ?? existing?.accessible ?? false,\n };\n return { ...draft, connectors: upsertById(draft.connectors, connector) };\n }\n case 'delete_connector':\n return {\n ...draft,\n connectors: draft.connectors.filter((c) => c.id !== op.connectorId),\n anchors: draft.anchors.map((a) =>\n a.connectorId === op.connectorId ? { ...a, connectorId: null } : a,\n ),\n };\n case 'delete_level':\n return omitLevelFromDraft(draft, op.levelId);\n default:\n return draft;\n }\n}\n\n/** Drop a floor/outdoor level and every draft row that lived on it. */\nexport function omitLevelFromDraft(\n draft: EditorDraftState,\n levelId: number,\n): EditorDraftState {\n const removedShapeIds = new Set(\n draft.shapes.filter((shape) => shape.levelId === levelId).map((shape) => shape.id),\n );\n const removedAnchorIds = new Set(\n draft.anchors.filter((anchor) => anchor.levelId === levelId).map((anchor) => anchor.id),\n );\n const anchors = draft.anchors.filter((anchor) => anchor.levelId !== levelId);\n const liveConnectorIds = new Set(\n anchors\n .map((anchor) => anchor.connectorId)\n .filter((id): id is number => id != null),\n );\n return {\n ...draft,\n levels: draft.levels.filter((level) => level.id !== levelId),\n shapes: draft.shapes.filter((shape) => shape.levelId !== levelId),\n assignments: draft.assignments.filter((row) => !removedShapeIds.has(row.shapeId)),\n anchors,\n edges: draft.edges.filter(\n (edge) =>\n !removedAnchorIds.has(edge.fromAnchorId) &&\n !removedAnchorIds.has(edge.toAnchorId),\n ),\n connectors: draft.connectors.filter((connector) => liveConnectorIds.has(connector.id)),\n responsiveOverrides: (draft.responsiveOverrides ?? []).filter(\n (row) => row.levelId !== levelId,\n ),\n };\n}\n\nexport function applyDraftOps(\n draft: EditorDraftState,\n ops: BatchOp[],\n): EditorDraftState {\n const seeded = {\n ...healDraftGeometry(draft),\n connectors: draft.connectors ?? [],\n responsiveOverrides: draft.responsiveOverrides ?? [],\n };\n return ops.reduce(applyDraftOp, seeded);\n}\n\n/**\n * Rebuild `polygons` from `paths` on rows written before the Y-flip removal,\n * so the canvas outline and its vertex handles agree without a re-import.\n */\nfunction healDraftGeometry(draft: EditorDraftState): EditorDraftState {\n let changed = false;\n const shapes = draft.shapes.map((shape) => {\n const geometry = normalizeGeometrySpace(shape.geometry);\n const label = canonicalizeEntranceLabel(shape) ?? shape.label;\n const geometryChanged = geometry !== shape.geometry;\n const labelChanged = label !== shape.label;\n if (!geometryChanged && !labelChanged) return shape;\n changed = true;\n return {\n ...shape,\n geometry,\n bbox: geometryChanged ? geometryBBox(geometry) : shape.bbox,\n label,\n };\n });\n return changed ? { ...draft, shapes } : draft;\n}\n\n/** Collapse repeated updates to the same entity so Save Changes sends one op each. */\nexport function coalesceDraftOp(ops: BatchOp[], op: BatchOp): BatchOp[] {\n if (op.op === 'update_theme') {\n const prev = ops.filter((item) => item.op === 'update_theme');\n const rest = ops.filter((item) => item.op !== 'update_theme');\n const theme = prev.reduce(\n (acc, item) => (item.op === 'update_theme' ? { ...acc, ...item.theme } : acc),\n {} as Record<string, unknown>,\n );\n return [...rest, { op: 'update_theme', theme: { ...theme, ...op.theme } }];\n }\n\n if (op.op === 'upsert_shape' && op.shape.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_shape' && item.shape.id === op.shape.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_shape') {\n const next = ops.slice();\n const merged = { ...ops[idx].shape, ...op.shape };\n next[idx] = {\n op: 'upsert_shape',\n shape: {\n ...merged,\n label: mergeEntranceAwareLabel(\n ops[idx].shape.label,\n op.shape.label,\n {\n kind: merged.kind ?? 'unit',\n origin: merged.origin,\n sourceSvgId: merged.sourceSvgId,\n },\n ),\n },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_anchor' && item.anchor.id === op.anchor.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_anchor') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_anchor',\n anchor: { ...ops[idx].anchor, ...op.anchor },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_connector' && op.connector.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_connector' && item.connector.id === op.connector.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_connector') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_connector',\n connector: { ...ops[idx].connector, ...op.connector },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_edge' && op.edge.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_edge' && item.edge.id === op.edge.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_edge') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_edge',\n edge: { ...ops[idx].edge, ...op.edge },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_assignment') {\n const idx = ops.findIndex(\n (item) =>\n item.op === 'upsert_assignment' &&\n item.assignment.shapeId === op.assignment.shapeId,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_assignment') {\n const next = ops.slice();\n next[idx] = { op: 'upsert_assignment', assignment: op.assignment };\n return next;\n }\n }\n\n return [...ops, op];\n}\n\n/**\n * Persist order for POST /v1/map/batch.\n * Relinking an escalator coalesces landing upserts into the earlier unlink slot,\n * which would otherwise write `connector_id` before the new connector exists.\n *\n * `delete_edge` runs before `upsert_edge`. Splitting a corridor deletes the\n * old edge and inserts a replacement with the same endpoints; inserting first\n * violates `cm_route_edges (from_anchor_id, to_anchor_id)`.\n * Keep in sync with `admin-portal-backend` `orderBatchOpsForPersist`.\n */\nconst BATCH_PERSIST_RANK: Record<BatchOp['op'], number> = {\n upsert_building: 10,\n upsert_level: 20,\n upsert_shape: 30,\n upsert_assignment: 40,\n upsert_connector: 50,\n upsert_anchor: 60,\n delete_edge: 65,\n upsert_edge: 70,\n update_theme: 80,\n weld_anchors: 90,\n delete_anchor: 110,\n delete_assignment: 120,\n delete_shape: 130,\n delete_connector: 140,\n delete_building: 150,\n delete_level: 160,\n};\n\nfunction edgePairKey(\n edge: Partial<CmRouteEdge> & { fromAnchorId: number; toAnchorId: number },\n): string {\n return `${edge.fromAnchorId}:${edge.toAnchorId}`;\n}\n\n/**\n * The editor log keeps every split and heal. Persist used to insert all of\n * those edges before deleting any, so two copies of the same anchor pair\n * landed in one transaction. Drop rows that this batch both creates and\n * removes, and keep only the last edge for each endpoint pair.\n */\nfunction compactRouteOpsForPersist(ops: BatchOp[]): BatchOp[] {\n const deletedEdgeIds = new Set<number>();\n const deletedAnchorIds = new Set<number>();\n const upsertedEdgeIds = new Set<number>();\n const upsertedAnchorIds = new Set<number>();\n\n for (const op of ops) {\n if (op.op === 'delete_edge') deletedEdgeIds.add(op.edgeId);\n if (op.op === 'delete_anchor') deletedAnchorIds.add(op.anchorId);\n if (op.op === 'upsert_edge' && op.edge.id != null) upsertedEdgeIds.add(op.edge.id);\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n upsertedAnchorIds.add(op.anchor.id);\n }\n }\n\n const ephemeralAnchorIds = new Set(\n [...upsertedAnchorIds].filter((id) => id < 0 && deletedAnchorIds.has(id)),\n );\n\n const kept: BatchOp[] = [];\n for (const op of ops) {\n if (\n op.op === 'upsert_anchor' &&\n op.anchor.id != null &&\n deletedAnchorIds.has(op.anchor.id)\n ) {\n continue;\n }\n if (\n op.op === 'delete_anchor' &&\n op.anchorId < 0 &&\n upsertedAnchorIds.has(op.anchorId)\n ) {\n continue;\n }\n if (op.op === 'upsert_edge' && op.edge.id != null && deletedEdgeIds.has(op.edge.id)) {\n continue;\n }\n if (op.op === 'delete_edge' && op.edgeId < 0 && upsertedEdgeIds.has(op.edgeId)) {\n continue;\n }\n if (\n op.op === 'upsert_edge' &&\n (ephemeralAnchorIds.has(op.edge.fromAnchorId) ||\n ephemeralAnchorIds.has(op.edge.toAnchorId))\n ) {\n continue;\n }\n kept.push(op);\n }\n\n const lastIndexByPair = new Map<string, number>();\n kept.forEach((op, index) => {\n if (op.op !== 'upsert_edge') return;\n lastIndexByPair.set(edgePairKey(op.edge), index);\n });\n\n const curveByPair = new Map<string, CmRouteEdge['curve']>();\n kept.forEach((op) => {\n if (op.op !== 'upsert_edge') return;\n if (!Object.prototype.hasOwnProperty.call(op.edge, 'curve')) return;\n curveByPair.set(edgePairKey(op.edge), op.edge.curve ?? null);\n });\n\n const drop = new Set<number>();\n const extraDeletes: BatchOp[] = [];\n kept.forEach((op, index) => {\n if (op.op !== 'upsert_edge') return;\n const winner = lastIndexByPair.get(edgePairKey(op.edge));\n if (winner == null || winner === index) return;\n drop.add(index);\n const winnerOp = kept[winner];\n if (\n op.edge.id != null &&\n op.edge.id > 0 &&\n winnerOp.op === 'upsert_edge' &&\n winnerOp.edge.id !== op.edge.id &&\n !deletedEdgeIds.has(op.edge.id)\n ) {\n extraDeletes.push({ op: 'delete_edge', edgeId: op.edge.id });\n }\n });\n\n const merged = kept\n .filter((_, index) => !drop.has(index))\n .map((op) => {\n if (op.op !== 'upsert_edge') return op;\n if (!curveByPair.has(edgePairKey(op.edge))) return op;\n const curve = curveByPair.get(edgePairKey(op.edge));\n return {\n op: 'upsert_edge' as const,\n edge: curve ? { ...op.edge, curve } : { ...op.edge, curve: null },\n };\n });\n\n return [...merged, ...extraDeletes] as BatchOp[];\n}\n\nfunction sortBatchOps(ops: BatchOp[]): BatchOp[] {\n return ops\n .map((op, index) => ({ op, index }))\n .sort((a, b) => {\n const rank = BATCH_PERSIST_RANK[a.op.op] - BATCH_PERSIST_RANK[b.op.op];\n return rank !== 0 ? rank : a.index - b.index;\n })\n .map(({ op }) => op);\n}\n\nexport function orderBatchOpsForPersist(ops: BatchOp[]): BatchOp[] {\n return sortBatchOps(compactRouteOpsForPersist(ops));\n}\n","import React from 'react';\n\nfunction FieldResetIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.3 8a4.7 4.7 0 1 0 1.15-3.15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M3.1 2.6v3.3h3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function FieldResetButton({\n label,\n onClick,\n disabled,\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__field-reset\"\n aria-label={`Reset ${label}`}\n title=\"Reset\"\n disabled={disabled}\n onClick={onClick}\n >\n <FieldResetIcon />\n </button>\n );\n}\n","import { isTransparentColor } from '../core/color';\n\nexport { isTransparentColor, TRANSPARENT_COLOR } from '../core/color';\n\n/** Normalize `#rgb` / `#rrggbb` (with or without `#`) for `<input type=\"color\">`. */\nexport function normalizeHexColor(value: string): string | null {\n const match = value.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('');\n }\n return `#${hex}`;\n}\n\nexport function hexColorInputValue(value: string): string {\n return normalizeHexColor(value) ?? '#000000';\n}\n\nexport function sameHexColor(a: string, b: string): boolean {\n if (isTransparentColor(a) || isTransparentColor(b)) {\n return isTransparentColor(a) && isTransparentColor(b);\n }\n const left = normalizeHexColor(a);\n const right = normalizeHexColor(b);\n return left != null && left === right;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n assignNumberFromDraft,\n commitAssignNumberDraft,\n LABEL_ALIGNS,\n normalizeLabelAlign,\n type LabelAlign,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n hexColorInputValue,\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\n\nexport function StepperRow({\n label,\n value,\n disabled,\n extra,\n onChange,\n onStep,\n onHoldStart,\n onHoldEnd,\n}: {\n label: string;\n value: number;\n disabled: boolean;\n extra?: React.ReactNode;\n onChange: (value: number) => void;\n onStep: (delta: number) => void;\n onHoldStart: (delta: number) => void;\n onHoldEnd: () => void;\n}) {\n const [draft, setDraft] = useState(() => String(value));\n const focused = useRef(false);\n const syncDraft = useRef(false);\n\n useEffect(() => {\n if (!focused.current || syncDraft.current) {\n setDraft(String(value));\n syncDraft.current = false;\n }\n }, [value]);\n\n const commitDraft = (raw: string, persistIncomplete: boolean) => {\n const parsed = persistIncomplete\n ? commitAssignNumberDraft(raw)\n : { display: raw, render: assignNumberFromDraft(raw).render };\n setDraft(parsed.display);\n onChange(parsed.render);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">{label}</span>\n <div className=\"eyeon-map-assign__control\">\n {extra}\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Decrease ${label}`}\n onClick={() => onStep(-1)}\n onMouseDown={() => onHoldStart(-1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label={label}\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => commitDraft(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n commitDraft(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n syncDraft.current = true;\n onStep(e.key === 'ArrowUp' ? 1 : -1);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Increase ${label}`}\n onClick={() => onStep(1)}\n onMouseDown={() => onHoldStart(1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ColorSwatch({\n label,\n hex,\n swatch,\n fallback,\n disabled,\n emptyIsTransparent = true,\n onHexChange,\n onCommit,\n onPick,\n}: {\n label: string;\n hex: string;\n swatch: string;\n fallback?: string;\n disabled?: boolean;\n emptyIsTransparent?: boolean;\n onHexChange: (value: string) => void;\n onCommit: () => void;\n onPick: (hex: string) => void;\n}) {\n const lastSolid = useRef(hexColorInputValue(fallback || swatch));\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\">\n <span\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n >\n <input\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n aria-label={label}\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n </span>\n <input\n type=\"text\"\n spellCheck={false}\n disabled={disabled}\n aria-label={`${label} hex`}\n placeholder=\"Transparent\"\n value={transparent ? '' : hex}\n onChange={(e) => onHexChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n </div>\n );\n}\n\nexport function ColorRow({\n label,\n value,\n fallback,\n disabled,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback: string;\n disabled: boolean;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value);\n const display = transparent ? TRANSPARENT_COLOR : value.trim() ? value : fallback;\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onChange(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {onReset ? (\n <FieldResetButton label={label} onClick={onReset} disabled={disabled} />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n\nconst ALIGN_TOOLTIPS: Record<LabelAlign, string> = {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n};\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm0 4.3h8v1.4H2V7.3zm0 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm2 4.3h8v1.4H4V7.3zm-2 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm4 4.3h8v1.4H6V7.3zm-4 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nconst ALIGN_ICONS: Record<LabelAlign, React.ReactNode> = {\n left: <AlignLeftIcon />,\n center: <AlignCenterIcon />,\n right: <AlignRightIcon />,\n};\n\nexport function AlignRow({\n value,\n disabled,\n onChange,\n}: {\n value?: LabelAlign;\n disabled: boolean;\n onChange: (align: LabelAlign) => void;\n}) {\n const align = normalizeLabelAlign(value);\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Alignment</span>\n <div className=\"eyeon-map-assign__align\" role=\"group\" aria-label=\"Alignment\">\n {LABEL_ALIGNS.map((option) => (\n <button\n key={option}\n type=\"button\"\n className={option === align ? 'is-active' : undefined}\n disabled={disabled}\n aria-label={ALIGN_TOOLTIPS[option]}\n aria-pressed={option === align}\n data-tooltip={ALIGN_TOOLTIPS[option]}\n onClick={() => onChange(option)}\n >\n {ALIGN_ICONS[option]}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function RotateIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"\n />\n </svg>\n );\n}\n\nexport function nextQuarterTurn(value: number): number {\n const angle = 45;\n let next = value;\n const remainder = next % angle;\n if (remainder !== 0) next -= remainder;\n next += angle;\n return next >= 360 ? 0 : next;\n}\n\n/** +/- drops the fraction, then steps by whole numbers. Typed decimals stay until then. */\nexport function stepWholeNumber(value: number, delta: number): number {\n if (!Number.isFinite(value)) return delta;\n if (delta > 0) return Math.floor(value) + delta;\n if (Number.isInteger(value)) return value + delta;\n return Math.floor(value);\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { CmShapeAssignment } from '../../core';\nimport { ColorRow, RotateIcon, StepperRow, nextQuarterTurn } from './formRows';\n\ntype StepKey = 'size' | 'rotate' | 'offsetX' | 'offsetY';\n\nexport interface AssignmentStyleFieldsProps {\n form: Pick<\n CmShapeAssignment,\n 'size' | 'rotate' | 'offsetX' | 'offsetY' | 'bgColor' | 'textColor'\n >;\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n textColorLabel?: string;\n showTextColor?: boolean;\n onPatch: (partial: Partial<CmShapeAssignment>) => void;\n}\n\n/** Size, rotate, offset, and colors — shared by kiosk / store / escalator assign. */\nexport function AssignmentStyleFields({\n form,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n textColorLabel = 'Text Color',\n showTextColor = true,\n onPatch,\n}: AssignmentStyleFieldsProps) {\n const formRef = useRef(form);\n formRef.current = form;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const bump = (key: StepKey, delta: number) => {\n onPatch({ [key]: (formRef.current[key] ?? 0) + delta });\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n return (\n <>\n <StepperRow\n label=\"Size\"\n value={form.size}\n disabled={!canEdit}\n onChange={(size) => onPatch({ size })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <StepperRow\n label=\"Rotate\"\n value={form.rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => onPatch({ rotate: nextQuarterTurn(form.rotate ?? 0) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(rotate) => onPatch({ rotate })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n <StepperRow\n label=\"Offset X\"\n value={form.offsetX}\n disabled={!canEdit}\n onChange={(offsetX) => onPatch({ offsetX })}\n onStep={(delta) => bump('offsetX', delta)}\n onHoldStart={(delta) => startHold('offsetX', delta)}\n onHoldEnd={() => stopHold('offsetX')}\n />\n <StepperRow\n label=\"Offset Y\"\n value={form.offsetY}\n disabled={!canEdit}\n onChange={(offsetY) => onPatch({ offsetY })}\n onStep={(delta) => bump('offsetY', delta)}\n onHoldStart={(delta) => startHold('offsetY', delta)}\n onHoldEnd={() => stopHold('offsetY')}\n />\n <ColorRow\n label=\"BG Color\"\n value={form.bgColor ?? ''}\n fallback={storeDefaultColor}\n disabled={!canEdit}\n onChange={(bgColor) => onPatch({ bgColor: bgColor || null })}\n onReset={form.bgColor ? () => onPatch({ bgColor: null }) : undefined}\n />\n {showTextColor ? (\n <ColorRow\n label={textColorLabel}\n value={form.textColor ?? ''}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(textColor) => onPatch({ textColor: textColor || null })}\n onReset={form.textColor ? () => onPatch({ textColor: null }) : undefined}\n />\n ) : null}\n </>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BatchOp, CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignmentPadFillFallback,\n emptyShapeAssignment,\n parseShapeAssignment,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport {\n buildElevatorShaftOps,\n buildEscalatorLinkOps,\n buildUnlinkConnectorOps,\n connectorForShape,\n connectorIdForShape,\n levelsWithLandings,\n memberShapeIds,\n resolvedConnectorKind,\n type ConnectorPlanContext,\n type VerticalRailKind,\n} from '../connectorAssignments';\nimport { connectorSpecialIconDataUrl } from '../../specialIcons';\n\nexport interface ConnectorAssignProps {\n shape: CmShape;\n railKind: VerticalRailKind;\n ctx: ConnectorPlanContext;\n canEdit: boolean;\n assignment?: CmShapeAssignment | null;\n storeDefaultColor: string;\n storeTextColor: string;\n onApplyOps: (ops: BatchOp[]) => void;\n onSaveAssignment?: (assignment: CmShapeAssignment) => void;\n}\n\nfunction connectorStyleAssignment(\n shape: CmShape,\n assignment: CmShapeAssignment | null | undefined,\n): CmShapeAssignment {\n const parsed = assignment\n ? parseShapeAssignment(assignment, 'connector')\n : emptyShapeAssignment(shape.id, 'connector');\n return {\n ...parsed,\n shapeId: shape.id,\n layerType: 'connector',\n };\n}\n\nexport function ConnectorAssign({\n shape,\n railKind,\n ctx,\n canEdit,\n assignment = null,\n storeDefaultColor,\n storeTextColor,\n onApplyOps,\n onSaveAssignment,\n}: ConnectorAssignProps) {\n const connector = connectorForShape(shape.id, ctx.anchors, ctx.connectors);\n const memberIds = connector ? memberShapeIds(connector.id, ctx.anchors) : [];\n const members = ctx.shapes.filter((s) => memberIds.includes(s.id));\n const partners = members.filter((s) => s.id !== shape.id);\n const partner = partners[0];\n const levelName = (levelId: number) =>\n ctx.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n\n const candidates = useMemo(\n () =>\n ctx.shapes.filter((item) => {\n if (item.id === shape.id || item.orphanedAt) return false;\n if (item.levelId === shape.levelId) return false;\n return resolvedConnectorKind(item, ctx.anchors, ctx.connectors) === railKind;\n }),\n [ctx.anchors, ctx.connectors, ctx.shapes, railKind, shape.id, shape.levelId],\n );\n\n const [exitFloorId, setExitFloorId] = useState(\n partner ? String(partner.levelId) : '',\n );\n const [targetId, setTargetId] = useState(partner ? String(partner.id) : '');\n const [stopFloorId, setStopFloorId] = useState('');\n const [styleForm, setStyleForm] = useState<CmShapeAssignment>(() =>\n connectorStyleAssignment(shape, assignment),\n );\n const styleFormRef = useRef(styleForm);\n styleFormRef.current = styleForm;\n\n useEffect(() => {\n setStyleForm(connectorStyleAssignment(shape, assignment));\n }, [shape, assignment]);\n\n const patchStyle = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n const next = connectorStyleAssignment(shape, {\n ...styleFormRef.current,\n ...partial,\n shapeId: shape.id,\n });\n setStyleForm(next);\n if (!canEdit) return;\n onSaveAssignment?.(next);\n },\n [canEdit, onSaveAssignment, shape],\n );\n\n useEffect(() => {\n setExitFloorId(partner ? String(partner.levelId) : '');\n setTargetId(partner ? String(partner.id) : '');\n }, [shape.id, connector?.id, partner?.id, partner?.levelId]);\n\n const exitFloors = levelsWithLandings(candidates, ctx.levels);\n const landingsOnExitFloor = candidates.filter(\n (item) => String(item.levelId) === exitFloorId,\n );\n\n const addable = candidates.filter((item) => !memberIds.includes(item.id));\n const addFloors = levelsWithLandings(addable, ctx.levels);\n const landingsOnStopFloor = addable.filter(\n (item) => String(item.levelId) === stopFloorId,\n );\n\n const applyEscalator = (from: CmShape, to: CmShape) => {\n onApplyOps(buildEscalatorLinkOps(ctx, from, to));\n };\n\n const applyElevator = (nextMembers: CmShape[]) => {\n if (nextMembers.length < 2) return;\n onApplyOps(\n buildElevatorShaftOps(ctx, nextMembers, {\n name: connector?.name,\n accessible: connector?.accessible ?? true,\n connectorId: connector?.id,\n }),\n );\n };\n\n const pickExitLanding = (nextId: string) => {\n setTargetId(nextId);\n const to = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!to || !canEdit) return;\n applyEscalator(shape, to);\n };\n\n const pickElevatorStop = (nextId: string) => {\n const next = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!next || !canEdit) return;\n applyElevator([...members, shape, next]);\n setStopFloorId('');\n };\n\n const landingOptions = (\n landings: CmShape[],\n kind: VerticalRailKind,\n ) =>\n landings.map((item) => {\n const linked = connectorIdForShape(item.id, ctx.anchors) != null;\n return {\n value: String(item.id),\n label: item.key,\n hint: linked ? 'Linked' : undefined,\n iconUrl: connectorSpecialIconDataUrl(\n kind,\n linked,\n linked ? storeTextColor : undefined,\n ),\n iconMuted: !linked,\n };\n });\n\n return (\n <div className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">\n {railKind === 'escalator' ? 'Escalator ride' : 'Elevator shaft'}\n </div>\n {railKind === 'escalator' ? (\n <p className=\"eyeon-map-rail__hint\">\n People board this landing and get off at a different place on another\n floor. Travel is one-way.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n One shaft, many floors. Riders can go between any linked landings in\n both directions.\n </p>\n )}\n\n {railKind === 'escalator' && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Floor\"\n value={exitFloorId}\n disabled={!canEdit || exitFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={exitFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(nextFloor) => {\n setExitFloorId(nextFloor);\n setTargetId(\n partner && String(partner.levelId) === nextFloor\n ? String(partner.id)\n : '',\n );\n }}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Escalator Point\n <ModernSelect\n ariaLabel=\"Escalator Point\"\n value={targetId}\n disabled={!canEdit || !exitFloorId}\n placeholder={\n exitFloorId\n ? 'Choose an escalator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnExitFloor, 'escalator')}\n onChange={pickExitLanding}\n />\n </label>\n {partner ? (\n <p className=\"eyeon-map-rail__hint\">\n Linked: {shape.key} → {partner.key} ({levelName(shape.levelId)} →{' '}\n {levelName(partner.levelId)}, {connector?.direction ?? 'up'})\n </p>\n ) : null}\n {canEdit && connector ? (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink\n </button>\n </div>\n ) : null}\n </>\n )}\n\n {railKind === 'elevator' && (\n <>\n <div className=\"eyeon-map-rail__heading\">Stops</div>\n {members.map((item) => (\n <div key={item.id} className=\"eyeon-map-rail__row\">\n <span>\n {levelName(item.levelId)} ·{' '}\n <span className=\"eyeon-map-rail__row-id\">{item.key}</span>\n </span>\n {canEdit && members.length > 2 && item.id !== shape.id ? (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__muted\"\n onClick={() => applyElevator(members.filter((s) => s.id !== item.id))}\n >\n Remove\n </button>\n ) : null}\n </div>\n ))}\n {members.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">This landing is not in a shaft yet.</p>\n ) : null}\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Add stop floor\"\n value={stopFloorId}\n disabled={!canEdit || addFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={addFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={setStopFloorId}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Elevator Point\n <ModernSelect\n ariaLabel=\"Elevator Point\"\n value=\"\"\n disabled={!canEdit || !stopFloorId}\n placeholder={\n stopFloorId\n ? 'Choose an elevator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnStopFloor, 'elevator')}\n onChange={pickElevatorStop}\n />\n </label>\n {canEdit && connector ? (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink shaft\n </button>\n </div>\n ) : null}\n </>\n )}\n\n {onSaveAssignment ? (\n <>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Design\n </div>\n <div className=\"eyeon-map-assign\">\n <AssignmentStyleFields\n form={styleForm}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n 'connector',\n storeDefaultColor,\n )}\n storeTextColor={storeTextColor}\n textColorLabel=\"Icon Color\"\n onPatch={patchStyle}\n />\n </div>\n </>\n ) : null}\n </div>\n );\n}\n","import type { ShapeKind, UnitStatus } from '../core';\n\nexport const SHAPE_KIND_LABELS: Record<ShapeKind, string> = {\n unit: 'Store',\n amenity: 'Amenity',\n kiosk_screen: 'Kiosk',\n connector: 'Connector',\n entrance: 'Entrance',\n walkable: 'Walkway',\n void: 'Open to Below',\n wall: 'Wall',\n boundary: 'Boundary',\n floorplate: 'Floor plate',\n decor: 'Decor',\n custom: 'Custom',\n label: 'Label',\n zone: 'Zone',\n parking_zone: 'Parking',\n green_area: 'Green area',\n water: 'Water',\n parking_icon: 'Parking icon',\n};\n\n/**\n * Types staff set in Edit Map. Text and entrance markers come from\n * their own tools, not this dropdown.\n */\nexport const EDITOR_TYPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'custom',\n 'void',\n];\n\nconst TOOL_ONLY_KINDS: ShapeKind[] = ['label', 'wall'];\n\nexport function inspectorShowsType(kind: ShapeKind): boolean {\n return !TOOL_ONLY_KINDS.includes(kind);\n}\n\n/** Type dropdown: curated kinds, and the current kind if it is outside that list. */\nexport function inspectorTypeKinds(current?: ShapeKind | null): ShapeKind[] {\n if (\n current &&\n !EDITOR_TYPE_KINDS.includes(current) &&\n inspectorShowsType(current)\n ) {\n return [...EDITOR_TYPE_KINDS, current];\n }\n return EDITOR_TYPE_KINDS;\n}\n\nexport const UNIT_STATUS_LABELS: Record<UnitStatus, string> = {\n occupied: 'Occupied',\n vacant: 'Vacant',\n coming_soon: 'Coming soon',\n under_renovation: 'Under renovation',\n};\n\nexport function shapeKindLabel(kind: string): string {\n return SHAPE_KIND_LABELS[kind as ShapeKind] ?? kind;\n}\n","import { assignmentHasTarget, type CmShapeAssignment } from '../core';\n\nexport const ASSIGNABLE_SHAPE_KINDS = [\n 'unit',\n 'parking_zone',\n 'amenity',\n 'kiosk_screen',\n 'custom',\n] as const;\n\nexport type AssignableShapeKind = (typeof ASSIGNABLE_SHAPE_KINDS)[number];\n\nexport type AssignmentLike = Pick<\n CmShapeAssignment,\n 'shapeId' | 'targetType' | 'retailerId' | 'amenityId' | 'kioskId'\n> & {\n customLabel?: string | null;\n layerType?: CmShapeAssignment['layerType'] | null;\n customImageKey?: string | null;\n};\n\nexport type AssignableShape = {\n id: number;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport function isAssignableKind(kind: string): kind is AssignableShapeKind {\n return (ASSIGNABLE_SHAPE_KINDS as readonly string[]).includes(kind);\n}\n\nexport function isStoreShapeKind(kind: string): boolean {\n return kind === 'unit' || kind === 'parking_zone';\n}\n\nexport function isRetailerAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment && assignment.targetType === 'retailer' && assignment.retailerId != null,\n );\n}\n\nexport function isAmenityAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'amenity' &&\n (assignment.amenityId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isKioskAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'kiosk' &&\n (assignment.kioskId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isPolygonAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return assignmentHasTarget(assignment);\n}\n\nexport function assignmentByShapeId(\n assignments: AssignmentLike[],\n): Map<number, AssignmentLike> {\n return new Map(assignments.map((item) => [item.shapeId, item]));\n}\n\n/** Assigned store / amenity / kiosk polygons, plus unassigned of each kind. */\nexport function railAssignmentGroups<T extends AssignableShape>(\n shapes: T[],\n assignments: AssignmentLike[],\n): {\n stores: T[];\n amenities: T[];\n kiosks: T[];\n unassignedStores: T[];\n unassignedAmenities: T[];\n unassignedKiosks: T[];\n custom: T[];\n unassignedCustom: T[];\n unassigned: T[];\n} {\n const byShape = assignmentByShapeId(assignments);\n const stores: T[] = [];\n const amenities: T[] = [];\n const kiosks: T[] = [];\n const unassignedStores: T[] = [];\n const unassignedAmenities: T[] = [];\n const unassignedKiosks: T[] = [];\n const custom: T[] = [];\n const unassignedCustom: T[] = [];\n const unassigned: T[] = [];\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n const assignment = byShape.get(shape.id) ?? null;\n if (shape.kind === 'custom') {\n if (isPolygonAssigned(assignment)) custom.push(shape);\n else unassignedCustom.push(shape);\n continue;\n }\n if (isRetailerAssigned(assignment)) stores.push(shape);\n else if (isAmenityAssigned(assignment)) amenities.push(shape);\n else if (isKioskAssigned(assignment)) kiosks.push(shape);\n else if (isAssignableKind(shape.kind) && !isPolygonAssigned(assignment)) {\n unassigned.push(shape);\n if (isStoreShapeKind(shape.kind)) unassignedStores.push(shape);\n else if (shape.kind === 'amenity') unassignedAmenities.push(shape);\n else if (shape.kind === 'kiosk_screen') unassignedKiosks.push(shape);\n }\n }\n return {\n stores,\n amenities,\n kiosks,\n unassignedStores,\n unassignedAmenities,\n unassignedKiosks,\n custom,\n unassignedCustom,\n unassigned,\n };\n}\n","import type { MapAssignKiosk } from '../core';\n\nexport type KioskShapeOption = {\n id: number;\n key: string;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport type CatalogKioskAssignment = {\n shapeId: number;\n kioskId?: number | null;\n};\n\nexport function isKioskScreenKind(kind: string): boolean {\n return kind === 'kiosk_screen';\n}\n\nexport function kioskScreenShapes<T extends KioskShapeOption>(shapes: T[]): T[] {\n return shapes.filter((shape) => isKioskScreenKind(shape.kind) && !shape.orphanedAt);\n}\n\nexport function catalogKioskShapeOptions(\n shapes: KioskShapeOption[],\n): Array<{ value: string; label: string }> {\n return kioskScreenShapes(shapes).map((shape) => ({\n value: String(shape.id),\n label: shape.key,\n }));\n}\n\nexport function shapeIdForCatalogKiosk(\n kioskId: number,\n assignments: CatalogKioskAssignment[],\n): number | null {\n return assignments.find((row) => row.kioskId === kioskId)?.shapeId ?? null;\n}\n\nexport function leftoverCatalogKiosks<T extends { id: number }>(\n kiosks: T[],\n assignments: CatalogKioskAssignment[],\n): T[] {\n const used = new Set(\n assignments\n .map((row) => row.kioskId)\n .filter((id): id is number => id != null),\n );\n return kiosks.filter((kiosk) => !used.has(kiosk.id));\n}\n\nexport function catalogKioskRowLabel(\n kiosk: MapAssignKiosk,\n assignedKey: string | null,\n): { title: string; id: string; tags: string[] } {\n return {\n title: kiosk.name.trim() || `Kiosk ${kiosk.id}`,\n id: `kiosk-${kiosk.id}`,\n tags: assignedKey ? [assignedKey] : ['Unlinked'],\n };\n}\n","import { compareBuildingFloors } from '../core';\n\n/** Title + tags for Map options shape lists (Stores, Amenities, …). */\nexport function railRowLabels(input: {\n key: string;\n kindLabel: string;\n levelName: string;\n assignedName?: string | null;\n /** Kind tag is only for the Unassigned module (mixed types). */\n showKindTag?: boolean;\n}): { title: string | null; id: string; tags: string[] } {\n const name = input.assignedName?.trim() || null;\n const tags = [input.levelName];\n if (input.showKindTag) tags.push(input.kindLabel);\n return { title: name, id: input.key, tags };\n}\n\nexport const RAIL_ITEM_SECTIONS = [\n 'stores',\n 'amenities',\n 'kiosks',\n 'custom',\n 'unassigned',\n 'escalators',\n 'elevators',\n] as const;\n\nexport type RailItemSection = (typeof RAIL_ITEM_SECTIONS)[number];\n\nexport function isRailItemSection(\n section: string | null,\n): section is RailItemSection {\n return (\n section != null &&\n (RAIL_ITEM_SECTIONS as readonly string[]).includes(section)\n );\n}\n\n/** Third sidebar screen: field options for the selected list item. */\nexport function railShowsItemOptions(\n section: string | null,\n selectedCount: number,\n): boolean {\n return isRailItemSection(section) && selectedCount > 0;\n}\n\ntype RailLevel = {\n id: number;\n kind: string;\n ordering: number;\n levelIndex: number;\n};\n\n/** Outdoor first, then the lowest building floor, then each floor above it. */\nexport function railListLevelOrder<T extends RailLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n const floorsLowToHigh = levels\n .filter((level) => level.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors)\n .reverse();\n return [...outdoor, ...floorsLowToHigh];\n}\n\nexport function sortShapesByRailLevel<T extends { levelId: number }>(\n shapes: T[],\n levels: RailLevel[],\n): T[] {\n const indexById = new Map(\n railListLevelOrder(levels).map((level, index) => [level.id, index]),\n );\n return shapes.slice().sort((a, b) => {\n const ai = indexById.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { compareBuildingFloors, type CmBuilding, type CmLevel } from '../../core';\n\nexport type CreateLevelInput = {\n name: string;\n kind: 'outdoor' | 'floor';\n buildingId?: number | null;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type UpdateLevelInput = {\n levelId: number;\n name?: string;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type FloorsScreen =\n | { mode: 'list' }\n | { mode: 'add-base' }\n | { mode: 'add-floor' }\n | { mode: 'edit'; levelId: number };\n\nexport function floorsScreenTitle(\n screen: FloorsScreen,\n levels: Array<{ id: number; kind: string }>,\n): string {\n if (screen.mode === 'add-base') return 'Add Outdoor SVG';\n if (screen.mode === 'add-floor') return 'Add Floor';\n if (screen.mode === 'edit') {\n const level = levels.find((l) => l.id === screen.levelId);\n return level?.kind === 'outdoor' ? 'Edit Outdoor' : 'Edit Floor';\n }\n return 'Floors';\n}\n\n/** Building floors only — Outdoor is a separate item and is not counted. */\nexport function visibleFloorCount(levels: Array<{ kind: string }>): number {\n return levels.filter((l) => l.kind === 'floor').length;\n}\n\n/** Insert `movedId` before or after `targetId`. Used by live floor reorder. */\nexport function placeLevelId(\n ids: number[],\n movedId: number,\n targetId: number,\n place: 'before' | 'after',\n): number[] {\n if (movedId === targetId) return ids;\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const target = without.indexOf(targetId);\n if (target < 0) return ids;\n const next = [...without];\n next.splice(place === 'after' ? target + 1 : target, 0, movedId);\n return next;\n}\n\n/** Move `movedId` to `toIndex` in the list with that id removed. */\nexport function moveLevelId(ids: number[], movedId: number, toIndex: number): number[] {\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const clamped = Math.max(0, Math.min(toIndex, without.length));\n const next = [...without];\n next.splice(clamped, 0, movedId);\n return next;\n}\n\n/** Slot index from pointer Y. Uses the list box, not live row midpoints. */\nexport function insertIndexFromY(\n clientY: number,\n listTop: number,\n rowHeight: number,\n count: number,\n): number {\n if (count <= 1 || rowHeight <= 0) return 0;\n const index = Math.round((clientY - listTop - rowHeight / 2) / rowHeight);\n return Math.max(0, Math.min(count - 1, index));\n}\n\n/** Overlay Y for the drop line. Null when the item would stay put. */\nexport function dropLineTop(\n fromIndex: number,\n dropIndex: number,\n rowHeight: number,\n rowInnerHeight: number,\n): number | null {\n if (fromIndex < 0 || dropIndex === fromIndex || rowHeight <= 0) return null;\n if (dropIndex < fromIndex) return dropIndex * rowHeight;\n return dropIndex * rowHeight + rowInnerHeight;\n}\n\nfunction sameIdOrder(a: number[], b: number[]): boolean {\n return a.length === b.length && a.every((id, i) => id === b[i]);\n}\n\ntype FloorDrag = {\n id: number;\n pointerId: number;\n offsetX: number;\n offsetY: number;\n width: number;\n height: number;\n name: string;\n x: number;\n y: number;\n listTop: number;\n listLeft: number;\n listBottom: number;\n rowHeight: number;\n originIds: number[];\n dropIndex: number;\n};\n\nexport interface FloorsPanelProps {\n levels: CmLevel[];\n buildings: CmBuilding[];\n /** Shapes already imported per level — drives delete and re-import copy. */\n levelShapeCounts?: Record<number, number>;\n canFloors: boolean;\n screen: FloorsScreen;\n onScreenChange: (screen: FloorsScreen) => void;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n}\n\nfunction formatBytes(size: number): string {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction svgFileName(key: string | null | undefined): string | null {\n if (!key) return null;\n const part = key.split('/').pop()?.trim();\n return part || null;\n}\n\nfunction isSvgFile(next: File): boolean {\n return next.name.toLowerCase().endsWith('.svg') || next.type === 'image/svg+xml';\n}\n\nfunction GripIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <path\n d=\"M3 5h12M3 9h12M3 13h12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** Same glyph as admin-portal Deals/Retailers (`Trash2` from react-feather). */\nfunction TrashIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function deleteConfirmCopy(\n level: { kind: string; name: string },\n shapeCount = 0,\n) {\n const isOutdoor = level.kind === 'outdoor';\n const shapes =\n shapeCount === 1 ? '1 shape' : `${shapeCount} shapes`;\n return {\n title: isOutdoor ? 'Delete Outdoor SVG?' : `Delete “${level.name}”?`,\n body: isOutdoor\n ? `The stored outdoor SVG, its ${shapes} and every assignment on them are removed. Building floors are not affected.`\n : `This floor and its ${shapes} are removed, along with the retailer, amenity and kiosk assignments on them.`,\n action: isOutdoor ? 'Delete Outdoor' : 'Delete floor',\n };\n}\n\nexport function FloorsPanel({\n levels,\n buildings,\n levelShapeCounts,\n canFloors,\n screen,\n onScreenChange,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n}: FloorsPanelProps) {\n const [name, setName] = useState('');\n const [file, setFile] = useState<File | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [progress, setProgress] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<number | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [drag, setDrag] = useState<FloorDrag | null>(null);\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const [previewIds, setPreviewIds] = useState<number[] | null>(null);\n const [previewFailed, setPreviewFailed] = useState(false);\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const floorListRef = useRef<HTMLDivElement>(null);\n const ghostRef = useRef<HTMLDivElement>(null);\n const previewIdsRef = useRef<number[] | null>(null);\n const dragRef = useRef<FloorDrag | null>(null);\n\n const outdoor = useMemo(\n () => levels.find((l) => l.kind === 'outdoor') ?? null,\n [levels],\n );\n const outdoorReady = Boolean(outdoor?.sourceSvgKey || outdoor?.sourceSvgUrl);\n const shapeCount = (levelId: number) => levelShapeCounts?.[levelId] ?? 0;\n const buildingFloors = useMemo(\n () =>\n levels\n .filter((l) => l.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors),\n [levels],\n );\n const committedIds = useMemo(\n () => buildingFloors.map((level) => level.id),\n [buildingFloors],\n );\n const displayFloors = useMemo(() => {\n // Keep committed order on screen while dragging so sibling rows stay put.\n const ids = drag != null ? committedIds : (previewIds ?? committedIds);\n const byId = new Map(buildingFloors.map((level) => [level.id, level]));\n return ids\n .map((id) => byId.get(id))\n .filter((level): level is CmLevel => level != null);\n }, [buildingFloors, committedIds, drag, previewIds]);\n const editing =\n screen.mode === 'edit'\n ? levels.find((l) => l.id === screen.levelId) ?? null\n : null;\n const isOutdoorForm =\n screen.mode === 'add-base' || editing?.kind === 'outdoor';\n const canManage = canFloors && !!onCreateLevel && !!onUpdateLevel;\n const canReorder = canManage && !!onReorderLevels && buildingFloors.length > 1;\n\n useEffect(() => {\n if (screen.mode === 'add-base' || editing?.kind === 'outdoor') {\n setName('Outdoor');\n setFile(null);\n } else if (screen.mode === 'add-floor') {\n setName('');\n setFile(null);\n } else if (screen.mode === 'edit' && editing) {\n setName(editing.name);\n setFile(null);\n }\n setError(null);\n setConfirmDeleteId(null);\n setDeleting(false);\n setProgress(null);\n setPreviewFailed(false);\n }, [screen, editing?.id, editing?.kind, editing?.name]);\n\n useEffect(() => {\n if (confirmDeleteId == null) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !deleting) setConfirmDeleteId(null);\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [confirmDeleteId, deleting]);\n\n useEffect(() => {\n if (!file) {\n setLocalPreviewUrl(null);\n return;\n }\n const url = URL.createObjectURL(file);\n setLocalPreviewUrl(url);\n setPreviewFailed(false);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n previewIdsRef.current = previewIds;\n dragRef.current = drag;\n\n useEffect(() => {\n if (drag != null || previewIds == null) return;\n if (sameIdOrder(committedIds, previewIds)) setPreviewIds(null);\n }, [committedIds, drag, previewIds]);\n\n const takeSvgFile = (next: File | null | undefined) => {\n if (!next) return;\n if (!isSvgFile(next)) {\n setError('Choose an SVG file.');\n return;\n }\n setError(null);\n setFile(next);\n };\n\n const openEdit = (level: CmLevel) => {\n onScreenChange({ mode: 'edit', levelId: level.id });\n };\n\n const submit = async (picked?: File | null) => {\n const svgFile = picked ?? file;\n if (isOutdoorForm) {\n if (!svgFile && (screen.mode === 'add-base' || !editing?.sourceSvgKey)) {\n setError('Choose an SVG file.');\n return;\n }\n } else if (!name.trim()) {\n setError('Enter a title.');\n return;\n }\n if (screen.mode === 'add-floor' && !svgFile) {\n setError('Choose an SVG file.');\n return;\n }\n setBusy(true);\n setError(null);\n if (svgFile) setProgress(0);\n try {\n if (screen.mode === 'add-base') {\n await onCreateLevel?.({\n name: 'Outdoor',\n kind: 'outdoor',\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'add-floor') {\n await onCreateLevel?.({\n name: name.trim(),\n kind: 'floor',\n buildingId: buildings[0]?.id ?? null,\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'edit' && editing) {\n await onUpdateLevel?.({\n levelId: editing.id,\n name: editing.kind === 'outdoor' ? 'Outdoor' : name.trim(),\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n }\n setProgress(100);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not save floor.');\n setProgress(null);\n } finally {\n setBusy(false);\n }\n };\n\n const remove = async (level: CmLevel) => {\n if (!onDeleteLevel || deleting) return;\n setDeleting(true);\n setError(null);\n try {\n await onDeleteLevel(level.id);\n setConfirmDeleteId(null);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not delete floor.');\n } finally {\n setDeleting(false);\n }\n };\n\n const renderDeleteModal = () => {\n const level = levels.find((l) => l.id === confirmDeleteId);\n if (!level) return null;\n const copy = deleteConfirmCopy(level, shapeCount(level.id));\n return (\n <div className=\"eyeon-map-modal\" role=\"presentation\">\n <div\n className=\"eyeon-map-modal__backdrop\"\n onClick={() => (deleting ? undefined : setConfirmDeleteId(null))}\n />\n <div\n className=\"eyeon-map-modal__card\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-delete-title\"\n aria-describedby=\"eyeon-map-delete-body\"\n >\n <h3 className=\"eyeon-map-modal__title\" id=\"eyeon-map-delete-title\">\n {copy.title}\n </h3>\n <p className=\"eyeon-map-modal__body\" id=\"eyeon-map-delete-body\">\n {copy.body} This cannot be undone.\n </p>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n <div className=\"eyeon-map-modal__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-modal__cancel\"\n disabled={deleting}\n onClick={() => setConfirmDeleteId(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={deleting}\n autoFocus\n onClick={() => void remove(level)}\n >\n {deleting ? (\n <>\n <span className=\"eyeon-map-floors__spinner\" aria-hidden=\"true\" />\n Deleting…\n </>\n ) : (\n copy.action\n )}\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n const renderRowDelete = (level: CmLevel) => {\n if (!canManage || !onDeleteLevel) return null;\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__icon-danger\"\n title={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n aria-label={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n disabled={busy || deleting}\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(level.id);\n }}\n >\n <TrashIcon />\n </button>\n );\n };\n\n const applyGhost = (x: number, y: number) => {\n const ghost = ghostRef.current;\n if (!ghost) return;\n ghost.style.left = `${x}px`;\n ghost.style.top = `${y}px`;\n };\n\n const previewMoveToY = (clientY: number) => {\n const current = dragRef.current;\n if (!current) return;\n const index = insertIndexFromY(\n clientY,\n current.listTop,\n current.rowHeight,\n current.originIds.length,\n );\n if (current.dropIndex !== index) {\n current.dropIndex = index;\n setDropIndex(index);\n }\n const next = moveLevelId(current.originIds, current.id, index);\n const ids = previewIdsRef.current ?? current.originIds;\n if (!sameIdOrder(ids, next)) setPreviewIds(next);\n };\n\n const persistPreview = async () => {\n const nextIds = previewIdsRef.current;\n if (!onReorderLevels || nextIds == null) return;\n if (sameIdOrder(nextIds, committedIds)) {\n setPreviewIds(null);\n return;\n }\n try {\n await onReorderLevels(nextIds);\n } catch (e) {\n setPreviewIds(null);\n setError(e instanceof Error ? e.message : 'Could not reorder floors.');\n }\n };\n\n const endDrag = () => {\n if (!dragRef.current) return;\n dragRef.current = null;\n setDrag(null);\n setDropIndex(null);\n void persistPreview();\n };\n\n useEffect(() => {\n if (!drag) return;\n const onMove = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n const x = current.listLeft;\n const maxY = current.listBottom - current.height;\n const y = Math.max(current.listTop, Math.min(maxY, e.clientY - current.offsetY));\n current.x = x;\n current.y = y;\n applyGhost(x, y);\n previewMoveToY(e.clientY);\n };\n const onUp = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n endDrag();\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [Boolean(drag)]);\n\n const startDrag = (level: CmLevel, e: React.PointerEvent<HTMLButtonElement>) => {\n const row = e.currentTarget.closest('.eyeon-map-floors__row');\n const list = floorListRef.current;\n if (!(row instanceof HTMLElement) || !list) return;\n const rect = row.getBoundingClientRect();\n const listRect = list.getBoundingClientRect();\n const rowHeight = rect.height + 2;\n e.preventDefault();\n e.stopPropagation();\n const next: FloorDrag = {\n id: level.id,\n pointerId: e.pointerId,\n offsetX: e.clientX - rect.left,\n offsetY: e.clientY - rect.top,\n width: rect.width,\n height: rect.height,\n name: level.name,\n x: listRect.left,\n y: rect.top,\n listTop: listRect.top,\n listLeft: listRect.left,\n listBottom: listRect.bottom,\n rowHeight,\n originIds: committedIds,\n dropIndex: committedIds.indexOf(level.id),\n };\n dragRef.current = next;\n setDrag(next);\n setDropIndex(committedIds.indexOf(level.id));\n setPreviewIds(committedIds);\n };\n\n const lineTop =\n drag && dropIndex != null\n ? dropLineTop(\n drag.originIds.indexOf(drag.id),\n dropIndex,\n drag.rowHeight,\n drag.height,\n )\n : null;\n\n if (screen.mode !== 'list') {\n const hasExistingSvg = Boolean(editing?.sourceSvgKey || editing?.sourceSvgUrl);\n const showEditPreview = screen.mode === 'edit' && hasExistingSvg;\n const previewUrl = localPreviewUrl ?? (showEditPreview ? editing?.sourceSvgUrl ?? null : null);\n const previewFallback =\n file?.name ?? svgFileName(editing?.sourceSvgKey) ?? 'SVG on file';\n const importedCount = editing ? shapeCount(editing.id) : 0;\n const showReimportNotice =\n !isOutdoorForm && screen.mode === 'edit' && importedCount > 0;\n const primaryLabel = isOutdoorForm ? 'Upload' : 'Import';\n const primaryBusyLabel = isOutdoorForm ? 'Uploading' : 'Importing';\n\n return (\n <div className=\"eyeon-map-floors\">\n {!isOutdoorForm && (\n <label className=\"eyeon-map-rail__field\">\n Title\n <input\n value={name}\n disabled={busy || !canManage}\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n )}\n {showEditPreview ? (\n <div className=\"eyeon-map-rail__field eyeon-map-floors__svg-field\">\n SVG\n <div className=\"eyeon-map-floors__preview-card\">\n {previewUrl && !previewFailed ? (\n <img\n className=\"eyeon-map-floors__preview-img\"\n src={previewUrl}\n alt={file?.name ?? editing?.name ?? 'SVG preview'}\n onError={() => setPreviewFailed(true)}\n />\n ) : (\n <div className=\"eyeon-map-floors__preview-fallback\">{previewFallback}</div>\n )}\n </div>\n {file ? (\n <span className=\"eyeon-map-floors__drop-meta\">\n {file.name}\n {isOutdoorForm\n ? ` · ${formatBytes(file.size)} · Ready to upload`\n : ` · ${formatBytes(file.size)}`}\n </span>\n ) : null}\n {!isOutdoorForm ? (\n <p className=\"eyeon-map-rail__hint\">\n Floor SVGs are read for geometry only — no copy of the file is kept.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n The outdoor SVG is stored and drawn live, so decoration stays\n designer-owned. Only its interactive polygons are imported.\n </p>\n )}\n <input\n ref={fileInputRef}\n hidden\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-floors__change\"\n disabled={busy || deleting || !canManage}\n onClick={() => fileInputRef.current?.click()}\n >\n {isOutdoorForm ? 'Replace SVG' : 'Re-import SVG'}\n </button>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__field\">\n {isOutdoorForm ? 'SVG file' : 'Floor SVG to import'}\n <label\n className={[\n 'eyeon-map-floors__drop',\n dragOver ? 'is-over' : '',\n file ? 'has-file' : '',\n busy ? 'is-busy' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!busy) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (busy || !canManage) return;\n takeSvgFile(e.dataTransfer.files?.[0]);\n }}\n >\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <span className=\"eyeon-map-floors__drop-title\">\n {file ? file.name : 'Choose SVG or drop it here'}\n </span>\n <span className=\"eyeon-map-floors__drop-meta\">\n {file\n ? isOutdoorForm\n ? `${formatBytes(file.size)} · Ready to upload`\n : `${formatBytes(file.size)} · Ready to import`\n : 'SVG only'}\n </span>\n </label>\n {!isOutdoorForm && !showReimportNotice ? (\n <p className=\"eyeon-map-rail__hint\">\n The file is read for geometry only. Shapes, the INTERACTIVE group\n and line segments in the <code>routes</code> group go into the\n database; the SVG itself is not stored.\n </p>\n ) : null}\n </div>\n )}\n {showReimportNotice ? (\n <div className=\"eyeon-map-floors__notice\">\n <p className=\"eyeon-map-floors__notice-title\">\n Re-importing replaces the {importedCount} shape\n {importedCount === 1 ? '' : 's'} on this floor\n </p>\n <ul className=\"eyeon-map-floors__notice-list\">\n <li>\n Layers that keep the same Illustrator ID are redrawn from the new file\n and keep their retailer, amenity and kiosk assignments.\n </li>\n <li>\n Shapes you reshaped in Edit Map keep your geometry — the new file is\n ignored for those.\n </li>\n <li>\n IDs missing from the new file are hidden rather than deleted, so you can\n move their assignments onto a renamed layer.\n </li>\n <li>\n New IDs come in unassigned, and line segments in the{' '}\n <code>routes</code> group replace this floor’s walking paths.\n </li>\n <li>\n The artboard must stay the same size, otherwise the import is rejected.\n </li>\n </ul>\n </div>\n ) : null}\n {progress != null && (\n <div\n className=\"eyeon-map-floors__progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div className=\"eyeon-map-floors__progress-track\">\n <div\n className=\"eyeon-map-floors__progress-bar\"\n style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n />\n </div>\n <span className=\"eyeon-map-floors__progress-label\">{progress}%</span>\n </div>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {screen.mode === 'edit' && editing ? (\n <div className=\"eyeon-map-floors__edit-actions\">\n <div className=\"eyeon-map-floors__edit-row\">\n {onDeleteLevel && canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={busy || deleting}\n onClick={() => setConfirmDeleteId(editing.id)}\n >\n Delete\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (editing.kind !== 'outdoor' && !name.trim())\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : 'Saving…'\n : file\n ? isOutdoorForm\n ? 'Upload & Save'\n : 'Import & Save'\n : 'Save Changes'}\n </button>\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (isOutdoorForm ? !file : !name.trim() || !file)\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : `${primaryBusyLabel}…`\n : primaryLabel}\n </button>\n </div>\n )}\n {renderDeleteModal()}\n </div>\n );\n }\n\n return (\n <div className={['eyeon-map-floors', drag ? 'is-reordering' : ''].filter(Boolean).join(' ')}>\n <div className=\"eyeon-map-floors__block\">\n {canManage && (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-floor' })}\n >\n Add Floor\n </button>\n )}\n {displayFloors.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">No floors yet.</p>\n ) : (\n <div ref={floorListRef} className=\"eyeon-map-floors__list\">\n {displayFloors.map((level) => (\n <div\n key={level.id}\n data-floor-id={level.id}\n className=\"eyeon-map-floors__entry\"\n >\n <div\n className={[\n 'eyeon-map-floors__row',\n drag?.id === level.id ? 'is-placeholder' : '',\n confirmDeleteId === level.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {canReorder ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__grip\"\n title=\"Drag to reorder\"\n aria-label={`Reorder ${level.name}`}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n startDrag(level, e);\n }}\n >\n <GripIcon />\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => {\n if (drag) return;\n openEdit(level);\n }}\n >\n {level.name}\n </button>\n {renderRowDelete(level)}\n </div>\n </div>\n ))}\n {lineTop == null ? null : (\n <div\n className=\"eyeon-map-floors__drop-line\"\n style={{ top: lineTop }}\n />\n )}\n </div>\n )}\n </div>\n\n <div className=\"eyeon-map-floors__block\">\n {outdoorReady && outdoor ? (\n <div className=\"eyeon-map-floors__entry\">\n <div\n className={[\n 'eyeon-map-floors__row',\n confirmDeleteId === outdoor.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => openEdit(outdoor)}\n >\n Outdoor SVG\n </button>\n {renderRowDelete(outdoor)}\n </div>\n </div>\n ) : canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-base' })}\n >\n Add Outdoor SVG\n </button>\n ) : null}\n </div>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {renderDeleteModal()}\n {drag\n ? createPortal(\n <div\n ref={ghostRef}\n className=\"eyeon-map-floors__row eyeon-map-floors__row--ghost\"\n style={{\n left: drag.x,\n top: drag.y,\n width: drag.width,\n height: drag.height,\n }}\n >\n <span className=\"eyeon-map-floors__grip\" aria-hidden=\"true\">\n <GripIcon />\n </span>\n <span className=\"eyeon-map-floors__item\">{drag.name}</span>\n <span className=\"eyeon-map-floors__icon-danger\" aria-hidden=\"true\">\n <TrashIcon />\n </span>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport {\n clampRouteThickness,\n clampStoreRadius,\n DEFAULT_THEME,\n amenityAssignedName,\n kioskAssignedName,\n retailerOptionLabel,\n staticLayerThemeDefaults,\n type CmAmenityCatalogItem,\n type CmAnchor,\n type CmConnector,\n type CmLevel,\n type CmRouteEdge,\n type CmBuilding,\n type CmShapeAssignment,\n type MapAssignKiosk,\n type MapAssignRetailer,\n type StaticLayerThemeKey,\n type ThemeDefaults,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n connectorForShape,\n connectorRideLabel,\n escalatorRideLandingLines,\n groupEscalatorRides,\n railConnectorShapes,\n} from '../connectorAssignments';\nimport {\n isTransparentColor,\n normalizeHexColor,\n sameHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { shapeKindLabel } from '../labels';\nimport { assignmentByShapeId, railAssignmentGroups } from '../railAssignments';\nimport {\n catalogKioskRowLabel,\n leftoverCatalogKiosks,\n shapeIdForCatalogKiosk,\n} from '../railKiosks';\nimport { connectorSpecialIconDataUrl, getAmenityByType } from '../../specialIcons';\nimport {\n railListLevelOrder,\n railRowLabels,\n railShowsItemOptions,\n sortShapesByRailLevel,\n} from '../railListCopy';\nimport {\n FloorsPanel,\n floorsScreenTitle,\n visibleFloorCount,\n type CreateLevelInput,\n type FloorsScreen,\n type UpdateLevelInput,\n} from './FloorsPanel';\nimport { ColorSwatch } from './formRows';\n\nexport type RailSection =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'custom'\n | 'paths'\n | 'style'\n | 'selection'\n | 'unassigned'\n | 'edit-map'\n | 'wayfinding'\n | 'map-responsiveness';\n\n/** @deprecated Use RailSection */\nexport type RailTab = RailSection;\n\nexport interface LeftRailDraft {\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n kind: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | null;\n }>;\n anchors: Array<Pick<CmAnchor, 'id' | 'levelId' | 'shapeId' | 'connectorId'>>;\n edges: Array<\n Pick<CmRouteEdge, 'id' | 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'>\n >;\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n assignments: CmShapeAssignment[];\n}\n\nexport interface LeftRailProps {\n section: RailSection | null;\n onSectionChange: (section: RailSection | null) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n selectedShapeId: number | null;\n selectedShapeIds?: number[];\n onSelectShape: (id: number | null, opts?: { additive?: boolean }) => void;\n onHoverShape?: (id: number | null) => void;\n onListFocus?: () => void;\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canFloors: boolean;\n canSettings: boolean;\n canResponsiveness?: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n assignPanel: ReactNode;\n /** Saved display_kiosks: pick a kiosk shape or delete. */\n catalogKioskPanel?: ReactNode;\n selectedCatalogKioskId?: number | null;\n onSelectCatalogKiosk?: (id: number | null) => void;\n /** Draw/tools UI for Edit Map (icons + inspector). */\n editMapPanel?: ReactNode;\n /** Route tools and path stats for Wayfinding. */\n wayfindingPanel?: ReactNode;\n mapResponsivenessPanel?: ReactNode;\n footer?: ReactNode;\n}\n\nfunction BackIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M10.2 2.6 4.8 8l5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.8 2.6 11.2 8l-5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst NAV_ICON_PROPS = {\n width: 18,\n height: 18,\n viewBox: '0 0 18 18',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction FloorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 12.5 9 15.5 15 12.5M3 9.2 9 12.2 15 9.2M9 2.5 3 5.5 9 8.5 15 5.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction StoresNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.5 7.2 4.4 14h9.2l.9-6.8H3.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 7.2 4.6 4h8.8L15 7.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M7 14V9.6h4V14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction AmenitiesNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M9 15.2s5.2-3.6 5.2-7.1A5.2 5.2 0 0 0 9 2.8a5.2 5.2 0 0 0-5.2 5.3c0 3.5 5.2 7.1 5.2 7.1Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"9\" cy=\"8\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction KiosksNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3\"\n width=\"13\"\n height=\"8.5\"\n rx=\"1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M7 15h4M9 11.5V15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction EscalatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 15h4V11h4V7h4V3h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ElevatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"4\" y=\"2.8\" width=\"10\" height=\"12.4\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9 5.4 7.2 7.6h3.6Zm0 7.2 1.8-2.2H7.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SettingsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS} viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CustomNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"13\"\n height=\"11\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M5.2 8h7.6M5.2 10.8h4.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction UnassignedNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeDasharray=\"2.4 2\"\n />\n </svg>\n );\n}\n\nfunction EditMapNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3.5\"\n width=\"12\"\n height=\"11\"\n rx=\"1.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M6 11.2 11.4 5.8l1.8 1.8L7.8 13H6z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction WayfindingNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.4 13.4c2.4-3.6 3.5-3.8 5-3.8 1.8 0 2.5 2 5.2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.4\" cy=\"13.4\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8.4\" cy=\"9.6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"13.6\" cy=\"11.6\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction MapResponsivenessNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"2.5\" y=\"4\" width=\"13\" height=\"9\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 13.8h6M9 13.8v1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 10.2 8.4 7l2 2 2.6-2.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\ntype RailNavCountKey =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'custom'\n | 'unassigned';\n\ntype RailNavItem = {\n id: RailSection;\n title: string;\n description: string;\n icon: () => React.ReactElement;\n countKey?: RailNavCountKey;\n};\n\ntype RailNavEntry = RailNavItem | { separator: true };\n\nconst RAIL_NAV: RailNavEntry[] = [\n {\n id: 'floors',\n title: 'Floors',\n description: 'Building floors and Outdoor SVG',\n icon: FloorsNavIcon,\n countKey: 'floors',\n },\n {\n id: 'stores',\n title: 'Stores',\n description: 'Retailers linked to the map',\n icon: StoresNavIcon,\n countKey: 'stores',\n },\n {\n id: 'amenities',\n title: 'Amenities',\n description: 'Amenities linked to the map',\n icon: AmenitiesNavIcon,\n countKey: 'amenities',\n },\n {\n id: 'kiosks',\n title: 'Kiosks',\n description: 'Link kiosk screens to devices',\n icon: KiosksNavIcon,\n countKey: 'kiosks',\n },\n {\n id: 'escalators',\n title: 'Escalators',\n description: 'One-way rides between floors',\n icon: EscalatorsNavIcon,\n countKey: 'escalators',\n },\n {\n id: 'elevators',\n title: 'Elevators',\n description: 'Two-way shafts across floors',\n icon: ElevatorsNavIcon,\n countKey: 'elevators',\n },\n {\n id: 'custom',\n title: 'Custom',\n description: 'Text and images drawn on the map',\n icon: CustomNavIcon,\n countKey: 'custom',\n },\n {\n id: 'unassigned',\n title: 'Unassigned',\n description: 'Polygons with no store, amenity, or kiosk',\n icon: UnassignedNavIcon,\n countKey: 'unassigned',\n },\n { separator: true },\n {\n id: 'edit-map',\n title: 'Edit Map',\n description: 'Draw and reshape stores, text, and lines',\n icon: EditMapNavIcon,\n },\n {\n id: 'wayfinding',\n title: 'Wayfinding',\n description: 'Walking paths and route anchors',\n icon: WayfindingNavIcon,\n },\n {\n id: 'map-responsiveness',\n title: 'Map Responsiveness',\n description: 'Starting zoom and position per floor and device',\n icon: MapResponsivenessNavIcon,\n },\n { separator: true },\n {\n id: 'style',\n title: 'Settings',\n description: 'Colors and map look',\n icon: SettingsNavIcon,\n },\n];\n\nconst HIDDEN_SECTION_TITLES: Partial<Record<RailSection, string>> = {\n paths: 'Walking paths',\n selection: 'Selected',\n};\n\nfunction isRailNavSeparator(entry: RailNavEntry): entry is { separator: true } {\n return 'separator' in entry;\n}\n\nfunction railSectionTitle(section: RailSection): string {\n const item = RAIL_NAV.find(\n (entry): entry is RailNavItem => !isRailNavSeparator(entry) && entry.id === section,\n );\n return item?.title ?? HIDDEN_SECTION_TITLES[section] ?? section;\n}\n\nconst HOUSE_OUTDOOR_THEME = staticLayerThemeDefaults();\n\nconst OUTDOOR_COLOR_FIELDS: Array<[StaticLayerThemeKey, string]> = [\n ['GREEN_AREA_COLOR', 'Green Areas'],\n ['WATER_COLOR', 'Water'],\n ['WALKABLE_COLOR', 'Walking Paths'],\n ['PARKING_LANE_COLOR', 'Parking Lanes'],\n ['PARKING_ICON_COLOR', 'Parking Icons'],\n];\n\nfunction SettingsField({\n label,\n onReset,\n children,\n}: {\n label: string;\n onReset?: () => void;\n children: ReactNode;\n}) {\n return (\n <div className=\"eyeon-map-rail__field eyeon-map-rail__field--inline\">\n <span className=\"eyeon-map-rail__field-label\">\n {label}\n {onReset ? <FieldResetButton label={label} onClick={onReset} /> : null}\n </span>\n {children}\n </div>\n );\n}\n\nfunction ColorField({\n label,\n value,\n fallback,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback?: string;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value) || !value.trim();\n const [hex, setHex] = useState(transparent ? '' : value);\n\n useEffect(() => {\n setHex(transparent ? '' : value);\n }, [transparent, value]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!transparent) onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : value);\n return;\n }\n setHex(normalized);\n if (normalized !== value.toLowerCase() && normalized !== value) onChange(normalized);\n };\n\n return (\n <SettingsField label={label} onReset={onReset}>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={transparent ? TRANSPARENT_COLOR : value}\n fallback={fallback}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </SettingsField>\n );\n}\n\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n selectedShapeIds,\n onSelectShape,\n onHoverShape,\n onListFocus,\n retailers = [],\n kiosks = [],\n canFloors,\n canSettings,\n canResponsiveness = false,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n catalogKioskPanel,\n selectedCatalogKioskId = null,\n onSelectCatalogKiosk,\n editMapPanel,\n wayfindingPanel,\n mapResponsivenessPanel,\n footer,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n useEffect(\n () => () => {\n onHoverShape?.(null);\n },\n [section, onHoverShape],\n );\n\n const assigned = useMemo(\n () => railAssignmentGroups(draft.shapes, draft.assignments),\n [draft.shapes, draft.assignments],\n );\n const storeShapes = assigned.stores;\n const amenityShapes = assigned.amenities;\n const kioskShapes = assigned.kiosks;\n const unassignedStoreShapes = assigned.unassignedStores;\n const unassignedAmenityShapes = assigned.unassignedAmenities;\n const unassignedKioskShapes = assigned.unassignedKiosks;\n const unassignedShapes = assigned.unassigned;\n const customShapes = assigned.custom;\n const unassignedCustomShapes = assigned.unassignedCustom;\n const connectors = draft.connectors ?? [];\n const escalatorShapes = railConnectorShapes(draft.shapes, 'escalator', draft.anchors, connectors);\n const elevatorShapes = railConnectorShapes(draft.shapes, 'elevator', draft.anchors, connectors);\n const unlinkedEscalators = escalatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const escalatorRides = useMemo(() => {\n const rides = groupEscalatorRides(\n connectors,\n draft.anchors,\n draft.edges,\n escalatorShapes,\n );\n const indexById = new Map(\n railListLevelOrder(draft.levels).map((level, index) => [level.id, index]),\n );\n return rides.slice().sort((a, b) => {\n const ai = indexById.get(a.from.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.from.levelId) ?? Number.POSITIVE_INFINITY;\n if (ai !== bi) return ai - bi;\n return a.from.key.localeCompare(b.from.key);\n });\n }, [connectors, draft.anchors, draft.edges, draft.levels, escalatorShapes]);\n const linkedElevators = elevatorShapes.filter((s) =>\n connectorForShape(s.id, draft.anchors, connectors),\n );\n const unlinkedElevators = elevatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const assignmentById = useMemo(\n () => assignmentByShapeId(draft.assignments),\n [draft.assignments],\n );\n const retailerById = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return new Map(\n retailers.map((retailer) => {\n const duplicate =\n (counts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return [\n retailer.id,\n retailerOptionLabel(retailer, duplicate),\n ] as const;\n }),\n );\n }, [retailers]);\n const amenityById = useMemo(\n () => new Map(draft.amenities.map((item) => [item.id, item.name])),\n [draft.amenities],\n );\n const kioskById = useMemo(\n () => new Map(kiosks.map((item) => [item.id, item.name])),\n [kiosks],\n );\n const assignedNameFor = (shape: {\n id: number;\n kind: string;\n key: string;\n levelId: number;\n }) => {\n const assignment = assignmentById.get(shape.id);\n if (assignment?.retailerId != null) {\n return retailerById.get(assignment.retailerId) ?? null;\n }\n if (assignment?.targetType === 'amenity' || assignment?.amenityId != null) {\n const catalogName =\n assignment.amenityId != null\n ? amenityById.get(assignment.amenityId) ?? null\n : null;\n const fromType = getAmenityByType(assignment.customLabel ?? '')?.name;\n return amenityAssignedName(assignment, catalogName ?? fromType ?? null);\n }\n if (assignment?.targetType === 'kiosk' || assignment?.kioskId != null) {\n return kioskAssignedName(\n assignment,\n assignment.kioskId != null\n ? kioskById.get(assignment.kioskId) ?? null\n : null,\n );\n }\n if (shape.kind === 'custom') {\n if (assignment?.layerType === 'custom_image') return 'Image';\n return assignment?.customLabel?.trim() || null;\n }\n return connectorRideLabel(\n shape,\n draft.anchors,\n draft.edges,\n connectors,\n draft.shapes,\n draft.levels,\n );\n };\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId);\n const pathCount = draft.anchors.filter((a) => a.levelId === activeLevelId).length;\n const levelName = (levelId: number) =>\n draft.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n const levelShapeCounts = useMemo(() => {\n const counts: Record<number, number> = {};\n for (const shape of draft.shapes) {\n if (shape.orphanedAt) continue;\n counts[shape.levelId] = (counts[shape.levelId] ?? 0) + 1;\n }\n return counts;\n }, [draft.shapes]);\n\n const selectedIds =\n selectedShapeIds ?? (selectedShapeId != null ? [selectedShapeId] : []);\n const isShapeSelected = (id: number) => selectedIds.includes(id);\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const showingCatalogKiosk =\n section === 'kiosks' && selectedCatalogKiosk != null;\n const showingItemOptions =\n railShowsItemOptions(section, selectedIds.length) || showingCatalogKiosk;\n useEffect(() => {\n if (showingItemOptions) onHoverShape?.(null);\n }, [showingItemOptions, onHoverShape]);\n const itemOptionsTitle = (() => {\n if (showingCatalogKiosk && selectedCatalogKiosk) {\n const linkedId = shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n return {\n key: selectedCatalogKiosk.name.trim() || `Kiosk ${selectedCatalogKiosk.id}`,\n levelName: linked?.key ?? 'Unlinked',\n };\n }\n if (!showingItemOptions || selectedIds.length !== 1) return null;\n const shape = draft.shapes.find((row) => row.id === selectedIds[0]);\n if (!shape) return null;\n return { key: shape.key, levelName: levelName(shape.levelId) };\n })();\n const selectShapeFromList = (id: number, event: { shiftKey: boolean }) => {\n onSelectCatalogKiosk?.(null);\n onSelectShape(id, { additive: event.shiftKey });\n onListFocus?.();\n };\n const leftoverKiosks = leftoverCatalogKiosks(kiosks, draft.assignments);\n\n const counts: Record<RailNavCountKey, number> = {\n floors: visibleFloorCount(draft.levels),\n stores: storeShapes.length + unassignedStoreShapes.length,\n amenities: amenityShapes.length + unassignedAmenityShapes.length,\n kiosks:\n kioskShapes.length + unassignedKioskShapes.length + leftoverKiosks.length,\n escalators: escalatorShapes.length,\n elevators: elevatorShapes.length,\n custom: customShapes.length + unassignedCustomShapes.length,\n unassigned: unassignedShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof draft.shapes,\n empty: string,\n opts?: {\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string;\n showKindTag?: boolean;\n connectorIcon?: 'escalator' | 'elevator';\n connectorAssigned?: boolean;\n },\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n sortShapesByRailLevel(shapes, draft.levels).map((s) => {\n const copy = railRowLabels({\n key: s.key,\n kindLabel: opts?.kindLabelFor?.(s) ?? shapeKindLabel(s.kind),\n levelName: levelName(s.levelId),\n assignedName: assignedNameFor(s),\n showKindTag: opts?.showKindTag,\n });\n const iconUrl = opts?.connectorIcon\n ? connectorSpecialIconDataUrl(\n opts.connectorIcon,\n Boolean(opts.connectorAssigned),\n opts.connectorAssigned ? theme.CONNECTOR_ICON_COLOR : undefined,\n )\n : undefined;\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n isShapeSelected(s.id)\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(s.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(s.id, event)}\n >\n {iconUrl ? (\n <img\n className={\n opts?.connectorAssigned\n ? 'eyeon-map-rail__row-icon is-assigned'\n : 'eyeon-map-rail__row-icon'\n }\n src={iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-rail__row-copy\">\n {copy.title ? (\n <span className=\"eyeon-map-rail__row-title\">{copy.title}</span>\n ) : null}\n <span className=\"eyeon-map-rail__row-meta\">\n <span\n className={\n copy.title\n ? 'eyeon-map-rail__row-id'\n : 'eyeon-map-rail__row-id eyeon-map-rail__row-id--lead'\n }\n >\n {copy.id}\n </span>\n {copy.tags.length > 0 ? (\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span key={`${s.id}-${tag}`} className=\"eyeon-map-rail__tag\">\n {tag}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n );\n })\n );\n\n const renderEscalatorRideList = () =>\n escalatorRides.map((ride) => {\n const lines = escalatorRideLandingLines(ride, draft.levels);\n const active =\n isShapeSelected(ride.from.id) || isShapeSelected(ride.to.id);\n return (\n <button\n key={ride.connectorId}\n type=\"button\"\n className={\n active\n ? 'eyeon-map-rail__row eyeon-map-rail__row--ride is-active'\n : 'eyeon-map-rail__row eyeon-map-rail__row--ride'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(ride.from.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(ride.from.id, event)}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n {lines.map((line) => (\n <span key={line.shapeId} className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id eyeon-map-rail__row-id--lead\">\n {line.key}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n <span className=\"eyeon-map-rail__tag\">{line.levelName}</span>\n </span>\n </span>\n ))}\n </span>\n </button>\n );\n });\n\n const renderAssignedUnassigned = (\n assignedList: typeof draft.shapes,\n unassignedList: typeof draft.shapes,\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string,\n connectorIcon?: 'escalator' | 'elevator',\n ) => (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({assignedList.length})\n </div>\n {assignedList.length > 0\n ? renderShapeList(assignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: true,\n })\n : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedList.length})\n </div>\n {unassignedList.length > 0\n ? renderShapeList(unassignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: false,\n })\n : null}\n </>\n );\n\n return (\n <aside className=\"eyeon-map-rail\">\n {section ? (\n <div className=\"eyeon-map-rail__header\">\n <button\n type=\"button\"\n className=\"eyeon-map-rail__back\"\n onClick={() => {\n if (section === 'floors' && floorsScreen.mode !== 'list') {\n setFloorsScreen({ mode: 'list' });\n return;\n }\n if (showingCatalogKiosk) {\n onSelectCatalogKiosk?.(null);\n return;\n }\n if (showingItemOptions) {\n onSelectShape(null);\n onHoverShape?.(null);\n return;\n }\n onSectionChange(null);\n }}\n aria-label=\"Back\"\n >\n <BackIcon />\n </button>\n <div className=\"eyeon-map-rail__header-title\">\n {section === 'floors' ? (\n floorsScreenTitle(floorsScreen, draft.levels)\n ) : itemOptionsTitle ? (\n <span className=\"eyeon-map-assign__tag\">{itemOptionsTitle.key}</span>\n ) : (\n railSectionTitle(section)\n )}\n </div>\n {itemOptionsTitle ? (\n <span className=\"eyeon-map-rail__tag\">{itemOptionsTitle.levelName}</span>\n ) : null}\n </div>\n ) : (\n <div className=\"eyeon-map-rail__header\">\n <div className=\"eyeon-map-rail__header-title\">Configure Center Map</div>\n </div>\n )}\n\n <div className=\"eyeon-map-rail__body\">\n {!section && (\n <nav className=\"eyeon-map-rail__nav\" aria-label=\"Map options\">\n {RAIL_NAV.map((entry, index) => {\n if (isRailNavSeparator(entry)) {\n return (\n <div\n key={`sep-${index}`}\n className=\"eyeon-map-rail__nav-sep\"\n role=\"separator\"\n />\n );\n }\n const Icon = entry.icon;\n return (\n <button\n key={entry.id}\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange(entry.id)}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <Icon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">{entry.title}</span>\n <span className=\"eyeon-map-rail__nav-desc\">{entry.description}</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n {entry.countKey != null ? (\n <span className=\"eyeon-map-rail__nav-count\">\n {counts[entry.countKey]}\n </span>\n ) : null}\n <ChevronIcon />\n </span>\n </button>\n );\n })}\n </nav>\n )}\n\n {section === 'edit-map' && (\n <div className=\"eyeon-map-rail__section\">{editMapPanel}</div>\n )}\n\n {section === 'wayfinding' && (\n <div className=\"eyeon-map-rail__section\">{wayfindingPanel}</div>\n )}\n\n {section === 'map-responsiveness' && (\n <div className=\"eyeon-map-rail__section\">{mapResponsivenessPanel}</div>\n )}\n\n {section === 'floors' && (\n <FloorsPanel\n levels={draft.levels}\n buildings={draft.buildings}\n levelShapeCounts={levelShapeCounts}\n canFloors={canFloors}\n screen={floorsScreen}\n onScreenChange={setFloorsScreen}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n const id = await onCreateLevel(input);\n setFloorsScreen({ mode: 'list' });\n return id;\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n />\n )}\n\n {section === 'stores' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(storeShapes, unassignedStoreShapes)}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(\n amenityShapes,\n unassignedAmenityShapes,\n )}\n </div>\n )}\n\n {section === 'custom' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(customShapes, unassignedCustomShapes)}\n </div>\n )}\n\n {section === 'unassigned' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedShapes.length})\n </div>\n {renderShapeList(\n unassignedShapes,\n 'Every assignable polygon has a link.',\n { showKindTag: true },\n )}\n </>\n )}\n </div>\n )}\n\n {section === 'escalators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <p className=\"eyeon-map-rail__hint\">\n Pick the boarding landing, then the floor and exit landing.\n A linked ride is one row: boarding on top, exit below. Rides\n are one-way.\n </p>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({escalatorRides.length})\n </div>\n {escalatorRides.length > 0 ? renderEscalatorRideList() : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unlinkedEscalators.length})\n </div>\n {unlinkedEscalators.length > 0\n ? renderShapeList(unlinkedEscalators, '')\n : null}\n </>\n )}\n </div>\n )}\n\n {section === 'elevators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n renderAssignedUnassigned(\n linkedElevators,\n unlinkedElevators,\n undefined,\n 'elevator',\n )\n )}\n </div>\n )}\n\n {section === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n {showingCatalogKiosk\n ? catalogKioskPanel\n : showingItemOptions\n ? assignPanel\n : (\n <>\n {renderAssignedUnassigned(kioskShapes, unassignedKioskShapes)}\n {leftoverKiosks.length > 0 ? (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Existing kiosks ({leftoverKiosks.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Saved kiosk devices (shared with Classic Map). Open\n one to attach or remove a New map shape — the device\n itself is not deleted.\n </p>\n {leftoverKiosks.map((kiosk) => {\n const linkedId = shapeIdForCatalogKiosk(\n kiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n const copy = catalogKioskRowLabel(\n kiosk,\n linked?.key ?? null,\n );\n return (\n <button\n key={kiosk.id}\n type=\"button\"\n className={\n selectedCatalogKioskId === kiosk.id\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => {\n onSelectShape(null);\n onSelectCatalogKiosk?.(kiosk.id);\n }}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n <span className=\"eyeon-map-rail__row-title\">\n {copy.title}\n </span>\n <span className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id\">\n {copy.id}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span\n key={`${kiosk.id}-${tag}`}\n className=\"eyeon-map-rail__tag\"\n >\n {tag}\n </span>\n ))}\n </span>\n </span>\n </span>\n </button>\n );\n })}\n </>\n ) : null}\n </>\n )}\n </div>\n )}\n\n {section === 'paths' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Use Wayfinding to place the walking path, then drag each faded\n store point onto that path to hook the store in.\n </p>\n <div className=\"eyeon-map-rail__stat\">\n {pathCount} path points · {draft.edges.length} connections\n </div>\n {canFloors && activeLevelId != null && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"eyeon-map-rail__section\">\n {!canSettings ? (\n <p className=\"eyeon-map-rail__hint\">\n You do not have permission to change map colors.\n </p>\n ) : (\n <>\n <div className=\"eyeon-map-rail__heading\">Map Settings</div>\n {(\n [\n ['MAP_BACKGROUND_COLOR', 'Background'],\n ['STORE_DEFAULT_COLOR', 'Stores'],\n ] as const\n ).map(([key, label]) => {\n const house = DEFAULT_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\n <SettingsField label=\"Stores Radius\">\n <input\n className=\"eyeon-map-rail__number-sm\"\n type=\"number\"\n min={0}\n step={1}\n inputMode=\"decimal\"\n value={theme.STORE_RADIUS}\n aria-label=\"Stores Radius\"\n onChange={(e) =>\n onThemeChange({ STORE_RADIUS: clampStoreRadius(e.target.value) })\n }\n />\n </SettingsField>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Route Settings\n </div>\n <ColorField\n label=\"Route Path\"\n value={theme.ROUTE_COLOR}\n fallback={DEFAULT_THEME.ROUTE_COLOR}\n onChange={(hex) => onThemeChange({ ROUTE_COLOR: hex })}\n onReset={\n sameHexColor(theme.ROUTE_COLOR, DEFAULT_THEME.ROUTE_COLOR)\n ? undefined\n : () =>\n onThemeChange({ ROUTE_COLOR: DEFAULT_THEME.ROUTE_COLOR })\n }\n />\n <SettingsField\n label=\"Route Thickness\"\n onReset={\n theme.ROUTE_THICKNESS === DEFAULT_THEME.ROUTE_THICKNESS\n ? undefined\n : () =>\n onThemeChange({\n ROUTE_THICKNESS: DEFAULT_THEME.ROUTE_THICKNESS,\n })\n }\n >\n <input\n className=\"eyeon-map-rail__number-sm\"\n type=\"number\"\n min={1}\n step={1}\n inputMode=\"decimal\"\n value={theme.ROUTE_THICKNESS}\n aria-label=\"Route Thickness\"\n onChange={(e) =>\n onThemeChange({\n ROUTE_THICKNESS: clampRouteThickness(e.target.value),\n })\n }\n />\n </SettingsField>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Outdoor Settings\n </div>\n {OUTDOOR_COLOR_FIELDS.map(([key, label]) => {\n const house = HOUSE_OUTDOOR_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\n </>\n )}\n </div>\n )}\n\n {section === 'selection' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n {activeLevel\n ? `Editing a shape on ${activeLevel.name}.`\n : 'Editing the selected shape.'}\n </p>\n {assignPanel}\n </div>\n )}\n </div>\n\n {footer}\n </aside>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\n\ntype ClassicPresence = 'unknown' | 'yes' | 'no' | 'error';\n\nexport interface ClassicMapFooterProps {\n /** Admin API origin, no trailing slash. Cookie session is sent with each call. */\n webApiURI: string;\n centerId: number;\n /** Local editor edits that a switch back to Classic would discard. */\n unsaved?: boolean;\n /** Host swaps to Classic after `centers.map_version` is set to 1. */\n onMapVersionChanged?: (mapVersion: 1 | 2) => void;\n}\n\ntype SetupStatus = {\n has_classic_data?: boolean;\n};\n\nasync function readError(res: Response): Promise<string> {\n const text = (await res.text()).trim();\n try {\n const body = JSON.parse(text) as { error?: { description?: string } };\n const description = body?.error?.description;\n if (typeof description === 'string' && description) return description;\n } catch {\n // Response was not JSON.\n }\n return text || `Request failed (HTTP ${res.status})`;\n}\n\nasync function apiFetch<T>(\n webApiURI: string,\n path: string,\n init?: RequestInit,\n): Promise<T> {\n const base = webApiURI.replace(/\\/$/, '');\n const res = await fetch(`${base}${path}`, {\n credentials: 'include',\n ...init,\n headers: {\n Accept: 'application/json',\n ...(init?.body ? { 'Content-Type': 'application/json' } : {}),\n ...init?.headers,\n },\n });\n if (!res.ok) throw new Error(await readError(res));\n if (res.status === 204) return undefined as T;\n const ct = res.headers.get('content-type') ?? '';\n if (!ct.includes('application/json')) return undefined as T;\n return (await res.json()) as T;\n}\n\n/**\n * PORTAL left-rail footer. Developer-only, and only while Classic mapit2_*\n * data still exists. Switching and deleting go through `/v1/map/*`.\n */\nexport function ClassicMapFooter({\n webApiURI,\n centerId,\n unsaved = false,\n onMapVersionChanged,\n}: ClassicMapFooterProps) {\n const [isDeveloper, setIsDeveloper] = useState(false);\n const [classicPresence, setClassicPresence] = useState<ClassicPresence>('unknown');\n const [dialog, setDialog] = useState<'switch' | 'delete' | null>(null);\n const [acknowledged, setAcknowledged] = useState(false);\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!webApiURI || !centerId) return;\n let cancelled = false;\n setIsDeveloper(false);\n setClassicPresence('unknown');\n void (async () => {\n try {\n const user = await apiFetch<{ is_developer?: boolean }>(\n webApiURI,\n '/v1/auth/is-authenticated',\n );\n if (cancelled) return;\n if (user?.is_developer !== true) {\n setIsDeveloper(false);\n setClassicPresence('no');\n return;\n }\n setIsDeveloper(true);\n } catch {\n if (!cancelled) {\n setIsDeveloper(false);\n setClassicPresence('no');\n }\n return;\n }\n try {\n const status = await apiFetch<SetupStatus>(\n webApiURI,\n `/v1/map/setup-status?center_id=${centerId}`,\n );\n if (cancelled) return;\n setClassicPresence(status?.has_classic_data ? 'yes' : 'no');\n } catch {\n if (!cancelled) setClassicPresence('error');\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [webApiURI, centerId]);\n\n const openSwitch = useCallback(() => {\n if (pending) return;\n if (unsaved) {\n const leave = window.confirm(\n 'You have unsaved map changes. Switching back to Classic will discard them.',\n );\n if (!leave) return;\n }\n setError(null);\n setAcknowledged(false);\n setDialog('switch');\n }, [pending, unsaved]);\n\n const confirmSwitch = useCallback(async () => {\n if (pending || !webApiURI || !centerId) return;\n setPending(true);\n setError(null);\n try {\n await apiFetch(webApiURI, `/v1/map/version?center_id=${centerId}`, {\n method: 'PUT',\n body: JSON.stringify({ map_version: 1 }),\n });\n setDialog(null);\n onMapVersionChanged?.(1);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to switch map version');\n } finally {\n setPending(false);\n }\n }, [centerId, onMapVersionChanged, pending, webApiURI]);\n\n const confirmDelete = useCallback(async () => {\n if (pending || !acknowledged || !webApiURI || !centerId) return;\n setPending(true);\n setError(null);\n try {\n await apiFetch(webApiURI, `/v1/map/classic-data?center_id=${centerId}`, {\n method: 'DELETE',\n });\n setClassicPresence('no');\n setDialog(null);\n setAcknowledged(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to delete old Classic map data');\n } finally {\n setPending(false);\n }\n }, [acknowledged, centerId, pending, webApiURI]);\n\n const showSwitch = isDeveloper && (classicPresence === 'yes' || classicPresence === 'error');\n const showDelete = isDeveloper && classicPresence === 'yes';\n if (!showSwitch && !dialog) return null;\n\n return (\n <>\n {showSwitch ? (\n <div className=\"eyeon-map-rail__footer\">\n <div className=\"eyeon-map-version\">\n <button\n type=\"button\"\n className=\"eyeon-map-version__link\"\n disabled={pending}\n onClick={openSwitch}\n >\n Switch Back to Classic Map\n </button>\n {showDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-version__delete\"\n disabled={pending}\n onClick={() => {\n setError(null);\n setAcknowledged(false);\n setDialog('delete');\n }}\n >\n Delete Old Map Data\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {dialog ? (\n <div className=\"eyeon-map-modal\" role=\"presentation\">\n <div\n className=\"eyeon-map-modal__backdrop\"\n onClick={() => {\n if (!pending) setDialog(null);\n }}\n />\n <div\n className=\"eyeon-map-modal__card eyeon-map-modal__card--copy\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-version-title\"\n >\n <h3 className=\"eyeon-map-modal__title\" id=\"eyeon-map-version-title\">\n {dialog === 'delete'\n ? 'Delete old Classic map data?'\n : 'Switch this center back to the Classic map?'}\n </h3>\n {dialog === 'switch' ? (\n <>\n <p className=\"eyeon-map-version__lead\">\n Center Map in Admin, websites, WordPress, and kiosks for this center will go back\n to the Classic map.\n </p>\n <ul className=\"eyeon-map-version__list\">\n <li>Your Classic floors, placements, and settings are unchanged.</li>\n <li>Work on the New map is kept, so you can switch to New again later.</li>\n <li>Switching only changes which map is shown. Edits do not sync between them.</li>\n </ul>\n </>\n ) : (\n <>\n <p className=\"eyeon-map-version__lead\">\n This permanently removes Classic map data for this center. The New map is not\n affected, and you will not be able to switch back to Classic afterward.\n </p>\n <p className=\"eyeon-map-version__label\">This will delete</p>\n <ul className=\"eyeon-map-version__list\">\n <li>Classic floor plans and their uploaded SVG files</li>\n <li>Classic store, amenity, and kiosk placements on the map</li>\n <li>Classic map colors and display settings</li>\n <li>Classic camera positions saved for different screen sizes</li>\n </ul>\n <p className=\"eyeon-map-version__label\">This will not delete</p>\n <ul className=\"eyeon-map-version__list\">\n <li>Retailer, amenity, and kiosk records used elsewhere in the portal</li>\n <li>Floors, shapes, routes, or media that belong to the New map</li>\n </ul>\n <label className=\"eyeon-map-version__ack\">\n <input\n type=\"checkbox\"\n checked={acknowledged}\n disabled={pending}\n onChange={(e) => setAcknowledged(e.target.checked)}\n />\n <span>\n I understand this permanently deletes the Classic map and cannot be undone.\n </span>\n </label>\n </>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n <div className=\"eyeon-map-modal__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-modal__cancel\"\n disabled={pending}\n onClick={() => setDialog(null)}\n >\n Cancel\n </button>\n {dialog === 'switch' ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={pending}\n onClick={() => void confirmSwitch()}\n >\n {pending ? 'Switching…' : 'Switch to Classic'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={pending || !acknowledged}\n onClick={() => void confirmDelete()}\n >\n {pending ? 'Deleting…' : 'Delete Old Map Data'}\n </button>\n )}\n </div>\n </div>\n </div>\n ) : null}\n </>\n );\n}\n","import React from 'react';\nimport type { MapAssignKiosk } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\n/**\n * Link a shared display_kiosks device to a New-map kiosk_screen shape.\n * Does NOT delete the physical kiosk — that would break Classic placements,\n * kiosk-electron identity, and display ads. Use Unlink / Remove from New Map.\n */\nexport function CatalogKioskForm({\n kiosk,\n shapeOptions,\n assignedShapeId,\n canEdit,\n onAssign,\n}: {\n kiosk: MapAssignKiosk;\n shapeOptions: Array<{ value: string; label: string }>;\n assignedShapeId: number | null;\n canEdit: boolean;\n onAssign: (shapeId: number | null) => void;\n}) {\n const hasShape = assignedShapeId != null;\n const empty = shapeOptions.length === 0;\n\n return (\n <div className=\"eyeon-map-assign\">\n <p className=\"eyeon-map-rail__hint\">\n Link this saved kiosk device to a kiosk shape on the New map. Removing it\n here only clears the New map placement — the device stays available for\n Classic Map, kiosk apps, and ads.\n </p>\n <ModernSelect\n ariaLabel=\"Kiosk shape\"\n value={hasShape ? String(assignedShapeId) : ''}\n disabled={!canEdit || empty}\n searchable={shapeOptions.length > 8}\n placeholder={empty ? 'No kiosk shapes on the map' : 'Choose a kiosk shape…'}\n options={shapeOptions}\n onChange={(next) => onAssign(next ? Number(next) : null)}\n />\n <div className=\"eyeon-map-assign__actions\">\n {canEdit && hasShape ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onAssign(null)}\n >\n Remove from New Map\n </button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n","import type {\n BatchOp,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n} from '../core';\n\n/** Short, readable prefix for staff-facing shape IDs (`unit-k4n8`). */\nconst SHAPE_KEY_PREFIX: Record<ShapeKind, string> = {\n unit: 'unit',\n amenity: 'amenity',\n kiosk_screen: 'kiosk',\n connector: 'conn',\n entrance: 'entry',\n walkable: 'walk',\n void: 'void',\n wall: 'wall',\n boundary: 'bound',\n floorplate: 'slab',\n decor: 'decor',\n custom: 'custom',\n label: 'text',\n zone: 'zone',\n parking_zone: 'park',\n green_area: 'green',\n water: 'water',\n parking_icon: 'picon',\n};\n\n/** No 0/O/1/I/L — keeps IDs short and easy to read. */\nexport const SHAPE_KEY_ALPHABET = 'abcdefghjkmnpqrstuvwxyz23456789';\nexport const SHAPE_KEY_SUFFIX_LENGTH = 4;\n\nexport function shapeKeyPrefix(kind: string): string {\n return SHAPE_KEY_PREFIX[kind as ShapeKind] ?? kind.replace(/_/g, '');\n}\n\nexport function randomShapeKeySuffix(\n length = SHAPE_KEY_SUFFIX_LENGTH,\n): string {\n const bytes = new Uint8Array(length);\n globalThis.crypto.getRandomValues(bytes);\n let out = '';\n for (let i = 0; i < length; i++) {\n out += SHAPE_KEY_ALPHABET[bytes[i]! % SHAPE_KEY_ALPHABET.length];\n }\n return out;\n}\n\nconst SHAPE_KEY_PATTERN = /^[a-z]+-[a-z0-9]{4}$/;\n\n/** True for the short IDs we mint (`unit-k4n8`), not SVG ids like `unit-101`. */\nexport function isAllocatedShapeKey(key: string): boolean {\n return SHAPE_KEY_PATTERN.test(key);\n}\n\nexport function liveShapeKeysOnLevel(\n shapes: Array<{\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n levelId: number,\n): string[] {\n return shapes\n .filter((shape) => shape.levelId === levelId && !shape.orphanedAt)\n .map((shape) => shape.key);\n}\n\nexport function copyDestinationLevels<T extends { id: number }>(\n levels: T[],\n currentLevelId: number,\n): T[] {\n return levels.filter((level) => level.id !== currentLevelId);\n}\n\n/**\n * Mint a short unique key for a new or copied shape.\n * `suffix` is injectable so tests can pin the random part.\n */\nexport function allocShapeKey(\n kind: string,\n taken: Iterable<string>,\n suffix: () => string = randomShapeKeySuffix,\n): string {\n const prefix = shapeKeyPrefix(kind);\n const used = taken instanceof Set ? taken : new Set(taken);\n for (let i = 0; i < 24; i++) {\n const key = `${prefix}-${suffix()}`;\n if (!used.has(key)) return key;\n }\n let n = 2;\n while (used.has(`${prefix}-${n}`)) n += 1;\n return `${prefix}-${n}`;\n}\n\nexport function cloneShapeGeometry(geometry: ShapeGeometry): ShapeGeometry {\n return {\n paths: geometry.paths.map((path) => ({ d: path.d, closed: path.closed })),\n polygons: geometry.polygons.map((ring) =>\n ring.map((point) => ({ x: point.x, y: point.y })),\n ),\n };\n}\n\nexport function copyShapeToLevelOps(args: {\n shape: CmShape;\n assignment?: CmShapeAssignment | null;\n targetLevelId: number;\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>;\n allocId: () => number;\n allocKey?: (kind: string, taken: Iterable<string>) => string;\n}): { ops: BatchOp[]; shapeId: number; key: string } | null {\n const { shape, targetLevelId } = args;\n if (targetLevelId === shape.levelId) return null;\n const taken = liveShapeKeysOnLevel(args.shapes, targetLevelId);\n const id = args.allocId();\n const key = (args.allocKey ?? allocShapeKey)(shape.kind, taken);\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id,\n levelId: targetLevelId,\n key,\n kind: shape.kind,\n geometry: cloneShapeGeometry(shape.geometry),\n bbox: { ...shape.bbox },\n zIndex: shape.zIndex,\n style: { ...shape.style },\n label: { ...shape.label },\n sourceSvgId: null,\n origin: 'manual',\n geometryLocked: true,\n },\n },\n ];\n if (args.assignment) {\n ops.push({\n op: 'upsert_assignment',\n assignment: { ...args.assignment, shapeId: id },\n });\n }\n return { ops, shapeId: id, key };\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n AssignmentLayerType,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignKiosk,\n MapAssignRetailer,\n} from '../../core';\nimport {\n assignmentHasTarget,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n DEFAULT_LABEL_ALIGN,\n emptyShapeAssignment,\n isHttpImageUrl,\n normalizeLabelAlign,\n parseShapeAssignment,\n retailerOptionLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport {\n amenityAssignOptions,\n amenityCatalogIdForType,\n amenityTypeFromCatalogId,\n} from '../../specialIcons';\nimport { isAssignableKind } from '../railAssignments';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport { AlignRow } from './formRows';\n\nconst RETAIL_LAYER_TYPES: AssignmentLayerType[] = [\n 'retail_name',\n 'retail_logo',\n 'retail_text',\n];\n\nexport interface AssignFormProps {\n shape: CmShape;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onChange: (assignment: CmShapeAssignment) => void;\n onClear: () => void;\n}\n\nexport function AssignForm({\n shape,\n assignment,\n amenities,\n retailers,\n kiosks = [],\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onChange,\n onClear,\n}: AssignFormProps) {\n const [form, setForm] = useState<CmShapeAssignment>(() =>\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n const formRef = useRef(form);\n formRef.current = form;\n\n useEffect(() => {\n setForm(\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n }, [shape, assignment]);\n\n const commit = useCallback(\n (next: CmShapeAssignment) => {\n setForm(next);\n if (!canEdit) return;\n onChange(parseShapeAssignment(next, shape.kind));\n },\n [canEdit, onChange, shape.kind],\n );\n\n const patch = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n commit({ ...formRef.current, shapeId: shape.id, ...partial });\n },\n [commit, shape.id],\n );\n\n const nameCounts = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n }, [retailers]);\n\n const retailerOptions = useMemo(\n () =>\n retailers.map((retailer) => {\n const duplicate =\n (nameCounts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return {\n value: String(retailer.id),\n label: retailerOptionLabel(retailer, duplicate),\n };\n }),\n [nameCounts, retailers],\n );\n\n const amenityOptions = useMemo(() => amenityAssignOptions(), []);\n const selectedAmenityType =\n amenityTypeFromCatalogId(form.amenityId, amenities) ||\n form.customLabel ||\n '';\n\n const kioskCatalogName = useMemo(() => {\n if (form.kioskId == null) return null;\n return kiosks.find((item) => item.id === form.kioskId)?.name ?? null;\n }, [form.kioskId, kiosks]);\n\n const showTextColor = [\n 'retail_name',\n 'retail_text',\n 'custom_text',\n 'kiosk',\n 'amenity',\n ].includes(form.layerType);\n const textColorLabel =\n form.layerType === 'kiosk' || form.layerType === 'amenity'\n ? 'Icon Color'\n : 'Text Color';\n const textColorFallback = assignmentIconThemeFallback(\n form,\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n shape.kind,\n );\n\n const hasAssignment = assignmentHasTarget(form);\n\n if (!isAssignableKind(shape.kind)) return null;\n\n return (\n <div className=\"eyeon-map-assign\">\n {shape.kind === 'unit' || shape.kind === 'parking_zone' ? (\n <>\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={form.retailerId != null ? String(form.retailerId) : ''}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose a Retailer…\"\n options={retailerOptions}\n onChange={(next) => {\n const retailerId = next ? Number(next) : null;\n const retailer = retailers.find((item) => item.id === retailerId);\n const layerType = RETAIL_LAYER_TYPES.includes(form.layerType)\n ? form.layerType\n : 'retail_name';\n patch({\n targetType: retailerId ? 'retailer' : 'none',\n retailerId,\n amenityId: null,\n kioskId: null,\n unitStatus: retailerId ? 'occupied' : 'vacant',\n layerType,\n customLabel:\n layerType === 'retail_name'\n ? retailer?.name ?? null\n : form.customLabel,\n customImageKey:\n layerType === 'retail_logo'\n ? retailer?.logoKey ?? form.customImageKey\n : form.customImageKey,\n });\n }}\n />\n {form.retailerId != null ? (\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Display\">\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_name' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_name',\n customLabel: retailer?.name ?? form.customLabel,\n });\n }}\n >\n Retail Name\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_logo' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_logo',\n customImageKey:\n retailer?.logoKey ?? form.customImageKey,\n });\n }}\n >\n Retail Logo\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_text' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => patch({ layerType: 'retail_text' })}\n >\n Custom Text\n </button>\n </div>\n ) : null}\n {form.retailerId != null && form.layerType === 'retail_text' ? (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n className=\"eyeon-map-assign__text\"\n rows={3}\n disabled={!canEdit}\n value={form.customLabel ?? ''}\n style={{\n textAlign: normalizeLabelAlign(\n form.align ?? shape.label.align,\n ),\n }}\n onChange={(e) => patch({ customLabel: e.target.value || null })}\n />\n </label>\n <AlignRow\n value={form.align ?? shape.label.align ?? DEFAULT_LABEL_ALIGN}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => patch({ align })}\n />\n </>\n ) : null}\n </>\n ) : null}\n\n {shape.kind === 'custom' ? (\n <>\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Custom display\">\n <button\n type=\"button\"\n className={form.layerType !== 'custom_image' ? 'is-active' : undefined}\n disabled={!canEdit}\n onClick={() =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_text',\n })\n }\n >\n Text\n </button>\n <button\n type=\"button\"\n className={form.layerType === 'custom_image' ? 'is-active' : undefined}\n disabled={!canEdit}\n onClick={() =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_image',\n })\n }\n >\n Image\n </button>\n </div>\n {form.layerType === 'custom_image' ? (\n <label className=\"eyeon-map-rail__field\">\n Image URL\n <input\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={!canEdit}\n placeholder=\"https://\"\n aria-label=\"Custom image URL\"\n value={form.customImageKey ?? ''}\n onChange={(e) =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_image',\n customImageKey: e.target.value.trim() ? e.target.value.trim() : null,\n })\n }\n />\n {form.customImageKey && !isHttpImageUrl(form.customImageKey) ? (\n <span className=\"eyeon-map-rail__hint\">\n Use a full http:// or https:// image address.\n </span>\n ) : null}\n </label>\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n className=\"eyeon-map-assign__text\"\n rows={3}\n disabled={!canEdit}\n value={form.customLabel ?? ''}\n style={{\n textAlign: normalizeLabelAlign(\n form.align ?? shape.label.align,\n ),\n }}\n onChange={(e) =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_text',\n customLabel: e.target.value || null,\n })\n }\n />\n </label>\n <AlignRow\n value={form.align ?? shape.label.align ?? DEFAULT_LABEL_ALIGN}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => patch({ align })}\n />\n </>\n )}\n </>\n ) : null}\n\n {shape.kind === 'amenity' ? (\n <ModernSelect\n ariaLabel=\"Choose Amenity\"\n value={selectedAmenityType}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose Amenity…\"\n options={amenityOptions}\n onChange={(next) => {\n const amenityId = next\n ? amenityCatalogIdForType(next, amenities)\n : null;\n patch({\n targetType: next ? 'amenity' : 'none',\n amenityId,\n customLabel: next || null,\n retailerId: null,\n kioskId: null,\n layerType: 'amenity',\n });\n }}\n />\n ) : null}\n\n {shape.kind === 'kiosk_screen' ? (\n <KioskNameField\n value={form.customLabel ?? kioskCatalogName ?? ''}\n disabled={!canEdit}\n onChange={(name) => {\n const trimmed = name.trim();\n patch({\n targetType: trimmed ? 'kiosk' : 'none',\n kioskId: trimmed ? form.kioskId : null,\n customLabel: name === '' ? null : name,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n });\n }}\n />\n ) : null}\n\n <AssignmentStyleFields\n form={form}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n shape.kind,\n storeDefaultColor,\n )}\n storeTextColor={textColorFallback}\n textColorLabel={textColorLabel}\n showTextColor={showTextColor}\n onPatch={patch}\n />\n {canEdit ? (\n <div className=\"eyeon-map-assign__actions eyeon-map-assign__actions--end\">\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => {\n if (!hasAssignment) return;\n onClear();\n }}\n disabled={!hasAssignment}\n >\n Unassign\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction KioskNameField({\n value,\n disabled,\n onChange,\n}: {\n value: string;\n disabled: boolean;\n onChange: (name: string) => void;\n}) {\n return (\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder=\"e.g. Food court entrance\"\n aria-label=\"Kiosk name\"\n maxLength={50}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignNumberFromDraft,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n bulkAssignFormState,\n DEFAULT_ASSIGNMENT_SIZE,\n emptyShapeAssignment,\n parseShapeAssignment,\n type BulkAssignPatch,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { isAssignableKind } from '../railAssignments';\nimport { ColorSwatch } from './formRows';\n\nexport function BulkAssignForm({\n shapes,\n assignments,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onPatch,\n}: {\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onPatch: (patch: BulkAssignPatch) => void;\n}) {\n const rows = shapes\n .filter((shape) => isAssignableKind(shape.kind))\n .map((shape) => {\n const existing = assignments.find((row) => row.shapeId === shape.id);\n return existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n });\n const common = bulkAssignFormState(rows);\n const assignableShapes = shapes.filter((shape) => isAssignableKind(shape.kind));\n const iconOnly =\n assignableShapes.length > 0 &&\n assignableShapes.every(\n (shape) => shape.kind === 'amenity' || shape.kind === 'kiosk_screen',\n );\n const uniqueKinds = new Set(assignableShapes.map((shape) => shape.kind));\n const textColorLabel = iconOnly ? 'Icon Color' : 'Text Color';\n const textColorFallback =\n uniqueKinds.size === 1\n ? assignmentIconThemeFallback(\n rows[0],\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n assignableShapes[0]?.kind,\n )\n : storeTextColor;\n const bgColorFallback =\n uniqueKinds.size === 1\n ? assignmentPadFillFallback(assignableShapes[0]?.kind, storeDefaultColor)\n : storeDefaultColor;\n\n return (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-assign__tags\">\n {shapes.map((shape) => (\n <span key={shape.id} className=\"eyeon-map-assign__tag\">\n {shape.key}\n </span>\n ))}\n </div>\n <BulkSizeRow\n value={common.size}\n disabled={!canEdit}\n onCommit={(size) => onPatch({ size })}\n />\n <BulkColorRow\n label=\"BG Color\"\n value={common.bgColor}\n fallback={bgColorFallback}\n mixed={common.bgColorMixed}\n disabled={!canEdit}\n onCommit={(bgColor) => onPatch({ bgColor })}\n />\n <BulkColorRow\n label={textColorLabel}\n value={common.textColor}\n fallback={textColorFallback}\n mixed={common.textColorMixed}\n disabled={!canEdit}\n onCommit={(textColor) => onPatch({ textColor })}\n />\n </div>\n );\n}\n\nfunction BulkSizeRow({\n value,\n disabled,\n onCommit,\n}: {\n value: number | '';\n disabled: boolean;\n onCommit: (size: number) => void;\n}) {\n const [draft, setDraft] = useState(() => (value === '' ? '' : String(value)));\n const focused = useRef(false);\n\n useEffect(() => {\n if (!focused.current) setDraft(value === '' ? '' : String(value));\n }, [value]);\n\n const emitIfComplete = (raw: string, persistIncomplete: boolean) => {\n if (!raw.trim()) {\n setDraft('');\n return;\n }\n const parsed = assignNumberFromDraft(raw);\n if (!parsed.complete) {\n setDraft(raw);\n return;\n }\n setDraft(String(parsed.render));\n onCommit(parsed.render);\n if (persistIncomplete) setDraft(String(parsed.render));\n };\n\n const step = (delta: number) => {\n const base = value === '' ? DEFAULT_ASSIGNMENT_SIZE : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Size</span>\n <div className=\"eyeon-map-assign__control\">\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Decrease Size\"\n onClick={() => step(-1)}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label=\"Size\"\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => emitIfComplete(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n emitIfComplete(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const parsed = assignNumberFromDraft(draft);\n const base = parsed.complete\n ? parsed.render\n : value === ''\n ? DEFAULT_ASSIGNMENT_SIZE\n : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Increase Size\"\n onClick={() => step(1)}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BulkColorRow({\n label,\n value,\n fallback,\n mixed,\n disabled,\n onCommit,\n}: {\n label: string;\n value: string;\n fallback: string;\n mixed: boolean;\n disabled: boolean;\n onCommit: (hex: string | null) => void;\n}) {\n const transparent = !mixed && isTransparentColor(value);\n const display = mixed\n ? ''\n : transparent\n ? TRANSPARENT_COLOR\n : value.trim()\n ? value\n : fallback;\n const customized = mixed || Boolean(value.trim());\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!mixed) onCommit(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onCommit(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {customized ? (\n <FieldResetButton\n label={label}\n disabled={disabled}\n onClick={() => onCommit(null)}\n />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n emptyIsTransparent={!mixed}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport '../../ui/modern-select.css';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CopyToLevelButton({\n destinations,\n disabled = false,\n onCopyToLevel,\n}: {\n destinations: Array<{ id: number; name: string }>;\n disabled?: boolean;\n onCopyToLevel: (levelId: number) => string | null;\n}) {\n const listId = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setMenuPos(null);\n }, []);\n\n const updateMenuPos = useCallback(() => {\n const el = buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 168),\n maxHeight,\n });\n }, []);\n\n const destinationKey = destinations.map((level) => level.id).join(',');\n useEffect(() => {\n setError(null);\n close();\n }, [close, destinationKey]);\n\n useEffect(() => {\n if (!open) return;\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n buttonRef.current?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos]);\n\n if (destinations.length === 0) return null;\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label=\"Duplicate to floor\"\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {destinations.map((level) => (\n <li key={level.id} role=\"option\">\n <button\n type=\"button\"\n className=\"eyeon-map-select__option\"\n onClick={() => {\n const nextError = onCopyToLevel(level.id);\n setError(nextError);\n if (!nextError) close();\n }}\n >\n {level.name}\n </button>\n </li>\n ))}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div className=\"eyeon-map-assign__copy-wrap\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={\n open ? 'eyeon-map-assign__copy is-open' : 'eyeon-map-assign__copy'\n }\n aria-label=\"Duplicate to another floor\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setError(null);\n setOpen((value) => !value);\n }}\n >\n Duplicate\n <Chevron />\n </button>\n {menu}\n {error ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ShapeLabel } from '../../core';\nimport { DEFAULT_ENTRANCE_SIZE, clampEntranceSize } from '../entranceIcon';\nimport {\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_ICON_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function EntranceIconForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [size, setSize] = useState(label.size ?? DEFAULT_ENTRANCE_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n setSize(label.size ?? DEFAULT_ENTRANCE_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = clampEntranceSize(partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n onChange(\n {\n ...label,\n ...partial,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: clampEntranceSize(stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <StepperRow\n label=\"Size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_ICON_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n DEFAULT_LABEL_ALIGN,\n type LabelAlign,\n type ShapeLabel,\n} from '../../core';\nimport { DEFAULT_LABEL_SIZE, DEFAULT_LABEL_TEXT } from '../labelText';\nimport {\n AlignRow,\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_FONT_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function TextLabelForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [text, setText] = useState(label.text ?? '');\n const [size, setSize] = useState(label.size ?? DEFAULT_LABEL_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n const textFocused = useRef(false);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n if (!textFocused.current) setText(label.text ?? '');\n setSize(label.size ?? DEFAULT_LABEL_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = Math.max(MIN_FONT_SIZE, partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n const nextText =\n partial.text === undefined\n ? text\n : partial.text === ''\n ? (label.text ?? DEFAULT_LABEL_TEXT)\n : partial.text;\n onChange(\n {\n ...label,\n ...partial,\n text: nextText,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange, text],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: Math.max(MIN_FONT_SIZE, stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n value={text}\n disabled={!canEdit}\n placeholder=\"Text on the map\"\n aria-label=\"Text\"\n style={{ textAlign: label.align ?? DEFAULT_LABEL_ALIGN }}\n onFocus={() => {\n textFocused.current = true;\n }}\n onChange={(e) => {\n const next = e.target.value;\n setText(next);\n commit({ text: next }, { live: true });\n }}\n onBlur={() => {\n textFocused.current = false;\n const next = text.trim();\n if (next !== text) setText(next);\n commit({ text: next || DEFAULT_LABEL_TEXT });\n }}\n />\n </label>\n <AlignRow\n value={label.align}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => commit({ align })}\n />\n <StepperRow\n label=\"Font size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_FONT_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Text color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n BulkAssignPatch,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n MapAssignKiosk,\n MapAssignRetailer,\n ShapeKind,\n ShapeLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { inspectorShowsType, inspectorTypeKinds, SHAPE_KIND_LABELS } from '../labels';\nimport { isAssignableKind } from '../railAssignments';\nimport { copyDestinationLevels } from '../shapeCopy';\nimport { isEntranceIcon } from '../entranceIcon';\nimport { AssignForm } from './AssignForm';\nimport { BulkAssignForm } from './BulkAssignForm';\nimport { CopyToLevelButton } from './CopyToLevelButton';\nimport { EntranceIconForm } from './EntranceIconForm';\nimport { TextLabelForm } from './TextLabelForm';\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n /** Other shape keys on the same level — used for uniqueness validation. */\n levelShapeKeys?: string[];\n canEdit: boolean;\n /** Retailer / amenity / kiosk assignment. Off in Edit Map (ID and Type only). */\n showAssignment?: boolean;\n /** Empty-state copy when nothing is selected. */\n emptyHint?: string;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onChangeLevel?: (levelId: number) => string | null;\n /** Duplicate geometry onto another floor. Edit Map only — not assign. */\n onCopyToLevel?: (levelId: number) => string | null;\n levels?: Array<{ id: number; name: string }>;\n onDelete?: () => void;\n onClearAssignment?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n onUpdateLabel?: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n selectedShapes?: CmShape[];\n selectedAssignments?: CmShapeAssignment[];\n onBulkAssign?: (patch: BulkAssignPatch) => void;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n retailers = [],\n kiosks = [],\n levelShapeKeys = [],\n canEdit,\n showAssignment = true,\n emptyHint = 'Pick an item from the list below, or click it on the map.',\n onRename,\n onChangeKind,\n onChangeLevel,\n onCopyToLevel,\n levels = [],\n onDelete,\n onClearAssignment,\n onSaveAssignment,\n onUpdateLabel,\n selectedShapes = [],\n selectedAssignments = [],\n onBulkAssign,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [levelError, setLevelError] = useState<string | null>(null);\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setLevelError(null);\n }, [shape, assignment]);\n\n if (showAssignment && selectedShapes.length > 1 && onBulkAssign) {\n return (\n <div className=\"eyeon-map-inspector\">\n <BulkAssignForm\n key={selectedShapes.map((item) => item.id).join(',')}\n shapes={selectedShapes}\n assignments={selectedAssignments}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onPatch={onBulkAssign}\n />\n </div>\n );\n }\n\n if (!shape) {\n if (!showAssignment || !emptyHint) return null;\n return (\n <div className=\"eyeon-map-inspector__empty\">\n {emptyHint}\n </div>\n );\n }\n\n const commitRename = () => {\n if (!key || key === shape.key) {\n setKeyError(null);\n return;\n }\n if (levelShapeKeys.includes(key)) {\n setKeyError('That ID is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n const copyDestinations = copyDestinationLevels(levels, shape.levelId);\n const copyButton =\n !showAssignment &&\n canEdit &&\n onCopyToLevel &&\n copyDestinations.length > 0 ? (\n <CopyToLevelButton\n destinations={copyDestinations}\n onCopyToLevel={onCopyToLevel}\n />\n ) : null;\n\n if (showAssignment) {\n return (\n <div className=\"eyeon-map-inspector\">\n {shape.geometryLocked ? (\n <p className=\"eyeon-map-rail__hint\">\n Geometry locked — outdoor re-uploads will not overwrite this shape.\n </p>\n ) : null}\n {isAssignableKind(shape.kind) ? (\n <AssignForm\n shape={shape}\n assignment={assignment}\n amenities={amenities}\n retailers={retailers}\n kiosks={kiosks}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onChange={onSaveAssignment}\n onClear={() => onClearAssignment?.()}\n />\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-inspector\">\n {isEntranceIcon(shape) ? (\n onUpdateLabel ? (\n <EntranceIconForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : shape.kind === 'label' ? (\n onUpdateLabel ? (\n <TextLabelForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n ID\n <input\n className=\"eyeon-map-rail__id-input\"\n value={key}\n disabled={!canEdit}\n onChange={(e) => {\n setKey(e.target.value);\n setKeyError(null);\n }}\n onBlur={commitRename}\n />\n </label>\n {keyError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {keyError}\n </p>\n ) : null}\n\n {inspectorShowsType(shape.kind) ? (\n <label className=\"eyeon-map-rail__field\">\n Type\n <ModernSelect\n ariaLabel=\"Type\"\n value={shape.kind}\n disabled={!canEdit}\n searchable={false}\n options={inspectorTypeKinds(shape.kind).map((k) => ({\n value: k,\n label: SHAPE_KIND_LABELS[k],\n }))}\n onChange={(next) => onChangeKind(next as ShapeKind)}\n />\n </label>\n ) : null}\n {shape.kind === 'void' ? (\n <p className=\"eyeon-map-rail__hint\">\n Open to Below looks through to the floor below — walkways and\n floor plates are cut out so the lower level shows through.\n </p>\n ) : null}\n </>\n )}\n\n {onChangeLevel && levels.length > 0 ? (\n <>\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Floor</span>\n <div className=\"eyeon-map-assign__floor\">\n <ModernSelect\n ariaLabel=\"Floor\"\n value={String(shape.levelId)}\n disabled={!canEdit}\n searchable={false}\n options={levels.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(next) => {\n if (!next) return;\n setLevelError(onChangeLevel(Number(next)));\n }}\n />\n </div>\n </div>\n {levelError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {levelError}\n </p>\n ) : null}\n </>\n ) : null}\n\n {canEdit && (copyButton || onDelete) ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyButton}\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onDelete()}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import React, { Suspense } from 'react';\nimport type {\n DeviceType,\n MapViewerHost,\n PublishedDocument,\n} from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\nimport type { CameraViewSnapshot } from '../../viewer/components/CameraRig';\n\nexport function PreviewOverlay({\n document,\n host = 'PORTAL_ASSIGN',\n onSelectShape,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId,\n focusNonce,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n device,\n captureCamera,\n onCameraChange,\n onCameraReset,\n}: {\n document: PublishedDocument;\n /** Assign mode and public website hide search. */\n host?: MapViewerHost;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusNonce?: number;\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Default true (public navigate). False when assigning in PORTAL. */\n routeOnSelect?: boolean;\n /** Without this the outdoor SVG is fetched cross-origin and CORS blocks it. */\n imageProxyUrl?: string | null;\n device?: DeviceType;\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n {/* Viewer chrome stays on the canvas — never in the Map options rail. */}\n <MapViewer\n document={document}\n host={host}\n onSelectShape={onSelectShape}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n focusNonce={focusNonce}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n device={device}\n captureCamera={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Suspense>\n </div>\n );\n}\n","export type ShapeSelectOpts = { additive?: boolean };\n\n/** Plain click replaces; Shift-click toggles the id in the set. */\nexport function nextSelectedShapeIds(\n current: number[],\n id: number | null,\n opts?: ShapeSelectOpts,\n): number[] {\n if (id == null) return [];\n if (!opts?.additive) return [id];\n if (current.includes(id)) return current.filter((item) => item !== id);\n return [...current, id];\n}\n","import type {\n CmConnector,\n CmResponsiveOverride,\n MapAssignRetailer,\n PublishedDocument,\n} from '../core';\nimport { compileDocument } from '../core';\nimport type { EditorDraftState } from './draftOps';\n\nexport function compileEditorPreview(\n draft: EditorDraftState,\n extras?: {\n revisionId?: number;\n revisionNumber?: number;\n connectors?: CmConnector[];\n publishedAt?: string;\n retailers?: MapAssignRetailer[];\n responsiveOverrides?: CmResponsiveOverride[];\n },\n): PublishedDocument {\n const outdoor = draft.levels.find((level) => level.kind === 'outdoor');\n return compileDocument({\n revisionId: extras?.revisionId ?? 0,\n revisionNumber: extras?.revisionNumber ?? 0,\n centerId: draft.centerId,\n mapId: draft.mapId,\n theme: draft.theme,\n baseSvgUrl: draft.baseSvgUrl ?? outdoor?.sourceSvgUrl ?? null,\n baseViewbox: outdoor?.sourceViewbox ?? null,\n buildings: draft.buildings,\n levels: draft.levels,\n shapes: draft.shapes.filter((s) => !s.orphanedAt),\n assignments: draft.assignments,\n anchors: draft.anchors,\n edges: draft.edges,\n connectors: extras?.connectors ?? draft.connectors ?? [],\n amenities: draft.amenities,\n responsiveOverrides:\n extras?.responsiveOverrides ?? draft.responsiveOverrides ?? [],\n publishedAt: extras?.publishedAt,\n retailers: extras?.retailers,\n /** Prefer already-resolved CDN URLs on draft levels (outdoor SVG). */\n resolveSvgUrl: (key) => {\n if (!key) return null;\n const match = draft.levels.find(\n (l) => l.sourceSvgKey === key || l.sourceSvgUrl === key,\n );\n return match?.sourceSvgUrl ?? key;\n },\n });\n}\n","import type { DeviceType } from '../core';\n\nexport type RestoredEditorSection = {\n section: 'edit-map' | 'wayfinding' | 'map-responsiveness';\n levelId: number | null;\n device?: DeviceType;\n};\n\nconst memory = new Map<number, RestoredEditorSection>();\nconst MAX_REMEMBERED_MAPS = 20;\n\nconst storageKey = (mapId: number) => `eyeon-map-editor-section:${mapId}`;\n\nfunction dropLegacyStorage(mapId: number): void {\n try {\n sessionStorage.removeItem(storageKey(mapId));\n } catch {\n /* private mode / SSR */\n }\n}\n\n/**\n * Keep Edit Map / Wayfinding / Map Responsiveness open across an in-page remount (save).\n * Memory only — a full page refresh returns to Map options.\n */\nexport function markEditorSection(\n mapId: number,\n restored: RestoredEditorSection,\n): void {\n memory.delete(mapId);\n memory.set(mapId, restored);\n if (memory.size > MAX_REMEMBERED_MAPS) {\n const oldest = memory.keys().next().value;\n if (oldest != null) memory.delete(oldest);\n }\n dropLegacyStorage(mapId);\n}\n\nexport function peekEditorSection(mapId: number): RestoredEditorSection | null {\n dropLegacyStorage(mapId);\n return memory.get(mapId) ?? null;\n}\n\nexport function clearEditorSection(mapId: number): void {\n memory.delete(mapId);\n dropLegacyStorage(mapId);\n}\n","const memory = new Set<number>();\n\nconst storageKey = (mapId: number) => `eyeon-map-return-floors:${mapId}`;\n\nfunction storage(): Storage | null {\n try {\n return sessionStorage;\n } catch {\n return null;\n }\n}\n\n/** Remember to reopen the floors list after a remount (reload after add). */\nexport function markReturnToFloorsList(mapId: number): void {\n memory.add(mapId);\n storage()?.setItem(storageKey(mapId), '1');\n}\n\nexport function consumeReturnToFloorsList(mapId: number): boolean {\n const stored = storage()?.getItem(storageKey(mapId)) === '1';\n const pending = memory.has(mapId) || stored;\n clearReturnToFloorsList(mapId);\n return pending;\n}\n\nexport function clearReturnToFloorsList(mapId: number): void {\n memory.delete(mapId);\n storage()?.removeItem(storageKey(mapId));\n}\n","import React from 'react';\n\n/** Edit Map / Wayfinding graph paper strength. Per-user, not per center. */\nexport type MapGridPrefs = {\n /** 0–0.3. The slider still travels 0–100. Diagonals stay at half this value. */\n gridOpacity: number;\n};\n\n/** Right end of the slider. The control itself stays 0–100. */\nexport const MAX_GRID_OPACITY = 0.3;\nexport const DEFAULT_GRID_OPACITY = 0.13;\n\nexport function clampGridOpacity(value: number): number {\n if (!Number.isFinite(value)) return DEFAULT_GRID_OPACITY;\n return Math.min(MAX_GRID_OPACITY, Math.max(0, Math.round(value * 1000) / 1000));\n}\n\nfunction gridOpacityFromSlider(percent: number): number {\n return clampGridOpacity((percent / 100) * MAX_GRID_OPACITY);\n}\n\nfunction sliderPercentFromGridOpacity(opacity: number): number {\n return Math.round((clampGridOpacity(opacity) / MAX_GRID_OPACITY) * 100);\n}\n\nexport function GridPrefsControl({\n gridOpacity,\n onChange,\n}: {\n gridOpacity: number;\n /** Fires on every slider move so the host can update the canvas and persist immediately. */\n onChange: (prefs: MapGridPrefs) => void;\n}) {\n const percent = sliderPercentFromGridOpacity(gridOpacity);\n const prefsFromInput = (value: string): MapGridPrefs => ({\n gridOpacity: gridOpacityFromSlider(Number(value)),\n });\n return (\n <div className=\"eyeon-map-editor__grid-prefs\">\n <label className=\"eyeon-map-editor__grid-prefs-opacity\">\n Grid Opacity\n <input\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={percent}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-label=\"Grid Opacity\"\n data-eyeon-grid-opacity=\"\"\n onInput={(event) => onChange(prefsFromInput(event.currentTarget.value))}\n onChange={(event) => onChange(prefsFromInput(event.currentTarget.value))}\n />\n </label>\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport type {\n BatchOp,\n CmShapeAssignment,\n DeviceType,\n MapAssignKiosk,\n MapAssignRetailer,\n MapEditorHost,\n PublishedDocument,\n ResponsiveCamera,\n RouteCurve,\n ShapeKind,\n Vec3,\n} from '../core';\nimport type { ShapeGeometry, ShapeLabel, ShapeStyle } from '../core';\nimport { assignmentVisualPatch, applyBulkAssignPatch, DEFAULT_LABEL_ALIGN, emptyResponsiveOverrideInput, emptyShapeAssignment, geometryBBox, hasBuildingFloors, MAP_NO_FLOORS_MESSAGE, mergeResponsiveOverrides, mergeTheme, nextLowerBuildingFloor, parseShapeAssignment, poseToResponsiveFields, shiftRouteCurveForAnchor, RESPONSIVE_DEVICE_TABS, responsiveSlotKey, viewerLevelIdAfterShapeSelect } from '../core';\nimport type { CameraViewSnapshot } from '../viewer/components/CameraRig';\nimport type { BulkAssignPatch } from '../core';\nimport { MapControls } from '../viewer/ui/MapControls';\nimport {\n editorFloorControlLevels,\n isEditorSection,\n levelIdOnEnterDefaultMap,\n levelIdOnEnterEditMap,\n levelIdOnEnterWayfinding,\n portalCenterSurface,\n wayfindingOutdoorReadOnly,\n} from './portalSurface';\nimport { EditorCanvas, type EditorCanvasHandle } from './canvas/EditorCanvas';\nimport {\n applyBeforeUnloadWarning,\n beforeUnloadTargets,\n editorShouldWarnOnLeave,\n} from './dirty';\nimport {\n resolvedConnectorKind,\n type VerticalRailKind,\n} from './connectorAssignments';\nimport {\n applyDraftOps,\n coalesceDraftOp,\n orderBatchOpsForPersist,\n shapeKeyTakenOnLevel,\n type EditorDraftState,\n} from './draftOps';\nimport { ConnectorAssign } from './panels/ConnectorAssign';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport { ClassicMapFooter } from './panels/ClassicMapFooter';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { CatalogKioskForm } from './panels/CatalogKioskForm';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { isAssignableKind } from './railAssignments';\nimport {\n catalogKioskShapeOptions,\n isKioskScreenKind,\n shapeIdForCatalogKiosk,\n} from './railKiosks';\nimport { allocShapeKey, copyShapeToLevelOps, liveShapeKeysOnLevel } from './shapeCopy';\nimport { nextSelectedShapeIds, type ShapeSelectOpts } from './shapeSelection';\nimport { compileEditorPreview } from './previewDocument';\nimport { geometryForLabelText, DEFAULT_LABEL_SIZE } from './labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n canonicalizeEntranceLabel,\n geometryForEntranceIcon,\n isEntranceIcon,\n} from './entranceIcon';\nimport {\n cloneHistorySnapshot,\n emptyEditorHistory,\n isEditableTypingTarget,\n isEditorRedoHotkey,\n isEditorUndoHotkey,\n pushEditorHistory,\n redoEditorHistory,\n undoEditorHistory,\n type EditorHistorySnapshot,\n} from './history';\nimport {\n connectRouteAnchorToRouteOps,\n connectShapeToRouteOps,\n deleteRouteAnchorOps,\n deleteRouteEdgeOps,\n ensureShapeRouteAnchorOps,\n insertJunctionOnWalkEdgeOps,\n linkRouteAnchorsOp,\n showsWayfinding,\n walkEdgeExists,\n} from './routeStubs';\nimport {\n clearEditorSection,\n markEditorSection,\n peekEditorSection,\n} from './editorSectionReturn';\nimport {\n clearReturnToFloorsList,\n consumeReturnToFloorsList,\n markReturnToFloorsList,\n} from './floorsListReturn';\nimport {\n EditorHistoryButtons,\n EditorToolButtons,\n isWayfindingEditorTool,\n nextEditorTool,\n toolHint,\n type EditorTool,\n} from './tools';\nimport {\n clampGridOpacity,\n DEFAULT_GRID_OPACITY,\n GridPrefsControl,\n type MapGridPrefs,\n} from './GridPrefsControl';\nimport './editor.css';\n\nexport type { EditorDraftState } from './draftOps';\nexport type { MapEditorHost } from '../core';\nexport type { EditorTool } from './tools';\n\nexport type ResponsiveOverrideInput = {\n levelId: number;\n device: DeviceType;\n camera: ResponsiveCamera;\n controls: Vec3;\n};\n\nexport interface MapEditorProps {\n /**\n * Where the editor is embedded. `PORTAL` (default) always includes Map\n * options (LeftRail: Floors, Kiosks, Settings, plus Edit Map — never viewer\n * chrome). Default center is MapViewer (click-to-assign, no grid). Edit\n * Map swaps in the geometry canvas and editor grid. `WEBSITE` is canvas +\n * toolbar only — public sites should use `MapViewer`, not this editor.\n */\n host?: MapEditorHost;\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n canResponsiveness?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onSaveResponsive?: (items: ResponsiveOverrideInput[]) => Promise<void>;\n /** Reload the draft from the database after discarding local edits. */\n onDiscard?: () => Promise<void> | void;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n /**\n * Center retailers for the default-map assign form (v1 retailer dropdown).\n */\n retailers?: MapAssignRetailer[];\n /** Center kiosks for leftover ID-only assignments; new kiosks are named in Assign. */\n kiosks?: MapAssignKiosk[];\n /**\n * Media proxy base for remote http(s) media, same contract as v1\n * `IMAGE_PROXY_URL`. Required whenever the outdoor SVG is served from an\n * origin that does not send CORS headers. Inlined amenity data URLs skip it.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail, after the built-in Classic links. */\n sidebarFooter?: ReactNode;\n /**\n * Fires when local edits, an in-progress shape/route, or a save-in-flight\n * should block leaving the page. Quiet again after a successful save.\n */\n onDirtyChange?: (state: { dirty: boolean; saving: boolean }) => void;\n /**\n * PORTAL host: fired after this center is switched back to Classic.\n * The editor unmounts once the host renders the Classic map.\n */\n onMapVersionChanged?: (mapVersion: 1 | 2) => void;\n /**\n * Edit Map and Wayfinding graph paper strength. Saved per user by the host.\n * The grid always paints above shapes.\n */\n gridOpacity?: number;\n /** Fires on every slider move so the host can update the canvas and persist immediately. */\n onGridPrefsChange?: (prefs: MapGridPrefs) => void;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n webApiURI,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n canResponsiveness = false,\n onBatch,\n onPublish,\n onSaveResponsive,\n onDiscard,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n retailers = [],\n kiosks = [],\n imageProxyUrl,\n className,\n sidebarFooter,\n onDirtyChange,\n onMapVersionChanged,\n gridOpacity: gridOpacityProp = DEFAULT_GRID_OPACITY,\n onGridPrefsChange,\n}: MapEditorProps) {\n const restoredSection = peekEditorSection(draft.mapId);\n const [section, setSection] = useState<RailSection | null>(() => {\n if (consumeReturnToFloorsList(draft.mapId)) return 'floors';\n return restoredSection?.section ?? null;\n });\n const [responsiveDevice, setResponsiveDevice] = useState<DeviceType>(\n () => restoredSection?.device ?? 'admin_portal',\n );\n const [pendingResponsive, setPendingResponsive] = useState<\n Record<string, ResponsiveOverrideInput>\n >({});\n const [previewEpoch, setPreviewEpoch] = useState(0);\n const [activeLevelId, setActiveLevelId] = useState<number | null>(() => {\n const restoredLevel = peekEditorSection(draft.mapId)?.levelId;\n if (\n restoredLevel != null &&\n draft.levels.some((level) => level.id === restoredLevel)\n ) {\n return restoredLevel;\n }\n return levelIdOnEnterEditMap(draft.levels);\n });\n const [selectedShapeIds, setSelectedShapeIds] = useState<number[]>([]);\n const [selectedCatalogKioskId, setSelectedCatalogKioskId] = useState<\n number | null\n >(null);\n const selectedShapeId = selectedShapeIds[0] ?? null;\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [listFocusNonce, setListFocusNonce] = useState(0);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<EditorTool>('select');\n const [gridOpacity, setGridOpacity] = useState(() =>\n clampGridOpacity(gridOpacityProp),\n );\n const [editVersion, setEditVersion] = useState(0);\n const [needsPublish, setNeedsPublish] = useState(false);\n const [saving, setSaving] = useState(false);\n const [history, setHistory] = useState(emptyEditorHistory);\n const [routeDraftActive, setRouteDraftActive] = useState(false);\n const canvasRef = useRef<EditorCanvasHandle>(null);\n const historyRef = useRef(history);\n const pendingOps = useRef<BatchOp[]>([]);\n const nextTempId = useRef(-1);\n const historyGestureRef = useRef(false);\n historyRef.current = history;\n const showMapOptions = host === 'PORTAL';\n const centerSurface = portalCenterSurface(host, section);\n const isEditMap = centerSurface === 'editor';\n const historyMetaRef = useRef({\n isEditMap,\n selectedShapeId,\n selectedAnchorIds,\n });\n historyMetaRef.current = { isEditMap, selectedShapeId, selectedAnchorIds };\n\n useEffect(() => {\n setGridOpacity(clampGridOpacity(gridOpacityProp));\n }, [gridOpacityProp]);\n\n const handleGridPrefsChange = useCallback((prefs: MapGridPrefs) => {\n const gridOpacity = clampGridOpacity(prefs.gridOpacity);\n setGridOpacity(gridOpacity);\n onGridPrefsChange?.({ gridOpacity });\n }, [onGridPrefsChange]);\n\n useEffect(() => {\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n setEditVersion(0);\n setNeedsPublish(false);\n setPendingResponsive({});\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n }, [draft.mapId, draft.centerId]);\n\n useEffect(() => {\n if (\n section === 'edit-map' ||\n section === 'wayfinding' ||\n section === 'map-responsiveness'\n ) {\n markEditorSection(draft.mapId, {\n section,\n levelId: activeLevelId,\n device: section === 'map-responsiveness' ? responsiveDevice : undefined,\n });\n return;\n }\n clearEditorSection(draft.mapId);\n }, [activeLevelId, draft.mapId, responsiveDevice, section]);\n\n // Levels can arrive after the first render, or the active one can be deleted.\n // Default map / Wayfinding must not stay on Outdoor — that hides floors.\n useEffect(() => {\n const exists = draft.levels.some((level) => level.id === activeLevelId);\n if (!exists) {\n setActiveLevelId(\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : isEditorSection(section)\n ? levelIdOnEnterEditMap(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels),\n );\n return;\n }\n if (section === 'edit-map') return;\n const active = draft.levels.find((level) => level.id === activeLevelId);\n if (active?.kind !== 'outdoor') return;\n const next =\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels);\n if (next != null && next !== activeLevelId) setActiveLevelId(next);\n }, [draft.levels, activeLevelId, section]);\n\n const workingDraft = useMemo(\n () => applyDraftOps(draft, pendingOps.current),\n [draft, editVersion],\n );\n\n const theme = useMemo(\n () => mergeTheme(workingDraft.theme),\n [workingDraft.theme],\n );\n\n const cameraDirty = Object.keys(pendingResponsive).length > 0;\n const pendingEdits = pendingOps.current.length > 0;\n const dirty = pendingEdits || needsPublish || cameraDirty;\n const warnOnLeave = editorShouldWarnOnLeave({\n pendingEdits,\n needsPublish,\n cameraDirty,\n gesture: routeDraftActive,\n saving,\n });\n useEffect(() => {\n onDirtyChange?.({ dirty: warnOnLeave, saving });\n }, [onDirtyChange, saving, warnOnLeave]);\n const warnOnLeaveRef = useRef(warnOnLeave);\n warnOnLeaveRef.current = warnOnLeave;\n useEffect(() => {\n const onBeforeUnload = (event: BeforeUnloadEvent) => {\n applyBeforeUnloadWarning(event, warnOnLeaveRef.current);\n };\n const targets = beforeUnloadTargets(window);\n for (const target of targets) {\n target.addEventListener('beforeunload', onBeforeUnload);\n }\n return () => {\n for (const target of targets) {\n target.removeEventListener('beforeunload', onBeforeUnload);\n }\n };\n }, []);\n const canPersist =\n !saving && dirty && (canEdit || (canResponsiveness && cameraDirty));\n const isResponsiveness = section === 'map-responsiveness';\n const activeLevel = workingDraft.levels.find((l) => l.id === activeLevelId) ?? null;\n const outdoorViewOnly = wayfindingOutdoorReadOnly(section, activeLevel);\n const canDrawOnCanvas = canEdit && !outdoorViewOnly;\n const outdoorLevel = workingDraft.levels.find((l) => l.kind === 'outdoor') ?? null;\n const outdoorShapes =\n outdoorLevel && activeLevel?.kind === 'floor'\n ? workingDraft.shapes.filter((s) => s.levelId === outdoorLevel.id)\n : [];\n const levelShapes = workingDraft.shapes.filter((s) => s.levelId === activeLevelId);\n const openingUnderlayShapes = useMemo(() => {\n const levelsWithShapes = workingDraft.levels.map((lvl) => ({\n ...lvl,\n shapes: workingDraft.shapes.filter((shape) => shape.levelId === lvl.id),\n }));\n const lower = nextLowerBuildingFloor(levelsWithShapes, activeLevelId);\n if (!lower) return [];\n return workingDraft.shapes.filter(\n (shape) => shape.levelId === lower.id && !shape.orphanedAt,\n );\n }, [workingDraft.levels, workingDraft.shapes, activeLevelId]);\n const mergedResponsiveOverrides = useMemo(\n () =>\n mergeResponsiveOverrides(\n workingDraft.responsiveOverrides ?? [],\n Object.values(pendingResponsive),\n ),\n [pendingResponsive, workingDraft.responsiveOverrides],\n );\n const compiledPreview = useMemo(\n () =>\n compileEditorPreview(workingDraft, {\n revisionId: previewDocument?.revisionId,\n revisionNumber: previewDocument?.revisionNumber,\n connectors: workingDraft.connectors,\n publishedAt: previewDocument?.publishedAt,\n retailers,\n responsiveOverrides: mergedResponsiveOverrides,\n }),\n [workingDraft, previewDocument, retailers, mergedResponsiveOverrides],\n );\n const levelAnchors = useMemo(\n () => workingDraft.anchors.filter((a) => a.levelId === activeLevelId),\n [activeLevelId, workingDraft.anchors],\n );\n const levelEdges = useMemo(() => {\n const anchorsById = new Map(\n workingDraft.anchors.map((anchor) => [anchor.id, anchor]),\n );\n return workingDraft.edges.filter(\n (edge) => anchorsById.get(edge.fromAnchorId)?.levelId === activeLevelId,\n );\n }, [activeLevelId, workingDraft.anchors, workingDraft.edges]);\n const selectedShape =\n workingDraft.shapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n workingDraft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const takeSnapshot = (): EditorHistorySnapshot =>\n cloneHistorySnapshot({\n ops: pendingOps.current,\n nextTempId: nextTempId.current,\n selectedShapeId: historyMetaRef.current.selectedShapeId,\n selectedAnchorIds: historyMetaRef.current.selectedAnchorIds,\n });\n\n const applySnapshot = (snapshot: EditorHistorySnapshot) => {\n pendingOps.current = snapshot.ops;\n nextTempId.current = snapshot.nextTempId;\n setSelectedShapeIds(\n snapshot.selectedShapeId == null ? [] : [snapshot.selectedShapeId],\n );\n setSelectedAnchorIds(snapshot.selectedAnchorIds);\n setEditVersion((n) => n + 1);\n };\n\n const recordHistoryStep = (mode: 'step' | 'gesture' | 'none') => {\n if (!historyMetaRef.current.isEditMap || mode === 'none') return;\n if (mode === 'gesture') {\n if (historyGestureRef.current) return;\n historyGestureRef.current = true;\n }\n const next = pushEditorHistory(historyRef.current, takeSnapshot());\n historyRef.current = next;\n setHistory(next);\n };\n\n const queueOp = useCallback(\n (op: BatchOp, historyMode: 'step' | 'gesture' | 'none' = 'step'): number | null => {\n recordHistoryStep(historyMode);\n let next = op;\n if (next.op === 'upsert_shape' && next.shape.id == null) {\n const id = nextTempId.current--;\n next = { ...next, shape: { ...next.shape, id } };\n }\n if (next.op === 'upsert_anchor' && next.anchor.id == null) {\n const id = nextTempId.current--;\n next = { ...next, anchor: { ...next.anchor, id } };\n }\n if (next.op === 'upsert_edge' && next.edge.id == null) {\n const id = nextTempId.current--;\n next = { ...next, edge: { ...next.edge, id } };\n }\n if (next.op === 'upsert_connector' && next.connector.id == null) {\n const id = nextTempId.current--;\n next = { ...next, connector: { ...next.connector, id } };\n }\n pendingOps.current = coalesceDraftOp(pendingOps.current, next);\n setEditVersion((n) => n + 1);\n if (next.op === 'upsert_shape') return next.shape.id ?? null;\n if (next.op === 'upsert_anchor') return next.anchor.id ?? null;\n if (next.op === 'upsert_edge') return next.edge.id ?? null;\n if (next.op === 'upsert_connector') return next.connector.id ?? null;\n return null;\n },\n [],\n );\n\n const endHistoryGesture = useCallback(() => {\n historyGestureRef.current = false;\n }, []);\n\n const undo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const routeKind = canvasRef.current?.consumeRouteUndo();\n if (routeKind === 'clear-only') return;\n const next = undoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const redo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const next = redoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const handleSaveChanges = useCallback(async () => {\n if (saving) return;\n const ops = canEdit ? orderBatchOpsForPersist(pendingOps.current) : [];\n const cameraItems = canResponsiveness ? Object.values(pendingResponsive) : [];\n if (!ops.length && !needsPublish && !cameraItems.length) return;\n if (!canEdit && !cameraItems.length) return;\n pendingOps.current = [];\n setEditVersion((n) => n + 1);\n setSaving(true);\n let persisted = !ops.length;\n const savedCamera = cameraItems;\n try {\n if (cameraItems.length && onSaveResponsive) {\n await onSaveResponsive(cameraItems);\n setPendingResponsive({});\n }\n if (ops.length && onBatch) {\n await onBatch(ops);\n persisted = true;\n }\n await onPublish?.();\n setNeedsPublish(false);\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n } catch {\n if (savedCamera.length) {\n setPendingResponsive((prev) =>\n Object.keys(prev).length ? prev : Object.fromEntries(\n savedCamera.map((item) => [\n responsiveSlotKey(item.levelId, item.device),\n item,\n ]),\n ),\n );\n }\n if (!persisted) {\n pendingOps.current = ops;\n setEditVersion((n) => n + 1);\n } else {\n setNeedsPublish(true);\n }\n } finally {\n setSaving(false);\n }\n }, [\n canEdit,\n canResponsiveness,\n needsPublish,\n onBatch,\n onPublish,\n onSaveResponsive,\n pendingResponsive,\n saving,\n ]);\n\n const handleDiscardChanges = useCallback(async () => {\n if (saving || !dirty) return;\n if (!canEdit && !cameraDirty) return;\n if (\n !window.confirm(\n 'Discard unsaved changes and reload the map from the database?',\n )\n ) {\n return;\n }\n canvasRef.current?.consumeRouteUndo();\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setNeedsPublish(false);\n setPendingResponsive({});\n setPreviewEpoch((n) => n + 1);\n setEditVersion((n) => n + 1);\n setSaving(true);\n try {\n await onDiscard?.();\n } finally {\n setSaving(false);\n }\n }, [cameraDirty, canEdit, dirty, onDiscard, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n // Leave item-options (level 3) whenever the rail module changes so\n // Stores / Amenities / … always open on their list (level 2).\n setSelectedShapeIds([]);\n setSelectedCatalogKioskId(null);\n setSelectedAnchorIds([]);\n setHoveredShapeId(null);\n if (isEditorSection(section) && !isEditorSection(next)) {\n setTool('select');\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n } else if (next === 'edit-map') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterEditMap(draft.levels));\n } else if (next === 'wayfinding') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterWayfinding(draft.levels));\n } else if (next === 'map-responsiveness') {\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n }\n setSection(next);\n },\n [draft.levels, section],\n );\n\n const handleCanvasLevelChange = (levelId: number) => {\n if (levelId === activeLevelId) return;\n setSelectedShapeIds([]);\n setSelectedAnchorIds([]);\n setActiveLevelId(levelId);\n const nextLevel = workingDraft.levels.find((level) => level.id === levelId);\n if (wayfindingOutdoorReadOnly(section, nextLevel)) setTool('select');\n };\n\n useEffect(() => {\n if (!isEditMap || !canEdit) return;\n const onKey = (e: KeyboardEvent) => {\n if (isEditableTypingTarget(e.target)) return;\n if (isEditorUndoHotkey(e)) {\n e.preventDefault();\n undo();\n return;\n }\n if (isEditorRedoHotkey(e)) {\n e.preventDefault();\n redo();\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [canEdit, isEditMap, redo, undo]);\n\n const handleSelectShape = useCallback(\n (id: number | null, opts?: ShapeSelectOpts) => {\n const shape = id == null ? null : workingDraft.shapes.find((s) => s.id === id);\n const additive =\n Boolean(opts?.additive) &&\n section !== 'edit-map' &&\n section !== 'wayfinding' &&\n (shape == null || isAssignableKind(shape.kind));\n setSelectedShapeIds((prev) => nextSelectedShapeIds(prev, id, { additive }));\n if (id != null) setSelectedCatalogKioskId(null);\n setHoveredShapeId(null);\n if (id == null) return;\n if (shape && !additive) {\n const nextLevelId =\n section === 'edit-map' || section === 'wayfinding'\n ? shape.levelId\n : viewerLevelIdAfterShapeSelect(\n workingDraft.levels,\n activeLevelId,\n shape.levelId,\n );\n setActiveLevelId(nextLevelId);\n }\n if (additive) return;\n setSection((current) => {\n if (\n current === 'edit-map' ||\n current === 'wayfinding' ||\n current === 'map-responsiveness'\n ) {\n return current;\n }\n if (shape?.kind === 'custom') return 'custom';\n if (\n current === 'unassigned' ||\n current === 'escalators' ||\n current === 'elevators'\n ) {\n return current;\n }\n const connectorKind = shape\n ? resolvedConnectorKind(shape, workingDraft.anchors, workingDraft.connectors)\n : null;\n if (connectorKind === 'escalator') return 'escalators';\n if (connectorKind === 'elevator') return 'elevators';\n if (shape?.kind === 'unit' || shape?.kind === 'parking_zone') return 'stores';\n if (shape?.kind === 'amenity') return 'amenities';\n if (shape?.kind === 'kiosk_screen') return 'kiosks';\n return 'selection';\n });\n },\n [\n activeLevelId,\n section,\n workingDraft.anchors,\n workingDraft.connectors,\n workingDraft.levels,\n workingDraft.shapes,\n ],\n );\n\n const handleToolChange = (next: EditorTool) => {\n const requested =\n section === 'wayfinding' && !isWayfindingEditorTool(next)\n ? 'select'\n : next;\n const resolved = nextEditorTool(tool, requested);\n setTool(resolved);\n if (!showsWayfinding(resolved, section === 'wayfinding')) setSelectedAnchorIds([]);\n };\n\n const handleRenameShape = (key: string) => {\n if (section === 'wayfinding' || !selectedShape || !canEdit) return;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n selectedShape.levelId,\n key,\n )\n ) {\n return;\n }\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n });\n };\n\n const handleChangeLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n if (levelId === selectedShape.levelId) return null;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n levelId,\n selectedShape.key,\n )\n ) {\n return 'That ID is already used on this floor.';\n }\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n },\n },\n ];\n for (const anchor of workingDraft.anchors) {\n if (anchor.shapeId !== selectedShape.id || anchor.levelId === levelId) {\n continue;\n }\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: anchor.id,\n levelId,\n shapeId: anchor.shapeId,\n kind: anchor.kind,\n x: anchor.x,\n y: anchor.y,\n connectorId: anchor.connectorId,\n },\n });\n }\n queueOpBatch(ops);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleCopyToLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n const copied = copyShapeToLevelOps({\n shape: selectedShape,\n assignment: selectedAssignment,\n targetLevelId: levelId,\n shapes: workingDraft.shapes,\n allocId: () => nextTempId.current--,\n });\n if (!copied) return 'Pick a different floor.';\n queueOpBatch(copied.ops);\n setSelectedShapeIds([copied.shapeId]);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleDeleteShape = () => {\n if (section === 'wayfinding' || !selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeIds([]);\n };\n\n const handleUpdateShapeGeometry = (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => {\n if (section === 'wayfinding' || !canDrawOnCanvas) return;\n const shape = workingDraft.shapes.find((s) => s.id === shapeId);\n if (!shape) return;\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry,\n bbox: geometryBBox(geometry),\n geometryLocked: true,\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n };\n\n const handleUpdateLabel = (label: ShapeLabel, opts?: { live?: boolean }) => {\n if (!selectedShape || !canEdit) return;\n if (isEntranceIcon(selectedShape)) {\n const nextLabel =\n canonicalizeEntranceLabel({\n ...selectedShape,\n label,\n }) ?? label;\n const size = nextLabel.size ?? selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const sameLabel =\n size === (selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE) &&\n (nextLabel.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (nextLabel.color ?? '') === (selectedShape.label.color ?? '') &&\n (nextLabel.imageKey ?? '') === (selectedShape.label.imageKey ?? '');\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForEntranceIcon(selectedShape.geometry, size);\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n origin: selectedShape.origin,\n sourceSvgId: selectedShape.sourceSvgId,\n label: nextLabel,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const size = label.size ?? selectedShape.label.size ?? DEFAULT_LABEL_SIZE;\n const sameLabel =\n (label.text ?? '') === (selectedShape.label.text ?? '') &&\n size === (selectedShape.label.size ?? DEFAULT_LABEL_SIZE) &&\n (label.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (label.color ?? '') === (selectedShape.label.color ?? '') &&\n (label.align ?? DEFAULT_LABEL_ALIGN) ===\n (selectedShape.label.align ?? DEFAULT_LABEL_ALIGN);\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForLabelText(\n selectedShape.geometry,\n label.text ?? selectedShape.label.text ?? '',\n size,\n );\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n label,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n };\n\n const handleChangeKind = (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n });\n if (kind === 'custom') {\n queueOp({\n op: 'upsert_assignment',\n assignment: emptyShapeAssignment(selectedShape.id, 'custom'),\n });\n } else if (selectedShape.kind === 'custom') {\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\n }\n };\n\n const handleSaveAssignment = (assignment: CmShapeAssignment) => {\n if (!selectedShape || !canEdit) return;\n const retailer = retailers.find((item) => item.id === assignment.retailerId);\n const visuals = assignmentVisualPatch(selectedShape, assignment, retailer);\n queueOp({ op: 'upsert_assignment', assignment });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n },\n 'none',\n );\n };\n\n const handleClearAssignment = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: { ...selectedShape.style, fill: undefined },\n label: {\n ...selectedShape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n },\n 'none',\n );\n };\n\n const handleLinkCatalogKiosk = (kioskId: number, shapeId: number | null) => {\n if (!canEdit) return;\n const kiosk = kiosks.find((item) => item.id === kioskId);\n const previousShapeId = shapeIdForCatalogKiosk(\n kioskId,\n workingDraft.assignments,\n );\n const ops: BatchOp[] = [];\n const clearShape = (id: number) => {\n const shape = workingDraft.shapes.find((row) => row.id === id);\n if (!shape) return;\n ops.push({ op: 'delete_assignment', shapeId: id });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: { ...shape.style, fill: undefined },\n label: {\n ...shape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n });\n };\n if (previousShapeId != null && previousShapeId !== shapeId) {\n clearShape(previousShapeId);\n }\n if (shapeId == null) {\n if (ops.length) queueOpBatch(ops);\n return;\n }\n const shape = workingDraft.shapes.find((row) => row.id === shapeId);\n if (!shape || !isKioskScreenKind(shape.kind)) return;\n const existing = workingDraft.assignments.find((row) => row.shapeId === shapeId);\n const base = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n const assignment = parseShapeAssignment(\n {\n ...base,\n targetType: 'kiosk',\n kioskId,\n customLabel: kiosk?.name?.trim() || base.customLabel,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n },\n shape.kind,\n );\n const visuals = assignmentVisualPatch(shape, assignment);\n ops.push({ op: 'upsert_assignment', assignment });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n });\n queueOpBatch(ops);\n };\n\n const handleBulkAssign = (patch: BulkAssignPatch) => {\n if (!canEdit || selectedShapeIds.length < 2) return;\n const ops: BatchOp[] = [];\n for (const id of selectedShapeIds) {\n const shape = workingDraft.shapes.find((item) => item.id === id);\n if (!shape || !isAssignableKind(shape.kind)) continue;\n const existing = workingDraft.assignments.find((row) => row.shapeId === id);\n const current = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(id, shape.kind);\n const patched = applyBulkAssignPatch(current, patch);\n const retailer = retailers.find((item) => item.id === patched.retailerId);\n const visuals = assignmentVisualPatch(shape, patched, retailer);\n ops.push({ op: 'upsert_assignment', assignment: patched });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n });\n }\n if (ops.length) queueOpBatch(ops);\n };\n\n const queueOpBatch = (ops: BatchOp[]) => {\n ops.forEach((op, index) => queueOp(op, index === 0 ? 'step' : 'none'));\n };\n\n const selectedConnectorKind = selectedShape\n ? resolvedConnectorKind(selectedShape, workingDraft.anchors, workingDraft.connectors)\n : null;\n const connectorRailKind: VerticalRailKind | null =\n selectedConnectorKind === 'escalator' || selectedConnectorKind === 'elevator'\n ? selectedConnectorKind\n : null;\n\n const assignPanel = (\n <>\n <Inspector\n shape={selectedShape}\n assignment={selectedAssignment}\n amenities={workingDraft.amenities}\n retailers={retailers}\n kiosks={kiosks}\n levelShapeKeys={levelShapes\n .filter((s) => !selectedShapeIds.includes(s.id))\n .map((s) => s.key)}\n canEdit={canEdit}\n showAssignment={section !== 'edit-map'}\n emptyHint={\n section === 'stores' ||\n section === 'amenities' ||\n section === 'kiosks' ||\n section === 'custom' ||\n section === 'unassigned' ||\n section === 'escalators' ||\n section === 'elevators'\n ? ''\n : undefined\n }\n selectedShapes={workingDraft.shapes.filter((s) =>\n selectedShapeIds.includes(s.id),\n )}\n selectedAssignments={workingDraft.assignments.filter((row) =>\n selectedShapeIds.includes(row.shapeId),\n )}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onChangeLevel={section === 'edit-map' ? handleChangeLevel : undefined}\n onCopyToLevel={section === 'edit-map' ? handleCopyToLevel : undefined}\n levels={editorFloorControlLevels('edit-map', workingDraft.levels)}\n onDelete={handleDeleteShape}\n onClearAssignment={handleClearAssignment}\n onUpdateLabel={handleUpdateLabel}\n onSaveAssignment={handleSaveAssignment}\n onBulkAssign={handleBulkAssign}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.STORE_TEXT_COLOR}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n kioskIconColor={theme.KIOSK_ICON_COLOR}\n />\n {section !== 'edit-map' && selectedShape && connectorRailKind ? (\n <ConnectorAssign\n shape={selectedShape}\n railKind={connectorRailKind}\n canEdit={canEdit}\n assignment={selectedAssignment}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.CONNECTOR_ICON_COLOR}\n ctx={{\n mapId: workingDraft.mapId,\n levels: workingDraft.levels,\n shapes: workingDraft.shapes,\n anchors: workingDraft.anchors,\n edges: workingDraft.edges,\n connectors: workingDraft.connectors,\n allocId: () => nextTempId.current--,\n }}\n onApplyOps={queueOpBatch}\n onSaveAssignment={handleSaveAssignment}\n />\n ) : null}\n </>\n );\n\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const catalogKioskPanel = selectedCatalogKiosk ? (\n <CatalogKioskForm\n kiosk={selectedCatalogKiosk}\n shapeOptions={catalogKioskShapeOptions(workingDraft.shapes)}\n assignedShapeId={shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n workingDraft.assignments,\n )}\n canEdit={canEdit}\n onAssign={(shapeId) =>\n handleLinkCatalogKiosk(selectedCatalogKiosk.id, shapeId)\n }\n />\n ) : null;\n\n const handleCameraChange = useCallback(\n (view: CameraViewSnapshot) => {\n if (section !== 'map-responsiveness' || activeLevelId == null) return;\n const fields = poseToResponsiveFields({\n zoom: view.zoom,\n position: view.position,\n target: view.target,\n });\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]: {\n levelId: activeLevelId,\n device: responsiveDevice,\n camera: fields.camera,\n controls: fields.controls,\n },\n }));\n },\n [activeLevelId, responsiveDevice, section],\n );\n\n const handleCameraReset = useCallback(() => {\n if (activeLevelId == null) return;\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]:\n emptyResponsiveOverrideInput(activeLevelId, responsiveDevice),\n }));\n }, [activeLevelId, responsiveDevice]);\n\n const toolGroup = section === 'wayfinding' ? 'route' : section === 'edit-map' ? 'map' : undefined;\n\n return (\n <div className={`eyeon-map-editor eyeon-map-editor--${host} ${className ?? ''}`}>\n {showMapOptions ? (\n <LeftRail\n section={section}\n onSectionChange={handleSectionChange}\n draft={workingDraft}\n activeLevelId={activeLevelId}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n onSelectShape={handleSelectShape}\n onHoverShape={setHoveredShapeId}\n onListFocus={() => setListFocusNonce((n) => n + 1)}\n retailers={retailers}\n kiosks={kiosks}\n selectedCatalogKioskId={selectedCatalogKioskId}\n onSelectCatalogKiosk={setSelectedCatalogKioskId}\n canFloors={canFloors}\n canSettings={canSettings}\n canResponsiveness={canResponsiveness}\n onImportSvg={onImportSvg}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n markReturnToFloorsList(draft.mapId);\n try {\n const id = await onCreateLevel(input);\n setSection('floors');\n clearReturnToFloorsList(draft.mapId);\n return id;\n } catch (error) {\n clearReturnToFloorsList(draft.mapId);\n throw error;\n }\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={(partial) => {\n if (!canSettings) return;\n queueOp(\n { op: 'update_theme', theme: { ...workingDraft.theme, ...partial } },\n 'none',\n );\n }}\n footer={\n <>\n {host === 'PORTAL' ? (\n <ClassicMapFooter\n webApiURI={webApiURI}\n centerId={draft.centerId}\n unsaved={warnOnLeave}\n onMapVersionChanged={onMapVersionChanged}\n />\n ) : null}\n {sidebarFooter ? (\n <div className=\"eyeon-map-rail__footer\">{sidebarFooter}</div>\n ) : null}\n </>\n }\n catalogKioskPanel={catalogKioskPanel}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n {toolHint(tool, 'map') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'map')}</p>\n ) : null}\n {assignPanel}\n </>\n }\n wayfindingPanel={\n <>\n {outdoorViewOnly ? (\n <p className=\"eyeon-map-rail__hint\">\n Outdoor is view-only in Wayfinding. Switch to a floor to edit routes.\n </p>\n ) : toolHint(tool, 'route') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'route')}</p>\n ) : null}\n <div className=\"eyeon-map-rail__tool-extras\">\n <div className=\"eyeon-map-rail__stat\">\n {levelAnchors.length} path points · {levelEdges.length} connections\n </div>\n {canFloors && activeLevelId != null && !outdoorViewOnly && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n </>\n }\n mapResponsivenessPanel={\n <p className=\"eyeon-map-rail__hint\">\n Pan and zoom the map for each floor and device. Reset fits the\n whole floor so you can start from the default view. Save Changes\n stores that starting view for Admin Portal, website, and kiosk.\n </p>\n }\n />\n ) : null}\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {isResponsiveness ? (\n <div className=\"eyeon-map-editor__device-tabs\" role=\"tablist\" aria-label=\"Device\">\n {RESPONSIVE_DEVICE_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={responsiveDevice === tab.id}\n className={\n responsiveDevice === tab.id\n ? 'eyeon-map-editor__device-tab is-active'\n : 'eyeon-map-editor__device-tab'\n }\n onClick={() => setResponsiveDevice(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n ) : isEditMap ? (\n <EditorToolButtons\n tool={tool}\n onToolChange={handleToolChange}\n canEdit={canDrawOnCanvas}\n group={toolGroup}\n />\n ) : null}\n </div>\n <div className=\"eyeon-map-editor__toolbar-side\">\n {isEditMap ? (\n <GridPrefsControl\n gridOpacity={gridOpacity}\n onChange={handleGridPrefsChange}\n />\n ) : null}\n <div className=\"eyeon-map-editor__actions\">\n {isEditMap ? (\n <EditorHistoryButtons\n canUndo={history.past.length > 0 || routeDraftActive}\n canRedo={history.future.length > 0}\n disabled={!canEdit || saving}\n onUndo={undo}\n onRedo={redo}\n />\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-editor__discard\"\n aria-label=\"Discard Changes\"\n onClick={() => void handleDiscardChanges()}\n disabled={!canPersist}\n >\n Discard Changes\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__save\"\n aria-label={dirty ? 'Save Changes (unsaved edits)' : 'Save Changes'}\n onClick={() => void handleSaveChanges()}\n disabled={!canPersist}\n >\n {dirty ? (\n <span className=\"eyeon-map-editor__save-badge\" aria-hidden=\"true\" />\n ) : null}\n {saving ? 'Saving…' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n\n {centerSurface === 'viewer' ? (\n <PreviewOverlay\n key={previewEpoch}\n document={compiledPreview}\n host={isResponsiveness ? 'WEBSITE' : 'PORTAL_ASSIGN'}\n selectedShapeId={isResponsiveness ? null : selectedShapeId}\n selectedShapeIds={isResponsiveness ? [] : selectedShapeIds}\n hoveredShapeId={isResponsiveness ? null : hoveredShapeId}\n focusNonce={isResponsiveness ? undefined : listFocusNonce}\n onSelectShape={isResponsiveness ? undefined : handleSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n device={isResponsiveness ? responsiveDevice : undefined}\n captureCamera={isResponsiveness}\n onCameraChange={isResponsiveness ? handleCameraChange : undefined}\n onCameraReset={isResponsiveness ? handleCameraReset : undefined}\n />\n ) : (\n <>\n <div className=\"eyeon-map-editor__canvas-wrap\">\n <EditorCanvas\n ref={canvasRef}\n level={activeLevel}\n shapes={levelShapes.filter((s) => !s.orphanedAt)}\n underlayShapes={outdoorShapes.filter((s) => !s.orphanedAt)}\n openingUnderlayShapes={openingUnderlayShapes}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={workingDraft.assignments}\n retailers={retailers}\n amenities={workingDraft.amenities}\n theme={theme}\n tool={tool}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={workingDraft.baseSvgUrl ?? null}\n baseViewbox={outdoorLevel?.sourceViewbox ?? null}\n outdoorSvgUrl={\n outdoorLevel?.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null\n }\n imageProxyUrl={imageProxyUrl}\n emptyMessage={\n hasBuildingFloors(workingDraft.levels) || outdoorLevel\n ? undefined\n : MAP_NO_FLOORS_MESSAGE\n }\n interactiveOnly={activeLevel?.kind === 'outdoor'}\n showGrid\n gridOpacity={gridOpacity}\n routeMode={section === 'wayfinding'}\n readOnly={outdoorViewOnly}\n onUndo={undo}\n onRouteDraftActiveChange={setRouteDraftActive}\n onToolChange={handleToolChange}\n onSelectShape={handleSelectShape}\n onSelectAnchors={setSelectedAnchorIds}\n onCreateRouteSegment={(start, end) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id1 = nextTempId.current--;\n const id2 = nextTempId.current--;\n queueOpBatch([\n {\n op: 'upsert_anchor',\n anchor: {\n id: id1,\n levelId: activeLevel.id,\n x: start.x,\n y: start.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_anchor',\n anchor: {\n id: id2,\n levelId: activeLevel.id,\n x: end.x,\n y: end.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: id1,\n toAnchorId: id2,\n kind: 'walk',\n },\n },\n ]);\n return id2;\n }}\n onCreateRoutePoint={(point, prevAnchorId) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id = queueOp({\n op: 'upsert_anchor',\n anchor: {\n levelId: activeLevel.id,\n x: point.x,\n y: point.y,\n kind: 'junction',\n },\n });\n if (\n id != null &&\n prevAnchorId != null &&\n !walkEdgeExists(levelEdges, prevAnchorId, id)\n ) {\n queueOp(\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: prevAnchorId,\n toAnchorId: id,\n kind: 'walk',\n },\n },\n 'none',\n );\n }\n return id;\n }}\n onLinkRouteAnchors={(fromAnchorId, toAnchorId) => {\n if (!canDrawOnCanvas) return;\n const op = linkRouteAnchorsOp(\n workingDraft.mapId,\n fromAnchorId,\n toAnchorId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (op) queueOp(op);\n }}\n onInsertRouteJunction={(edgeId, point) => {\n if (!canDrawOnCanvas || !activeLevel) return null;\n const edge = levelEdges.find((item) => item.id === edgeId);\n if (!edge) return null;\n const { ops, junctionId } = insertJunctionOnWalkEdgeOps({\n levelId: activeLevel.id,\n mapId: workingDraft.mapId,\n edge,\n point,\n anchors: levelAnchors,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n return junctionId;\n }}\n onDeleteRouteAnchor={(anchorId) => {\n if (!canDrawOnCanvas) return;\n const ops = deleteRouteAnchorOps(\n anchorId,\n workingDraft.mapId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (ops.length) queueOpBatch(ops);\n const removed = new Set(\n ops\n .filter((op) => op.op === 'delete_anchor')\n .map((op) => op.anchorId),\n );\n if (removed.size) {\n setSelectedAnchorIds((ids) =>\n ids.filter((id) => !removed.has(id)),\n );\n }\n }}\n onDeleteRouteEdge={(edgeId) => {\n if (!canDrawOnCanvas) return;\n const ops = deleteRouteEdgeOps(edgeId, levelEdges);\n if (ops.length) queueOpBatch(ops);\n const removed = new Set(\n ops\n .filter((op) => op.op === 'delete_anchor')\n .map((op) => op.anchorId),\n );\n if (removed.size) {\n setSelectedAnchorIds((ids) =>\n ids.filter((id) => !removed.has(id)),\n );\n }\n }}\n onEnsureShapeAnchor={(shapeId, point) => {\n if (!canDrawOnCanvas) return null;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return null;\n const { ops, anchorId } = ensureShapeRouteAnchorOps({\n shape: target,\n anchors: levelAnchors,\n allocId: () => nextTempId.current--,\n point,\n });\n if (ops.length) queueOpBatch(ops);\n setSelectedAnchorIds([anchorId]);\n return anchorId;\n }}\n onConnectShapeToRoute={(shapeId, from, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return;\n const ops = connectShapeToRouteOps({\n shape: target,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n from,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onConnectRouteAnchorToRoute={(anchorId, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((item) => item.id === anchorId);\n if (!anchor) return;\n const ops = connectRouteAnchorToRouteOps({\n anchor,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onHistoryGestureEnd={endHistoryGesture}\n onMoveAnchor={(anchorId, x, y) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n const delta = { x: x - anchor.x, y: y - anchor.y };\n queueOp(\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n },\n 'gesture',\n );\n if (delta.x === 0 && delta.y === 0) return;\n for (const edge of workingDraft.edges) {\n const curve = shiftRouteCurveForAnchor(edge, anchorId, delta);\n if (!curve) continue;\n queueOp(\n { op: 'upsert_edge', edge: { ...edge, curve } },\n 'none',\n );\n }\n }}\n onUpdateRouteCurve={(\n edgeId: number,\n curve: RouteCurve | null,\n opts?: { live?: boolean },\n ) => {\n if (!canDrawOnCanvas) return;\n const edge = workingDraft.edges.find((item) => item.id === edgeId);\n if (!edge) return;\n queueOp(\n { op: 'upsert_edge', edge: { ...edge, curve } },\n opts?.live ? 'gesture' : 'step',\n );\n }}\n onCreateShape={(kind, geometry, extras) => {\n if (\n section === 'wayfinding' ||\n !activeLevel ||\n !canDrawOnCanvas\n ) {\n return;\n }\n const key = allocShapeKey(\n kind,\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind,\n geometry,\n bbox: geometryBBox(geometry),\n origin: 'manual',\n sourceSvgId: null,\n geometryLocked: true,\n label:\n kind === 'entrance'\n ? canonicalizeEntranceLabel({\n kind,\n origin: 'manual',\n sourceSvgId: null,\n label: extras?.label,\n }) ?? extras?.label\n : extras?.label,\n },\n });\n if (id != null) handleSelectShape(id);\n }}\n onUpdateShapeGeometry={handleUpdateShapeGeometry}\n onBatchShapeEdits={(edits) => {\n if (\n section === 'wayfinding' ||\n !activeLevel ||\n !canDrawOnCanvas ||\n edits.length === 0\n ) {\n return;\n }\n const ops: BatchOp[] = [];\n let deletedSelected = false;\n const takenKeys = new Set(\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n edits.forEach((edit) => {\n if (edit.action === 'update') {\n const shape = workingDraft.shapes.find(\n (s) => s.id === edit.shapeId,\n );\n if (!shape) return;\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.action === 'create') {\n const style: ShapeStyle | undefined = edit.style;\n const key = allocShapeKey(edit.kind, takenKeys);\n takenKeys.add(key);\n ops.push({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind: edit.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n style,\n origin: 'manual',\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.shapeId === selectedShapeId) deletedSelected = true;\n ops.push({ op: 'delete_shape', shapeId: edit.shapeId });\n });\n if (ops.length) queueOpBatch(ops);\n if (deletedSelected) {\n const survivor = edits.find((e) => e.action === 'update');\n handleSelectShape(\n survivor && survivor.action === 'update'\n ? survivor.shapeId\n : null,\n );\n }\n }}\n />\n <MapControls\n levels={workingDraft.levels}\n floorOptions={editorFloorControlLevels(section, workingDraft.levels)}\n alwaysShowFloors\n activeLevelId={activeLevelId}\n onActiveLevelChange={handleCanvasLevelChange}\n onZoomIn={() => canvasRef.current?.zoomIn()}\n onZoomOut={() => canvasRef.current?.zoomOut()}\n onReset={() => canvasRef.current?.resetView()}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nexport default MapEditor;\n","import React, { useMemo, useState } from 'react';\nimport type { ImportDiff, ImportDiffItem } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\nexport interface ImportReviewProps {\n diff: ImportDiff;\n viewBoxChanged?: boolean;\n blockedMessage?: string | null;\n busy?: boolean;\n onApply: (payload: {\n acceptAll: boolean;\n remap: Array<{ fromShapeId: number; toSourceSvgId: string }>;\n }) => Promise<void> | void;\n onCancel?: () => void;\n}\n\nfunction bucketLabel(change: ImportDiffItem['change']): string {\n switch (change) {\n case 'added':\n return 'Added';\n case 'removed':\n return 'Orphaned';\n case 'moved':\n return 'Moved';\n case 'kind_changed':\n return 'Kind changed';\n default:\n return 'Unchanged';\n }\n}\n\n/**\n * Outdoor (or floor) re-upload review — shows added / orphaned / locked / drifted\n * buckets before apply. Host wires POST .../import + .../import/apply.\n */\nexport function ImportReviewPanel({\n diff,\n viewBoxChanged = false,\n blockedMessage,\n busy = false,\n onApply,\n onCancel,\n}: ImportReviewProps) {\n const [remap, setRemap] = useState<Record<number, string>>({});\n\n const buckets = useMemo(() => {\n const added = diff.items.filter((i) => i.change === 'added');\n const orphaned = diff.items.filter((i) => i.change === 'removed');\n const locked = diff.items.filter(\n (i) => i.geometryLocked && i.change !== 'removed' && i.change !== 'added',\n );\n const moved = diff.items.filter((i) => i.change === 'moved');\n return { added, orphaned, locked, moved };\n }, [diff.items]);\n\n if (viewBoxChanged) {\n return (\n <div className=\"eyeon-map-import-review\">\n <div className=\"eyeon-map-floors__error\">\n {blockedMessage ??\n 'SVG viewBox changed — restore the original artboard before re-uploading.'}\n </div>\n {onCancel ? (\n <button type=\"button\" onClick={onCancel} disabled={busy}>\n Close\n </button>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-import-review\">\n <p className=\"eyeon-map-rail__hint\">\n Review changes before applying. Orphaned shapes keep their retailer\n assignments — remap them onto a newly added id if the designer renamed\n a store.\n </p>\n\n {buckets.added.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Added ({buckets.added.length})\n </div>\n {buckets.added.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{item.newKind}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.orphaned.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Orphaned ({buckets.orphaned.length})\n </div>\n {buckets.orphaned.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row eyeon-map-import-review__remap\">\n <span>{item.sourceSvgId}</span>\n <label className=\"eyeon-map-rail__field\">\n Remap to\n <ModernSelect\n ariaLabel={`Remap ${item.sourceSvgId}`}\n value={remap[item.existingShapeId!] ?? ''}\n disabled={busy || buckets.added.length === 0}\n placeholder=\"Keep orphaned\"\n searchable\n options={[\n { value: '', label: 'Keep orphaned' },\n ...buckets.added.map((a) => ({\n value: a.sourceSvgId,\n label: a.sourceSvgId,\n })),\n ]}\n onChange={(next) =>\n setRemap((prev) => ({\n ...prev,\n [item.existingShapeId!]: next,\n }))\n }\n />\n </label>\n </div>\n ))}\n </section>\n )}\n\n {buckets.locked.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Geometry locked ({buckets.locked.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Portal edits win — kind/style may update, geometry will not.\n </p>\n {buckets.locked.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{bucketLabel(item.change)}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.moved.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Moved ({buckets.moved.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Centroid drifted — check nearby walking paths after apply.\n </p>\n {buckets.moved.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n </div>\n ))}\n </section>\n )}\n\n {diff.items.length === 0 && (\n <p className=\"eyeon-map-rail__hint\">No shape changes detected.</p>\n )}\n\n <div className=\"eyeon-map-rail__actions\">\n {onCancel ? (\n <button type=\"button\" disabled={busy} onClick={onCancel}>\n Cancel\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={busy}\n onClick={() =>\n void onApply({\n acceptAll: true,\n remap: Object.entries(remap)\n .filter(([, to]) => Boolean(to))\n .map(([from, toSourceSvgId]) => ({\n fromShapeId: Number(from),\n toSourceSvgId,\n })),\n })\n }\n >\n {busy ? 'Applying…' : 'Apply import'}\n </button>\n </div>\n </div>\n );\n}\n"],"names":["isEditorSection","section","portalCenterSurface","host","wayfindingSelectableLevels","levels","floorSwitcherLevels","editMapSelectableLevels","outdoor","level","defaultEditorFloorId","_a","levelIdOnEnterWayfinding","levelIdOnEnterEditMap","levelIdOnEnterDefaultMap","defaultViewerLevelId","editorFloorControlLevels","wayfindingOutdoorReadOnly","emptyEditorHistory","cloneHistorySnapshot","snapshot","op","pushEditorHistory","history","current","undoEditorHistory","restored","redoEditorHistory","isEditableTypingTarget","target","el","tag","isEditorUndoHotkey","isEditorRedoHotkey","key","EDITOR_TOOLS","canPlaceNewRoute","tool","isWayfindingEditorTool","canDeleteWayfindingItem","canChainRoute","nextRouteChainAnchor","endAnchorId","ICON_PROPS","SelectIcon","jsx","PanIcon","DrawRectIcon","DrawPolygonIcon","DrawCircleIcon","CurveIcon","jsxs","SplitJoinIcon","DrawTextIcon","DrawEntranceIcon","DrawRouteIcon","CreateRouteIcon","CreateRouteMultiIcon","UndoIcon","RedoIcon","TOOL_ICONS","canSelectShapes","canEditShapeGeometry","routeMode","isSplitJoinTool","isPolygonDrawTool","popPolygonDraftPoint","points","isEllipseDrawTool","isShapeDrawTool","isStampDrawTool","canJoinOpenEnds","showsShapeAnchors","showsCurveHandles","emptyCanvasDragPans","nextEditorTool","next","toolHint","group","EditorToolButtons","onToolChange","canEdit","mapTools","t","routeTools","routeCurveTools","showMap","showRoute","selectTool","routeToolbar","renderButton","Icon","React","EditorHistoryButtons","canUndo","canRedo","disabled","onUndo","onRedo","EPS","vecEq","a","b","eps","cloneVec","p","addVec","subVec","scaleVec","s","lerpVec","edgeCount","ring","edgeFrom","edgeIndex","edgeTo","edgeToPathD","from","to","edge","fmtCoord","n","r","ringFromPolygon","poly","closed","anchors","edges","quadraticToCubic","p0","q","p2","cubicHandlesForPull","pull","mid","offset","chord","cubicPoint","c1","c2","p3","u","splitCubic","c","d","e","ellipticalArcToCubics","rx","ry","xAxisRotationDeg","largeArc","sweep","p1","arx","ary","phi","cosPhi","sinPhi","dx2","dy2","x1p","y1p","lambda","scale","rxSq","rySq","numerator","denominator","factor","cxp","cyp","cx","cy","ux","uy","vx","vy","theta1","deltaTheta","ellipsePoint","theta","cosT","sinT","ellipseDeriv","dx","dy","out","t0","remaining","step","t1","k","start","end","d0","d1","parsePathToRings","tokens","tokenizePathData","rings","x","y","startX","startY","lastCtrl","i","cmd","started","readNum","flush","expected","pushAnchor","isRel","nx","ny","x1","y1","x2","y2","qx","qy","rot","cubics","cubic","ringToPathD","a0","ringsToGeometry","ds","geometry","buildGeometryFromPaths","ARCH_CORNER_RAD","MIN_ARCH_POINTS","MIN_ARCH_BULGE","MIN_ARCH_BULGE_RATIO","MAX_ARCH_BULGE_RATIO","signedTurn","prev","cur","ax","ay","bx","by","runLooksLikeArch","pts","distance","maxDev","side","proj","projectOntoSegment","fitCubicThroughRun","cubicDeviationFromChord","samples","approximateCubic","point","cubicIsRunaway","dev","flattenRunawayCubics","changed","collapseLineRunsToCubics","idx","incoming","outgoing","isSharp","_b","sharp","outA","outE","walk","emitRun","fromW","toW","linesOnly","_","last","w","geometryToRings","fromPaths","pointOnRingEdge","nearestTOnCubic","bestT","bestPt","bestD","clonePolygons","polygons","polygonsToPathD","polygonsToGeometry","cleaned","commitRings","incomingEdgeIndex","anchorIndex","outgoingEdgeIndex","translateGeometry","delta","translateEdge","ringIndex","fromIdx","toIdx","vertexNeighborPoints","polygonIndex","vertexIndex","count","moveVertex","moveHandle","handle","flattenCubicEdge","bendEdgeToCubic","insertVertex","afterVertexIndex","splitT","split","removeVertex","min","join","hitTestVertex","tolerance","best","vertex","hitTestHandle","hp","hitEdge","preferMidpoint","candidate","dist","near","hitTestEdgeMidpoint","hitTestEdge","SHARED_EDGE_TOL","canSplitJoinKind","kind","sameOpenEnd","cloneEdge","cloneRing","reverseEdge","reverseRing","maybeCloseCoincident","tol","first","listOpenEnds","distToRingEdge","pointOnRingBoundary","edgeLiesOnOtherShape","others","other","open","cutPointsOnLine","gap","len","half","cutPointsOnCubic","dt","t2","local","second","rebuildOpenFromClosedCut","leftEdge","rightEdge","splitOpenRingAtCut","left","right","item","openWholeEdge","cutEdgeOpen","cut","pieces","concatOpenRings","leftEnd","rightStart","weld","closeOpenRing","joinOpenEndpoints","DEFAULT_WELD_TOLERANCE","ra","rb","joined","keep","drop","joinAcrossShapes","shapes","ia","ib","ringsA","ringsB","merged","weldCoincidentOpenEnds","deleteIds","ends","shape","j","pairTol","forkClosedRings","opens","finishEdits","before","working","extraDeletes","welded","deleteSet","extras","kept","forked","edits","beforeById","extra","id","applySplitJoinCut","hit","nextGeo","applySplitJoinJoin","hitOpenEnd","skip","preferOther","bestPrefer","hitSplitJoinEdge","previewCutPoints","nearestSnapPoint","candidates","sameSnapPoint","constrainOrthogonal","origin","cursor","constrainVertexOrthogonal","neighbors","neighbor","options","option","isSpacePanKey","event","ellipseBoundsFromDrag","lockCircle","sx","sy","ellipsePathD","bounds","ellipseGeometry","DEFAULT_LABEL_TEXT","DEFAULT_LABEL_SIZE","LABEL_FONT_FAMILY","MAP_FONT_FAMILY","LABEL_LINE_HEIGHT","MAP_LABEL_LINE_HEIGHT","FALLBACK_CHAR_ADVANCE","isTextLabel","defaultLabelSize","_viewbox","labelTextLines","text","measureCtx","textMeasureContext","measureLabelText","size","lines","ctx","width","line","max","labelBoxCenter","box","textLabelPolygon","height","textLabelGeometry","defaultTextLabel","color","geometryForLabelText","geometryBBox","isStampShape","isEntranceIcon","defaultEntranceLabel","ENTRANCE_ICON_ID","clampEntranceSize","entranceIconPolygon","center","entranceIconGeometry","geometryForEntranceIcon","clientToUser","ctm","clientX","clientY","det","clientRectToViewBox","rect","viewBox","vbW","vbH","originX","originY","pxPerUserFromViewBox","readSvgViewBox","svg","vb","attr","parts","clientToSvgUser","pxPerUserFromSvg","pxPerUserFromCtm","userToWorld","user","pan","zoom","z","EDITOR_MIN_ZOOM","EDITOR_MAX_ZOOM","clampEditorZoom","nextEditorZoomFromWheel","currentZoom","nextZoomFromWheel","screenPxToWorld","px","pxPerUser","editorHandleScale","sizeZoom","liveZoom","panAfterZoom","nextZoom","world","panKeepingWorldAtUser","EDITOR_ZOOM_ANIM_MS","easeOutCubic","lerp","interpolateView","editorShapeFillOpacity","editorShapeFill","theme","assignment","WALKING_PATH_COLOR","published","resolvedShapeFill","isTransparentPadKind","isTransparentColor","staffPadPlaceholderFill","EDITOR_GUIDE_COLOR","isHoverHighlightShape","INTERACTIVE_SHAPE_KINDS","editorMapCursor","args","editorSelectCursor","editorHoverFillOpacity","base","hovered","editorShapeEmphasisColor","fill","emphasized","darkenShapeFill","liveDisplayRetailer","retailer","wayfindingAssignedOverlay","amenities","displayRetailer","label","publishedShapeLabel","assignmentOverlayVisible","fontSize","DEFAULT_ASSIGNMENT_SIZE","imageUrl","assignmentOverlayImageUrl","iconId","assignmentSpecialIconId","assignmentOverlayRenderSize","resolvedAssignmentIconColor","normalizeLabelAlign","wayfindingAssignedOverlays","input","retailerById","assignmentByShapeId","row","overlays","overlay","wayfindingOverlayHref","imageProxyUrl","resolveFetchUrl","getMapSpecialSvg","mapSpecialSvgToDataUrl","AssignedShapeOverlay","rotate","align","href","transform","AssignedOverlayText","lineHeight","blockHeight","labelSvgTextAnchor","index","OutdoorSvgUnderlay","url","suppressIds","svgText","setSvgText","useState","suppressKey","useMemo","useEffect","cancelled","controller","fetchUrl","res","err","paths","blocked","outdoorDecorationFromSvg","isUnderlayHintShape","isUnderlayDrawnShape","underlaySwitchHint","WAYFINDING_SNAP_PX","WAYFINDING_ANCHOR_HIT_PX","showsWayfinding","routeSessionUndoKind","session","beginOrContinueRouteDraft","draft","routeRubberBand","isWayfindingShape","wayfindingLinksShapes","anchorKindForShape","routeAnchorKindForShape","shapeRoutePoint","anchorHasEdge","anchorId","routeComponentAnchorIds","ids","pending","walkEdgeExists","isCurvableRouteEdge","isSnappableRouteEdge","edgeWithCurve","curve","splitWalkEdge","source","junctionId","mapId","allocId","anchorById","routeCurveOf","splitRouteCurve","walkEdge","storeLinkOriginIds","preview","anchor","nearestRouteSnap","excludeIds","maxDist","prefer","bestJunction","bestEdge","projectOntoRouteEdge","fromAnchorId","toAnchorId","ensureShapeRouteAnchorOps","existing","unit","connectShapeToRouteOps","ops","snap","nextEdges","linkKind","connectRouteAnchorToRouteOps","incident","otherId","link","linkRouteAnchorsOp","insertJunctionOnWalkEdgeOps","levelId","deleteRouteEdgeOps","edgeId","planRouteAnchorRemoval","removedEdgeIds","walkNeighbors","heal","removedAnchorIds","seen","anchorsRemovedWithRouteAnchor","deleteRouteAnchorOps","ANCHOR_R_PX","ANCHOR_R_SELECTED_PX","ANCHOR_HIT_PX","ANCHOR_STROKE_PX","SHAPE_ROUTE_ANCHOR_FILL","VERTEX_R_PX","VERTEX_R_SELECTED_PX","VERTEX_HIT_PX","VERTEX_STROKE_PX","HANDLE_R_PX","HANDLE_R_SELECTED_PX","HANDLE_HIT_PX","HANDLE_LINE_PX","HANDLE_LINE_HALO_PX","BEND_R_PX","EDGE_DRAG_PX","SPLIT_JOIN_GAP_PX","SNAP_HIT_PX","rectPolygon","dragSize","screenStrokeStyle","HandleDot","hitR","stroke","strokeWidth","fillOpacity","strokeDasharray","onPointerDown","onPointerEnter","onPointerLeave","onDoubleClick","polygonsToPath","isEditableShape","interactiveOnly","editorCanvasClass","showGrid","editorCanvasStyle","gridOpacity","EditorCanvas","assignments","retailers","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","outdoorSvgUrl","levelSvgUrl","underlayShapes","openingUnderlayShapes","readOnly","emptyMessage","onSelectShape","onSelectAnchors","onCreateRoutePoint","onCreateRouteSegment","onLinkRouteAnchors","onInsertRouteJunction","onDeleteRouteAnchor","onDeleteRouteEdge","onConnectShapeToRoute","onConnectRouteAnchorToRoute","onEnsureShapeAnchor","onMoveAnchor","onUpdateRouteCurve","onCreateShape","onUpdateShapeGeometry","onBatchShapeEdits","onHistoryGestureEnd","onRouteDraftActiveChange","ref","ensureMapFont","wayfindingOn","svgRef","useRef","viewGroupRef","canvasRef","setPan","setZoom","viewRef","sizeZoomRef","wheelFrameRef","wheelSettleRef","setPxPerUser","pointersRef","pinchRef","drawing","setDrawing","drawLockCircle","setDrawLockCircle","spaceHeld","setSpaceHeld","spaceHeldRef","axisGuide","setAxisGuide","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","dragAnchorPoint","setDragAnchorPoint","routeCurveDrag","setRouteCurveDrag","selectedRouteHandle","setSelectedRouteHandle","lastRouteAnchor","setLastRouteAnchor","routeDraftPoint","setRouteDraftPoint","storeLinkPreview","setStoreLinkPreview","rubberCursor","setRubberCursor","splitJoinPending","setSplitJoinPending","splitJoinHover","setSplitJoinHover","splitJoinSnapEnd","setSplitJoinSnapEnd","polygonSnap","setPolygonSnap","clearRouteSession","stubDrag","setStubDrag","shapeDrag","setShapeDrag","shapeOffset","setShapeOffset","vertexDrag","setVertexDrag","selectedVertex","setSelectedVertex","selectedHandle","setSelectedHandle","hoveredEdge","setHoveredEdge","edgePress","setEdgePress","hoveredShapeId","setHoveredShapeId","hoveredAnchorId","setHoveredAnchorId","routePointerSnap","setRoutePointerSnap","selectedRouteEdgeId","setSelectedRouteEdgeId","reportAnchors","selectAnchors","routeHover","underlayTip","setUnderlayTip","panStart","isPanning","setIsPanning","worldPx","syncViewDom","nextPan","g","applyView","cancelWheelWork","paintView","settleWheelView","scheduleWheelPaint","zoomAnimRef","cancelZoomAnim","animateViewTo","targetPan","targetZoom","now","zoomAroundCenter","currentPan","useImperativeHandle","polygon","renderedZoom","useLayoutEffect","viewbox","unionViewBox","svgUnderlayUrl","svgSuppressIds","svgIdsOwnedByShapes","measure","ro","editableShapes","openingShapes","openingClipId","openingHatchId","selectedShape","displayGeometry","splitJoinShapes","polygonAnchorCandidates","nearSplitJoinAnchor","snapPolygonPoint","own","commitSplitJoinEdits","deleted","survivor","tryJoinOpenEnd","endHit","handleSplitJoinAt","endTol","edgeTol","edgeHit","toWorld","moveUnderlayTip","insertAnchorOnEdge","beginEdgePress","insertAt","deleteShapeAnchor","beginSplitJoinVertexDrag","vertexHit","deleteShapeHandle","hoverEdgeAt","connectedAnchorIds","routeAnchorDegreeById","degree","dragRouteExcludeIds","dragRouteSnap","displayAnchorById","dragged","routeEdgePath","routeEdgePathD","displayRouteCurve","assignedOverlays","updateRoutePointerSnap","closePolygon","onKey","down","onBlur","node","onWheel","beginPinch","onCanvasPointerDownCapture","beginPan","onCanvasPointerMoveCapture","onCanvasPointerUpCapture","wasPinching","fromEmptySelect","captureNode","insertHoveredRoutePoint","created","removeWayfindingEdge","orphans","removeWayfindingAnchor","removed","snapped","constrained","placed","curveSnap","curveEdge","storeExclude","DEFAULT_ENTRANCE_SIZE","handleHit","_d","_c","midHit","_f","_e","handleTol","_h","_g","onPointerMove","screenMove","bendRouteToCubic","moveRouteHandle","snapTol","finishRect","finishEllipse","onPointerUp","endedPan","moved","pathDFromGeometry","shapePathD","stubExcludeIds","stubSnap","lastRoutePoint","routeRubberSnap","highlightedRouteEdgeId","highlightedRouteEdge","highlightedRouteFrom","highlightedRouteTo","highlightedRoutePath","routePlusAt","rubberFrom","rubberTo","rubberBand","polygonFollow","polygonClose","hoveredLinkShape","wayfindingStoreHover","routeInsertHover","routeNetworkHover","mapCursor","canvasStyle","hoverId","hintable","publishedFill","highlightable","selected","dragging","textLabel","entranceIcon","stamp","beginShapePointerDown","routeSnap","worldAt","hoverHandlers","iconUrl","entranceIconDataUrl","emphasisStroke","textX","labelAlignX","baseOpacity","opening","emphasisFill","ri","items","ei","strokeD","clickRing","plus","h1","h2","vi","beginHandle","shapeNode","connected","displayAnchor","dragConnect","nearWeld","visR","hideOnAnchor","Fragment","editorShouldWarnOnLeave","state","applyBeforeUnloadWarning","shouldWarn","beforeUnloadTargets","frame","targets","top","FAMILY_PREFIXES","normalizeId","value","parseConnectorSourceId","raw","family","direction","role","groupParts","part","guessConnectorKind","connectorIdForShape","shapeId","connectorForShape","connectors","resolvedConnectorKind","railConnectorShapes","landingAnchor","shapeLandingPoint","geometryCentroid","inferTravelDirection","fromLevelIndex","toLevelIndex","hint","defaultConnectorName","parsed","nearestWalkAnchor","bestDist","memberShapeIds","connectorId","partnerShapesForConnector","connector","levelsWithLandings","landings","escalatorDirectedEnds","memberAnchors","memberIds","ride","fromAnchor","toAnchor","floorName","landingRideId","groupEscalatorRides","rides","directed","members","escalatorRideLandingLines","connectorRideLabel","partners","order","ai","bi","connectorEdgesBetween","anchorIds","ensureLanding","linkLandingToWalk","landing","applyUnlinkLocal","unlinkConnectorOps","buildUnlinkConnectorOps","buildEscalatorLinkOps","fromShape","toShape","fromLevel","l","toLevel","name","existingFrom","existingTo","v","buildElevatorShaftOps","memberShapes","existingIds","keepId","geometryBbox","bboxOf","shapeKeyTakenOnLevel","upsertById","rows","copy","applyDraftOp","mergeEntranceAwareLabel","parseShapeAssignment","rest","omitLevelFromDraft","removedShapeIds","liveConnectorIds","applyDraftOps","seeded","healDraftGeometry","normalizeGeometrySpace","canonicalizeEntranceLabel","geometryChanged","labelChanged","coalesceDraftOp","acc","BATCH_PERSIST_RANK","edgePairKey","compactRouteOpsForPersist","deletedEdgeIds","deletedAnchorIds","upsertedEdgeIds","upsertedAnchorIds","ephemeralAnchorIds","lastIndexByPair","curveByPair","winner","winnerOp","sortBatchOps","rank","orderBatchOpsForPersist","FieldResetIcon","FieldResetButton","onClick","normalizeHexColor","match","hex","ch","hexColorInputValue","sameHexColor","StepperRow","onChange","onStep","onHoldStart","onHoldEnd","setDraft","focused","syncDraft","commitDraft","persistIncomplete","commitAssignNumberDraft","assignNumberFromDraft","ColorSwatch","swatch","fallback","emptyIsTransparent","onHexChange","onCommit","onPick","lastSolid","transparent","solid","pickerValue","ColorRow","onReset","display","TRANSPARENT_COLOR","setHex","commit","normalized","ALIGN_TOOLTIPS","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","ALIGN_ICONS","AlignRow","LABEL_ALIGNS","RotateIcon","nextQuarterTurn","remainder","stepWholeNumber","AssignmentStyleFields","form","storeDefaultColor","storeTextColor","textColorLabel","showTextColor","onPatch","formRef","intervals","bump","startHold","stopHold","offsetX","offsetY","bgColor","textColor","connectorStyleAssignment","emptyShapeAssignment","ConnectorAssign","railKind","onApplyOps","onSaveAssignment","partner","levelName","exitFloorId","setExitFloorId","targetId","setTargetId","stopFloorId","setStopFloorId","styleForm","setStyleForm","styleFormRef","patchStyle","useCallback","partial","exitFloors","landingsOnExitFloor","addable","addFloors","landingsOnStopFloor","applyEscalator","applyElevator","nextMembers","pickExitLanding","nextId","pickElevatorStop","landingOptions","linked","connectorSpecialIconDataUrl","ModernSelect","nextFloor","assignmentPadFillFallback","SHAPE_KIND_LABELS","EDITOR_TYPE_KINDS","TOOL_ONLY_KINDS","inspectorShowsType","inspectorTypeKinds","shapeKindLabel","ASSIGNABLE_SHAPE_KINDS","isAssignableKind","isStoreShapeKind","isRetailerAssigned","isAmenityAssigned","isKioskAssigned","isPolygonAssigned","assignmentHasTarget","railAssignmentGroups","byShape","stores","kiosks","unassignedStores","unassignedAmenities","unassignedKiosks","custom","unassignedCustom","unassigned","isKioskScreenKind","kioskScreenShapes","catalogKioskShapeOptions","shapeIdForCatalogKiosk","kioskId","leftoverCatalogKiosks","used","kiosk","catalogKioskRowLabel","assignedKey","railRowLabels","tags","RAIL_ITEM_SECTIONS","isRailItemSection","railShowsItemOptions","selectedCount","railListLevelOrder","floorsLowToHigh","compareBuildingFloors","sortShapesByRailLevel","indexById","floorsScreenTitle","screen","visibleFloorCount","moveLevelId","movedId","toIndex","without","clamped","insertIndexFromY","listTop","rowHeight","dropLineTop","fromIndex","dropIndex","rowInnerHeight","sameIdOrder","formatBytes","svgFileName","isSvgFile","GripIcon","TrashIcon","deleteConfirmCopy","shapeCount","isOutdoor","FloorsPanel","buildings","levelShapeCounts","canFloors","onScreenChange","onCreateLevel","onUpdateLevel","onDeleteLevel","onReorderLevels","setName","file","setFile","busy","setBusy","error","setError","progress","setProgress","dragOver","setDragOver","confirmDeleteId","setConfirmDeleteId","deleting","setDeleting","drag","setDrag","setDropIndex","previewIds","setPreviewIds","previewFailed","setPreviewFailed","localPreviewUrl","setLocalPreviewUrl","fileInputRef","floorListRef","ghostRef","previewIdsRef","dragRef","outdoorReady","buildingFloors","committedIds","displayFloors","byId","editing","isOutdoorForm","canManage","canReorder","takeSvgFile","openEdit","submit","picked","svgFile","remove","renderDeleteModal","renderRowDelete","applyGhost","ghost","previewMoveToY","persistPreview","nextIds","endDrag","onMove","maxY","onUp","startDrag","list","listRect","lineTop","hasExistingSvg","showEditPreview","previewUrl","previewFallback","importedCount","showReimportNotice","primaryLabel","primaryBusyLabel","createPortal","BackIcon","ChevronIcon","NAV_ICON_PROPS","FloorsNavIcon","StoresNavIcon","AmenitiesNavIcon","KiosksNavIcon","EscalatorsNavIcon","ElevatorsNavIcon","SettingsNavIcon","CustomNavIcon","UnassignedNavIcon","EditMapNavIcon","WayfindingNavIcon","MapResponsivenessNavIcon","RAIL_NAV","HIDDEN_SECTION_TITLES","isRailNavSeparator","entry","railSectionTitle","HOUSE_OUTDOOR_THEME","staticLayerThemeDefaults","OUTDOOR_COLOR_FIELDS","SettingsField","children","ColorField","LeftRail","onSectionChange","activeLevelId","selectedShapeIds","onHoverShape","onListFocus","canSettings","canResponsiveness","onAutoroute","onThemeChange","assignPanel","catalogKioskPanel","selectedCatalogKioskId","onSelectCatalogKiosk","editMapPanel","wayfindingPanel","mapResponsivenessPanel","footer","floorsScreen","setFloorsScreen","assigned","storeShapes","amenityShapes","kioskShapes","unassignedStoreShapes","unassignedAmenityShapes","unassignedKioskShapes","unassignedShapes","customShapes","unassignedCustomShapes","escalatorShapes","elevatorShapes","unlinkedEscalators","escalatorRides","linkedElevators","unlinkedElevators","assignmentById","counts","duplicate","retailerOptionLabel","amenityById","kioskById","assignedNameFor","catalogName","fromType","getAmenityByType","amenityAssignedName","kioskAssignedName","activeLevel","pathCount","selectedIds","isShapeSelected","selectedCatalogKiosk","showingCatalogKiosk","showingItemOptions","itemOptionsTitle","linkedId","selectShapeFromList","leftoverKiosks","renderShapeList","empty","opts","renderEscalatorRideList","active","renderAssignedUnassigned","assignedList","unassignedList","kindLabelFor","connectorIcon","house","DEFAULT_THEME","customized","clampStoreRadius","clampRouteThickness","readError","body","description","apiFetch","webApiURI","path","init","ClassicMapFooter","centerId","unsaved","onMapVersionChanged","isDeveloper","setIsDeveloper","classicPresence","setClassicPresence","dialog","setDialog","acknowledged","setAcknowledged","setPending","status","openSwitch","confirmSwitch","confirmDelete","showSwitch","showDelete","CatalogKioskForm","shapeOptions","assignedShapeId","onAssign","hasShape","SHAPE_KEY_PREFIX","SHAPE_KEY_ALPHABET","SHAPE_KEY_SUFFIX_LENGTH","shapeKeyPrefix","randomShapeKeySuffix","length","bytes","liveShapeKeysOnLevel","copyDestinationLevels","currentLevelId","allocShapeKey","taken","suffix","prefix","cloneShapeGeometry","copyShapeToLevelOps","targetLevelId","RETAIL_LAYER_TYPES","AssignForm","amenityIconColor","kioskIconColor","onClear","setForm","patch","nameCounts","retailerOptions","amenityOptions","amenityAssignOptions","selectedAmenityType","amenityTypeFromCatalogId","kioskCatalogName","textColorFallback","assignmentIconThemeFallback","hasAssignment","retailerId","layerType","DEFAULT_LABEL_ALIGN","isHttpImageUrl","amenityId","amenityCatalogIdForType","KioskNameField","trimmed","BulkAssignForm","common","bulkAssignFormState","assignableShapes","iconOnly","uniqueKinds","bgColorFallback","BulkSizeRow","BulkColorRow","emitIfComplete","mixed","Chevron","CopyToLevelButton","destinations","onCopyToLevel","listId","useId","buttonRef","menuRef","setOpen","menuPos","setMenuPos","close","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","menu","nextError","MIN_ICON_SIZE","EntranceIconForm","setSize","setRotate","sizeRef","rotateRef","nextSize","nextRotate","MIN_FONT_SIZE","TextLabelForm","setText","textFocused","nextText","Inspector","levelShapeKeys","showAssignment","emptyHint","onRename","onChangeKind","onChangeLevel","onDelete","onClearAssignment","onUpdateLabel","selectedShapes","selectedAssignments","onBulkAssign","setKey","keyError","setKeyError","levelError","setLevelError","commitRename","copyDestinations","copyButton","PreviewOverlay","document","focusNonce","onActiveLevelChange","routeOnSelect","device","captureCamera","onCameraChange","onCameraReset","Suspense","MapViewer","nextSelectedShapeIds","compileEditorPreview","compileDocument","memory","MAX_REMEMBERED_MAPS","storageKey","dropLegacyStorage","markEditorSection","oldest","peekEditorSection","clearEditorSection","storage","markReturnToFloorsList","consumeReturnToFloorsList","stored","clearReturnToFloorsList","MAX_GRID_OPACITY","DEFAULT_GRID_OPACITY","clampGridOpacity","gridOpacityFromSlider","percent","sliderPercentFromGridOpacity","opacity","GridPrefsControl","prefsFromInput","MapEditor","onBatch","onPublish","onSaveResponsive","onDiscard","onImportSvg","previewDocument","className","sidebarFooter","onDirtyChange","gridOpacityProp","onGridPrefsChange","restoredSection","setSection","responsiveDevice","setResponsiveDevice","pendingResponsive","setPendingResponsive","previewEpoch","setPreviewEpoch","setActiveLevelId","restoredLevel","setSelectedShapeIds","setSelectedCatalogKioskId","listFocusNonce","setListFocusNonce","setSelectedAnchorIds","setTool","setGridOpacity","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","setHistory","routeDraftActive","setRouteDraftActive","historyRef","pendingOps","nextTempId","historyGestureRef","showMapOptions","centerSurface","isEditMap","historyMetaRef","handleGridPrefsChange","prefs","workingDraft","mergeTheme","cameraDirty","pendingEdits","dirty","warnOnLeave","warnOnLeaveRef","onBeforeUnload","canPersist","isResponsiveness","outdoorViewOnly","canDrawOnCanvas","outdoorLevel","outdoorShapes","levelShapes","levelsWithShapes","lvl","lower","nextLowerBuildingFloor","mergedResponsiveOverrides","mergeResponsiveOverrides","compiledPreview","levelAnchors","levelEdges","anchorsById","selectedAssignment","takeSnapshot","applySnapshot","recordHistoryStep","mode","queueOp","historyMode","endHistoryGesture","undo","redo","handleSaveChanges","cameraItems","persisted","savedCamera","responsiveSlotKey","handleDiscardChanges","handleSectionChange","handleCanvasLevelChange","nextLevel","handleSelectShape","additive","nextLevelId","viewerLevelIdAfterShapeSelect","connectorKind","handleToolChange","requested","resolved","handleRenameShape","handleChangeLevel","queueOpBatch","handleCopyToLevel","copied","handleDeleteShape","handleUpdateShapeGeometry","handleUpdateLabel","nextLabel","handleChangeKind","handleSaveAssignment","visuals","assignmentVisualPatch","handleClearAssignment","handleLinkCatalogKiosk","previousShapeId","clearShape","handleBulkAssign","patched","applyBulkAssignPatch","selectedConnectorKind","connectorRailKind","handleCameraChange","view","fields","poseToResponsiveFields","handleCameraReset","emptyResponsiveOverrideInput","toolGroup","RESPONSIVE_DEVICE_TABS","tab","hasBuildingFloors","MAP_NO_FLOORS_MESSAGE","id1","id2","prevAnchorId","shiftRouteCurveForAnchor","deletedSelected","takenKeys","edit","style","MapControls","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","toSourceSvgId"],"mappings":";;;;;;AAYO,SAASA,GAAgBC,GAAsC;AACpE,SAAOA,MAAY,cAAcA,MAAY;AAC/C;AAOO,SAASC,GACdC,GACAF,GACqB;AACrB,SAAIE,MAAS,YAAY,CAACH,GAAgBC,CAAO,IAAU,WACpD;AACT;AAGO,SAASG,GAAiDC,GAAkB;AACjF,SAAOC,GAAoBD,CAAM;AACnC;AAGO,SAASE,GAA8CF,GAAkB;AAC9E,QAAMG,IAAUH,EAAO,OAAO,CAACI,MAAUA,EAAM,SAAS,SAAS;AACjE,SAAO,CAAC,GAAGH,GAAoBD,CAAM,GAAG,GAAGG,CAAO;AACpD;AAGO,SAASE,GAAqBL,GAAqC;;AACxE,WAAOM,IAAAL,GAAoBD,CAAM,EAAE,GAAG,EAAE,MAAjC,gBAAAM,EAAoC,OAAM;AACnD;AAMO,SAASC,GAAyBP,GAAqC;;AAC5E,SACEK,GAAqBL,CAAM,OAC3BM,IAAAN,EAAO,KAAK,CAACI,MAAUA,EAAM,SAAS,SAAS,MAA/C,gBAAAE,EAAkD,OAClD;AAEJ;AAGO,SAASE,GAAsBR,GAAqC;;AACzE,SACEK,GAAqBL,CAAM,OAC3BM,IAAAN,EAAO,KAAK,CAACI,MAAUA,EAAM,SAAS,SAAS,MAA/C,gBAAAE,EAAkD,OAClD;AAEJ;AAMO,SAASG,GAAyBT,GAAqC;AAC5E,SAAOU,GAAqBV,CAAM;AACpC;AAMO,SAASW,GACdf,GACAI,GACqC;AAKrC,UAHEJ,MAAY,eACRG,GAA2BC,CAAM,IACjCE,GAAwBF,CAAM,GACpB,IAAI,CAACI,OAAW;AAAA,IAC9B,IAAIA,EAAM;AAAA,IACV,MAAMA,EAAM,SAAS,YAAY,YAAYA,EAAM;AAAA,EAAA,EACnD;AACJ;AAGO,SAASQ,GACdhB,GACAQ,GACS;AACT,SAAOR,MAAY,iBAAgBQ,KAAA,gBAAAA,EAAO,UAAS;AACrD;AClFO,SAASS,KAAoC;AAClD,SAAO,EAAE,MAAM,IAAI,QAAQ,CAAA,EAAC;AAC9B;AAEO,SAASC,GACdC,GACuB;AACvB,SAAO;AAAA,IACL,KAAKA,EAAS,IAAI,IAAI,CAACC,MAAO,KAAK,MAAM,KAAK,UAAUA,CAAE,CAAC,CAAY;AAAA,IACvE,YAAYD,EAAS;AAAA,IACrB,iBAAiBA,EAAS;AAAA,IAC1B,mBAAmB,CAAC,GAAGA,EAAS,iBAAiB;AAAA,EAAA;AAErD;AAEO,SAASE,GACdC,GACAC,GACe;AACf,SAAO;AAAA,IACL,MAAM,CAAC,GAAGD,EAAQ,MAAMJ,GAAqBK,CAAO,CAAC,EAAE,MAAM,IAAqB;AAAA,IAClF,QAAQ,CAAA;AAAA,EAAC;AAEb;AAEO,SAASC,GACdF,GACAC,GACoE;AACpE,MAAID,EAAQ,KAAK,WAAW,EAAG,QAAO;AACtC,QAAMG,IAAWH,EAAQ,KAAKA,EAAQ,KAAK,SAAS,CAAC;AACrD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAMA,EAAQ,KAAK,MAAM,GAAG,EAAE;AAAA,MAC9B,QAAQ,CAAC,GAAGA,EAAQ,QAAQJ,GAAqBK,CAAO,CAAC;AAAA,IAAA;AAAA,IAE3D,UAAUL,GAAqBO,CAAQ;AAAA,EAAA;AAE3C;AAEO,SAASC,GACdJ,GACAC,GACoE;AACpE,MAAID,EAAQ,OAAO,WAAW,EAAG,QAAO;AACxC,QAAMG,IAAWH,EAAQ,OAAOA,EAAQ,OAAO,SAAS,CAAC;AACzD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM,CAAC,GAAGA,EAAQ,MAAMJ,GAAqBK,CAAO,CAAC;AAAA,MACrD,QAAQD,EAAQ,OAAO,MAAM,GAAG,EAAE;AAAA,IAAA;AAAA,IAEpC,UAAUJ,GAAqBO,CAAQ;AAAA,EAAA;AAE3C;AAEO,SAASE,GAAuBC,GAAqC;AAC1E,MAAIA,KAAU,QAAQ,OAAOA,KAAW,SAAU,QAAO;AACzD,QAAMC,IAAKD,GACLE,IAAMD,EAAG;AACf,SAAIC,MAAQ,WAAWA,MAAQ,cAAcA,MAAQ,WAAiB,KAC/D,EAAQD,EAAG;AACpB;AAQO,SAASE,GAAmB,GAAyB;AAE1D,SADI,EAAE,UAAU,EAAE,YACd,EAAE,EAAE,WAAW,EAAE,WAAiB,KAC/B,EAAE,QAAQ,OAAO,EAAE,QAAQ;AACpC;AAGO,SAASC,GAAmB,GAAyB;AAE1D,MADI,EAAE,UACF,EAAE,EAAE,WAAW,EAAE,SAAU,QAAO;AACtC,QAAMC,IAAM,EAAE,IAAI,YAAA;AAClB,SAAIA,MAAQ,OAAO,EAAE,WAAiB,KAC/BA,MAAQ,OAAO,CAAC,EAAE;AAC3B;AClFO,MAAMC,KAYR;AAAA,EACH,EAAE,IAAI,UAAU,OAAO,UAAU,OAAO,MAAA;AAAA,EACxC,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,MAAA;AAAA,EAClC,EAAE,IAAI,aAAa,OAAO,kBAAkB,MAAM,IAAM,OAAO,MAAA;AAAA,EAC/D,EAAE,IAAI,gBAAgB,OAAO,gBAAgB,MAAM,IAAM,OAAO,MAAA;AAAA,EAChE,EAAE,IAAI,eAAe,OAAO,eAAe,MAAM,IAAM,OAAO,MAAA;AAAA,EAC9D,EAAE,IAAI,SAAS,OAAO,SAAS,MAAM,IAAM,OAAO,OAAO,MAAM,QAAA;AAAA,EAC/D,EAAE,IAAI,cAAc,OAAO,gBAAgB,MAAM,IAAM,OAAO,MAAA;AAAA,EAC9D,EAAE,IAAI,aAAa,OAAO,QAAQ,MAAM,IAAM,OAAO,MAAA;AAAA,EACrD,EAAE,IAAI,iBAAiB,OAAO,YAAY,MAAM,IAAM,OAAO,MAAA;AAAA,EAC7D;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAEX;AAWO,SAASC,GAAiBC,GAAuB;AACtD,SAAOA,MAAS,kBAAkBA,MAAS;AAC7C;AAGO,SAASC,GAAuBD,GAA2B;AAChE,SAAOA,MAAS,YAAYA,MAAS,WAAWD,GAAiBC,CAAI;AACvE;AAGO,SAASE,GAAwBF,GAAuB;AAC7D,SAAOA,MAAS;AAClB;AAGO,SAASG,GAAcH,GAAuB;AACnD,SAAOA,MAAS;AAClB;AAGO,SAASI,GACdJ,GACAK,GACe;AACf,SAAKF,GAAcH,CAAI,KAChB,OAAOK,KAAgB,WAAWA,IADR;AAEnC;AAEA,MAAMC,KAAa;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,eAAe;AACjB;AAEA,SAASC,KAAa;AACpB,SACE,gBAAAC,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EAAA,GAET;AAEJ;AAEA,SAASC,KAAU;AACjB,SACE,gBAAAD,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASE,KAAe;AACtB,SACE,gBAAAF,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA,IAAA;AAAA,EAAA,GAEhB;AAEJ;AAEA,SAASG,KAAkB;AACzB,SACE,gBAAAH,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASI,KAAiB;AACxB,SACE,gBAAAJ,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA,IAAA;AAAA,EAAA,GAEhB;AAEJ;AAEA,SAASK,KAAY;AACnB,SACE,gBAAAC,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,MAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAEP,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACxD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAASO,KAAgB;AACvB,SACE,gBAAAD,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,KAAI,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACtD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,KAAI,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,EAAA,GACxD;AAEJ;AAEA,SAASQ,KAAe;AACtB,SACE,gBAAAF,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EAChB,GACF;AAEJ;AAEA,SAASS,KAAmB;AAC1B,SACE,gBAAAH,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASU,KAAgB;AACvB,SACE,gBAAAJ,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,KAAI,IAAG,OAAM,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACpD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAASW,KAAkB;AACzB,SACE,gBAAAL,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,MAAK,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACtD,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EAChB,GACF;AAEJ;AAEA,SAASY,KAAuB;AAC9B,SACE,gBAAAN,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACxD,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAASa,KAAW;AAClB,SACE,gBAAAP,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASc,KAAW;AAClB,SACE,gBAAAR,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,MAAMe,KAA2D;AAAA,EAC/D,QAAQhB;AAAA,EACR,KAAKE;AAAA,EACL,aAAaC;AAAA,EACb,gBAAgBC;AAAA,EAChB,eAAeC;AAAA,EACf,OAAOC;AAAA,EACP,cAAcE;AAAA,EACd,aAAaC;AAAA,EACb,iBAAiBC;AAAA,EACjB,cAAcC;AAAA,EACd,gBAAgBC;AAAA,EAChB,sBAAsBC;AACxB;AAGO,SAASI,GAAgBxB,GAA2B;AACzD,SAAOA,MAAS,YAAYA,MAAS,WAAWA,MAAS;AAC3D;AAGO,SAASyB,GACdzB,GACA0B,IAAY,IACH;AACT,SAAO,CAACA,KAAaF,GAAgBxB,CAAI;AAC3C;AAEO,SAAS2B,GAAgB3B,GAA2B;AACzD,SAAOA,MAAS;AAClB;AAGO,SAAS4B,GAAkB5B,GAA2B;AAC3D,SAAOA,MAAS;AAClB;AAMO,SAAS6B,GAAwBC,GAGtC;AACA,SAAIA,EAAO,WAAW,IAAU,EAAE,QAAQ,CAAC,GAAGA,CAAM,GAAG,UAAU,GAAA,IAC1D,EAAE,QAAQA,EAAO,MAAM,GAAG,EAAE,GAAG,UAAU,GAAA;AAClD;AAGO,SAASC,GAAkB/B,GAA2B;AAC3D,SAAOA,MAAS;AAClB;AAGO,SAASgC,GAAgBhC,GAA2B;AACzD,SAAOA,MAAS,eAAeA,MAAS,kBAAkBA,MAAS;AACrE;AAGO,SAASiC,GAAgBjC,GAA2B;AACzD,SAAOA,MAAS,eAAeA,MAAS;AAC1C;AAGO,SAASkC,GAAgBlC,GAA2B;AACzD,SAAOA,MAAS,YAAYA,MAAS;AACvC;AAGO,SAASmC,GAAkBnC,GAA2B;AAC3D,SAAOA,MAAS,YAAYA,MAAS,WAAWA,MAAS;AAC3D;AAGO,SAASoC,GAAkBpC,GAA2B;AAC3D,SAAOA,MAAS;AAClB;AAGO,SAASqC,GAAoBrC,GAA2B;AAC7D,SACEA,MAAS,YACTA,MAAS,WACTA,MAAS,gBACTA,MAAS,SACTA,MAAS;AAEb;AAGO,SAASsC,GAAenD,GAAqBoD,GAA8B;AAChF,SAAIA,MAASpD,KAAWY,GAAiBwC,CAAI,IAAU,WAChDA;AACT;AAEO,SAASC,GAASxC,GAAkByC,GAAiC;AAC1E,MAAIA,MAAU;AACZ,YAAQzC,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IAAA;AAGb,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EAAA;AAEb;AAUO,SAAS0C,GAAkB;AAAA,EAChC,MAAA1C;AAAA,EACA,cAAA2C;AAAA,EACA,SAAAC;AAAA,EACA,OAAAH;AACF,GAA2B;AACzB,QAAMI,IAAW/C,GAAa,OAAO,CAACgD,MAAMA,EAAE,UAAU,OAAO,GACzDC,IAAajD,GAAa;AAAA,IAC9B,CAACgD,MAAMA,EAAE,UAAU,WAAWA,EAAE,OAAO;AAAA,EAAA,GAEnCE,IACJP,MAAU,UAAU3C,GAAa,OAAO,CAACgD,MAAMA,EAAE,SAAS,OAAO,IAAI,CAAA,GACjEG,IAAUR,MAAU,SACpBS,IAAYT,MAAU,OACtBU,IAAarD,GAAa,KAAK,CAACgD,MAAMA,EAAE,OAAO,QAAQ,GACvDM,IACJX,MAAU,WAAWU,IACjB,CAACA,GAAY,GAAGJ,GAAY,GAAGC,CAAe,IAC9CD,GAEAM,IAAe,CAACP,MAAqC;AACzD,UAAMQ,IAAO/B,GAAWuB,EAAE,EAAE;AAC5B,WACE,gBAAAhC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,8BAA8BgC,EAAE,UAAU,0CAA0C,EAAE,GAAG9C,MAAS8C,EAAE,KAAK,eAAe,EAAE;AAAA,QACrI,gBAAcA,EAAE,UAAU,SAAYA,EAAE;AAAA,QACxC,cAAYA,EAAE;AAAA,QACd,gBAAc9C,MAAS8C,EAAE;AAAA,QACzB,SAAS,MAAMH,EAAaG,EAAE,EAAE;AAAA,QAChC,UAAU,CAACF,KAAWE,EAAE;AAAA,QAExB,UAAA;AAAA,UAAA,gBAAAtC,EAAC8C,GAAA,EAAK;AAAA,UACLR,EAAE,UACD,gBAAAtC,EAAC,QAAA,EAAK,WAAU,kCAAkC,UAAAsC,EAAE,SAAQ,IAC1D;AAAA,QAAA;AAAA,MAAA;AAAA,MAZCA,EAAE;AAAA,IAAA;AAAA,EAeb;AAEA,2BACG,OAAA,EAAI,WAAU,gCAA+B,MAAK,WAAU,cAAW,aACrE,UAAA;AAAA,IAAAG,IACGJ,EAAS,IAAI,CAACC,MACZ,gBAAAhC,EAACyC,GAAM,UAAN,EACE,UAAA;AAAA,MAAAT,EAAE,YACD,gBAAAtC,EAAC,QAAA,EAAK,WAAU,8BAA6B,eAAY,QAAO,IAC9D;AAAA,MACH6C,EAAaP,CAAC;AAAA,IAAA,EAAA,GAJIA,EAAE,EAKvB,CACD,IACD;AAAA,IACHG,KAAWC,IACV,gBAAA1C,EAAC,QAAA,EAAK,WAAU,8BAA6B,eAAY,QAAO,IAC9D;AAAA,IACH0C,IAAYE,EAAa,IAAIC,CAAY,IAAI;AAAA,EAAA,GAChD;AAEJ;AAUO,SAASG,GAAqB;AAAA,EACnC,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,QAAAC;AACF,GAA8B;AAC5B,2BACG,OAAA,EAAI,WAAU,6BAA4B,MAAK,SAAQ,cAAW,iBACjE,UAAA;AAAA,IAAA,gBAAArD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,gBAAa;AAAA,QACb,cAAW;AAAA,QACX,SAASoD;AAAA,QACT,UAAUD,KAAY,CAACF;AAAA,QAEvB,4BAACpC,IAAA,CAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAEZ,gBAAAb;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,gBAAa;AAAA,QACb,cAAW;AAAA,QACX,SAASqD;AAAA,QACT,UAAUF,KAAY,CAACD;AAAA,QAEvB,4BAACpC,IAAA,CAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GACF;AAEJ;ACrjBA,MAAMwC,KAAM;AAEL,SAASC,GAAMC,GAASC,GAASC,IAAMJ,IAAc;AAC1D,SAAO,KAAK,IAAIE,EAAE,IAAIC,EAAE,CAAC,KAAKC,KAAO,KAAK,IAAIF,EAAE,IAAIC,EAAE,CAAC,KAAKC;AAC9D;AAEO,SAASC,GAASC,GAAe;AACtC,SAAO,EAAE,GAAGA,EAAE,GAAG,GAAGA,EAAE,EAAA;AACxB;AAEO,SAASC,GAAOL,GAASC,GAAe;AAC7C,SAAO,EAAE,GAAGD,EAAE,IAAIC,EAAE,GAAG,GAAGD,EAAE,IAAIC,EAAE,EAAA;AACpC;AAEO,SAASK,GAAON,GAASC,GAAe;AAC7C,SAAO,EAAE,GAAGD,EAAE,IAAIC,EAAE,GAAG,GAAGD,EAAE,IAAIC,EAAE,EAAA;AACpC;AAEO,SAASM,GAASP,GAASQ,GAAiB;AACjD,SAAO,EAAE,GAAGR,EAAE,IAAIQ,GAAG,GAAGR,EAAE,IAAIQ,EAAA;AAChC;AAEO,SAASC,GAAQT,GAASC,GAAS,GAAiB;AACzD,SAAO,EAAE,GAAGD,EAAE,KAAKC,EAAE,IAAID,EAAE,KAAK,GAAG,GAAGA,EAAE,KAAKC,EAAE,IAAID,EAAE,KAAK,EAAA;AAC5D;AAEO,SAASU,GAAUC,GAAwB;AAChD,SAAIA,EAAK,QAAQ,SAAS,IAAU,IAC7BA,EAAK,SAASA,EAAK,QAAQ,SAASA,EAAK,QAAQ,SAAS;AACnE;AAEO,SAASC,GAASD,GAAgBE,GAAyB;AAChE,SAAOF,EAAK,QAAQE,CAAS;AAC/B;AAEO,SAASC,GAAOH,GAAgBE,GAAyB;AAC9D,SAAOF,EAAK,SAASE,IAAY,KAAKF,EAAK,QAAQ,MAAM;AAC3D;AAEO,SAASI,GAAYJ,GAAgBE,GAA2B;AACrE,QAAMG,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS;AACjC,UAAIK,KAAA,gBAAAA,EAAM,UAAS,UACV,KAAKF,EAAK,CAAC,IAAIA,EAAK,CAAC,MAAME,EAAK,GAAG,CAAC,IAAIA,EAAK,GAAG,CAAC,IAAIA,EAAK,GAAG,CAAC,IAAIA,EAAK,GAAG,CAAC,IAAID,EAAG,CAAC,IAAIA,EAAG,CAAC,KAE7F,KAAKD,EAAK,CAAC,IAAIA,EAAK,CAAC,MAAMC,EAAG,CAAC,IAAIA,EAAG,CAAC;AAChD;AAEO,SAASE,GAASC,GAAmB;AAC1C,QAAMC,IAAI,KAAK,MAAMD,IAAI,GAAI,IAAI;AACjC,SAAO,OAAO,GAAGC,GAAG,EAAE,IAAI,MAAM,OAAOA,CAAC;AAC1C;AAEO,SAASC,GAAgBC,GAAcC,IAAS,IAAgB;AACrE,QAAMC,IAAUF,EAAK,IAAIpB,EAAQ;AACjC,EACEsB,EAAQ,SAAS,KACjB1B,GAAM0B,EAAQ,CAAC,GAAGA,EAAQA,EAAQ,SAAS,CAAC,CAAC,KAE7CA,EAAQ,IAAA;AAEV,QAAMC,IAAoBD,EAAQ,IAAI,OAAO,EAAE,MAAM,SAAS;AAC9D,SAAI,CAACD,KAAUE,EAAM,SAAS,OAAS,IAAA,GAChC,EAAE,QAAAF,GAAQ,SAAAC,GAAS,OAAAC,EAAA;AAC5B;AAKO,SAASC,GAAiBC,GAAUC,GAASC,GAGlD;AACA,SAAO;AAAA,IACL,IAAIrB,GAAQmB,GAAIC,GAAG,IAAI,CAAC;AAAA,IACxB,IAAIpB,GAAQqB,GAAID,GAAG,IAAI,CAAC;AAAA,EAAA;AAE5B;AAMO,SAASE,GAAoBf,GAAYC,GAAUe,GAGxD;AACA,QAAMC,IAAMxB,GAAQO,GAAMC,GAAI,GAAG,GAC3BiB,IAAS3B,GAASD,GAAO0B,GAAMC,CAAG,GAAG,IAAI,CAAC,GAC1CE,IAAQ7B,GAAOW,GAAID,CAAI;AAC7B,SAAO;AAAA,IACL,IAAIX,GAAOA,GAAOW,GAAMT,GAAS4B,GAAO,IAAI,CAAC,CAAC,GAAGD,CAAM;AAAA,IACvD,IAAI7B,GAAOA,GAAOW,GAAMT,GAAS4B,GAAO,IAAI,CAAC,CAAC,GAAGD,CAAM;AAAA,EAAA;AAE3D;AAEO,SAASE,GAAWR,GAAUS,GAAUC,GAAUC,GAAUzD,GAAiB;AAClF,QAAM0D,IAAI,IAAI1D;AACd,SAAO;AAAA,IACL,GAAG0D,IAAIA,IAAIA,IAAIZ,EAAG,IAAI,IAAIY,IAAIA,IAAI1D,IAAIuD,EAAG,IAAI,IAAIG,IAAI1D,IAAIA,IAAIwD,EAAG,IAAIxD,IAAIA,IAAIA,IAAIyD,EAAG;AAAA,IACnF,GAAGC,IAAIA,IAAIA,IAAIZ,EAAG,IAAI,IAAIY,IAAIA,IAAI1D,IAAIuD,EAAG,IAAI,IAAIG,IAAI1D,IAAIA,IAAIwD,EAAG,IAAIxD,IAAIA,IAAIA,IAAIyD,EAAG;AAAA,EAAA;AAEvF;AAEO,SAASE,GACdb,GACAS,GACAC,GACAC,GACAzD,GAIA;AACA,QAAMkB,IAAIS,GAAQmB,GAAIS,GAAIvD,CAAC,GACrBmB,IAAIQ,GAAQ4B,GAAIC,GAAIxD,CAAC,GACrB4D,IAAIjC,GAAQ6B,GAAIC,GAAIzD,CAAC,GACrB6D,IAAIlC,GAAQT,GAAGC,GAAGnB,CAAC,GACnB8D,IAAInC,GAAQR,GAAGyC,GAAG5D,CAAC,GACnBmD,IAAMxB,GAAQkC,GAAGC,GAAG9D,CAAC;AAC3B,SAAO;AAAA,IACL,MAAM,EAAE,IAAIkB,GAAG,IAAI2C,GAAG,IAAIV,EAAA;AAAA,IAC1B,OAAO,EAAE,IAAIW,GAAG,IAAIF,GAAG,IAAIH,EAAA;AAAA,EAAG;AAElC;AAMO,SAASM,GACdjB,GACAkB,GACAC,GACAC,GACAC,GACAC,GACAC,GACyC;AACzC,MAAIpD,GAAM6B,GAAIuB,CAAE,UAAU,CAAA;AAC1B,MAAIC,IAAM,KAAK,IAAIN,CAAE,GACjBO,IAAM,KAAK,IAAIN,CAAE;AACrB,MAAIK,MAAQ,KAAKC,MAAQ,KAAK,CAAC,OAAO,SAASD,CAAG,KAAK,CAAC,OAAO,SAASC,CAAG;AACzE,WAAO,CAAA;AAGT,QAAMC,IAAQN,IAAmB,MAAO,KAAK,KAAM,KAC7CO,IAAS,KAAK,IAAID,CAAG,GACrBE,IAAS,KAAK,IAAIF,CAAG,GACrBG,KAAO7B,EAAG,IAAIuB,EAAG,KAAK,GACtBO,KAAO9B,EAAG,IAAIuB,EAAG,KAAK,GACtBQ,IAAMJ,IAASE,IAAMD,IAASE,GAC9BE,IAAM,CAACJ,IAASC,IAAMF,IAASG,GAC/BG,IAAUF,IAAMA,KAAQP,IAAMA,KAAQQ,IAAMA,KAAQP,IAAMA;AAChE,MAAIQ,IAAS,GAAG;AACd,UAAMC,KAAQ,KAAK,KAAKD,CAAM;AAC9B,IAAAT,KAAOU,IACPT,KAAOS;AAAA,EACT;AACA,QAAMC,IAAOX,IAAMA,GACbY,IAAOX,IAAMA,GACbY,IAAYF,IAAOC,IAAOD,IAAOH,IAAMA,IAAMI,IAAOL,IAAMA,GAC1DO,IAAcH,IAAOH,IAAMA,IAAMI,IAAOL,IAAMA,GAC9CQ,IACJ,KAAK,KAAK,KAAK,IAAI,GAAGF,IAAYC,CAAW,CAAC,KAAKjB,MAAaC,IAAQ,KAAK,IACzEkB,IAAOD,IAASf,IAAMQ,IAAOP,GAC7BgB,IAAO,CAACF,IAASd,IAAMM,IAAOP,GAC9BkB,KAAKf,IAASa,IAAMZ,IAASa,KAAOzC,EAAG,IAAIuB,EAAG,KAAK,GACnDoB,KAAKf,IAASY,IAAMb,IAASc,KAAOzC,EAAG,IAAIuB,EAAG,KAAK,GACnDqB,KAAMb,IAAMS,KAAOhB,GACnBqB,MAAMb,IAAMS,KAAOhB,GACnBqB,KAAM,CAACf,IAAMS,KAAOhB,GACpBuB,MAAM,CAACf,IAAMS,KAAOhB,GACpBuB,KAAS,KAAK,MAAMH,IAAID,CAAE;AAChC,MAAIK,KAAa,KAAK,MAAML,IAAKG,KAAKF,KAAKC,GAAIF,IAAKE,IAAKD,KAAKE,EAAE;AAChE,EAAI,CAACzB,KAAS2B,KAAa,IAAGA,MAAc,IAAI,KAAK,KAC5C3B,KAAS2B,KAAa,MAAGA,MAAc,IAAI,KAAK;AAEzD,QAAMC,KAAe,CAACC,OAAwB;AAC5C,UAAMC,KAAO,KAAK,IAAID,EAAK,GACrBE,KAAO,KAAK,IAAIF,EAAK;AAC3B,WAAO;AAAA,MACL,GAAGT,KAAKlB,IAAMG,IAASyB,KAAO3B,IAAMG,IAASyB;AAAA,MAC7C,GAAGV,KAAKnB,IAAMI,IAASwB,KAAO3B,IAAME,IAAS0B;AAAA,IAAA;AAAA,EAEjD,GACMC,KAAe,CAACH,OAAwB;AAC5C,UAAMC,KAAO,KAAK,IAAID,EAAK,GACrBE,KAAO,KAAK,IAAIF,EAAK,GACrBI,KAAK,CAAC/B,IAAM6B,IACZG,KAAK/B,IAAM2B;AACjB,WAAO;AAAA,MACL,GAAGzB,IAAS4B,KAAK3B,IAAS4B;AAAA,MAC1B,GAAG5B,IAAS2B,KAAK5B,IAAS6B;AAAA,IAAA;AAAA,EAE9B,GAEMC,KAA+C,CAAA;AACrD,MAAIC,KAAKV,IACLW,IAAYV;AAChB,SAAO,KAAK,IAAIU,CAAS,IAAI,QAAM;AACjC,UAAMC,KACJ,KAAK,KAAKD,CAAS,IAAI,KAAK,IAAI,KAAK,IAAIA,CAAS,GAAG,KAAK,KAAK,CAAC,GAC5DE,KAAKH,KAAKE,IACVE,KAAK,IAAI,IAAK,KAAK,IAAIF,KAAO,CAAC,GAC/BG,KAAQb,GAAaQ,EAAE,GACvBM,KAAMd,GAAaW,EAAE,GACrBI,KAAKX,GAAaI,EAAE,GACpBQ,KAAKZ,GAAaO,EAAE;AAC1B,IAAAJ,GAAI,KAAK;AAAA,MACP,IAAI,EAAE,GAAGM,GAAM,IAAID,KAAIG,GAAG,GAAG,GAAGF,GAAM,IAAID,KAAIG,GAAG,EAAA;AAAA,MACjD,IAAI,EAAE,GAAGD,GAAI,IAAIF,KAAII,GAAG,GAAG,GAAGF,GAAI,IAAIF,KAAII,GAAG,EAAA;AAAA,MAC7C,IAAIF;AAAA,IAAA,CACL,GACDN,KAAKG,IACLF,KAAaC;AAAA,EACf;AACA,SAAIH,GAAI,SAAS,MACfA,GAAIA,GAAI,SAAS,CAAC,EAAE,KAAKlF,GAASgD,CAAE,IAE/BkC;AACT;AAEO,SAASU,GAAiBpD,GAAuB;AACtD,QAAMqD,IAASC,GAAiBtD,CAAC,GAC3BuD,IAAoB,CAAA;AAC1B,MAAIzE,IAAkB,CAAA,GAClBC,IAAoB,CAAA,GACpByE,IAAI,GACJC,IAAI,GACJC,IAAS,GACTC,IAAS,GACTC,IAAwB,MACxBC,IAAI,GACJC,IAAM,IACNC,IAAU;AAEd,QAAMC,IAAU,MAAM,OAAOX,EAAOQ,GAAG,CAAC,GAElCI,IAAQ,CAACpF,MAAoB;AACjC,IACEA,KACAC,EAAQ,SAAS,KACjB1B,GAAM0B,EAAQ,CAAC,GAAGA,EAAQA,EAAQ,SAAS,CAAC,CAAC,KAE7CA,EAAQ,IAAA;AAEV,UAAMoF,IAAWrF,IAASC,EAAQ,SAAS,KAAK,IAAI,GAAGA,EAAQ,SAAS,CAAC;AACzE,WAAOC,EAAM,SAASmF,IAAU,CAAAnF,EAAM,IAAA;AACtC,WAAOA,EAAM,SAASmF,IAAU,CAAAnF,EAAM,KAAK,EAAE,MAAM,QAAQ;AAC3D,IAAID,EAAQ,UAAU,KACpByE,EAAM,KAAK;AAAA,MACT,QAAA1E;AAAA,MACA,SAASC,EAAQ,IAAItB,EAAQ;AAAA,MAC7B,OAAOuB,EAAM;AAAA,QAAI,CAACR,MAChBA,EAAK,SAAS,SACV,EAAE,MAAM,WACR,EAAE,MAAM,SAAS,IAAIf,GAASe,EAAK,EAAE,GAAG,IAAIf,GAASe,EAAK,EAAE,EAAA;AAAA,MAAE;AAAA,IACpE,CACD,GAEHO,IAAU,CAAA,GACVC,IAAQ,CAAA,GACRgF,IAAU;AAAA,EACZ,GAEMI,IAAa,CAAC1G,MACdqB,EAAQ,SAAS,KAAK1B,GAAM0B,EAAQA,EAAQ,SAAS,CAAC,GAAGrB,CAAC,IAAU,MACxEqB,EAAQ,KAAKtB,GAASC,CAAC,CAAC,GACjB;AAGT,SAAOoG,IAAIR,EAAO,UAAQ;AACxB,UAAMlH,IAAIkH,EAAOQ,CAAC;AAMlB,YALI,WAAW,KAAK1H,CAAC,MACnB2H,IAAM3H,GACN0H,MAGMC,GAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMM,IAAQN,MAAQ,KAChBO,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA;AACnC,QAAID,OAAe,EAAK,GACxBP,IAAIa,GACJZ,IAAIa,GACJZ,IAASF,GACTG,IAASF,GACTU,EAAW,EAAE,GAAAX,GAAG,GAAAC,GAAG,GACnBM,IAAU,IACVH,IAAW,MACXE,IAAMM,IAAQ,MAAM;AACpB;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMA,IAAQN,MAAQ;AACtB,QAAAN,IAAIY,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC5BP,IAAIW,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GACxBG,EAAW,EAAE,GAAAX,GAAG,GAAAC,EAAA,CAAG,KAAG1E,EAAM,KAAK,EAAE,MAAM,QAAQ,GACrD6E,IAAW;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,QAAAJ,IAAIM,MAAQ,MAAMN,IAAIQ,EAAA,IAAYA,EAAA,GAC9BG,EAAW,EAAE,GAAAX,GAAG,GAAAC,EAAA,CAAG,KAAG1E,EAAM,KAAK,EAAE,MAAM,QAAQ,GACrD6E,IAAW;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,QAAAH,IAAIK,MAAQ,MAAML,IAAIO,EAAA,IAAYA,EAAA,GAC9BG,EAAW,EAAE,GAAAX,GAAG,GAAAC,EAAA,CAAG,KAAG1E,EAAM,KAAK,EAAE,MAAM,QAAQ,GACrD6E,IAAW;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMQ,IAAQN,MAAQ,KAChBS,IAAKH,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BQ,IAAKJ,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BS,IAAKL,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BU,IAAKN,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA;AACnC,QAAIG,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,EAAE,GAAGwF,GAAI,GAAGC,EAAA;AAAA,UAChB,IAAI,EAAE,GAAGC,GAAI,GAAGC,EAAA;AAAA,QAAG,CACpB,GAEHd,IAAW,EAAE,GAAGa,GAAI,GAAGC,EAAA,GACvBlB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChBpE,IAAKkE,IACP,EAAE,GAAG,IAAIJ,IAAII,EAAS,GAAG,GAAG,IAAIH,IAAIG,EAAS,EAAA,IAC7C,EAAE,GAAAJ,GAAG,GAAAC,EAAA,GACHgB,IAAKL,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BU,IAAKN,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA;AACnC,QAAIG,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAAW;AAAA,UACA,IAAI,EAAE,GAAG+E,GAAI,GAAGC,EAAA;AAAA,QAAG,CACpB,GAEHd,IAAW,EAAE,GAAGa,GAAI,GAAGC,EAAA,GACvBlB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChBa,IAAKP,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BY,IAAKR,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7B,EAAE,IAAAtE,GAAI,IAAAC,EAAA,IAAOX,GAAiB,EAAE,GAAAwE,GAAG,GAAAC,KAAK,EAAE,GAAGkB,GAAI,GAAGC,KAAM,EAAE,GAAGP,GAAI,GAAGC,GAAI;AAChF,QAAIH,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK,EAAE,MAAM,SAAS,IAAAW,GAAI,IAAAC,GAAI,GAEtCiE,IAAW,EAAE,GAAGe,GAAI,GAAGC,EAAA,GACvBpB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChBa,IAAaf,IAAW,IAAIJ,IAAII,EAAS,IAAIJ,GAC7CoB,IAAahB,IAAW,IAAIH,IAAIG,EAAS,IAAIH,GAC7CY,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7B,EAAE,IAAAtE,GAAI,IAAAC,EAAA,IAAOX,GAAiB,EAAE,GAAAwE,GAAG,GAAAC,KAAK,EAAE,GAAGkB,GAAI,GAAGC,KAAM,EAAE,GAAGP,GAAI,GAAGC,GAAI;AAChF,QAAIH,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK,EAAE,MAAM,SAAS,IAAAW,GAAI,IAAAC,GAAI,GAEtCiE,IAAW,EAAE,GAAGe,GAAI,GAAGC,EAAA,GACvBpB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChB3D,IAAK6D,EAAA,GACL5D,IAAK4D,EAAA,GACLa,IAAMb,EAAA,GACN1D,IAAW0D,QAAc,GACzBzD,IAAQyD,QAAc,GACtBK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,KAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7Bc,KAAS5E;AAAA,UACb,EAAE,GAAAsD,GAAG,GAAAC,EAAA;AAAA,UACLtD;AAAA,UACAC;AAAA,UACAyE;AAAA,UACAvE;AAAA,UACAC;AAAA,UACA,EAAE,GAAG8D,GAAI,GAAGC,GAAA;AAAA,QAAG;AAEjB,YAAIQ,GAAO,WAAW;AACpB,UAAIX,EAAW,EAAE,GAAGE,GAAI,GAAGC,IAAI,KAAGvF,EAAM,KAAK,EAAE,MAAM,QAAQ;AAAA;AAE7D,qBAAWgG,KAASD;AAClB,YAAIX,EAAWY,EAAM,EAAE,KACrBhG,EAAM,KAAK,EAAE,MAAM,SAAS,IAAIgG,EAAM,IAAI,IAAIA,EAAM,GAAA,CAAI;AAI9D,QAAAnB,IAAW,MACXJ,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,QAAKlH,GAAM,EAAE,GAAAoG,GAAG,GAAAC,EAAA,GAAK,EAAE,GAAGC,GAAQ,GAAGC,EAAA,CAAQ,KAC3C5E,EAAM,KAAK,EAAE,MAAM,OAAA,CAAQ,GAE7ByE,IAAIE,GACJD,IAAIE,GACJM,EAAM,EAAI,GACVL,IAAW;AACX;AAAA,MACF;AAAA,MACA;AACE,QAAAC;AACA;AAAA,IAAA;AAAA,EAEN;AAEA,SAAIE,OAAe,EAAK,GACjBR;AACT;AAEO,SAASyB,GAAYhH,GAAwB;AAClD,MAAIA,EAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,QAAMiH,IAAKjH,EAAK,QAAQ,CAAC;AACzB,MAAIgC,IAAI,KAAKxB,GAASyG,EAAG,CAAC,CAAC,IAAIzG,GAASyG,EAAG,CAAC,CAAC;AAC7C,QAAMxG,IAAIV,GAAUC,CAAI;AACxB,WAAS,IAAI,GAAG,IAAIS,GAAG,KAAK;AAC1B,UAAMH,IAAKH,GAAOH,GAAM,CAAC,GACnBO,IAAOP,EAAK,MAAM,CAAC;AAGzB,IADEA,EAAK,UAAU,MAAMS,IAAI,MAAM,CAACF,KAAQA,EAAK,SAAS,YAEpD,CAACA,KAAQA,EAAK,SAAS,SACzByB,KAAK,MAAMxB,GAASF,EAAG,CAAC,CAAC,IAAIE,GAASF,EAAG,CAAC,CAAC,KAE3C0B,KAAK,MAAMxB,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASF,EAAG,CAAC,CAAC,IAAIE,GAASF,EAAG,CAAC,CAAC;AAAA,EAE3I;AACA,SAAIN,EAAK,WAAQgC,KAAK,OACfA;AACT;AAEO,SAASkF,GAAgB3B,GAAkC;AAChE,QAAM4B,IAAK5B,EACR,OAAO,CAACvF,MAASA,EAAK,QAAQ,UAAU,CAAC,EACzC,IAAIgH,EAAW,EACf,OAAO,OAAO;AACjB,MAAIG,EAAG,WAAW;AAChB,WAAO,EAAE,OAAO,IAAI,UAAU,CAAA,EAAC;AAEjC,QAAMC,IAAWC,GAAuBF,CAAE;AAC1C,SAAO;AAAA,IACL,GAAGC;AAAA,IACH,UAAUA,EAAS,SAAS;AAAA,MAAI,CAACxG,MAC/BA,EAAK,SAAS,KAAKxB,GAAMwB,EAAK,CAAC,GAAGA,EAAKA,EAAK,SAAS,CAAC,CAAC,IACnDA,EAAK,MAAM,GAAG,EAAE,IAChBA;AAAA,IAAA;AAAA,EACN;AAEJ;AAEA,MAAM0G,KAAmB,KAAK,KAAK,KAAM,KACnCC,KAAkB,GAClBC,KAAiB,GACjBC,KAAuB,OAEvBC,KAAuB;AAE7B,SAASC,GAAWC,GAAYC,GAAWjK,GAAoB;AAC7D,QAAMkK,IAAKD,EAAI,IAAID,EAAK,GAClBG,IAAKF,EAAI,IAAID,EAAK,GAClBI,IAAKpK,EAAK,IAAIiK,EAAI,GAClBI,IAAKrK,EAAK,IAAIiK,EAAI;AACxB,SAAO,KAAK,MAAMC,IAAKG,IAAKF,IAAKC,GAAIF,IAAKE,IAAKD,IAAKE,CAAE;AACxD;AAEA,SAASC,GAAiBC,GAAsB;AAC9C,MAAIA,EAAI,SAASZ,GAAiB,QAAO;AACzC,QAAMlI,IAAI8I,EAAI,CAAC,GACT7I,IAAI6I,EAAIA,EAAI,SAAS,CAAC,GACtB3G,IAAQ4G,GAAS/I,GAAGC,CAAC;AAC3B,MAAIkC,IAAQrC,GAAK,QAAO;AACxB,MAAIkJ,IAAS,GACTC,IAAO;AACX,WAASzC,IAAI,GAAGA,IAAIsC,EAAI,SAAS,GAAGtC,KAAK;AACvC,UAAM0C,IAAOC,GAAmBL,EAAItC,CAAC,GAAGxG,GAAGC,CAAC;AAC5C,IAAA+I,IAAS,KAAK,IAAIA,GAAQE,EAAK,QAAQ;AACvC,UAAM1I,IAAI,KAAK;AAAA,OACZP,EAAE,IAAID,EAAE,MAAM8I,EAAItC,CAAC,EAAE,IAAIxG,EAAE,MAAMC,EAAE,IAAID,EAAE,MAAM8I,EAAItC,CAAC,EAAE,IAAIxG,EAAE;AAAA,IAAA;AAE/D,QAAIQ,MAAM;AACV,UAAIyI,MAAS,EAAG,CAAAA,IAAOzI;AAAA,eACdA,MAAMyI,EAAM,QAAO;AAAA;AAAA,EAC9B;AAIA,MAHID,IAAS,KAAK,IAAIb,IAAgBhG,IAAQiG,EAAoB,KAG9DY,IAAS7G,IAAQkG;AACnB,WAAO;AAET,WAAS7B,IAAI,GAAGA,IAAIsC,EAAI,SAAS,GAAGtC;AAClC,QAAI,KAAK,IAAI8B,GAAWQ,EAAItC,IAAI,CAAC,GAAGsC,EAAItC,CAAC,GAAGsC,EAAItC,IAAI,CAAC,CAAC,CAAC,IAAIyB;AACzD,aAAO;AAGX,SAAO;AACT;AAEA,SAASmB,GAAmBN,GAAuB;AACjD,QAAM9H,IAAO8H,EAAI,CAAC,GACZ7H,IAAK6H,EAAIA,EAAI,SAAS,CAAC;AAC7B,MAAI9G,IAAO8G,EAAI,KAAK,MAAMA,EAAI,SAAS,CAAC,CAAC,GACrCE,IAAS;AACb,WAASxC,IAAI,GAAGA,IAAIsC,EAAI,SAAS,GAAGtC,KAAK;AACvC,UAAM7D,IAAIwG,GAAmBL,EAAItC,CAAC,GAAGxF,GAAMC,CAAE,EAAE;AAC/C,IAAI0B,IAAIqG,MACNA,IAASrG,GACTX,IAAO8G,EAAItC,CAAC;AAAA,EAEhB;AACA,QAAM,EAAE,IAAAnE,GAAI,IAAAC,EAAA,IAAOP,GAAoBf,GAAMC,GAAIe,CAAI;AACrD,SAAO,EAAE,MAAM,SAAS,IAAAK,GAAI,IAAAC,EAAA;AAC9B;AAMA,SAAS+G,GAAwBrI,GAAYqB,GAAUC,GAAUrB,GAAkB;AACjF,QAAMqI,IAAUC,GAAiBvI,GAAMqB,GAAIC,GAAIrB,GAAI,EAAE;AACrD,MAAI+H,IAAS;AACb,aAAWQ,KAASF;AAClB,IAAAN,IAAS,KAAK,IAAIA,GAAQG,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE,QAAQ;AAExE,SAAO+H;AACT;AAGO,SAASS,GAAezI,GAAYqB,GAAUC,GAAUrB,GAAmB;AAChF,QAAMkB,IAAQ4G,GAAS/H,GAAMC,CAAE,GACzByI,IAAML,GAAwBrI,GAAMqB,GAAIC,GAAIrB,CAAE;AACpD,SAAIkB,IAAQrC,KAAY4J,IAAM5J,KACvB4J,IAAMvH,IAAQkG;AACvB;AAEA,SAASsB,GAAqBhJ,GAA0B;AACtD,QAAM,IAAID,GAAUC,CAAI;AACxB,MAAIiJ,IAAU;AACd,QAAMlI,IAAQf,EAAK,MAAM,IAAI,CAACO,GAAMsF,MAC9BA,KAAK,KAAKtF,EAAK,SAAS,WACxB,CAACuI,GAAe7I,GAASD,GAAM6F,CAAC,GAAGtF,EAAK,IAAIA,EAAK,IAAIJ,GAAOH,GAAM6F,CAAC,CAAC,IAC/DtF,KAET0I,IAAU,IACH,EAAE,MAAM,OAAA,EAChB;AACD,SAAOA,IAAU,EAAE,GAAGjJ,GAAM,OAAAe,MAAUf;AACxC;AAEO,SAASkJ,GAAyBlJ,GAA0B;AACjE,QAAM,IAAIA,EAAK,QAAQ;AACvB,MAAI,IAAIuH,GAAiB,QAAOvH;AAChC,QAAMmJ,IAAM,CAACtD,OAAgBA,IAAI,IAAK,KAAK,GAErCuD,IAAW,CAACvD,MAChB7F,EAAK,SAASA,EAAK,MAAMmJ,EAAItD,IAAI,CAAC,CAAC,IAAIA,IAAI,IAAI7F,EAAK,MAAM6F,IAAI,CAAC,IAAI,QAC/DwD,IAAW,CAACxD,MAChB7F,EAAK,UAAyB6F,IAAI,IAAI,IAAxB7F,EAAK,MAAM6F,CAAC,IAAgC,QAEtDyD,IAAU,CAACzD,MAAuB;;AAEtC,WADI,CAAC7F,EAAK,WAAW6F,MAAM,KAAKA,MAAM,IAAI,QACtClM,IAAAyP,EAASvD,CAAC,MAAV,gBAAAlM,EAAa,UAAS,aAAW4P,IAAAF,EAASxD,CAAC,MAAV,gBAAA0D,EAAa,UAAS,UAClD,KAGP,KAAK;AAAA,MACH5B,GAAW3H,EAAK,QAAQmJ,EAAItD,IAAI,CAAC,CAAC,GAAG7F,EAAK,QAAQ6F,CAAC,GAAG7F,EAAK,QAAQmJ,EAAItD,IAAI,CAAC,CAAC,CAAC;AAAA,IAAA,IAC5EyB;AAAA,EAER;AAEA,MAAItC,IAAQ;AACZ,MAAIhF,EAAK,QAAQ;AACf,UAAMwJ,IAAQ,CAAC,GAAG,MAAM,CAAC,EAAE,KAAA,CAAM,EAAE,KAAKF,CAAO;AAC/C,QAAIE,KAAS,KAAM,QAAOxJ;AAC1B,IAAAgF,IAAQwE;AAAA,EACV;AAEA,QAAMC,IAAe,CAAA,GACfC,IAAmB,CAAA,GACnBC,IAAO3J,EAAK,SAAS,IAAI,IAAI,GAE7B4J,IAAU,CAACC,GAAeC,MAAgB;AAC9C,UAAM3B,IAAc,CAAA;AACpB,aAAS,IAAI0B,GAAO,KAAKC,GAAK;AAC5B,MAAA3B,EAAI,KAAKnI,EAAK,QAAQmJ,EAAInE,IAAQ,CAAC,CAAC,CAAC;AAEvC,UAAM+E,IAAY5B,EAAI,MAAM,GAAG,EAAE,EAAE,MAAM,CAAC6B,GAAGjF,MAAM;AACjD,YAAMxE,IAAOP,EAAK,MAAMmJ,EAAInE,IAAQ6E,IAAQ9E,CAAC,CAAC;AAC9C,aAAO,CAACxE,KAAQA,EAAK,SAAS;AAAA,IAChC,CAAC;AAED,QADIkJ,EAAK,WAAW,KAAGA,EAAK,KAAKjK,GAAS2I,EAAI,CAAC,CAAC,CAAC,GAC7C4B,KAAa7B,GAAiBC,CAAG,GAAG;AACtC,MAAAsB,EAAK,KAAKjK,GAAS2I,EAAIA,EAAI,SAAS,CAAC,CAAC,CAAC,GACvCuB,EAAK,KAAKjB,GAAmBN,CAAG,CAAC;AACjC;AAAA,IACF;AACA,aAASpD,IAAI,GAAGA,IAAIoD,EAAI,QAAQpD;AAC9B,MAAA0E,EAAK,KAAKjK,GAAS2I,EAAIpD,CAAC,CAAC,CAAC,GAC1B2E,EAAK,KAAK1J,EAAK,MAAMmJ,EAAInE,IAAQ6E,IAAQ9E,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,QAAQ;AAAA,EAExE;AAEA,MAAIkF,IAAO;AACX,WAASC,IAAI,GAAGA,KAAKP,GAAMO,KAAK;AAC9B,UAAMrE,IAAIsD,EAAInE,IAAQkF,CAAC;AACvB,KAAIA,MAAMP,KAAQL,EAAQzD,CAAC,OACzB+D,EAAQK,GAAMC,CAAC,GACfD,IAAOC;AAAA,EAEX;AAEA,EACElK,EAAK,UACLyJ,EAAK,SAAS,KACdrK,GAAMqK,EAAK,CAAC,GAAGA,EAAKA,EAAK,SAAS,CAAC,CAAC,KAEpCA,EAAK,IAAA;AAEP,QAAMvD,IAAWlG,EAAK,SAASyJ,EAAK,SAAS,KAAK,IAAI,GAAGA,EAAK,SAAS,CAAC;AACxE,SAAOC,EAAK,SAASxD,IAAU,CAAAwD,EAAK,IAAA;AACpC,SAAID,EAAK,SAAS,IAAUzJ,IACrB,EAAE,QAAQA,EAAK,QAAQ,SAASyJ,GAAM,OAAOC,EAAA;AACtD;AAEO,SAASS,GAAgB/C,GAAqC;AACnE,QAAMgD,IAAYhD,EAAS,MAAM,QAAQ,CAAC3H,MAAM2F,GAAiB3F,EAAE,CAAC,CAAC;AAMrE,UALe2K,EAAU,KAAK,CAACpK,MAASA,EAAK,QAAQ,UAAU,CAAC,IAC5DoK,EAAU,OAAO,CAACpK,MAASA,EAAK,QAAQ,UAAU,CAAC,IACnDoH,EAAS,SACN,OAAO,CAACxG,MAASA,EAAK,UAAU,CAAC,EACjC,IAAI,CAACA,MAASD,GAAgBC,GAAM,EAAI,CAAC,GAClC,IAAI,CAACZ,MAASgJ,GAAqBE,GAAyBlJ,CAAI,CAAC,CAAC;AAClF;AAGO,SAASqK,GAAgBrK,GAAgBE,GAAmB2I,GAAmB;AACpF,QAAMxI,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAC9C,SAAIK,EAAK,SAAS,UACT+J,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,EAAE,QAErDkI,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE;AAC7C;AAEO,SAASgK,GACdzB,GACA5H,GACAS,GACAC,GACAC,GAC8C;AAC9C,QAAM+G,IAAUC,GAAiB3H,GAAIS,GAAIC,GAAIC,GAAI,EAAE;AACnD,MAAI2I,IAAQ,GACRC,IAAS7B,EAAQ,CAAC,GAClB8B,IAAQrC,GAASS,GAAOF,EAAQ,CAAC,CAAC;AACtC,WAAS9C,IAAI,GAAGA,IAAI8C,EAAQ,QAAQ9C,KAAK;AACvC,UAAM7D,IAAIoG,GAASS,GAAOF,EAAQ9C,CAAC,CAAC;AACpC,IAAI7D,IAAIyI,MACNA,IAAQzI,GACRwI,IAAS7B,EAAQ9C,CAAC,GAClB0E,IAAQ1E,KAAK8C,EAAQ,SAAS;AAAA,EAElC;AACA,SAAO,EAAE,GAAG4B,GAAO,OAAOC,GAAQ,UAAUC,EAAA;AAC9C;ACnsBA,SAASC,GAAcC,GAA8B;AACnD,SAAOA,EAAS,IAAI,CAAC/J,MAASA,EAAK,IAAI,CAACnB,OAAO,EAAE,GAAGA,EAAE,GAAG,GAAGA,EAAE,EAAA,EAAI,CAAC;AACrE;AAGO,SAASmL,GAAgBD,GAA4B;AAC1D,SAAOA,EACJ,IAAI,CAAC/J,MAAS;AACb,QAAIA,EAAK,WAAW,EAAG,QAAO;AAC9B,QAAIoB,IAAI,KAAKpB,EAAK,CAAC,EAAE,CAAC,IAAIA,EAAK,CAAC,EAAE,CAAC;AACnC,aAASiF,IAAI,GAAGA,IAAIjF,EAAK,QAAQiF;AAC/B,MAAA7D,KAAK,MAAMpB,EAAKiF,CAAC,EAAE,CAAC,IAAIjF,EAAKiF,CAAC,EAAE,CAAC;AAEnC,WAAA7D,KAAK,MACEA;AAAA,EACT,CAAC,EACA,KAAK,GAAG;AACb;AAEO,SAAS6I,GAAmBF,GAAmC;AACpE,QAAMG,IAAUH,EACb,IAAI,CAAC/J,MAEFA,EAAK,SAAS,KACdA,EAAK,CAAC,EAAE,MAAMA,EAAKA,EAAK,SAAS,CAAC,EAAE,KACpCA,EAAK,CAAC,EAAE,MAAMA,EAAKA,EAAK,SAAS,CAAC,EAAE,IAE7BA,EAAK,MAAM,GAAG,EAAE,IAElBA,CACR,EACA,OAAO,CAACA,MAASA,EAAK,UAAU,CAAC;AACpC,SAAO;AAAA,IACL,OAAOkK,EAAQ,IAAI,CAAClK,OAAU;AAAA,MAC5B,GAAGgK,GAAgB,CAAChK,CAAI,CAAC;AAAA,MACzB,QAAQ;AAAA,IAAA,EACR;AAAA,IACF,UAAUkK;AAAA,EAAA;AAEd;AAEA,SAASC,GAAYxF,GAAkC;AACrD,SAAO2B,GAAgB3B,CAAK;AAC9B;AAEA,SAASyF,GAAkBhL,GAAgBiL,GAAoC;AAC7E,SAAIjL,EAAK,UACCiL,IAAc,IAAIjL,EAAK,QAAQ,UAAUA,EAAK,QAAQ,SAEzDiL,IAAc,IAAIA,IAAc,IAAI;AAC7C;AAEA,SAASC,GAAkBlL,GAAgBiL,GAAoC;AAC7E,SAAIjL,EAAK,UACFiL,IAAcjL,EAAK,QAAQ,SAAS,IADnBiL,IACqC;AAC/D;AAEO,SAASE,GACd/D,GACA5C,GACAC,GACe;AACf,QAAM2G,IAAQ,EAAE,GAAG5G,GAAI,GAAGC,EAAA,GACpBc,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAI,CAACpH,OAAU;AAAA,IACrD,QAAQA,EAAK;AAAA,IACb,SAASA,EAAK,QAAQ,IAAI,CAACP,MAAMC,GAAOD,GAAG2L,CAAK,CAAC;AAAA,IACjD,OAAOpL,EAAK,MAAM;AAAA,MAAI,CAACO,MACrBA,EAAK,SAAS,SACV,EAAE,MAAM,WACR;AAAA,QACE,MAAM;AAAA,QACN,IAAIb,GAAOa,EAAK,IAAI6K,CAAK;AAAA,QACzB,IAAI1L,GAAOa,EAAK,IAAI6K,CAAK;AAAA,MAAA;AAAA,IAC3B;AAAA,EACN,EACA;AACF,MAAI7F,EAAM,WAAW,GAAG;AACtB,UAAMoF,IAAWD,GAActD,EAAS,QAAQ,EAAE;AAAA,MAAI,CAACxG,MACrDA,EAAK,IAAI,CAACnB,OAAO,EAAE,GAAGA,EAAE,IAAI+E,GAAI,GAAG/E,EAAE,IAAIgF,IAAK;AAAA,IAAA;AAEhD,WAAOoG,GAAmBF,CAAQ;AAAA,EACpC;AACA,SAAOI,GAAYxF,CAAK;AAC1B;AAGO,SAAS8F,GACdjE,GACAkE,GACApL,GACAkL,GACe;AACf,MAAIA,EAAM,MAAM,KAAKA,EAAM,MAAM,EAAG,QAAOhE;AAC3C,QAAM7B,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AACnE,QAAMmE,IAAUrL,GACVsL,KAAStL,IAAY,KAAKF,EAAK,QAAQ;AAC7C,EAAAA,EAAK,QAAQuL,CAAO,IAAI7L,GAAOM,EAAK,QAAQuL,CAAO,GAAGH,CAAK,GAC3DpL,EAAK,QAAQwL,CAAK,IAAI9L,GAAOM,EAAK,QAAQwL,CAAK,GAAGJ,CAAK;AACvD,QAAM7K,IAAOP,EAAK,MAAME,CAAS;AACjC,GAAIK,KAAA,gBAAAA,EAAM,UAAS,YACjBA,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK,GAC/B7K,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK;AAEjC,QAAMhC,IAAW4B,GAAkBhL,GAAMuL,CAAO;AAChD,MAAInC,KAAY,QAAQA,MAAalJ,GAAW;AAC9C,UAAM0H,IAAO5H,EAAK,MAAMoJ,CAAQ;AAChC,KAAIxB,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAKlI,GAAOkI,EAAK,IAAIwD,CAAK;AAAA,EAC7D;AACA,QAAM/B,IAAW6B,GAAkBlL,GAAMwL,CAAK;AAC9C,MAAInC,KAAY,QAAQA,MAAanJ,GAAW;AAC9C,UAAMtC,IAAOoC,EAAK,MAAMqJ,CAAQ;AAChC,KAAIzL,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAK8B,GAAO9B,EAAK,IAAIwN,CAAK;AAAA,EAC7D;AACA,SAAOL,GAAYxF,CAAK;AAC1B;AAGO,SAASkG,GACdrE,GACAsE,GACAC,GACQ;AAER,QAAM3L,IADQmK,GAAgB/C,CAAQ,EACnBsE,CAAY;AAC/B,MAAI,CAAC1L,KAAQA,EAAK,QAAQ,SAAS,UAAU,CAAA;AAC7C,MAAI2L,IAAc,KAAKA,KAAe3L,EAAK,QAAQ,eAAe,CAAA;AAClE,QAAM4L,IAAQ5L,EAAK,QAAQ,QACrB4H,IAAO5H,EAAK,SAAS2L,IAAc,IAAIC,KAASA,CAAK,GACrDhO,IAAOoC,EAAK,SAAS2L,IAAc,KAAKC,CAAK,GAC7CzO,IAAS,CAACqC,GAASoI,CAAI,CAAC;AAC9B,UAAIA,EAAK,MAAMhK,EAAK,KAAKgK,EAAK,MAAMhK,EAAK,MAAGT,EAAO,KAAKqC,GAAS5B,CAAI,CAAC,GAC/DT;AACT;AAEO,SAAS0O,GACdzE,GACAsE,GACAC,GACA9C,GACe;AACf,QAAMtD,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAMmG,CAAY;AAC/B,MAAI,CAAC1L,KAAQ2L,IAAc,KAAKA,KAAe3L,EAAK,QAAQ;AAC1D,WAAOoH;AAET,QAAMQ,IAAO5H,EAAK,QAAQ2L,CAAW,GAC/BP,IAAQzL,GAAOkJ,GAAOjB,CAAI;AAChC,EAAA5H,EAAK,QAAQ2L,CAAW,IAAInM,GAASqJ,CAAK;AAC1C,QAAMO,IAAW4B,GAAkBhL,GAAM2L,CAAW,GAC9CtC,IAAW6B,GAAkBlL,GAAM2L,CAAW;AACpD,MAAIvC,KAAY,MAAM;AACpB,UAAM7I,IAAOP,EAAK,MAAMoJ,CAAQ;AAChC,KAAI7I,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK;AAAA,EAC7D;AACA,MAAI/B,KAAY,MAAM;AACpB,UAAM9I,IAAOP,EAAK,MAAMqJ,CAAQ;AAChC,KAAI9I,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK;AAAA,EAC7D;AACA,SAAOL,GAAYxF,CAAK;AAC1B;AAEO,SAASuG,GACd1E,GACAkE,GACApL,GACA6L,GACAlD,GACe;AACf,QAAMtD,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS,GACtB/K,IAAOP,KAAA,gBAAAA,EAAM,MAAME;AACzB,SAAI,CAACK,KAAQA,EAAK,SAAS,UAAgB6G,KACvC2E,MAAW,IAAGxL,EAAK,KAAKf,GAASqJ,CAAK,IACrCtI,EAAK,KAAKf,GAASqJ,CAAK,GACtBkC,GAAYxF,CAAK;AAC1B;AAGO,SAASyG,GACd5E,GACAkE,GACApL,GACe;AACf,QAAMqF,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS,GACtB/K,IAAOP,KAAA,gBAAAA,EAAM,MAAME;AACzB,SAAI,CAACK,KAAQA,EAAK,SAAS,UAAgB6G,KAC3CpH,EAAK,MAAME,CAAS,IAAI,EAAE,MAAM,OAAA,GACzB6K,GAAYxF,CAAK;AAC1B;AAGO,SAAS0G,GACd7E,GACAkE,GACApL,GACAmB,GACe;AACf,QAAMkE,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AACnE,QAAM/G,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3B,EAAE,IAAAwB,GAAI,IAAAC,EAAA,IAAOP,GAAoBf,GAAMC,GAAIe,CAAI;AACrD,SAAArB,EAAK,MAAME,CAAS,IAAI,EAAE,MAAM,SAAS,IAAAwB,GAAI,IAAAC,EAAA,GACtCoJ,GAAYxF,CAAK;AAC1B;AAKO,SAAS2G,GACd9E,GACAsE,GACAS,GACAtD,GACe;AACf,QAAMtD,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAMmG,CAAY;AAC/B,MAAI,CAAC1L,KAAQmM,IAAmB,KAAKA,KAAoBnM,EAAK,QAAQ;AACpE,WAAOoH;AAET,QAAMlH,IAAYgL,GAAkBlL,GAAMmM,CAAgB;AAC1D,MAAIjM,KAAa,KAAM,QAAOkH;AAC9B,QAAM7G,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA,GACxCG,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS;AAEjC,MAAIK,EAAK,SAAS,SAAS;AACzB,UAAM,EAAE,GAAApC,EAAA,IAAMmM,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,GACzD8L,IAAS,KAAK,IAAI,MAAM,KAAK,IAAI,MAAMjO,CAAC,CAAC,GACzCkO,IAAQvK,GAAWzB,GAAME,EAAK,IAAIA,EAAK,IAAID,GAAI8L,CAAM;AAC3D,IAAApM,EAAK,QAAQ,OAAOmM,IAAmB,GAAG,GAAG3M,GAAS6M,EAAM,KAAK,EAAE,CAAC,GACpErM,EAAK,MAAM,OAAOE,GAAW,GAAG,EAAE,MAAM,SAAS,IAAImM,EAAM,KAAK,IAAI,IAAIA,EAAM,KAAK,MAAM;AAAA,MACvF,MAAM;AAAA,MACN,IAAIA,EAAM,MAAM;AAAA,MAChB,IAAIA,EAAM,MAAM;AAAA,IAAA,CACjB;AAAA,EACH;AACE,IAAArM,EAAK,QAAQ,OAAOmM,IAAmB,GAAG,GAAG3M,GAASqJ,CAAK,CAAC,GAC5D7I,EAAK,MAAM,OAAOE,GAAW,GAAG,EAAE,MAAM,OAAA,GAAU,EAAE,MAAM,OAAA,CAAQ;AAEpE,SAAO6K,GAAYxF,CAAK;AAC1B;AAGO,SAAS+G,GACdlF,GACAsE,GACAC,GACe;AACf,QAAMpG,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAMmG,CAAY;AAC/B,MAAI,CAAC1L,EAAM,QAAOoH;AAClB,QAAMmF,IAAMvM,EAAK,SAAS,IAAI;AAE9B,MADIA,EAAK,QAAQ,UAAUuM,KACvBZ,IAAc,KAAKA,KAAe3L,EAAK,QAAQ,OAAQ,QAAOoH;AAElE,QAAM3G,IAAIT,EAAK,QAAQ;AACvB,MAAIA,EAAK,QAAQ;AACf,IAAAA,EAAK,QAAQ,OAAO2L,GAAa,CAAC,GAClC3L,EAAK,MAAM,OAAO2L,GAAa,CAAC;AAChC,UAAMa,IAAOb,MAAgB,IAAI3L,EAAK,QAAQ,SAAS,IAAI2L,IAAc;AACzE,IAAI3L,EAAK,MAAMwM,CAAI,MAAGxM,EAAK,MAAMwM,CAAI,IAAI,EAAE,MAAM,OAAA;AAAA,EACnD,MAAA,CAAWb,MAAgB,KACzB3L,EAAK,QAAQ,OAAO,GAAG,CAAC,GACxBA,EAAK,MAAM,OAAO,GAAG,CAAC,KACb2L,MAAgBlL,IAAI,KAC7BT,EAAK,QAAQ,IAAA,GACbA,EAAK,MAAM,IAAA,MAEXA,EAAK,QAAQ,OAAO2L,GAAa,CAAC,GAClC3L,EAAK,MAAM,OAAO2L,GAAa,CAAC,GAChC3L,EAAK,MAAM2L,IAAc,CAAC,IAAI,EAAE,MAAM,OAAA;AAExC,SAAOZ,GAAYxF,CAAK;AAC1B;AAUO,SAASkH,GACdrF,GACAyB,GACA6D,GACkB;AAClB,MAAIC,IAAyB;AAC7B,SAAAxC,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAM0L,MAAiB;AACxD,IAAA1L,EAAK,QAAQ,QAAQ,CAAC4M,GAAQjB,MAAgB;AAC5C,YAAMvD,IAAW,KAAK,MAAMwE,EAAO,IAAI/D,EAAM,GAAG+D,EAAO,IAAI/D,EAAM,CAAC;AAClE,MAAIT,KAAYsE,MAAc,CAACC,KAAQvE,IAAWuE,EAAK,cACrDA,IAAO;AAAA,QACL,cAAAjB;AAAA,QACA,aAAAC;AAAA,QACA,OAAO,EAAE,GAAGiB,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,QAChC,UAAAxE;AAAA,MAAA;AAAA,IAGN,CAAC;AAAA,EACH,CAAC,GACMuE;AACT;AAUO,SAASE,GACdzF,GACAyB,GACA6D,GACkB;AAClB,MAAIC,IAAyB;AAC7B,SAAAxC,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAMsL,MAAc;AACrD,UAAM7K,IAAIV,GAAUC,CAAI;AACxB,aAASE,IAAY,GAAGA,IAAYO,GAAGP,KAAa;AAClD,YAAMK,IAAOP,EAAK,MAAME,CAAS;AACjC,WAAIK,KAAA,gBAAAA,EAAM,UAAS;AACnB,mBAAWwL,KAAU,CAAC,GAAG,CAAC,GAAY;AACpC,gBAAMe,IAAKf,MAAW,IAAIxL,EAAK,KAAKA,EAAK,IACnC6H,IAAW,KAAK,MAAM0E,EAAG,IAAIjE,EAAM,GAAGiE,EAAG,IAAIjE,EAAM,CAAC;AAC1D,UAAIT,KAAYsE,MAAc,CAACC,KAAQvE,IAAWuE,EAAK,cACrDA,IAAO,EAAE,WAAArB,GAAW,WAAApL,GAAW,QAAA6L,GAAQ,OAAOvM,GAASsN,CAAE,GAAG,UAAA1E,EAAA;AAAA,QAEhE;AAAA,IACF;AAAA,EACF,CAAC,GACMuE;AACT;AAWA,SAASI,GACP3F,GACAyB,GACA6D,GACAM,GACgB;AAChB,MAAIL,IAAuB;AAC3B,SAAAxC,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAM0L,MAAiB;AACxD,UAAMjL,IAAIV,GAAUC,CAAI;AACxB,aAAS6F,IAAI,GAAGA,IAAIpF,GAAGoF,KAAK;AAC1B,YAAMxG,IAAIY,GAASD,GAAM6F,CAAC,GACpBvG,IAAIa,GAAOH,GAAM6F,CAAC,GAClBtF,IAAOP,EAAK,MAAM6F,CAAC,KAAK,EAAE,MAAM,OAAA;AACtC,UAAIoH,GACAC;AACJ,UAAIF;AACF,QAAAC,IACE1M,EAAK,SAAS,UACVkB,GAAWpC,GAAGkB,EAAK,IAAIA,EAAK,IAAIjB,GAAG,GAAG,IACtC,EAAE,IAAID,EAAE,IAAIC,EAAE,KAAK,GAAG,IAAID,EAAE,IAAIC,EAAE,KAAK,EAAA,GAC7C4N,IAAO,KAAK,MAAMD,EAAU,IAAIpE,EAAM,GAAGoE,EAAU,IAAIpE,EAAM,CAAC;AAAA,eACrDtI,EAAK,SAAS,SAAS;AAChC,cAAM4M,IAAO7C,GAAgBzB,GAAOxJ,GAAGkB,EAAK,IAAIA,EAAK,IAAIjB,CAAC;AAC1D,QAAA2N,IAAYE,EAAK,OACjBD,IAAOC,EAAK;AAAA,MACd,OAAO;AACL,cAAM5E,IAAOC,GAAmBK,GAAOxJ,GAAGC,CAAC;AAC3C,QAAA2N,IAAY1E,EAAK,OACjB2E,IAAO3E,EAAK;AAAA,MACd;AACA,MAAI2E,KAAQR,MAAc,CAACC,KAAQO,IAAOP,EAAK,cAC7CA,IAAO;AAAA,QACL,cAAAjB;AAAA,QACA,kBAAkB7F;AAAA,QAClB,OAAOoH;AAAA,QACP,UAAUC;AAAA,QACV,MAAM3M,EAAK;AAAA,MAAA;AAAA,IAGjB;AAAA,EACF,CAAC,GACMoM;AACT;AAGO,SAASS,GACdhG,GACAyB,GACA6D,GACgB;AAChB,SAAOK,GAAQ3F,GAAUyB,GAAO6D,GAAW,EAAI;AACjD;AAGO,SAASW,GACdjG,GACAyB,GACA6D,GACgB;AAChB,SAAOK,GAAQ3F,GAAUyB,GAAO6D,GAAW,EAAK;AAClD;AC3ZA,MAAMY,KAAkB;AAoCjB,SAASC,GAAiBC,GAA0B;AACzD,SAAOA,MAAS,UAAUA,MAAS,aAAaA,MAAS;AAC3D;AAEO,SAASC,GAAYpO,GAAcC,GAAuB;AAC/D,SAAOD,EAAE,YAAYC,EAAE,WAAWD,EAAE,cAAcC,EAAE,aAAaD,EAAE,QAAQC,EAAE;AAC/E;AAEA,SAASoO,GAAUnN,GAA0B;AAC3C,SAAOA,EAAK,SAAS,SACjB,EAAE,MAAM,OAAA,IACR,EAAE,MAAM,SAAS,IAAIf,GAASe,EAAK,EAAE,GAAG,IAAIf,GAASe,EAAK,EAAE,EAAA;AAClE;AAEA,SAASoN,GAAU3N,GAA0B;AAC3C,SAAO;AAAA,IACL,QAAQA,EAAK;AAAA,IACb,SAASA,EAAK,QAAQ,IAAIR,EAAQ;AAAA,IAClC,OAAOQ,EAAK,MAAM,IAAI0N,EAAS;AAAA,EAAA;AAEnC;AAEA,SAASE,GAAYrN,GAA0B;AAC7C,SAAIA,EAAK,SAAS,SAAe,EAAE,MAAM,OAAA,IAClC,EAAE,MAAM,SAAS,IAAIf,GAASe,EAAK,EAAE,GAAG,IAAIf,GAASe,EAAK,EAAE,EAAA;AACrE;AAEA,SAASsN,GAAY7N,GAA0B;AAC7C,SAAO;AAAA,IACL,QAAQA,EAAK;AAAA,IACb,SAASA,EAAK,QAAQ,IAAIR,EAAQ,EAAE,QAAA;AAAA,IACpC,OAAOQ,EAAK,MAAM,IAAI0N,EAAS,EAAE,QAAA,EAAU,IAAIE,EAAW;AAAA,EAAA;AAE9D;AAEA,SAASE,GAAqB9N,GAAgB+N,GAAuB;AACnE,MAAI/N,EAAK,UAAUA,EAAK,QAAQ,SAAS,EAAG,QAAOA;AACnD,QAAMgO,IAAQhO,EAAK,QAAQ,CAAC,GACtBiK,IAAOjK,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC;AACjD,MAAI,CAACZ,GAAM4O,GAAO/D,GAAM8D,CAAG,EAAG,QAAO/N;AACrC,QAAMpC,IAAO+P,GAAU3N,CAAI;AAC3B,EAAApC,EAAK,QAAQ,IAAA,GACbA,EAAK,SAAS;AACd,QAAMsI,IAAWtI,EAAK,QAAQ;AAC9B,SAAOA,EAAK,MAAM,SAASsI,IAAU,CAAAtI,EAAK,MAAM,IAAA;AAChD,SAAOA,EAAK,MAAM,SAASsI,IAAU,CAAAtI,EAAK,MAAM,KAAK,EAAE,MAAM,QAAQ;AACrE,SAAOA;AACT;AAEO,SAASqQ,GAAa7G,GAI1B;AACD,QAAM1C,IAAuE,CAAA;AAC7E,SAAAyF,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAMsL,MAAc;AACrD,IAAItL,EAAK,UAAUA,EAAK,QAAQ,SAAS,MACzC0E,EAAI,KAAK;AAAA,MACP,WAAA4G;AAAA,MACA,KAAK;AAAA,MACL,OAAO9L,GAASQ,EAAK,QAAQ,CAAC,CAAC;AAAA,IAAA,CAChC,GACD0E,EAAI,KAAK;AAAA,MACP,WAAA4G;AAAA,MACA,KAAK;AAAA,MACL,OAAO9L,GAASQ,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC,CAAC;AAAA,IAAA,CACtD;AAAA,EACH,CAAC,GACM0E;AACT;AAEA,SAASwJ,GAAelO,GAAgBE,GAAmB2I,GAAqB;AAC9E,QAAMxI,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAC9C,SAAIK,EAAK,SAAS,UACT+J,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,EAAE,WAErDkI,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE;AAC7C;AAEA,SAAS6N,GAAoBtF,GAAa7I,GAAgB+N,GAAsB;AAC9E,QAAMtN,IAAIV,GAAUC,CAAI;AACxB,WAAS,IAAI,GAAG,IAAIS,GAAG;AACrB,QAAIyN,GAAelO,GAAM,GAAG6I,CAAK,KAAKkF,EAAK,QAAO;AAEpD,SAAO;AACT;AAEO,SAASK,GACd/N,GACAC,GACA+N,GACAN,IAAMT,IACG;AACT,QAAMhM,IAAM,EAAE,IAAIjB,EAAK,IAAIC,EAAG,KAAK,GAAG,IAAID,EAAK,IAAIC,EAAG,KAAK,EAAA;AAC3D,aAAWgO,KAASD,GAAQ;AAQ1B,QAPclE,GAAgBmE,EAAM,QAAQ,EACnB;AAAA,MACvB,CAACtO,MACCmO,GAAoB9N,GAAML,GAAM+N,CAAG,KACnCI,GAAoB7N,GAAIN,GAAM+N,CAAG,KACjCI,GAAoB7M,GAAKtB,GAAM+N,CAAG;AAAA,IAAA,EAEtB,QAAO;AACvB,UAAMQ,IAAON,GAAaK,EAAM,QAAQ;AACxC,QAAIC,EAAK,UAAU,GAAG;AACpB,YAAMpB,IAAO,CAAC,MACZoB,EAAK,KAAK,CAACtJ,MAAQmD,GAASnD,EAAI,OAAO,CAAC,KAAK8I,CAAG;AAClD,UAAIZ,EAAK9M,CAAI,KAAK8M,EAAK7M,CAAE,EAAG,QAAO;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASkO,GACPnO,GACAC,GACAuI,GACA4F,GAC+B;AAC/B,QAAMjK,IAAKlE,EAAG,IAAID,EAAK,GACjBoE,IAAKnE,EAAG,IAAID,EAAK,GACjBqO,IAAM,KAAK,MAAMlK,GAAIC,CAAE;AAC7B,MAAIiK,IAAM,KAAM,QAAO;AACvB,QAAMC,IAAO,KAAK,IAAI,KAAK,IAAIF,GAAK,IAAI,IAAI,GAAGC,IAAM,GAAG;AACxD,MAAIC,IAAO,KAAM,QAAO;AACxB,QAAM9K,IAAKW,IAAKkK,GACV5K,IAAKW,IAAKiK,GACVnG,IAAOC,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE;AACjD,MAAInC,KAAKoK,EAAK,IAAIlI,EAAK,KAAKwD,KAAM0E,EAAK,IAAIlI,EAAK,KAAKyD;AACrD,SAAA3F,IAAI,KAAK,IAAIuQ,IAAMC,GAAM,KAAK,IAAIA,GAAMxQ,CAAC,CAAC,GACnC;AAAA,IACL,IAAI,EAAE,GAAGkC,EAAK,IAAIwD,KAAM1F,IAAIwQ,IAAO,GAAGtO,EAAK,IAAIyD,KAAM3F,IAAIwQ,GAAA;AAAA,IACzD,IAAI,EAAE,GAAGtO,EAAK,IAAIwD,KAAM1F,IAAIwQ,IAAO,GAAGtO,EAAK,IAAIyD,KAAM3F,IAAIwQ,GAAA;AAAA,EAAM;AAEnE;AAEA,SAASC,GACPvO,GACAE,GACAD,GACAuI,GACA4F,GAMO;AACP,QAAM,EAAE,GAAAtQ,EAAA,IAAMmM,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,GACzDkB,IAAQ,KAAK,MAAMlB,EAAG,IAAID,EAAK,GAAGC,EAAG,IAAID,EAAK,CAAC,GAC/CwO,IACJrN,IAAQ,OACJ,KAAK,IAAI,MAAM,KAAK,IAAI,MAAOiN,KAAO,IAAIjN,EAAM,CAAC,IACjD,OACAsD,IAAK,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM3G,IAAI0Q,CAAE,CAAC,GAC1CC,IAAK,KAAK,IAAI,MAAM,KAAK,IAAIhK,IAAK,OAAO3G,IAAI0Q,CAAE,CAAC;AACtD,MAAIC,IAAKhK,IAAK,KAAM,QAAO;AAC3B,QAAMkJ,IAAQlM,GAAWzB,GAAME,EAAK,IAAIA,EAAK,IAAID,GAAIwE,CAAE,GACjDiK,KAASD,IAAKhK,KAAM,KAAK,IAAI,MAAM,IAAIA,CAAE,GACzCkK,IAASlN;AAAA,IACbkM,EAAM,KAAK;AAAA,IACXA,EAAM,MAAM;AAAA,IACZA,EAAM,MAAM;AAAA,IACZ1N;AAAA,IACAyO;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,IAAIvP,GAASwO,EAAM,KAAK,EAAE;AAAA,IAC1B,IAAIxO,GAASwP,EAAO,KAAK,EAAE;AAAA,IAC3B,UAAU,EAAE,MAAM,SAAS,IAAIhB,EAAM,KAAK,IAAI,IAAIA,EAAM,KAAK,GAAA;AAAA,IAC7D,WAAW,EAAE,MAAM,SAAS,IAAIgB,EAAO,MAAM,IAAI,IAAIA,EAAO,MAAM,GAAA;AAAA,EAAG;AAEzE;AAEA,SAASC,GACPjP,GACAE,GACAsC,GACArB,GACA+N,GACAC,GACU;AACV,QAAM1O,IAAIT,EAAK,QAAQ,QACjBuL,IAAUrL,GACVsL,KAAStL,IAAY,KAAKO,GAC1BK,IAAU,CAACtB,GAAS2B,CAAE,GAAG3B,GAASQ,EAAK,QAAQwL,CAAK,CAAC,CAAC,GACtDzK,IAAoB,CAAC2M,GAAUyB,CAAS,CAAC;AAC/C,MAAItJ,IAAI2F;AACR,SAAO3F,MAAM0F,KAAS;AACpB,UAAM3N,KAAQiI,IAAI,KAAKpF;AACvB,IAAAM,EAAM,KAAK2M,GAAU1N,EAAK,MAAM6F,CAAC,CAAC,CAAC,GACnC/E,EAAQ,KAAKtB,GAASQ,EAAK,QAAQpC,CAAI,CAAC,CAAC,GACzCiI,IAAIjI;AAAA,EACN;AACA,SAAAkD,EAAQ,KAAKtB,GAASgD,CAAE,CAAC,GACzBzB,EAAM,KAAK2M,GAAUwB,CAAQ,CAAC,GACvB,EAAE,QAAQ,IAAO,SAAApO,GAAS,OAAAC,EAAA;AACnC;AAEA,SAASqO,GACPpP,GACAE,GACAsC,GACArB,GACA+N,GACAC,GACY;AACZ,QAAM5D,IAAUrL,GACVsL,IAAQtL,IAAY,GACpBmP,IAAiB;AAAA,IACrB,QAAQ;AAAA,IACR,SAAS,CAAC,GAAGrP,EAAK,QAAQ,MAAM,GAAGuL,IAAU,CAAC,EAAE,IAAI/L,EAAQ,GAAGA,GAASgD,CAAE,CAAC;AAAA,IAC3E,OAAO;AAAA,MACL,GAAGxC,EAAK,MAAM,MAAM,GAAGuL,CAAO,EAAE,IAAImC,EAAS;AAAA,MAC7CA,GAAUwB,CAAQ;AAAA,IAAA;AAAA,EACpB,GAEII,IAAkB;AAAA,IACtB,QAAQ;AAAA,IACR,SAAS,CAAC9P,GAAS2B,CAAE,GAAG,GAAGnB,EAAK,QAAQ,MAAMwL,CAAK,EAAE,IAAIhM,EAAQ,CAAC;AAAA,IAClE,OAAO,CAACkO,GAAUyB,CAAS,GAAG,GAAGnP,EAAK,MAAM,MAAMwL,CAAK,EAAE,IAAIkC,EAAS,CAAC;AAAA,EAAA;AAEzE,SAAO,CAAC2B,GAAMC,CAAK,EAAE,OAAO,CAACC,MAASA,EAAK,QAAQ,UAAU,CAAC;AAChE;AAEO,SAASC,GACdpI,GACAkE,GACApL,GACe;AACf,QAAMqF,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAIuG,EAAS,GAC/C3N,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AAEnE,MAAIpH,EAAK,QAAQ;AACf,UAAMS,IAAIT,EAAK,QAAQ;AACvB,QAAIS,IAAI,EAAG,QAAO2G;AAClB,UAAMmE,IAAUrL,GACVsL,KAAStL,IAAY,KAAKO,GAC1BK,IAAU,CAACtB,GAASQ,EAAK,QAAQwL,CAAK,CAAC,CAAC,GACxCzK,IAAoB,CAAA;AAC1B,QAAI8E,IAAI2F;AACR,WAAO3F,MAAM0F,KAAS;AACpB,YAAM3N,KAAQiI,IAAI,KAAKpF;AACvB,MAAAM,EAAM,KAAK2M,GAAU1N,EAAK,MAAM6F,CAAC,CAAC,CAAC,GACnC/E,EAAQ,KAAKtB,GAASQ,EAAK,QAAQpC,CAAI,CAAC,CAAC,GACzCiI,IAAIjI;AAAAA,IACN;AACA,WAAA2H,EAAM+F,CAAS,IAAI,EAAE,QAAQ,IAAO,SAAAxK,GAAS,OAAAC,EAAA,GACtCmG,GAAgB3B,CAAK;AAAA,EAC9B;AAEA,MAAIrF,MAAc;AAChB,WAAAF,EAAK,QAAQ,MAAA,GACbA,EAAK,MAAM,MAAA,GACPA,EAAK,QAAQ,SAAS,KAAGuF,EAAM,OAAO+F,GAAW,CAAC,GAC/CpE,GAAgB3B,CAAK;AAE9B,MAAIrF,MAAcF,EAAK,MAAM,SAAS;AACpC,WAAAA,EAAK,QAAQ,IAAA,GACbA,EAAK,MAAM,IAAA,GACPA,EAAK,QAAQ,SAAS,KAAGuF,EAAM,OAAO+F,GAAW,CAAC,GAC/CpE,GAAgB3B,CAAK;AAG9B,QAAM8J,IAAiB;AAAA,IACrB,QAAQ;AAAA,IACR,SAASrP,EAAK,QAAQ,MAAM,GAAGE,IAAY,CAAC,EAAE,IAAIV,EAAQ;AAAA,IAC1D,OAAOQ,EAAK,MAAM,MAAM,GAAGE,CAAS,EAAE,IAAIwN,EAAS;AAAA,EAAA,GAE/C4B,IAAkB;AAAA,IACtB,QAAQ;AAAA,IACR,SAAStP,EAAK,QAAQ,MAAME,IAAY,CAAC,EAAE,IAAIV,EAAQ;AAAA,IACvD,OAAOQ,EAAK,MAAM,MAAME,IAAY,CAAC,EAAE,IAAIwN,EAAS;AAAA,EAAA,GAEhD9P,IAAO,CAACyR,GAAMC,CAAK,EAAE,OAAO,CAACC,MAASA,EAAK,QAAQ,UAAU,CAAC;AACpE,SAAAhK,EAAM,OAAO+F,GAAW,GAAG,GAAG1N,CAAI,GAC3BsJ,GAAgB3B,CAAK;AAC9B;AAEO,SAASkK,GACdrI,GACAkE,GACApL,GACA2I,GACA4F,GACe;AACf,QAAMlJ,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAIuG,EAAS,GAC/C3N,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AACnE,QAAM/G,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAE9C,MAAIsC,GACArB,GACA+N,GACAC;AAEJ,MAAI5O,EAAK,SAAS,SAAS;AACzB,UAAMmP,IAAMd,GAAiBvO,GAAME,GAAMD,GAAIuI,GAAO4F,CAAG;AACvD,QAAI,CAACiB,EAAK,QAAOF,GAAcpI,GAAUkE,GAAWpL,CAAS;AAC7D,IAAAsC,IAAKkN,EAAI,IACTvO,IAAKuO,EAAI,IACTR,IAAWQ,EAAI,UACfP,IAAYO,EAAI;AAAA,EAClB,OAAO;AACL,UAAMA,IAAMlB,GAAgBnO,GAAMC,GAAIuI,GAAO4F,CAAG;AAChD,QAAI,CAACiB,EAAK,QAAOF,GAAcpI,GAAUkE,GAAWpL,CAAS;AAC7D,IAAAsC,IAAKkN,EAAI,IACTvO,IAAKuO,EAAI,IACTR,IAAW,EAAE,MAAM,OAAA,GACnBC,IAAY,EAAE,MAAM,OAAA;AAAA,EACtB;AAEA,MAAInP,EAAK;AACP,WAAAuF,EAAM+F,CAAS,IAAI2D;AAAA,MACjBjP;AAAA,MACAE;AAAA,MACAsC;AAAA,MACArB;AAAA,MACA+N;AAAA,MACAC;AAAA,IAAA,GAEKjI,GAAgB3B,CAAK;AAG9B,QAAMoK,IAASP;AAAA,IACbpP;AAAA,IACAE;AAAA,IACAsC;AAAA,IACArB;AAAA,IACA+N;AAAA,IACAC;AAAA,EAAA;AAEF,SAAA5J,EAAM,OAAO+F,GAAW,GAAG,GAAGqE,CAAM,GAC7BzI,GAAgB3B,CAAK;AAC9B;AAEA,SAASqK,GAAgBP,GAAgBC,GAAiBvB,GAAuB;AAC/E,QAAM8B,IAAUR,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC,GAC9CS,IAAaR,EAAM,QAAQ,CAAC,GAC5BS,IAAO3Q,GAAMyQ,GAASC,GAAY/B,CAAG,GACrCjN,IAAUiP,IACZ,CAAC,GAAGV,EAAK,QAAQ,IAAI7P,EAAQ,GAAG,GAAG8P,EAAM,QAAQ,MAAM,CAAC,EAAE,IAAI9P,EAAQ,CAAC,IACvE,CAAC,GAAG6P,EAAK,QAAQ,IAAI7P,EAAQ,GAAG,GAAG8P,EAAM,QAAQ,IAAI9P,EAAQ,CAAC,GAC5DuB,IAAQgP,IACV,CAAC,GAAGV,EAAK,MAAM,IAAI3B,EAAS,GAAG,GAAG4B,EAAM,MAAM,IAAI5B,EAAS,CAAC,IAC5D,CAAC,GAAG2B,EAAK,MAAM,IAAI3B,EAAS,GAAG,EAAE,MAAM,OAAA,GAAmB,GAAG4B,EAAM,MAAM,IAAI5B,EAAS,CAAC;AAC3F,SAAOI,GAAqB,EAAE,QAAQ,IAAO,SAAAhN,GAAS,OAAAC,EAAA,GAASgN,CAAG;AACpE;AAEA,SAASiC,GAAchQ,GAAgB+N,GAAuB;AAM5D,SALmB3O;AAAA,IACjBY,EAAK,QAAQ,CAAC;AAAA,IACdA,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC;AAAA,IACpC+N;AAAA,EAAA,IAEqBD,GAAqB9N,GAAM+N,CAAG,IAC9C;AAAA,IACL,QAAQ;AAAA,IACR,SAAS/N,EAAK,QAAQ,IAAIR,EAAQ;AAAA,IAClC,OAAO,CAAC,GAAGQ,EAAK,MAAM,IAAI0N,EAAS,GAAG,EAAE,MAAM,OAAA,CAAQ;AAAA,EAAA;AAE1D;AAEO,SAASuC,GACd7I,GACA/H,GACAC,GACAyO,IAAMmC,IACS;AACf,QAAM3K,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAIuG,EAAS,GAC/CwC,IAAK5K,EAAMlG,EAAE,SAAS,GACtB+Q,IAAK7K,EAAMjG,EAAE,SAAS;AAC5B,MAAI,CAAC6Q,KAAM,CAACC,KAAMD,EAAG,UAAUC,EAAG,OAAQ,QAAOhJ;AAEjD,MAAI/H,EAAE,cAAcC,EAAE;AACpB,WAAID,EAAE,QAAQC,EAAE,MAAY8H,KAC5B7B,EAAMlG,EAAE,SAAS,IAAI2Q,GAAcG,GAAIpC,CAAG,GACnC7G,GAAgB3B,CAAK;AAG9B,QAAM8J,IAAOhQ,EAAE,QAAQ,QAAQsO,GAAUwC,CAAE,IAAItC,GAAYsC,CAAE,GACvDb,IAAQhQ,EAAE,QAAQ,UAAUqO,GAAUyC,CAAE,IAAIvC,GAAYuC,CAAE,GAC1DC,IAAST,GAAgBP,GAAMC,GAAOvB,CAAG,GACzCuC,IAAO,KAAK,IAAIjR,EAAE,WAAWC,EAAE,SAAS,GACxCiR,IAAO,KAAK,IAAIlR,EAAE,WAAWC,EAAE,SAAS;AAC9C,SAAAiG,EAAM+K,CAAI,IAAID,GACd9K,EAAM,OAAOgL,GAAM,CAAC,GACbrJ,GAAgB3B,CAAK;AAC9B;AAEA,SAASiL,GACPC,GACApR,GACAC,GACAyO,GAC6C;AAC7C,QAAM2C,IAAKD,EAAO,UAAU,CAAC5Q,MAAMA,EAAE,OAAOR,EAAE,OAAO,GAC/CsR,IAAKF,EAAO,UAAU,CAAC5Q,MAAMA,EAAE,OAAOP,EAAE,OAAO;AACrD,MAAIoR,IAAK,KAAKC,IAAK,UAAU,EAAE,QAAAF,GAAQ,WAAW,GAAC;AAEnD,MAAIpR,EAAE,YAAYC,EAAE,SAAS;AAC3B,UAAM1B,IAAO6S,EAAO,MAAA;AACpB7S,WAAAA,EAAK8S,CAAE,IAAI;AAAA,MACT,GAAG9S,EAAK8S,CAAE;AAAA,MACV,UAAUT,GAAkBrS,EAAK8S,CAAE,EAAE,UAAUrR,GAAGC,GAAGyO,CAAG;AAAA,IAAA,GAEnD,EAAE,QAAQnQ,GAAM,WAAW,CAAA,EAAC;AAAA,EACrC;AAEA,QAAMgT,IAASzG,GAAgBsG,EAAOC,CAAE,EAAE,QAAQ,EAAE,IAAI/C,EAAS,GAC3DkD,IAAS1G,GAAgBsG,EAAOE,CAAE,EAAE,QAAQ,EAAE,IAAIhD,EAAS,GAC3DpM,IAASqP,EAAO,QAChBE,IAAS5J,GAAgB,CAAC,GAAG0J,GAAQ,GAAGC,CAAM,CAAC,GAC/CR,IAASJ;AAAA,IACba;AAAA,IACAzR;AAAA,IACA,EAAE,WAAWC,EAAE,YAAYiC,GAAQ,KAAKjC,EAAE,IAAA;AAAA,IAC1CyO;AAAA,EAAA;AAKF,SAAO,EAAE,QAHI0C,EACV,OAAO,CAAC5Q,MAAMA,EAAE,OAAOP,EAAE,OAAO,EAChC,IAAI,CAACO,MAAOA,EAAE,OAAOR,EAAE,UAAU,EAAE,GAAGQ,GAAG,UAAUwQ,EAAA,IAAWxQ,CAAE,GAC5C,WAAW,CAACP,EAAE,OAAO,EAAA;AAC9C;AAEO,SAASyR,GACdN,GACA1C,IAAMmC,IACuC;AAC7C,MAAI1V,IAAUiW;AACd,QAAMO,IAAsB,CAAA;AAC5B,WAASvQ,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3B,UAAMwQ,IAAqB,CAAA;AAC3B,eAAWC,KAAS1W;AAClB,iBAAWyK,KAAOgJ,GAAaiD,EAAM,QAAQ;AAC3C,QAAAD,EAAK,KAAK;AAAA,UACR,SAASC,EAAM;AAAA,UACf,WAAWjM,EAAI;AAAA,UACf,KAAKA,EAAI;AAAA,UACT,OAAOA,EAAI;AAAA,UACX,UAAU;AAAA,QAAA,CACX;AAGL,QAAI0H,IAA8D;AAClE,aAAS9G,IAAI,GAAGA,IAAIoL,EAAK,QAAQpL;AAC/B,eAASsL,IAAItL,IAAI,GAAGsL,IAAIF,EAAK,QAAQE,KAAK;AACxC,cAAM9R,IAAI4R,EAAKpL,CAAC,GACVvG,IAAI2R,EAAKE,CAAC;AAChB,YAAI9R,EAAE,YAAYC,EAAE,WAAWD,EAAE,cAAcC,EAAE,UAAW;AAC5D,cAAM4N,IAAO9E,GAAS/I,EAAE,OAAOC,EAAE,KAAK,GAChC8R,IAAU/R,EAAE,YAAYC,EAAE,UAAU,KAAK,IAAIyO,GAAK,IAAI,IAAIA;AAChE,QAAIb,KAAQkE,MAAY,CAACzE,KAAQO,IAAOP,EAAK,UAC3CA,IAAO,EAAE,GAAAtN,GAAG,GAAAC,GAAG,MAAA4N,EAAA;AAAA,MAEnB;AAEF,QAAI,CAACP,EAAM;AACX,UAAM0D,IAASG,GAAiBhW,GAASmS,EAAK,GAAGA,EAAK,GAAGoB,CAAG;AAC5D,IAAAvT,IAAU6V,EAAO,QACjBW,EAAU,KAAK,GAAGX,EAAO,SAAS;AAAA,EACpC;AACA,SAAO,EAAE,QAAQ7V,GAAS,WAAAwW,EAAA;AAC5B;AAEO,SAASK,GAAgBH,GAG9B;AACA,QAAM3L,IAAQ4E,GAAgB+G,EAAM,QAAQ,GACtCrQ,IAAS0E,EAAM,OAAO,CAACvF,MAASA,EAAK,UAAUA,EAAK,QAAQ,UAAU,CAAC,GACvEsR,IAAQ/L,EAAM,OAAO,CAACvF,MAAS,CAACA,EAAK,UAAUA,EAAK,QAAQ,UAAU,CAAC;AAC7E,SAAIa,EAAO,UAAU,IACZ,EAAE,MAAMqQ,GAAO,QAAQ,CAAA,EAAC,IAE1B;AAAA,IACL,MAAM;AAAA,MACJ,GAAGA;AAAA,MACH,UAAUhK,GAAgB,CAACrG,EAAO,CAAC,GAAG,GAAGyQ,CAAK,CAAC;AAAA,IAAA;AAAA,IAEjD,QAAQzQ,EAAO,MAAM,CAAC,EAAE,IAAI,CAACb,MAASkH,GAAgB,CAAClH,CAAI,CAAC,CAAC;AAAA,EAAA;AAEjE;AAEA,SAASuR,GACPC,GACAC,GACAC,GACkB;AAClB,QAAMC,IAASZ,GAAuBU,CAAO,GACvCG,wBAAgB,IAAI,CAAC,GAAGF,GAAc,GAAGC,EAAO,SAAS,CAAC,GAC1DE,IACJ,CAAA,GACIC,IAAmB,CAAA;AACzB,aAAWZ,KAASS,EAAO,QAAQ;AACjC,QAAIC,EAAU,IAAIV,EAAM,EAAE,EAAG;AAC7B,UAAMa,IAASV,GAAgBH,CAAK;AACpC,IAAAY,EAAK,KAAKC,EAAO,IAAI;AACrB,eAAW3K,KAAY2K,EAAO;AAC5B,MAAAF,EAAO,KAAK;AAAA,QACV,QAAQX,EAAM;AAAA,QACd,UAAA9J;AAAA,QACA,MAAM8J,EAAM;AAAA,QACZ,OAAOA,EAAM;AAAA,MAAA,CACd;AAAA,EAEL;AAEA,QAAMc,IAA0B,CAAA,GAC1BC,IAAa,IAAI,IAAIT,EAAO,IAAI,CAAC3R,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC;AACvD,aAAWqR,KAASY,GAAM;AACxB,UAAMlK,IAAOqK,EAAW,IAAIf,EAAM,EAAE;AACpC,IAAKtJ,KACD,KAAK,UAAUA,EAAK,QAAQ,MAAM,KAAK,UAAUsJ,EAAM,QAAQ,KACjEc,EAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,SAASd,EAAM;AAAA,MACf,UAAUA,EAAM;AAAA,IAAA,CACjB;AAAA,EAEL;AACA,aAAWgB,KAASL;AAClB,IAAAG,EAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,MAAME,EAAM;AAAA,MACZ,UAAUA,EAAM;AAAA,MAChB,OAAOA,EAAM;AAAA,IAAA,CACd;AAEH,aAAWC,KAAMP;AACf,IAAIK,EAAW,IAAIE,CAAE,KAAGH,EAAM,KAAK,EAAE,QAAQ,UAAU,SAASG,EAAA,CAAI;AAEtE,SAAOH;AACT;AAEO,SAASI,GACd3B,GACA4B,GACA5D,GACkB;AAClB,QAAM5T,IAAS4V,EAAO,KAAK,CAAC5Q,MAAMA,EAAE,OAAOwS,EAAI,OAAO;AACtD,MAAI,CAACxX,EAAQ,QAAO,CAAA;AACpB,QAAMwT,IAASoC,EAAO,OAAO,CAAC5Q,MAAMA,EAAE,OAAOwS,EAAI,OAAO,GAElDrS,IADQmK,GAAgBtP,EAAO,QAAQ,EAC1BwX,EAAI,SAAS;AAChC,MAAI,CAACrS,EAAM,QAAO,CAAA;AAClB,QAAMK,IAAOJ,GAASD,GAAMqS,EAAI,SAAS,GACnC/R,IAAKH,GAAOH,GAAMqS,EAAI,SAAS,GAE/BC,IADSlE,GAAqB/N,GAAMC,GAAI+N,CAAM,IAEhDmB,GAAc3U,EAAO,UAAUwX,EAAI,WAAWA,EAAI,SAAS,IAC3D5C,GAAY5U,EAAO,UAAUwX,EAAI,WAAWA,EAAI,WAAWA,EAAI,OAAO5D,CAAG,GACvE7Q,IAAO6S,EAAO;AAAA,IAAI,CAAC5Q,MACvBA,EAAE,OAAOwS,EAAI,UAAU,EAAE,GAAGxS,GAAG,UAAUyS,MAAYzS;AAAA,EAAA;AAEvD,SAAO0R,GAAYd,GAAQ7S,GAAM,EAAE;AACrC;AAEO,SAAS2U,GACd9B,GACApR,GACAC,GACkB;AAClB,MAAImO,GAAYpO,GAAGC,CAAC,UAAU,CAAA;AAC9B,QAAM+Q,IAASG,GAAiBC,GAAQpR,GAAGC,GAAG4Q,EAAsB;AACpE,SAAOqB,GAAYd,GAAQJ,EAAO,QAAQA,EAAO,SAAS;AAC5D;AAEO,SAASmC,GACd/B,GACA5H,GACAkF,GACA0E,GACmB;AACnB,MAAI9F,IAA0B;AAC9B,aAAWuE,KAAST;AAClB,eAAWxL,KAAOgJ,GAAaiD,EAAM,QAAQ,GAAG;AAC9C,YAAMiB,IAAgB;AAAA,QACpB,SAASjB,EAAM;AAAA,QACf,WAAWjM,EAAI;AAAA,QACf,KAAKA,EAAI;AAAA,MAAA;AAEX,UAAIwN,KAAQhF,GAAYgF,GAAMN,CAAE,EAAG;AACnC,YAAMjF,IAAO9E,GAASS,GAAO5D,EAAI,KAAK;AACtC,UAAIiI,IAAOa,EAAK;AAChB,YAAM2E,IACJD,MACCvB,EAAM,OAAOuB,EAAK,WAAWxN,EAAI,cAAcwN,EAAK,YACjDE,IACJhG,KACA8F,MACC9F,EAAK,YAAY8F,EAAK,WAAW9F,EAAK,cAAc8F,EAAK;AAC5D,OACE,CAAC9F,KACA+F,KAAe,CAACC,KAChBD,MAAgBC,KAAczF,IAAOP,EAAK,cAE3CA,IAAO,EAAE,GAAGwF,GAAI,OAAOlN,EAAI,OAAO,UAAUiI,EAAA;AAAA,IAEhD;AAEF,SAAOP;AACT;AAEO,SAASiG,GACdnC,GACA5H,GACAkF,GACyB;AACzB,MAAIpB,IAAgC;AACpC,aAAWuE,KAAST,GAAQ;AAC1B,UAAM4B,IAAMhF,GAAY6D,EAAM,UAAUrI,GAAOkF,CAAG;AAClD,QAAKsE,MACD,CAAC1F,KAAQ0F,EAAI,WAAW1F,EAAK,WAAU;AAEzC,YAAM3M,IADQmK,GAAgB+G,EAAM,QAAQ,EACzBmB,EAAI,YAAY,GAC7BhS,IAAOL,IAAOC,GAASD,GAAMqS,EAAI,gBAAgB,IAAIxJ,GACrDvI,IAAKN,IAAOG,GAAOH,GAAMqS,EAAI,gBAAgB,IAAIxJ;AACvD,MAAA8D,IAAO;AAAA,QACL,SAASuE,EAAM;AAAA,QACf,WAAWmB,EAAI;AAAA,QACf,WAAWA,EAAI;AAAA,QACf,OAAOA,EAAI;AAAA,QACX,QAAQjE;AAAA,UACN/N;AAAA,UACAC;AAAA,UACAmQ,EAAO,OAAO,CAAC5Q,MAAMA,EAAE,OAAOqR,EAAM,EAAE;AAAA,QAAA;AAAA,QAExC,UAAUmB,EAAI;AAAA,MAAA;AAAA,IAElB;AAAA,EACF;AACA,SAAO1F;AACT;AAEO,SAASkG,GACdzL,GACAkE,GACApL,GACA2I,GACA4F,GAC+B;AAE/B,QAAMzO,IADQmK,GAAgB/C,CAAQ,EACnBkE,CAAS;AAC5B,MAAI,CAACtL,EAAM,QAAO;AAClB,QAAMK,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAC9C,MAAIK,EAAK,SAAS,SAAS;AACzB,UAAMmP,IAAMd,GAAiBvO,GAAME,GAAMD,GAAIuI,GAAO4F,CAAG;AACvD,WAAOiB,IAAM,EAAE,IAAIA,EAAI,IAAI,IAAIA,EAAI,OAAO;AAAA,EAC5C;AACA,SAAOlB,GAAgBnO,GAAMC,GAAIuI,GAAO4F,CAAG;AAC7C;ACpsBO,SAASqE,GACdjK,GACAkK,GACAhF,GACa;AACb,MAAIpB,IAAiD;AACrD,aAAWM,KAAa8F,GAAY;AAClC,UAAM3K,IAAW,KAAK,MAAM6E,EAAU,IAAIpE,EAAM,GAAGoE,EAAU,IAAIpE,EAAM,CAAC;AACxE,IAAIT,KAAY2F,MAAQ,CAACpB,KAAQvE,IAAWuE,EAAK,cAC/CA,IAAO,EAAE,OAAOM,GAAW,UAAA7E,EAAA;AAAA,EAE/B;AACA,SAAOuE,IAAO,EAAE,GAAGA,EAAK,MAAM,GAAG,GAAGA,EAAK,MAAM,EAAA,IAAM;AACvD;AAEO,SAASqG,GAAc3T,GAAgBC,GAAgBC,IAAM,MAAe;AACjF,SAAI,CAACF,KAAK,CAACC,IAAU,KACd,KAAK,IAAID,EAAE,IAAIC,EAAE,CAAC,KAAKC,KAAO,KAAK,IAAIF,EAAE,IAAIC,EAAE,CAAC,KAAKC;AAC9D;ACTO,SAAS0T,GAAoBC,GAAcC,GAA+B;AAC/E,QAAM3O,IAAK,KAAK,IAAI2O,EAAO,IAAID,EAAO,CAAC,GACjCzO,IAAK,KAAK,IAAI0O,EAAO,IAAID,EAAO,CAAC;AACvC,SAAI1O,KAAMC,IACD;AAAA,IACL,OAAO,EAAE,GAAG0O,EAAO,GAAG,GAAGD,EAAO,EAAA;AAAA,IAChC,MAAM;AAAA,IACN,SAASA;AAAA,EAAA,IAGN;AAAA,IACL,OAAO,EAAE,GAAGA,EAAO,GAAG,GAAGC,EAAO,EAAA;AAAA,IAChC,MAAM;AAAA,IACN,SAASD;AAAA,EAAA;AAEb;AAMO,SAASE,GACdD,GACAE,GACwB;AACxB,MAAI1G,IAAoD;AACxD,aAAW2G,KAAYD,GAAW;AAChC,UAAME,IAA6B;AAAA,MACjC;AAAA,QACE,OAAO,EAAE,GAAGJ,EAAO,GAAG,GAAGG,EAAS,EAAA;AAAA,QAClC,MAAM;AAAA,QACN,SAASA;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,OAAO,EAAE,GAAGA,EAAS,GAAG,GAAGH,EAAO,EAAA;AAAA,QAClC,MAAM;AAAA,QACN,SAASG;AAAA,MAAA;AAAA,IACX;AAEF,eAAWE,KAAUD,GAAS;AAC5B,YAAMrG,IAAO,KAAK,MAAMsG,EAAO,MAAM,IAAIL,EAAO,GAAGK,EAAO,MAAM,IAAIL,EAAO,CAAC;AAC5E,OACE,CAACxG,KACDO,IAAOP,EAAK,OAAO,QAClB,KAAK,IAAIO,IAAOP,EAAK,IAAI,KAAK,QAAQ6G,EAAO,SAAS,gBAAgB7G,EAAK,SAAS,kBAErFA,IAAO,EAAE,GAAG6G,GAAQ,MAAAtG,EAAA;AAAA,IAExB;AAAA,EACF;AACA,SAAKP,IACE,EAAE,OAAOA,EAAK,OAAO,MAAMA,EAAK,MAAM,SAASA,EAAK,QAAA,IADzC;AAEpB;AAEO,SAAS8G,GAAcC,GAAgD;AAC5E,SAAOA,EAAM,QAAQ,OAAOA,EAAM,SAAS;AAC7C;ACzDO,SAASC,GACdtT,GACAC,GACAsT,IAAa,IACE;AACf,MAAIrN,IAAKjG,EAAG,GACRkG,IAAKlG,EAAG;AACZ,MAAIsT,GAAY;AACd,UAAMpP,IAAKlE,EAAG,IAAID,EAAK,GACjBoE,IAAKnE,EAAG,IAAID,EAAK,GACjBiI,IAAO,KAAK,IAAI,KAAK,IAAI9D,CAAE,GAAG,KAAK,IAAIC,CAAE,CAAC,GAC1CoP,IAAKrP,MAAO,IAAKC,MAAO,IAAI,IAAI,KAAK,KAAKA,CAAE,IAAK,KAAK,KAAKD,CAAE,GAC7DsP,IAAKrP,MAAO,IAAKD,MAAO,IAAI,IAAI,KAAK,KAAKA,CAAE,IAAK,KAAK,KAAKC,CAAE;AACnE,IAAA8B,IAAKlG,EAAK,IAAIwT,IAAKvL,GACnB9B,IAAKnG,EAAK,IAAIyT,IAAKxL;AAAA,EACrB;AACA,QAAMnG,IAAK,KAAK,IAAIoE,IAAKlG,EAAK,CAAC,IAAI,GAC7B+B,IAAK,KAAK,IAAIoE,IAAKnG,EAAK,CAAC,IAAI;AACnC,SAAO;AAAA,IACL,KAAKA,EAAK,IAAIkG,KAAM;AAAA,IACpB,KAAKlG,EAAK,IAAImG,KAAM;AAAA,IACpB,IAAArE;AAAA,IACA,IAAAC;AAAA,EAAA;AAEJ;AAEO,SAAS2R,GAAaC,GAA+B;AAC1D,QAAM,EAAE,IAAArQ,GAAI,IAAAC,GAAI,IAAAzB,GAAI,IAAAC,MAAO4R,GACrBvR,IAAM,KAAK,IAAIN,GAAI,IAAI,GACvBO,IAAM,KAAK,IAAIN,GAAI,IAAI;AAC7B,SAAO,KAAKuB,IAAKlB,CAAG,IAAImB,CAAE,MAAMnB,CAAG,IAAIC,CAAG,UAAUiB,IAAKlB,CAAG,IAAImB,CAAE,MAAMnB,CAAG,IAAIC,CAAG,UAAUiB,IAAKlB,CAAG,IAAImB,CAAE;AAC5G;AAEO,SAASqQ,GACd5T,GACAC,GACAsT,IAAa,IACE;AACf,SAAOvM,GAAuB;AAAA,IAC5B0M,GAAaJ,GAAsBtT,GAAMC,GAAIsT,CAAU,CAAC;AAAA,EAAA,CACzD;AACH;AC/CO,MAAMM,KAAqB,QACrBC,KAAqB,IACrBC,KAAoBC,IACpBC,KAAoBC,IAE3BC,KAAwB;AAEvB,SAASC,GAAYvD,GAGhB;;AACV,SAAOA,EAAM,SAAS,WAAW,IAAQ3H,KAAA5P,IAAAuX,EAAM,UAAN,gBAAAvX,EAAa,SAAb,QAAA4P,EAAmB;AAC9D;AAEO,SAASmL,GAAiBC,GAA4B;AAC3D,SAAOR;AACT;AAEO,SAASS,GAAeC,GAAwB;AAErD,UADeA,EAAK,QAAQ,SAAS;AAAA,CAAI,EAAE,UAAUX,IACvC,MAAM;AAAA,CAAI;AAC1B;AAEA,IAAIY;AAEJ,SAASC,KAAsD;AAC7D,SAAID,OAAe,SAAkBA,KACjC,OAAO,WAAa,OACtBA,KAAa,MACN,SAGTA,KADe,SAAS,cAAc,QAAQ,EAC1B,WAAW,IAAI,GAC5BA;AACT;AAEO,SAASE,GACdH,GACAI,GACoD;AACpD,QAAMC,IAAQN,GAAeC,CAAI,GAC3BM,IAAMJ,GAAA;AACZ,MAAIK,IAAQ;AACZ,MAAID,GAAK;AACP,IAAAA,EAAI,OAAO,GAAGF,CAAI,MAAMb,EAAiB;AACzC,eAAWiB,KAAQH;AACjB,MAAAE,IAAQ,KAAK,IAAIA,GAAOD,EAAI,YAAYE,KAAQ,GAAG,EAAE,KAAK;AAAA,EAE9D;AAEE,IAAAD,IADgBF,EAAM,OAAO,CAACI,GAAKD,MAAS,KAAK,IAAIC,GAAKD,EAAK,MAAM,GAAG,CAAC,IACvDJ,IAAOT;AAE3B,SAAO;AAAA,IACL,OAAO,KAAK,IAAIY,GAAOH,IAAO,GAAG;AAAA,IACjC,QAAQ,KAAK,IAAIC,EAAM,QAAQ,CAAC,IAAID,IAAOX;AAAA,IAC3C,OAAAY;AAAA,EAAA;AAEJ;AAEO,SAASK,GAAeC,GAAiB;AAC9C,SAAO,EAAE,IAAIA,EAAI,OAAOA,EAAI,QAAQ,GAAG,IAAIA,EAAI,OAAOA,EAAI,QAAQ,EAAA;AACpE;AAEO,SAASC,GAAiBvC,GAAc2B,GAAcI,GAAsB;AACjF,QAAM,EAAE,OAAAG,GAAO,QAAAM,EAAA,IAAWV,GAAiBH,GAAMI,CAAI;AACrD,SAAO;AAAA,IACL,EAAE,GAAG/B,EAAO,GAAG,GAAGA,EAAO,IAAIwC,EAAA;AAAA,IAC7B,EAAE,GAAGxC,EAAO,IAAIkC,GAAO,GAAGlC,EAAO,IAAIwC,EAAA;AAAA,IACrC,EAAE,GAAGxC,EAAO,IAAIkC,GAAO,GAAGlC,EAAO,EAAA;AAAA,IACjC,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,EAAE;AAE/B;AAEO,SAASyC,GACdzC,GACA2B,GACAI,GACe;AACf,SAAOpK,GAAmB,CAAC4K,GAAiBvC,GAAQ2B,GAAMI,CAAI,CAAC,CAAC;AAClE;AAEO,SAASW,GAAiBf,GAAcI,GAAcY,GAA4B;AACvF,SAAO;AAAA,IACL,MAAMhB,EAAK,KAAA,KAAUX;AAAA,IACrB,MAAAe;AAAA,IACA,OAAAY;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;AAGO,SAASC,GACd1O,GACAyN,GACAI,GACe;AACf,QAAMO,IAAMO,GAAa3O,CAAQ;AACjC,SAAOuO,GAAkB,EAAE,GAAGH,EAAI,MAAM,GAAGA,EAAI,KAAA,GAAQX,GAAMI,CAAI;AACnE;ACnFO,SAASe,GAAa9E,GAGjB;AACV,SAAOuD,GAAYvD,CAAK,KAAK+E,GAAe/E,CAAK;AACnD;AAEO,SAASgF,GAAqBjB,GAAcY,GAA4B;AAC7E,SAAO;AAAA,IACL,UAAUM;AAAA,IACV,MAAMC,GAAkBnB,CAAI;AAAA,IAC5B,OAAAY;AAAA,IACA,QAAQ;AAAA,EAAA;AAEZ;AAEO,SAASQ,GAAoBC,GAAcrB,GAAsB;AACtE,QAAMtG,IAAOyH,GAAkBnB,CAAI,IAAI;AACvC,SAAO;AAAA,IACL,EAAE,GAAGqB,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,IACpC,EAAE,GAAG2H,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,IACpC,EAAE,GAAG2H,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,IACpC,EAAE,GAAG2H,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,EAAK;AAE7C;AAEO,SAAS4H,GAAqBD,GAAcrB,GAA6B;AAC9E,SAAOpK,GAAmB,CAACwL,GAAoBC,GAAQrB,CAAI,CAAC,CAAC;AAC/D;AAGO,SAASuB,GACdpP,GACA6N,GACe;AACf,SAAOsB,GAAqBhB,GAAeQ,GAAa3O,CAAQ,CAAC,GAAG6N,CAAI;AAC1E;ACxBO,SAASwB,GAAaC,GAAcC,GAAiBC,GAAuB;AACjF,QAAMC,IAAMH,EAAI,IAAIA,EAAI,IAAIA,EAAI,IAAIA,EAAI;AACxC,MAAIG,MAAQ,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AACjC,QAAMrR,IAAImR,IAAUD,EAAI,GAClBjR,IAAImR,IAAUF,EAAI;AACxB,SAAO;AAAA,IACL,IAAIA,EAAI,IAAIlR,IAAIkR,EAAI,IAAIjR,KAAKoR;AAAA,IAC7B,IAAI,CAACH,EAAI,IAAIlR,IAAIkR,EAAI,IAAIjR,KAAKoR;AAAA,EAAA;AAElC;AASO,SAASC,GACdC,GACAC,GACAL,GACAC,GACM;AACN,QAAMK,IAAMD,EAAQ,QAAQ,IAAIA,EAAQ,QAAQ,KAAK,IAAID,EAAK,OAAO,CAAC,GAChEG,IAAMF,EAAQ,SAAS,IAAIA,EAAQ,SAAS,KAAK,IAAID,EAAK,QAAQ,CAAC,GACnE5T,IAAQ,KAAK,IAAI4T,EAAK,QAAQE,GAAKF,EAAK,SAASG,CAAG;AAC1D,MAAI,EAAE/T,IAAQ,MAAM,CAAC,OAAO,SAASA,CAAK;AACxC,WAAO,EAAE,GAAG6T,EAAQ,GAAG,GAAGA,EAAQ,EAAA;AAEpC,QAAMG,IAAUJ,EAAK,QAAQA,EAAK,QAAQE,IAAM9T,KAAS,GACnDiU,IAAUL,EAAK,OAAOA,EAAK,SAASG,IAAM/T,KAAS;AACzD,SAAO;AAAA,IACL,GAAG6T,EAAQ,KAAKL,IAAUQ,KAAWhU;AAAA,IACrC,GAAG6T,EAAQ,KAAKJ,IAAUQ,KAAWjU;AAAA,EAAA;AAEzC;AAEO,SAASkU,GAAqBN,GAAsBC,GAA8B;AACvF,QAAMC,IAAMD,EAAQ,QAAQ,IAAIA,EAAQ,QAAQ,KAAK,IAAID,EAAK,OAAO,CAAC,GAChEG,IAAMF,EAAQ,SAAS,IAAIA,EAAQ,SAAS,KAAK,IAAID,EAAK,QAAQ,CAAC,GACnE5T,IAAQ,KAAK,IAAI4T,EAAK,QAAQE,GAAKF,EAAK,SAASG,CAAG;AAC1D,SAAO/T,IAAQ,KAAK,OAAO,SAASA,CAAK,IAAIA,IAAQ;AACvD;AAEA,SAASmU,GAAeC,GAAwC;;AAC9D,QAAMC,KAAK7d,IAAA4d,EAAI,YAAJ,gBAAA5d,EAAa;AACxB,MAAI6d,KAAMA,EAAG,QAAQ,KAAKA,EAAG,SAAS;AACpC,WAAO,EAAE,GAAGA,EAAG,GAAG,GAAGA,EAAG,GAAG,OAAOA,EAAG,OAAO,QAAQA,EAAG,OAAA;AAEzD,QAAMC,IAAOF,EAAI,aAAa,SAAS;AACvC,MAAI,CAACE,EAAM,QAAO;AAClB,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM,QAAQ,EAAE,IAAI,MAAM;AAEpD,SADIC,EAAM,WAAW,KAAKA,EAAM,KAAK,CAACjX,MAAM,CAAC,OAAO,SAASA,CAAC,CAAC,KAC3DiX,EAAM,CAAC,KAAK,KAAKA,EAAM,CAAC,KAAK,IAAU,OACpC,EAAE,GAAGA,EAAM,CAAC,GAAG,GAAGA,EAAM,CAAC,GAAG,OAAOA,EAAM,CAAC,GAAG,QAAQA,EAAM,CAAC,EAAA;AACrE;AAEO,SAASC,GAAgBJ,GAAoBZ,GAAiBC,GAAuB;AAC1F,QAAMI,IAAUM,GAAeC,CAAG;AAClC,MAAIP;AACF,WAAOF,GAAoBS,EAAI,sBAAA,GAAyBP,GAASL,GAASC,CAAO;AAEnF,QAAMF,IAAMa,EAAI,aAAA;AAChB,SAAKb,IACED,GAAaC,GAAKC,GAASC,CAAO,IADxB,EAAE,GAAG,GAAG,GAAG,EAAA;AAE9B;AAEO,SAASgB,GAAiBL,GAA4B;AAC3D,QAAMP,IAAUM,GAAeC,CAAG;AAClC,MAAIP,EAAS,QAAOK,GAAqBE,EAAI,sBAAA,GAAyBP,CAAO;AAC7E,QAAMN,IAAMa,EAAI,aAAA;AAChB,SAAKb,IACEmB,GAAiBnB,CAAG,IADV;AAEnB;AAGO,SAASoB,GAAYC,GAAYC,GAAWC,GAAoB;AACrE,QAAMC,IAAID,MAAS,IAAI,IAAIA;AAC3B,SAAO;AAAA,IACL,IAAIF,EAAK,IAAIC,EAAI,KAAKE;AAAA,IACtB,IAAIH,EAAK,IAAIC,EAAI,KAAKE;AAAA,EAAA;AAE1B;AAEO,MAAMC,KAAkB,KAElBC,KAAkB;AAExB,SAASC,GAAgBJ,GAAsB;AACpD,SAAO,KAAK,IAAIG,IAAiB,KAAK,IAAID,IAAiBF,CAAI,CAAC;AAClE;AAGO,SAASK,GACdC,GACA7E,GACQ;AACR,SAAO8E,GAAkBD,GAAa7E,EAAM,QAAQ;AAAA,IAClD,KAAKyE;AAAA,IACL,KAAKC;AAAA,EAAA,CACN;AACH;AAGO,SAASP,GAAiBnB,GAAsB;AACrD,SAAO,KAAK,MAAMA,EAAI,GAAGA,EAAI,CAAC;AAChC;AAGO,SAAS+B,GAAgBC,GAAYT,GAAcU,GAA2B;AACnF,QAAMT,IAAID,MAAS,IAAI,IAAIA,GACrB9U,IAAQwV,IAAY,IAAIA,IAAY;AAC1C,SAAOD,KAAMvV,IAAQ+U;AACvB;AAUO,SAASU,GAAkBC,GAAkBC,GAA0B;AAG5E,UAFaD,MAAa,IAAI,IAAIA,MACrBC,MAAa,IAAI,IAAIA;AAEpC;AAOO,SAASC,GACdhB,GACAC,GACAC,GACAe,GACM;AACN,QAAMC,IAAQnB,GAAYC,GAAMC,GAAKC,CAAI;AACzC,SAAO;AAAA,IACL,GAAGF,EAAK,IAAIiB,IAAWC,EAAM;AAAA,IAC7B,GAAGlB,EAAK,IAAIiB,IAAWC,EAAM;AAAA,EAAA;AAEjC;AAGO,SAASC,GAAsBnB,GAAYkB,GAAahB,GAAoB;AACjF,SAAO;AAAA,IACL,GAAGF,EAAK,IAAIE,IAAOgB,EAAM;AAAA,IACzB,GAAGlB,EAAK,IAAIE,IAAOgB,EAAM;AAAA,EAAA;AAE7B;AAEO,MAAME,KAAsB;AAE5B,SAASC,GAAajb,GAAmB;AAE9C,SAAO,KAAK,IADF,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAC,CAAC,MACd;AACxB;AAEO,SAASkb,GAAKha,GAAWC,GAAW,GAAmB;AAC5D,SAAOD,KAAKC,IAAID,KAAK;AACvB;AAGO,SAASia,GACdjZ,GACAC,GACA,GAC6B;AAC7B,QAAM2B,IAAImX,GAAa,CAAC;AACxB,SAAO;AAAA,IACL,KAAK;AAAA,MACH,GAAGC,GAAKhZ,EAAK,IAAI,GAAGC,EAAG,IAAI,GAAG2B,CAAC;AAAA,MAC/B,GAAGoX,GAAKhZ,EAAK,IAAI,GAAGC,EAAG,IAAI,GAAG2B,CAAC;AAAA,IAAA;AAAA,IAEjC,MAAMoX,GAAKhZ,EAAK,MAAMC,EAAG,MAAM2B,CAAC;AAAA,EAAA;AAEpC;ACxMO,SAASsX,GAAuB/L,GAAyB;AAC9D,SAAIA,MAAS,SAAe,OACxBA,MAAS,YAAkB,MAC3BA,MAAS,UAAUA,MAAS,kBAAkBA,MAAS,WAAiB,OACrE;AACT;AAEO,SAASgM,GACdtI,GACAuI,GACAC,GACQ;;AACR,MAAIxI,EAAM,SAAS,WAAY,QAAOyI;AACtC,MAAIzI,EAAM,SAAS,OAAQ,UAAOvX,IAAAuX,EAAM,UAAN,gBAAAvX,EAAa,SAAQ;AACvD,QAAMigB,IAAYC;AAAA,IAChB3I,EAAM;AAAA,IACNuI;AAAA,KACAlQ,IAAA2H,EAAM,UAAN,gBAAA3H,EAAa;AAAA,IACbmQ;AAAA,EAAA;AAEF,SACEI,GAAqB5I,EAAM,IAAI,KAC/B6I,GAAmBH,CAAS,IAErBI,GAAwB9I,EAAM,MAAMuI,CAAK,IAE3CG;AACT;AC1BO,MAAMK,KAAqB;AAG3B,SAASC,GAAsB1M,GAA0B;AAC9D,SAAO2M,GAAwB,SAAS3M,CAAI,KAAKA,MAAS,WAAWA,MAAS;AAChF;AAGO,SAAS4M,GAAgBC,GAmBT;AACrB,MAAIA,EAAK,aAAa,CAACA,EAAK,QAAS,QAAO;AAI5C,MAHIA,EAAK,aAAaA,EAAK,WACvBA,EAAK,kBACLA,EAAK,gBACLA,EAAK,WAAWA,EAAK,cAAe,QAAO;AAE/C,MAAIA,EAAK,SAAS,SAASA,EAAK,SAAS,aAAc,QAAO;AAC9D,MAAIA,EAAK,SAAS;AAEhB,WADIA,EAAK,wBACLA,EAAK,qBAAqBA,EAAK,kBAAkBA,EAAK,cACjD,YAEF;AAET,MAAIA,EAAK,SAAS;AAChB,WAAIA,EAAK,qBAAqBA,EAAK,kBAAkBA,EAAK,cACjD,YAEF;AAET,MAAIjf,GAAiBif,EAAK,IAAI;AAC5B,WAAIA,EAAK,uBAA6B,SAClCA,EAAK,mBAAyB,SAC3BA,EAAK,WAAW,SAAY;AAErC,MAAIA,EAAK,SAAS,YAAa,QAAO;AACtC,MAAIA,EAAK,SAAS,gBAAiB,QAAO;AAC1C,MAAIA,EAAK,UAAW,QAAO;AAC3B,MAAI3c,GAAoB2c,EAAK,IAAI,EAAG,QAAO;AAC3C,MAAIhd,GAAgBgd,EAAK,IAAI,KAAK,CAACA,EAAK,SAAU,QAAO;AAE3D;AAEO,SAASC,GAAmBD,GAWsB;AACvD,MAAIA,EAAK,SAAU,QAAO;AAC1B,MAAIhd,GAAgBgd,EAAK,IAAI,EAAG,QAAO;AACvC,MAAIA,EAAK,cAAcA,EAAK;AAC1B,WAAOjf,GAAiBif,EAAK,IAAI,IAAI,SAAS;AAEhD,MAAI/c,GAAgB+c,EAAK,IAAI,MAAMA,EAAK,aAAaA,EAAK;AACxD,WAAO;AAET,MAAIA,EAAK,SAAS,WAAWA,EAAK,SAAS;AACzC,WAAIA,EAAK,WAAU,SACfA,EAAK,gBAAsB,YAC/B;AAEF,MAAIA,EAAK,SAAS,UAClB;AAAA,QAAIA,EAAK,SAAU,QAAO;AAC1B,QAAIA,EAAK,cAAe,QAAO;AAAA;AAEjC;AAEO,SAASE,GACd/M,GACAgN,GACAC,GACQ;AACR,SAAI,CAACA,KAAW,CAACP,GAAsB1M,CAAI,IAAUgN,IAC9C,KAAK,IAAI,GAAGA,IAAO,GAAG;AAC/B;AAGO,SAASE,GACdC,GACAC,GACQ;AACR,SAAKA,IACEC,GAAgBF,CAAI,IADHA;AAE1B;AChFO,SAASG,GACdC,GAC0B;;AAC1B,MAAI,CAACA,EAAU,QAAO;AACtB,QAAM7f,MAAMvB,IAAAohB,EAAS,YAAT,gBAAAphB,EAAkB,WAAU;AACxC,SAAI,CAACohB,EAAS,WAAW,gBAAgB,KAAK7f,CAAG,IAAU6f,IACpD,EAAE,GAAGA,GAAU,SAAS,KAAA;AACjC;AAMO,SAASC,GACd9J,GACAwI,GACAqB,GACAE,IAA8D,CAAA,GAC9DxB,GACkC;;AAClC,MAAIvI,EAAM,SAAS,WAAWA,EAAM,SAAS,WAAY,QAAO;AAChE,QAAMgK,IAAkBJ,GAAoBC,CAAQ,GAC9CI,IAAQC,GAAoBlK,GAAOwI,GAAYwB,CAAe;AACpE,MAAI,CAACG,GAAyB3B,GAAYyB,CAAK,EAAG,QAAO;AACzD,QAAM3F,IAAMO,GAAa7E,EAAM,QAAQ,GACjCoK,IACJH,EAAM,SAAQzB,KAAA,gBAAAA,EAAY,SAAQ6B,IAC9BC,IAAWC;AAAA,IACf/B;AAAA,IACAwB;AAAA,IACAC;AAAA,EAAA,GAEIO,IAASF,IACX,SACAG,GAAwBjC,GAAYuB,CAAS,GAC3CpG,IAAO2G,KAAYE,IAAS,WAAY/hB,IAAAwhB,EAAM,SAAN,gBAAAxhB,EAAY,WAAU;AACpE,SAAI,CAAC6hB,KAAY,CAACE,KAAU,CAAC7G,IAAa,OACnC;AAAA,IACL,SAAS3D,EAAM;AAAA,IACf,IAAIsE,EAAI,OAAOA,EAAI,QAAQ,KAAK2F,EAAM,WAAW;AAAA,IACjD,IAAI3F,EAAI,OAAOA,EAAI,QAAQ,KAAK2F,EAAM,WAAW;AAAA,IACjD,QAAQA,EAAM,UAAU;AAAA,IACxB,MAAMK,IACFI,GAA4BN,GAAU5B,CAAU,IAChD4B;AAAA,IACJ,OAAOO;AAAA,MACLnC;AAAA,MACAD;AAAA,MACA0B,EAAM;AAAA,MACNjK,EAAM;AAAA,IAAA;AAAA,IAER,OAAO4K,GAAoBX,EAAM,KAAK;AAAA,IACtC,MAAAtG;AAAA,IACA,UAAA2G;AAAA,IACA,QAAAE;AAAA,EAAA;AAEJ;AAEO,SAASK,GAA2BC,GAQX;AAC9B,QAAMC,IAAe,IAAI;AAAA,KACtBD,EAAM,aAAa,CAAA,GAAI,IAAI,CAACzM,MAAS,CAACA,EAAK,IAAIA,CAAI,CAAC;AAAA,EAAA,GAEjD2M,IAAsB,IAAI;AAAA,IAC9BF,EAAM,YAAY,IAAI,CAACG,MAAQ,CAACA,EAAI,SAASA,CAAG,CAAC;AAAA,EAAA,GAE7ClB,IAAYe,EAAM,aAAa,CAAA,GAC/BI,IAAwC,CAAA;AAC9C,aAAWlL,KAAS,CAAC,GAAI8K,EAAM,kBAAkB,IAAK,GAAGA,EAAM,MAAM,GAAG;AACtE,UAAMtC,IAAawC,EAAoB,IAAIhL,EAAM,EAAE,GAC7C6J,KACJrB,KAAA,gBAAAA,EAAY,eAAc,OACtBuC,EAAa,IAAIvC,EAAW,UAAU,KAAK,OAC3C,MACA2C,IAAUrB;AAAA,MACd9J;AAAA,MACAwI;AAAA,MACAqB;AAAA,MACAE;AAAA,MACAe,EAAM;AAAA,IAAA;AAER,IAAIK,KAASD,EAAS,KAAKC,CAAO;AAAA,EACpC;AACA,SAAOD;AACT;AAEO,SAASE,GACdD,GACAE,GACoB;AACpB,MAAIF,EAAQ,SAAU,QAAOG,GAAgBH,EAAQ,UAAUE,CAAa;AAC5E,MAAI,CAACF,EAAQ,OAAQ;AACrB,QAAM9E,IAAMkF,GAAiBJ,EAAQ,MAAM;AAC3C,MAAK9E;AACL,WAAOmF,GAAuBnF,GAAK8E,EAAQ,KAAK;AAClD;ACnIO,SAASM,GAAqB;AAAA,EACnC,SAAAN;AAAA,EACA,eAAAE;AACF,GAGG;AACD,QAAM,EAAE,GAAA/W,GAAG,GAAAC,GAAG,QAAAmX,GAAQ,MAAA3H,GAAM,OAAAY,GAAO,OAAAgH,GAAO,MAAAhI,MAASwH,GAC7CS,IAAOR,GAAsBD,GAASE,CAAa,GACnDQ,IAAYH,IAAS,UAAUA,CAAM,IAAIpX,CAAC,IAAIC,CAAC,MAAM;AAC3D,SACE,gBAAA5J;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,iBAAewgB,EAAQ;AAAA,MACvB,WAAAU;AAAA,MACA,eAAc;AAAA,MAEb,UAAAD,IACC,gBAAAjhB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAAihB;AAAA,UACA,GAAGtX,IAAIyP,IAAO;AAAA,UACd,GAAGxP,IAAIwP,IAAO;AAAA,UACd,OAAOA;AAAA,UACP,QAAQA;AAAA,UACR,qBAAoB;AAAA,QAAA;AAAA,MAAA,IAEpBJ,IACF,gBAAAhZ;AAAA,QAACmhB;AAAA,QAAA;AAAA,UACC,MAAAnI;AAAA,UACA,GAAArP;AAAA,UACA,GAAAC;AAAA,UACA,MAAAwP;AAAA,UACA,OAAAY;AAAA,UACA,OAAAgH;AAAA,QAAA;AAAA,MAAA,IAEA;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASG,GAAoB;AAAA,EAC3B,MAAAnI;AAAA,EACA,GAAArP;AAAA,EACA,GAAAC;AAAA,EACA,MAAAwP;AAAA,EACA,OAAAY;AAAA,EACA,OAAAgH;AACF,GAOG;AACD,QAAM3H,IAAQN,GAAeC,CAAI,GAC3BoI,IAAahI,IAAOX,IACpB4I,IAAchI,EAAM,SAAS+H;AACnC,SACE,gBAAAphB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,YAAYuY;AAAA,MACZ,UAAUa;AAAA,MACV,MAAMY;AAAA,MACN,YAAYsH,GAAmBN,CAAK;AAAA,MACpC,OAAO,EAAE,YAAY,OAAA;AAAA,MAEpB,UAAA3H,EAAM,IAAI,CAACG,GAAM+H,MAChB,gBAAAvhB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,GAAA2J;AAAA,UACA,GAAGC,IAAIyX,IAAc,KAAKE,IAAQ,OAAOH;AAAA,UACzC,kBAAiB;AAAA,UAEhB,UAAA5H,KAAQ;AAAA,QAAA;AAAA,QALJ+H;AAAA,MAAA,CAOR;AAAA,IAAA;AAAA,EAAA;AAGP;ACpFO,SAASC,GAAmB;AAAA,EACjC,KAAAC;AAAA,EACA,eAAAf;AAAA,EACA,aAAAgB;AAAA,EACA,OAAA9D;AACF,GAKG;AACD,QAAM,CAAC+D,GAASC,CAAU,IAAIC,EAAwB,IAAI,GACpDC,IAAcC;AAAA,IAClB,MAAOL,IAAc,CAAC,GAAGA,CAAW,EAAE,KAAA,EAAO,KAAK,IAAI,IAAI;AAAA,IAC1D,CAACA,CAAW;AAAA,EAAA;AAGd,EAAAM,GAAU,MAAM;AACd,QAAIC,IAAY;AAChB,UAAMC,IAAa,IAAI,gBAAA,GACjBC,IAAWxB,GAAgBc,GAAKf,CAAa;AACnD,iBAAMyB,GAAU,EAAE,QAAQD,EAAW,QAAQ,EAC1C,KAAK,CAACE,MAAQ;AACb,UAAI,CAACA,EAAI,GAAI,OAAM,IAAI,MAAM,aAAaA,EAAI,MAAM,EAAE;AACtD,aAAOA,EAAI,KAAA;AAAA,IACb,CAAC,EACA,KAAK,CAACpJ,MAAS;AACd,MAAIiJ,KACJL,EAAW5I,CAAI;AAAA,IACjB,CAAC,EACA,MAAM,CAACqJ,MAAQ;AACd,MAAIJ,KACAI,aAAe,gBAAgBA,EAAI,SAAS,iBAChDT,EAAW,IAAI,GACf,QAAQ;AAAA,QACN,+CAA+CO,CAAQ;AAAA,QAEvDE;AAAA,MAAA;AAAA,IAEJ,CAAC,GACI,MAAM;AACX,MAAAJ,IAAY,IACZC,EAAW,MAAA;AAAA,IACb;AAAA,EACF,GAAG,CAACT,GAAKf,CAAa,CAAC;AAEvB,QAAM4B,IAAQP,GAAQ,MAAM;AAC1B,QAAI,CAACJ,EAAS,QAAO,CAAA;AACrB,UAAMY,IAAUT,IACZ,IAAI,IAAIA,EAAY,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC,IAC/C;AACJ,WAAOU,GAAyBb,GAASY,GAAS3E,CAAK;AAAA,EACzD,GAAG,CAAC+D,GAASG,GAAalE,CAAK,CAAC;AAEhC,SAAI0E,EAAM,WAAW,IAAU,OAG7B,gBAAAtiB,EAAC,KAAA,EAAE,WAAU,iCAAgC,eAAc,QACxD,UAAAsiB,EAAM,IAAI,CAAC5O,GAAM6N,MAChB,gBAAAvhB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,GAAG0T,EAAK;AAAA,MACR,MAAMA,EAAK,QAAQ;AAAA,MACnB,QAAQA,EAAK,UAAU;AAAA,MACvB,aAAaA,EAAK,eAAe;AAAA,MACjC,SAASA,EAAK,WAAW;AAAA,IAAA;AAAA,IALpB,GAAGA,EAAK,EAAE,IAAI6N,CAAK;AAAA,EAAA,CAO3B,GACH;AAEJ;ACxEO,SAASkB,GAAoB9Q,GAA0B;AAC5D,SAAO2M,GAAwB,SAAS3M,CAAI;AAC9C;AAGO,SAAS+Q,GAAqBrN,GAGzB;AACV,SAAO,CAAC8E,GAAa9E,CAAK;AAC5B;AAEO,SAASsN,GAAmBhR,GAAyB;AAC1D,SAAIA,MAAS,UAAUA,MAAS,iBACvB,wDAELA,MAAS,YACJ,0DAELA,MAAS,iBACJ,wDAEF;AACT;ACPO,MAAMiR,KAAqB,IAKrBC,KAA2B;AAEjC,SAASC,GAAgBtjB,GAAc0B,IAAY,IAAgB;AACxE,SACE1B,MAAS,gBACTA,MAAS,kBACTA,MAAS,uBAEF,KAEF0B,MAAc1B,MAAS,YAAYA,MAAS;AACrD;AAOO,SAASujB,GAAqBC,GAGD;AAClC,SAAIA,EAAQ,mBAAmB,QAAQA,EAAQ,oBAAoB,OAC1D,eAEF;AACT;AAEO,SAASC,GACdC,GACA9F,GACkE;AAClE,SAAK8F,IACE,EAAE,WAAW,MAAM,OAAOA,GAAO,KAAK9F,EAAA,IAD1B,EAAE,WAAWA,GAAO,OAAO,MAAM,KAAK,KAAA;AAE3D;AAGO,SAAS+F,GACd3e,GACAC,GACiC;AAEjC,SADI,CAACD,KAAQ,CAACC,KACV8H,GAAS/H,GAAMC,CAAE,KAAK,OAAa,OAChC,EAAE,MAAAD,GAAM,IAAAC,EAAA;AACjB;AAEO,SAAS2e,GAAkBzR,GAA0B;AAC1D,SAAO2M,GAAwB,SAAS3M,CAAI;AAC9C;AAGO,SAAS0R,GACdzlB,GACS;AACT,UAAOA,KAAA,gBAAAA,EAAO,UAAS;AACzB;AAEO,SAAS0lB,GAAmB3R,GAA6B;AAC9D,SAAO4R,GAAwB5R,CAAI;AACrC;AAEO,SAAS6R,GAAgBnO,GAAwC;;AACtE,QAAMsE,IAAMO,GAAa7E,EAAM,QAAQ;AACvC,SAAIsE,EAAI,OAAOA,EAAI,QAAQA,EAAI,OAAOA,EAAI,OACjC;AAAA,IACL,IAAIA,EAAI,OAAOA,EAAI,QAAQ;AAAA,IAC3B,IAAIA,EAAI,OAAOA,EAAI,QAAQ;AAAA,EAAA,MAGjB7b,IAAAuX,EAAM,SAAS,SAAS,CAAC,MAAzB,gBAAAvX,EAA6B,OAC3B,EAAE,GAAG,GAAG,GAAG,EAAA;AAC7B;AASO,SAAS2lB,GACdC,GACAxe,GACS;AACT,SAAOA,EAAM;AAAA,IACX,CAACR,MAASA,EAAK,iBAAiBgf,KAAYhf,EAAK,eAAegf;AAAA,EAAA;AAEpE;AAEO,SAASC,GACdD,GACAxe,GACa;AACb,QAAM0e,IAAM,oBAAI,IAAI,CAACF,CAAQ,CAAC,GACxBG,IAAU,CAACH,CAAQ;AACzB,SAAOG,EAAQ,SAAS,KAAG;AACzB,UAAMllB,IAAUklB,EAAQ,IAAA;AACxB,eAAWnf,KAAQQ,GAAO;AACxB,UAAInD,IAAsB;AAG1B,MAFI2C,EAAK,iBAAiB/F,MAASoD,IAAO2C,EAAK,aAC3CA,EAAK,eAAe/F,MAASoD,IAAO2C,EAAK,eACzC,EAAA3C,KAAQ,QAAQ6hB,EAAI,IAAI7hB,CAAI,OAChC6hB,EAAI,IAAI7hB,CAAI,GACZ8hB,EAAQ,KAAK9hB,CAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO6hB;AACT;AAEO,SAASE,GACd5e,GACA1B,GACAC,GACS;AACT,SAAOyB,EAAM;AAAA,IACX,CAACR,MACEA,EAAK,iBAAiBlB,KAAKkB,EAAK,eAAejB,KAC/CiB,EAAK,iBAAiBjB,KAAKiB,EAAK,eAAelB;AAAA,EAAA;AAEtD;AAcO,SAASugB,GAAoBrf,GAA0C;AAC5E,SACEA,EAAK,SAAS,UACdA,EAAK,SAAS,eACdA,EAAK,SAAS;AAElB;AAEA,SAASsf,GAAqBtf,GAA0C;AACtE,SAAOqf,GAAoBrf,CAAI;AACjC;AAEA,SAASuf,GAAcvf,GAAmBwf,GAAuC;AAC/E,SAAOA,IAAQ,EAAE,GAAGxf,GAAM,OAAAwf,MAAUxf;AACtC;AAGA,SAASyf,GACPC,GACAC,GACArX,GACAsX,GACAC,GACAC,GACwD;AACxD,QAAMhgB,IAAOggB,EAAW,IAAIJ,EAAO,YAAY,GACzC3f,IAAK+f,EAAW,IAAIJ,EAAO,UAAU,GACrCF,IAAQO,GAAaL,CAAM;AACjC,MAAI5f,KAAQC,KAAMyf,GAAO;AACvB,UAAM1T,IAAQkU,GAAgBlgB,GAAMC,GAAIyf,GAAOlX,CAAK;AACpD,WAAO;AAAA,MACL,OAAOwD,EAAM;AAAA,MACb,MAAMyT;AAAA,QACJU,GAASJ,KAAWD,GAAOF,EAAO,cAAcC,GAAYD,EAAO,IAAI;AAAA,QACvE5T,EAAM;AAAA,MAAA;AAAA,MAER,OAAOyT;AAAA,QACLU,GAASJ,KAAWD,GAAOD,GAAYD,EAAO,YAAYA,EAAO,IAAI;AAAA,QACrE5T,EAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAEJ;AACA,SAAO;AAAA,IACL,OAAAxD;AAAA,IACA,MAAM2X,GAASJ,EAAA,GAAWD,GAAOF,EAAO,cAAcC,GAAYD,EAAO,IAAI;AAAA,IAC7E,OAAOO,GAASJ,KAAWD,GAAOD,GAAYD,EAAO,YAAYA,EAAO,IAAI;AAAA,EAAA;AAEhF;AAGO,SAASQ,GACd3f,GACA4f,GACa;AACb,MAAI,CAACA,EAAS,QAAO,oBAAI,IAAA;AACzB,QAAMjB,wBAAU,IAAA;AAChB,aAAWkB,KAAU7f;AACnB,IACE6f,EAAO,YAAYD,EAAQ,WAC3BtY,GAASuY,GAAQD,EAAQ,MAAM,KAAKxQ,MAEpCuP,EAAI,IAAIkB,EAAO,EAAE;AAGrB,SAAOlB;AACT;AAQO,SAASmB,GACd/X,GACA/H,GACAC,GACA8f,GACAC,GACAT,IAA4C,IAAI;AAAA,EAC9Cvf,EAAQ,IAAI,CAAC6f,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC;AAC7C,GAEAI,IAA8B,YACN;AACxB,MAAIC,IAAuC,MACvCC,IAAmC;AAEvC,aAAWN,KAAU7f,GAAS;AAC5B,QAAI+f,EAAW,IAAIF,EAAO,EAAE,EAAG;AAC/B,UAAM3e,IAAIoG,GAASuY,GAAQ9X,CAAK;AAChC,IAAI7G,IAAI8e,MACJ,CAACE,KAAgBhf,IAAIgf,EAAa,cACpCA,IAAe;AAAA,MACb,MAAM;AAAA,MACN,UAAUL,EAAO;AAAA,MACjB,OAAO,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,MAChC,UAAU3e;AAAA,IAAA;AAAA,EAGhB;AAEA,aAAWzB,KAAQQ,GAAO;AAExB,QADI,CAAC8e,GAAqBtf,CAAI,KAC1BsgB,EAAW,IAAItgB,EAAK,YAAY,KAAKsgB,EAAW,IAAItgB,EAAK,UAAU;AACrE;AAEF,UAAMF,IAAOggB,EAAW,IAAI9f,EAAK,YAAY,GACvCD,IAAK+f,EAAW,IAAI9f,EAAK,UAAU;AACzC,QAAI,CAACF,KAAQ,CAACC,EAAI;AAClB,UAAM+R,IAAM6O,GAAqBrY,GAAOxI,GAAMC,GAAIggB,GAAa/f,CAAI,CAAC;AACpE,IAAI8R,EAAI,WAAWyO,MACf,CAACG,KAAY5O,EAAI,WAAW4O,EAAS,cACvCA,IAAW;AAAA,MACT,MAAM;AAAA,MACN,QAAQ1gB,EAAK;AAAA,MACb,cAAcA,EAAK;AAAA,MACnB,YAAYA,EAAK;AAAA,MACjB,OAAO8R,EAAI;AAAA,MACX,UAAUA,EAAI;AAAA,IAAA;AAAA,EAGpB;AAEA,SAAI0O,MAAW,SAAeE,IACvBD,KAAgBC;AACzB;AAaA,SAAST,GACPrO,GACAgO,GACAgB,GACAC,GACA5T,IAA4B,QACf;AACb,SAAO;AAAA,IACL,IAAA2E;AAAA,IACA,OAAAgO;AAAA,IACA,cAAAgB;AAAA,IACA,YAAAC;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,MAAA5T;AAAA,EAAA;AAEJ;AAGO,SAAS6T,GAA0BrF,GAKD;AACvC,QAAM,EAAE,OAAA9K,GAAO,SAAApQ,GAAS,SAAAsf,EAAA,IAAYpE,GAC9BnT,IAAQmT,EAAM,SAASqD,GAAgBnO,CAAK,GAC5CoQ,IAAWxgB,EAAQ;AAAA,IACvB,CAAC6f,MACCA,EAAO,YAAYzP,EAAM,MACzB9I,GAASuY,GAAQ9X,CAAK,KAAKqH;AAAA,EAAA;AAE/B,MAAIoR,UAAiB,EAAE,KAAK,CAAA,GAAI,UAAUA,EAAS,GAAA;AACnD,QAAMC,IAAiB;AAAA,IACrB,IAAInB,EAAA;AAAA,IACJ,SAASlP,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAMiO,GAAmBjO,EAAM,IAAI;AAAA,IACnC,GAAGrI,EAAM;AAAA,IACT,GAAGA,EAAM;AAAA,IACT,aAAa;AAAA,EAAA;AAEf,SAAO,EAAE,KAAK,CAAC,EAAE,IAAI,iBAAiB,QAAQ0Y,GAAM,GAAG,UAAUA,EAAK,GAAA;AACxE;AAMO,SAASC,GAAuBxF,GAA4C;AACjF,QAAM,EAAE,OAAA9K,GAAO,SAAApQ,GAAS,OAAAC,GAAO,OAAAof,GAAO,MAAA9f,GAAM,MAAAkQ,GAAM,SAAAuQ,GAAS,SAAAV,EAAA,IAAYpE,GACjEyF,IAAiB,CAAA;AACvB,MAAIF,IACFzgB,EAAQ;AAAA,IACN,CAAC6f,MACCA,EAAO,YAAYzP,EAAM,MACzB9I,GAASuY,GAAQtgB,CAAI,KAAK6P;AAAA,EAAA,KACzB;AAEP,EAAKqR,MACHA,IAAO;AAAA,IACL,IAAInB,EAAA;AAAA,IACJ,SAASlP,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAMiO,GAAmBjO,EAAM,IAAI;AAAA,IACnC,GAAG7Q,EAAK;AAAA,IACR,GAAGA,EAAK;AAAA,IACR,aAAa;AAAA,EAAA,GAEfohB,EAAI,KAAK,EAAE,IAAI,iBAAiB,QAAQF,GAAM;AAGhD,QAAMG,IAAOd;AAAA,IACXrQ;AAAA,IACAzP;AAAA,IACAC;AAAA,IACA,oBAAI,IAAI,CAACwgB,EAAK,EAAE,CAAC;AAAA,IACjBT;AAAA,EAAA;AAGF,MADI,CAACY,KACDtZ,GAASmZ,GAAMG,EAAK,KAAK,KAAKxR,GAAwB,QAAOuR;AAEjE,MAAIvB;AACJ,QAAMyB,IAAY5gB,EAAM,MAAA;AAExB,MAAI2gB,EAAK,SAAS;AAChB,IAAAxB,IAAawB,EAAK;AAAA,OACb;AACL,UAAMzB,IAASlf,EAAM,KAAK,CAACR,MAASA,EAAK,OAAOmhB,EAAK,MAAM;AAC3D,QAAI,CAACzB,EAAQ,QAAOwB;AACpB,IAAAvB,IAAaE,EAAA;AACb,UAAM/T,IAAQ2T;AAAA,MACZC;AAAA,MACAC;AAAA,MACAwB,EAAK;AAAA,MACLvB;AAAA,MACAC;AAAA,MACA,IAAI,IAAItf,EAAQ,IAAI,CAAC6f,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC,CAAC;AAAA,IAAA;AAEtD,IAAAc,EAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,QAAQ;AAAA,QACN,IAAIvB;AAAA,QACJ,SAAShP,EAAM;AAAA,QACf,SAAS;AAAA,QACT,MAAM;AAAA,QACN,GAAG7E,EAAM,MAAM;AAAA,QACf,GAAGA,EAAM,MAAM;AAAA,QACf,aAAa;AAAA,MAAA;AAAA,IACf,CACD,GACDoV,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQxB,EAAO,IAAI;AACjD,UAAM5Q,IAAOhD,EAAM,MACbiD,IAAQjD,EAAM;AACpB,IAAAoV,EAAI,KAAK,EAAE,IAAI,eAAe,MAAMpS,GAAM,GAC1CoS,EAAI,KAAK,EAAE,IAAI,eAAe,MAAMnS,GAAO,GAC3CqS,EAAU,KAAKtS,GAAMC,CAAK;AAAA,EAC5B;AAEA,MAAIqQ,GAAegC,GAAWJ,EAAK,IAAIrB,CAAU,EAAG,QAAOuB;AAE3D,QAAMG,IAAWL,EAAK,SAAS,aAAa,kBAAkB;AAC9D,SAAAE,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,MAAMjB,GAASJ,EAAA,GAAWD,GAAOoB,EAAK,IAAIrB,GAAY0B,CAAQ;AAAA,EAAA,CAC/D,GACMH;AACT;AAGO,SAASI,GAA6B7F,GAQ/B;AACZ,QAAM,EAAE,QAAA2E,GAAQ,SAAA7f,GAAS,OAAAC,GAAO,OAAAof,GAAO,MAAA5P,GAAM,SAAAuQ,GAAS,SAAAV,MAAYpE,GAC5D8F,IAAW/gB,EAAM;AAAA,IACrB,CAACR,MACCA,EAAK,iBAAiBogB,EAAO,MAAMpgB,EAAK,eAAeogB,EAAO;AAAA,EAAA;AAElE,MAAIA,EAAO,WAAW,QAAQmB,EAAS,SAAS,UAAU,CAAA;AAE1D,QAAMJ,IAAOd;AAAA,IACXrQ;AAAA,IACAzP;AAAA,IACAC;AAAA,IACAye,GAAwBmB,EAAO,IAAI5f,CAAK;AAAA,IACxC+f;AAAA,EAAA;AAEF,MAAI,CAACY,EAAM,QAAO,CAAA;AAElB,MAAIA,EAAK,SAAS,YAAY;AAC5B,QAAII,EAAS,WAAW,GAAG;AACzB,YAAM7B,IAAS6B,EAAS,CAAC,GACnBC,IACJ9B,EAAO,iBAAiBU,EAAO,KAC3BV,EAAO,aACPA,EAAO,cACPwB,IAAiB,CAAA;AACvB,aAAK9B,GAAe5e,GAAOghB,GAASL,EAAK,QAAQ,IAgB/CD,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQxB,EAAO,IAAI,IAfjDwB,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ,GAAGxB;AAAAA,UACH,cACEA,EAAO,iBAAiBU,EAAO,KAC3Be,EAAK,WACLzB,EAAO;AAAA,UACb,YACEA,EAAO,eAAeU,EAAO,KACzBe,EAAK,WACLzB,EAAO;AAAA,QAAA;AAAA,MACf,CACD,GAIHwB,EAAI,KAAK,EAAE,IAAI,iBAAiB,UAAUd,EAAO,IAAI,GAC9Cc;AAAAA,IACT;AAEA,UAAMO,IAAOC;AAAA,MACX9B;AAAA,MACAQ,EAAO;AAAA,MACPe,EAAK;AAAA,MACL3gB;AAAA,MACAqf;AAAA,IAAA,GAEIqB,IAAiB;AAAA,MACrB;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ,EAAE,GAAGd,GAAQ,GAAGe,EAAK,MAAM,GAAG,GAAGA,EAAK,MAAM,EAAA;AAAA,MAAE;AAAA,IACxD;AAEF,WAAIM,KAAMP,EAAI,KAAKO,CAAI,GAChBP;AAAA,EACT;AAEA,QAAMxB,IAASlf,EAAM,KAAK,CAACR,MAASA,EAAK,OAAOmhB,EAAK,MAAM;AAC3D,MAAI,CAACzB,EAAQ,QAAO,CAAA;AACpB,QAAM5T,IAAQ2T;AAAA,IACZC;AAAA,IACAU,EAAO;AAAA,IACPe,EAAK;AAAA,IACLvB;AAAA,IACAC;AAAA,IACA,IAAI,IAAItf,EAAQ,IAAI,CAACyO,MAAS,CAACA,EAAK,IAAIA,CAAI,CAAC,CAAC;AAAA,EAAA;AAEhD,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ,EAAE,GAAGoR,GAAQ,GAAGtU,EAAM,MAAM,GAAG,GAAGA,EAAM,MAAM,EAAA;AAAA,IAAE;AAAA,IAE1D,EAAE,IAAI,eAAe,QAAQ4T,EAAO,GAAA;AAAA,IACpC,EAAE,IAAI,eAAe,MAAM5T,EAAM,KAAA;AAAA,IACjC,EAAE,IAAI,eAAe,MAAMA,EAAM,MAAA;AAAA,EAAM;AAE3C;AAEO,SAAS4V,GACd9B,GACAgB,GACAC,GACArgB,GACAqf,GACgB;AAEhB,SADIe,MAAiBC,KACjBzB,GAAe5e,GAAOogB,GAAcC,CAAU,IAAU,OACrD;AAAA,IACL,IAAI;AAAA,IACJ,MAAMZ,GAASJ,EAAA,GAAWD,GAAOgB,GAAcC,CAAU;AAAA,EAAA;AAE7D;AAEO,SAASc,GAA4BlG,GAOD;AACzC,QAAM,EAAE,SAAAmG,GAAS,OAAAhC,GAAO,MAAA5f,GAAM,OAAAsI,GAAO,SAAAuX,GAAS,SAAAtf,IAAU,CAAA,EAAC,IAAMkb,GACzDkE,IAAaE,EAAA,GACb/T,IAAQ2T;AAAA,IACZzf;AAAA,IACA2f;AAAA,IACArX;AAAA,IACAsX;AAAA,IACAC;AAAA,IACA,IAAI,IAAItf,EAAQ,IAAI,CAAC6f,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC,CAAC;AAAA,EAAA;AAEtD,SAAO;AAAA,IACL,YAAAT;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,IAAIA;AAAA,UACJ,SAAAiC;AAAA,UACA,SAAS;AAAA,UACT,MAAM;AAAA,UACN,GAAG9V,EAAM,MAAM;AAAA,UACf,GAAGA,EAAM,MAAM;AAAA,UACf,aAAa;AAAA,QAAA;AAAA,MACf;AAAA,MAEF,EAAE,IAAI,eAAe,QAAQ9L,EAAK,GAAA;AAAA,MAClC,EAAE,IAAI,eAAe,MAAM8L,EAAM,KAAA;AAAA,MACjC,EAAE,IAAI,eAAe,MAAMA,EAAM,MAAA;AAAA,IAAM;AAAA,EACzC;AAEJ;AAMO,SAAS+V,GACdC,GACAthB,GACW;AACX,QAAMR,IAAOQ,EAAM,KAAK,CAACwO,MAASA,EAAK,OAAO8S,CAAM;AACpD,MAAI,CAAC9hB,EAAM,QAAO,CAAA;AAClB,QAAMqE,IAAY7D,EAAM,OAAO,CAACwO,MAASA,EAAK,OAAO8S,CAAM,GACrDZ,IAAiB,CAAC,EAAE,IAAI,eAAe,QAAAY,GAAQ;AACrD,aAAW9C,KAAY,CAAChf,EAAK,cAAcA,EAAK,UAAU;AACxD,IAAK+e,GAAcC,GAAU3a,CAAS,KACpC6c,EAAI,KAAK,EAAE,IAAI,iBAAiB,UAAAlC,GAAU;AAG9C,SAAOkC;AACT;AAWA,SAASa,GACP/C,GACAxe,GAKA;AACA,QAAM+gB,IAAW/gB,EAAM;AAAA,IACrB,CAACR,MAASA,EAAK,iBAAiBgf,KAAYhf,EAAK,eAAegf;AAAA,EAAA,GAE5DgD,IAAiB,IAAI,IAAIT,EAAS,IAAI,CAACvhB,MAASA,EAAK,EAAE,CAAC,GACxDqE,IACJ7D,EAAM,OAAO,CAACR,MAAS,CAACgiB,EAAe,IAAIhiB,EAAK,EAAE,CAAC,GAC/CiiB,IAAgB;AAAA,IACpB,GAAG,IAAI;AAAA,MACLV,EACG,OAAO,CAACvhB,MAASA,EAAK,SAAS,MAAM,EACrC;AAAA,QAAI,CAACA,MACJA,EAAK,iBAAiBgf,IAAWhf,EAAK,aAAaA,EAAK;AAAA,MAAA;AAAA,IAC1D;AAAA,EACJ,GAEIkiB,IACJD,EAAc,WAAW,KACzB,CAAC7C,GAAe5e,GAAOyhB,EAAc,CAAC,GAAGA,EAAc,CAAC,CAAC,IACrD,CAACA,EAAc,CAAC,GAAGA,EAAc,CAAC,CAAC,IACnC;AACN,EAAIC,KACF7d,EAAU,KAAK,EAAE,cAAc6d,EAAK,CAAC,GAAG,YAAYA,EAAK,CAAC,GAAG;AAG/D,QAAMC,IAAmB,CAACnD,CAAQ,GAC5BoD,IAAO,oBAAI,IAAY,CAACpD,CAAQ,CAAC;AACvC,aAAWhf,KAAQuhB;AACjB,eAAW3P,KAAM,CAAC5R,EAAK,cAAcA,EAAK,UAAU;AAClD,MAAIoiB,EAAK,IAAIxQ,CAAE,MACfwQ,EAAK,IAAIxQ,CAAE,GACNmN,GAAcnN,GAAIvN,CAAS,KAAG8d,EAAiB,KAAKvQ,CAAE;AAG/D,SAAO,EAAE,UAAA2P,GAAU,MAAAW,GAAM,kBAAAC,EAAA;AAC3B;AAGO,SAASE,GACdrD,GACAxe,GACU;AACV,SAAOuhB,GAAuB/C,GAAUxe,CAAK,EAAE;AACjD;AAMO,SAAS8hB,GACdtD,GACAY,GACApf,GACAqf,GACW;AACX,QAAM,EAAE,UAAA0B,GAAU,MAAAW,GAAM,kBAAAC,EAAA,IAAqBJ;AAAA,IAC3C/C;AAAA,IACAxe;AAAA,EAAA,GAEI0gB,IAAiBK,EAAS,IAAI,CAACvhB,OAAU;AAAA,IAC7C,IAAI;AAAA,IACJ,QAAQA,EAAK;AAAA,EAAA,EACb;AACF,EAAIkiB,KACFhB,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,MAAMjB,GAASJ,KAAWD,GAAOsC,EAAK,CAAC,GAAGA,EAAK,CAAC,CAAC;AAAA,EAAA,CAClD;AAEH,aAAWtQ,KAAMuQ;AACf,IAAAjB,EAAI,KAAK,EAAE,IAAI,iBAAiB,UAAUtP,GAAI;AAEhD,SAAOsP;AACT;AChgBA,MAAMqB,KAAc,GACdC,KAAuB,IACvBC,KAAgB,IAChBC,KAAmB,GAEnBC,KAA0B,WAC1BC,KAAc,GACdC,KAAuB,GACvBC,KAAgB,IAChBC,KAAmB,GACnBC,KAAc,GACdC,KAAuB,GACvBC,KAAgB,IAChBC,KAAiB,MACjBC,KAAsB,GACtBC,KAAY,GACZC,KAAe,GAEfC,KAAoB,GACpBC,KAAc;AAEpB,SAASC,GAAY3kB,GAASC,GAAiB;AAC7C,SAAO;AAAA,IACL,EAAE,GAAGD,EAAE,GAAG,GAAGA,EAAE,EAAA;AAAA,IACf,EAAE,GAAGC,EAAE,GAAG,GAAGD,EAAE,EAAA;AAAA,IACf,EAAE,GAAGC,EAAE,GAAG,GAAGA,EAAE,EAAA;AAAA,IACf,EAAE,GAAGD,EAAE,GAAG,GAAGC,EAAE,EAAA;AAAA,EAAE;AAErB;AAEA,SAAS2kB,GAAS5kB,GAASC,GAAiB;AAC1C,SAAO,KAAK,MAAMA,EAAE,IAAID,EAAE,GAAGC,EAAE,IAAID,EAAE,CAAC;AACxC;AAGA,SAAS6kB,GAAkB9O,GAAoC;AAC7D,SAAO,EAAG,sBAAuBA,EAAA;AACnC;AAEA,SAAS+O,GAAU;AAAA,EACjB,IAAAxgB;AAAA,EACA,IAAAC;AAAA,EACA,GAAAlD;AAAA,EACA,MAAA0jB;AAAA,EACA,MAAAzJ;AAAA,EACA,QAAA0J;AAAA,EACA,aAAAC;AAAA,EACA,QAAAnR;AAAA,EACA,aAAAoR,IAAc;AAAA,EACd,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AACF,GAeG;AACD,SACE,gBAAA/oB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAA4oB;AAAA,MACA,gBAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,aAAa,CAAC1iB,MAAMA,EAAE,eAAA;AAAA,MACtB,eAAA2iB;AAAA,MACA,OAAOzR,IAAS,EAAE,QAAAA,EAAA,IAAW;AAAA,MAE7B,UAAA,gBAAAtX,EAAC,KAAA,EAAE,WAAW,aAAa8H,CAAE,IAAIC,CAAE,KACjC,UAAA,gBAAAzH,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA;AAAA,QAAA,gBAAAN,EAAC,UAAA,EAAO,IAAI,GAAG,IAAI,GAAG,GAAGuoB,GAAM,MAAK,cAAA,CAAc;AAAA,QAClD,gBAAAvoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,GAAA6E;AAAA,YACA,MAAAia;AAAA,YACA,aAAA4J;AAAA,YACA,QAAAF;AAAA,YACA,aAAAC;AAAA,YACA,iBAAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAAA,CACF,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAyGA,SAASK,GAAela,GAA4B;AAClD,SAAOA,EACJ,IAAI,CAAC/J,MAAS;AACb,QAAIA,EAAK,WAAW,EAAG,QAAO;AAC9B,QAAIoB,IAAI,KAAKpB,EAAK,CAAC,EAAE,CAAC,IAAIA,EAAK,CAAC,EAAE,CAAC;AACnC,aAASiF,IAAI,GAAGA,IAAIjF,EAAK,QAAQiF,IAAK,CAAA7D,KAAK,MAAMpB,EAAKiF,CAAC,EAAE,CAAC,IAAIjF,EAAKiF,CAAC,EAAE,CAAC;AACvE,WAAA7D,KAAK,MACEA;AAAA,EACT,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS8iB,GAAgB5T,GAAgB6T,GAAmC;AAC1E,SAAI7T,EAAM,aAAmB,KACzB8E,GAAa9E,CAAK,KAClB,CAAC6T,IAAwB,KACtB5K,GAAwB,SAASjJ,EAAM,IAAI;AACpD;AAEA,SAAS8T,GAAkBC,GAA2B;AACpD,SAAKA,IACE,4CADe;AAExB;AAEA,SAASC,GACPD,GACAE,GACiC;AACjC,MAAKF;AACL,WAAO;AAAA,MACL,4BAA4B,OAAOE,CAAW;AAAA,IAAA;AAElD;AAEO,MAAMC,KAAexmB,GAAM;AAAA,EAClC,SAAsB;AAAA,IACpB,OAAAnF;AAAA,IACA,QAAAgX;AAAA,IACA,SAAA3P;AAAA,IACA,OAAAC;AAAA,IACA,aAAAskB;AAAA,IACA,WAAAC,IAAY,CAAA;AAAA,IACZ,WAAArK,IAAY,CAAA;AAAA,IACZ,OAAAxB;AAAA,IACA,MAAApe;AAAA,IACA,iBAAAkqB;AAAA,IACA,mBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,eAAAC,IAAgB;AAAA,IAChB,eAAApJ,IAAgB;AAAA,IAChB,aAAAqJ,IAAc;AAAA,IACd,gBAAAC,IAAiB,CAAA;AAAA,IACjB,uBAAAC,IAAwB,CAAA;AAAA,IACxB,iBAAAf,IAAkB;AAAA,IAClB,UAAAE,IAAW;AAAA,IACX,aAAAE,IAAc;AAAA,IACd,WAAApoB,IAAY;AAAA,IACZ,UAAAgpB,IAAW;AAAA,IACX,cAAAC,KAAe;AAAA,IACf,eAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,6BAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,QAAAhoB;AAAA,IACA,0BAAAioB;AAAA,IACA,cAAAlpB;AAAA,EAAA,GACCmpB,IAAK;;AACN,IAAAC,GAAA;AACA,UAAMC,KAAe1I,GAAgBtjB,GAAM0B,CAAS,GAC9CuqB,IAASC,GAAsB,IAAI,GACnCC,KAAeD,GAAoB,IAAI,GACvCE,KAAYF,GAAuB,IAAI,GACvC,CAAA,EAAGG,EAAM,IAAIhK,EAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GACpC,CAACzF,IAAM0P,EAAO,IAAIjK,EAAS,CAAC,GAC5BkK,KAAUL,GAAO,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,EAAA,GAAK,MAAM,EAAA,CAAG,GAEjDM,KAAcN,GAAO,CAAC,GACtBO,KAAgBP,GAAsB,IAAI,GAC1CQ,KAAiBR,GAA6C,IAAI,GAClE,CAAC5O,IAAWqP,EAAY,IAAItK,EAAS,CAAC,GACtCuK,KAAcV,GAAO,oBAAI,KAAmB,GAC5CW,KAAWX,GAIP,IAAI,GACR,CAACY,IAASC,EAAU,IAAI1K,EAAiB,CAAA,CAAE,GAC3C,CAAC2K,GAAgBC,CAAiB,IAAI5K,EAAS,EAAK,GACpD,CAAC6K,IAAWC,EAAY,IAAI9K,EAAS,EAAK,GAC1C+K,KAAelB,GAAO,EAAK,GAC3B,CAACmB,IAAWC,CAAY,IAAIjL,EAAiC,IAAI,GACjE,CAACkL,GAAeC,CAAgB,IAAInL,EAAiB,CAAA,CAAE,GACvD,CAACoL,GAAYC,CAAa,IAAIrL,EAAwB,IAAI,GAC1D,CAACsL,IAAiBC,EAAkB,IAAIvL,EAAsB,IAAI,GAClE,CAACwL,IAAgBC,EAAiB,IAAIzL,EAI1C,IAAI,GACA,CAAC0L,IAAqBC,EAAsB,IAAI3L,EAG5C,IAAI,GACR,CAAC4L,IAAiBC,EAAkB,IAAI7L,EAAwB,IAAI,GACpE,CAAC8L,IAAiBC,EAAkB,IAAI/L,EAAsB,IAAI,GAClE,CAACgM,IAAkBC,EAAmB,IAAIjM,EAGtC,IAAI,GACR,CAACkM,IAAcC,EAAe,IAAInM,EAAsB,IAAI,GAC5D,CAACoM,IAAkBC,EAAmB,IAAIrM;AAAA,MAC9C;AAAA,IAAA,GAEI,CAACsM,IAAgBC,EAAiB,IAAIvM;AAAA,MAC1C;AAAA,IAAA,GAEI,CAACwM,IAAkBC,CAAmB,IAAIzM;AAAA,MAC9C;AAAA,IAAA,GAEI,CAAC0M,IAAaC,EAAc,IAAI3M,EAAsB,IAAI,GAC1D4M,KAAoB,MAAM;AAC9B,MAAAb,GAAmB,IAAI,GACvBF,GAAmB,IAAI,GACvBI,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AAAA,IACtB;AACA,IAAAhM,GAAU,MAAM;AACd,MAAAqJ,MAAA,QAAAA;AAAA,QACEsC,MAAmB,QAAQZ,EAAc,SAAS,KAAKT,GAAQ,SAAS;AAAA;AAAA,IAE5E,GAAG,CAACA,GAAQ,QAAQjB,IAA0B0B,EAAc,QAAQY,EAAe,CAAC,GACpF3L,GAAU,MAAM;AACd,MAAIyL,MAAmB,SACnBxoB,EAAQ,KAAK,CAAC6f,MAAWA,EAAO,OAAO2I,EAAe,MAC1DC,GAAmB,IAAI,GACvBM,GAAgB,IAAI;AAAA,IACtB,GAAG,CAAC/oB,GAASwoB,EAAe,CAAC;AAC7B,UAAM,CAACiB,IAAUC,EAAW,IAAI9M,EAMtB,IAAI,GACR,CAAC+M,IAAWC,EAAY,IAAIhN,EAIxB,IAAI,GACR,CAACiN,IAAaC,EAAc,IAAIlN,EAAe,EAAE,GAAG,GAAG,GAAG,GAAG,GAC7D,CAACmN,IAAYC,EAAa,IAAIpN,EAgB1B,IAAI,GACR,CAACqN,IAAgBC,EAAiB,IAAItN,EAGlC,IAAI,GACR,CAACuN,IAAgBC,EAAiB,IAAIxN,EAIlC,IAAI,GACR,CAACyN,IAAaC,EAAc,IAAI1N,EAI5B,IAAI,GACR,CAAC2N,IAAWC,EAAY,IAAI5N,EAUxB,IAAI,GACR,CAAC6N,IAAgBC,EAAiB,IAAI9N,EAAwB,IAAI,GAClE,CAAC+N,IAAiBC,EAAkB,IAAIhO,EAAwB,IAAI,GACpE,CAACiO,IAAkBC,EAAmB,IAC1ClO,EAAiC,IAAI,GACjC,CAACmO,IAAqBC,EAAsB,IAAIpO;AAAA,MACpD;AAAA,IAAA,GAEIqO,KAAgB7F,GAChB8F,KAAgB,CAACvM,MAAkB;AACvC,MAAAqM,GAAuB,IAAI,GAC3BC,GAActM,CAAG;AAAA,IACnB;AACA,IAAA5B,GAAU,MAAM;AACd,MAAIgO,MAAuB,SACtB9qB,EAAM,KAAK,CAACR,MAASA,EAAK,OAAOsrB,EAAmB,KACvDC,GAAuB,IAAI;AAAA,IAE/B,GAAG,CAAC/qB,GAAO8qB,EAAmB,CAAC;AAC/B,UAAMI,MACJN,MAAA,gBAAAA,GAAkB,UAAS,SACvB,EAAE,QAAQA,GAAiB,QAAQ,OAAOA,GAAiB,MAAA,IAC3D,MACA,CAACO,IAAaC,EAAc,IAAIzO,EAI5B,IAAI,GACR0O,KAAW7E,GAQP,IAAI,GACR,CAAC8E,IAAWC,CAAY,IAAI5O,EAAS,EAAK,GAE1C6O,IAAU,CAAC7T,MACfD,GAAgBC,GAAIkP,GAAQ,QAAQ,MAAMjP,EAAS,GAE/C6T,IAAc,CAACC,GAAezT,MAAqB;AACvD,YAAM0T,IAAIlF,GAAa;AACvB,MAAKkF,MACLA,EAAE;AAAA,QACA;AAAA,QACA,aAAaD,EAAQ,CAAC,KAAKA,EAAQ,CAAC,WAAWzT,CAAQ;AAAA,MAAA,GAGzD0T,EAAE,MAAM;AAAA,QACN;AAAA,QACA,OAAO9T,GAAkBiP,GAAY,SAAS7O,CAAQ,CAAC;AAAA,MAAA;AAAA,IAE3D,GAEM2T,IAAY,CAACF,GAAezT,MAAqB;AACrD,MAAA4T,GAAA,GACAhF,GAAQ,UAAU,EAAE,KAAK6E,GAAS,MAAMzT,EAAA,GACxC0O,GAAO+E,CAAO,GACd9E,GAAQ3O,CAAQ;AAAA,IAClB,GAKM6T,IAAY,MAAM;AACtB,MAAA/E,GAAc,UAAU;AACxB,YAAM,EAAE,KAAK2E,GAAS,MAAMzT,EAAA,IAAa4O,GAAQ;AACjD,MAAA4E,EAAYC,GAASzT,CAAQ;AAAA,IAC/B,GAEM8T,KAAkB,MAAM;AAC5B,MAAA/E,GAAe,UAAU;AACzB,YAAM,EAAE,KAAK0E,GAAS,MAAMzT,EAAA,IAAa4O,GAAQ;AACjD,MAAAF,GAAO+E,CAAO,GACd9E,GAAQ3O,CAAQ;AAAA,IAClB,GAEM+T,KAAqB,MAAM;AAC/B,MAAIjF,GAAc,WAAW,SAC3BA,GAAc,UAAU,sBAAsB+E,CAAS,IAErD9E,GAAe,WAAW,QAAM,aAAaA,GAAe,OAAO,GACvEA,GAAe,UAAU,WAAW+E,IAAiB,EAAE;AAAA,IACzD,GAEMF,KAAkB,MAAM;AAC5B,MAAI9E,GAAc,WAAW,SAC3B,qBAAqBA,GAAc,OAAO,GAC1CA,GAAc,UAAU,OAEtBC,GAAe,WAAW,SAC5B,aAAaA,GAAe,OAAO,GACnCA,GAAe,UAAU;AAAA,IAE7B,GAEMiF,KAAczF,GAAsB,IAAI,GACxC0F,KAAiB,MAAM;AAC3B,MAAID,GAAY,WAAW,SAC3B,qBAAqBA,GAAY,OAAO,GACxCA,GAAY,UAAU;AAAA,IACxB,GAEME,KAAgB,CAACC,GAAiBC,MAAuB;AAC7D,MAAAR,GAAA,GACAK,GAAA;AACA,YAAM5sB,IAAO;AAAA,QACX,KAAK,EAAE,GAAGunB,GAAQ,QAAQ,IAAA;AAAA,QAC1B,MAAMA,GAAQ,QAAQ;AAAA,MAAA,GAElBtnB,IAAK,EAAE,KAAK6sB,GAAW,MAAMC,EAAA;AACnC,UACE/sB,EAAK,SAASC,EAAG,QACjBD,EAAK,IAAI,MAAMC,EAAG,IAAI,KACtBD,EAAK,IAAI,MAAMC,EAAG,IAAI;AAEtB;AAEF,YAAMyF,IAAU,YAAY,IAAA,GACtBlB,IAAO,CAACwoB,MAAgB;AAC5B,cAAMlvB,KAAI,KAAK,IAAI,IAAIkvB,IAAMtnB,KAAWoT,EAAmB,GACrDvb,KAAO0b,GAAgBjZ,GAAMC,GAAInC,EAAC;AAExC,YADAwuB,EAAU/uB,GAAK,KAAKA,GAAK,IAAI,GACzBO,KAAI,GAAG;AACT,UAAA6uB,GAAY,UAAU,sBAAsBnoB,CAAI;AAChD;AAAA,QACF;AACA,QAAAmoB,GAAY,UAAU;AAAA,MACxB;AACA,MAAAA,GAAY,UAAU,sBAAsBnoB,CAAI;AAAA,IAClD,GAEMyoB,KAAmB,CAAC9pB,MAAmB;AAC3C,YAAM+T,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK;AACV,YAAMR,IAAOQ,EAAI,sBAAA,GACXQ,IAAOJ;AAAA,QACXJ;AAAA,QACAR,EAAK,OAAOA,EAAK,QAAQ;AAAA,QACzBA,EAAK,MAAMA,EAAK,SAAS;AAAA,MAAA,GAErB,EAAE,KAAKwW,GAAY,MAAMhV,EAAA,IAAgBqP,GAAQ,SACjD5O,IAAWX,GAAgBE,IAAc/U,CAAM;AACrD,MAAIwV,MAAaT,KACjB2U,GAAcnU,GAAahB,GAAMwV,GAAYhV,GAAaS,CAAQ,GAAGA,CAAQ;AAAA,IAC/E;AAEA,IAAAwU,GAAoBrG,IAAK,OAAO;AAAA,MAC9B,kBAAkB,MAAM;AACtB,cAAMsG,IAAUvwB,GAAqB0rB,CAAa;AAClD,YAAI6E,EAAQ;AACV,iBAAA5E,EAAiB4E,EAAQ,MAAM,GAC/BpD,GAAe,IAAI,GACnB1B,EAAa,IAAI,GACb8E,EAAQ,OAAO,WAAW,QAAmB,IAAI,GAC9C;AAET,YAAItF,GAAQ,SAAS;AACnB,iBAAAC,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK,GAChB;AAET,cAAM9a,IAAOoR,GAAqB;AAAA,UAChC,iBAAA4K;AAAA,UACA,kBAAAE;AAAA,QAAA,CACD;AACD,eAAAY,GAAA,GACO9c;AAAA,MACT;AAAA,MACA,QAAQ,MAAM8f,GAAiB,IAAI;AAAA,MACnC,SAAS,MAAMA,GAAiB,GAAG;AAAA,MACnC,WAAW,MAAMJ,GAAc,EAAE,GAAG,GAAG,GAAG,EAAA,GAAK,CAAC;AAAA,IAAA,EAChD;AAEF,UAAMQ,KAAe9F,GAAQ,QAAQ;AACrC,IAAA+F,GAAgB,MAAM;AAGpB,MAAA9F,GAAY,UAAU6F,IACtBlB,EAAY5E,GAAQ,QAAQ,KAAKA,GAAQ,QAAQ,IAAI;AAAA,IACvD,CAAC,GAED/J;AAAA,MACE,MAAM,MAAM;AACV,QAAAoP,GAAA,GACAL,GAAA;AAAA,MACF;AAAA,MACA,CAAA;AAAA,IAAC,GAGH/O,GAAU,MAAM;AACd,MAAAuK,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK,GACvBO,EAAiB,CAAA,CAAE,GACnBU,GAAmB,IAAI,GACvBE,GAAmB,IAAI,GACvBE,GAAoB,IAAI,GACxBE,GAAgB,IAAI,GACpBW,GAAY,IAAI,GAChBgB,GAAkB,IAAI,GACtBE,GAAmB,IAAI,GACvBhB,GAAa,IAAI,GACjBI,GAAc,IAAI,GAClB/B,EAAc,IAAI,GAClBE,GAAmB,IAAI,GACvBE,GAAkB,IAAI,GACtBE,GAAuB,IAAI,GAC3B6B,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBQ,GAAoB,IAAI,GACxBN,GAAa,IAAI,GACjBrB,GAAkB,IAAI,GACjB1sB,GAAgBlC,CAAI,MACvB0uB,GAAoB,IAAI,GACxBI,EAAoB,IAAI,IAE1BE,GAAe,IAAI,GACnBO,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG;AAAA,IAC/B,GAAG,CAACvvB,CAAI,CAAC,GAETwiB,GAAU,MAAM;AACd,MAAAmN,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBE,GAAa,IAAI,GACjBa,GAAe,IAAI,GACnBX,GAAkB,IAAI,GACtBd,GAAa,IAAI,GACjBI,GAAc,IAAI,GAClBF,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG;AAAA,IAC/B,GAAG,CAACrF,CAAe,CAAC,GAEpB1H,GAAU,MAAM;AACd,MAAAyM,GAAA,GACAE,GAAY,IAAI,GAChBoB,GAAoB,IAAI,GACxBO,GAAe,IAAI,GACnBX,GAAkB,IAAI,GACtBE,GAAmB,IAAI;AAAA,IACzB,GAAG,CAACjyB,KAAA,gBAAAA,EAAO,EAAE,CAAC;AAEd,UAAMm0B,KAAUC,GAAap0B,KAAA,gBAAAA,EAAO,eAAeisB,CAAW,GACxDoI,KACJnI,KAAiBC,OAAgBnsB,KAAA,gBAAAA,EAAO,UAAS,YAAYgsB,IAAa,OACtEsI,KAAiBnQ;AAAA,MACrB,MACEoQ,GAAoB,CAAC,GAAGnI,GAAgB,GAAGpV,CAAM,GAAG;AAAA,QAClD,kBAAkBsU;AAAA,MAAA,CACnB;AAAA,MACH,CAACc,GAAgBpV,GAAQsU,CAAe;AAAA,IAAA;AAG1C,IAAA4I,GAAgB,MAAM;AACpB,YAAMpW,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK;AACV,YAAM0W,IAAU,MAAM;AACpB,cAAMrwB,IAAOga,GAAiBL,CAAG;AACjC,QAAAyQ,GAAa,CAACpgB,MAAU,KAAK,IAAIA,IAAOhK,CAAI,IAAI,OAAOgK,IAAOhK,CAAK;AAAA,MACrE;AACA,MAAAqwB,EAAA;AACA,YAAMC,IAAK,IAAI,eAAeD,CAAO;AACrC,aAAAC,EAAG,QAAQ3W,CAAG,GACP,MAAM2W,EAAG,WAAA;AAAA,IAClB,GAAG,CAACz0B,KAAA,gBAAAA,EAAO,IAAIm0B,GAAQ,GAAGA,GAAQ,GAAGA,GAAQ,OAAOA,GAAQ,MAAM,CAAC;AAEnE,UAAMO,KAAiBvQ;AAAA,MACrB,MAAMnN,EAAO,OAAO,CAAC5Q,MAAMilB,GAAgBjlB,GAAGklB,CAAe,CAAC;AAAA,MAC9D,CAACtU,GAAQsU,CAAe;AAAA,IAAA,GAEpBqJ,KAAgBxQ;AAAA,MACpB,MAAMuQ,GAAe,OAAO,CAACtuB,MAAMA,EAAE,SAAS,MAAM;AAAA,MACpD,CAACsuB,EAAc;AAAA,IAAA,GAEXE,KAAgB,uBAAsB50B,KAAA,gBAAAA,EAAO,OAAM,MAAM,IACzD60B,KAAiB,wBAAuB70B,KAAA,gBAAAA,EAAO,OAAM,MAAM,IAE3D80B,IACJJ,GAAe,KAAK,CAACtuB,MAAMA,EAAE,OAAO0lB,CAAe,KAAK,MAEpDiJ,KAAkB5Q,GAAQ,MACzB2Q,IACD9D,MAAaA,GAAU,YAAY8D,EAAc,KAC5CpjB,GAAkBsf,GAAU,gBAAgBE,GAAY,GAAGA,GAAY,CAAC,IAE1E4D,EAAc,WAJM,MAK1B,CAACA,GAAe9D,IAAWE,EAAW,CAAC,GAEpC8D,KAAkB7Q;AAAA,MACtB,MACEuQ,GACG,OAAO,CAACtuB,MAAM0N,GAAiB1N,EAAE,IAAI,KAAK,CAACmW,GAAanW,CAAC,CAAC,EAC1D,IAAI,CAACA,OAAO;AAAA,QACX,IAAIA,EAAE;AAAA,QACN,MAAMA,EAAE;AAAA,QACR,OAAOA,EAAE;AAAA,QACT,UAAUA,EAAE;AAAA,MAAA,EACZ;AAAA,MACN,CAACsuB,EAAc;AAAA,IAAA,GAGXO,KAA0B9Q,GAAQ,MAAM;AAC5C,YAAMzV,IAAc,CAAA;AACpB,iBAAW+I,KAASid;AAClB,YAAI,CAAAnY,GAAa9E,CAAK;AACtB,qBAAWlR,KAAQmK,GAAgB+G,EAAM,QAAQ;AAC/C,YAAA/I,EAAI,KAAK,GAAGnI,EAAK,OAAO;AAG5B,aAAOmI;AAAA,IACT,GAAG,CAACgmB,EAAc,CAAC,GAEbQ,KAAsB,CAAC1V,GAAalL,MACpCyE,GAAWic,IAAiBxV,GAAOlL,CAAG,IAAU,KAC7C0gB,GAAgB;AAAA,MACrB,CAACvd,MAAUzE,GAAcyE,EAAM,UAAU+H,GAAOlL,CAAG,KAAK;AAAA,IAAA,GAItD6gB,KAAmB,CAAC3V,MAA6B;AACrD,YAAM4V,IAAMjG,EAAc,UAAU,IAAI,CAACA,EAAc,CAAC,CAAC,IAAI,CAAA;AAC7D,aAAO9V;AAAA,QACLmG;AAAA,QACA,CAAC,GAAG4V,GAAK,GAAGH,EAAuB;AAAA,QACnCnC,EAAQxI,EAAW;AAAA,MAAA;AAAA,IAEvB,GAEM+K,KAAuB,CAAC9c,MAA4B;AACxD,UAAI,CAACA,EAAM,OAAQ;AACnB,MAAAgV,MAAA,QAAAA,GAAoBhV;AACpB,YAAM+c,IAAU,IAAI;AAAA,QAClB/c,EAAM,OAAO,CAAC/P,MAAMA,EAAE,WAAW,QAAQ,EAAE,IAAI,CAACA,MAAMA,EAAE,OAAO;AAAA,MAAA;AAEjE,UAAIsjB,KAAmB,QAAQwJ,EAAQ,IAAIxJ,CAAe,GAAG;AAC3D,cAAMyJ,IAAWhd,EAAM,KAAK,CAAC/P,MAAMA,EAAE,WAAW,QAAQ;AACxD,QAAAgkB,GAAc+I,KAAYA,EAAS,WAAW,WAAWA,EAAS,UAAU,IAAI;AAAA,MAClF;AAAA,IACF,GAEMC,KAAiB,CAAChW,MAAyB;AAC/C,UAAI,CAAC1b,GAAgBlC,CAAI,KAAK0qB,EAAU,QAAO;AAC/C,YAAMmJ,IACJhF,MACA1X,GAAWic,IAAiBxV,GAAOsT,EAAQxI,EAAW,GAAG+F,EAAgB;AAC3E,aAAKoF,IACApF,KAMDrc,GAAYqc,IAAkBoF,CAAM,KACtCnF,GAAoB,IAAI,GACxBI,EAAoB,IAAI,GACjB,OAET2E,GAAqBvc,GAAmBkc,IAAiB3E,IAAkBoF,CAAM,CAAC,GAClFnF,GAAoB,IAAI,GACxBE,GAAkB,IAAI,GACtBE,EAAoB,IAAI,GACjB,OAdLJ,GAAoBmF,CAAM,GAC1BjJ,GAAciJ,EAAO,OAAO,GACxBlyB,GAAgB3B,CAAI,MAAG2C,MAAA,QAAAA,GAAe,YACnC,MALW;AAAA,IAiBtB,GAEMmxB,KAAoB,CAAClW,MAAyB;AAClD,UAAIgW,GAAehW,CAAK,EAAG,QAAO;AAClC,UAAI,CAACjc,GAAgB3B,CAAI,KAAK0qB,EAAU,QAAO;AAC/C,YAAMqJ,IAAS7C,EAAQxI,EAAW,GAC5BsL,IAAU9C,EAAQlJ,EAAa,GAC/BiM,IAAU1c,GAAiB6b,IAAiBxV,GAAOoW,CAAO;AAChE,aAAIC,KAAW,CAACX,GAAoB1V,GAAOmW,CAAM,KAC/CN;AAAA,QACE1c,GAAkBqc,IAAiBa,GAAS/C,EAAQzI,EAAiB,CAAC;AAAA,MAAA,GAExEiG,GAAoB,IAAI,GACxBE,GAAkB,IAAI,GACtBE,EAAoB,IAAI,GACxBlE,GAAcqJ,EAAQ,OAAO,GACtB,MAELxF,MACFC,GAAoB,IAAI,GACxBI,EAAoB,IAAI,GACjB,MAEF;AAAA,IACT,GAEMoF,KAAU,CAAC5Y,GAAiBC,MAA0B;AAC1D,YAAMW,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK,QAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AAC5B,YAAM,EAAE,KAAKgW,GAAY,MAAMhV,EAAA,IAAgBqP,GAAQ;AACvD,aAAO9P;AAAA,QACLH,GAAgBJ,GAAKZ,GAASC,CAAO;AAAA,QACrC2W;AAAA,QACAhV;AAAA,MAAA;AAAA,IAEJ,GAEMiX,KAAkB,CAACvtB,GAAuBuL,MAAoB;;AAClE,YAAMuJ,KAAOpd,IAAA8tB,GAAU,YAAV,gBAAA9tB,EAAmB;AAChC,MAAKod,KACLoV,GAAe;AAAA,QACb,GAAGlqB,EAAE,UAAU8U,EAAK;AAAA,QACpB,GAAG9U,EAAE,UAAU8U,EAAK;AAAA,QACpB,MAAMyH,GAAmBhR,CAAI;AAAA,MAAA,CAC9B;AAAA,IACH,GAEMiiB,KAAqB,CACzBve,GACA5F,GACApL,GACA2I,MACG;AACH,YAAMjL,IAAOsO,GAAagF,EAAM,UAAU5F,GAAWpL,GAAW2I,CAAK;AACrE,MAAAke,GAAsB7V,EAAM,IAAItT,CAAI,GACpCotB,GAAkB;AAAA,QAChB,cAAc1f;AAAA,QACd,aAAapL,IAAY;AAAA,MAAA,CAC1B,GACDgrB,GAAkB,IAAI,GACtBE,GAAe,IAAI;AAAA,IACrB,GAEMsE,KAAiB,CACrBpkB,GACApL,GACAyvB,GACA1tB,MACG;;AACH,MAAKssB,MACLtsB,EAAE,gBAAA,IACFsH,KAAA5P,IAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,EAAA,KAAA5P,GAAoCsI,EAAE,YACtCqpB,GAAa;AAAA,QACX,SAASiD,EAAc;AAAA,QACvB,WAAAjjB;AAAA,QACA,WAAApL;AAAA,QACA,OAAOqvB,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAAA,QACnC,SAASA,EAAE;AAAA,QACX,SAASA,EAAE;AAAA,QACX,UAAA0tB;AAAA,QACA,gBAAgBnB,MAAmBD,EAAc;AAAA,QACjD,UAAU;AAAA,MAAA,CACX;AAAA,IACH,GAEMqB,KAAoB,CAACtkB,GAAmBK,MAAwB;AACpE,UAAI,CAAC4iB,EAAe;AACpB,YAAM3wB,IAAO0O,GAAaiiB,EAAc,UAAUjjB,GAAWK,CAAW;AACxE,MAAI/N,MAAS2wB,EAAc,aAC3BxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CotB,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBJ,GAAc,IAAI;AAAA,IACpB,GAEM+E,KAA2B,CAC/B5W,GACAhX,MACY;;AACZ,UAAI,CAACssB,KAAiB,CAACC,GAAiB,QAAO;AAC/C,YAAMsB,IAAYrjB;AAAA,QAChB+hB;AAAA,QACAvV;AAAA,QACAsT,EAAQlJ,EAAa;AAAA,MAAA;AAGvB,aADI,CAACyM,KACDtd,GAAWic,IAAiBqB,EAAU,OAAOvD,EAAQ,CAAC,CAAC,IAAU,KACjEtqB,EAAE,UAAU,KACd2tB,GAAkBE,EAAU,cAAcA,EAAU,WAAW,GACxD,OAET9E,GAAkB;AAAA,QAChB,cAAc8E,EAAU;AAAA,QACxB,aAAaA,EAAU;AAAA,MAAA,CACxB,GACD5E,GAAkB,IAAI,GACtBJ,GAAc;AAAA,QACZ,MAAM;AAAA,QACN,SAASyD,EAAc;AAAA,QACvB,cAAcuB,EAAU;AAAA,QACxB,aAAaA,EAAU;AAAA,MAAA,CACxB,IACDvmB,KAAA5P,IAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,EAAA,KAAA5P,GAAoCsI,EAAE,YAC/B;AAAA,IACT,GAEM8tB,KAAoB,CAACzkB,GAAmBpL,MAAsB;AAClE,UAAI,CAACquB,EAAe;AACpB,YAAM3wB,IAAOoO,GAAiBuiB,EAAc,UAAUjjB,GAAWpL,CAAS;AAC1E,MAAItC,MAAS2wB,EAAc,aAC3BxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CstB,GAAkB,IAAI,GACtBJ,GAAc,IAAI;AAAA,IACpB,GAEMkF,KAAc,CAClB1kB,GACApL,GACAyW,GACAC,MACG;AACH,UAAI,CAAC2X,EAAe;AACpB,YAAMtV,IAAQsW,GAAQ5Y,GAASC,CAAO,GAChC5W,IAAOmK,GAAgBqkB,MAAmBD,EAAc,QAAQ,EACpEjjB,CACF;AACA,MAAA8f,GAAe;AAAA,QACb,WAAA9f;AAAA,QACA,WAAApL;AAAA,QACA,OAAOF,IAAOqK,GAAgBrK,GAAME,GAAW+Y,CAAK,IAAIA;AAAA,MAAA,CACzD;AAAA,IACH,GAEMoH,KAAazC;AAAA,MACjB,MAAM,IAAI,IAAI9c,EAAQ,IAAI,CAACzB,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC;AAAA,MAC3C,CAACyB,CAAO;AAAA,IAAA,GAEJmvB,KAAqBrS,GAAQ,MAAM;AACvC,YAAM6B,wBAAU,IAAA;AAChB,aAAA1e,EAAM,QAAQ,CAACR,MAAS;AACtB,QAAAkf,EAAI,IAAIlf,EAAK,YAAY,GACzBkf,EAAI,IAAIlf,EAAK,UAAU;AAAA,MACzB,CAAC,GACMkf;AAAA,IACT,GAAG,CAAC1e,CAAK,CAAC,GACJmvB,KAAwBtS,GAAQ,MAAM;AAC1C,YAAMuS,wBAAa,IAAA;AACnB,aAAApvB,EAAM,QAAQ,CAACR,MAAS;AACtB,QAAA4vB,EAAO;AAAA,UACL5vB,EAAK;AAAA,WACJ4vB,EAAO,IAAI5vB,EAAK,YAAY,KAAK,KAAK;AAAA,QAAA,GAEzC4vB,EAAO;AAAA,UACL5vB,EAAK;AAAA,WACJ4vB,EAAO,IAAI5vB,EAAK,UAAU,KAAK,KAAK;AAAA,QAAA;AAAA,MAEzC,CAAC,GACM4vB;AAAA,IACT,GAAG,CAACpvB,CAAK,CAAC,GACJqvB,KAAsBxS;AAAA,MAC1B,MACEkL,KAAc,OACV,oBAAI,QACJtJ,GAAwBsJ,GAAY/nB,CAAK;AAAA,MAC/C,CAAC+nB,GAAY/nB,CAAK;AAAA,IAAA,GAOdsvB,KAJJh1B,MAAS,YACTytB,KAAc,UACdnvB,KAAA0mB,GAAW,IAAIyI,CAAU,MAAzB,gBAAAnvB,GAA4B,YAAW,SACtCu2B,GAAsB,IAAIpH,CAAU,KAAK,MAAM,KAErBE,KACvBpI;AAAA,MACEoI;AAAA,MACAloB;AAAA,MACAC;AAAA,MACAqvB;AAAA,MACA7D,EAAQ7N,EAAwB;AAAA,MAChC2B;AAAA,IAAA,IAEF,MACAiQ,KAAoB1S,GAAQ,MAAM;AACtC,UAAIkL,KAAc,QAAQ,CAACE,GAAiB,QAAO3I;AACnD,YAAMkQ,IAAUlQ,GAAW,IAAIyI,CAAU;AACzC,UAAI,CAACyH,EAAS,QAAOlQ;AACrB,YAAMziB,IAAO,IAAI,IAAIyiB,EAAU;AAC/B,aAAAziB,EAAK,IAAIkrB,GAAY;AAAA,QACnB,GAAGyH;AAAA,QACH,IAAIF,MAAA,gBAAAA,GAAe,UAASrH;AAAA,MAAA,CAC7B,GACMprB;AAAA,IACT,GAAG,CAACyiB,IAAYyI,GAAYE,IAAiBqH,EAAa,CAAC,GACrDG,KAAgB5S;AAAA,MACpB,MACE7c,EACG,IAAI,CAACR,MAAS;AACb,cAAMF,IAAOiwB,GAAkB,IAAI/vB,EAAK,YAAY,GAC9CD,IAAKgwB,GAAkB,IAAI/vB,EAAK,UAAU;AAChD,eAAI,CAACF,KAAQ,CAACC,IAAW,KAClBmwB;AAAA,UACLpwB;AAAA,UACAC;AAAA,UACAowB,GAAkBnwB,GAAM8f,IAAYiQ,EAAiB;AAAA,QAAA;AAAA,MAEzD,CAAC,EACA,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACb,CAACjQ,IAAYiQ,IAAmBvvB,CAAK;AAAA,IAAA,GAEjCmb,KAAsB0B;AAAA,MAC1B,MAAM,IAAI,IAAIyH,EAAY,IAAI,CAAClJ,MAAQ,CAACA,EAAI,SAASA,CAAG,CAAC,CAAC;AAAA,MAC1D,CAACkJ,CAAW;AAAA,IAAA,GAERsL,KAAmB/S;AAAA,MACvB,MACEyJ,KACItL,GAA2B;AAAA,QACzB,QAAQoS;AAAA,QACR,gBAAAtI;AAAA,QACA,aAAAR;AAAA,QACA,WAAAC;AAAA,QACA,WAAArK;AAAA,QACA,OAAAxB;AAAA,MAAA,CACD,IACD,CAAA;AAAA,MACN;AAAA,QACEwB;AAAA,QACAoK;AAAA,QACA8I;AAAA,QACA7I;AAAA,QACA7L;AAAA,QACAoM;AAAA,QACAwB;AAAA,MAAA;AAAA,IACF,GAGIuJ,KAAyB,CAACja,GAAiBC,MAAoB;AACnE,YAAMqC,IAAQsW,GAAQ5Y,GAASC,CAAO;AACtC,OACE4S,MACAE,MACCtuB,GAAiBC,CAAI,KAAKiuB,MAAmB,SAE9CO,GAAgB5Q,CAAK,GAEvB2S;AAAA,QACEhL;AAAA,UACE3H;AAAA,UACAnY;AAAA,UACAC;AAAA,UACA0f,GAAmB3f,GAAS4oB,EAAgB;AAAA,UAC5C6C,EAAQ7N,EAAwB;AAAA,UAChC2B;AAAA,UACA5iB,GAAkBpC,CAAI,IAAI,SAAS;AAAA,QAAA;AAAA,MACrC;AAAA,IAEJ,GAEMw1B,KAAe,MAAM;AACzB,UAAIjI,EAAc,SAAS,GAAG;AAC5B,QAAAC,EAAiB,CAAA,CAAE,GACnBgB,GAAgB,IAAI,GACpBQ,GAAe,IAAI;AACnB;AAAA,MACF;AACA,MAAAvD,GAAc,QAAQjc,GAAmB,CAAC+d,CAAa,CAAC,CAAC,GACzDC,EAAiB,CAAA,CAAE,GACnBgB,GAAgB,IAAI,GACpBQ,GAAe,IAAI;AAAA,IACrB;AAEA,IAAAxM,GAAU,MAAM;AACd,YAAMiT,IAAQ,CAAC7uB,MAAqB;AAClC,YAAIA,EAAE,QAAQ,SAAS;AACrB,gBAAM8uB,IAAO9uB,EAAE,SAAS;AACxB,UAAI7E,GAAkB/B,CAAI,KAAGitB,EAAkByI,CAAI,GAC9CA,KAAMpI,EAAa,IAAI;AAC5B;AAAA,QACF;AAIA,YAHI,CAAClV,GAAcxR,CAAC,KAChBrH,GAAuBqH,EAAE,MAAM,MACnCA,EAAE,eAAA,GACEA,EAAE,SAAS,aAAaA,EAAE,QAAQ;AACtC,cAAM8uB,IAAO9uB,EAAE,SAAS;AACxB,QAAAwmB,GAAa,UAAUsI,GACvBvI,GAAauI,CAAI;AAAA,MACnB,GACMC,IAAS,MAAM;AACnB,QAAAvI,GAAa,UAAU,IACvBD,GAAa,EAAK;AAAA,MACpB;AACA,oBAAO,iBAAiB,WAAWsI,CAAK,GACxC,OAAO,iBAAiB,SAASA,CAAK,GACtC,OAAO,iBAAiB,QAAQE,CAAM,GAC/B,MAAM;AACX,eAAO,oBAAoB,WAAWF,CAAK,GAC3C,OAAO,oBAAoB,SAASA,CAAK,GACzC,OAAO,oBAAoB,QAAQE,CAAM;AAAA,MAC3C;AAAA,IACF,GAAG,CAAC31B,CAAI,CAAC,GAETwiB,GAAU,MAAM;AACd,YAAMiT,IAAQ,CAAC7uB,MAAqB;AAYlC,YAXIhF,GAAkB5B,CAAI,MACpB4G,EAAE,QAAQ,WACZA,EAAE,eAAA,GACF4uB,GAAA,KACS5uB,EAAE,QAAQ,aACnB4mB,EAAiB,CAAA,CAAE,GACnBgB,GAAgB,IAAI,GACpBQ,GAAe,IAAI,GACnB1B,EAAa,IAAI,KAInB1mB,EAAE,QAAQ,YACV,CAACrH,GAAuBqH,EAAE,MAAM,KAChC6nB,MAAoB,MACpB;AACA,UAAA7nB,EAAE,eAAA,GACF8nB,GAAoB,IAAI,GACxBE,GAAkB,IAAI,GACtBE,EAAoB,IAAI;AACxB;AAAA,QACF;AAYA,YAVEloB,EAAE,QAAQ,YACV,CAACrH,GAAuBqH,EAAE,MAAM,MAC/B7G,GAAiBC,CAAI,KACpBquB,MAAoB,QACpBF,MAAmB,QACnBF,MAAmB,UAErBrnB,EAAE,eAAA,GACFhD,MAAA,QAAAA,QAGCgD,EAAE,QAAQ,eAAeA,EAAE,QAAQ,aACpCssB,KACAzxB,GAAqBzB,GAAM0B,CAAS,KACpCS,GAAkBnC,CAAI,KACtB0vB,IACA;AACA,UAAA9oB,EAAE,eAAA;AACF,gBAAMrE,IAAO0O;AAAA,YACXiiB,EAAc;AAAA,YACdxD,GAAe;AAAA,YACfA,GAAe;AAAA,UAAA;AAEjB,UAAIntB,MAAS2wB,EAAc,aACzBxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CotB,GAAkB,IAAI;AAAA,QAE1B;AACA,aACG/oB,EAAE,QAAQ,eAAeA,EAAE,QAAQ,aACpCssB,KACAzxB,GAAqBzB,GAAM0B,CAAS,KACpCU,GAAkBpC,CAAI,KACtB4vB,IACA;AACA,UAAAhpB,EAAE,eAAA;AACF,gBAAMrE,IAAOoO;AAAA,YACXuiB,EAAc;AAAA,YACdtD,GAAe;AAAA,YACfA,GAAe;AAAA,UAAA;AAEjB,UAAIrtB,MAAS2wB,EAAc,aACzBxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CstB,GAAkB,IAAI;AAAA,QAE1B;AAAA,MACF;AACA,oBAAO,iBAAiB,WAAW4F,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,IAE1D,GAAG;AAAA,MACDz1B;AAAA,MACAutB;AAAA,MACA2F;AAAA,MACAxD;AAAA,MACAE;AAAA,MACAvB;AAAA,MACAF;AAAA,MACAF;AAAA,MACAQ;AAAA,MACA7qB;AAAA,IAAA,CACD,GAED4e,GAAU,MAAM;AACd,YAAMoT,IAAOxJ,GAAU;AACvB,UAAI,CAACwJ,EAAM;AACX,YAAMC,IAAU,CAACjvB,MAAkB;AAEjC,YADAA,EAAE,eAAA,GACEA,EAAE,WAAW,EAAG;AACpB,cAAMsV,IAAM+P,EAAO;AACnB,YAAI,CAAC/P,EAAK;AACV,QAAA0V,GAAA;AACA,cAAMlV,IAAOJ,GAAgBJ,GAAKtV,EAAE,SAASA,EAAE,OAAO,GAChD,EAAE,KAAKsrB,GAAY,MAAMhV,EAAA,IAAgBqP,GAAQ,SACjD5O,KAAWV,GAAwBC,GAAatW,CAAC;AACvD,QAAI+W,OAAaT,MACjBqP,GAAQ,UAAU;AAAA,UAChB,KAAK7O,GAAahB,GAAMwV,GAAYhV,GAAaS,EAAQ;AAAA,UACzD,MAAMA;AAAA,QAAA,GAER+T,GAAA;AAAA,MACF;AACA,aAAAkE,EAAK,iBAAiB,SAASC,GAAS,EAAE,SAAS,IAAO,SAAS,IAAM,GAClE,MAAM;AACX,QAAAtE,GAAA,GACAqE,EAAK,oBAAoB,SAASC,GAAS,EAAE,SAAS,IAAM;AAAA,MAC9D;AAAA,IACF,GAAG,CAAC,EAAQz3B,CAAM,CAAC;AAEnB,UAAM03B,KAAa,MAAM;AACvB,MAAAvE,GAAA,GACAK,GAAA;AACA,YAAM1V,IAAM+P,EAAO,SACbnf,IAAM,CAAC,GAAG8f,GAAY,QAAQ,QAAQ;AAC5C,UAAI,CAAC1Q,KAAOpP,EAAI,SAAS,EAAG;AAC5B,YAAM7G,IAAM,EAAE,IAAI6G,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,GAAG,IAAIA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,EAAA,GACjE4P,IAAOJ,GAAgBJ,GAAKjW,EAAI,GAAGA,EAAI,CAAC,GACxC,EAAE,KAAKisB,GAAY,MAAMhV,EAAA,IAAgBqP,GAAQ;AACvD,MAAAM,GAAS,UAAU;AAAA,QACjB,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM/f,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,GAAGA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,CAAC,CAAC;AAAA,QAC3E,WAAWoQ;AAAA,QACX,OAAOT,GAAYC,GAAMwV,GAAYhV,CAAW;AAAA,MAAA,GAElD6T,GAAS,UAAU,MACnBE,EAAa,EAAK,GAClBlE,GAAW,CAAA,CAAE,GACbsC,GAAa,IAAI,GACjBI,GAAc,IAAI,GAClB/B,EAAc,IAAI,GAClBE,GAAmB,IAAI;AAAA,IACzB,GAEMmI,KAA6B,CAACnvB,MAA0B;AAE5D,UADAgmB,GAAY,QAAQ,IAAIhmB,EAAE,WAAW,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,QAAA,CAAS,GAC/DgmB,GAAY,QAAQ,QAAQ,GAAG;AACjC,QAAAhmB,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFkvB,GAAA;AACA;AAAA,MACF;AAGA,MAAI,CAAC1I,GAAa,WAAWxmB,EAAE,WAAW,MAC1CA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFovB,GAASpvB,GAAG,EAAK;AAAA,IACnB,GAEMqvB,KAA6B,CAACrvB,MAA0B;AAI5D,UAHIgmB,GAAY,QAAQ,IAAIhmB,EAAE,SAAS,KACrCgmB,GAAY,QAAQ,IAAIhmB,EAAE,WAAW,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,QAAA,CAAS,GAEjE,CAACimB,GAAS,WAAWD,GAAY,QAAQ,OAAO,EAAG;AACvD,YAAM1Q,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK;AACV,MAAAtV,EAAE,gBAAA;AACF,YAAMkG,IAAM,CAAC,GAAG8f,GAAY,QAAQ,QAAQ,GACtC/a,IAAO,KAAK,MAAM/E,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,GAAGA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,CAAC,GAC1D7G,IAAM,EAAE,IAAI6G,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,GAAG,IAAIA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,EAAA,GACjE4P,IAAOJ,GAAgBJ,GAAKjW,EAAI,GAAGA,EAAI,CAAC,GACxC0X,IAAWX;AAAA,QACf6P,GAAS,QAAQ,aAAahb,IAAOgb,GAAS,QAAQ;AAAA,MAAA;AAExD,MAAAyE,EAAUzT,GAAsBnB,GAAMmQ,GAAS,QAAQ,OAAOlP,CAAQ,GAAGA,CAAQ;AAAA,IACnF,GAEMuY,KAA2B,CAACtvB,MAA0B;AAC1D,YAAMuvB,IAActJ,GAAS,WAAW;AACxC,MAAAD,GAAY,QAAQ,OAAOhmB,EAAE,SAAS,GAClCgmB,GAAY,QAAQ,OAAO,SAAY,UAAU,OACjDuJ,OAAe,gBAAA;AAAA,IACrB,GAEMH,KAAW,CAACpvB,GAAuBwvB,MAA6B;;AACpE,MAAAxE,GAAA;AACA,YAAM1V,IAAM+P,EAAO,SACbvP,IAAOR,IACTI,GAAgBJ,GAAKtV,EAAE,SAASA,EAAE,OAAO,IACzC,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,QAAA;AACzB,MAAAmqB,GAAS,UAAU;AAAA,QACjB,GAAGrU,EAAK;AAAA,QACR,GAAGA,EAAK;AAAA,QACR,MAAM6P,GAAQ,QAAQ,IAAI;AAAA,QAC1B,MAAMA,GAAQ,QAAQ,IAAI;AAAA,QAC1B,SAAS3lB,EAAE;AAAA,QACX,SAASA,EAAE;AAAA,QACX,iBAAAwvB;AAAA,MAAA,GAEFnF,EAAa,EAAI;AACjB,YAAMoF,IAAcpK,EAAO,WAAWrlB,EAAE;AACxC,OAAAtI,IAAA+3B,EAAY,sBAAZ,QAAA/3B,EAAA,KAAA+3B,GAAgCzvB,EAAE;AAAA,IACpC,GAEM0vB,KAA0B,CAACtP,GAAgBxZ,MAAgB;AAC/D,YAAM+oB,IAAUtL,GAAsBjE,GAAQxZ,CAAK;AACnD,MAAIzN,GAAiBC,CAAI,KAAK,OAAOu2B,KAAY,aAC3CpI,MACFrD,GAAmBqD,IAAiBoI,CAAO,GAC3CnI,GAAmB,IAAI,GACvBF,GAAmB9tB,GAAqBJ,GAAMu2B,CAAO,CAAC,KAC7CtI,MAAmB,QAAQA,OAAoBsI,KACxDvL,MAAA,QAAAA,GAAqBiD,IAAiBsI,IACtCrI,GAAmB9tB,GAAqBJ,GAAMu2B,CAAO,CAAC,KAEtDrI,GAAmBqI,CAAO,IAG9B5F,GAAc,OAAO4F,KAAY,WAAW,CAACA,CAAO,IAAI,CAAA,CAAE;AAAA,IAC5D,GAEMC,KAAuB,CAACxP,MAAmB;AAC/C,UAAI0D,KAAY,CAACsB,GAAc;AAC/B,YAAM9mB,IAAOQ,EAAM,KAAK,CAACwO,MAASA,EAAK,OAAO8S,CAAM;AAEpD,UADAmE,GAAkBnE,CAAM,GACpB9hB,GAAM;AACR,cAAMqE,IAAY7D,EAAM,OAAO,CAACwO,MAASA,EAAK,OAAO8S,CAAM,GACrDyP,IAAU,CAACvxB,EAAK,cAAcA,EAAK,UAAU,EAAE;AAAA,UACnD,CAAC4R,MAAO,CAACmN,GAAcnN,GAAIvN,CAAS;AAAA,QAAA;AAEtC,QAAA2kB;AAAA,UAAmB,CAAC3hB,MAClBA,KAAQ,QAAQkqB,EAAQ,SAASlqB,CAAI,IAAI,OAAOA;AAAA,QAAA;AAAA,MAEpD;AACA,MAAAgkB,GAAoB,IAAI;AAAA,IAC1B,GAEMmG,KAAyB,CAACxS,MAAqB;AACnD,UAAIwG,KAAY,CAACsB,GAAc;AAC/B,YAAM2K,IAAU,IAAI,IAAIpP,GAA8BrD,GAAUxe,CAAK,CAAC;AACtE,MAAAwlB,GAAoBhH,CAAQ,GAC5BgK;AAAA,QAAmB,CAAC3hB,MAClBA,KAAQ,QAAQoqB,EAAQ,IAAIpqB,CAAI,IAAI,OAAOA;AAAA,MAAA,GAE7CmhB,EAAc,IAAI,GAClBE,GAAmB,IAAI,GACvBU,GAAoB,IAAI,GACxBF,GAAmB,IAAI,GACvBI,GAAgB,IAAI,GACpB6B,GAAmB,CAACvZ,MAAQA,KAAM,QAAQ6f,EAAQ,IAAI7f,CAAE,IAAI,OAAOA,CAAG;AAAA,IACxE,GAEMsS,KAAgB,CAACxiB,MAA0B;;AAC/C,UAAIimB,GAAS,QAAS;AACtB,UAAIO,GAAa,SAAS;AACxB,QAAA4I,GAASpvB,GAAG,EAAK;AACjB;AAAA,MACF;AACA,UAAI8jB,KAAY1qB,MAAS,SAAS4G,EAAE,WAAW,GAAG;AAChD,QAAAovB,GAASpvB,GAAG,EAAK;AACjB;AAAA,MACF;AACA,YAAMgX,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAIlF,KAAa,CAACzB,GAAuBD,CAAI,GAAG;AAC9C,QAAA2C,MAAA,QAAAA,GAAe;AACf;AAAA,MACF;AAEA,UAAIhB,GAAgB3B,CAAI,GAAG;AAEzB,YADIw0B,GAAyB5W,GAAOhX,CAAC,KACjCktB,GAAkBlW,CAAK,EAAG;AAC9B,QAAAoY,GAASpvB,GAAG,EAAI;AAChB;AAAA,MACF;AAEA,UAAIhF,GAAkB5B,CAAI,GAAG;AAC3B,cAAM42B,IAAUrD,GAAiB3V,CAAK,KAAKmR,IACrC8H,IACJjwB,EAAE,YAAY,CAACgwB,KAAWrJ,EAAc,SAAS,IAC7C3V,GAAoB2V,EAAcA,EAAc,SAAS,CAAC,GAAG3P,CAAK,IAClE,MACAkZ,KAASF,MAAWC,KAAA,gBAAAA,EAAa,UAASjZ;AAEhD,YADA0P,EAAauJ,CAAW,GACpBtJ,EAAc,UAAU,GAAG;AAC7B,gBAAM5a,KAAQ4a,EAAc,CAAC;AAC7B,cAAI,KAAK,MAAMuJ,GAAO,IAAInkB,GAAM,GAAGmkB,GAAO,IAAInkB,GAAM,CAAC,KAAKue,EAAQxI,EAAW,GAAG;AAC9E,YAAA8M,GAAA;AACA;AAAA,UACF;AAAA,QACF;AACA,QAAAhI,EAAiB,CAACjhB,OAAS,CAAC,GAAGA,IAAMuqB,EAAM,CAAC,GAC5CtI,GAAgBsI,EAAM,GACtB9H,GAAe,IAAI;AACnB;AAAA,MACF;AAEA,UAAIhD,IAAc;AAChB,YAAI5pB,GAAkBpC,CAAI,GAAG;AAC3B,gBAAM+2B,KAAYxR;AAAA,YAChB3H;AAAA,YACAnY;AAAA,YACAC;AAAA,gCACI,IAAA;AAAA,YACJwrB,EAAQ7N,EAAwB;AAAA,YAChC2B;AAAA,YACA;AAAA,UAAA,GAEIgS,MACJD,MAAA,gBAAAA,GAAW,UAAS,SAChBrxB,EAAM,KAAK,CAACR,OAASA,GAAK,OAAO6xB,GAAU,MAAM,IACjD;AACN,cAAIC,MAAazS,GAAoByS,EAAS,GAAG;AAC/C,YAAAtG,GAAc,CAAA,CAAE,GAChBD,GAAuBuG,GAAU,EAAE;AACnC;AAAA,UACF;AACA,UAAAhB,GAASpvB,GAAG,EAAI;AAChB;AAAA,QACF;AACA,cAAMqwB,IAAe7R,GAAmB3f,GAAS4oB,EAAgB,GAC3DhI,IAAOd;AAAA,UACX3H;AAAA,UACAnY;AAAA,UACAC;AAAA,UACAuxB;AAAA,UACA/F,EAAQ7N,EAAwB;AAAA,UAChC2B;AAAA,QAAA;AAEF,YAAIqJ,IAAkB;AACpB,YAAIhI,KAAA,gBAAAA,EAAM,UAAS,WAAUA,KAAA,gBAAAA,EAAM,UAAS,eAC1C+E;AAAA,YACEiD,GAAiB;AAAA,YACjBA,GAAiB;AAAA,YACjBhI,EAAK;AAAA,YACL6K,EAAQ7N,EAAwB;AAAA,UAAA,GAGpCiL,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AACpB;AAAA,QACF;AACA,YAAItuB,GAAwBF,CAAI,KAAK4G,EAAE,UAAU,EAAG;AACpD,aAAIyf,KAAA,gBAAAA,EAAM,UAAS,QAAQ;AACzB,cAAI,CAACtmB,GAAiBC,CAAI,GAAG;AAC3B,YAAA0wB,GAAc,CAAA,CAAE,GAChBD,GAAuBpK,EAAK,MAAM;AAClC;AAAA,UACF;AACA,UAAAiQ,GAAwBjQ,EAAK,QAAQA,EAAK,KAAK;AAC/C;AAAA,QACF;AACA,aAAIA,KAAA,gBAAAA,EAAM,UAAS,YAAY;AAC7B,UAAItmB,GAAiBC,CAAI,MACnBmuB,MACFrD,GAAmBqD,IAAiB9H,EAAK,QAAQ,GACjD+H,GAAmB,IAAI,GACvBF,GAAmB9tB,GAAqBJ,GAAMqmB,EAAK,QAAQ,CAAC,KACnD4H,MAAmB,QAAQA,OAAoB5H,EAAK,YAC7D2E,MAAA,QAAAA,GAAqBiD,IAAiB5H,EAAK,WAC3C6H,GAAmB9tB,GAAqBJ,GAAMqmB,EAAK,QAAQ,CAAC,KAE5D6H,GAAmB7H,EAAK,QAAQ,IAGpCsK,GAAc,CAACtK,EAAK,QAAQ,CAAC;AAC7B;AAAA,QACF;AACA,YAAItmB,GAAiBC,CAAI,GAAG;AAC1B,cAAIiuB,MAAmB,MAAM;AAC3B,kBAAMsI,KAAUzL,GAAmBlN,GAAOqQ,EAAe;AACzD,YAAAC;AAAA,cACE9tB;AAAA,gBACEJ;AAAA,gBACA,OAAOu2B,MAAY,WAAWA,KAAU;AAAA,cAAA;AAAA,YAC1C,GAEF/H,GAAgB5Q,CAAK;AACrB;AAAA,UACF;AACA,gBAAMrb,KAAOkhB,GAA0B0K,IAAiBvQ,CAAK;AAG7D,cAFAwQ,GAAmB7rB,GAAK,SAAS,GACjCisB,GAAgB5Q,CAAK,GACjBrb,GAAK,SAASA,GAAK,KAAK;AAC1B,kBAAMg0B,KAAUxL,EAAqBxoB,GAAK,OAAOA,GAAK,GAAG;AACzD,YAAA2rB;AAAA,cACE9tB;AAAA,gBACEJ;AAAA,gBACA,OAAOu2B,MAAY,WAAWA,KAAU;AAAA,cAAA;AAAA,YAC1C;AAAA,UAEJ;AACA;AAAA,QACF;AACA,QAAAP,GAASpvB,GAAG,EAAI;AAChB;AAAA,MACF;AACA,UAAI5G,MAAS,aAAa;AACxB,cAAM4Z,IAAOP,GAAwB;AACrC,QAAAoS;AAAA,UACE;AAAA,UACAnR,GAAkBsD,GAAO/E,IAAoBe,CAAI;AAAA,UACjD,EAAE,OAAOW,GAAiB1B,IAAoBe,GAAMwE,EAAM,gBAAgB,EAAA;AAAA,QAAE;AAE9E;AAAA,MACF;AACA,UAAIpe,MAAS,iBAAiB;AAC5B,QAAAyrB;AAAA,UACE;AAAA,UACAvQ,GAAqB0C,GAAOsZ,EAAqB;AAAA,UACjD,EAAE,OAAOrc,GAAqBqc,IAAuB9Y,EAAM,gBAAgB,EAAA;AAAA,QAAE;AAE/E;AAAA,MACF;AACA,UAAIpe,MAAS,eAAe+B,GAAkB/B,CAAI,GAAG;AACnD,SAAAkO,KAAA5P,IAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,EAAA,KAAA5P,GAAoCsI,EAAE,YACtCqmB,EAAkBrmB,EAAE,QAAQ,GAC5BmmB,GAAW,CAACnP,GAAOA,CAAK,CAAC;AACzB;AAAA,MACF;AAEA,UAAIxb,GAAkBpC,CAAI,KAAKkzB,KAAiBC,IAAiB;AAC/D,cAAMgE,IAAY3lB,GAAc2hB,IAAiBvV,GAAOsT,EAAQ9I,EAAa,CAAC;AAC9E,YAAI+O,GAAW;AACb,cAAIvwB,EAAE,UAAU,GAAG;AACjB,YAAA8tB,GAAkByC,EAAU,WAAWA,EAAU,SAAS;AAC1D;AAAA,UACF;AACA,UAAAtH,GAAkB;AAAA,YAChB,WAAWsH,EAAU;AAAA,YACrB,WAAWA,EAAU;AAAA,YACrB,QAAQA,EAAU;AAAA,UAAA,CACnB,GACDxH,GAAkB,IAAI,GACtBF,GAAc;AAAA,YACZ,MAAM;AAAA,YACN,SAASyD,EAAc;AAAA,YACvB,WAAWiE,EAAU;AAAA,YACrB,WAAWA,EAAU;AAAA,YACrB,QAAQA,EAAU;AAAA,UAAA,CACnB,IACDC,KAAAC,IAAAzwB,EAAE,eAAc,sBAAhB,QAAAwwB,EAAA,KAAAC,GAAoCzwB,EAAE;AACtC;AAAA,QACF;AACA,cAAM0wB,IAASvlB;AAAA,UACbohB;AAAA,UACAvV;AAAA,UACAsT,EAAQ9I,EAAa;AAAA,QAAA;AAEvB,YAAIkP,KAAUA,EAAO,SAAS,QAAQ;AACpC,UAAA3H,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBN,GAAc;AAAA,YACZ,MAAM;AAAA,YACN,SAASyD,EAAc;AAAA,YACvB,WAAWoE,EAAO;AAAA,YAClB,WAAWA,EAAO;AAAA,UAAA,CACnB,IACDC,MAAAC,IAAA5wB,EAAE,eAAc,sBAAhB,QAAA2wB,GAAA,KAAAC,GAAoC5wB,EAAE;AACtC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,EAAA1E,GAAgBlC,CAAI,KAAK4zB,GAAehW,CAAK,IAEjD;AAAA,YAAIzb,GAAkBnC,CAAI,KAAKkzB,KAAiBC,IAAiB;AAC/D,gBAAMsE,IAAYvG,EAAQlJ,EAAa,GACjChR,IAAM5F,GAAc+hB,IAAiBvV,GAAO6Z,CAAS;AAC3D,cAAIzgB,GAAK;AACP,gBAAIpQ,EAAE,UAAU,GAAG;AACjB,cAAA2tB,GAAkBvd,EAAI,cAAcA,EAAI,WAAW;AACnD;AAAA,YACF;AACA,YAAA2Y,GAAkB;AAAA,cAChB,cAAc3Y,EAAI;AAAA,cAClB,aAAaA,EAAI;AAAA,YAAA,CAClB,GACD6Y,GAAkB,IAAI,GACtBJ,GAAc;AAAA,cACZ,MAAM;AAAA,cACN,SAASyD,EAAc;AAAA,cACvB,cAAclc,EAAI;AAAA,cAClB,aAAaA,EAAI;AAAA,YAAA,CAClB,IACD0gB,MAAAC,KAAA/wB,EAAE,eAAc,sBAAhB,QAAA8wB,GAAA,KAAAC,IAAoC/wB,EAAE;AACtC;AAAA,UACF;AAAA,QACF;AAEA,YAAI5G,MAAS,YAAYkzB,KAAiBC,IAAiB;AACzD,gBAAMc,IAAUjiB,GAAYmhB,IAAiBvV,GAAOsT,EAAQlJ,EAAa,CAAC;AAC1E,cAAIiM,GAAS;AACX,YAAAI;AAAA,cACEJ,EAAQ;AAAA,cACRA,EAAQ;AAAA,cACRA,EAAQ;AAAA,cACRrtB;AAAA,YAAA;AAEF;AAAA,UACF;AAAA,QACF;AAEA,QAAIvE,GAAoBrC,CAAI,KAC1Bg2B,GAASpvB,GAAG5G,MAAS,QAAQ;AAAA;AAAA,IAEjC,GAEM43B,KAAgB,CAAChxB,MAA0B;;AAC/C,UAAI,CAAAimB,GAAS,SACb;AAAA,YAAIkE,GAAS,SAAS;AACpB,gBAAM7U,IAAM+P,EAAO;AACnB,cAAI,CAAC/P,EAAK;AACV,gBAAMQ,IAAOJ,GAAgBJ,GAAKtV,EAAE,SAASA,EAAE,OAAO,GAChDwqB,IAAU;AAAA,YACd,GAAGL,GAAS,QAAQ,QAAQrU,EAAK,IAAIqU,GAAS,QAAQ;AAAA,YACtD,GAAGA,GAAS,QAAQ,QAAQrU,EAAK,IAAIqU,GAAS,QAAQ;AAAA,UAAA;AAExD,UAAAO,EAAUF,GAAS7E,GAAQ,QAAQ,IAAI;AACvC;AAAA,QACF;AACA,YAAIyD,MAAakD,GAAe;AAC9B,gBAAMtV,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCixB,IAAa,KAAK;AAAA,YACtBjxB,EAAE,UAAUopB,GAAU;AAAA,YACtBppB,EAAE,UAAUopB,GAAU;AAAA,UAAA;AAExB,cAAI,CAACA,GAAU,YAAY6H,IAAarP,GAAc;AACtD,UAAKwH,GAAU,aACbC,GAAa,EAAE,GAAGD,IAAW,UAAU,IAAM,GAC7CD,GAAe,IAAI;AAErB,gBAAMxtB,IAAOyN;AAAA,YACXggB,GAAU;AAAA,YACVA,GAAU;AAAA,YACVA,GAAU;AAAA,YACV,EAAE,GAAGpS,EAAM,IAAIoS,GAAU,MAAM,GAAG,GAAGpS,EAAM,IAAIoS,GAAU,MAAM,EAAA;AAAA,UAAE;AAEnE,UAAAtE,GAAsBwH,EAAc,IAAI3wB,GAAM,EAAE,MAAM,IAAM;AAC5D;AAAA,QACF;AACA,YAAI2sB,IAAU;AACZ,gBAAMtR,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAAuoB,GAAY,EAAE,GAAGD,IAAU,QAAQtR,GAAO;AAC1C;AAAA,QACF;AACA,YAAI6P,KAAc,MAAM;AACtB,UAAAG,GAAmBsG,GAAQttB,EAAE,SAASA,EAAE,OAAO,CAAC;AAChD;AAAA,QACF;AACA,YAAIinB,MAAkBrC,IAAoB;AACxC,gBAAMtmB,IAAOQ,EAAM,KAAK,CAACwO,MAASA,EAAK,OAAO2Z,GAAe,MAAM,GAC7D7oB,IAAOE,IAAO+vB,GAAkB,IAAI/vB,EAAK,YAAY,IAAI,QACzDD,IAAKC,IAAO+vB,GAAkB,IAAI/vB,EAAK,UAAU,IAAI;AAC3D,cAAIA,KAAQF,KAAQC,GAAI;AACtB,kBAAM2Y,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpC8d,KACJmJ,GAAe,SAAS,SACpBiK,GAAiB9yB,GAAMC,GAAI2Y,CAAK,IAChCma;AAAA,cACE9S,GAAa/f,CAAI,KAAK4yB,GAAiB9yB,GAAMC,GAAI2Y,CAAK;AAAA,cACtDiQ,GAAe;AAAA,cACfjQ;AAAA,YAAA;AAER,YAAA4N,GAAmBtmB,EAAK,IAAIwf,IAAO,EAAE,MAAM,IAAM;AAAA,UACnD;AACA;AAAA,QACF;AACA,YAAI8K,MAAc0D,GAAe;AAC/B,cAAI;AACF,aAAAhlB,KAAA5P,IAAA2tB,EAAO,YAAP,gBAAA3tB,EAAgB,sBAAhB,QAAA4P,EAAA,KAAA5P,GAAoCsI,EAAE;AAAA,UACxC,QAAQ;AAAA,UAER;AACA,gBAAMgX,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCiwB,IACJjwB,EAAE,YAAY4oB,GAAW,SAAS,WAC9BzX;AAAA,YACE6F;AAAA,YACAxN;AAAA,cACE8iB,EAAc;AAAA,cACd1D,GAAW;AAAA,cACXA,GAAW;AAAA,YAAA;AAAA,UACb,IAEF,MACAhiB,KAAQqpB,KAAA,gBAAAA,EAAa,UAASjZ;AACpC,UAAA0P,EAAakC,GAAW,SAAS,WAAWqH,IAAc,IAAI;AAC9D,gBAAMt0B,IACJitB,GAAW,SAAS,WAChB/e;AAAA,YACEyiB,EAAc;AAAA,YACd1D,GAAW;AAAA,YACXA,GAAW;AAAA,YACXA,GAAW;AAAA,YACX5R;AAAA,UAAA,IAEF4R,GAAW,SAAS,SAClB5e;AAAA,YACEsiB,EAAc;AAAA,YACd1D,GAAW;AAAA,YACXA,GAAW;AAAA,YACX5R;AAAA,UAAA,IAEFpN;AAAA,YACE0iB,EAAc;AAAA,YACd1D,GAAW;AAAA,YACXA,GAAW;AAAA,YACXhiB;AAAA,UAAA;AAEV,UAAAke,GAAsBwH,EAAc,IAAI3wB,GAAM,EAAE,MAAM,IAAM;AAC5D;AAAA,QACF;AACA,YAAI6sB,IAAW;AACb,gBAAMxR,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAA2oB,GAAe;AAAA,YACb,GAAG3R,EAAM,IAAIwR,GAAU,MAAM;AAAA,YAC7B,GAAGxR,EAAM,IAAIwR,GAAU,MAAM;AAAA,UAAA,CAC9B;AACD;AAAA,QACF;AACA,aACGpvB,MAAS,eAAe+B,GAAkB/B,CAAI,MAC/C8sB,GAAQ,SAAS,GACjB;AACA,gBAAMlP,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAI7E,GAAkB/B,CAAI,KAAGitB,EAAkBrmB,EAAE,QAAQ,GACzDmmB,GAAW,CAACxgB,MACNA,EAAK,WAAW,IAAUA,IACvB,CAACA,EAAK,CAAC,GAAGqR,CAAK,CACvB;AAAA,QACH;AACA,YAAIhc,GAAkB5B,CAAI,KAAKutB,EAAc,SAAS,GAAG;AACvD,gBAAM3P,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCyf,IAAOkN,GAAiB3V,CAAK;AACnC,cAAIyI;AACF,YAAA2I,GAAe3I,CAAI,GACnBmI,GAAgBnI,CAAI,GACpBiH,EAAa,IAAI;AAAA,mBACR1mB,EAAE,UAAU;AACrB,kBAAMiwB,IAAcjf;AAAA,cAClB2V,EAAcA,EAAc,SAAS,CAAC;AAAA,cACtC3P;AAAA,YAAA;AAEF,YAAAoR,GAAe,IAAI,GACnBR,GAAgBqI,EAAY,KAAK,GACjCvJ,EAAauJ,CAAW;AAAA,UAC1B;AACE,YAAA7H,GAAe,IAAI,GACnBR,GAAgB5Q,CAAK,GACrB0P,EAAa,IAAI;AAAA,QAErB;AASA,YAPEtB,MACA,CAACkD,MACDzB,KAAc,QACdI,MAAkB,QAElB0H,GAAuB3uB,EAAE,SAASA,EAAE,OAAO,GAEzC1E,GAAgBlC,CAAI,KAAK,CAAC0qB,GAAU;AACtC,gBAAM9M,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCoxB,IAAU9G,EAAQxI,EAAW,GAC7BmL,IAAS1c;AAAA,YACbic;AAAA,YACAxV;AAAA,YACAoa;AAAA,YACAvJ;AAAA,UAAA;AAEF,UAAIoF,KAAUpF,MACZK,EAAoB+E,CAAM,GAC1BrF,GAAgBqF,EAAO,KAAK,GAC5BjF,GAAkB,IAAI,MAEtBE,EAAoB,IAAI,GACxBN,GAAgBC,KAAmB7Q,IAAQ,IAAI,GAC/CgR;AAAA,YACEjtB,GAAgB3B,CAAI,KAAK,CAACszB,GAAoB1V,GAAOoa,CAAO,IACxDzgB,GAAiB6b,IAAiBxV,GAAOsT,EAAQlJ,EAAa,CAAC,IAC/D;AAAA,UAAA;AAAA,QAGV;AAAA;AAAA,IACF,GAEMiQ,KAAa,MAAM;AACvB,UAAInL,GAAQ,SAAS,GAAG;AACtB,QAAAC,GAAW,CAAA,CAAE;AACb;AAAA,MACF;AACA,YAAM,CAAC/oB,GAAGC,CAAC,IAAI,CAAC6oB,GAAQ,CAAC,GAAGA,GAAQA,GAAQ,SAAS,CAAC,CAAC;AACvD,UAAIlE,GAAS5kB,GAAGC,CAAC,IAAI,GAAG;AACtB,QAAA8oB,GAAW,CAAA,CAAE;AACb;AAAA,MACF;AACA,YAAMxnB,IAAOojB,GAAY3kB,GAAGC,CAAC;AAC7B,MAAAwnB,GAAc,QAAQjc,GAAmB,CAACjK,CAAI,CAAC,CAAC,GAChDwnB,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AAAA,IACzB,GAEMiL,KAAgB,CAAC3f,MAAwB;AAC7C,UAAIuU,GAAQ,SAAS,GAAG;AACtB,QAAAC,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AACvB;AAAA,MACF;AACA,YAAM,CAACjpB,GAAGC,CAAC,IAAI,CAAC6oB,GAAQ,CAAC,GAAGA,GAAQA,GAAQ,SAAS,CAAC,CAAC;AACvD,UAAIlE,GAAS5kB,GAAGC,CAAC,IAAI,GAAG;AACtB,QAAA8oB,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AACvB;AAAA,MACF;AACA,MAAAxB,GAAc,QAAQ7S,GAAgB5U,GAAGC,GAAGsU,CAAU,CAAC,GACvDwU,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AAAA,IACzB,GAEMkL,KAAc,CAACvxB,MAA0B;;AAC7C,UAAIimB,GAAS,QAAS;AACtB,YAAMuL,IAAWrH,GAAS;AAqB1B,UApBAA,GAAS,UAAU,MACnBE,EAAa,EAAK,GACbrqB,EAAE,YAAU0mB,EAAa,IAAI,GAC9B8K,KAAA,QAAAA,EAAU,mBACE,KAAK;AAAA,QACjBxxB,EAAE,UAAUwxB,EAAS;AAAA,QACrBxxB,EAAE,UAAUwxB,EAAS;AAAA,MAAA,IAEX,MACVxN,GAAc,IAAI,GAClB+F,GAAc,CAAA,CAAE,GAChBhB,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBrB,GAAoB,IAAI,GACxBI,EAAoB,IAAI,GACxBN,GAAgB,IAAI,IAGxB5C,MAAA,QAAAA,MACIsD,IAAU;AACZ,YAAI;AACF,WAAAhhB,KAAA5P,IAAA2tB,EAAO,YAAP,gBAAA3tB,EAAgB,0BAAhB,QAAA4P,EAAA,KAAA5P,GAAwCsI,EAAE;AAAA,QAC5C,QAAQ;AAAA,QAER;AAKA,QAJc,KAAK;AAAA,UACjBA,EAAE,UAAUsoB,GAAS;AAAA,UACrBtoB,EAAE,UAAUsoB,GAAS;AAAA,QAAA,KAEV,KACX9D;AAAA,UACE8D,GAAS;AAAA,UACTA,GAAS;AAAA,UACTA,GAAS;AAAA,UACTgC,EAAQ9N,EAAkB;AAAA,QAAA,GAG9B+L,GAAY,IAAI;AAChB;AAAA,MACF;AACA,UAAIa,IAAW;AACb,QAAI,CAACA,GAAU,YAAYkD,KACzBkB;AAAA,UACElB;AAAA,UACAlD,GAAU;AAAA,UACVA,GAAU;AAAA,UACVA,GAAU;AAAA,QAAA,GAGdC,GAAa,IAAI;AACjB;AAAA,MACF;AACA,UAAIT,IAAY;AACd,QAAAC,GAAc,IAAI;AAClB;AAAA,MACF;AACA,UAAI5B,IAAgB;AAClB,YAAIrC,IAAoB;AACtB,gBAAMtmB,IAAOQ,EAAM,KAAK,CAACwO,MAASA,EAAK,OAAO2Z,GAAe,MAAM,GAC7DnJ,IAAQxf,IAAO+f,GAAa/f,CAAI,IAAI;AAC1C,UAAIwf,KACF8G,GAAmBtmB,EAAM,IAAIwf,CAAK;AAAA,QAEtC;AACA,QAAAoJ,GAAkB,IAAI;AACtB;AAAA,MACF;AACA,UAAIsB,MAAa8D,GAAe;AAC9B,cAAM3wB,IAAOuN;AAAA,UACXsf,GAAU;AAAA,UACVE,GAAY;AAAA,UACZA,GAAY;AAAA,QAAA;AAEd,QAAI,KAAK,MAAMA,GAAY,GAAGA,GAAY,CAAC,KAAK,OAC9C5D,GAAsBwH,EAAc,IAAI3wB,CAAI,GAE9C8sB,GAAa,IAAI,GACjBE,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG;AAC7B;AAAA,MACF;AACA,UAAI9B,KAAc,MAAM;AACtB,cAAM4K,IAAQ5yB,EAAQ,KAAK,CAACzB,MAAMA,EAAE,OAAOypB,CAAU,GAC/CjgB,IAAQmgB,MAAmB0K;AACjC,YAAIA,KAAS7qB,GAAO;AAClB,cACExN,MAAS,YACTq4B,EAAM,WAAW,SAChBxD,GAAsB,IAAIwD,EAAM,EAAE,KAAK,MAAM,GAC9C;AACA,kBAAMnjB,KAAOgf,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACnCyf,KAAOd;AAAA,cACXrQ;AAAA,cACAzP;AAAA,cACAC;AAAA,cACAqvB;AAAA,cACA7D,EAAQ7N,EAAwB;AAAA,cAChC2B;AAAA,YAAA;AAEF,gBAAIqB,IAAM;AACR,cAAAgF;AAAA,gBACEgN,EAAM;AAAA,gBACNnjB;AAAA,gBACAgc,EAAQ7N,EAAwB;AAAA,cAAA,GAElCsN,GAAc;AAAA,gBACZtK,GAAK,SAAS,aAAaA,GAAK,WAAWgS,EAAM;AAAA,cAAA,CAClD,GACD3K,EAAc,IAAI,GAClBE,GAAmB,IAAI,GACvB2C,GAAoB,IAAI;AACxB;AAAA,YACF;AAAA,UACF;AACA,UAAI,KAAK,MAAM/iB,EAAM,IAAI6qB,EAAM,GAAG7qB,EAAM,IAAI6qB,EAAM,CAAC,KAAK,SACtD9M,EAAa8M,EAAM,IAAI7qB,EAAM,GAAGA,EAAM,CAAC,GACvCoe,MAAA,QAAAA;AAEF,gBAAM9Z,IAAOrM,EACV,OAAO,CAACzB,OAAMA,GAAE,OAAOq0B,EAAM,EAAE,EAC/B,OAAO,CAACr0B,OAAM,KAAK,MAAMA,GAAE,IAAIwJ,EAAM,GAAGxJ,GAAE,IAAIwJ,EAAM,CAAC,KAAK,GAAG,EAC7D,IAAI,CAACxJ,OAAMA,GAAE,EAAE;AAClB,UAAI8N,EAAK,UAAQ6e,GAAc,CAAC0H,EAAM,IAAI,GAAGvmB,CAAI,CAAC;AAAA,QACpD;AACA,QAAA4b,EAAc,IAAI,GAClBE,GAAmB,IAAI;AACvB;AAAA,MACF;AACA,MAAI5tB,MAAS,eAAai4B,GAAA,GACtBl2B,GAAkB/B,CAAI,KAAGk4B,GAActxB,EAAE,QAAQ;AAAA,IACvD,GAEM0xB,KAAoB,CAACvsB,MAA0C;AACnE,YAAM7B,IAAQ4E,GAAgB/C,CAAQ;AACtC,aAAI7B,EAAM,SAAS,IACVA,EAAM,IAAIyB,EAAW,EAAE,KAAK,GAAG,IAGtCI,EAAS,MAAM,IAAI,CAAC3H,MAAMA,EAAE,CAAC,EAAE,KAAK,GAAG,KACvColB,GAAezd,EAAS,QAAQ;AAAA,IAEpC,GAEMwsB,KAAa,CAAC1iB,MAEhBqU,MAAoBrU,EAAM,MAC1Bsd,OACA/D,MAAA,gBAAAA,GAAW,aAAYvZ,EAAM,KAEtByiB,GAAkBnF,EAAe,IAEnCmF,GAAkBziB,EAAM,QAAQ,GAGnC2iB,KAAiBtJ,KACnB9J,GAAmB3f,GAASypB,EAAQ,IACpCb,KACEjJ,GAAmB3f,GAAS4oB,EAAgB,IAC5C,MACAoK,KACJvJ,MAAYsJ,KACRjT;AAAA,MACE2J,GAAS;AAAA,MACTzpB;AAAA,MACAC;AAAA,MACA8yB;AAAA,MACAtH,EAAQ9N,EAAkB;AAAA,MAC1B4B;AAAA,IAAA,IAEFqJ,MAAoBE,MAAgBiK,KAClClI,KACA,MACFoI,KACJzK,MAAmB,OAAOjJ,GAAW,IAAIiJ,EAAe,IAAI,QACxD0K,KACJ,CAACzJ,MACD,CAACb,MACDE,OACCJ,MACEpuB,GAAiBC,CAAI,KAAKiuB,MAAmB,QAC5CqC,KACA,MAMAsI,OAJH5D,MAAA,gBAAAA,GAAe,UAAS,SAASA,GAAc,SAAS,WACxDyD,MAAA,gBAAAA,GAAU,UAAS,SAASA,GAAS,SAAS,UAC/C7H,MAAA,gBAAAA,GAAY,WACZ,SAGE5wB,MAAS,YAAYA,MAAS,UAAWwwB,KAAsB,OAC7DqI,KACJD,MAA0B,OACtB,OACAlzB,EAAM,KAAK,CAACR,MAASA,EAAK,OAAO0zB,EAAsB,KAAK,MAC5DE,KAAuBD,KACzB5D,GAAkB,IAAI4D,GAAqB,YAAY,IACvD,MACEE,KAAqBF,KACvB5D,GAAkB,IAAI4D,GAAqB,UAAU,IACrD,MACEG,KACJH,MAAwBC,MAAwBC,KAC5C3D;AAAA,MACE0D;AAAA,MACAC;AAAA,MACA1D,GAAkBwD,IAAsB7T,IAAYiQ,EAAiB;AAAA,IAAA,IAEvE,MACAgE,OACHjE,MAAA,gBAAAA,GAAe,UAAS,SAASA,GAAc,QAAQ,WACvDyD,MAAA,gBAAAA,GAAU,UAAS,SAASA,GAAS,QAAQ,UAC9C7H,MAAA,gBAAAA,GAAY,UACZ,MACIsI,MACJhK,MAAA,gBAAAA,GAAU,YACVb,MAAA,gBAAAA,GAAkB,WAClBF,OACCpuB,GAAiBC,CAAI,KAAK04B,KACvB,EAAE,GAAGA,GAAe,GAAG,GAAGA,GAAe,MACzC,OACAS,KACJjK,MAAY,QACRuJ,MAAA,gBAAAA,GAAU,UAASvJ,GAAS,UAC5BuJ,MAAA,gBAAAA,GAAU,WACVE,MAAA,gBAAAA,GAAiB,WACjB/H,MAAA,gBAAAA,GAAY,UACZrC,IACA6K,KACHlK,MAAY,QACXb,MAAoB,QACpBF,MAAmB,QAClBpuB,GAAiBC,CAAI,KAAKiuB,MAAmB,QAAQM,MAAgB,OACpE5K,GAAgBuV,IAAYC,EAAQ,IACpC,MACAE,KACJz3B,GAAkB5B,CAAI,KAAKutB,EAAc,SAAS,IAC9C5J,GAAgB4J,EAAcA,EAAc,SAAS,CAAC,GAAGgB,EAAY,IACrE,MACA+K,KACJ13B,GAAkB5B,CAAI,KAAKutB,EAAc,UAAU,IAC/C5J,GAAgB4K,IAAchB,EAAc,CAAC,CAAC,IAC9C,MACAgM,KACJrJ,MAAkB,OACd4C,GAAe,KAAK,CAACjd,MAAUA,EAAM,OAAOqa,EAAc,IAC1D,MACAsJ,KACJxN,MACA,CAACtB,KACD3qB,GAAiBC,CAAI,KACrBu5B,MAAoB,QACpB3V,GAAkB2V,GAAiB,IAAI,KACvC,CAACngB,GAAYmgB,EAAgB,KAC7B,CAAC3e,GAAe2e,EAAgB,GAC5BE,KACJ15B,GAAiBC,CAAI,MACrBswB,MAAA,gBAAAA,GAAkB,UAAS,UAC3B,CAACpB,IACGwK,KAAoBpJ,MAAoB,QAAQ,CAACpB,IACjDyK,KAAY5a,GAAgB;AAAA,MAChC,MAAA/e;AAAA,MACA,UAAA0qB;AAAA,MACA,WAAAwC;AAAA,MACA,SAAS8D;AAAA,MACT,eAAe5B,MAAa;AAAA,MAC5B,gBAAgBwB,MAAc,QAAQ,CAAC1B;AAAA,MACvC,mBAAAwK;AAAA,MACA,kBAAAD;AAAA,MACA,sBAAAD;AAAA,MACA,cACGx5B,MAAS,YAAYA,MAAS,YAAYowB,MAAmB;AAAA,MAChE,gBACE3C,KAAc,QAAQyB,MAAY,QAAQrB,MAAkB;AAAA,MAC9D,cAAc,CAAC,EAACmC,MAAA,QAAAA,GAAW;AAAA,MAC3B,WAAWF,MAAe;AAAA,IAAA,CAC3B,GACK8J,KAAmC;AAAA,MACvC,GAAI/P,GAAkBD,GAAUE,CAAW,KAAK,CAAA;AAAA,MAChD,GAAI6P,KAAY,EAAE,QAAQA,OAAc,CAAA;AAAA,IAAC;AAG3C,WAAKv7B,IAYH,gBAAA0C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKsrB;AAAA,QACL,WAAWzC,GAAkBC,CAAQ;AAAA,QACrC,OAAOgQ;AAAA,QACP,sBAAsB7D;AAAA,QACtB,sBAAsBE;AAAA,QACtB,oBAAoBC;AAAA,QACpB,wBAAwBA;AAAA,QAExB,UAAA;AAAA,UAAA,gBAAA11B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKyrB;AAAA,cACL,WAAW,wBAAwBD,KAAe,mBAAmB,EAAE;AAAA,cACvE,SAAS,GAAGuG,GAAQ,CAAC,IAAIA,GAAQ,CAAC,IAAIA,GAAQ,KAAK,IAAIA,GAAQ,MAAM;AAAA,cACrE,qBAAoB;AAAA,cACpB,eAAAnJ;AAAA,cACA,eAAAwO;AAAA,cACA,aAAAO;AAAA,cACA,iBAAiBA;AAAA,cACjB,gBAAgB,MAAM;AACpB,gBAAA5H,GAAoB,IAAI;AAAA,cAC1B;AAAA,cACA,aAAa,CAAC3pB,MAAM;AAClB,gBAAI5G,MAAS,eAAa4G,EAAE,eAAA;AAAA,cAC9B;AAAA,cACA,eAAe,CAACA,MAAM;;AAGpB,oBAFAA,EAAE,eAAA,IACFtI,IAAA,OAAO,aAAA,MAAP,QAAAA,EAAuB,mBAErBosB,KACA,CAACsB,MACD,CAAC9rB,GAAwBF,CAAI;AAE7B;AAEF,sBAAM65B,KACJvJ,MAAA,gBAAAA,GAAkB,UAAS,SACvBA,GAAiB,SACjB;AACN,gBAAIuJ,KAAW,SACfjzB,EAAE,gBAAA,GACF4vB,GAAqBqD,CAAO;AAAA,cAC9B;AAAA,cAEA,UAAA,gBAAA/4B;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKqrB;AAAA,kBACL,WAAU;AAAA,kBACV,WAAW,aAAaI,GAAQ,QAAQ,IAAI,CAAC,KAAKA,GAAQ,QAAQ,IAAI,CAAC,WAAWA,GAAQ,QAAQ,IAAI;AAAA,kBAEtG,UAAA;AAAA,oBAAA,gBAAAzrB,EAAC,QAAA,EACC,UAAA;AAAA,sBAAA,gBAAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAImyB;AAAA,0BACJ,cAAa;AAAA,0BACb,OAAO;AAAA,0BACP,QAAQ;AAAA,0BAER,UAAA;AAAA,4BAAA,gBAAAzyB,EAAC,QAAA,EAAK,OAAM,MAAK,QAAO,MAAK,MAAK,WAAU,aAAY,OAAA,CAAO;AAAA,8CAC9D,QAAA,EAAK,GAAE,iBAAgB,QAAO,WAAU,aAAY,OAAA,CAAO;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAE7DuyB,GAAc,SAAS,IACtB,gBAAAvyB,EAAC,cAAS,IAAIwyB,IACX,aAAc,IAAI,CAACnd,MAClB,gBAAArV,EAAC,QAAA,EAAoB,GAAG+3B,GAAW1iB,CAAK,KAA7BA,EAAM,EAA0B,CAC5C,EAAA,CACH,IACE;AAAA,oBAAA,GACN;AAAA,oBACC4c,KACC,gBAAAjyB;AAAA,sBAACwhB;AAAA,sBAAA;AAAA,wBACC,KAAKyQ;AAAA,wBACL,eAAAvR;AAAA,wBACA,aAAawR;AAAA,wBACb,OAAAtU;AAAA,sBAAA;AAAA,oBAAA,IAEA;AAAA,oBAEHoM,EAAe,OAAOtH,EAAoB,EAAE,IAAI,CAACrN,MAAU;AAC1D,4BAAMikB,IAAW,CAAC9N,MAAgB/I,GAAoBpN,EAAM,IAAI,GAC1DuJ,IAAU0a,KAAY5J,OAAmBra,EAAM,IAC/CkkB,IAAgB5b;AAAA,wBACpBtI;AAAA,wBACAuI;AAAA,wBACAyC,GAAoB,IAAIhL,EAAM,EAAE;AAAA,sBAAA;AAElC,6BACE,gBAAArV;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,GACEqV,EAAM,SAAS,MAAM,IAAI,CAACzR,MAAMA,EAAE,CAAC,EAAE,KAAK,GAAG,KAC7ColB,GAAe3T,EAAM,SAAS,QAAQ;AAAA,0BAExC,MAAMwJ,GAAyB0a,GAAe3a,CAAO;AAAA,0BACrD,aAAaA,IAAU,MAAM0a,IAAW,OAAO;AAAA,0BAC/C,QAAQ1a,IAAUC,GAAyB0a,GAAe,EAAI,IAAI;AAAA,0BAClE,cAAc3a,IAAU,IAAI,KAAKxC;AAAA,0BACjC,iBAAiBkd,IAAW,GAAG,IAAIld,EAAI,IAAI,IAAIA,EAAI,KAAK;AAAA,0BACxD,eAAekd,IAAW,SAAS;AAAA,0BACnC,OAAO,EAAE,QAAQA,IAAW,YAAY,OAAA;AAAA,0BACxC,gBACEA,IACI,CAAClzB,MAAM;AACL,4BAAAupB,GAAkBta,EAAM,EAAE,GAC1Bse,GAAgBvtB,GAAGiP,EAAM,IAAI;AAAA,0BAC/B,IACA;AAAA,0BAEN,eACEikB,IAAW,CAAClzB,MAAMutB,GAAgBvtB,GAAGiP,EAAM,IAAI,IAAI;AAAA,0BAErD,gBACEikB,IACI,MAAM;AACJ,4BAAA3J,GAAkB,CAACrZ,MAAQA,MAAOjB,EAAM,KAAK,OAAOiB,CAAG,GACvDga,GAAe,IAAI;AAAA,0BACrB,IACA;AAAA,0BAEN,eACEgJ,IACI,CAAClzB,MAAM;AACL,4BAAAA,EAAE,gBAAA,GACFkqB,GAAe,IAAI,GACnBlG,GAAc/U,EAAM,EAAE;AAAA,0BACxB,IACA;AAAA,wBAAA;AAAA,wBAtCD,QAAQA,EAAM,EAAE;AAAA,sBAAA;AAAA,oBA0C3B,CAAC;AAAA,oBAEAkd,GAAc,SAAS,KAAKtI,EAAsB,SAAS,IAC1D,gBAAAjqB,EAAC,OAAE,UAAU,QAAQwyB,EAAa,KAAK,eAAc,QAClD,UAAAvI,EAAsB,OAAOvH,EAAoB,EAAE,IAAI,CAACrN,MACvD,gBAAArV;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,GACEqV,EAAM,SAAS,MAAM,IAAI,CAACzR,MAAMA,EAAE,CAAC,EAAE,KAAK,GAAG,KAC7ColB,GAAe3T,EAAM,SAAS,QAAQ;AAAA,wBAExC,MAAMsI;AAAA,0BACJtI;AAAA,0BACAuI;AAAA,0BACAyC,GAAoB,IAAIhL,EAAM,EAAE;AAAA,wBAAA;AAAA,wBAElC,aAAa;AAAA,wBACb,QAAO;AAAA,wBACP,aAAa,MAAM+G;AAAA,sBAAA;AAAA,sBAZd,SAAS/G,EAAM,EAAE;AAAA,oBAAA,CAczB,GACH,IACE;AAAA,oBAEHid,GAAe,IAAI,CAACjd,MAAU;AAC7B,4BAAMmkB,IAAgBnb,GAAsBhJ,EAAM,IAAI,GAChDokB,IAAW/P,MAAoBrU,EAAM,IACrCuJ,IAAU4a,KAAiB9J,OAAmBra,EAAM,MAAM,CAACokB,GAC3DC,KAAW9K,MAAA,gBAAAA,GAAW,aAAYvZ,EAAM,IACxCskB,IAAY/gB,GAAYvD,CAAK,GAC7BukB,IAAexf,GAAe/E,CAAK,GACnCwkB,KAAQF,KAAaC,GACrBtiB,KAASoV,KACX,SACAjO,GAAmB;AAAA,wBACnB,MAAAjf;AAAA,wBACA,UAAAi6B;AAAA,wBACA,eAAAD;AAAA,wBACA,UAAAE;AAAA,wBACA,YACElO,MACA,CAACtB,KACD9G,GAAkB/N,EAAM,IAAI,KAC5B,CAACwkB;AAAA,wBACH,WAAAF;AAAA,wBACA,cAAAC;AAAA,sBAAA,CACD,MACAn4B,GAAgBjC,CAAI,KAClByB,GAAqBzB,GAAM0B,CAAS,KAAK,CAACgpB,IACzC,SACA1oB,GAAgBhC,CAAI,IAClB,SACA,YACFs6B,KAAwB,CAAC1zB,OAA0B;;AACvD,4BAAIwmB,GAAa,SAAS;AACxB,0BAAAxmB,GAAE,gBAAA,GACFovB,GAASpvB,IAAG,EAAK;AACjB;AAAA,wBACF;AAEA,4BADI8jB,KACA2D,GAAkB;AAGtB,4BAAIrC,OAAiBhsB,MAAS,YAAYA,MAAS,UAAU;AAC3D,gCAAM4d,KAAQsW,GAAQttB,GAAE,SAASA,GAAE,OAAO,GACpC2zB,KAAYhV;AAAA,4BAChB3H;AAAAA,4BACAnY;AAAA,4BACAC;AAAA,gDACI,IAAA;AAAA,4BACJwrB,EAAQ7N,EAAwB;AAAA,4BAChC2B;AAAA,4BACAhlB,MAAS,UAAU,SAAS;AAAA,0BAAA;AAG9B,8BADIA,MAAS,WAAWu6B,MAAa,QAEnCv6B,MAAS,aACR,CAAC4jB,GAAkB/N,EAAM,IAAI,KAAKwkB;AAEnC;AAAA,wBAEJ;AACA,4BACErO,MACAjsB,GAAiBC,CAAI,KACrB6jB,GAAsBzlB,CAAK,KAC3BwlB,GAAkB/N,EAAM,IAAI,KAC5B,CAACwkB,IACD;AACA,0BAAAzzB,GAAE,gBAAA;AACF,gCAAMiR,KAASqc,GAAQttB,GAAE,SAASA,GAAE,OAAO;AAC3C,0BAAA0kB,GAAoBzV,EAAM,IAAIgC,EAAM,GACpCuW,GAAmB,IAAI,GACvBF,GAAmB,IAAI,GACvBI,GAAoB,EAAE,SAASzY,EAAM,IAAI,QAAAgC,IAAQ,GACjD2W,GAAgB3W,EAAM;AACtB;AAAA,wBACF;AACA,4BAAIwiB,MAASp4B,GAAgBjC,CAAI,GAAG;AAClC,0BAAA4G,GAAE,gBAAA,GACFgkB,GAAc/U,EAAM,EAAE,GACtBlT,MAAA,QAAAA,GAAe;AACf;AAAA,wBACF;AACA,4BAAI,CAAClB,GAAqBzB,GAAM0B,CAAS,EAAG;AAC5C,wBAAAkF,GAAE,gBAAA;AACF,8BAAM4zB,KAAUtG,GAAQttB,GAAE,SAASA,GAAE,OAAO;AAC5C,4BAAIjF,GAAgB3B,CAAI,GAAG;AACzB,8BAAIw0B,GAAyBgG,IAAS5zB,EAAC,EAAG;AAC1C,2BACE,CAACsL,GAAiB2D,EAAM,IAAI,KAC5B,CAACie,GAAkB0G,EAAO,MAE1B5P,GAAc/U,EAAM,EAAE;AAExB;AAAA,wBACF;AAKA,4BAJI+d,GAAe4G,EAAO,MAC1B5P,GAAc/U,EAAM,EAAE,GAClB7V,MAAS,aAET,EADYi6B,KAAYD,GACd;AACd,8BAAMpc,KAAQsW,GAAQttB,GAAE,SAASA,GAAE,OAAO,GACpCmF,KACJkuB,KAAY9G,KACRA,KACAtd,EAAM;AACZ,wBAAAwZ,GAAa;AAAA,0BACX,SAASxZ,EAAM;AAAA,0BACf,OAAO+H;AAAA,0BACP,gBAAgB7R;AAAA,wBAAA,CACjB,GACDwjB,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG,IAC7BrhB,MAAA5P,KAAAsI,GAAE,eAAc,sBAAhB,QAAAsH,GAAA,KAAA5P,IAAoCsI,GAAE;AAAA,sBACxC,GACM6zB,IAAgBT,IAClB;AAAA,wBACE,gBAAgB,MAAM7J,GAAkBta,EAAM,EAAE;AAAA,wBAChD,gBAAgB,MACdsa,GAAkB,CAACrZ,OAAQA,OAAOjB,EAAM,KAAK,OAAOiB,EAAG;AAAA,sBAAA,IAE3D;AACJ,0BAAIsjB,GAAc;AAChB,8BAAMruB,KACJkuB,KAAY9G,KACRA,KACAtd,EAAM,UACNsE,KAAMO,GAAa3O,EAAQ;AACpB,wBAAA8J,EAAM,MAAM,QAAQqhB;AACjC,8BAAM3V,KAAS1L,EAAM,MAAM,UAAU,GAC/B,EAAE,GAAGvN,IAAI,GAAGC,GAAA,IAAO2R,GAAeC,EAAG,GACrCugB,KAAUC;AAAA,0BACd9kB,EAAM,MAAM,SAASuI,EAAM;AAAA,wBAAA,GAEvBwc,KAAiBvb;AAAA,0BACrBxJ,EAAM,MAAM,SAASuI,EAAM;AAAA,0BAC3B6b,KAAY7a;AAAA,wBAAA;AAEd,+BACE,gBAAAte;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC,WACEygB,KAAS,UAAUA,EAAM,IAAIjZ,EAAE,IAAIC,EAAE,MAAM;AAAA,4BAE7C,OACEyjB,KAAe,SAAY,EAAE,QAAQlU,MAAU,UAAA;AAAA,4BAEhD,GAAG2iB;AAAA,4BAEJ,UAAA;AAAA,8BAAA,gBAAAj6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,GAAG+3B,GAAW,EAAE,GAAG1iB,GAAO,UAAA9J,IAAU;AAAA,kCACpC,MAAK;AAAA,kCACL,QACEkuB,KAAY7a,IAAUwb,KAAiB;AAAA,kCAEzC,aAAaX,KAAY7a,IAAU,MAAMxC,KAAO;AAAA,kCAChD,eAAe0d;AAAA,gCAAA;AAAA,8BAAA;AAAA,8BAEhBI,KACC,gBAAAl6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,MAAMk6B;AAAA,kCACN,GAAGvgB,GAAI;AAAA,kCACP,GAAGA,GAAI;AAAA,kCACP,OAAOA,GAAI,OAAOA,GAAI;AAAA,kCACtB,QAAQA,GAAI,OAAOA,GAAI;AAAA,kCACvB,OAAO,EAAE,eAAe,OAAA;AAAA,gCAAO;AAAA,8BAAA,IAE/B;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BA3BCtE,EAAM;AAAA,wBAAA;AAAA,sBA8BjB;AACA,0BAAIuD,GAAYvD,CAAK,GAAG;AACtB,8BAAM9J,KACJkuB,KAAY9G,KACRA,KACAtd,EAAM,UACNsE,KAAMO,GAAa3O,EAAQ,GAC3B6N,KAAO/D,EAAM,MAAM,QAAQwD,GAAwB,GACnDkI,KAAS1L,EAAM,MAAM,UAAU,GAC/B,EAAE,GAAGvN,IAAI,GAAGC,GAAA,IAAO2R,GAAeC,EAAG,GACrCqH,KAAQf,GAAoB5K,EAAM,MAAM,KAAK,GAC7CglB,KAAQC,GAAY3gB,IAAKqH,EAAK,GAC9B3H,KAAQN,GAAe1D,EAAM,MAAM,QAAQ,EAAE,GAC7C+L,KAAahI,KAAOX,IACpB4I,KAAchI,GAAM,SAAS+H,IAC7BgZ,KAAiBvb;AAAA,0BACrBxJ,EAAM,MAAM,SAASuI,EAAM;AAAA,0BAC3B6b,KAAY7a;AAAA,wBAAA;AAEd,+BACE,gBAAAte;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC,WACEygB,KAAS,UAAUA,EAAM,IAAIjZ,EAAE,IAAIC,EAAE,MAAM;AAAA,4BAE7C,OACEyjB,KAAe,SAAY,EAAE,QAAQlU,MAAU,UAAA;AAAA,4BAEhD,GAAG2iB;AAAA,4BAEJ,UAAA;AAAA,8BAAA,gBAAAj6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,GAAG+3B,GAAW,EAAE,GAAG1iB,GAAO,UAAA9J,IAAU;AAAA,kCACpC,MAAK;AAAA,kCACL,QACEkuB,KAAY7a,IAAUwb,KAAiB;AAAA,kCAEzC,aAAaX,KAAY7a,IAAU,MAAMxC,KAAO;AAAA,kCAChD,eAAe0d;AAAA,gCAAA;AAAA,8BAAA;AAAA,8BAEjB,gBAAA95B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,YAAYuY;AAAA,kCACZ,UAAUa;AAAA,kCACV,MAAM/D,EAAM,MAAM,SAASuI,EAAM;AAAA,kCACjC,YAAY0D,GAAmBN,EAAK;AAAA,kCACpC,OAAO;AAAA,oCACL,YAAY;AAAA,oCACZ,GAAIwK,KACA,CAAA,IACA,EAAE,QAAQlU,MAAU,UAAA;AAAA,kCAAU;AAAA,kCAEpC,eAAewiB;AAAA,kCAEd,UAAAzgB,GAAM,IAAI,CAACG,IAAM+H,OAChB,gBAAAvhB;AAAA,oCAAC;AAAA,oCAAA;AAAA,sCAEC,GAAGq6B;AAAA,sCACH,GAAGtyB,KAAKsZ,KAAc,KAAKE,KAAQ,OAAOH;AAAA,sCAC1C,kBAAiB;AAAA,sCAEhB,UAAA5H,MAAQ;AAAA,oCAAA;AAAA,oCALJ+H;AAAA,kCAAA,CAOR;AAAA,gCAAA;AAAA,8BAAA;AAAA,4BACH;AAAA,0BAAA;AAAA,0BAzCKlM,EAAM;AAAA,wBAAA;AAAA,sBA4CjB;AACA,4BAAMklB,IAAc7c,GAAuBrI,EAAM,IAAI,GAC/CmlB,KAAUnlB,EAAM,SAAS,QACzB0J,KAAa0a,KAAY7a,GACzB2a,KAAgB5b;AAAA,wBACpBtI;AAAA,wBACAuI;AAAA,wBACAyC,GAAoB,IAAIhL,EAAM,EAAE;AAAA,sBAAA,GAE5BolB,KAAe5b;AAAA,wBACnB2b,KAAU,YAAYjB;AAAA,wBACtBxa;AAAA,sBAAA;AAEF,6BACE,gBAAA/e;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,GAAG+3B,GAAW1iB,CAAK;AAAA,0BACnB,MACEmlB,KACI,QAAQ/H,EAAc,MACtB5T,GAAyB0a,IAAexa,EAAU;AAAA,0BAExD,aACEyb,KACI,IACA9b;AAAA,4BACErJ,EAAM;AAAA,4BACNklB;AAAA,4BACAxb;AAAA,0BAAA;AAAA,0BAGR,QAAQA,KAAa0b,KAAe;AAAA,0BACpC,aACEhB,IAAW,MAAMrd,KAAOwC,IAAU,IAAIxC,KAAO,IAAIA;AAAA,0BAEnD,iBACEoe,MAAW,CAACf,KAAY,CAAC7a,IACrB,GAAG,IAAIxC,EAAI,IAAI,IAAIA,EAAI,KACvB;AAAA,0BAEN,eAAe0d;AAAA,0BACf,OAAOtO,KAAe,SAAYlU,KAAS,EAAE,QAAAA,OAAW;AAAA,0BACvD,GAAG2iB;AAAA,wBAAA;AAAA,wBA3BC5kB,EAAM;AAAA,sBAAA;AAAA,oBA8BjB,CAAC;AAAA,oBAEAyf,GAAiB,IAAI,CAACtU,MACrB,gBAAAxgB;AAAA,sBAAC8gB;AAAA,sBAAA;AAAA,wBAEC,SAAAN;AAAA,wBACA,eAAAE;AAAA,sBAAA;AAAA,sBAFK,kBAAkBF,EAAQ,OAAO;AAAA,oBAAA,CAIzC;AAAA,oBAGAvf,GAAqBzB,GAAM0B,CAAS,KACnCwxB,KACA,CAACvY,GAAauY,CAAa,KAC3BpkB,GAAgBqkB,MAAmBD,EAAc,QAAQ,EAAE;AAAA,sBACzD,CAACvuB,GAAMu2B,MAAO;AACZ,8BAAM91B,IAAIV,GAAUC,CAAI,GAClBw2B,IAA2B,CAAA;AACjC,iCAASC,IAAK,GAAGA,IAAKh2B,GAAGg2B,KAAM;AAC7B,gCAAMl2B,IAAOP,EAAK,MAAMy2B,CAAE,GACpBp2B,IAAOJ,GAASD,GAAMy2B,CAAE,GACxBn2B,KAAKH,GAAOH,GAAMy2B,CAAE,GACpBhc,MACJ0Q,MAAA,gBAAAA,GAAa,eAAcoL,KAAMpL,GAAY,cAAcsL,GACvDC,KAAUt2B,GAAYJ,GAAMy2B,CAAE;AACpC,8BAAIp7B,MAAS,aACbm7B,EAAM;AAAA,4BACJ,gBAAA36B;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCAEC,GAAG66B;AAAA,gCACH,MAAK;AAAA,gCACL,QAAO;AAAA,gCACP,aAAanK,EAAQlJ,KAAgB,CAAC;AAAA,gCACtC,eAAc;AAAA,gCACd,OAAO;AAAA,kCACL,QAAQgI,MAAA,QAAAA,GAAW,WAAW,aAAa;AAAA,gCAAA;AAAA,gCAE7C,gBAAgB,CAACppB,MACf+tB,GAAYuG,GAAIE,GAAIx0B,EAAE,SAASA,EAAE,OAAO;AAAA,gCAE1C,eAAe,CAACA,MACd+tB,GAAYuG,GAAIE,GAAIx0B,EAAE,SAASA,EAAE,OAAO;AAAA,gCAE1C,gBAAgB,MACdmpB;AAAA,kCAAe,CAACxjB,OACdA,KAAA,gBAAAA,EAAM,eAAc2uB,KAAM3uB,EAAK,cAAc6uB,IACzC,OACA7uB;AAAA,gCAAA;AAAA,gCAGR,eAAe,CAAC3F,MAAM;AACpB,sCAAI5G,MAAS,SAAU;AACvB,wCAAM4d,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpC00B,KAAYxsB;AAAA,oCAChBqkB,MAAmBD,EAAc;AAAA,kCAAA,EACjCgI,CAAE;AACJ,kCAAA7G;AAAA,oCACE6G;AAAA,oCACAE;AAAA,oCACAE,KACItsB,GAAgBssB,IAAWF,GAAIxd,CAAK,IACpCA;AAAA,oCACJhX;AAAA,kCAAA;AAAA,gCAEJ;AAAA,8BAAA;AAAA,8BApCK,YAAYssB,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,4BAAA;AAAA,0BAqC/C,GAEEhc,MAAW0Q,MAAe,EAACE,MAAA,QAAAA,GAAW,YAAU;AAClD,kCAAM3K,IAAUyK,GAAY,OACtByL,IAAOrK,EAAQ,CAAC;AACtB,4BAAAiK,EAAM;AAAA,8BACJ,gBAAA36B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCAEC,GAAG66B;AAAA,kCACH,MAAK;AAAA,kCACL,QAAQzc;AAAA,kCACR,aAAasS,EAAQ,EAAE;AAAA,kCACvB,eAAe;AAAA,kCACf,eAAc;AAAA,kCACd,gBAAe;AAAA,kCACf,eAAc;AAAA,gCAAA;AAAA,gCART,aAAagC,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,8BAAA;AAAA,8BAUhD,gBAAA56B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCAEC,GAAG66B;AAAA,kCACH,MAAK;AAAA,kCACL,QAAQzc;AAAA,kCACR,aAAasS,EAAQ,GAAG;AAAA,kCACxB,eAAc;AAAA,kCACd,gBAAe;AAAA,kCACf,eAAc;AAAA,gCAAA;AAAA,gCAPT,WAAWgC,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,8BAAA;AAAA,8BAS9C,gBAAAt6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCAEC,WAAU;AAAA,kCACV,eAAc;AAAA,kCAEd,UAAA;AAAA,oCAAA,gBAAAN;AAAA,sCAAC;AAAA,sCAAA;AAAA,wCACC,IAAI6kB,EAAQ;AAAA,wCACZ,IAAIA,EAAQ;AAAA,wCACZ,GAAG6L,EAAQ,CAAC;AAAA,wCACZ,MAAK;AAAA,wCACL,QAAQtS;AAAA,wCACR,aAAasS,EAAQ,CAAC;AAAA,sCAAA;AAAA,oCAAA;AAAA,oCAExB,gBAAA1wB;AAAA,sCAAC;AAAA,sCAAA;AAAA,wCACC,GAAG,KAAK6kB,EAAQ,CAAC,IAAIA,EAAQ,IAAIkW,CAAI,MAAMlW,EAAQ,CAAC,IAAIA,EAAQ,IAAIkW,CAAI,MAAMlW,EAAQ,IAAIkW,CAAI,IAAIlW,EAAQ,CAAC,MAAMA,EAAQ,IAAIkW,CAAI,IAAIlW,EAAQ,CAAC;AAAA,wCAC9I,MAAK;AAAA,wCACL,QAAQzG;AAAA,wCACR,aAAasS,EAAQ,CAAC;AAAA,wCACtB,eAAc;AAAA,sCAAA;AAAA,oCAAA;AAAA,kCAChB;AAAA,gCAAA;AAAA,gCAlBK,YAAYgC,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,8BAAA;AAAA,4BAmB/C;AAAA,0BAEJ;AAEA,8BAAKh5B,GAAkBpC,CAAI;AAC3B,iCAAIkF,KAAA,gBAAAA,EAAM,UAAS,SAAS;AAC1B,oCAAMs2B,KAAK5L,MAAA,gBAAAA,GAAgB,eAAcsL,KACvCtL,GAAe,cAAcwL,KAC7BxL,GAAe,WAAW,GACtB6L,KAAK7L,MAAA,gBAAAA,GAAgB,eAAcsL,KACvCtL,GAAe,cAAcwL,KAC7BxL,GAAe,WAAW;AAC5B,8BAAAuL,EAAM;AAAA,gCACJ,gBAAA36B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIwE,EAAK;AAAA,oCACT,IAAIA,EAAK;AAAA,oCACT,IAAIE,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAO;AAAA,oCACP,aAAagsB,EAAQ5I,EAAmB;AAAA,oCACxC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,YAAY4K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU/C,gBAAA56B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIwE,EAAK;AAAA,oCACT,IAAIA,EAAK;AAAA,oCACT,IAAIE,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAQ0Z;AAAA,oCACR,aAAasS,EAAQ7I,EAAc;AAAA,oCACnC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,OAAO6K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU1C,gBAAA56B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIyE,GAAG;AAAA,oCACP,IAAIA,GAAG;AAAA,oCACP,IAAIC,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAO;AAAA,oCACP,aAAagsB,EAAQ5I,EAAmB;AAAA,oCACxC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,YAAY4K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU/C,gBAAA56B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIyE,GAAG;AAAA,oCACP,IAAIA,GAAG;AAAA,oCACP,IAAIC,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAQ0Z;AAAA,oCACR,aAAasS,EAAQ7I,EAAc;AAAA,oCACnC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,OAAO6K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU1C,gBAAA56B;AAAA,kCAACsoB;AAAA,kCAAA;AAAA,oCAEC,IAAI5jB,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,GAAGgsB,EAAQsK,IAAKrT,KAAuBD,EAAW;AAAA,oCAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,oCAC3B,MAAMoT,IAAK5c,KAAqB;AAAA,oCAChC,QAAQA;AAAA,oCACR,aAAasS,EAAQjJ,EAAgB;AAAA,oCACrC,QAAO;AAAA,oCACP,eAAe,CAACrhB,OAAM;AAGpB,sCAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACGxE,GAAkBpC,CAAI,KAC3B00B,GAAkBwG,GAAIE,CAAE;AAAA,oCAC1B;AAAA,oCACA,eAAe,CAACx0B,OAAM;AACpB,0CAAKxE,GAAkBpC,CAAI,GAE3B;AAAA,4CADA4G,GAAE,gBAAA,GACEA,GAAE,UAAU,GAAG;AACjB,0CAAA8tB,GAAkBwG,GAAIE,CAAE;AACxB;AAAA,wCACF;AACA,wCAAAvL,GAAkB;AAAA,0CAChB,WAAWqL;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT,GACDzL,GAAkB,IAAI,GACtBF,GAAc;AAAA,0CACZ,MAAM;AAAA,0CACN,SAASyD,EAAc;AAAA,0CACvB,WAAWgI;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT;AAAA;AAAA,oCACH;AAAA,kCAAA;AAAA,kCAnCK,MAAMlI,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAqCzC,gBAAA56B;AAAA,kCAACsoB;AAAA,kCAAA;AAAA,oCAEC,IAAI5jB,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,GAAGgsB,EAAQuK,IAAKtT,KAAuBD,EAAW;AAAA,oCAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,oCAC3B,MAAMqT,IAAK7c,KAAqB;AAAA,oCAChC,QAAQA;AAAA,oCACR,aAAasS,EAAQjJ,EAAgB;AAAA,oCACrC,QAAO;AAAA,oCACP,eAAe,CAACrhB,OAAM;AAGpB,sCAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACGxE,GAAkBpC,CAAI,KAC3B00B,GAAkBwG,GAAIE,CAAE;AAAA,oCAC1B;AAAA,oCACA,eAAe,CAACx0B,OAAM;AACpB,0CAAKxE,GAAkBpC,CAAI,GAE3B;AAAA,4CADA4G,GAAE,gBAAA,GACEA,GAAE,UAAU,GAAG;AACjB,0CAAA8tB,GAAkBwG,GAAIE,CAAE;AACxB;AAAA,wCACF;AACA,wCAAAvL,GAAkB;AAAA,0CAChB,WAAWqL;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT,GACDzL,GAAkB,IAAI,GACtBF,GAAc;AAAA,0CACZ,MAAM;AAAA,0CACN,SAASyD,EAAc;AAAA,0CACvB,WAAWgI;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT;AAAA;AAAA,oCACH;AAAA,kCAAA;AAAA,kCAnCK,MAAMlI,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,8BAoCzC;AAAA,4BAEJ,OAAO;AACL,oCAAMn1B,IAAM;AAAA,gCACV,IAAIjB,EAAK,IAAIC,GAAG,KAAK;AAAA,gCACrB,IAAID,EAAK,IAAIC,GAAG,KAAK;AAAA,8BAAA;AAEvB,8BAAAk2B,EAAM;AAAA,gCACJ,gBAAA36B;AAAA,kCAACsoB;AAAA,kCAAA;AAAA,oCAEC,IAAI7iB,EAAI;AAAA,oCACR,IAAIA,EAAI;AAAA,oCACR,GAAGirB,EAAQ3I,EAAS;AAAA,oCACpB,MAAM2I,EAAQ9I,EAAa;AAAA,oCAC3B,MAAK;AAAA,oCACL,QAAQxJ;AAAA,oCACR,aAAasS,EAAQjJ,EAAgB;AAAA,oCACrC,QAAO;AAAA,oCACP,eAAe,CAACrhB,MAAM;;AACpB,sCAAKxE,GAAkBpC,CAAI,MAC3B4G,EAAE,gBAAA,GACF+oB,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBN,GAAc;AAAA,wCACZ,MAAM;AAAA,wCACN,SAASyD,EAAc;AAAA,wCACvB,WAAWgI;AAAA,wCACX,WAAWE;AAAA,sCAAA,CACZ,IACDltB,MAAA5P,KAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,GAAA,KAAA5P,IAAoCsI,EAAE;AAAA,oCACxC;AAAA,kCAAA;AAAA,kCAtBK,QAAQssB,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,8BAuB3C;AAAA,4BAEJ;AAAA,wBACF;AACA,+BAAKj5B,GAAkBnC,CAAI,KAC3B2E,EAAK,QAAQ,QAAQ,CAAC4M,GAAQmqB,MAAO;AACnC,8BACEx5B,GAAgBlC,CAAI,KACpB,CAAC2E,EAAK,WACL+2B,MAAO,KAAKA,MAAO/2B,EAAK,QAAQ,SAAS;AAE1C;AAEF,gCAAMs1B,KACJvK,MAAA,gBAAAA,GAAgB,kBAAiBwL,MACjCxL,MAAA,gBAAAA,GAAgB,iBAAgBgM;AAClC,0BAAAP,EAAM;AAAA,4BACJ,gBAAA36B;AAAA,8BAACsoB;AAAA,8BAAA;AAAA,gCAEC,IAAIvX,EAAO;AAAA,gCACX,IAAIA,EAAO;AAAA,gCACX,GAAG2f,EAAQ+I,IAAWlS,KAAuBD,EAAW;AAAA,gCACxD,MAAMoJ,EAAQlJ,EAAa;AAAA,gCAC3B,MAAMiS,IAAWrb,KAAqB;AAAA,gCACtC,QAAQA;AAAA,gCACR,aAAasS,EAAQjJ,EAAgB;AAAA,gCACrC,QAAO;AAAA,gCACP,eAAe,CAACrhB,OAAM;AAGpB,kCAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACGzE,GAAkBnC,CAAI,KAC3Bu0B,GAAkB2G,GAAIQ,CAAE;AAAA,gCAC1B;AAAA,gCACA,eAAe,CAAC90B,OAAM;AACpB,sCAAKzE,GAAkBnC,CAAI,GAE3B;AAAA,wCADA4G,GAAE,gBAAA,GACEA,GAAE,UAAU,GAAG;AACjB,sCAAA2tB,GAAkB2G,GAAIQ,CAAE;AACxB;AAAA,oCACF;AACA,oCAAA/L,GAAkB,EAAE,cAAcuL,GAAI,aAAaQ,GAAI,GACvD7L,GAAkB,IAAI,GACtBJ,GAAc;AAAA,sCACZ,MAAM;AAAA,sCACN,SAASyD,EAAc;AAAA,sCACvB,cAAcgI;AAAA,sCACd,aAAaQ;AAAA,oCAAA,CACd;AAAA;AAAA,gCACH;AAAA,8BAAA;AAAA,8BA9BK,KAAKxI,EAAc,EAAE,IAAIgI,CAAE,IAAIQ,CAAE;AAAA,4BAAA;AAAA,0BA+BxC;AAAA,wBAEJ,CAAC,GACMP;AAAA,sBACT;AAAA,oBAAA;AAAA,oBAGHnP,MAAgBmJ,KACf,gBAAA30B;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,GAAG20B;AAAA,wBACH,MAAK;AAAA,wBACL,QAAQvW;AAAA,wBACR,aAAa,IAAIhC;AAAA,wBACjB,OAAOiM,GAAkB,IAAIjM,EAAI;AAAA,wBACjC,eAAc;AAAA,wBACd,eAAe;AAAA,wBACf,eAAc;AAAA,sBAAA;AAAA,oBAAA,IAEd;AAAA,oBAEHoP,MAAgBgN,KACf,gBAAAl4B,EAAC,KAAA,EAAE,eAAc,QACf,UAAA;AAAA,sBAAA,gBAAAN;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,GAAGw4B;AAAA,0BACH,MAAK;AAAA,0BACL,QAAQpa;AAAA,0BACR,aAAasS,EAAQ,EAAE;AAAA,0BACvB,OAAOrI,GAAkBqI,EAAQ,EAAE,CAAC;AAAA,0BACpC,eAAe;AAAA,0BACf,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEhB,gBAAA1wB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,GAAGw4B;AAAA,0BACH,MAAK;AAAA,0BACL,QAAO;AAAA,0BACP,aAAa,IAAIpc;AAAA,0BACjB,OAAOiM,GAAkB,IAAIjM,EAAI;AAAA,0BACjC,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEf7c,GAAiBC,CAAI,KAAKi5B,MAAe,CAAC/J,KACzC,gBAAApuB,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA;AAAA,wBAAA,gBAAAN;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,IAAIy4B,GAAY;AAAA,4BAChB,IAAIA,GAAY;AAAA,4BAChB,GAAG/H,EAAQ,CAAC;AAAA,4BACZ,MAAK;AAAA,4BACL,QAAQtS;AAAA,4BACR,aAAasS,EAAQ,CAAC;AAAA,0BAAA;AAAA,wBAAA;AAAA,wBAExB,gBAAA1wB;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,GAAG,KAAKy4B,GAAY,CAAC,IAAIA,GAAY,IAAI/H,EAAQ,CAAC,CAAC,MAAM+H,GAAY,CAAC,IAAIA,GAAY,IAAI/H,EAAQ,CAAC,CAAC,MAAM+H,GAAY,IAAI/H,EAAQ,CAAC,CAAC,IAAI+H,GAAY,CAAC,MAAMA,GAAY,IAAI/H,EAAQ,CAAC,CAAC,IAAI+H,GAAY,CAAC;AAAA,4BACtM,MAAK;AAAA,4BACL,QAAQra;AAAA,4BACR,aAAasS,EAAQ,CAAC;AAAA,4BACtB,eAAc;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAChB,EAAA,CACF,IACE;AAAA,oBAAA,EAAA,CACN,IACE;AAAA,oBAEHlF,MAAgBoN,MACb,gBAAAt4B,EAAC,KAAA,EAAE,eAAc,QACf,UAAA;AAAA,sBAAA,gBAAAN;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,IAAI44B,GAAW,KAAK;AAAA,0BACpB,IAAIA,GAAW,KAAK;AAAA,0BACpB,IAAIA,GAAW,GAAG;AAAA,0BAClB,IAAIA,GAAW,GAAG;AAAA,0BAClB,QAAQxa;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,OAAOiM,GAAkB,IAAIjM,EAAI;AAAA,0BACjC,eAAe;AAAA,0BACf,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,uBAEdsS,MAAYb,OACZ,gBAAA7tB;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BACC,IAAIsQ,GAAW,GAAG;AAAA,0BAClB,IAAIA,GAAW,GAAG;AAAA,0BAClB,GAAGlI,EAAQuH,KAAW/Q,KAAuBD,EAAW;AAAA,0BACxD,MAAMyJ,EAAQvJ,EAAa;AAAA,0BAC3B,MAAM8Q,KAAW,YAAY7Z;AAAA,0BAC7B,aAAa;AAAA,0BACb,QAAO;AAAA,0BACP,aAAasS,EAAQtJ,EAAgB;AAAA,0BACrC,QAAO;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACT,GAEJ;AAAA,oBAGHoE,MAAgBmC,MACf,gBAAA3tB;AAAA,sBAACsoB;AAAA,sBAAA;AAAA,wBACC,IAAIqF,GAAgB;AAAA,wBACpB,IAAIA,GAAgB;AAAA,wBACpB,GAAG+C,EAAQzJ,EAAW;AAAA,wBACtB,MAAMyJ,EAAQvJ,EAAa;AAAA,wBAC3B,MAAK;AAAA,wBACL,aAAa;AAAA,wBACb,QAAO;AAAA,wBACP,aAAauJ,EAAQtJ,EAAgB;AAAA,wBACrC,QAAO;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAIVoE,MAAgB5pB,GAAkBpC,CAAI,IACnC0F,EAAM,OAAO,CAACR,MAASA,EAAK,OAAOsrB,EAAmB,EAAE,IAAI,CAACtrB,MAAS;AACpE,0BAAI,CAACqf,GAAoBrf,CAAI,EAAG,QAAO;AACvC,4BAAMF,IAAOiwB,GAAkB,IAAI/vB,EAAK,YAAY,GAC9CD,IAAKgwB,GAAkB,IAAI/vB,EAAK,UAAU;AAChD,0BAAI,CAACF,KAAQ,CAACC,KAAMD,EAAK,YAAYC,EAAG,QAAS,QAAO;AACxD,4BAAMyf,IAAQ2Q,GAAkBnwB,GAAM8f,IAAYiQ,EAAiB;AACnE,0BAAIvQ,GAAO;AACT,8BAAM8W,KACJzN,MAAA,gBAAAA,GAAqB,YAAW7oB,EAAK,MACrC6oB,GAAoB,WAAW,GAC3B0N,KACJ1N,MAAA,gBAAAA,GAAqB,YAAW7oB,EAAK,MACrC6oB,GAAoB,WAAW,GAC3B4N,KAAc,CAClBjrB,IACA2H,OACG;;AACH,8BAAI,EAAAqS,KAAY,CAACc,KAEjB;AAAA,gCADAnT,GAAM,gBAAA,GACFA,GAAM,UAAU,GAAG;AACrB,8BAAAmT,GAAmBtmB,EAAK,IAAI,IAAI,GAChC8oB,GAAuB,IAAI,GAC3BF,GAAkB,IAAI;AACtB;AAAA,4BACF;AACA,4BAAAE,GAAuB,EAAE,QAAQ9oB,EAAK,IAAI,QAAAwL,IAAQ,GAClDod,GAAkB,EAAE,MAAM,UAAU,QAAQ5oB,EAAK,IAAI,QAAAwL,IAAQ,IAC7DxC,KAAA5P,IAAA2tB,EAAO,YAAP,gBAAA3tB,EAAgB,sBAAhB,QAAA4P,EAAA,KAAA5P,GAAoC+Z,GAAM;AAAA;AAAA,wBAC5C;AACA,iDACG,KAAA,EACC,UAAA;AAAA,0BAAA,gBAAA7X;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIwE,EAAK;AAAA,8BACT,IAAIA,EAAK;AAAA,8BACT,IAAI0f,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAO;AAAA,8BACP,aAAawM,EAAQ5I,EAAmB;AAAA,8BACxC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA9nB;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIwE,EAAK;AAAA,8BACT,IAAIA,EAAK;AAAA,8BACT,IAAI0f,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAQ9F;AAAA,8BACR,aAAasS,EAAQ7I,EAAc;AAAA,8BACnC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA7nB;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIyE,EAAG;AAAA,8BACP,IAAIA,EAAG;AAAA,8BACP,IAAIyf,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAO;AAAA,8BACP,aAAawM,EAAQ5I,EAAmB;AAAA,8BACxC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA9nB;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIyE,EAAG;AAAA,8BACP,IAAIA,EAAG;AAAA,8BACP,IAAIyf,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAQ9F;AAAA,8BACR,aAAasS,EAAQ7I,EAAc;AAAA,8BACnC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA7nB;AAAA,4BAACsoB;AAAA,4BAAA;AAAA,8BACC,IAAIpE,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,GAAGwM,EAAQsK,IAAKrT,KAAuBD,EAAW;AAAA,8BAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,8BAC3B,MAAMoT,IAAK5c,KAAqB;AAAA,8BAChC,QAAQA;AAAA,8BACR,aAAasS,EAAQjJ,EAAgB;AAAA,8BACrC,QAAO;AAAA,8BACP,eAAe,CAAC5P,OAAU;AAGxB,gCAFAA,GAAM,gBAAA,GACNA,GAAM,eAAA,GACF,EAAAqS,KAAY,CAACc,QACjBA,GAAmBtmB,EAAK,IAAI,IAAI,GAChC8oB,GAAuB,IAAI,GAC3BF,GAAkB,IAAI;AAAA,8BACxB;AAAA,8BACA,eAAe,CAACzV,OAAUsjB,GAAY,GAAGtjB,EAAK;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhD,gBAAA7X;AAAA,4BAACsoB;AAAA,4BAAA;AAAA,8BACC,IAAIpE,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,GAAGwM,EAAQuK,IAAKtT,KAAuBD,EAAW;AAAA,8BAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,8BAC3B,MAAMqT,IAAK7c,KAAqB;AAAA,8BAChC,QAAQA;AAAA,8BACR,aAAasS,EAAQjJ,EAAgB;AAAA,8BACrC,QAAO;AAAA,8BACP,eAAe,CAAC5P,OAAU;AAGxB,gCAFAA,GAAM,gBAAA,GACNA,GAAM,eAAA,GACF,EAAAqS,KAAY,CAACc,QACjBA,GAAmBtmB,EAAK,IAAI,IAAI,GAChC8oB,GAAuB,IAAI,GAC3BF,GAAkB,IAAI;AAAA,8BACxB;AAAA,8BACA,eAAe,CAACzV,OAAUsjB,GAAY,GAAGtjB,EAAK;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBAChD,EAAA,GA9EM,eAAenT,EAAK,EAAE,EA+E9B;AAAA,sBAEJ;AACA,4BAAMe,IAAM,EAAE,IAAIjB,EAAK,IAAIC,EAAG,KAAK,GAAG,IAAID,EAAK,IAAIC,EAAG,KAAK,EAAA;AAC3D,6BACE,gBAAAzE;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BAEC,IAAI7iB,EAAI;AAAA,0BACR,IAAIA,EAAI;AAAA,0BACR,GAAGirB,EAAQ3I,EAAS;AAAA,0BACpB,MAAM2I,EAAQ9I,EAAa;AAAA,0BAC3B,MAAK;AAAA,0BACL,QAAQxJ;AAAA,0BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BACrC,QAAO;AAAA,0BACP,eAAe,CAAC5P,MAAU;;AACxB,4BAAIqS,KAAY,CAACc,OACjBnT,EAAM,gBAAA,GACN2V,GAAuB,IAAI,GAC3BF,GAAkB,EAAE,MAAM,QAAQ,QAAQ5oB,EAAK,IAAI,IACnDgJ,MAAA5P,IAAA2tB,EAAO,YAAP,gBAAA3tB,EAAgB,sBAAhB,QAAA4P,GAAA,KAAA5P,GAAoC+Z,EAAM;AAAA,0BAC5C;AAAA,wBAAA;AAAA,wBAfK,cAAcnT,EAAK,EAAE;AAAA,sBAAA;AAAA,oBAkBhC,CAAC,IACD;AAAA,oBAEH8mB,MACCvmB,EACG,OAAO,CAAC6f,MAAWzB,GAAsBzlB,CAAK,KAAKknB,EAAO,WAAW,IAAI,EACzE,IAAI,CAACA,MAAW;AACnB,4BAAM2U,IAAW9P,EAAkB,SAAS7E,EAAO,EAAE,GAC/ClG,IAAUgR,OAAoB9K,EAAO,IACrCsW,IAAYtW,EAAO,WAAW,MAC9BuW,IAAYjH,GAAmB,IAAItP,EAAO,EAAE,GAC5CwW,IAAgB7G,GAAkB,IAAI3P,EAAO,EAAE,KAAKA,GACpDyW,IAActO,MAAenI,EAAO,MAAM0P,MAAiB,MAC3DgH,KACJ/B,KACA9P,EAAkB,KAAK,CAACrT,OAAO;AAC7B,4BAAIA,OAAOwO,EAAO,GAAI,QAAO;AAC7B,8BAAMrS,IAAQ+R,GAAW,IAAIlO,EAAE;AAC/B,+BACE7D,KACA,KAAK;AAAA,0BACHA,EAAM,IAAI6oB,EAAc;AAAA,0BACxB7oB,EAAM,IAAI6oB,EAAc;AAAA,wBAAA,KACrB;AAAA,sBAET,CAAC,GACGG,KAAOhC,KAAY2B,IAAYlU,KAAuBD;AAC5D,+CACG,KAAA,EACD,UAAA,gBAAAjnB;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BACC,IAAIgT,EAAc;AAAA,0BAClB,IAAIA,EAAc;AAAA,0BAClB,GAAG5K,EAAQ+K,EAAI;AAAA,0BACf,MAAM/K,EAAQ7N,EAAwB;AAAA,0BACtC,MACE0Y,KAEIC,KADA,YAGAJ,IACExc,IACE,YACAyI,KACFoS,IACE7a,IACE,YACAR,KACFQ,IACE,YACA;AAAA,0BAEZ,aAAa;AAAA,0BACb,QAAQ6a,KAAY2B,IAAYhd,KAAqB;AAAA,0BACrD,aAAasS,EAAQtJ,EAAgB;AAAA,0BACrC,QACEoE,KACI,SACAtB,IACE,YACA+C,MAAenI,EAAO,KACpB,aACA;AAAA,0BAEV,gBAAgB,MAAM;AACpB,4BAAKoF,KAAU2F,GAAmB/K,EAAO,EAAE;AAAA,0BAC7C;AAAA,0BACA,gBAAgB,MACd+K,GAAmB,CAACvZ,OAAQA,OAAOwO,EAAO,KAAK,OAAOxO,EAAG;AAAA,0BAE3D,eAAe,CAAClQ,OAAM;AAGpB,4BAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACG1G,GAAwBF,CAAI,KACjC02B,GAAuBpR,EAAO,EAAE;AAAA,0BAClC;AAAA,0BACA,eAAe,CAAC1e,OAAM;;AAGpB,gCAFAA,GAAE,gBAAA,GACE8jB,KAAY,CAACsB,MACb9rB,GAAwBF,CAAI,KAAK4G,GAAE,UAAU,EAAG;AACpD,kCAAMgX,IAAQsW,GAAQttB,GAAE,SAASA,GAAE,OAAO,GACpCqwB,IAAe7R,GAAmB3f,GAAS4oB,EAAgB,GAC3DhI,KAAOd;AAAA,8BACX3H;AAAA,8BACAnY;AAAA,8BACAC;AAAA,8BACAuxB;AAAA,8BACA/F,EAAQ7N,EAAwB;AAAA,8BAChC2B;AAAA,4BAAA;AAEF,gCAAIqJ,IAAkB;AACpB,kCACE4I,EAAa,IAAI3R,EAAO,EAAE,MAC1Be,MAAA,gBAAAA,GAAM,UAAS,WACfA,MAAA,gBAAAA,GAAM,UAAS;AAEf;AAEF,mCAAIA,MAAA,gBAAAA,GAAM,UAAS,WAAUA,MAAA,gBAAAA,GAAM,UAAS,YAAY;AACtD,gCAAA+E;AAAA,kCACEiD,GAAiB;AAAA,kCACjBA,GAAiB;AAAA,kCACjBhI,GAAK;AAAA,kCACL6K,EAAQ7N,EAAwB;AAAA,gCAAA,GAElCiL,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AACpB;AAAA,8BACF;AACA,kCAAIyI,EAAa,IAAI3R,EAAO,EAAE,EAAG;AACjC,8BAAA8F;AAAA,gCACEiD,GAAiB;AAAA,gCACjBA,GAAiB;AAAA,gCACjB,EAAE,GAAGyN,EAAc,GAAG,GAAGA,EAAc,EAAA;AAAA,gCACvC5K,EAAQ7N,EAAwB;AAAA,8BAAA,GAElCiL,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AACpB;AAAA,4BACF;AACA,iCAAInI,MAAA,gBAAAA,GAAM,UAAS,UAAUtmB,GAAiBC,CAAI,GAAG;AACnD,8BAAAs2B,GAAwBjQ,GAAK,QAAQA,GAAK,KAAK;AAC/C;AAAA,4BACF;AACA,gCAAItmB,GAAiBC,CAAI,KAAKmuB,IAAiB;AAC7C,8BAAArD,GAAmBqD,IAAiB7I,EAAO,EAAE,GAC7C8I,GAAmB,IAAI,GACvBF,GAAmB9tB,GAAqBJ,GAAMslB,EAAO,EAAE,CAAC,GACxDkJ,GAAgB,EAAE,GAAGsN,EAAc,GAAG,GAAGA,EAAc,GAAG,GAC1DnL,GAAc,CAACrL,EAAO,EAAE,CAAC;AACzB;AAAA,4BACF;AACA,gCACEvlB,GAAiBC,CAAI,KACrBiuB,MAAmB,QACnBA,OAAoB3I,EAAO,IAC3B;AACA,8BAAA0F,MAAA,QAAAA,GAAqBiD,IAAiB3I,EAAO,KAC7C4I,GAAmB9tB,GAAqBJ,GAAMslB,EAAO,EAAE,CAAC,GACxDkJ,GAAgB,EAAE,GAAGsN,EAAc,GAAG,GAAGA,EAAc,GAAG,GAC1DnL,GAAc,CAACrL,EAAO,EAAE,CAAC;AACzB;AAAA,4BACF;AACA,gCAAIvlB,GAAiBC,CAAI,KAAK47B,KAAa,CAACC,GAAW;AACrD,8BAAAzN,GAAmB,IAAI,GACvBF,GAAmB,IAAI,GACvBI,GAAoB;AAAA,gCAClB,SAAShJ,EAAO;AAAA,gCAChB,QAAQ,EAAE,GAAGwW,EAAc,GAAG,GAAGA,EAAc,EAAA;AAAA,8BAAE,CAClD,GACDtN,GAAgB,EAAE,GAAGsN,EAAc,GAAG,GAAGA,EAAc,GAAG;AAC1D;AAAA,4BACF;AACA,4BAAA5N,GAAmB5I,EAAO,EAAE,GAC5BqL;AAAA,8BACE/pB,GAAE,WACEujB,EAAkB,SAAS7E,EAAO,EAAE,IAClC6E,EAAkB,OAAO,CAACrT,OAAOA,OAAOwO,EAAO,EAAE,IACjD,CAAC,GAAG6E,GAAmB7E,EAAO,EAAE,IAClC,CAACA,EAAO,EAAE;AAAA,4BAAA,GAEhBoI,EAAcpI,EAAO,EAAE,GACvBsI,GAAmB;AAAA,8BACjB,GAAGkO,EAAc;AAAA,8BACjB,GAAGA,EAAc;AAAA,4BAAA,CAClB,IACD5tB,MAAA5P,KAAAsI,GAAE,eAAc,sBAAhB,QAAAsH,GAAA,KAAA5P,IAAoCsI,GAAE;AAAA,0BACxC;AAAA,wBAAA;AAAA,sBAAA,EACF,GA3IQ0e,EAAO,EA4If;AAAA,oBAEJ,CAAC;AAAA,oBAEApjB,GAAgBlC,CAAI,KACnB,CAAC0qB,KACD0I,GAAgB,QAAQ,CAACvd,MAAU;AACjC,4BAAM3L,IAAQ4E,GAAgB+G,EAAM,QAAQ,GACtCslB,IAA2B,CAAA;AACjC,6BAAIx5B,GAAgB3B,CAAI,KACtBkK,EAAM,QAAQ,CAACvF,GAAMu2B,MAAO;AAC1B,8BAAM91B,IAAIV,GAAUC,CAAI;AACxB,iCAASy2B,IAAK,GAAGA,IAAKh2B,GAAGg2B,KAAM;AAC7B,gCAAMhc,MACJuP,MAAA,gBAAAA,GAAgB,aAAY9Y,EAAM,MAClC8Y,GAAe,cAAcuM,KAC7BvM,GAAe,cAAcyM;AAC/B,0BAAAD,EAAM;AAAA,4BACJ,gBAAA36B;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCAEC,GAAGuE,GAAYJ,GAAMy2B,CAAE;AAAA,gCACvB,MAAK;AAAA,gCACL,QAAQhc,KAAUR,KAAqB;AAAA,gCACvC,aAAasS,EAAQ9R,KAAU,KAAK4I,KAAgB,CAAC;AAAA,gCACrD,eAAe5I,KAAU,OAAO;AAAA,gCAChC,eAAc;AAAA,gCACd,OAAO,EAAE,QAAQ,OAAA;AAAA,gCACjB,gBAAgB,MACdwP;AAAA,kCAAkB,CAACriB,QACjBA,MAAA,gBAAAA,GAAM,aAAYsJ,EAAM,MACxBtJ,GAAK,cAAc2uB,KACnB3uB,GAAK,cAAc6uB,IACf,OACA7uB;AAAA,gCAAA;AAAA,gCAGR,eAAe,CAAC3F,OAAM;AACpB,kCAAAA,GAAE,gBAAA,GACFktB,GAAkBI,GAAQttB,GAAE,SAASA,GAAE,OAAO,CAAC;AAAA,gCACjD;AAAA,8BAAA;AAAA,8BApBK,UAAUiP,EAAM,EAAE,IAAIqlB,CAAE,IAAIE,CAAE;AAAA,4BAAA;AAAA,0BAqBrC;AAAA,wBAEJ;AAAA,sBACF,CAAC,GAEHxoB,GAAaiD,EAAM,QAAQ,EAAE,QAAQ,CAACjM,MAAQ;AAC5C,8BAAMkN,IAAK;AAAA,0BACT,SAASjB,EAAM;AAAA,0BACf,WAAWjM,EAAI;AAAA,0BACf,KAAKA,EAAI;AAAA,wBAAA,GAELya,IACJoK,MAAoB,QAAQrc,GAAYqc,IAAkB3X,CAAE,GACxD8f,IACJ/H,MAAoB,QAAQzc,GAAYyc,IAAkB/X,CAAE;AAC9D,wBAAAqkB,EAAM;AAAA,0BACJ,gBAAA36B;AAAA,4BAACsoB;AAAA,4BAAA;AAAA,8BAEC,IAAIlf,EAAI,MAAM;AAAA,8BACd,IAAIA,EAAI,MAAM;AAAA,8BACd,GAAGsnB,EAAQpJ,EAAW;AAAA,8BACtB,MAAMoJ,EAAQxI,EAAW;AAAA,8BACzB,MAAMrE,KAAWuS,IAAUhY,KAAqB;AAAA,8BAChD,QAAQA;AAAA,8BACR,aAAasS,EAAQjJ,EAAgB;AAAA,8BACrC,QAAO;AAAA,8BACP,eAAe,CAACrhB,OAAM;AACpB,gCAAAA,GAAE,gBAAA,GACFgtB,GAAehqB,EAAI,KAAK;AAAA,8BAC1B;AAAA,4BAAA;AAAA,4BAZK,UAAUiM,EAAM,EAAE,IAAIjM,EAAI,SAAS,IAAIA,EAAI,GAAG;AAAA,0BAAA;AAAA,wBAarD;AAAA,sBAEJ,CAAC,GACMuxB;AAAA,oBACT,CAAC;AAAA,oBAEFx5B,GAAgB3B,CAAI,KACnB2uB,MACA,CAACA,GAAe,UAChB,CAACE,MACD,CAACyE,GAAoB3E,GAAe,OAAOuC,EAAQxI,EAAW,CAAC,MAC9D,MAAM;AACL,4BAAM7S,IAAQud,GAAgB;AAAA,wBAC5B,CAAC5uB,MAAMA,EAAE,OAAOmqB,GAAe;AAAA,sBAAA;AAEjC,0BAAI,CAAC9Y,EAAO,QAAO;AACnB,4BAAMwP,IAAU7N;AAAA,wBACd3B,EAAM;AAAA,wBACN8Y,GAAe;AAAA,wBACfA,GAAe;AAAA,wBACfA,GAAe;AAAA,wBACfuC,EAAQzI,EAAiB;AAAA,sBAAA;AAE3B,0BAAI,CAACpD,EAAS,QAAO;AACrB,4BAAM6W,IAAehL,EAAQpJ,KAAc,CAAC;AAC5C,6BACEwL,GAAoBjO,EAAQ,IAAI6W,CAAY,KAC5C5I,GAAoBjO,EAAQ,IAAI6W,CAAY,IAErC,OAGP,gBAAAp7B,EAAC,KAAA,EAAE,eAAc,QACf,UAAA;AAAA,wBAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA,gBAAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,IAAI6kB,EAAQ,GAAG;AAAA,4BACf,IAAIA,EAAQ,GAAG;AAAA,4BACf,GAAG6L,EAAQ3I,EAAS;AAAA,4BACpB,MAAK;AAAA,4BACL,QAAQ3J;AAAA,4BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BAAA;AAAA,wBAAA,GAEzC;AAAA,wBACA,gBAAAznB,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA,gBAAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,IAAI6kB,EAAQ,GAAG;AAAA,4BACf,IAAIA,EAAQ,GAAG;AAAA,4BACf,GAAG6L,EAAQ3I,EAAS;AAAA,4BACpB,MAAK;AAAA,4BACL,QAAQ3J;AAAA,4BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BAAA;AAAA,wBAAA,EACvC,CACF;AAAA,sBAAA,GACF;AAAA,oBAEJ,GAAA;AAAA,oBAED/lB,GAAgBlC,CAAI,KACnByuB,MACAF,OACC,MAAM;;AACL,4BAAM1Y,IAAQud,GAAgB;AAAA,wBAC5B,CAAC5uB,MAAMA,EAAE,OAAOiqB,GAAiB;AAAA,sBAAA,GAE7BzpB,IAAO6Q,KACTvX,IAAAsU,GAAaiD,EAAM,QAAQ,EAAE;AAAA,wBAC3B,CAACjM,MACCA,EAAI,cAAc6kB,GAAiB,aACnC7kB,EAAI,QAAQ6kB,GAAiB;AAAA,sBAAA,MAHjC,gBAAAnwB,EAIG,QACH;AACJ,0BAAI,CAAC0G,EAAM,QAAO;AAClB,4BAAM4xB,IAAU/H,MAAoB;AACpC,6BACE,gBAAAruB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAIwE,EAAK;AAAA,0BACT,IAAIA,EAAK;AAAA,0BACT,IAAIupB,GAAa;AAAA,0BACjB,IAAIA,GAAa;AAAA,0BACjB,QAAQ3P;AAAA,0BACR,cAAcgY,IAAU,MAAM,KAAKha;AAAA,0BACnC,iBACEga,IAAU,SAAY,GAAG,IAAIha,EAAI,IAAI,IAAIA,EAAI;AAAA,0BAE/C,eAAc;AAAA,0BACd,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAGpB,GAAA;AAAA,oBAEDkQ,GAAQ,SAAS,KAAK/qB,GAAkB/B,CAAI,MAAM,MAAM;AACvD,4BAAM2Y,IAASL;AAAA,wBACbwU,GAAQ,CAAC;AAAA,wBACTA,GAAQA,GAAQ,SAAS,CAAC;AAAA,wBAC1BE;AAAA,sBAAA;AAEF,6BACE,gBAAAxsB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAImY,EAAO;AAAA,0BACX,IAAIA,EAAO;AAAA,0BACX,IAAI,KAAK,IAAIA,EAAO,IAAI,CAAC;AAAA,0BACzB,IAAI,KAAK,IAAIA,EAAO,IAAI,CAAC;AAAA,0BACzB,MAAMyF,EAAM;AAAA,0BACZ,aAAa;AAAA,0BACb,QAAQQ;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,0BACxC,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAGpB,GAAA;AAAA,oBACCkQ,GAAQ,SAAS,KAAK9sB,MAAS,eAC9B,gBAAAQ;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,GAAG,KAAK,IAAIssB,GAAQ,CAAC,EAAE,GAAGA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBACtC,GAAG,KAAK,IAAIA,GAAQ,CAAC,EAAE,GAAGA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBACtC,OAAO,KAAK,IAAIA,GAAQ,CAAC,EAAE,IAAIA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBAC3C,QAAQ,KAAK,IAAIA,GAAQ,CAAC,EAAE,IAAIA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBAC5C,MAAM1O,EAAM;AAAA,wBACZ,aAAa;AAAA,wBACb,QAAQQ;AAAA,wBACR,aAAa,IAAIhC;AAAA,wBACjB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAG3CyQ,MACC,gBAAA7sB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,IACE6sB,GAAU,SAAS,eACfA,GAAU,QAAQ,IAAI,MACtBA,GAAU,QAAQ;AAAA,wBAExB,IACEA,GAAU,SAAS,eACfA,GAAU,QAAQ,IAClBA,GAAU,QAAQ,IAAI;AAAA,wBAE5B,IACEA,GAAU,SAAS,eACfA,GAAU,QAAQ,IAAI,MACtBA,GAAU,QAAQ;AAAA,wBAExB,IACEA,GAAU,SAAS,eACfA,GAAU,QAAQ,IAClBA,GAAU,QAAQ,IAAI;AAAA,wBAE5B,QAAQzO;AAAA,wBACR,aAAa,OAAOhC;AAAA,wBACpB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,wBACxC,eAAc;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAGjB2Q,EAAc,SAAS,KAAK3rB,GAAkB5B,CAAI,KACjD,gBAAAc,EAAAq7B,IAAA,EACE,UAAA;AAAA,sBAAA,gBAAA37B;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,QAAQ+sB,EAAc,IAAI,CAACnpB,MAAM,GAAGA,EAAE,CAAC,IAAIA,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,0BAC1D,MAAK;AAAA,0BACL,QAAQwa;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEzCyc,MACC,gBAAA74B;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAI64B,GAAc,KAAK;AAAA,0BACvB,IAAIA,GAAc,KAAK;AAAA,0BACvB,IAAIA,GAAc,GAAG;AAAA,0BACrB,IAAIA,GAAc,GAAG;AAAA,0BACrB,QAAQza;AAAA,0BACR,cAAcmQ,KAAc,MAAM,KAAKnS;AAAA,0BACvC,iBACEmS,KAAc,SAAY,GAAG,IAAInS,EAAI,IAAI,IAAIA,EAAI;AAAA,0BAEnD,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGjB0c,MACC,gBAAA94B;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAI84B,GAAa,KAAK;AAAA,0BACtB,IAAIA,GAAa,KAAK;AAAA,0BACtB,IAAIA,GAAa,GAAG;AAAA,0BACpB,IAAIA,GAAa,GAAG;AAAA,0BACpB,QAAQ1a;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,eAAemS,KAAc,MAAM;AAAA,0BACnC,iBACEA,KAAc,SAAY,GAAG,IAAInS,EAAI,IAAI,IAAIA,EAAI;AAAA,0BAEnD,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGjB2Q,EAAc,IAAI,CAACnpB,GAAGoG,MAAM;AAC3B,8BAAMosB,IAAUjf,GAAcoX,IAAa3qB,CAAC;AAC5C,+BACE,gBAAA5D;AAAA,0BAACsoB;AAAA,0BAAA;AAAA,4BAEC,IAAI1kB,EAAE;AAAA,4BACN,IAAIA,EAAE;AAAA,4BACN,GAAG8sB,EAAQ1mB,MAAM,IAAIud,KAAuBD,EAAW;AAAA,4BACvD,MAAMoJ,EAAQxI,EAAW;AAAA,4BACzB,MAAMle,MAAM,KAAKosB,IAAUhY,KAAqB;AAAA,4BAChD,QAAQA;AAAA,4BACR,aAAasS,EAAQjJ,EAAgB;AAAA,4BACrC,QAAO;AAAA,0BAAA;AAAA,0BARF,MAAMzd,CAAC;AAAA,wBAAA;AAAA,sBAWlB,CAAC;AAAA,sBACAukB,MACC,CAACxB,EAAc,KAAK,CAACnpB,MAAMuT,GAAcoX,IAAa3qB,CAAC,CAAC,KACtD,gBAAA5D;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BACC,IAAIiG,GAAY;AAAA,0BAChB,IAAIA,GAAY;AAAA,0BAChB,GAAGmC,EAAQpJ,EAAW;AAAA,0BACtB,MAAMoJ,EAAQxI,EAAW;AAAA,0BACzB,MAAM9J;AAAA,0BACN,QAAQA;AAAA,0BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BACrC,QAAO;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACT,EAAA,CAEN;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,UAED4I,KACC,gBAAArwB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,MAAMqwB,GAAY,GAAG,KAAKA,GAAY,EAAA;AAAA,cAC/C,MAAK;AAAA,cAEJ,UAAAA,GAAY;AAAA,YAAA;AAAA,UAAA,IAEb;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAj8CJ,gBAAArwB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWmpB,GAAkBC,CAAQ;AAAA,QACrC,OAAOgQ;AAAA,QAEP,UAAA,gBAAAp5B,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAmqB,GAAA,CAAa;AAAA,MAAA;AAAA,IAAA;AAAA,EAg8C/D;AAAC;AAEDZ,GAAa,cAAc;AC5pHpB,SAASqS,GAAwBC,GAM5B;AACV,SACEA,EAAM,UACNA,EAAM,gBACNA,EAAM,gBACNA,EAAM,eACNA,EAAM;AAEV;AAOO,SAASC,GACdjkB,GACAkkB,GACM;AACN,EAAKA,MACLlkB,EAAM,eAAA,GACNA,EAAM,cAAc;AACtB;AAOO,SAASmkB,GAAoBC,GAAyB;AAC3D,QAAMC,IAAoB,CAACD,CAAK;AAChC,MAAI;AACF,UAAME,IAAMF,EAAM;AAClB,IAAIE,KAAOA,MAAQF,KAAOC,EAAQ,KAAKC,CAAG;AAAA,EAC5C,QAAQ;AAAA,EAER;AACA,SAAOD;AACT;ACvBA,MAAME,KAAoE;AAAA,EACxE,EAAE,QAAQ,aAAa,QAAQ,YAAA;AAAA,EAC/B,EAAE,QAAQ,YAAY,QAAQ,WAAA;AAAA,EAC9B,EAAE,QAAQ,cAAc,QAAQ,aAAA;AAAA,EAChC,EAAE,QAAQ,UAAU,QAAQ,SAAA;AAAA,EAC5B,EAAE,QAAQ,QAAQ,QAAQ,OAAA;AAC5B;AAEA,SAASC,GAAYC,GAA0C;AAC7D,UAAQA,KAAS,IAAI,KAAA,EAAO,cAAc,QAAQ,MAAM,GAAG;AAC7D;AAGO,SAASC,GACdD,GAC8B;AAC9B,QAAME,IAAMH,GAAYC,CAAK;AAC7B,MAAI,CAACE,EAAK,QAAO;AACjB,QAAMC,IAASL,GAAgB;AAAA,IAC7B,CAAC1oB,MAAS8oB,MAAQ9oB,EAAK,UAAU8oB,EAAI,WAAW,GAAG9oB,EAAK,MAAM,GAAG;AAAA,EAAA;AAEnE,MAAI,CAAC+oB,EAAQ,QAAO;AAEpB,QAAM5gB,IADO2gB,EAAI,MAAMC,EAAO,OAAO,MAAM,EAAE,QAAQ,OAAO,EAAE,EAC3C,MAAM,GAAG,EAAE,OAAO,OAAO;AAC5C,MAAIC,GACAC;AACJ,QAAMC,IAAuB,CAAA;AAC7B,aAAWC,KAAQhhB;AACjB,IAAIghB,MAAS,QAAQA,MAAS,SAAQH,IAAYG,IACzCA,MAAS,WAAWA,MAAS,QAAOF,IAAOE,IAC/CD,EAAW,KAAKC,CAAI;AAE3B,SAAO;AAAA,IACL,QAAQJ,EAAO;AAAA,IACf,OAAOG,EAAW,KAAK,GAAG,KAAK;AAAA,IAC/B,WAAAF;AAAA,IACA,MAAAC;AAAA,EAAA;AAEJ;AAEO,SAASG,GAAmBznB,GAIV;;AACvB,WACEvX,IAAAy+B,GAAuBlnB,EAAM,WAAW,MAAxC,gBAAAvX,EAA2C,aAC3C4P,IAAA6uB,GAAuBlnB,EAAM,GAAG,MAAhC,gBAAA3H,EAAmC,WACnC;AAEJ;AAEO,SAASqvB,GACdC,GACA/3B,GACe;AACf,aAAW6f,KAAU7f;AACnB,QAAI6f,EAAO,YAAYkY,KAAWlY,EAAO,eAAe;AACtD,aAAOA,EAAO;AAGlB,SAAO;AACT;AAEO,SAASmY,GACdD,GACA/3B,GACAi4B,GACoB;AACpB,QAAM5mB,IAAKymB,GAAoBC,GAAS/3B,CAAO;AAC/C,SAAIqR,KAAM,OAAa,OAChB4mB,EAAW,KAAK,CAACxpB,MAASA,EAAK,OAAO4C,CAAE,KAAK;AACtD;AAEO,SAAS6mB,GACd9nB,GACApQ,GACAi4B,GACsB;;AACtB,WAAOp/B,IAAAm/B,GAAkB5nB,EAAM,IAAIpQ,GAASi4B,CAAU,MAA/C,gBAAAp/B,EAAkD,SAAQg/B,GAAmBznB,CAAK;AAC3F;AAEO,SAAS+nB,GAGdxoB,GACAjD,GACA1M,GACAi4B,GACK;AACL,SAAOtoB,EAAO,OAAO,CAACS,MAChBA,EAAM,cACNA,EAAM,SAAS,eAAeynB,GAAmBznB,CAAK,MAAM1D,IAAa,KACtEwrB,GAAsB9nB,GAAOpQ,GAASi4B,CAAU,MAAMvrB,CAC9D;AACH;AAEO,SAAS0rB,GACdL,GACA/3B,GACsB;AACtB,SACEA,EAAQ,KAAK,CAACzB,MAAMA,EAAE,YAAYw5B,KAAWx5B,EAAE,SAAS,WAAW,KACnEyB,EAAQ,KAAK,CAACzB,MAAMA,EAAE,YAAYw5B,KAAWx5B,EAAE,eAAe,IAAI,KAClEyB,EAAQ,KAAK,CAACzB,MAAMA,EAAE,YAAYw5B,CAAO;AAE7C;AAEO,SAASM,GAAkBjoB,GAAwC;;AACxE,QAAMnP,IAAIq3B,GAAiBloB,EAAM,QAAQ;AACzC,SAAI,OAAO,SAASnP,EAAE,CAAC,KAAK,OAAO,SAASA,EAAE,CAAC,IAAUA,MAC3CpI,IAAAuX,EAAM,SAAS,SAAS,CAAC,MAAzB,gBAAAvX,EAA6B,OAC3B,EAAE,GAAG,GAAG,GAAG,EAAA;AAC7B;AAEO,SAAS0/B,GACdC,GACAC,GACAC,GACoB;AACpB,SAAIA,MACAD,IAAeD,IAAuB,OACtCC,IAAeD,IAAuB,SACnC;AACT;AAEO,SAASG,GACdjsB,GACAiD,GACQ;AACR,aAAWS,KAAST,GAAQ;AAC1B,UAAMipB,IACJtB,GAAuBlnB,EAAM,WAAW,KAAKknB,GAAuBlnB,EAAM,GAAG;AAC/E,QAAIwoB,GAAQ;AACV,YAAMve,IAAQ3N,MAAS,aAAa,aAAa;AACjD,aAAOksB,EAAO,SAASA,EAAO,UAAU,MAAM,GAAGve,CAAK,IAAIue,EAAO,KAAK,KAAKve;AAAA,IAC7E;AAAA,EACF;AACA,SAAO3N,MAAS,aAAa,aAAa;AAC5C;AAEO,SAASmsB,GACd74B,GACAqhB,GACAtZ,GACAgY,IAAkC,oBAAI,OACrB;AACjB,MAAIlU,IAAwB,MACxBitB,IAAW;AACf,aAAWjZ,KAAU7f,GAAS;AAE5B,QADI6f,EAAO,YAAYwB,KAAWtB,EAAW,IAAIF,EAAO,EAAE,KACtDA,EAAO,SAAS,cAAcA,EAAO,SAAS,OAAQ;AAC1D,UAAM3e,IAAIoG,GAASuY,GAAQ9X,CAAK;AAChC,IAAI7G,IAAI43B,MACNjtB,IAAOgU,GACPiZ,IAAW53B;AAAA,EAEf;AACA,SAAO2K;AACT;AAEO,SAASktB,GACdC,GACAh5B,GACU;AACV,QAAM2e,wBAAU,IAAA;AAChB,aAAWkB,KAAU7f;AACnB,IAAI6f,EAAO,gBAAgBmZ,KAAenZ,EAAO,WAAW,QAC1DlB,EAAI,IAAIkB,EAAO,OAAO;AAG1B,SAAO,CAAC,GAAGlB,CAAG;AAChB;AASO,SAASsa,GACdlB,GACA/3B,GACAi4B,GACAtoB,GACK;AACL,QAAMupB,IAAYlB,GAAkBD,GAAS/3B,GAASi4B,CAAU;AAChE,MAAI,CAACiB,EAAW,QAAO,CAAA;AACvB,QAAMva,IAAMoa,GAAeG,EAAU,IAAIl5B,CAAO;AAChD,SAAO2P,EAAO,OAAO,CAAC,MAAMgP,EAAI,SAAS,EAAE,EAAE,KAAK,EAAE,OAAOoZ,CAAO;AACpE;AAEO,SAASoB,GACdC,GACA7gC,GACW;AACX,QAAMomB,IAAM,IAAI,IAAIya,EAAS,IAAI,CAAC3qB,MAASA,EAAK,OAAO,CAAC;AACxD,SAAOlW,EACJ,OAAO,CAACI,MAAUgmB,EAAI,IAAIhmB,EAAM,EAAE,CAAC,EACnC,MAAA,EACA,KAAK,CAAC4F,GAAGC,MAAMD,EAAE,WAAWC,EAAE,YAAYD,EAAE,aAAaC,EAAE,UAAU;AAC1E;AAEO,SAAS66B,GACdL,GACAh5B,GACAC,GACA0P,GAC2B;AAC3B,QAAM2pB,IAAgBt5B,EAAQ,OAAO,CAACzB,MAAMA,EAAE,gBAAgBy6B,CAAW,GACnEO,IAAY,IAAI,IAAID,EAAc,IAAI,CAAC/6B,MAAMA,EAAE,EAAE,CAAC,GAClDi7B,IAAOv5B,EAAM;AAAA,IACjB,CAACR,MACCA,EAAK,SAAS,eACdA,EAAK,YACL85B,EAAU,IAAI95B,EAAK,YAAY,KAC/B85B,EAAU,IAAI95B,EAAK,UAAU;AAAA,EAAA;AAEjC,MAAI,CAAC+5B,EAAM,QAAO;AAClB,QAAMC,IAAaz5B,EAAQ,KAAK,CAACzB,MAAMA,EAAE,OAAOi7B,EAAK,YAAY,GAC3DE,IAAW15B,EAAQ,KAAK,CAACzB,MAAMA,EAAE,OAAOi7B,EAAK,UAAU,GACvDj6B,IAAOoQ,EAAO,KAAK,CAAC5Q,MAAMA,EAAE,QAAO06B,KAAA,gBAAAA,EAAY,QAAO,GACtDj6B,IAAKmQ,EAAO,KAAK,CAAC5Q,MAAMA,EAAE,QAAO26B,KAAA,gBAAAA,EAAU,QAAO;AACxD,SAAI,CAACn6B,KAAQ,CAACC,IAAW,OAClB,EAAE,MAAAD,GAAM,IAAAC,EAAA;AACjB;AAEA,SAASm6B,GACPtY,GACA9oB,GACQ;;AACR,WAAOM,IAAAN,EAAO,KAAK,CAACI,MAAUA,EAAM,OAAO0oB,CAAO,MAA3C,gBAAAxoB,EAA8C,SAAQ;AAC/D;AAEA,SAAS+gC,GACPxpB,GACA7X,GACQ;AACR,SAAO,GAAGohC,GAAUvpB,EAAM,SAAS7X,CAAM,CAAC,MAAM6X,EAAM,GAAG;AAC3D;AAkBO,SAASypB,GACd5B,GACAj4B,GACAC,GACA0P,GACwB;AACxB,QAAMmqB,IAAgC,CAAA;AACtC,aAAWZ,KAAajB,GAAY;AAClC,QAAIiB,EAAU,SAAS,YAAa;AACpC,UAAMa,IAAWV,GAAsBH,EAAU,IAAIl5B,GAASC,GAAO0P,CAAM;AAC3E,QAAIoqB,GAAU;AACZ,MAAAD,EAAM,KAAK,EAAE,aAAaZ,EAAU,IAAI,MAAMa,EAAS,MAAM,IAAIA,EAAS,GAAA,CAAI;AAC9E;AAAA,IACF;AACA,UAAMpb,IAAM,IAAI,IAAIoa,GAAeG,EAAU,IAAIl5B,CAAO,CAAC,GACnDg6B,IAAUrqB,EAAO,OAAO,CAACS,MAAUuO,EAAI,IAAIvO,EAAM,EAAE,CAAC;AAC1D,IAAI4pB,EAAQ,SAAS,KACrBF,EAAM,KAAK,EAAE,aAAaZ,EAAU,IAAI,MAAMc,EAAQ,CAAC,GAAG,IAAIA,EAAQ,CAAC,GAAG;AAAA,EAC5E;AACA,SAAOF;AACT;AAGO,SAASG,GAGdT,GACAjhC,GACsD;AACtD,SAAO;AAAA,IACL;AAAA,MACE,SAASihC,EAAK,KAAK;AAAA,MACnB,KAAKA,EAAK,KAAK;AAAA,MACf,WAAWG,GAAUH,EAAK,KAAK,SAASjhC,CAAM;AAAA,IAAA;AAAA,IAEhD;AAAA,MACE,SAASihC,EAAK,GAAG;AAAA,MACjB,KAAKA,EAAK,GAAG;AAAA,MACb,WAAWG,GAAUH,EAAK,GAAG,SAASjhC,CAAM;AAAA,IAAA;AAAA,EAC9C;AAEJ;AAGO,SAAS2hC,GACd9pB,GACApQ,GACAC,GACAg4B,GACAtoB,GACApX,IAAsF,IACvE;AACf,QAAM2gC,IAAYlB,GAAkB5nB,EAAM,IAAIpQ,GAASi4B,CAAU;AACjE,MAAI,CAACiB,EAAW,QAAO;AAEvB,MAAIA,EAAU,SAAS,aAAa;AAClC,UAAMM,IAAOH,GAAsBH,EAAU,IAAIl5B,GAASC,GAAO0P,CAAM;AACvE,QAAI6pB;AACF,aAAO,GAAGA,EAAK,KAAK,GAAG,MAAMA,EAAK,GAAG,GAAG;AAE1C,UAAMW,IAAWlB,GAA0B7oB,EAAM,IAAIpQ,GAASi4B,GAAYtoB,CAAM;AAChF,WAAIwqB,EAAS,WAAW,IACf,GAAG/pB,EAAM,GAAG,MAAM+pB,EAAS,CAAC,EAAE,GAAG,KAEnC;AAAA,EACT;AAEA,QAAMH,IAAU,CAAC5pB,GAAO,GAAG6oB,GAA0B7oB,EAAM,IAAIpQ,GAASi4B,GAAYtoB,CAAM,CAAC;AAC3F,MAAIqqB,EAAQ,SAAS,EAAG,QAAO;AAC/B,QAAMI,IAAQ,IAAI;AAAA,IAChB7hC,EAAO,IAAI,CAACI,GAAO2jB,MAAU;AAAA,MAC3B3jB,EAAM;AAAA,OACLA,EAAM,YAAYA,EAAM,cAAc2jB,KAAS,OAAQ3jB,EAAM,cAAc2jB;AAAA,IAAA,CAC7E;AAAA,EAAA;AAOH,SALe0d,EAAQ,MAAA,EAAQ,KAAK,CAACz7B,GAAGC,MAAM;AAC5C,UAAM67B,IAAKD,EAAM,IAAI77B,EAAE,OAAO,KAAK,OAAO,mBACpC+7B,IAAKF,EAAM,IAAI57B,EAAE,OAAO,KAAK,OAAO;AAC1C,WAAO67B,IAAKC;AAAA,EACd,CAAC,EACa,IAAI,CAAC7rB,MAASmrB,GAAcnrB,GAAMlW,CAAM,CAAC,EAAE,KAAK,KAAK;AACrE;AAEA,SAASgiC,GACPt6B,GACAu6B,GACe;AACf,SAAOv6B,EAAM;AAAA,IACX,CAACR,MACCA,EAAK,SAAS,eACd+6B,EAAU,IAAI/6B,EAAK,YAAY,KAC/B+6B,EAAU,IAAI/6B,EAAK,UAAU;AAAA,EAAA;AAEnC;AAYA,SAASg7B,GACPpmB,GACAjE,GACA4oB,GACArY,GACU;AACV,QAAMH,IAAW4X,GAAchoB,EAAM,IAAIiE,EAAI,OAAO,GAC9CtM,IAAQyY,IACV,EAAE,GAAGA,EAAS,GAAG,GAAGA,EAAS,MAC7B6X,GAAkBjoB,CAAK;AAC3B,MAAIoQ,GAAU;AACZ,QAAIA,EAAS,gBAAgBwY,KAAexY,EAAS,SAAS,aAAa;AACzE,YAAM1jB,IAAiB;AAAA,QACrB,GAAG0jB;AAAA,QACH,MAAM;AAAA,QACN,aAAAwY;AAAA,MAAA;AAEF,aAAArY,EAAI,KAAK,EAAE,IAAI,iBAAiB,QAAQ7jB,GAAM,GAC9CuX,EAAI,UAAUA,EAAI,QAAQ,IAAI,CAAC9V,MAAOA,EAAE,OAAOzB,EAAK,KAAKA,IAAOyB,CAAE,GAC3DzB;AAAA,IACT;AACA,WAAO0jB;AAAA,EACT;AACA,QAAMsQ,IAAoB;AAAA,IACxB,IAAIzc,EAAI,QAAA;AAAA,IACR,SAASjE,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAM;AAAA,IACN,GAAGrI,EAAM;AAAA,IACT,GAAGA,EAAM;AAAA,IACT,aAAAixB;AAAA,EAAA;AAEF,SAAArY,EAAI,KAAK,EAAE,IAAI,iBAAiB,QAAQmQ,GAAS,GACjDzc,EAAI,UAAU,CAAC,GAAGA,EAAI,SAASyc,CAAO,GAC/BA;AACT;AAEA,SAAS4J,GACPrmB,GACAsmB,GACAha,GACA;AACA,QAAMtU,IAAOwsB,GAAkBxkB,EAAI,SAASsmB,EAAQ,SAASA,GAAS,oBAAI,IAAI,CAACA,EAAQ,EAAE,CAAC,CAAC;AAO3F,MANI,CAACtuB,KACUgI,EAAI,MAAM;AAAA,IACvB,CAAClT,MACEA,EAAE,iBAAiBw5B,EAAQ,MAAMx5B,EAAE,eAAekL,EAAK,MACvDlL,EAAE,iBAAiBkL,EAAK,MAAMlL,EAAE,eAAew5B,EAAQ;AAAA,EAAA,EAEhD;AACZ,QAAMl7B,IAAoB;AAAA,IACxB,IAAI4U,EAAI,QAAA;AAAA,IACR,OAAOA,EAAI;AAAA,IACX,cAAcsmB,EAAQ;AAAA,IACtB,YAAYtuB,EAAK;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,MAAM;AAAA,EAAA;AAER,EAAAsU,EAAI,KAAK,EAAE,IAAI,eAAe,MAAAlhB,GAAM,GACpC4U,EAAI,QAAQ,CAAC,GAAGA,EAAI,OAAO5U,CAAI;AACjC;AAEA,SAASm7B,GAAiBvmB,GAA2B2kB,GAAgC;AACnF,QAAMM,IAAgBjlB,EAAI,QAAQ,OAAO,CAAC9V,MAAMA,EAAE,gBAAgBy6B,CAAW,GACvEra,IAAM,IAAI,IAAI2a,EAAc,IAAI,CAAC/6B,MAAMA,EAAE,EAAE,CAAC,GAC5CoiB,IAAiB,CAAA;AACvB,aAAWlhB,KAAQ86B,GAAsBlmB,EAAI,OAAOsK,CAAG;AACrD,IAAAgC,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQlhB,EAAK,IAAI;AAEjD,EAAA4U,EAAI,QAAQA,EAAI,MAAM;AAAA,IACpB,CAAClT,MACC,EAAEA,EAAE,SAAS,eAAewd,EAAI,IAAIxd,EAAE,YAAY,KAAKwd,EAAI,IAAIxd,EAAE,UAAU;AAAA,EAAA;AAE/E,aAAW0e,KAAUyZ;AACnB,IAAA3Y,EAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,QAAQ,EAAE,GAAGd,GAAQ,aAAa,KAAA;AAAA,IAAK,CACxC;AAEH,SAAAxL,EAAI,UAAUA,EAAI,QAAQ;AAAA,IAAI,CAAC9V,MAC7BA,EAAE,gBAAgBy6B,IAAc,EAAE,GAAGz6B,GAAG,aAAa,SAASA;AAAA,EAAA,GAEhE8V,EAAI,aAAaA,EAAI,WAAW,OAAO,CAACpT,MAAMA,EAAE,OAAO+3B,CAAW,GAClErY,EAAI,KAAK,EAAE,IAAI,oBAAoB,aAAAqY,GAAa,GACzCrY;AACT;AAEA,SAASka,GAAmBxmB,GAA2B2kB,GAAgC;AACrF,SAAO4B,GAAiBvmB,GAAK2kB,CAAW;AAC1C;AAEO,SAAS8B,GACdzmB,GACA2kB,GACW;AACX,SAAO6B,GAAmBxmB,GAAK2kB,CAAW;AAC5C;AAEO,SAAS+B,GACd1mB,GACA2mB,GACAC,GACAxoB,GACW;;AACX,QAAMyoB,IAAY7mB,EAAI,OAAO,KAAK,CAAC8mB,MAAMA,EAAE,OAAOH,EAAU,OAAO,GAC7DI,IAAU/mB,EAAI,OAAO,KAAK,CAAC8mB,MAAMA,EAAE,OAAOF,EAAQ,OAAO,GACzDxD,IAAYc;AAAA,KAChB2C,KAAA,gBAAAA,EAAW,eAAc;AAAA,KACzBE,KAAA,gBAAAA,EAAS,eAAc;AAAA,MAErBviC,IAAAy+B,GAAuB0D,EAAU,WAAW,MAA5C,gBAAAniC,EAA+C,gBAC/C4P,IAAA6uB,GAAuB2D,EAAQ,WAAW,MAA1C,gBAAAxyB,EAA6C;AAAA,EAAA,GAE3C4yB,IACa1C,GAAqB,aAAa,CAACqC,GAAWC,CAAO,CAAC,GAEnEK,IAAexD,GAAoBkD,EAAU,IAAI3mB,EAAI,OAAO,GAC5DknB,IAAazD,GAAoBmD,EAAQ,IAAI5mB,EAAI,OAAO,GACxDsM,IAAiB,CAAA,GACjBhQ,IAAgC;AAAA,IACpC,GAAG0D;AAAA,IACH,SAASA,EAAI,QAAQ,MAAA;AAAA,IACrB,OAAOA,EAAI,MAAM,MAAA;AAAA,IACjB,YAAYA,EAAI,WAAW,MAAA;AAAA,EAAM;AAGnC,aAAWhD,KAAM,IAAI,IAAI,CAACiqB,GAAcC,CAAU,EAAE,OAAO,CAACC,MAAmBA,KAAK,IAAI,CAAC;AACvF,IAAA7a,EAAI,KAAK,GAAGia,GAAiBjqB,GAASU,CAAE,CAAC;AAG3C,QAAM2nB,IAAcroB,EAAQ,QAAA,GACtBuoB,IAAyB;AAAA,IAC7B,IAAIF;AAAA,IACJ,OAAOroB,EAAQ;AAAA,IACf,MAAM;AAAA,IACN,MAAA0qB;AAAA,IACA,WAAA5D;AAAA,IACA,YAAY;AAAA,EAAA;AAEd,EAAA9W,EAAI,KAAK,EAAE,IAAI,oBAAoB,WAAAuY,GAAW,GAC9CvoB,EAAQ,aAAa,CAAC,GAAGA,EAAQ,YAAYuoB,CAAS;AAEtD,QAAMO,IAAagB,GAAc9pB,GAASqqB,GAAWhC,GAAarY,CAAG,GAC/D+Y,IAAWe,GAAc9pB,GAASsqB,GAASjC,GAAarY,CAAG;AACjE,SAAA+Z,GAAkB/pB,GAAS8oB,GAAY9Y,CAAG,GAC1C+Z,GAAkB/pB,GAAS+oB,GAAU/Y,CAAG,GAExCA,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAIhQ,EAAQ,QAAA;AAAA,MACZ,OAAOA,EAAQ;AAAA,MACf,cAAc8oB,EAAW;AAAA,MACzB,YAAYC,EAAS;AAAA,MACrB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,MAAM;AAAA,IAAA;AAAA,EACR,CACD,GACM/Y;AACT;AAEO,SAAS8a,GACdpnB,GACAqnB,GACAjpB,GACW;AAEX,QAAMunB,IAAU,CAAC,GADF,IAAI,IAAI0B,EAAa,IAAI,CAAC38B,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC,EAC9B,QAAQ;AACnC,MAAIi7B,EAAQ,SAAS,EAAG,QAAO,CAAA;AAE/B,QAAMrZ,IAAiB,CAAA,GACjBhQ,IAAgC;AAAA,IACpC,GAAG0D;AAAA,IACH,SAASA,EAAI,QAAQ,MAAA;AAAA,IACrB,OAAOA,EAAI,MAAM,MAAA;AAAA,IACjB,YAAYA,EAAI,WAAW,MAAA;AAAA,EAAM,GAE7BsnB,IAAc,IAAI;AAAA,IACtB3B,EACG,IAAI,CAACj7B,MAAM+4B,GAAoB/4B,EAAE,IAAI4R,EAAQ,OAAO,CAAC,EACrD,OAAO,CAACU,MAAqBA,KAAM,IAAI;AAAA,EAAA,GAEtCuqB,KACJnpB,KAAA,gBAAAA,EAAS,iBACRkpB,EAAY,SAAS,IAAI,CAAC,GAAGA,CAAW,EAAE,CAAC,IAAI;AAElD,aAAWtqB,KAAMsqB,GAAa;AAC5B,QAAItqB,MAAOuqB,GAAQ;AACjB,YAAMtC,IAAgB3oB,EAAQ,QAAQ,OAAO,CAACpS,MAAMA,EAAE,gBAAgB8S,CAAE,GAClEsN,IAAM,IAAI,IAAI2a,EAAc,IAAI,CAAC/6B,MAAMA,EAAE,EAAE,CAAC;AAClD,iBAAWkB,KAAQ86B,GAAsB5pB,EAAQ,OAAOgO,CAAG;AACzD,QAAAgC,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQlhB,EAAK,IAAI,GAC/CkR,EAAQ,QAAQA,EAAQ,MAAM,OAAO,CAACxP,MAAMA,EAAE,OAAO1B,EAAK,EAAE;AAE9D;AAAA,IACF;AACA,IAAAkhB,EAAI,KAAK,GAAGia,GAAiBjqB,GAASU,CAAE,CAAC;AAAA,EAC3C;AAEA,QAAM2nB,IAAc4C,KAAUjrB,EAAQ,QAAA,GAChCuoB,IAAyB;AAAA,IAC7B,IAAIF;AAAA,IACJ,OAAOroB,EAAQ;AAAA,IACf,MAAM;AAAA,IACN,OAAM8B,KAAA,gBAAAA,EAAS,SAAQkmB,GAAqB,YAAYqB,CAAO;AAAA,IAC/D,WAAW;AAAA,IACX,aAAYvnB,KAAA,gBAAAA,EAAS,eAAc;AAAA,EAAA;AAErC,EAAAkO,EAAI,KAAK,EAAE,IAAI,oBAAoB,WAAAuY,GAAW;AAE9C,QAAME,IAAWY,EAAQ,IAAI,CAAC5pB,MAAUqqB,GAAc9pB,GAASP,GAAO4oB,GAAarY,CAAG,CAAC;AACvF,aAAWga,KAAWvB,EAAU,CAAAsB,GAAkB/pB,GAASgqB,GAASha,CAAG;AAEvE,WAAS5b,IAAI,GAAGA,IAAIq0B,EAAS,QAAQr0B;AACnC,aAASsL,IAAItL,IAAI,GAAGsL,IAAI+oB,EAAS,QAAQ/oB;AACvC,MAAAsQ,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ,IAAIhQ,EAAQ,QAAA;AAAA,UACZ,OAAOA,EAAQ;AAAA,UACf,cAAcyoB,EAASr0B,CAAC,EAAE;AAAA,UAC1B,YAAYq0B,EAAS/oB,CAAC,EAAE;AAAA,UACxB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY6oB,EAAU;AAAA,UACtB,MAAM;AAAA,QAAA;AAAA,MACR,CACD;AAGL,SAAOvY;AACT;ACnkBA,SAASkb,GAAav1B,GAAuC;AAC3D,QAAMjK,MAAUiK,KAAA,gBAAAA,EAAU,aAAY,CAAA,GAAI,KAAA;AAC1C,SAAOw1B,GAAOz/B,CAAM;AACtB;AAGO,SAAS0/B,GACdpsB,GAMAooB,GACA1W,GACAjnB,GACS;AACT,SAAOuV,EAAO;AAAA,IACZ,CAACS,MACCA,EAAM,OAAO2nB,KACb3nB,EAAM,YAAYiR,KAClBjR,EAAM,QAAQhW,KACd,CAACgW,EAAM;AAAA,EAAA;AAEb;AAEA,SAAS4rB,GACPC,GACAn/B,GACK;AACL,QAAMuL,IAAM4zB,EAAK,UAAU,CAAC5gB,MAAQA,EAAI,OAAOve,EAAK,EAAE;AACtD,MAAIuL,IAAM,EAAG,QAAO,CAAC,GAAG4zB,GAAMn/B,CAAI;AAClC,QAAMo/B,IAAOD,EAAK,MAAA;AAClB,SAAAC,EAAK7zB,CAAG,IAAIvL,GACLo/B;AACT;AAEO,SAASC,GACdle,GACA1kB,GACkB;;AAClB,UAAQA,EAAG,IAAA;AAAA,IACT,KAAK,gBAAgB;AACnB,YAAM+O,IAAW/O,EAAG,OACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,OAAO,KAAK,CAAClf,MAAMA,EAAE,OAAOsS,CAAE,GAC/C/K,IAAWgC,EAAS,aAAYkY,KAAA,gBAAAA,EAAU,aAAY;AAAA,QAC1D,OAAO,CAAA;AAAA,QACP,UAAU,CAAA;AAAA,MAAC,GAEPpQ,IAAiB;AAAA,QACrB,IAAAiB;AAAA,QACA,SAAS/I,EAAS,YAAWkY,KAAA,gBAAAA,EAAU,YAAW;AAAA,QAClD,KAAKlY,EAAS,QAAOkY,KAAA,gBAAAA,EAAU,QAAO,SAASnP,CAAE;AAAA,QACjD,MAAM/I,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,UAAAla;AAAA,QACA,MACEgC,EAAS,SACRA,EAAS,YAAY,OAClBuzB,GAAav1B,CAAQ,IACrBka,KAAA,gBAAAA,EAAU,SACdqb,GAAav1B,CAAQ;AAAA,QACvB,QAAQgC,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,QAC/C,OAAOlY,EAAS,UAASkY,KAAA,gBAAAA,EAAU,UAAS,CAAA;AAAA,QAC5C,aAAalY,EAAS,gBAAekY,KAAA,gBAAAA,EAAU,gBAAe;AAAA,QAC9D,QAAQlY,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,QAC/C,OAAO4b,GAAwB5b,KAAA,gBAAAA,EAAU,OAAOlY,EAAS,OAAO;AAAA,UAC9D,MAAMA,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,UACzC,QAAQlY,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,UAC/C,aACElY,EAAS,gBAAekY,KAAA,gBAAAA,EAAU,gBAAe;AAAA,QAAA,CACpD;AAAA,QACD,gBACElY,EAAS,mBACRA,EAAS,YAAY,OAAO,KAAOkY,KAAA,gBAAAA,EAAU,mBAC9C;AAAA,QACF,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,MAAA;AAE7D,aAAO,EAAE,GAAGvC,GAAO,QAAQ+d,GAAW/d,EAAM,QAAQ7N,CAAK,EAAA;AAAA,IAC3D;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAG6N;AAAA,QACH,QAAQA,EAAM,OAAO,OAAO,CAAClf,MAAMA,EAAE,OAAOxF,EAAG,OAAO;AAAA,QACtD,aAAa0kB,EAAM,YAAY,OAAO,CAAC1f,MAAMA,EAAE,YAAYhF,EAAG,OAAO;AAAA,MAAA;AAAA,IAEzE,KAAK,qBAAqB;AACxB,YAAMmT,MACJ7T,IAAAolB,EAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO1kB,EAAG,WAAW,OAAO,MAAvD,gBAAAV,EAA0D,SAAQ,QAC9D+f,IAAayjB,GAAqB9iC,EAAG,YAAYmT,CAAI,GACrD4vB,IAAOre,EAAM,YAAY,OAAO,CAAC1f,MAAMA,EAAE,YAAYqa,EAAW,OAAO;AAC7E,aAAO,EAAE,GAAGqF,GAAO,aAAa,CAAC,GAAGqe,GAAM1jB,CAAU,EAAA;AAAA,IACtD;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAGqF;AAAA,QACH,aAAaA,EAAM,YAAY,OAAO,CAAC1f,MAAMA,EAAE,YAAYhF,EAAG,OAAO;AAAA,MAAA;AAAA,IAEzE,KAAK,iBAAiB;AACpB,YAAM+O,IAAW/O,EAAG,QACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,QAAQ,KAAK,CAAC1f,MAAMA,EAAE,OAAO8S,CAAE,GAChDwO,IAAmB;AAAA,QACvB,IAAAxO;AAAA,QACA,SAAS/I,EAAS,YAAWkY,KAAA,gBAAAA,EAAU,YAAW;AAAA,QAClD,SAASlY,EAAS,YAAWkY,KAAA,gBAAAA,EAAU,YAAW;AAAA,QAClD,MAAMlY,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,GAAGlY,EAAS,MAAKkY,KAAA,gBAAAA,EAAU,MAAK;AAAA,QAChC,GAAGlY,EAAS,MAAKkY,KAAA,gBAAAA,EAAU,MAAK;AAAA,QAChC,aACElY,EAAS,gBAAgB,SACrBA,EAAS,eACTkY,KAAA,gBAAAA,EAAU,gBAAe;AAAA,MAAA;AAEjC,aAAO,EAAE,GAAGvC,GAAO,SAAS+d,GAAW/d,EAAM,SAAS4B,CAAM,EAAA;AAAA,IAC9D;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAG5B;AAAA,QACH,SAASA,EAAM,QAAQ,OAAO,CAAC1f,MAAMA,EAAE,OAAOhF,EAAG,QAAQ;AAAA,QACzD,OAAO0kB,EAAM,MAAM;AAAA,UACjB,CAAC9c,MAAMA,EAAE,iBAAiB5H,EAAG,YAAY4H,EAAE,eAAe5H,EAAG;AAAA,QAAA;AAAA,MAC/D;AAAA,IAEJ,KAAK,eAAe;AAClB,YAAM+O,IAAW/O,EAAG,MACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,MAAM,KAAK,CAAC9c,MAAMA,EAAE,OAAOkQ,CAAE,GAC9C4N,IACJ3W,EAAS,UAAU,SACfkX,GAAa,EAAE,OAAOlX,EAAS,MAAA,CAAO,IACtCkX,GAAagB,CAAQ,GACrB/gB,IAAoB;AAAA,QACxB,IAAA4R;AAAA,QACA,OAAO/I,EAAS,UAASkY,KAAA,gBAAAA,EAAU,UAASvC,EAAM;AAAA,QAClD,cAAc3V,EAAS,iBAAgBkY,KAAA,gBAAAA,EAAU,iBAAgB;AAAA,QACjE,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,QAC3D,QAAQlY,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,QAC/C,UAAUlY,EAAS,aAAYkY,KAAA,gBAAAA,EAAU,aAAY;AAAA,QACrD,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,QAC3D,MAAMlY,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,GAAIvB,IAAQ,EAAE,OAAAA,MAAU,CAAA;AAAA,MAAC;AAE3B,aAAO,EAAE,GAAGhB,GAAO,OAAO+d,GAAW/d,EAAM,OAAOxe,CAAI,EAAA;AAAA,IACxD;AAAA,IACA,KAAK;AACH,aAAO,EAAE,GAAGwe,GAAO,OAAOA,EAAM,MAAM,OAAO,CAAC9c,MAAMA,EAAE,OAAO5H,EAAG,MAAM,EAAA;AAAA,IACxE,KAAK,gBAAgB;AACnB,YAAMolB,KAAOplB,EAAG,aAAa,CAAA,GAAI,OAAO,CAAC8X,MAAO,OAAO,SAASA,CAAE,CAAC;AACnE,UAAIsN,EAAI,SAAS,EAAG,QAAOV;AAC3B,YAAMzO,IAAOmP,EAAI,CAAC,GACZuS,IAAU,IAAI,IAAIvS,EAAI,MAAM,CAAC,CAAC,GAC9B1e,IAAQge,EAAM,MACjB,IAAI,CAAC9c,OAAO;AAAA,QACX,GAAGA;AAAA,QACH,cAAc+vB,EAAQ,IAAI/vB,EAAE,YAAY,IAAIqO,IAAOrO,EAAE;AAAA,QACrD,YAAY+vB,EAAQ,IAAI/vB,EAAE,UAAU,IAAIqO,IAAOrO,EAAE;AAAA,MAAA,EACjD,EACD,OAAO,CAACA,MAAMA,EAAE,iBAAiBA,EAAE,UAAU;AAChD,aAAO;AAAA,QACL,GAAG8c;AAAA,QACH,SAASA,EAAM,QAAQ,OAAO,CAAC1f,MAAM,CAAC2yB,EAAQ,IAAI3yB,EAAE,EAAE,CAAC;AAAA,QACvD,OAAA0B;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,KAAK;AACH,aAAO,EAAE,GAAGge,GAAO,OAAO,EAAE,GAAGA,EAAM,OAAO,GAAG1kB,EAAG,QAAM;AAAA,IAC1D,KAAK,oBAAoB;AACvB,YAAM+O,IAAW/O,EAAG,WACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,WAAW,KAAK,CAAChd,MAAMA,EAAE,OAAOoQ,CAAE,GACnD6nB,IAAyB;AAAA,QAC7B,IAAA7nB;AAAA,QACA,OAAO/I,EAAS,UAASkY,KAAA,gBAAAA,EAAU,UAASvC,EAAM;AAAA,QAClD,MAAM3V,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,MAAMlY,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,WAAWlY,EAAS,cAAakY,KAAA,gBAAAA,EAAU,cAAa;AAAA,QACxD,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,MAAA;AAE7D,aAAO,EAAE,GAAGvC,GAAO,YAAY+d,GAAW/d,EAAM,YAAYib,CAAS,EAAA;AAAA,IACvE;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAGjb;AAAA,QACH,YAAYA,EAAM,WAAW,OAAO,CAAChd,MAAMA,EAAE,OAAO1H,EAAG,WAAW;AAAA,QAClE,SAAS0kB,EAAM,QAAQ;AAAA,UAAI,CAAC1f,MAC1BA,EAAE,gBAAgBhF,EAAG,cAAc,EAAE,GAAGgF,GAAG,aAAa,SAASA;AAAA,QAAA;AAAA,MACnE;AAAA,IAEJ,KAAK;AACH,aAAOg+B,GAAmBte,GAAO1kB,EAAG,OAAO;AAAA,IAC7C;AACE,aAAO0kB;AAAA,EAAA;AAEb;AAGO,SAASse,GACdte,GACAoD,GACkB;AAClB,QAAMmb,IAAkB,IAAI;AAAA,IAC1Bve,EAAM,OAAO,OAAO,CAAC7N,MAAUA,EAAM,YAAYiR,CAAO,EAAE,IAAI,CAACjR,MAAUA,EAAM,EAAE;AAAA,EAAA,GAE7EwR,IAAmB,IAAI;AAAA,IAC3B3D,EAAM,QAAQ,OAAO,CAAC4B,MAAWA,EAAO,YAAYwB,CAAO,EAAE,IAAI,CAACxB,MAAWA,EAAO,EAAE;AAAA,EAAA,GAElF7f,IAAUie,EAAM,QAAQ,OAAO,CAAC4B,MAAWA,EAAO,YAAYwB,CAAO,GACrEob,IAAmB,IAAI;AAAA,IAC3Bz8B,EACG,IAAI,CAAC6f,MAAWA,EAAO,WAAW,EAClC,OAAO,CAACxO,MAAqBA,KAAM,IAAI;AAAA,EAAA;AAE5C,SAAO;AAAA,IACL,GAAG4M;AAAA,IACH,QAAQA,EAAM,OAAO,OAAO,CAACtlB,MAAUA,EAAM,OAAO0oB,CAAO;AAAA,IAC3D,QAAQpD,EAAM,OAAO,OAAO,CAAC7N,MAAUA,EAAM,YAAYiR,CAAO;AAAA,IAChE,aAAapD,EAAM,YAAY,OAAO,CAAC5C,MAAQ,CAACmhB,EAAgB,IAAInhB,EAAI,OAAO,CAAC;AAAA,IAChF,SAAArb;AAAA,IACA,OAAOie,EAAM,MAAM;AAAA,MACjB,CAACxe,MACC,CAACmiB,EAAiB,IAAIniB,EAAK,YAAY,KACvC,CAACmiB,EAAiB,IAAIniB,EAAK,UAAU;AAAA,IAAA;AAAA,IAEzC,YAAYwe,EAAM,WAAW,OAAO,CAACib,MAAcuD,EAAiB,IAAIvD,EAAU,EAAE,CAAC;AAAA,IACrF,sBAAsBjb,EAAM,uBAAuB,CAAA,GAAI;AAAA,MACrD,CAAC5C,MAAQA,EAAI,YAAYgG;AAAA,IAAA;AAAA,EAC3B;AAEJ;AAEO,SAASqb,GACdze,GACA0C,GACkB;AAClB,QAAMgc,IAAS;AAAA,IACb,GAAGC,GAAkB3e,CAAK;AAAA,IAC1B,YAAYA,EAAM,cAAc,CAAA;AAAA,IAChC,qBAAqBA,EAAM,uBAAuB,CAAA;AAAA,EAAC;AAErD,SAAO0C,EAAI,OAAOwb,IAAcQ,CAAM;AACxC;AAMA,SAASC,GAAkB3e,GAA2C;AACpE,MAAI9V,IAAU;AACd,QAAMwH,IAASsO,EAAM,OAAO,IAAI,CAAC7N,MAAU;AACzC,UAAM9J,IAAWu2B,GAAuBzsB,EAAM,QAAQ,GAChDiK,IAAQyiB,GAA0B1sB,CAAK,KAAKA,EAAM,OAClD2sB,IAAkBz2B,MAAa8J,EAAM,UACrC4sB,IAAe3iB,MAAUjK,EAAM;AACrC,WAAI,CAAC2sB,KAAmB,CAACC,IAAqB5sB,KAC9CjI,IAAU,IACH;AAAA,MACL,GAAGiI;AAAA,MACH,UAAA9J;AAAA,MACA,MAAMy2B,IAAkB9nB,GAAa3O,CAAQ,IAAI8J,EAAM;AAAA,MACvD,OAAAiK;AAAA,IAAA;AAAA,EAEJ,CAAC;AACD,SAAOlS,IAAU,EAAE,GAAG8V,GAAO,QAAAtO,MAAWsO;AAC1C;AAGO,SAASgf,GAAgBtc,GAAgBpnB,GAAwB;AACtE,MAAIA,EAAG,OAAO,gBAAgB;AAC5B,UAAMuN,IAAO6Z,EAAI,OAAO,CAAClS,MAASA,EAAK,OAAO,cAAc,GACtD6tB,IAAO3b,EAAI,OAAO,CAAClS,MAASA,EAAK,OAAO,cAAc,GACtDkK,IAAQ7R,EAAK;AAAA,MACjB,CAACo2B,GAAKzuB,MAAUA,EAAK,OAAO,iBAAiB,EAAE,GAAGyuB,GAAK,GAAGzuB,EAAK,MAAA,IAAUyuB;AAAA,MACzE,CAAA;AAAA,IAAC;AAEH,WAAO,CAAC,GAAGZ,GAAM,EAAE,IAAI,gBAAgB,OAAO,EAAE,GAAG3jB,GAAO,GAAGpf,EAAG,MAAA,GAAS;AAAA,EAC3E;AAEA,MAAIA,EAAG,OAAO,kBAAkBA,EAAG,MAAM,MAAM,MAAM;AACnD,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,kBAAkBA,EAAK,MAAM,OAAOlV,EAAG,MAAM;AAAA,IAAA;AAErE,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,gBAAgB;AAC9C,YAAMvL,IAAO6jB,EAAI,MAAA,GACX3Q,IAAS,EAAE,GAAG2Q,EAAItY,CAAG,EAAE,OAAO,GAAG9O,EAAG,MAAA;AAC1C,aAAAuD,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,GAAG2H;AAAA,UACH,OAAOosB;AAAA,YACLzb,EAAItY,CAAG,EAAE,MAAM;AAAA,YACf9O,EAAG,MAAM;AAAA,YACT;AAAA,cACE,MAAMyW,EAAO,QAAQ;AAAA,cACrB,QAAQA,EAAO;AAAA,cACf,aAAaA,EAAO;AAAA,YAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF,GAEKlT;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,mBAAmBA,EAAG,OAAO,MAAM,MAAM;AACrD,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,mBAAmBA,EAAK,OAAO,OAAOlV,EAAG,OAAO;AAAA,IAAA;AAExE,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,iBAAiB;AAC/C,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,QAAQ,EAAE,GAAGsY,EAAItY,CAAG,EAAE,QAAQ,GAAG9O,EAAG,OAAA;AAAA,MAAO,GAEtCuD;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,sBAAsBA,EAAG,UAAU,MAAM,MAAM;AAC3D,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,sBAAsBA,EAAK,UAAU,OAAOlV,EAAG,UAAU;AAAA,IAAA;AAEjF,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,oBAAoB;AAClD,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,WAAW,EAAE,GAAGsY,EAAItY,CAAG,EAAE,WAAW,GAAG9O,EAAG,UAAA;AAAA,MAAU,GAE/CuD;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,iBAAiBA,EAAG,KAAK,MAAM,MAAM;AACjD,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,iBAAiBA,EAAK,KAAK,OAAOlV,EAAG,KAAK;AAAA,IAAA;AAElE,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,eAAe;AAC7C,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,MAAM,EAAE,GAAGsY,EAAItY,CAAG,EAAE,MAAM,GAAG9O,EAAG,KAAA;AAAA,MAAK,GAEhCuD;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,qBAAqB;AACjC,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MACCA,EAAK,OAAO,uBACZA,EAAK,WAAW,YAAYlV,EAAG,WAAW;AAAA,IAAA;AAE9C,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,qBAAqB;AACnD,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI,EAAE,IAAI,qBAAqB,YAAY9O,EAAG,WAAA,GAC/CuD;AAAA,IACT;AAAA,EACF;AAEA,SAAO,CAAC,GAAG6jB,GAAKpnB,CAAE;AACpB;AAYA,MAAM4jC,KAAoD;AAAA,EACxD,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,cAAc;AAChB;AAEA,SAASC,GACP39B,GACQ;AACR,SAAO,GAAGA,EAAK,YAAY,IAAIA,EAAK,UAAU;AAChD;AAQA,SAAS49B,GAA0B1c,GAA2B;AAC5D,QAAM2c,wBAAqB,IAAA,GACrBC,wBAAuB,IAAA,GACvBC,wBAAsB,IAAA,GACtBC,wBAAwB,IAAA;AAE9B,aAAWlkC,KAAMonB;AACf,IAAIpnB,EAAG,OAAO,iBAAe+jC,EAAe,IAAI/jC,EAAG,MAAM,GACrDA,EAAG,OAAO,mBAAiBgkC,EAAiB,IAAIhkC,EAAG,QAAQ,GAC3DA,EAAG,OAAO,iBAAiBA,EAAG,KAAK,MAAM,QAAMikC,EAAgB,IAAIjkC,EAAG,KAAK,EAAE,GAC7EA,EAAG,OAAO,mBAAmBA,EAAG,OAAO,MAAM,QAC/CkkC,EAAkB,IAAIlkC,EAAG,OAAO,EAAE;AAItC,QAAMmkC,IAAqB,IAAI;AAAA,IAC7B,CAAC,GAAGD,CAAiB,EAAE,OAAO,CAACpsB,MAAOA,IAAK,KAAKksB,EAAiB,IAAIlsB,CAAE,CAAC;AAAA,EAAA,GAGpEL,IAAkB,CAAA;AACxB,aAAWzX,KAAMonB;AACf,IACEpnB,EAAG,OAAO,mBACVA,EAAG,OAAO,MAAM,QAChBgkC,EAAiB,IAAIhkC,EAAG,OAAO,EAAE,KAKjCA,EAAG,OAAO,mBACVA,EAAG,WAAW,KACdkkC,EAAkB,IAAIlkC,EAAG,QAAQ,KAI/BA,EAAG,OAAO,iBAAiBA,EAAG,KAAK,MAAM,QAAQ+jC,EAAe,IAAI/jC,EAAG,KAAK,EAAE,KAG9EA,EAAG,OAAO,iBAAiBA,EAAG,SAAS,KAAKikC,EAAgB,IAAIjkC,EAAG,MAAM,KAI3EA,EAAG,OAAO,kBACTmkC,EAAmB,IAAInkC,EAAG,KAAK,YAAY,KAC1CmkC,EAAmB,IAAInkC,EAAG,KAAK,UAAU,MAI7CyX,EAAK,KAAKzX,CAAE;AAGd,QAAMokC,wBAAsB,IAAA;AAC5B,EAAA3sB,EAAK,QAAQ,CAACzX,GAAI+iB,MAAU;AAC1B,IAAI/iB,EAAG,OAAO,iBACdokC,EAAgB,IAAIP,GAAY7jC,EAAG,IAAI,GAAG+iB,CAAK;AAAA,EACjD,CAAC;AAED,QAAMshB,wBAAkB,IAAA;AACxB,EAAA5sB,EAAK,QAAQ,CAACzX,MAAO;AACnB,IAAIA,EAAG,OAAO,iBACT,OAAO,UAAU,eAAe,KAAKA,EAAG,MAAM,OAAO,KAC1DqkC,EAAY,IAAIR,GAAY7jC,EAAG,IAAI,GAAGA,EAAG,KAAK,SAAS,IAAI;AAAA,EAC7D,CAAC;AAED,QAAMkW,wBAAW,IAAA,GACXmB,IAA0B,CAAA;AAChC,SAAAI,EAAK,QAAQ,CAACzX,GAAI+iB,MAAU;AAC1B,QAAI/iB,EAAG,OAAO,cAAe;AAC7B,UAAMskC,IAASF,EAAgB,IAAIP,GAAY7jC,EAAG,IAAI,CAAC;AACvD,QAAIskC,KAAU,QAAQA,MAAWvhB,EAAO;AACxC,IAAA7M,EAAK,IAAI6M,CAAK;AACd,UAAMwhB,IAAW9sB,EAAK6sB,CAAM;AAC5B,IACEtkC,EAAG,KAAK,MAAM,QACdA,EAAG,KAAK,KAAK,KACbukC,EAAS,OAAO,iBAChBA,EAAS,KAAK,OAAOvkC,EAAG,KAAK,MAC7B,CAAC+jC,EAAe,IAAI/jC,EAAG,KAAK,EAAE,KAE9BqX,EAAa,KAAK,EAAE,IAAI,eAAe,QAAQrX,EAAG,KAAK,IAAI;AAAA,EAE/D,CAAC,GAcM,CAAC,GAZOyX,EACZ,OAAO,CAAC9H,GAAGoT,MAAU,CAAC7M,EAAK,IAAI6M,CAAK,CAAC,EACrC,IAAI,CAAC/iB,MAAO;AAEX,QADIA,EAAG,OAAO,iBACV,CAACqkC,EAAY,IAAIR,GAAY7jC,EAAG,IAAI,CAAC,EAAG,QAAOA;AACnD,UAAM0lB,IAAQ2e,EAAY,IAAIR,GAAY7jC,EAAG,IAAI,CAAC;AAClD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM0lB,IAAQ,EAAE,GAAG1lB,EAAG,MAAM,OAAA0lB,EAAA,IAAU,EAAE,GAAG1lB,EAAG,MAAM,OAAO,KAAA;AAAA,IAAK;AAAA,EAEpE,CAAC,GAEgB,GAAGqX,CAAY;AACpC;AAEA,SAASmtB,GAAapd,GAA2B;AAC/C,SAAOA,EACJ,IAAI,CAACpnB,GAAI+iB,OAAW,EAAE,IAAA/iB,GAAI,OAAA+iB,EAAA,EAAQ,EAClC,KAAK,CAAC/d,GAAGC,MAAM;AACd,UAAMw/B,IAAOb,GAAmB5+B,EAAE,GAAG,EAAE,IAAI4+B,GAAmB3+B,EAAE,GAAG,EAAE;AACrE,WAAOw/B,MAAS,IAAIA,IAAOz/B,EAAE,QAAQC,EAAE;AAAA,EACzC,CAAC,EACA,IAAI,CAAC,EAAE,IAAAjF,EAAA,MAASA,CAAE;AACvB;AAEO,SAAS0kC,GAAwBtd,GAA2B;AACjE,SAAOod,GAAaV,GAA0B1c,CAAG,CAAC;AACpD;AC5iBA,SAASud,KAAiB;AACxB,SACE,gBAAA7iC,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACtE,UAAA;AAAA,IAAA,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEO,SAASojC,GAAiB;AAAA,EAC/B,OAAA9jB;AAAA,EACA,SAAA+jB;AAAA,EACA,UAAAlgC;AACF,GAIG;AACD,SACE,gBAAAnD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,cAAY,SAASsf,CAAK;AAAA,MAC1B,OAAM;AAAA,MACN,UAAAnc;AAAA,MACA,SAAAkgC;AAAA,MAEA,4BAACF,IAAA,CAAA,CAAe;AAAA,IAAA;AAAA,EAAA;AAGtB;ACtCO,SAASG,GAAkBhH,GAA8B;AAC9D,QAAMiH,IAAQjH,EAAM,KAAA,EAAO,MAAM,gCAAgC;AACjE,MAAI,CAACiH,EAAO,QAAO;AACnB,MAAIC,IAAMD,EAAM,CAAC,EAAE,YAAA;AACnB,SAAIC,EAAI,WAAW,MACjBA,IAAMA,EACH,MAAM,EAAE,EACR,IAAI,CAACC,MAAOA,IAAKA,CAAE,EACnB,KAAK,EAAE,IAEL,IAAID,CAAG;AAChB;AAEO,SAASE,GAAmBpH,GAAuB;AACxD,SAAOgH,GAAkBhH,CAAK,KAAK;AACrC;AAEO,SAASqH,GAAangC,GAAWC,GAAoB;AAC1D,MAAIya,GAAmB1a,CAAC,KAAK0a,GAAmBza,CAAC;AAC/C,WAAOya,GAAmB1a,CAAC,KAAK0a,GAAmBza,CAAC;AAEtD,QAAM+P,IAAO8vB,GAAkB9/B,CAAC,GAC1BiQ,IAAQ6vB,GAAkB7/B,CAAC;AACjC,SAAO+P,KAAQ,QAAQA,MAASC;AAClC;ACbO,SAASmwB,GAAW;AAAA,EACzB,OAAAtkB;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAn5B;AAAA,EACA,OAAAkT;AAAA,EACA,UAAAwtB;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AACF,GASG;AACD,QAAM,CAAC9gB,GAAO+gB,CAAQ,IAAIpiB,EAAS,MAAM,OAAOya,CAAK,CAAC,GAChD4H,IAAUxY,GAAO,EAAK,GACtByY,IAAYzY,GAAO,EAAK;AAE9B,EAAA1J,GAAU,MAAM;AACd,KAAI,CAACkiB,EAAQ,WAAWC,EAAU,aAChCF,EAAS,OAAO3H,CAAK,CAAC,GACtB6H,EAAU,UAAU;AAAA,EAExB,GAAG,CAAC7H,CAAK,CAAC;AAEV,QAAM8H,IAAc,CAAC5H,GAAa6H,MAA+B;AAC/D,UAAMxG,IAASwG,IACXC,GAAwB9H,CAAG,IAC3B,EAAE,SAASA,GAAK,QAAQ+H,GAAsB/H,CAAG,EAAE,OAAA;AACvD,IAAAyH,EAASpG,EAAO,OAAO,GACvBgG,EAAShG,EAAO,MAAM;AAAA,EACxB;AAEA,SACE,gBAAAv9B,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA2B,UAAAsf,GAAM;AAAA,IACjD,gBAAAhf,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,MAAA+V;AAAA,MACD,gBAAA/V,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAAmD;AAAA,YACA,cAAY,YAAYmc,CAAK;AAAA,YAC7B,SAAS,MAAMwkB,EAAO,EAAE;AAAA,YACxB,aAAa,MAAMC,EAAY,EAAE;AAAA,YACjC,WAAWC;AAAA,YACX,cAAcA;AAAA,YACf,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAhkC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAOkjB;AAAA,YACP,UAAA/f;AAAA,YACA,cAAYmc;AAAA,YACZ,SAAS,MAAM;AACb,cAAA4kB,EAAQ,UAAU;AAAA,YACpB;AAAA,YACA,UAAU,CAAC99B,MAAMg+B,EAAYh+B,EAAE,OAAO,OAAO,EAAK;AAAA,YAClD,QAAQ,MAAM;AACZ,cAAA89B,EAAQ,UAAU,IAClBE,EAAYlhB,GAAO,EAAI;AAAA,YACzB;AAAA,YACA,WAAW,CAAC9c,MAAM;AAChB,kBAAIA,EAAE,QAAQ,SAAS;AACrB,gBAAAA,EAAE,eAAA,GACDA,EAAE,OAA4B,KAAA;AAC/B;AAAA,cACF;AACA,cAAIA,EAAE,QAAQ,aAAaA,EAAE,QAAQ,gBACrCA,EAAE,eAAA,GACE,CAAAjD,MACJghC,EAAU,UAAU,IACpBL,EAAO19B,EAAE,QAAQ,YAAY,IAAI,EAAE;AAAA,YACrC;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAApG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAAmD;AAAA,YACA,cAAY,YAAYmc,CAAK;AAAA,YAC7B,SAAS,MAAMwkB,EAAO,CAAC;AAAA,YACvB,aAAa,MAAMC,EAAY,CAAC;AAAA,YAChC,WAAWC;AAAA,YACX,cAAcA;AAAA,YACf,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAEO,SAASQ,GAAY;AAAA,EAC1B,OAAAllB;AAAA,EACA,KAAAkkB;AAAA,EACA,QAAAiB;AAAA,EACA,UAAAC;AAAA,EACA,UAAAvhC;AAAA,EACA,oBAAAwhC,IAAqB;AAAA,EACrB,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AACF,GAUG;AACD,QAAMC,IAAYrZ,GAAOgY,GAAmBgB,KAAYD,CAAM,CAAC,GACzDO,IACJ9mB,GAAmBumB,CAAM,KACxBE,KAAsB,CAACnB,EAAI,KAAA;AAE9B,EAAAxhB,GAAU,MAAM;AACd,UAAMijB,IAAQ3B,GAAkBmB,CAAM;AACtC,IAAIQ,QAAiB,UAAUA;AAAA,EACjC,GAAG,CAACR,CAAM,CAAC;AAEX,QAAMS,IAAcxB,GAAmBsB,IAAcD,EAAU,UAAUN,CAAM;AAE/E,SACE,gBAAAnkC,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WACEglC,IACI,iDACA;AAAA,QAEN,OAAOA,IAAc,SAAY,EAAE,iBAAiBtB,GAAmBe,CAAM,EAAA;AAAA,QAE7E,UAAA,gBAAAzkC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAAmD;AAAA,YACA,cAAYmc;AAAA,YACZ,OAAO4lB;AAAA,YACP,UAAU,CAAC9+B,MAAM;AACf,cAAA2+B,EAAU,UAAU3+B,EAAE,OAAO,OAC7B0+B,EAAO1+B,EAAE,OAAO,KAAK;AAAA,YACvB;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,gBAAApG;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAAmD;AAAA,QACA,cAAY,GAAGmc,CAAK;AAAA,QACpB,aAAY;AAAA,QACZ,OAAO0lB,IAAc,KAAKxB;AAAA,QAC1B,UAAU,CAACp9B,MAAMw+B,EAAYx+B,EAAE,OAAO,KAAK;AAAA,QAC3C,QAAQy+B;AAAA,QACR,WAAW,CAACz+B,MAAM;AAChB,UAAIA,EAAE,QAAQ,YACZA,EAAE,eAAA,GACDA,EAAE,OAA4B,KAAA;AAAA,QAEnC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEO,SAAS++B,GAAS;AAAA,EACvB,OAAA7lB;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAoI;AAAA,EACA,UAAAvhC;AAAA,EACA,UAAA0gC;AAAA,EACA,SAAAuB;AACF,GAOG;AACD,QAAMJ,IAAc9mB,GAAmBoe,CAAK,GACtC+I,IAAUL,IAAcM,KAAoBhJ,EAAM,KAAA,IAASA,IAAQoI,GACnE,CAAClB,GAAK+B,CAAM,IAAI1jB,EAASmjB,IAAc,KAAKK,CAAO;AAEzD,EAAArjB,GAAU,MAAM;AACd,IAAAujB,EAAOP,IAAc,KAAKK,CAAO;AAAA,EACnC,GAAG,CAACA,GAASL,CAAW,CAAC;AAEzB,QAAMQ,IAAS,CAACzjC,MAAiB;AAC/B,QAAI,CAACA,EAAK,KAAA,KAAUmc,GAAmBnc,CAAI,GAAG;AAC5C,MAAAwjC,EAAO,EAAE,GACT1B,EAASyB,EAAiB;AAC1B;AAAA,IACF;AACA,UAAMG,IAAanC,GAAkBvhC,CAAI;AACzC,QAAI,CAAC0jC,GAAY;AACf,MAAAF,EAAOP,IAAc,KAAKK,CAAO;AACjC;AAAA,IACF;AACA,IAAAE,EAAOE,CAAU,GACjB5B,EAAS4B,CAAU;AAAA,EACrB;AAEA,SACE,gBAAAnlC,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,2BACb,UAAA;AAAA,MAAAgf;AAAA,MACA8lB,IACC,gBAAAplC,EAACojC,IAAA,EAAiB,OAAA9jB,GAAc,SAAS8lB,GAAS,UAAAjiC,GAAoB,IACpE;AAAA,IAAA,GACN;AAAA,IACA,gBAAAnD;AAAA,MAACwkC;AAAA,MAAA;AAAA,QACC,OAAAllB;AAAA,QACA,KAAAkkB;AAAA,QACA,QAAQ6B;AAAA,QACR,UAAAX;AAAA,QACA,UAAAvhC;AAAA,QACA,aAAaoiC;AAAA,QACb,UAAU,MAAMC,EAAOhC,CAAG;AAAA,QAC1B,QAAQgC;AAAA,MAAA;AAAA,IAAA;AAAA,EACV,GACF;AAEJ;AAEA,MAAME,KAA6C;AAAA,EACjD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,SAASC,KAAgB;AACvB,SACE,gBAAA3lC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAEJ;AAEA,SAAS4lC,KAAkB;AACzB,SACE,gBAAA5lC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAEJ;AAEA,SAAS6lC,KAAiB;AACxB,SACE,gBAAA7lC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAEJ;AAEA,MAAM8lC,KAAmD;AAAA,EACvD,wBAAOH,IAAA,EAAc;AAAA,EACrB,0BAASC,IAAA,EAAgB;AAAA,EACzB,yBAAQC,IAAA,CAAA,CAAe;AACzB;AAEO,SAASE,GAAS;AAAA,EACvB,OAAAzJ;AAAA,EACA,UAAAn5B;AAAA,EACA,UAAA0gC;AACF,GAIG;AACD,QAAM7iB,IAAQf,GAAoBqc,CAAK;AACvC,SACE,gBAAAh8B,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA0B,UAAA,aAAS;AAAA,IACnD,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BAA0B,MAAK,SAAQ,cAAW,aAC9D,UAAAgmC,GAAa,IAAI,CAACruB,MACjB,gBAAA3X;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW2X,MAAWqJ,IAAQ,cAAc;AAAA,QAC5C,UAAA7d;AAAA,QACA,cAAYuiC,GAAe/tB,CAAM;AAAA,QACjC,gBAAcA,MAAWqJ;AAAA,QACzB,gBAAc0kB,GAAe/tB,CAAM;AAAA,QACnC,SAAS,MAAMksB,EAASlsB,CAAM;AAAA,QAE7B,aAAYA,CAAM;AAAA,MAAA;AAAA,MATdA;AAAA,IAAA,CAWR,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEO,SAASsuB,KAAa;AAC3B,SACE,gBAAAjmC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,eAAY;AAAA,MAEZ,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AAGN;AAEO,SAASkmC,GAAgB5J,GAAuB;AAErD,MAAIv6B,IAAOu6B;AACX,QAAM6J,IAAYpkC,IAAO;AACzB,SAAIokC,MAAc,MAAGpkC,KAAQokC,IAC7BpkC,KAAQ,IACDA,KAAQ,MAAM,IAAIA;AAC3B;AAGO,SAASqkC,GAAgB9J,GAAe/sB,GAAuB;AACpE,SAAK,OAAO,SAAS+sB,CAAK,IACtB/sB,IAAQ,IAAU,KAAK,MAAM+sB,CAAK,IAAI/sB,IACtC,OAAO,UAAU+sB,CAAK,IAAUA,IAAQ/sB,IACrC,KAAK,MAAM+sB,CAAK,IAHa/sB;AAItC;ACnVO,SAAS82B,GAAsB;AAAA,EACpC,MAAAC;AAAA,EACA,SAAAlkC;AAAA,EACA,mBAAAmkC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,SAAAC;AACF,GAA+B;AAC7B,QAAMC,IAAUlb,GAAO4a,CAAI;AAC3B,EAAAM,EAAQ,UAAUN;AAClB,QAAMO,IAAYnb,GAAyC,EAAE;AAE7D,EAAA1J;AAAA,IACE,MAAM,MAAM;AACT,aAAO,OAAO6kB,EAAU,OAAO,EAAe;AAAA,QAAQ,CAACvwB,MACtD,OAAO,cAAcA,CAAE;AAAA,MAAA;AAAA,IAE3B;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMwwB,IAAO,CAACznC,GAAckQ,MAAkB;AAC5C,IAAAo3B,EAAQ,EAAE,CAACtnC,CAAG,IAAIunC,EAAQ,QAAQvnC,CAAG,KAAK,KAAKkQ,GAAO;AAAA,EACxD,GAEMw3B,IAAY,CAAC1nC,GAAckQ,MAAkB;AACjD,IAAAy3B,EAAS3nC,CAAG,GACZwnC,EAAU,QAAQxnC,CAAG,IAAI,OAAO,YAAY,MAAMynC,EAAKznC,GAAKkQ,CAAK,GAAG,GAAG;AAAA,EACzE,GAEMy3B,IAAW,CAAC3nC,MAAiB;AACjC,UAAMiX,IAAKuwB,EAAU,QAAQxnC,CAAG;AAChC,IAAIiX,MACF,OAAO,cAAcA,CAAE,GACvBuwB,EAAU,QAAQxnC,CAAG,IAAI;AAAA,EAE7B;AAEA,SACE,gBAAAiB,EAAAq7B,IAAA,EACE,UAAA;AAAA,IAAA,gBAAA37B;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,UAAU,CAACgX,MAASutB,EAAQ,EAAE,MAAAvtB,GAAM;AAAA,QACpC,QAAQ,CAAC7J,MAAUu3B,EAAK,QAAQv3B,CAAK;AAAA,QACrC,aAAa,CAACA,MAAUw3B,EAAU,QAAQx3B,CAAK;AAAA,QAC/C,WAAW,MAAMy3B,EAAS,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,gBAAAhnC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,OACE,gBAAApC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU,CAACoC;AAAA,YACX,SAAS,MAAMukC,EAAQ,EAAE,QAAQT,GAAgBI,EAAK,UAAU,CAAC,GAAG;AAAA,YAEpE,4BAACL,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,UAAU,CAACllB,MAAW4lB,EAAQ,EAAE,QAAA5lB,GAAQ;AAAA,QACxC,QAAQ,CAACxR,MAAUu3B,EAAK,UAAUv3B,CAAK;AAAA,QACvC,aAAa,CAACA,MAAUw3B,EAAU,UAAUx3B,CAAK;AAAA,QACjD,WAAW,MAAMy3B,EAAS,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAEpC,gBAAAhnC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,UAAU,CAAC6kC,MAAYN,EAAQ,EAAE,SAAAM,GAAS;AAAA,QAC1C,QAAQ,CAAC13B,MAAUu3B,EAAK,WAAWv3B,CAAK;AAAA,QACxC,aAAa,CAACA,MAAUw3B,EAAU,WAAWx3B,CAAK;AAAA,QAClD,WAAW,MAAMy3B,EAAS,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAErC,gBAAAhnC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,UAAU,CAAC8kC,MAAYP,EAAQ,EAAE,SAAAO,GAAS;AAAA,QAC1C,QAAQ,CAAC33B,MAAUu3B,EAAK,WAAWv3B,CAAK;AAAA,QACxC,aAAa,CAACA,MAAUw3B,EAAU,WAAWx3B,CAAK;AAAA,QAClD,WAAW,MAAMy3B,EAAS,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAErC,gBAAAhnC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOmB,EAAK,WAAW;AAAA,QACvB,UAAUC;AAAA,QACV,UAAU,CAACnkC;AAAA,QACX,UAAU,CAAC+kC,MAAYR,EAAQ,EAAE,SAASQ,KAAW,MAAM;AAAA,QAC3D,SAASb,EAAK,UAAU,MAAMK,EAAQ,EAAE,SAAS,KAAA,CAAM,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5DD,IACC,gBAAA1mC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAOsB;AAAA,QACP,OAAOH,EAAK,aAAa;AAAA,QACzB,UAAUE;AAAA,QACV,UAAU,CAACpkC;AAAA,QACX,UAAU,CAACglC,MAAcT,EAAQ,EAAE,WAAWS,KAAa,MAAM;AAAA,QACjE,SAASd,EAAK,YAAY,MAAMK,EAAQ,EAAE,WAAW,KAAA,CAAM,IAAI;AAAA,MAAA;AAAA,IAAA,IAE/D;AAAA,EAAA,GACN;AAEJ;AC7FA,SAASU,GACPhyB,GACAwI,GACmB;AAInB,SAAO;AAAA,IACL,GAJaA,IACXyjB,GAAqBzjB,GAAY,WAAW,IAC5CypB,GAAqBjyB,EAAM,IAAI,WAAW;AAAA,IAG5C,SAASA,EAAM;AAAA,IACf,WAAW;AAAA,EAAA;AAEf;AAEO,SAASkyB,GAAgB;AAAA,EAC9B,OAAAlyB;AAAA,EACA,UAAAmyB;AAAA,EACA,KAAAluB;AAAA,EACA,SAAAlX;AAAA,EACA,YAAAyb,IAAa;AAAA,EACb,mBAAA0oB;AAAA,EACA,gBAAAC;AAAA,EACA,YAAAiB;AAAA,EACA,kBAAAC;AACF,GAAyB;AACvB,QAAMvJ,IAAYlB,GAAkB5nB,EAAM,IAAIiE,EAAI,SAASA,EAAI,UAAU,GACnEklB,IAAYL,IAAYH,GAAeG,EAAU,IAAI7kB,EAAI,OAAO,IAAI,CAAA,GACpE2lB,IAAU3lB,EAAI,OAAO,OAAO,CAACtV,MAAMw6B,EAAU,SAASx6B,EAAE,EAAE,CAAC,GAE3D2jC,IADW1I,EAAQ,OAAO,CAACj7B,MAAMA,EAAE,OAAOqR,EAAM,EAAE,EAC/B,CAAC,GACpBuyB,IAAY,CAACthB;;AACjB,aAAAxoB,KAAAwb,EAAI,OAAO,KAAK,CAAC8mB,OAAMA,GAAE,OAAO9Z,CAAO,MAAvC,gBAAAxoB,GAA0C,SAAQ;AAAA,KAE9CoZ,IAAa6K;AAAA,IACjB,MACEzI,EAAI,OAAO,OAAO,CAAC5F,MACbA,EAAK,OAAO2B,EAAM,MAAM3B,EAAK,cAC7BA,EAAK,YAAY2B,EAAM,UAAgB,KACpC8nB,GAAsBzpB,GAAM4F,EAAI,SAASA,EAAI,UAAU,MAAMkuB,CACrE;AAAA,IACH,CAACluB,EAAI,SAASA,EAAI,YAAYA,EAAI,QAAQkuB,GAAUnyB,EAAM,IAAIA,EAAM,OAAO;AAAA,EAAA,GAGvE,CAACwyB,GAAaC,CAAc,IAAIjmB;AAAA,IACpC8lB,IAAU,OAAOA,EAAQ,OAAO,IAAI;AAAA,EAAA,GAEhC,CAACI,GAAUC,CAAW,IAAInmB,EAAS8lB,IAAU,OAAOA,EAAQ,EAAE,IAAI,EAAE,GACpE,CAACM,GAAaC,CAAc,IAAIrmB,EAAS,EAAE,GAC3C,CAACsmB,GAAWC,CAAY,IAAIvmB;AAAA,IAA4B,MAC5DwlB,GAAyBhyB,GAAOwI,CAAU;AAAA,EAAA,GAEtCwqB,KAAe3c,GAAOyc,CAAS;AACrC,EAAAE,GAAa,UAAUF,GAEvBnmB,GAAU,MAAM;AACd,IAAAomB,EAAaf,GAAyBhyB,GAAOwI,CAAU,CAAC;AAAA,EAC1D,GAAG,CAACxI,GAAOwI,CAAU,CAAC;AAEtB,QAAMyqB,KAAaC;AAAA,IACjB,CAACC,MAAwC;AACvC,YAAMzmC,KAAOslC,GAAyBhyB,GAAO;AAAA,QAC3C,GAAGgzB,GAAa;AAAA,QAChB,GAAGG;AAAA,QACH,SAASnzB,EAAM;AAAA,MAAA,CAChB;AAED,MADA+yB,EAAarmC,EAAI,GACZK,MACLslC,KAAA,QAAAA,EAAmB3lC;AAAA,IACrB;AAAA,IACA,CAACK,GAASslC,GAAkBryB,CAAK;AAAA,EAAA;AAGnC,EAAA2M,GAAU,MAAM;AACd,IAAA8lB,EAAeH,IAAU,OAAOA,EAAQ,OAAO,IAAI,EAAE,GACrDK,EAAYL,IAAU,OAAOA,EAAQ,EAAE,IAAI,EAAE;AAAA,EAC/C,GAAG,CAACtyB,EAAM,IAAI8oB,KAAA,gBAAAA,EAAW,IAAIwJ,KAAA,gBAAAA,EAAS,IAAIA,KAAA,gBAAAA,EAAS,OAAO,CAAC;AAE3D,QAAMc,IAAarK,GAAmBlnB,GAAYoC,EAAI,MAAM,GACtDovB,KAAsBxxB,EAAW;AAAA,IACrC,CAACxD,MAAS,OAAOA,EAAK,OAAO,MAAMm0B;AAAA,EAAA,GAG/Bc,IAAUzxB,EAAW,OAAO,CAACxD,MAAS,CAAC8qB,EAAU,SAAS9qB,EAAK,EAAE,CAAC,GAClEk1B,KAAYxK,GAAmBuK,GAASrvB,EAAI,MAAM,GAClDuvB,KAAsBF,EAAQ;AAAA,IAClC,CAACj1B,MAAS,OAAOA,EAAK,OAAO,MAAMu0B;AAAA,EAAA,GAG/Ba,KAAiB,CAACtkC,GAAeC,OAAgB;AACrD,IAAAgjC,EAAWzH,GAAsB1mB,GAAK9U,GAAMC,EAAE,CAAC;AAAA,EACjD,GAEMskC,KAAgB,CAACC,MAA2B;AAChD,IAAIA,EAAY,SAAS,KACzBvB;AAAA,MACE/G,GAAsBpnB,GAAK0vB,GAAa;AAAA,QACtC,MAAM7K,KAAA,gBAAAA,EAAW;AAAA,QACjB,aAAYA,KAAA,gBAAAA,EAAW,eAAc;AAAA,QACrC,aAAaA,KAAA,gBAAAA,EAAW;AAAA,MAAA,CACzB;AAAA,IAAA;AAAA,EAEL,GAEM8K,KAAkB,CAACC,MAAmB;AAC1C,IAAAlB,EAAYkB,CAAM;AAClB,UAAMzkC,KAAK6U,EAAI,OAAO,KAAK,CAACtV,OAAMA,GAAE,OAAO,OAAOklC,CAAM,CAAC;AACzD,IAAI,CAACzkC,MAAM,CAACrC,KACZ0mC,GAAezzB,GAAO5Q,EAAE;AAAA,EAC1B,GAEM0kC,KAAmB,CAACD,MAAmB;AAC3C,UAAMnnC,KAAOuX,EAAI,OAAO,KAAK,CAACtV,OAAMA,GAAE,OAAO,OAAOklC,CAAM,CAAC;AAC3D,IAAI,CAACnnC,MAAQ,CAACK,MACd2mC,GAAc,CAAC,GAAG9J,GAAS5pB,GAAOtT,EAAI,CAAC,GACvCmmC,EAAe,EAAE;AAAA,EACnB,GAEMkB,KAAiB,CACrB/K,GACA1sB,OAEA0sB,EAAS,IAAI,CAAC3qB,OAAS;AACrB,UAAM21B,KAAStM,GAAoBrpB,GAAK,IAAI4F,EAAI,OAAO,KAAK;AAC5D,WAAO;AAAA,MACL,OAAO,OAAO5F,GAAK,EAAE;AAAA,MACrB,OAAOA,GAAK;AAAA,MACZ,MAAM21B,KAAS,WAAW;AAAA,MAC1B,SAASC;AAAA,QACP33B;AAAA,QACA03B;AAAA,QACAA,KAAS7C,IAAiB;AAAA,MAAA;AAAA,MAE5B,WAAW,CAAC6C;AAAA,IAAA;AAAA,EAEhB,CAAC;AAEH,SACE,gBAAA/oC,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,SAAI,WAAU,gCACZ,UAAAwnC,MAAa,cAAc,mBAAmB,kBACjD;AAAA,IACCA,MAAa,cACZ,gBAAAxnC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,kGAAA,CAGpC,IAEA,gBAAAA,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,yFAGpC;AAAA,IAGDwnC,MAAa,eACZ,gBAAAlnC,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO1B;AAAA,YACP,UAAU,CAACzlC,KAAWqmC,EAAW,WAAW;AAAA,YAC5C,aAAY;AAAA,YACZ,SAASA,EAAW,IAAI,CAAC7qC,OAAW;AAAA,cAClC,OAAO,OAAOA,EAAM,EAAE;AAAA,cACtB,OAAOA,EAAM;AAAA,YAAA,EACb;AAAA,YACF,UAAU,CAAC4rC,MAAc;AACvB,cAAA1B,EAAe0B,CAAS,GACxBxB;AAAA,gBACEL,KAAW,OAAOA,EAAQ,OAAO,MAAM6B,IACnC,OAAO7B,EAAQ,EAAE,IACjB;AAAA,cAAA;AAAA,YAER;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,GACF;AAAA,MACA,gBAAArnC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOxB;AAAA,YACP,UAAU,CAAC3lC,KAAW,CAACylC;AAAA,YACvB,aACEA,IACI,sCACA;AAAA,YAEN,YAAU;AAAA,YACV,SAASuB,GAAeV,IAAqB,WAAW;AAAA,YACxD,UAAUO;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,GACF;AAAA,MACCtB,IACC,gBAAArnC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA;AAAA,QAAA;AAAA,QACzB+U,EAAM;AAAA,QAAI;AAAA,QAAIsyB,EAAQ;AAAA,QAAI;AAAA,QAAGC,EAAUvyB,EAAM,OAAO;AAAA,QAAE;AAAA,QAAG;AAAA,QACjEuyB,EAAUD,EAAQ,OAAO;AAAA,QAAE;AAAA,SAAGxJ,KAAA,gBAAAA,EAAW,cAAa;AAAA,QAAK;AAAA,MAAA,EAAA,CAC9D,IACE;AAAA,MACH/7B,KAAW+7B,IACV,gBAAAn+B,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAMynC,EAAW1H,GAAwBzmB,GAAK6kB,EAAU,EAAE,CAAC;AAAA,UACrE,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH,IACE;AAAA,IAAA,GACN;AAAA,IAGDqJ,MAAa,cACZ,gBAAAlnC,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAA37B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA,SAAK;AAAA,MAC7Ci/B,EAAQ,IAAI,CAACvrB,MACZ,gBAAApT,EAAC,OAAA,EAAkB,WAAU,uBAC3B,UAAA;AAAA,QAAA,gBAAAA,EAAC,QAAA,EACE,UAAA;AAAA,UAAAsnC,EAAUl0B,EAAK,OAAO;AAAA,UAAE;AAAA,UAAG;AAAA,UAC5B,gBAAA1T,EAAC,QAAA,EAAK,WAAU,0BAA0B,YAAK,IAAA,CAAI;AAAA,QAAA,GACrD;AAAA,QACCoC,KAAW68B,EAAQ,SAAS,KAAKvrB,EAAK,OAAO2B,EAAM,KAClD,gBAAArV;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM+oC,GAAc9J,EAAQ,OAAO,CAACj7B,OAAMA,GAAE,OAAO0P,EAAK,EAAE,CAAC;AAAA,YACrE,UAAA;AAAA,UAAA;AAAA,QAAA,IAGC;AAAA,MAAA,KAbIA,EAAK,EAcf,CACD;AAAA,MACAurB,EAAQ,WAAW,IAClB,gBAAAj/B,EAAC,OAAE,WAAU,wBAAuB,iDAAmC,IACrE;AAAA,MACJ,gBAAAM,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOtB;AAAA,YACP,UAAU,CAAC7lC,KAAWwmC,GAAU,WAAW;AAAA,YAC3C,aAAY;AAAA,YACZ,SAASA,GAAU,IAAI,CAAChrC,OAAW;AAAA,cACjC,OAAO,OAAOA,EAAM,EAAE;AAAA,cACtB,OAAOA,EAAM;AAAA,YAAA,EACb;AAAA,YACF,UAAUsqC;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,GACF;AAAA,MACA,gBAAA5nC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAM;AAAA,YACN,UAAU,CAACnnC,KAAW,CAAC6lC;AAAA,YACvB,aACEA,IACI,qCACA;AAAA,YAEN,YAAU;AAAA,YACV,SAASmB,GAAeP,IAAqB,UAAU;AAAA,YACvD,UAAUM;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,GACF;AAAA,MACC/mC,KAAW+7B,IACV,gBAAAn+B,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAMynC,EAAW1H,GAAwBzmB,GAAK6kB,EAAU,EAAE,CAAC;AAAA,UACrE,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH,IACE;AAAA,IAAA,GACN;AAAA,IAGDuJ,IACC,gBAAApnC,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAA37B,EAAC,OAAA,EAAI,WAAU,4DAA2D,UAAA,UAE1E;AAAA,MACA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA,gBAAAA;AAAA,QAACqmC;AAAA,QAAA;AAAA,UACC,MAAM8B;AAAA,UACN,SAAA/lC;AAAA,UACA,mBAAmBqnC;AAAA,YACjB;AAAA,YACAlD;AAAA,UAAA;AAAA,UAEF,gBAAAC;AAAA,UACA,gBAAe;AAAA,UACf,SAAS8B;AAAA,QAAA;AAAA,MAAA,EACX,CACF;AAAA,IAAA,EAAA,CACF,IACE;AAAA,EAAA,GACN;AAEJ;AC5UO,MAAMoB,KAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAChB,GAMaC,KAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,KAA+B,CAAC,SAAS,MAAM;AAE9C,SAASC,GAAmBl4B,GAA0B;AAC3D,SAAO,CAACi4B,GAAgB,SAASj4B,CAAI;AACvC;AAGO,SAASm4B,GAAmBnrC,GAAyC;AAC1E,SACEA,KACA,CAACgrC,GAAkB,SAAShrC,CAAO,KACnCkrC,GAAmBlrC,CAAO,IAEnB,CAAC,GAAGgrC,IAAmBhrC,CAAO,IAEhCgrC;AACT;AASO,SAASI,GAAep4B,GAAsB;AACnD,SAAO+3B,GAAkB/3B,CAAiB,KAAKA;AACjD;AC7DO,MAAMq4B,KAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmBO,SAASC,GAAiBt4B,GAA2C;AAC1E,SAAQq4B,GAA6C,SAASr4B,CAAI;AACpE;AAEO,SAASu4B,GAAiBv4B,GAAuB;AACtD,SAAOA,MAAS,UAAUA,MAAS;AACrC;AAEO,SAASw4B,GAAmBtsB,GAAwD;AACzF,SAAO,GACLA,KAAcA,EAAW,eAAe,cAAcA,EAAW,cAAc;AAEnF;AAEO,SAASusB,GAAkBvsB,GAAwD;;AACxF,SAAO,GACLA,KACEA,EAAW,eAAe,cACzBA,EAAW,aAAa,SAAgB/f,IAAA+f,EAAW,gBAAX,QAAA/f,EAAwB;AAEvE;AAEO,SAASusC,GAAgBxsB,GAAwD;;AACtF,SAAO,GACLA,KACEA,EAAW,eAAe,YACzBA,EAAW,WAAW,SAAgB/f,IAAA+f,EAAW,gBAAX,QAAA/f,EAAwB;AAErE;AAEO,SAASwsC,GAAkBzsB,GAAwD;AACxF,SAAO0sB,GAAoB1sB,CAAU;AACvC;AAEO,SAASwC,GACdmJ,GAC6B;AAC7B,SAAO,IAAI,IAAIA,EAAY,IAAI,CAAC9V,MAAS,CAACA,EAAK,SAASA,CAAI,CAAC,CAAC;AAChE;AAGO,SAAS82B,GACd51B,GACA4U,GAWA;AACA,QAAMihB,IAAUpqB,GAAoBmJ,CAAW,GACzCkhB,IAAc,CAAA,GACdtrB,IAAiB,CAAA,GACjBurB,IAAc,CAAA,GACdC,IAAwB,CAAA,GACxBC,IAA2B,CAAA,GAC3BC,IAAwB,CAAA,GACxBC,IAAc,CAAA,GACdC,IAAwB,CAAA,GACxBC,IAAkB,CAAA;AACxB,aAAW51B,KAAST,GAAQ;AAC1B,QAAIS,EAAM,WAAY;AACtB,UAAMwI,IAAa4sB,EAAQ,IAAIp1B,EAAM,EAAE,KAAK;AAC5C,QAAIA,EAAM,SAAS,UAAU;AAC3B,MAAIi1B,GAAkBzsB,CAAU,IAAGktB,EAAO,KAAK11B,CAAK,IAC/C21B,EAAiB,KAAK31B,CAAK;AAChC;AAAA,IACF;AACA,IAAI80B,GAAmBtsB,CAAU,IAAG6sB,EAAO,KAAKr1B,CAAK,IAC5C+0B,GAAkBvsB,CAAU,IAAGuB,EAAU,KAAK/J,CAAK,IACnDg1B,GAAgBxsB,CAAU,IAAG8sB,EAAO,KAAKt1B,CAAK,IAC9C40B,GAAiB50B,EAAM,IAAI,KAAK,CAACi1B,GAAkBzsB,CAAU,MACpEotB,EAAW,KAAK51B,CAAK,GACjB60B,GAAiB70B,EAAM,IAAI,IAAGu1B,EAAiB,KAAKv1B,CAAK,IACpDA,EAAM,SAAS,YAAWw1B,EAAoB,KAAKx1B,CAAK,IACxDA,EAAM,SAAS,kBAAgBy1B,EAAiB,KAAKz1B,CAAK;AAAA,EAEvE;AACA,SAAO;AAAA,IACL,QAAAq1B;AAAA,IACA,WAAAtrB;AAAA,IACA,QAAAurB;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;AC3GO,SAASC,GAAkBv5B,GAAuB;AACvD,SAAOA,MAAS;AAClB;AAEO,SAASw5B,GAA8Cv2B,GAAkB;AAC9E,SAAOA,EAAO,OAAO,CAACS,MAAU61B,GAAkB71B,EAAM,IAAI,KAAK,CAACA,EAAM,UAAU;AACpF;AAEO,SAAS+1B,GACdx2B,GACyC;AACzC,SAAOu2B,GAAkBv2B,CAAM,EAAE,IAAI,CAACS,OAAW;AAAA,IAC/C,OAAO,OAAOA,EAAM,EAAE;AAAA,IACtB,OAAOA,EAAM;AAAA,EAAA,EACb;AACJ;AAEO,SAASg2B,GACdC,GACA9hB,GACe;;AACf,WAAO1rB,IAAA0rB,EAAY,KAAK,CAAClJ,MAAQA,EAAI,YAAYgrB,CAAO,MAAjD,gBAAAxtC,EAAoD,YAAW;AACxE;AAEO,SAASytC,GACdZ,GACAnhB,GACK;AACL,QAAMgiB,IAAO,IAAI;AAAA,IACfhiB,EACG,IAAI,CAAClJ,MAAQA,EAAI,OAAO,EACxB,OAAO,CAAChK,MAAqBA,KAAM,IAAI;AAAA,EAAA;AAE5C,SAAOq0B,EAAO,OAAO,CAACc,MAAU,CAACD,EAAK,IAAIC,EAAM,EAAE,CAAC;AACrD;AAEO,SAASC,GACdD,GACAE,GAC+C;AAC/C,SAAO;AAAA,IACL,OAAOF,EAAM,KAAK,UAAU,SAASA,EAAM,EAAE;AAAA,IAC7C,IAAI,SAASA,EAAM,EAAE;AAAA,IACrB,MAAME,IAAc,CAACA,CAAW,IAAI,CAAC,UAAU;AAAA,EAAA;AAEnD;ACxDO,SAASC,GAAczrB,GAO2B;;AACvD,QAAMmgB,MAAOxiC,IAAAqiB,EAAM,iBAAN,gBAAAriB,EAAoB,WAAU,MACrC+tC,IAAO,CAAC1rB,EAAM,SAAS;AAC7B,SAAIA,EAAM,eAAa0rB,EAAK,KAAK1rB,EAAM,SAAS,GACzC,EAAE,OAAOmgB,GAAM,IAAIngB,EAAM,KAAK,MAAA0rB,EAAA;AACvC;AAEO,MAAMC,KAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,SAASC,GACd3uC,GAC4B;AAC5B,SACEA,KAAW,QACV0uC,GAAyC,SAAS1uC,CAAO;AAE9D;AAGO,SAAS4uC,GACd5uC,GACA6uC,GACS;AACT,SAAOF,GAAkB3uC,CAAO,KAAK6uC,IAAgB;AACvD;AAUO,SAASC,GAAwC1uC,GAAkB;AACxE,QAAMG,IAAUH,EAAO,OAAO,CAACI,MAAUA,EAAM,SAAS,SAAS,GAC3DuuC,IAAkB3uC,EACrB,OAAO,CAACI,MAAUA,EAAM,SAAS,OAAO,EACxC,MAAA,EACA,KAAKwuC,EAAqB,EAC1B,QAAA;AACH,SAAO,CAAC,GAAGzuC,GAAS,GAAGwuC,CAAe;AACxC;AAEO,SAASE,GACdz3B,GACApX,GACK;AACL,QAAM8uC,IAAY,IAAI;AAAA,IACpBJ,GAAmB1uC,CAAM,EAAE,IAAI,CAACI,GAAO2jB,MAAU,CAAC3jB,EAAM,IAAI2jB,CAAK,CAAC;AAAA,EAAA;AAEpE,SAAO3M,EAAO,MAAA,EAAQ,KAAK,CAACpR,GAAGC,MAAM;AACnC,UAAM67B,IAAKgN,EAAU,IAAI9oC,EAAE,OAAO,KAAK,OAAO,mBACxC+7B,IAAK+M,EAAU,IAAI7oC,EAAE,OAAO,KAAK,OAAO;AAC9C,WAAO67B,IAAKC;AAAA,EACd,CAAC;AACH;ACnDO,SAASgN,GACdC,GACAhvC,GACQ;AACR,MAAIgvC,EAAO,SAAS,WAAY,QAAO;AACvC,MAAIA,EAAO,SAAS,YAAa,QAAO;AACxC,MAAIA,EAAO,SAAS,QAAQ;AAC1B,UAAM5uC,IAAQJ,EAAO,KAAK,CAAC4iC,MAAMA,EAAE,OAAOoM,EAAO,OAAO;AACxD,YAAO5uC,KAAA,gBAAAA,EAAO,UAAS,YAAY,iBAAiB;AAAA,EACtD;AACA,SAAO;AACT;AAGO,SAAS6uC,GAAkBjvC,GAAyC;AACzE,SAAOA,EAAO,OAAO,CAAC4iC,MAAMA,EAAE,SAAS,OAAO,EAAE;AAClD;AAqBO,SAASsM,GAAY9oB,GAAe+oB,GAAiBC,GAA2B;AAErF,MADahpB,EAAI,QAAQ+oB,CAAO,IACrB,EAAG,QAAO/oB;AACrB,QAAMipB,IAAUjpB,EAAI,OAAO,CAACtN,MAAOA,MAAOq2B,CAAO,GAC3CG,IAAU,KAAK,IAAI,GAAG,KAAK,IAAIF,GAASC,EAAQ,MAAM,CAAC,GACvD9qC,IAAO,CAAC,GAAG8qC,CAAO;AACxB,SAAA9qC,EAAK,OAAO+qC,GAAS,GAAGH,CAAO,GACxB5qC;AACT;AAGO,SAASgrC,GACdhyB,GACAiyB,GACAC,GACAl9B,GACQ;AACR,MAAIA,KAAS,KAAKk9B,KAAa,EAAG,QAAO;AACzC,QAAM1rB,IAAQ,KAAK,OAAOxG,IAAUiyB,IAAUC,IAAY,KAAKA,CAAS;AACxE,SAAO,KAAK,IAAI,GAAG,KAAK,IAAIl9B,IAAQ,GAAGwR,CAAK,CAAC;AAC/C;AAGO,SAAS2rB,GACdC,GACAC,GACAH,GACAI,GACe;AACf,SAAIF,IAAY,KAAKC,MAAcD,KAAaF,KAAa,IAAU,OACnEG,IAAYD,IAAkBC,IAAYH,IACvCG,IAAYH,IAAYI;AACjC;AAEA,SAASC,GAAY9pC,GAAaC,GAAsB;AACtD,SAAOD,EAAE,WAAWC,EAAE,UAAUD,EAAE,MAAM,CAAC8S,GAAItM,MAAMsM,MAAO7S,EAAEuG,CAAC,CAAC;AAChE;AAkCA,SAASujC,GAAYn0B,GAAsB;AACzC,SAAIA,IAAO,OAAa,GAAGA,CAAI,OAC3BA,IAAO,OAAO,OAAa,IAAIA,IAAO,MAAM,QAAQ,CAAC,CAAC,QACnD,IAAIA,KAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC7C;AAEA,SAASo0B,GAAYnuC,GAA+C;;AAClE,SAAKA,OACQvB,IAAAuB,EAAI,MAAM,GAAG,EAAE,IAAA,MAAf,gBAAAvB,EAAsB,WACpB;AACjB;AAEA,SAAS2vC,GAAU1rC,GAAqB;AACtC,SAAOA,EAAK,KAAK,YAAA,EAAc,SAAS,MAAM,KAAKA,EAAK,SAAS;AACnE;AAEA,SAAS2rC,KAAW;AAClB,SACE,gBAAA1tC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,IAAA;AAAA,EAAA,GAElB;AAEJ;AAGA,SAAS2tC,KAAY;AACnB,SACE,gBAAArtC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAN,EAAC,YAAA,EAAS,QAAO,eAAA,CAAe;AAAA,QAChC,gBAAAA,EAAC,QAAA,EAAK,GAAE,iFAAA,CAAiF;AAAA,QACzF,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,QACtC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG5C;AAEO,SAAS4tC,GACdhwC,GACAiwC,IAAa,GACb;AACA,QAAMC,IAAYlwC,EAAM,SAAS,WAC3BgX,IACJi5B,MAAe,IAAI,YAAY,GAAGA,CAAU;AAC9C,SAAO;AAAA,IACL,OAAOC,IAAY,wBAAwB,WAAWlwC,EAAM,IAAI;AAAA,IAChE,MAAMkwC,IACF,+BAA+Bl5B,CAAM,iFACrC,sBAAsBA,CAAM;AAAA,IAChC,QAAQk5B,IAAY,mBAAmB;AAAA,EAAA;AAE3C;AAEO,SAASC,GAAY;AAAA,EAC1B,QAAAvwC;AAAA,EACA,WAAAwwC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,QAAA1B;AAAA,EACA,gBAAA2B;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AACF,GAAqB;AACnB,QAAM,CAACjO,GAAMkO,CAAO,IAAI3sB,EAAS,EAAE,GAC7B,CAAC4sB,GAAMC,CAAO,IAAI7sB,EAAsB,IAAI,GAC5C,CAAC8sB,GAAMC,CAAO,IAAI/sB,EAAS,EAAK,GAChC,CAACgtB,GAAOC,CAAQ,IAAIjtB,EAAwB,IAAI,GAChD,CAACktB,GAAUC,CAAW,IAAIntB,EAAwB,IAAI,GACtD,CAACotB,GAAUC,CAAW,IAAIrtB,EAAS,EAAK,GACxC,CAACstB,GAAiBC,CAAkB,IAAIvtB,EAAwB,IAAI,GACpE,CAACwtB,IAAUC,EAAW,IAAIztB,EAAS,EAAK,GACxC,CAAC0tB,GAAMC,EAAO,IAAI3tB,EAA2B,IAAI,GACjD,CAACurB,GAAWqC,EAAY,IAAI5tB,EAAwB,IAAI,GACxD,CAAC6tB,IAAYC,EAAa,IAAI9tB,EAA0B,IAAI,GAC5D,CAAC+tB,IAAeC,EAAgB,IAAIhuB,EAAS,EAAK,GAClD,CAACiuB,IAAiBC,EAAkB,IAAIluB,EAAwB,IAAI,GACpEmuB,IAAetkB,GAAyB,IAAI,GAC5CukB,KAAevkB,GAAuB,IAAI,GAC1CwkB,KAAWxkB,GAAuB,IAAI,GACtCykB,KAAgBzkB,GAAwB,IAAI,GAC5C0kB,KAAU1kB,GAAyB,IAAI,GAEvC/tB,KAAUokB;AAAA,IACd,MAAMvkB,EAAO,KAAK,CAAC4iC,MAAMA,EAAE,SAAS,SAAS,KAAK;AAAA,IAClD,CAAC5iC,CAAM;AAAA,EAAA,GAEH6yC,KAAe,GAAQ1yC,MAAA,QAAAA,GAAS,gBAAgBA,MAAA,QAAAA,GAAS,eACzDkwC,KAAa,CAACvnB,OAAoB2nB,KAAA,gBAAAA,EAAmB3nB,OAAY,GACjEgqB,KAAiBvuB;AAAA,IACrB,MACEvkB,EACG,OAAO,CAAC4iC,MAAMA,EAAE,SAAS,OAAO,EAChC,QACA,KAAKgM,EAAqB;AAAA,IAC/B,CAAC5uC,CAAM;AAAA,EAAA,GAEH+yC,KAAexuB;AAAA,IACnB,MAAMuuB,GAAe,IAAI,CAAC1yC,MAAUA,EAAM,EAAE;AAAA,IAC5C,CAAC0yC,EAAc;AAAA,EAAA,GAEXE,KAAgBzuB,GAAQ,MAAM;AAElC,UAAM6B,IAAM2rB,KAAQ,OAAOgB,KAAgBb,MAAca,IACnDE,IAAO,IAAI,IAAIH,GAAe,IAAI,CAAC1yC,OAAU,CAACA,GAAM,IAAIA,EAAK,CAAC,CAAC;AACrE,WAAOgmB,EACJ,IAAI,CAACtN,OAAOm6B,EAAK,IAAIn6B,EAAE,CAAC,EACxB,OAAO,CAAC1Y,OAA4BA,MAAS,IAAI;AAAA,EACtD,GAAG,CAAC0yC,IAAgBC,IAAchB,GAAMG,EAAU,CAAC,GAC7CgB,IACJlE,EAAO,SAAS,SACZhvC,EAAO,KAAK,CAAC4iC,MAAMA,EAAE,OAAOoM,EAAO,OAAO,KAAK,OAC/C,MACAmE,KACJnE,EAAO,SAAS,eAAckE,KAAA,gBAAAA,EAAS,UAAS,WAC5CE,KAAY1C,KAAa,CAAC,CAACE,KAAiB,CAAC,CAACC,GAC9CwC,KAAaD,MAAa,CAAC,CAACrC,KAAmB+B,GAAe,SAAS;AAE7E,EAAAtuB,GAAU,MAAM;AACd,IAAIwqB,EAAO,SAAS,eAAckE,KAAA,gBAAAA,EAAS,UAAS,aAClDlC,EAAQ,SAAS,GACjBE,EAAQ,IAAI,KACHlC,EAAO,SAAS,eACzBgC,EAAQ,EAAE,GACVE,EAAQ,IAAI,KACHlC,EAAO,SAAS,UAAUkE,MACnClC,EAAQkC,EAAQ,IAAI,GACpBhC,EAAQ,IAAI,IAEdI,EAAS,IAAI,GACbM,EAAmB,IAAI,GACvBE,GAAY,EAAK,GACjBN,EAAY,IAAI,GAChBa,GAAiB,EAAK;AAAA,EACxB,GAAG,CAACrD,GAAQkE,KAAA,gBAAAA,EAAS,IAAIA,KAAA,gBAAAA,EAAS,MAAMA,KAAA,gBAAAA,EAAS,IAAI,CAAC,GAEtD1uB,GAAU,MAAM;AACd,QAAImtB,KAAmB,KAAM;AAC7B,UAAMla,IAAQ,CAAC7uB,MAAqB;AAClC,MAAIA,EAAE,QAAQ,YAAY,CAACipC,QAA6B,IAAI;AAAA,IAC9D;AACA,kBAAO,iBAAiB,WAAWpa,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,EAC1D,GAAG,CAACka,GAAiBE,EAAQ,CAAC,GAE9BrtB,GAAU,MAAM;AACd,QAAI,CAACysB,GAAM;AACT,MAAAsB,GAAmB,IAAI;AACvB;AAAA,IACF;AACA,UAAMtuB,IAAM,IAAI,gBAAgBgtB,CAAI;AACpC,WAAAsB,GAAmBtuB,CAAG,GACtBouB,GAAiB,EAAK,GACf,MAAM,IAAI,gBAAgBpuB,CAAG;AAAA,EACtC,GAAG,CAACgtB,CAAI,CAAC,GAET0B,GAAc,UAAUT,IACxBU,GAAQ,UAAUb,GAElBvtB,GAAU,MAAM;AACd,IAAIutB,KAAQ,QAAQG,MAAc,QAC9BpC,GAAYiD,IAAcb,EAAU,QAAiB,IAAI;AAAA,EAC/D,GAAG,CAACa,IAAchB,GAAMG,EAAU,CAAC;AAEnC,QAAMoB,KAAc,CAAC/uC,MAAkC;AACrD,QAAKA,GACL;AAAA,UAAI,CAAC0rC,GAAU1rC,CAAI,GAAG;AACpB,QAAA+sC,EAAS,qBAAqB;AAC9B;AAAA,MACF;AACA,MAAAA,EAAS,IAAI,GACbJ,EAAQ3sC,CAAI;AAAA;AAAA,EACd,GAEMgvC,KAAW,CAACnzC,MAAmB;AACnC,IAAAuwC,EAAe,EAAE,MAAM,QAAQ,SAASvwC,EAAM,IAAI;AAAA,EACpD,GAEMozC,KAAS,OAAOC,MAAyB;;AAC7C,UAAMC,IAAoBzC;AAC1B,QAAIkC;AACF,UAAI,CAACO,MAAY1E,EAAO,SAAS,cAAc,EAACkE,KAAA,QAAAA,EAAS,gBAAe;AACtE,QAAA5B,EAAS,qBAAqB;AAC9B;AAAA,MACF;AAAA,eACS,CAACxO,EAAK,QAAQ;AACvB,MAAAwO,EAAS,gBAAgB;AACzB;AAAA,IACF;AACA,QAAItC,EAAO,SAAS,eAAe,CAAC0E,GAAS;AAC3C,MAAApC,EAAS,qBAAqB;AAC9B;AAAA,IACF;AACA,IAAAF,EAAQ,EAAI,GACZE,EAAS,IAAI,GACToC,OAAqB,CAAC;AAC1B,QAAI;AACF,MAAI1E,EAAO,SAAS,aAClB,OAAM4B,KAAA,gBAAAA,EAAgB;AAAA,QACpB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM8C,KAAW;AAAA,QACjB,YAAYlC;AAAA,MAAA,MAELxC,EAAO,SAAS,cACzB,OAAM4B,KAAA,gBAAAA,EAAgB;AAAA,QACpB,MAAM9N,EAAK,KAAA;AAAA,QACX,MAAM;AAAA,QACN,cAAYxiC,KAAAkwC,EAAU,CAAC,MAAX,gBAAAlwC,GAAc,OAAM;AAAA,QAChC,MAAMozC,KAAW;AAAA,QACjB,YAAYlC;AAAA,MAAA,MAELxC,EAAO,SAAS,UAAUkE,KACnC,OAAMrC,KAAA,gBAAAA,EAAgB;AAAA,QACpB,SAASqC,EAAQ;AAAA,QACjB,MAAMA,EAAQ,SAAS,YAAY,YAAYpQ,EAAK,KAAA;AAAA,QACpD,MAAM4Q,KAAW;AAAA,QACjB,YAAYlC;AAAA,MAAA,KAGhBA,EAAY,GAAG,GACfb,EAAe,EAAE,MAAM,QAAQ;AAAA,IACjC,SAAS/nC,IAAG;AACV,MAAA0oC,EAAS1oC,cAAa,QAAQA,GAAE,UAAU,uBAAuB,GACjE4oC,EAAY,IAAI;AAAA,IAClB,UAAA;AACE,MAAAJ,EAAQ,EAAK;AAAA,IACf;AAAA,EACF,GAEMuC,KAAS,OAAOvzC,MAAmB;AACvC,QAAI,GAAC0wC,KAAiBe,KACtB;AAAA,MAAAC,GAAY,EAAI,GAChBR,EAAS,IAAI;AACb,UAAI;AACF,cAAMR,EAAc1wC,EAAM,EAAE,GAC5BwxC,EAAmB,IAAI,GACvBjB,EAAe,EAAE,MAAM,QAAQ;AAAA,MACjC,SAAS/nC,GAAG;AACV,QAAA0oC,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,yBAAyB;AAAA,MACrE,UAAA;AACE,QAAAkpC,GAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF,GAEM8B,KAAoB,MAAM;AAC9B,UAAMxzC,IAAQJ,EAAO,KAAK,CAAC4iC,OAAMA,GAAE,OAAO+O,CAAe;AACzD,QAAI,CAACvxC,EAAO,QAAO;AACnB,UAAMujC,IAAOyM,GAAkBhwC,GAAOiwC,GAAWjwC,EAAM,EAAE,CAAC;AAC1D,WACE,gBAAA0C,EAAC,OAAA,EAAI,WAAU,mBAAkB,MAAK,gBACpC,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAOqvC,KAAW,SAAYD,EAAmB,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAEhE,gBAAA9uC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,mBAAgB;AAAA,UAChB,oBAAiB;AAAA,UAEjB,UAAA;AAAA,YAAA,gBAAAN,EAAC,QAAG,WAAU,0BAAyB,IAAG,0BACvC,YAAK,OACR;AAAA,YACA,gBAAAM,EAAC,KAAA,EAAE,WAAU,yBAAwB,IAAG,yBACrC,UAAA;AAAA,cAAA6gC,EAAK;AAAA,cAAK;AAAA,YAAA,GACb;AAAA,YACC0N,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,YAClE,gBAAAM,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAUqvC;AAAA,kBACV,SAAS,MAAMD,EAAmB,IAAI;AAAA,kBACvC,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGD,gBAAApvC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAUqvC;AAAA,kBACV,WAAS;AAAA,kBACT,SAAS,MAAM,KAAK8B,GAAOvzC,CAAK;AAAA,kBAE/B,eACC,gBAAA0C,EAAAq7B,IAAA,EACE,UAAA;AAAA,oBAAA,gBAAA37B,EAAC,QAAA,EAAK,WAAU,6BAA4B,eAAY,QAAO;AAAA,oBAAE;AAAA,kBAAA,EAAA,CAEnE,IAEAmhC,EAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YAET,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,GACF;AAAA,EAEJ,GAEMkQ,KAAkB,CAACzzC,MACnB,CAACgzC,MAAa,CAACtC,IAAsB,OAEvC,gBAAAtuC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO,UAAUpC,EAAM,SAAS,YAAY,gBAAgBA,EAAM,IAAI;AAAA,MACtE,cAAY,UAAUA,EAAM,SAAS,YAAY,gBAAgBA,EAAM,IAAI;AAAA,MAC3E,UAAU+wC,KAAQU;AAAA,MAClB,SAAS,CAACjpC,MAAM;AACd,QAAAA,EAAE,gBAAA,GACFgpC,EAAmBxxC,EAAM,EAAE;AAAA,MAC7B;AAAA,MAEA,4BAAC+vC,IAAA,CAAA,CAAU;AAAA,IAAA;AAAA,EAAA,GAKX2D,KAAa,CAAC3nC,GAAWC,MAAc;AAC3C,UAAM2nC,KAAQrB,GAAS;AACvB,IAAKqB,OACLA,GAAM,MAAM,OAAO,GAAG5nC,CAAC,MACvB4nC,GAAM,MAAM,MAAM,GAAG3nC,CAAC;AAAA,EACxB,GAEM4nC,KAAiB,CAACz2B,MAAoB;AAC1C,UAAMpc,IAAUyxC,GAAQ;AACxB,QAAI,CAACzxC,EAAS;AACd,UAAM4iB,KAAQwrB;AAAA,MACZhyB;AAAA,MACApc,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ,UAAU;AAAA,IAAA;AAEpB,IAAIA,EAAQ,cAAc4iB,OACxB5iB,EAAQ,YAAY4iB,IACpBkuB,GAAaluB,EAAK;AAEpB,UAAMxf,KAAO2qC,GAAY/tC,EAAQ,WAAWA,EAAQ,IAAI4iB,EAAK,GACvDqC,KAAMusB,GAAc,WAAWxxC,EAAQ;AAC7C,IAAK2uC,GAAY1pB,IAAK7hB,EAAI,QAAiBA,EAAI;AAAA,EACjD,GAEM0vC,KAAiB,YAAY;AACjC,UAAMC,IAAUvB,GAAc;AAC9B,QAAI,GAAC5B,KAAmBmD,KAAW,OACnC;AAAA,UAAIpE,GAAYoE,GAASnB,EAAY,GAAG;AACtC,QAAAZ,GAAc,IAAI;AAClB;AAAA,MACF;AACA,UAAI;AACF,cAAMpB,EAAgBmD,CAAO;AAAA,MAC/B,SAAStrC,GAAG;AACV,QAAAupC,GAAc,IAAI,GAClBb,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,2BAA2B;AAAA,MACvE;AAAA;AAAA,EACF,GAEMurC,KAAU,MAAM;AACpB,IAAKvB,GAAQ,YACbA,GAAQ,UAAU,MAClBZ,GAAQ,IAAI,GACZC,GAAa,IAAI,GACZgC,GAAA;AAAA,EACP;AAEA,EAAAzvB,GAAU,MAAM;AACd,QAAI,CAACutB,EAAM;AACX,UAAMqC,IAAS,CAACxrC,OAAoB;AAClC,YAAMzH,KAAUyxC,GAAQ;AACxB,UAAI,CAACzxC,MAAWyH,GAAE,cAAczH,GAAQ,UAAW;AACnD,YAAMgL,KAAIhL,GAAQ,UACZkzC,KAAOlzC,GAAQ,aAAaA,GAAQ,QACpCiL,IAAI,KAAK,IAAIjL,GAAQ,SAAS,KAAK,IAAIkzC,IAAMzrC,GAAE,UAAUzH,GAAQ,OAAO,CAAC;AAC/E,MAAAA,GAAQ,IAAIgL,IACZhL,GAAQ,IAAIiL,GACZ0nC,GAAW3nC,IAAGC,CAAC,GACf4nC,GAAeprC,GAAE,OAAO;AAAA,IAC1B,GACM0rC,IAAO,CAAC1rC,OAAoB;AAChC,YAAMzH,KAAUyxC,GAAQ;AACxB,MAAI,CAACzxC,MAAWyH,GAAE,cAAczH,GAAQ,aACxCgzC,GAAA;AAAA,IACF;AACA,kBAAO,iBAAiB,eAAeC,CAAM,GAC7C,OAAO,iBAAiB,aAAaE,CAAI,GACzC,OAAO,iBAAiB,iBAAiBA,CAAI,GACtC,MAAM;AACX,aAAO,oBAAoB,eAAeF,CAAM,GAChD,OAAO,oBAAoB,aAAaE,CAAI,GAC5C,OAAO,oBAAoB,iBAAiBA,CAAI;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,EAAQvC,CAAK,CAAC;AAElB,QAAMwC,KAAY,CAACn0C,GAAgBwI,MAA6C;AAC9E,UAAMka,KAAMla,EAAE,cAAc,QAAQ,wBAAwB,GACtD4rC,KAAO/B,GAAa;AAC1B,QAAI,EAAE3vB,cAAe,gBAAgB,CAAC0xB,GAAM;AAC5C,UAAM92B,KAAOoF,GAAI,sBAAA,GACX2xB,KAAWD,GAAK,sBAAA,GAChB/E,IAAY/xB,GAAK,SAAS;AAChC,IAAA9U,EAAE,eAAA,GACFA,EAAE,gBAAA;AACF,UAAMrE,IAAkB;AAAA,MACtB,IAAInE,EAAM;AAAA,MACV,WAAWwI,EAAE;AAAA,MACb,SAASA,EAAE,UAAU8U,GAAK;AAAA,MAC1B,SAAS9U,EAAE,UAAU8U,GAAK;AAAA,MAC1B,OAAOA,GAAK;AAAA,MACZ,QAAQA,GAAK;AAAA,MACb,MAAMtd,EAAM;AAAA,MACZ,GAAGq0C,GAAS;AAAA,MACZ,GAAG/2B,GAAK;AAAA,MACR,SAAS+2B,GAAS;AAAA,MAClB,UAAUA,GAAS;AAAA,MACnB,YAAYA,GAAS;AAAA,MACrB,WAAAhF;AAAA,MACA,WAAWsD;AAAA,MACX,WAAWA,GAAa,QAAQ3yC,EAAM,EAAE;AAAA,IAAA;AAE1C,IAAAwyC,GAAQ,UAAUruC,GAClBytC,GAAQztC,CAAI,GACZ0tC,GAAac,GAAa,QAAQ3yC,EAAM,EAAE,CAAC,GAC3C+xC,GAAcY,EAAY;AAAA,EAC5B,GAEM2B,KACJ3C,KAAQnC,KAAa,OACjBF;AAAA,IACEqC,EAAK,UAAU,QAAQA,EAAK,EAAE;AAAA,IAC9BnC;AAAA,IACAmC,EAAK;AAAA,IACLA,EAAK;AAAA,EAAA,IAEP;AAEN,MAAI/C,EAAO,SAAS,QAAQ;AAC1B,UAAM2F,IAAiB,GAAQzB,KAAA,QAAAA,EAAS,gBAAgBA,KAAA,QAAAA,EAAS,eAC3D0B,IAAkB5F,EAAO,SAAS,UAAU2F,GAC5CE,KAAavC,OAAoBsC,KAAkB1B,KAAA,gBAAAA,EAAS,iBAAgB,OAAO,OACnF4B,MACJ7D,KAAA,gBAAAA,EAAM,SAAQjB,GAAYkD,KAAA,gBAAAA,EAAS,YAAY,KAAK,eAChD6B,KAAgB7B,IAAU7C,GAAW6C,EAAQ,EAAE,IAAI,GACnD8B,KACJ,CAAC7B,MAAiBnE,EAAO,SAAS,UAAU+F,KAAgB,GACxDE,IAAe9B,KAAgB,WAAW,UAC1C+B,IAAmB/B,KAAgB,cAAc;AAEvD,WACE,gBAAArwC,EAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,MAAA,CAACqwC,MACA,gBAAArwC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOsgC;AAAA,YACP,UAAUqO,KAAQ,CAACiC;AAAA,YACnB,UAAU,CAACxqC,MAAMooC,EAAQpoC,EAAE,OAAO,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MACzC,GACF;AAAA,MAEDgsC,IACC,gBAAA9xC,EAAC,OAAA,EAAI,WAAU,qDAAoD,UAAA;AAAA,QAAA;AAAA,0BAEhE,OAAA,EAAI,WAAU,kCACZ,UAAA+xC,MAAc,CAACzC,KACd,gBAAA5vC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,KAAKqyC;AAAA,YACL,MAAK5D,KAAA,gBAAAA,EAAM,UAAQiC,KAAA,gBAAAA,EAAS,SAAQ;AAAA,YACpC,SAAS,MAAMb,GAAiB,EAAI;AAAA,UAAA;AAAA,QAAA,IAGtC,gBAAA7vC,EAAC,OAAA,EAAI,WAAU,sCAAsC,cAAgB,GAEzE;AAAA,QACCyuC,IACC,gBAAAnuC,EAAC,QAAA,EAAK,WAAU,+BACb,UAAA;AAAA,UAAAmuC,EAAK;AAAA,UACLkC,KACG,MAAMpD,GAAYkB,EAAK,IAAI,CAAC,uBAC5B,MAAMlB,GAAYkB,EAAK,IAAI,CAAC;AAAA,QAAA,EAAA,CAClC,IACE;AAAA,QACFkC,KAKA,gBAAA3wC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,6HAGpC,IAPA,gBAAAA,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,uEAAA,CAEpC;AAAA,QAOF,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKgwC;AAAA,YACL,QAAM;AAAA,YACN,MAAK;AAAA,YACL,QAAO;AAAA,YACP,UAAUrB,KAAQU,MAAY,CAACuB;AAAA,YAC/B,UAAU,CAACxqC,MAAM;;AACf,cAAA0qC,KAAYhzC,IAAAsI,EAAE,OAAO,UAAT,gBAAAtI,EAAiB,OAAM,IAAI,GACvCsI,EAAE,OAAO,QAAQ;AAAA,YACnB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAApG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAU2uC,KAAQU,MAAY,CAACuB;AAAA,YAC/B,SAAS,MAAA;;AAAM,sBAAA9yC,IAAAkyC,EAAa,YAAb,gBAAAlyC,EAAsB;AAAA;AAAA,YAEpC,eAAgB,gBAAgB;AAAA,UAAA;AAAA,QAAA;AAAA,MACnC,EAAA,CACF,IAEA,gBAAAwC,EAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,QAAAqwC,KAAgB,aAAa;AAAA,QAC9B,gBAAArwC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA2uC,IAAW,YAAY;AAAA,cACvBR,IAAO,aAAa;AAAA,cACpBE,IAAO,YAAY;AAAA,YAAA,EAElB,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,YAAY,CAACvoC,MAAM;AACjB,cAAAA,EAAE,eAAA,GACGuoC,KAAMO,EAAY,EAAI;AAAA,YAC7B;AAAA,YACA,aAAa,MAAMA,EAAY,EAAK;AAAA,YACpC,QAAQ,CAAC9oC,MAAM;;AAGb,cAFAA,EAAE,eAAA,GACF8oC,EAAY,EAAK,GACb,EAAAP,KAAQ,CAACiC,OACbE,IAAYhzC,IAAAsI,EAAE,aAAa,UAAf,gBAAAtI,EAAuB,EAAE;AAAA,YACvC;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAkC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,UAAU2uC,KAAQU,MAAY,CAACuB;AAAA,kBAC/B,UAAU,CAACxqC,MAAM;;AACf,oBAAA0qC,KAAYhzC,IAAAsI,EAAE,OAAO,UAAT,gBAAAtI,EAAiB,OAAM,IAAI,GACvCsI,EAAE,OAAO,QAAQ;AAAA,kBACnB;AAAA,gBAAA;AAAA,cAAA;AAAA,gCAED,QAAA,EAAK,WAAU,gCACb,UAAAqoC,IAAOA,EAAK,OAAO,8BACtB;AAAA,gCACC,QAAA,EAAK,WAAU,+BACb,UAAAA,IACGkC,KACE,GAAGpD,GAAYkB,EAAK,IAAI,CAAC,uBACzB,GAAGlB,GAAYkB,EAAK,IAAI,CAAC,uBAC3B,WAAA,CACN;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAED,CAACkC,MAAiB,CAAC6B,KAClB,gBAAAlyC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA;AAAA,UAAA;AAAA,UAET,gBAAAN,EAAC,UAAK,UAAA,SAAA,CAAM;AAAA,UAAO;AAAA,QAAA,EAAA,CAE9C,IACE;AAAA,MAAA,GACN;AAAA,MAEDwyC,KACC,gBAAAlyC,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,kCAAiC,UAAA;AAAA,UAAA;AAAA,UACjBiyC;AAAA,UAAc;AAAA,UACxCA,OAAkB,IAAI,KAAK;AAAA,UAAI;AAAA,QAAA,GAClC;AAAA,QACA,gBAAAjyC,EAAC,MAAA,EAAG,WAAU,iCACZ,UAAA;AAAA,UAAA,gBAAAN,EAAC,QAAG,UAAA,iIAAA,CAGJ;AAAA,UACA,gBAAAA,EAAC,QAAG,UAAA,0FAAA,CAGJ;AAAA,UACA,gBAAAA,EAAC,QAAG,UAAA,wHAAA,CAGJ;AAAA,4BACC,MAAA,EAAG,UAAA;AAAA,YAAA;AAAA,YACmD;AAAA,YACrD,gBAAAA,EAAC,UAAK,UAAA,SAAA,CAAM;AAAA,YAAO;AAAA,UAAA,GACrB;AAAA,UACA,gBAAAA,EAAC,QAAG,UAAA,0EAAA,CAEJ;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF,IACE;AAAA,MACH+uC,KAAY,QACX,gBAAAzuC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,iBAAeyuC;AAAA,UAEf,UAAA;AAAA,YAAA,gBAAA/uC,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG+uC,CAAQ,CAAC,CAAC,IAAA;AAAA,cAAI;AAAA,YAAA,GAE/D;AAAA,YACA,gBAAAzuC,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAA;AAAA,cAAAyuC;AAAA,cAAS;AAAA,YAAA,EAAA,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGjEF,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,MACjEwsC,EAAO,SAAS,UAAUkE,IACzB,gBAAA1wC,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,8BACZ,UAAA;AAAA,QAAAguC,KAAiBsC,KAChB,gBAAA5wC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAU2uC,KAAQU;AAAA,YAClB,SAAS,MAAMD,EAAmBsB,EAAQ,EAAE;AAAA,YAC7C,UAAA;AAAA,UAAA;AAAA,QAAA,IAGC;AAAA,QACJ,gBAAA1wC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UACE2uC,KACAU,MACA,CAACuB,MACAF,EAAQ,SAAS,aAAa,CAACpQ,EAAK,KAAA;AAAA,YAEvC,SAAS,MAAM,KAAK0Q,GAAA;AAAA,YAEnB,UAAArC,IACGI,KAAY,OACV,GAAG2D,CAAgB,IAAI3D,CAAQ,MAC/B,YACFN,IACEkC,KACE,kBACA,kBACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACR,GACF,EAAA,CACF,IAEA,gBAAA3wC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UACE2uC,KACAU,MACA,CAACuB,OACAD,KAAgB,CAAClC,IAAO,CAACnO,EAAK,KAAA,KAAU,CAACmO;AAAA,UAE5C,SAAS,MAAM,KAAKuC,GAAA;AAAA,UAEnB,UAAArC,IACGI,KAAY,OACV,GAAG2D,CAAgB,IAAI3D,CAAQ,MAC/B,GAAG2D,CAAgB,MACrBD;AAAA,QAAA;AAAA,MAAA,GAER;AAAA,MAEDrB,GAAA;AAAA,IAAkB,GACrB;AAAA,EAEJ;AAEA,SACE,gBAAA9wC,EAAC,OAAA,EAAI,WAAW,CAAC,oBAAoBivC,IAAO,kBAAkB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACxF,UAAA;AAAA,IAAA,gBAAAjvC,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,MAAAswC,MACC,gBAAA5wC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAMmuC,EAAe,EAAE,MAAM,aAAa;AAAA,UACpD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIFqC,GAAc,WAAW,IACxB,gBAAAxwC,EAAC,OAAE,WAAU,wBAAuB,UAAA,iBAAA,CAAc,IAElD,gBAAAM,EAAC,OAAA,EAAI,KAAK2vC,IAAc,WAAU,0BAC/B,UAAA;AAAA,QAAAO,GAAc,IAAI,CAAC5yC,MAClB,gBAAAoC;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,iBAAepC,EAAM;AAAA,YACrB,WAAU;AAAA,YAEV,UAAA,gBAAA0C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,mBACAivC,KAAA,gBAAAA,EAAM,QAAO3xC,EAAM,KAAK,mBAAmB;AAAA,kBAC3CuxC,MAAoBvxC,EAAM,KAAK,eAAe;AAAA,gBAAA,EAE7C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBAEV,UAAA;AAAA,kBAAAizC,KACC,gBAAA7wC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,OAAM;AAAA,sBACN,cAAY,WAAWpC,EAAM,IAAI;AAAA,sBACjC,SAAS,CAACwI,MAAMA,EAAE,gBAAA;AAAA,sBAClB,eAAe,CAACA,MAAM;AACpB,wBAAIA,EAAE,WAAW,KACjB2rC,GAAUn0C,GAAOwI,CAAC;AAAA,sBACpB;AAAA,sBAEA,4BAACsnC,IAAA,CAAA,CAAS;AAAA,oBAAA;AAAA,kBAAA,IAEV;AAAA,kBACJ,gBAAA1tC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM;AACb,wBAAIuvC,KACJwB,GAASnzC,CAAK;AAAA,sBAChB;AAAA,sBAEC,UAAAA,EAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAERyzC,GAAgBzzC,CAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACxB;AAAA,UAvCKA,EAAM;AAAA,QAAA,CAyCd;AAAA,QACAs0C,MAAW,OAAO,OACjB,gBAAAlyC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,KAAKkyC,GAAA;AAAA,UAAQ;AAAA,QAAA;AAAA,MACxB,EAAA,CAEJ;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAAlyC,EAAC,SAAI,WAAU,2BACZ,gBAAgBrC,KACf,gBAAAqC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA6uC,MAAoBxxC,GAAQ,KAAK,eAAe;AAAA,QAAA,EAE/C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QAEX,UAAA;AAAA,UAAA,gBAAAqC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM+wC,GAASpzC,EAAO;AAAA,cAChC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGA0zC,GAAgB1zC,EAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EAC1B,CACF,IACEizC,KACF,gBAAA5wC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAMmuC,EAAe,EAAE,MAAM,YAAY;AAAA,QACnD,UAAA;AAAA,MAAA;AAAA,IAAA,IAGC,KAAA,CACN;AAAA,IACCU,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,IACjEoxC,GAAA;AAAA,IACA7B,IACGoD;AAAA,MACE,gBAAAryC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK4vC;AAAA,UACL,WAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAMX,EAAK;AAAA,YACX,KAAKA,EAAK;AAAA,YACV,OAAOA,EAAK;AAAA,YACZ,QAAQA,EAAK;AAAA,UAAA;AAAA,UAGf,UAAA;AAAA,YAAA,gBAAAvvC,EAAC,UAAK,WAAU,0BAAyB,eAAY,QACnD,UAAA,gBAAAA,EAAC0tC,MAAS,EAAA,CACZ;AAAA,YACA,gBAAA1tC,EAAC,QAAA,EAAK,WAAU,0BAA0B,YAAK,MAAK;AAAA,YACpD,gBAAAA,EAAC,UAAK,WAAU,iCAAgC,eAAY,QAC1D,UAAA,gBAAAA,EAAC2tC,MAAU,EAAA,CACb;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,SAAS;AAAA,IAAA,IAEX;AAAA,EAAA,GACN;AAEJ;AClzBA,SAASiF,KAAW;AAClB,SACE,gBAAA5yC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAAS6yC,KAAc;AACrB,SACE,gBAAA7yC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,MAAM8yC,KAAiB;AAAA,EACrB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,eAAe;AACjB;AAEA,SAASC,KAAgB;AACvB,SACE,gBAAA/yC,EAAC,OAAA,EAAK,GAAG8yC,IACP,UAAA,gBAAA9yC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASgzC,KAAgB;AACvB,SACE,gBAAA1yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,sBAEhB,QAAA,EAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,MAAA,CAAM;AAAA,EAAA,GACnE;AAEJ;AAEA,SAASizC,KAAmB;AAC1B,SACE,gBAAA3yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA,EAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,EAAA,GACpD;AAEJ;AAEA,SAASkzC,KAAgB;AACvB,SACE,gBAAA5yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,IAAG;AAAA,QACH,QAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAEd,gBAAAA,EAAC,UAAK,GAAE,qBAAoB,QAAO,gBAAe,aAAY,OAAM,eAAc,QAAA,CAAQ;AAAA,EAAA,GAC5F;AAEJ;AAEA,SAASmzC,KAAoB;AAC3B,SACE,gBAAAnzC,EAAC,OAAA,EAAK,GAAG8yC,IACP,UAAA,gBAAA9yC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASozC,KAAmB;AAC1B,SACE,gBAAA9yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC,EAAC,QAAA,EAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,QAAO,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC9F,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASqzC,KAAkB;AACzB,SACE,gBAAA/yC,EAAC,OAAA,EAAK,GAAGwyC,IAAgB,SAAQ,aAC/B,UAAA;AAAA,IAAA,gBAAA9yC,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,QAAO,gBAAe,aAAY,MAAA,CAAM;AAAA,IACtE,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASszC,KAAgB;AACvB,SACE,gBAAAhzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,IAAG;AAAA,QACH,QAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAEd,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EAChB,GACF;AAEJ;AAEA,SAASuzC,KAAoB;AAC3B,SACE,gBAAAvzC,EAAC,OAAA,EAAK,GAAG8yC,IACP,UAAA,gBAAA9yC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,iBAAgB;AAAA,IAAA;AAAA,EAAA,GAEpB;AAEJ;AAEA,SAASwzC,KAAiB;AACxB,SACE,gBAAAlzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,IAAG;AAAA,QACH,QAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAEd,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASyzC,KAAoB;AAC3B,SACE,gBAAAnzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACtD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAAS0zC,KAA2B;AAClC,SACE,gBAAApzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC,EAAC,QAAA,EAAK,GAAE,OAAM,GAAE,KAAI,OAAM,MAAK,QAAO,KAAI,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC3F,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAsBA,MAAM2zC,KAA2B;AAAA,EAC/B;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMZ;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAME;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ,EAAE,WAAW,GAAA;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,EAAA;AAAA,EAER,EAAE,WAAW,GAAA;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAML;AAAA,EAAA;AAEV,GAEMO,KAA8D;AAAA,EAClE,OAAO;AAAA,EACP,WAAW;AACb;AAEA,SAASC,GAAmBC,GAAmD;AAC7E,SAAO,eAAeA;AACxB;AAEA,SAASC,GAAiB32C,GAA8B;AACtD,QAAMsW,IAAOigC,GAAS;AAAA,IACpB,CAACG,MAAgC,CAACD,GAAmBC,CAAK,KAAKA,EAAM,OAAO12C;AAAA,EAAA;AAE9E,UAAOsW,KAAA,gBAAAA,EAAM,UAASkgC,GAAsBx2C,CAAO,KAAKA;AAC1D;AAEA,MAAM42C,KAAsBC,GAAA,GAEtBC,KAA6D;AAAA,EACjE,CAAC,oBAAoB,aAAa;AAAA,EAClC,CAAC,eAAe,OAAO;AAAA,EACvB,CAAC,kBAAkB,eAAe;AAAA,EAClC,CAAC,sBAAsB,eAAe;AAAA,EACtC,CAAC,sBAAsB,eAAe;AACxC;AAEA,SAASC,GAAc;AAAA,EACrB,OAAA70B;AAAA,EACA,SAAA8lB;AAAA,EACA,UAAAgP;AACF,GAIG;AACD,SACE,gBAAA9zC,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,+BACb,UAAA;AAAA,MAAAgf;AAAA,MACA8lB,IAAU,gBAAAplC,EAACojC,IAAA,EAAiB,OAAA9jB,GAAc,SAAS8lB,GAAS,IAAK;AAAA,IAAA,GACpE;AAAA,IACCgP;AAAA,EAAA,GACH;AAEJ;AAEA,SAASC,GAAW;AAAA,EAClB,OAAA/0B;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAoI;AAAA,EACA,UAAAb;AAAA,EACA,SAAAuB;AACF,GAMG;AACD,QAAMJ,IAAc9mB,GAAmBoe,CAAK,KAAK,CAACA,EAAM,KAAA,GAClD,CAACkH,GAAK+B,CAAM,IAAI1jB,EAASmjB,IAAc,KAAK1I,CAAK;AAEvD,EAAAta,GAAU,MAAM;AACd,IAAAujB,EAAOP,IAAc,KAAK1I,CAAK;AAAA,EACjC,GAAG,CAAC0I,GAAa1I,CAAK,CAAC;AAEvB,QAAMkJ,IAAS,CAACzjC,MAAiB;AAC/B,QAAI,CAACA,EAAK,KAAA,KAAUmc,GAAmBnc,CAAI,GAAG;AAC5C,MAAAwjC,EAAO,EAAE,GACJP,KAAanB,EAASyB,EAAiB;AAC5C;AAAA,IACF;AACA,UAAMG,IAAanC,GAAkBvhC,CAAI;AACzC,QAAI,CAAC0jC,GAAY;AACf,MAAAF,EAAOP,IAAc,KAAK1I,CAAK;AAC/B;AAAA,IACF;AACA,IAAAiJ,EAAOE,CAAU,GACbA,MAAenJ,EAAM,YAAA,KAAiBmJ,MAAenJ,OAAgBmJ,CAAU;AAAA,EACrF;AAEA,SACE,gBAAAzlC,EAACm0C,IAAA,EAAc,OAAA70B,GAAc,SAAA8lB,GAC3B,UAAA,gBAAAplC;AAAA,IAACwkC;AAAA,IAAA;AAAA,MACC,OAAAllB;AAAA,MACA,KAAAkkB;AAAA,MACA,QAAQwB,IAAcM,KAAoBhJ;AAAA,MAC1C,UAAAoI;AAAA,MACA,aAAaa;AAAA,MACb,UAAU,MAAMC,EAAOhC,CAAG;AAAA,MAC1B,QAAQgC;AAAA,IAAA;AAAA,EAAA,GAEZ;AAEJ;AAEO,SAAS8O,GAAS;AAAA,EACvB,SAAAl3C;AAAA,EACA,iBAAAm3C;AAAA,EACA,OAAArxB;AAAA,EACA,eAAAsxB;AAAA,EACA,iBAAA9qB;AAAA,EACA,kBAAA+qB;AAAA,EACA,eAAArqB;AAAA,EACA,cAAAsqB;AAAA,EACA,aAAAC;AAAA,EACA,WAAAlrB,IAAY,CAAA;AAAA,EACZ,QAAAkhB,IAAS,CAAA;AAAA,EACT,WAAAuD;AAAA,EACA,aAAA0G;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,eAAAzG;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAuG;AAAA,EACA,OAAAl3B;AAAA,EACA,eAAAm3B;AAAA,EACA,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,wBAAAC,IAAyB;AAAA,EACzB,sBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,QAAAC;AACF,GAAkB;AAChB,QAAM,CAACC,IAAcC,EAAe,IAAI5zB,EAAuB,EAAE,MAAM,QAAQ;AAE/E,EAAAG,GAAU,MAAM;AACd,IAAI5kB,MAAY,YAAUq4C,GAAgB,EAAE,MAAM,QAAQ;AAAA,EAC5D,GAAG,CAACr4C,CAAO,CAAC,GAEZ4kB;AAAA,IACE,MAAM,MAAM;AACV,MAAA0yB,KAAA,QAAAA,EAAe;AAAA,IACjB;AAAA,IACA,CAACt3C,GAASs3C,CAAY;AAAA,EAAA;AAGxB,QAAMgB,KAAW3zB;AAAA,IACf,MAAMyoB,GAAqBtnB,EAAM,QAAQA,EAAM,WAAW;AAAA,IAC1D,CAACA,EAAM,QAAQA,EAAM,WAAW;AAAA,EAAA,GAE5ByyB,KAAcD,GAAS,QACvBE,KAAgBF,GAAS,WACzBG,KAAcH,GAAS,QACvBI,KAAwBJ,GAAS,kBACjCK,IAA0BL,GAAS,qBACnCM,KAAwBN,GAAS,kBACjCO,KAAmBP,GAAS,YAC5BQ,KAAeR,GAAS,QACxBS,KAAyBT,GAAS,kBAClCxY,KAAaha,EAAM,cAAc,CAAA,GACjCkzB,KAAkBhZ,GAAoBla,EAAM,QAAQ,aAAaA,EAAM,SAASga,EAAU,GAC1FmZ,KAAiBjZ,GAAoBla,EAAM,QAAQ,YAAYA,EAAM,SAASga,EAAU,GACxFoZ,KAAqBF,GAAgB;AAAA,IACzC,CAACpyC,MAAM,CAACi5B,GAAkBj5B,EAAE,IAAIkf,EAAM,SAASga,EAAU;AAAA,EAAA,GAErDqZ,KAAiBx0B,GAAQ,MAAM;AACnC,UAAMgd,IAAQD;AAAA,MACZ5B;AAAA,MACAha,EAAM;AAAA,MACNA,EAAM;AAAA,MACNkzB;AAAA,IAAA,GAEI9J,IAAY,IAAI;AAAA,MACpBJ,GAAmBhpB,EAAM,MAAM,EAAE,IAAI,CAACtlB,GAAO2jB,MAAU,CAAC3jB,EAAM,IAAI2jB,CAAK,CAAC;AAAA,IAAA;AAE1E,WAAOwd,EAAM,MAAA,EAAQ,KAAK,CAACv7B,GAAGC,MAAM;AAClC,YAAM67B,IAAKgN,EAAU,IAAI9oC,EAAE,KAAK,OAAO,KAAK,OAAO,mBAC7C+7B,KAAK+M,EAAU,IAAI7oC,EAAE,KAAK,OAAO,KAAK,OAAO;AACnD,aAAI67B,MAAOC,KAAWD,IAAKC,KACpB/7B,EAAE,KAAK,IAAI,cAAcC,EAAE,KAAK,GAAG;AAAA,IAC5C,CAAC;AAAA,EACH,GAAG,CAACy5B,IAAYha,EAAM,SAASA,EAAM,OAAOA,EAAM,QAAQkzB,EAAe,CAAC,GACpEI,KAAkBH,GAAe;AAAA,IAAO,CAACryC,MAC7Ci5B,GAAkBj5B,EAAE,IAAIkf,EAAM,SAASga,EAAU;AAAA,EAAA,GAE7CuZ,IAAoBJ,GAAe;AAAA,IACvC,CAACryC,MAAM,CAACi5B,GAAkBj5B,EAAE,IAAIkf,EAAM,SAASga,EAAU;AAAA,EAAA,GAErDwZ,KAAiB30B;AAAA,IACrB,MAAM1B,GAAoB6C,EAAM,WAAW;AAAA,IAC3C,CAACA,EAAM,WAAW;AAAA,EAAA,GAEd9C,KAAe2B,GAAQ,MAAM;AACjC,UAAM40B,wBAAa,IAAA;AACnB,eAAWz3B,KAAYuK,GAAW;AAChC,YAAMpqB,IAAM6f,EAAS,KAAK,KAAA,EAAO,YAAA;AACjCy3B,MAAAA,EAAO,IAAIt3C,IAAMs3C,EAAO,IAAIt3C,CAAG,KAAK,KAAK,CAAC;AAAA,IAC5C;AACA,WAAO,IAAI;AAAA,MACToqB,EAAU,IAAI,CAACvK,MAAa;AAC1B,cAAM03B,KACHD,EAAO,IAAIz3B,EAAS,KAAK,OAAO,aAAa,KAAK,KAAK;AAC1D,eAAO;AAAA,UACLA,EAAS;AAAA,UACT23B,GAAoB33B,GAAU03B,CAAS;AAAA,QAAA;AAAA,MAE3C,CAAC;AAAA,IAAA;AAAA,EAEL,GAAG,CAACntB,CAAS,CAAC,GACRqtB,KAAc/0B;AAAA,IAClB,MAAM,IAAI,IAAImB,EAAM,UAAU,IAAI,CAACxP,MAAS,CAACA,EAAK,IAAIA,EAAK,IAAI,CAAC,CAAC;AAAA,IACjE,CAACwP,EAAM,SAAS;AAAA,EAAA,GAEZ6zB,KAAYh1B;AAAA,IAChB,MAAM,IAAI,IAAI4oB,EAAO,IAAI,CAACj3B,MAAS,CAACA,EAAK,IAAIA,EAAK,IAAI,CAAC,CAAC;AAAA,IACxD,CAACi3B,CAAM;AAAA,EAAA,GAEHqM,KAAkB,CAAC3hC,MAKnB;;AACJ,UAAMwI,IAAa64B,GAAe,IAAIrhC,EAAM,EAAE;AAC9C,SAAIwI,KAAA,gBAAAA,EAAY,eAAc;AAC5B,aAAOuC,GAAa,IAAIvC,EAAW,UAAU,KAAK;AAEpD,SAAIA,KAAA,gBAAAA,EAAY,gBAAe,cAAaA,KAAA,gBAAAA,EAAY,cAAa,MAAM;AACzE,YAAMo5B,IACJp5B,EAAW,aAAa,OACpBi5B,GAAY,IAAIj5B,EAAW,SAAS,KAAK,OACzC,MACAq5B,MAAWp5C,IAAAq5C,GAAiBt5B,EAAW,eAAe,EAAE,MAA7C,gBAAA/f,EAAgD;AACjE,aAAOs5C,GAAoBv5B,GAAYo5B,KAAeC,MAAY,IAAI;AAAA,IACxE;AACA,YAAIr5B,KAAA,gBAAAA,EAAY,gBAAe,YAAWA,KAAA,gBAAAA,EAAY,YAAW,OACxDw5B;AAAA,MACLx5B;AAAA,MACAA,EAAW,WAAW,OAClBk5B,GAAU,IAAIl5B,EAAW,OAAO,KAAK,OACrC;AAAA,IAAA,IAGJxI,EAAM,SAAS,YACbwI,KAAA,gBAAAA,EAAY,eAAc,iBAAuB,YAC9CnQ,IAAAmQ,KAAA,gBAAAA,EAAY,gBAAZ,gBAAAnQ,EAAyB,WAAU,OAErCyxB;AAAA,MACL9pB;AAAA,MACA6N,EAAM;AAAA,MACNA,EAAM;AAAA,MACNga;AAAA,MACAha,EAAM;AAAA,MACNA,EAAM;AAAA,IAAA;AAAA,EAEV,GACMo0B,KAAcp0B,EAAM,OAAO,KAAK,CAACkd,MAAMA,EAAE,OAAOoU,CAAa,GAC7D+C,KAAYr0B,EAAM,QAAQ,OAAO,CAAC1f,MAAMA,EAAE,YAAYgxC,CAAa,EAAE,QACrE5M,KAAY,CAACthB;;AACjB,aAAAxoB,IAAAolB,EAAM,OAAO,KAAK,CAACkd,MAAMA,EAAE,OAAO9Z,CAAO,MAAzC,gBAAAxoB,EAA4C,SAAQ;AAAA,KAChDmwC,KAAmBlsB,GAAQ,MAAM;AACrC,UAAM40B,IAAiC,CAAA;AACvC,eAAWthC,KAAS6N,EAAM;AACxB,MAAI7N,EAAM,eACVshC,EAAOthC,EAAM,OAAO,KAAKshC,EAAOthC,EAAM,OAAO,KAAK,KAAK;AAEzD,WAAOshC;AAAAA,EACT,GAAG,CAACzzB,EAAM,MAAM,CAAC,GAEXs0B,KACJ/C,MAAqB/qB,KAAmB,OAAO,CAACA,CAAe,IAAI,KAC/D+tB,KAAkB,CAACnhC,MAAekhC,GAAY,SAASlhC,CAAE,GACzDohC,KACJxC,KAA0B,OACtBvK,EAAO,KAAK,CAACj3B,MAASA,EAAK,OAAOwhC,CAAsB,KAAK,OAC7D,MACAyC,KACJv6C,MAAY,YAAYs6C,MAAwB,MAC5CE,KACJ5L,GAAqB5uC,GAASo6C,GAAY,MAAM,KAAKG;AACvD,EAAA31B,GAAU,MAAM;AACd,IAAI41B,sBAAmC;AAAA,EACzC,GAAG,CAACA,IAAoBlD,CAAY,CAAC;AACrC,QAAMmD,MAAoB,MAAM;AAC9B,QAAIF,MAAuBD,IAAsB;AAC/C,YAAMI,IAAWzM;AAAA,QACfqM,GAAqB;AAAA,QACrBx0B,EAAM;AAAA,MAAA,GAEFmmB,IAASyO,IACX50B,EAAM,OAAO,KAAK,CAAC5C,MAAQA,EAAI,OAAOw3B,CAAQ,IAC9C;AACJ,aAAO;AAAA,QACL,KAAKJ,GAAqB,KAAK,UAAU,SAASA,GAAqB,EAAE;AAAA,QACzE,YAAWrO,KAAA,gBAAAA,EAAQ,QAAO;AAAA,MAAA;AAAA,IAE9B;AACA,QAAI,CAACuO,MAAsBJ,GAAY,WAAW,EAAG,QAAO;AAC5D,UAAMniC,IAAQ6N,EAAM,OAAO,KAAK,CAAC5C,MAAQA,EAAI,OAAOk3B,GAAY,CAAC,CAAC;AAClE,WAAKniC,IACE,EAAE,KAAKA,EAAM,KAAK,WAAWuyB,GAAUvyB,EAAM,OAAO,EAAA,IADxC;AAAA,EAErB,GAAA,GACM0iC,IAAsB,CAACzhC,GAAYuB,MAAiC;AACxE,IAAAs9B,MAAA,QAAAA,GAAuB,OACvB/qB,EAAc9T,GAAI,EAAE,UAAUuB,EAAM,UAAU,GAC9C88B,KAAA,QAAAA;AAAA,EACF,GACMqD,IAAiBzM,GAAsBZ,GAAQznB,EAAM,WAAW,GAEhEyzB,KAA0C;AAAA,IAC9C,QAAQlK,GAAkBvpB,EAAM,MAAM;AAAA,IACtC,QAAQyyB,GAAY,SAASG,GAAsB;AAAA,IACnD,WAAWF,GAAc,SAASG,EAAwB;AAAA,IAC1D,QACEF,GAAY,SAASG,GAAsB,SAASgC,EAAe;AAAA,IACrE,YAAY5B,GAAgB;AAAA,IAC5B,WAAWC,GAAe;AAAA,IAC1B,QAAQH,GAAa,SAASC,GAAuB;AAAA,IACrD,YAAYF,GAAiB;AAAA,EAAA,GAGzBgC,KAAkB,CACtBrjC,GACAsjC,GACAC,MAOAvjC,EAAO,WAAW,IAChB,gBAAA5U,EAAC,KAAA,EAAE,WAAU,wBAAwB,UAAAk4C,GAAM,IAE3C7L,GAAsBz3B,GAAQsO,EAAM,MAAM,EAAE,IAAI,CAAClf,MAAM;;AACrD,UAAMm9B,IAAOyK,GAAc;AAAA,MACzB,KAAK5nC,EAAE;AAAA,MACP,aAAWlG,KAAAq6C,KAAA,gBAAAA,EAAM,iBAAN,gBAAAr6C,GAAA,KAAAq6C,GAAqBn0C,OAAM+lC,GAAe/lC,EAAE,IAAI;AAAA,MAC3D,WAAW4jC,GAAU5jC,EAAE,OAAO;AAAA,MAC9B,cAAcgzC,GAAgBhzC,CAAC;AAAA,MAC/B,aAAam0C,KAAA,gBAAAA,EAAM;AAAA,IAAA,CACpB,GACKje,KAAUie,KAAA,QAAAA,EAAM,gBAClB7O;AAAA,MACA6O,EAAK;AAAA,MACL,EAAQA,EAAK;AAAA,MACbA,EAAK,oBAAoBv6B,EAAM,uBAAuB;AAAA,IAAA,IAEtD;AACJ,WACE,gBAAAtd;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WACEm3C,GAAgBzzC,EAAE,EAAE,IAChB,kCACA;AAAA,QAEN,aAAa,CAAC6T,OAAU;AACtB,UAAIA,GAAM,YAAUA,GAAM,eAAA;AAAA,QAC5B;AAAA,QACA,cAAc,MAAM68B,KAAA,gBAAAA,EAAe1wC,EAAE;AAAA,QACrC,cAAc,MAAM0wC,KAAA,gBAAAA,EAAe;AAAA,QACnC,SAAS,CAAC78B,OAAUkgC,EAAoB/zC,EAAE,IAAI6T,EAAK;AAAA,QAElD,UAAA;AAAA,UAAAqiB,KACC,gBAAAl6B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WACEm4C,KAAA,QAAAA,EAAM,oBACF,yCACA;AAAA,cAEN,KAAKje;AAAA,cACL,KAAI;AAAA,YAAA;AAAA,UAAA,IAEJ;AAAA,UACJ,gBAAA55B,EAAC,QAAA,EAAK,WAAU,4BACb,UAAA;AAAA,YAAA6gC,EAAK,QACJ,gBAAAnhC,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAmhC,EAAK,OAAM,IACtD;AAAA,YACJ,gBAAA7gC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WACEmhC,EAAK,QACD,2BACA;AAAA,kBAGL,UAAAA,EAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEPA,EAAK,KAAK,SAAS,IAClB,gBAAAnhC,EAAC,QAAA,EAAK,WAAU,wBACb,UAAAmhC,EAAK,KAAK,IAAI,CAACjiC,yBACb,QAAA,EAA4B,WAAU,uBACpC,UAAAA,GAAA,GADQ,GAAG8E,EAAE,EAAE,IAAI9E,EAAG,EAEzB,CACD,EAAA,CACH,IACE;AAAA,YAAA,EAAA,CACN;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MAjDK8E,EAAE;AAAA,IAAA;AAAA,EAoDb,CAAC,GAGCo0C,KAA0B,MAC9B7B,GAAe,IAAI,CAAC9X,MAAS;AAC3B,UAAMplB,IAAQ6lB,GAA0BT,GAAMvb,EAAM,MAAM,GACpDm1B,IACJZ,GAAgBhZ,EAAK,KAAK,EAAE,KAAKgZ,GAAgBhZ,EAAK,GAAG,EAAE;AAC7D,WACE,gBAAAz+B;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WACEq4C,IACI,4DACA;AAAA,QAEN,aAAa,CAACxgC,MAAU;AACtB,UAAIA,EAAM,YAAUA,EAAM,eAAA;AAAA,QAC5B;AAAA,QACA,cAAc,MAAM68B,KAAA,gBAAAA,EAAejW,EAAK,KAAK;AAAA,QAC7C,cAAc,MAAMiW,KAAA,gBAAAA,EAAe;AAAA,QACnC,SAAS,CAAC78B,MAAUkgC,EAAoBtZ,EAAK,KAAK,IAAI5mB,CAAK;AAAA,QAE3D,UAAA,gBAAA7X,EAAC,QAAA,EAAK,WAAU,4BACb,UAAAqZ,EAAM,IAAI,CAACG,MACV,gBAAAlZ,EAAC,QAAA,EAAwB,WAAU,4BACjC,UAAA;AAAA,UAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,uDACb,UAAAwZ,EAAK,KACR;AAAA,UACA,gBAAAxZ,EAAC,QAAA,EAAK,WAAU,wBACd,UAAA,gBAAAA,EAAC,UAAK,WAAU,uBAAuB,UAAAwZ,EAAK,UAAA,CAAU,EAAA,CACxD;AAAA,QAAA,KANSA,EAAK,OAOhB,CACD,EAAA,CACH;AAAA,MAAA;AAAA,MAzBKilB,EAAK;AAAA,IAAA;AAAA,EA4BhB,CAAC,GAEG6Z,KAA2B,CAC/BC,GACAC,GACAC,GACAC,MAEA,gBAAAp4C,EAAAq7B,IAAA,EACE,UAAA;AAAA,IAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,MAAA;AAAA,MAC5Bi4C,EAAa;AAAA,MAAO;AAAA,IAAA,GACjC;AAAA,IACCA,EAAa,SAAS,IACnBN,GAAgBM,GAAc,IAAI;AAAA,MAClC,cAAAE;AAAA,MACA,eAAAC;AAAA,MACA,mBAAmB;AAAA,IAAA,CACpB,IACC;AAAA,IACJ,gBAAAp4C,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,MAAA;AAAA,MAC1Bk4C,EAAe;AAAA,MAAO;AAAA,IAAA,GACrC;AAAA,IACCA,EAAe,SAAS,IACrBP,GAAgBO,GAAgB,IAAI;AAAA,MACpC,cAAAC;AAAA,MACA,eAAAC;AAAA,MACA,mBAAmB;AAAA,IAAA,CACpB,IACC;AAAA,EAAA,GACN;AAGF,SACE,gBAAAp4C,EAAC,SAAA,EAAM,WAAU,kBACd,UAAA;AAAA,IAAAlD,IACC,gBAAAkD,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,gBAAI5C,MAAY,YAAYo4C,GAAa,SAAS,QAAQ;AACxD,cAAAC,GAAgB,EAAE,MAAM,QAAQ;AAChC;AAAA,YACF;AACA,gBAAIkC,IAAqB;AACvB,cAAAxC,MAAA,QAAAA,GAAuB;AACvB;AAAA,YACF;AACA,gBAAIyC,IAAoB;AACtB,cAAAxtB,EAAc,IAAI,GAClBsqB,KAAA,QAAAA,EAAe;AACf;AAAA,YACF;AACA,YAAAH,EAAgB,IAAI;AAAA,UACtB;AAAA,UACA,cAAW;AAAA,UAEX,4BAAC3B,IAAA,CAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,MAEZ,gBAAA5yC,EAAC,SAAI,WAAU,gCACZ,gBAAY,WACXusC,GAAkBiJ,IAActyB,EAAM,MAAM,IAC1C20B,KACF,gBAAA73C,EAAC,UAAK,WAAU,yBAAyB,aAAiB,KAAI,IAE9D+zC,GAAiB32C,CAAO,EAAA,CAE5B;AAAA,MACCy6C,KACC,gBAAA73C,EAAC,QAAA,EAAK,WAAU,uBAAuB,UAAA63C,GAAiB,WAAU,IAChE;AAAA,IAAA,EAAA,CACN,IAEA,gBAAA73C,EAAC,OAAA,EAAI,WAAU,0BACb,4BAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA,uBAAA,CAAoB,GACpE;AAAA,IAGF,gBAAAM,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,MAAA,CAAClD,KACA,gBAAA4C,EAAC,OAAA,EAAI,WAAU,uBAAsB,cAAW,eAC7C,UAAA2zC,GAAS,IAAI,CAACG,GAAOvyB,MAAU;AAC9B,YAAIsyB,GAAmBC,CAAK;AAC1B,iBACE,gBAAA9zC;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cACV,MAAK;AAAA,YAAA;AAAA,YAFA,OAAOuhB,CAAK;AAAA,UAAA;AAMvB,cAAMze,IAAOgxC,EAAM;AACnB,eACE,gBAAAxzC;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAMi0C,EAAgBT,EAAM,EAAE;AAAA,YAEvC,UAAA;AAAA,cAAA,gBAAA9zC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA,gBAAAA,EAAC8C,KAAK,GACR;AAAA,cACA,gBAAAxC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAA8zC,EAAM,OAAM;AAAA,gBACzD,gBAAA9zC,EAAC,QAAA,EAAK,WAAU,4BAA4B,YAAM,YAAA,CAAY;AAAA,cAAA,GAChE;AAAA,cACA,gBAAAM,EAAC,QAAA,EAAK,WAAU,4BACb,UAAA;AAAA,gBAAAwzC,EAAM,YAAY,OACjB,gBAAA9zC,EAAC,QAAA,EAAK,WAAU,6BACb,UAAA22C,GAAO7C,EAAM,QAAQ,EAAA,CACxB,IACE;AAAA,kCACHjB,IAAA,CAAA,CAAY;AAAA,cAAA,EAAA,CACf;AAAA,YAAA;AAAA,UAAA;AAAA,UAnBKiB,EAAM;AAAA,QAAA;AAAA,MAsBjB,CAAC,EAAA,CACH;AAAA,MAGD12C,MAAY,cACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAo1C,IAAa;AAAA,MAGxDh4C,MAAY,gBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAq1C,GAAgB;AAAA,MAG3Dj4C,MAAY,wBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAs1C,IAAuB;AAAA,MAGlEl4C,MAAY,YACX,gBAAA4C;AAAA,QAAC+tC;AAAA,QAAA;AAAA,UACC,QAAQ7qB,EAAM;AAAA,UACd,WAAWA,EAAM;AAAA,UACjB,kBAAA+qB;AAAA,UACA,WAAAC;AAAA,UACA,QAAQsH;AAAA,UACR,gBAAgBC;AAAA,UAChB,eACErH,IACI,OAAOjuB,MAAU;AACjB,kBAAM7J,IAAK,MAAM83B,EAAcjuB,CAAK;AACpC,mBAAAs1B,GAAgB,EAAE,MAAM,QAAQ,GACzBn/B;AAAA,UACT,IACE;AAAA,UAEN,eAAA+3B;AAAA,UACA,eAAAC;AAAA,UACA,iBAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAIHnxC,MAAY,YACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA43C,KACG5C,IACAsD,GAAyB3C,IAAaG,EAAqB,EAAA,CACjE;AAAA,MAGD14C,MAAY,eACX,gBAAA4C,EAAC,SAAI,WAAU,2BACZ,eACGg1C,IACAsD;AAAA,QACA1C;AAAA,QACAG;AAAA,MAAA,GAEN;AAAA,MAGD34C,MAAY,YACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA43C,KACG5C,IACAsD,GAAyBpC,IAAcC,EAAsB,EAAA,CACnE;AAAA,MAGD/4C,MAAY,gBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA43C,KACC5C,IAEA,gBAAA10C,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,UAAA;AAAA,UAC1B21C,GAAiB;AAAA,UAAO;AAAA,QAAA,GACvC;AAAA,QACCgC;AAAA,UACChC;AAAA,UACA;AAAA,UACA,EAAE,aAAa,GAAA;AAAA,QAAK;AAAA,MACtB,EAAA,CACF,EAAA,CAEJ;AAAA,MAGD74C,MAAY,gBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA43C,KACC5C,IAEA,gBAAA10C,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAA37B,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,yIAIpC;AAAA,QACA,gBAAAM,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,UAAA;AAAA,UAC5Bi2C,GAAe;AAAA,UAAO;AAAA,QAAA,GACnC;AAAA,QACCA,GAAe,SAAS,IAAI6B,GAAA,IAA4B;AAAA,QACzD,gBAAA93C,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,UAAA;AAAA,UAC1Bg2C,GAAmB;AAAA,UAAO;AAAA,QAAA,GACzC;AAAA,QACCA,GAAmB,SAAS,IACzB2B,GAAgB3B,IAAoB,EAAE,IACtC;AAAA,MAAA,EAAA,CACN,EAAA,CAEJ;AAAA,MAGDl5C,MAAY,eACX,gBAAA4C,EAAC,SAAI,WAAU,2BACZ,eACCg1C,IAEAsD;AAAA,QACE9B;AAAA,QACAC;AAAA,QACA;AAAA,QACA;AAAA,MAAA,GAGN;AAAA,MAGDr5C,MAAY,YACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA23C,KACG1C,IACA2C,KACE5C,IAEA,gBAAA10C,EAAAq7B,IAAA,EACG,UAAA;AAAA,QAAA2c,GAAyBzC,IAAaG,EAAqB;AAAA,QAC3DgC,EAAe,SAAS,IACvB,gBAAA13C,EAAAq7B,IAAA,EACE,UAAA;AAAA,UAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,YAAA;AAAA,YACrB03C,EAAe;AAAA,YAAO;AAAA,UAAA,GAC1C;AAAA,UACA,gBAAAh4C,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,mIAIpC;AAAA,UACCg4C,EAAe,IAAI,CAACvM,MAAU;AAC7B,kBAAMqM,IAAWzM;AAAA,cACfI,EAAM;AAAA,cACNvoB,EAAM;AAAA,YAAA,GAEFmmB,IAASyO,IACX50B,EAAM,OAAO,KAAK,CAAC5C,MAAQA,EAAI,OAAOw3B,CAAQ,IAC9C,MACE3W,IAAOuK;AAAA,cACXD;AAAA,eACApC,KAAA,gBAAAA,EAAQ,QAAO;AAAA,YAAA;AAEjB,mBACE,gBAAArpC;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WACEk1C,MAA2BzJ,EAAM,KAC7B,kCACA;AAAA,gBAEN,SAAS,MAAM;AACb,kBAAArhB,EAAc,IAAI,GAClB+qB,MAAA,QAAAA,GAAuB1J,EAAM;AAAA,gBAC/B;AAAA,gBAEA,UAAA,gBAAAnrC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,kBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BACb,UAAAmhC,EAAK,OACR;AAAA,kBACA,gBAAA7gC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,oBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,0BACb,UAAAmhC,EAAK,IACR;AAAA,oBACA,gBAAAnhC,EAAC,UAAK,WAAU,wBACb,YAAK,KAAK,IAAI,CAACd,MACd,gBAAAc;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,WAAU;AAAA,wBAET,UAAAd;AAAA,sBAAA;AAAA,sBAHI,GAAGusC,EAAM,EAAE,IAAIvsC,CAAG;AAAA,oBAAA,CAK1B,EAAA,CACH;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,cA/BKusC,EAAM;AAAA,YAAA;AAAA,UAkCjB,CAAC;AAAA,QAAA,EAAA,CACH,IACE;AAAA,MAAA,EAAA,CACN,EAAA,CAER;AAAA,MAGDruC,MAAY,WACX,gBAAAkD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,mHAGpC;AAAA,QACA,gBAAAM,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,UAAAi3C;AAAA,UAAU;AAAA,UAAgBr0B,EAAM,MAAM;AAAA,UAAO;AAAA,QAAA,GAChD;AAAA,QACCgrB,KAAasG,KAAiB,QAC7B,gBAAAx0C,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM80C,KAAA,gBAAAA,EAAcN,IAAgB,mCAEnE,EAAA,CACF;AAAA,MAAA,GAEJ;AAAA,MAGDp3C,MAAY,WACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAC40C,IAKA,gBAAAt0C,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAA37B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA,gBAAY;AAAA,QAEnD;AAAA,UACE,CAAC,wBAAwB,YAAY;AAAA,UACrC,CAAC,uBAAuB,QAAQ;AAAA,QAAA,EAElC,IAAI,CAAC,CAACX,GAAKigB,CAAK,MAAM;AACtB,gBAAMq5B,IAAQC,GAAcv5C,CAAG,GACzBw5C,IAAa,CAAClV,GAAa/lB,EAAMve,CAAG,GAAGs5C,CAAK;AAClD,iBACE,gBAAA34C;AAAA,YAACq0C;AAAA,YAAA;AAAA,cAEC,OAAA/0B;AAAA,cACA,OAAO1B,EAAMve,CAAG;AAAA,cAChB,UAAUs5C;AAAA,cACV,UAAU,CAACnV,MAAQuR,EAAc,EAAE,CAAC11C,CAAG,GAAGmkC,GAAK;AAAA,cAC/C,SACEqV,IACI,MAAM9D,EAAc,EAAE,CAAC11C,CAAG,GAAGs5C,EAAA,CAAO,IACpC;AAAA,YAAA;AAAA,YARDt5C;AAAA,UAAA;AAAA,QAYX,CAAC;AAAA,QACD,gBAAAW,EAACm0C,IAAA,EAAc,OAAM,iBACnB,UAAA,gBAAAn0C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,WAAU;AAAA,YACV,OAAO4d,EAAM;AAAA,YACb,cAAW;AAAA,YACX,UAAU,CAACxX,MACT2uC,EAAc,EAAE,cAAc+D,GAAiB1yC,EAAE,OAAO,KAAK,EAAA,CAAG;AAAA,UAAA;AAAA,QAAA,GAGtE;AAAA,QACA,gBAAApG,EAAC,OAAA,EAAI,WAAU,4DAA2D,UAAA,kBAE1E;AAAA,QACA,gBAAAA;AAAA,UAACq0C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAOz2B,EAAM;AAAA,YACb,UAAUg7B,GAAc;AAAA,YACxB,UAAU,CAACpV,MAAQuR,EAAc,EAAE,aAAavR,GAAK;AAAA,YACrD,SACEG,GAAa/lB,EAAM,aAAag7B,GAAc,WAAW,IACrD,SACA,MACE7D,EAAc,EAAE,aAAa6D,GAAc,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,QAGlE,gBAAA54C;AAAA,UAACm0C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,SACEv2B,EAAM,oBAAoBg7B,GAAc,kBACpC,SACA,MACE7D,EAAc;AAAA,cACZ,iBAAiB6D,GAAc;AAAA,YAAA,CAChC;AAAA,YAGT,UAAA,gBAAA54C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,WAAU;AAAA,gBACV,OAAO4d,EAAM;AAAA,gBACb,cAAW;AAAA,gBACX,UAAU,CAACxX,MACT2uC,EAAc;AAAA,kBACZ,iBAAiBgE,GAAoB3yC,EAAE,OAAO,KAAK;AAAA,gBAAA,CACpD;AAAA,cAAA;AAAA,YAAA;AAAA,UAEL;AAAA,QAAA;AAAA,QAEF,gBAAApG,EAAC,OAAA,EAAI,WAAU,4DAA2D,UAAA,oBAE1E;AAAA,QACCk0C,GAAqB,IAAI,CAAC,CAAC70C,GAAKigB,CAAK,MAAM;AAC1C,gBAAMq5B,IAAQ3E,GAAoB30C,CAAG,GAC/Bw5C,IAAa,CAAClV,GAAa/lB,EAAMve,CAAG,GAAGs5C,CAAK;AAClD,iBACE,gBAAA34C;AAAA,YAACq0C;AAAA,YAAA;AAAA,cAEC,OAAA/0B;AAAA,cACA,OAAO1B,EAAMve,CAAG;AAAA,cAChB,UAAUs5C;AAAA,cACV,UAAU,CAACnV,MAAQuR,EAAc,EAAE,CAAC11C,CAAG,GAAGmkC,GAAK;AAAA,cAC/C,SACEqV,IACI,MAAM9D,EAAc,EAAE,CAAC11C,CAAG,GAAGs5C,EAAA,CAAO,IACpC;AAAA,YAAA;AAAA,YARDt5C;AAAA,UAAA;AAAA,QAYX,CAAC;AAAA,MAAA,EAAA,CACH,IAzGA,gBAAAW,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,mDAAA,CAEpC,EAuGA,CAEJ;AAAA,MAGD5C,MAAY,eACX,gBAAAkD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBACV,UAAAs3C,KACG,sBAAsBA,GAAY,IAAI,MACtC,8BAAA,CACN;AAAA,QACCtC;AAAA,MAAA,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IAECO;AAAA,EAAA,GACH;AAEJ;ACl1CA,eAAeyD,GAAU52B,GAAgC;;AACvD,QAAMpJ,KAAQ,MAAMoJ,EAAI,KAAA,GAAQ,KAAA;AAChC,MAAI;AACF,UAAM62B,IAAO,KAAK,MAAMjgC,CAAI,GACtBkgC,KAAcp7C,IAAAm7C,KAAA,gBAAAA,EAAM,UAAN,gBAAAn7C,EAAa;AACjC,QAAI,OAAOo7C,KAAgB,YAAYA,EAAa,QAAOA;AAAA,EAC7D,QAAQ;AAAA,EAER;AACA,SAAOlgC,KAAQ,wBAAwBoJ,EAAI,MAAM;AACnD;AAEA,eAAe+2B,GACbC,GACAC,GACAC,GACY;AACZ,QAAM36B,IAAOy6B,EAAU,QAAQ,OAAO,EAAE,GAClCh3B,IAAM,MAAM,MAAM,GAAGzD,CAAI,GAAG06B,CAAI,IAAI;AAAA,IACxC,aAAa;AAAA,IACb,GAAGC;AAAA,IACH,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,GAAIA,KAAA,QAAAA,EAAM,OAAO,EAAE,gBAAgB,mBAAA,IAAuB,CAAA;AAAA,MAC1D,GAAGA,KAAA,gBAAAA,EAAM;AAAA,IAAA;AAAA,EACX,CACD;AACD,MAAI,CAACl3B,EAAI,GAAI,OAAM,IAAI,MAAM,MAAM42B,GAAU52B,CAAG,CAAC;AAGjD,MAFI,EAAAA,EAAI,WAAW,OAEf,EADOA,EAAI,QAAQ,IAAI,cAAc,KAAK,IACtC,SAAS,kBAAkB;AACnC,WAAQ,MAAMA,EAAI,KAAA;AACpB;AAMO,SAASm3B,GAAiB;AAAA,EAC/B,WAAAH;AAAA,EACA,UAAAI;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,qBAAAC;AACF,GAA0B;AACxB,QAAM,CAACC,GAAaC,CAAc,IAAI/3B,EAAS,EAAK,GAC9C,CAACg4B,GAAiBC,CAAkB,IAAIj4B,EAA0B,SAAS,GAC3E,CAACk4B,GAAQC,CAAS,IAAIn4B,EAAqC,IAAI,GAC/D,CAACo4B,GAAcC,CAAe,IAAIr4B,EAAS,EAAK,GAChD,CAACgC,GAASs2B,CAAU,IAAIt4B,EAAS,EAAK,GACtC,CAACgtB,GAAOC,CAAQ,IAAIjtB,EAAwB,IAAI;AAEtD,EAAAG,GAAU,MAAM;AACd,QAAI,CAACo3B,KAAa,CAACI,EAAU;AAC7B,QAAIv3B,IAAY;AAChB,WAAA23B,EAAe,EAAK,GACpBE,EAAmB,SAAS,IACtB,YAAY;AAChB,UAAI;AACF,cAAM59B,IAAO,MAAMi9B;AAAA,UACjBC;AAAA,UACA;AAAA,QAAA;AAEF,YAAIn3B,EAAW;AACf,aAAI/F,KAAA,gBAAAA,EAAM,kBAAiB,IAAM;AAC/B,UAAA09B,EAAe,EAAK,GACpBE,EAAmB,IAAI;AACvB;AAAA,QACF;AACA,QAAAF,EAAe,EAAI;AAAA,MACrB,QAAQ;AACN,QAAK33B,MACH23B,EAAe,EAAK,GACpBE,EAAmB,IAAI;AAEzB;AAAA,MACF;AACA,UAAI;AACF,cAAMM,IAAS,MAAMjB;AAAA,UACnBC;AAAA,UACA,kCAAkCI,CAAQ;AAAA,QAAA;AAE5C,YAAIv3B,EAAW;AACf,QAAA63B,EAAmBM,KAAA,QAAAA,EAAQ,mBAAmB,QAAQ,IAAI;AAAA,MAC5D,QAAQ;AACN,QAAKn4B,KAAW63B,EAAmB,OAAO;AAAA,MAC5C;AAAA,IACF,GAAA,GACO,MAAM;AACX,MAAA73B,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAACm3B,GAAWI,CAAQ,CAAC;AAExB,QAAMa,IAAa9R,GAAY,MAAM;AACnC,IAAI1kB,KACA41B,KAIE,CAHU,OAAO;AAAA,MACnB;AAAA,IAAA,MAIJ3K,EAAS,IAAI,GACboL,EAAgB,EAAK,GACrBF,EAAU,QAAQ;AAAA,EACpB,GAAG,CAACn2B,GAAS41B,CAAO,CAAC,GAEfa,IAAgB/R,GAAY,YAAY;AAC5C,QAAI,EAAA1kB,KAAW,CAACu1B,KAAa,CAACI,IAC9B;AAAA,MAAAW,EAAW,EAAI,GACfrL,EAAS,IAAI;AACb,UAAI;AACF,cAAMqK,GAASC,GAAW,6BAA6BI,CAAQ,IAAI;AAAA,UACjE,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,EAAE,aAAa,GAAG;AAAA,QAAA,CACxC,GACDQ,EAAU,IAAI,GACdN,KAAA,QAAAA,EAAsB;AAAA,MACxB,SAAStzC,GAAG;AACV,QAAA0oC,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,8BAA8B;AAAA,MAC1E,UAAA;AACE,QAAA+zC,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACX,GAAUE,GAAqB71B,GAASu1B,CAAS,CAAC,GAEhDmB,IAAgBhS,GAAY,YAAY;AAC5C,QAAI,EAAA1kB,KAAW,CAACo2B,KAAgB,CAACb,KAAa,CAACI,IAC/C;AAAA,MAAAW,EAAW,EAAI,GACfrL,EAAS,IAAI;AACb,UAAI;AACF,cAAMqK,GAASC,GAAW,kCAAkCI,CAAQ,IAAI;AAAA,UACtE,QAAQ;AAAA,QAAA,CACT,GACDM,EAAmB,IAAI,GACvBE,EAAU,IAAI,GACdE,EAAgB,EAAK;AAAA,MACvB,SAAS9zC,GAAG;AACV,QAAA0oC,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,uCAAuC;AAAA,MACnF,UAAA;AACE,QAAA+zC,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACF,GAAcT,GAAU31B,GAASu1B,CAAS,CAAC,GAEzCoB,IAAab,MAAgBE,MAAoB,SAASA,MAAoB,UAC9EY,IAAad,KAAeE,MAAoB;AACtD,SAAI,CAACW,KAAc,CAACT,IAAe,OAGjC,gBAAAz5C,EAAAq7B,IAAA,EACG,UAAA;AAAA,IAAA6e,sBACE,OAAA,EAAI,WAAU,0BACb,UAAA,gBAAAl6C,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU6jB;AAAA,UACV,SAASw2B;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGAI,IACC,gBAAAz6C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU6jB;AAAA,UACV,SAAS,MAAM;AACb,YAAAirB,EAAS,IAAI,GACboL,EAAgB,EAAK,GACrBF,EAAU,QAAQ;AAAA,UACpB;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA,IAGC;AAAA,IAAA,EAAA,CACN,GACF,IACE;AAAA,IAEHD,IACC,gBAAAz5C,EAAC,OAAA,EAAI,WAAU,mBAAkB,MAAK,gBACpC,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAK6jB,KAASm2B,EAAU,IAAI;AAAA,UAC9B;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAA15C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,mBAAgB;AAAA,UAEhB,UAAA;AAAA,YAAA,gBAAAN,EAAC,MAAA,EAAG,WAAU,0BAAyB,IAAG,2BACvC,UAAA+5C,MAAW,WACR,iCACA,8CAAA,CACN;AAAA,YACCA,MAAW,WACV,gBAAAz5C,EAAAq7B,IAAA,EACE,UAAA;AAAA,cAAA,gBAAA37B,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,yGAGvC;AAAA,cACA,gBAAAM,EAAC,MAAA,EAAG,WAAU,2BACZ,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAG,UAAA,+DAAA,CAA4D;AAAA,gBAChE,gBAAAA,EAAC,QAAG,UAAA,qEAAA,CAAkE;AAAA,gBACtE,gBAAAA,EAAC,QAAG,UAAA,6EAAA,CAA0E;AAAA,cAAA,EAAA,CAChF;AAAA,YAAA,EAAA,CACF,IAEA,gBAAAM,EAAAq7B,IAAA,EACE,UAAA;AAAA,cAAA,gBAAA37B,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,yJAGvC;AAAA,cACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA,oBAAgB;AAAA,cACxD,gBAAAM,EAAC,MAAA,EAAG,WAAU,2BACZ,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAG,UAAA,mDAAA,CAAgD;AAAA,gBACpD,gBAAAA,EAAC,QAAG,UAAA,0DAAA,CAAuD;AAAA,gBAC3D,gBAAAA,EAAC,QAAG,UAAA,0CAAA,CAAuC;AAAA,gBAC3C,gBAAAA,EAAC,QAAG,UAAA,4DAAA,CAAyD;AAAA,cAAA,GAC/D;AAAA,cACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA,wBAAoB;AAAA,cAC5D,gBAAAM,EAAC,MAAA,EAAG,WAAU,2BACZ,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAG,UAAA,oEAAA,CAAiE;AAAA,gBACrE,gBAAAA,EAAC,QAAG,UAAA,8DAAA,CAA2D;AAAA,cAAA,GACjE;AAAA,cACA,gBAAAM,EAAC,SAAA,EAAM,WAAU,0BACf,UAAA;AAAA,gBAAA,gBAAAN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASi6C;AAAA,oBACT,UAAUp2B;AAAA,oBACV,UAAU,CAACzd,MAAM8zC,EAAgB9zC,EAAE,OAAO,OAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEnD,gBAAApG,EAAC,UAAK,UAAA,8EAAA,CAEN;AAAA,cAAA,EAAA,CACF;AAAA,YAAA,GACF;AAAA,YAED6uC,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,YAClE,gBAAAM,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU6jB;AAAA,kBACV,SAAS,MAAMm2B,EAAU,IAAI;AAAA,kBAC9B,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGAD,MAAW,WACV,gBAAA/5C;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU6jB;AAAA,kBACV,SAAS,MAAM,KAAKy2B,EAAA;AAAA,kBAEnB,cAAU,eAAe;AAAA,gBAAA;AAAA,cAAA,IAG5B,gBAAAt6C;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU6jB,KAAW,CAACo2B;AAAA,kBACtB,SAAS,MAAM,KAAKM,EAAA;AAAA,kBAEnB,cAAU,cAAc;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC3B,EAAA,CAEJ;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF,IACE;AAAA,EAAA,GACN;AAEJ;AC1RO,SAASG,GAAiB;AAAA,EAC/B,OAAAjP;AAAA,EACA,cAAAkP;AAAA,EACA,iBAAAC;AAAA,EACA,SAAAx4C;AAAA,EACA,UAAAy4C;AACF,GAMG;AACD,QAAMC,IAAWF,KAAmB,MAC9B1C,IAAQyC,EAAa,WAAW;AAEtC,SACE,gBAAAr6C,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,uLAIpC;AAAA,IACA,gBAAAA;AAAA,MAACupC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAOuR,IAAW,OAAOF,CAAe,IAAI;AAAA,QAC5C,UAAU,CAACx4C,KAAW81C;AAAA,QACtB,YAAYyC,EAAa,SAAS;AAAA,QAClC,aAAazC,IAAQ,+BAA+B;AAAA,QACpD,SAASyC;AAAA,QACT,UAAU,CAAC54C,MAAS84C,EAAS94C,IAAO,OAAOA,CAAI,IAAI,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAEzD,gBAAA/B,EAAC,OAAA,EAAI,WAAU,6BACZ,eAAW86C,IACV,gBAAA96C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM66C,EAAS,IAAI;AAAA,QAC7B,UAAA;AAAA,MAAA;AAAA,IAAA,IAID,gBAAA76C,EAAC,QAAA,CAAA,CAAK,EAAA,CAEV;AAAA,EAAA,GACF;AAEJ;AC/CA,MAAM+6C,KAA8C;AAAA,EAClD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAChB,GAGaC,KAAqB,mCACrBC,KAA0B;AAEhC,SAASC,GAAevpC,GAAsB;AACnD,SAAOopC,GAAiBppC,CAAiB,KAAKA,EAAK,QAAQ,MAAM,EAAE;AACrE;AAEO,SAASwpC,GACdC,IAASH,IACD;AACR,QAAMI,IAAQ,IAAI,WAAWD,CAAM;AACnC,aAAW,OAAO,gBAAgBC,CAAK;AACvC,MAAIxyC,IAAM;AACV,WAASmB,IAAI,GAAGA,IAAIoxC,GAAQpxC;AAC1B,IAAAnB,KAAOmyC,GAAmBK,EAAMrxC,CAAC,IAAKgxC,GAAmB,MAAM;AAEjE,SAAOnyC;AACT;AASO,SAASyyC,GACd1mC,GAKA0R,GACU;AACV,SAAO1R,EACJ,OAAO,CAACS,MAAUA,EAAM,YAAYiR,KAAW,CAACjR,EAAM,UAAU,EAChE,IAAI,CAACA,MAAUA,EAAM,GAAG;AAC7B;AAEO,SAASkmC,GACd/9C,GACAg+C,GACK;AACL,SAAOh+C,EAAO,OAAO,CAACI,MAAUA,EAAM,OAAO49C,CAAc;AAC7D;AAMO,SAASC,GACd9pC,GACA+pC,GACAC,IAAuBR,IACf;AACR,QAAMS,IAASV,GAAevpC,CAAI,GAC5B65B,IAAOkQ,aAAiB,MAAMA,IAAQ,IAAI,IAAIA,CAAK;AACzD,WAAS1xC,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3B,UAAM3K,IAAM,GAAGu8C,CAAM,IAAID,GAAQ;AACjC,QAAI,CAACnQ,EAAK,IAAInsC,CAAG,EAAG,QAAOA;AAAA,EAC7B;AACA,MAAIuF,IAAI;AACR,SAAO4mC,EAAK,IAAI,GAAGoQ,CAAM,IAAIh3C,CAAC,EAAE,IAAG,CAAAA,KAAK;AACxC,SAAO,GAAGg3C,CAAM,IAAIh3C,CAAC;AACvB;AAEO,SAASi3C,GAAmBtwC,GAAwC;AACzE,SAAO;AAAA,IACL,OAAOA,EAAS,MAAM,IAAI,CAAC8tC,OAAU,EAAE,GAAGA,EAAK,GAAG,QAAQA,EAAK,SAAS;AAAA,IACxE,UAAU9tC,EAAS,SAAS;AAAA,MAAI,CAACpH,MAC/BA,EAAK,IAAI,CAAC6I,OAAW,EAAE,GAAGA,EAAM,GAAG,GAAGA,EAAM,IAAI;AAAA,IAAA;AAAA,EAClD;AAEJ;AAEO,SAAS8uC,GAAoBt9B,GAYwB;AAC1D,QAAM,EAAE,OAAAnJ,GAAO,eAAA0mC,EAAA,IAAkBv9B;AACjC,MAAIu9B,MAAkB1mC,EAAM,QAAS,QAAO;AAC5C,QAAMqmC,IAAQJ,GAAqB98B,EAAK,QAAQu9B,CAAa,GACvDzlC,IAAKkI,EAAK,QAAA,GACVnf,KAAOmf,EAAK,YAAYi9B,IAAepmC,EAAM,MAAMqmC,CAAK,GACxD91B,IAAiB;AAAA,IACrB;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAAtP;AAAA,QACA,SAASylC;AAAA,QACT,KAAA18C;AAAA,QACA,MAAMgW,EAAM;AAAA,QACZ,UAAUwmC,GAAmBxmC,EAAM,QAAQ;AAAA,QAC3C,MAAM,EAAE,GAAGA,EAAM,KAAA;AAAA,QACjB,QAAQA,EAAM;AAAA,QACd,OAAO,EAAE,GAAGA,EAAM,MAAA;AAAA,QAClB,OAAO,EAAE,GAAGA,EAAM,MAAA;AAAA,QAClB,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAAA;AAAA,IAClB;AAAA,EACF;AAEF,SAAImJ,EAAK,cACPoH,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,YAAY,EAAE,GAAGpH,EAAK,YAAY,SAASlI,EAAA;AAAA,EAAG,CAC/C,GAEI,EAAE,KAAAsP,GAAK,SAAStP,GAAI,KAAAjX,EAAA;AAC7B;ACvHA,MAAM28C,KAA4C;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF;AAiBO,SAASC,GAAW;AAAA,EACzB,OAAA5mC;AAAA,EACA,YAAAwI;AAAA,EACA,WAAAuB;AAAA,EACA,WAAAqK;AAAA,EACA,QAAAkhB,IAAS,CAAA;AAAA,EACT,SAAAvoC;AAAA,EACA,mBAAAmkC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAA0V;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAtY;AAAA,EACA,SAAAuY;AACF,GAAoB;AAClB,QAAM,CAAC9V,GAAM+V,CAAO,IAAIx6B;AAAA,IAA4B,MAClDhE,IACIyjB,GAAqBzjB,GAAYxI,EAAM,IAAI,IAC3CiyB,GAAqBjyB,EAAM,IAAIA,EAAM,IAAI;AAAA,EAAA,GAEzCuxB,IAAUlb,GAAO4a,CAAI;AAC3B,EAAAM,EAAQ,UAAUN,GAElBtkB,GAAU,MAAM;AACd,IAAAq6B;AAAA,MACEx+B,IACIyjB,GAAqBzjB,GAAYxI,EAAM,IAAI,IAC3CiyB,GAAqBjyB,EAAM,IAAIA,EAAM,IAAI;AAAA,IAAA;AAAA,EAEjD,GAAG,CAACA,GAAOwI,CAAU,CAAC;AAEtB,QAAM2nB,IAAS+C;AAAA,IACb,CAACxmC,MAA4B;AAE3B,MADAs6C,EAAQt6C,CAAI,GACPK,KACLyhC,EAASvC,GAAqBv/B,GAAMsT,EAAM,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,CAACjT,GAASyhC,GAAUxuB,EAAM,IAAI;AAAA,EAAA,GAG1BinC,IAAQ/T;AAAA,IACZ,CAACC,MAAwC;AACvC,MAAAhD,EAAO,EAAE,GAAGoB,EAAQ,SAAS,SAASvxB,EAAM,IAAI,GAAGmzB,GAAS;AAAA,IAC9D;AAAA,IACA,CAAChD,GAAQnwB,EAAM,EAAE;AAAA,EAAA,GAGbknC,IAAax6B,GAAQ,MAAM;AAC/B,UAAM40B,wBAAa,IAAA;AACnB,eAAWz3B,MAAYuK,GAAW;AAChC,YAAMpqB,IAAM6f,GAAS,KAAK,KAAA,EAAO,YAAA;AACjC,MAAAy3B,EAAO,IAAIt3C,IAAMs3C,EAAO,IAAIt3C,CAAG,KAAK,KAAK,CAAC;AAAA,IAC5C;AACA,WAAOs3C;AAAA,EACT,GAAG,CAACltB,CAAS,CAAC,GAER+yB,IAAkBz6B;AAAA,IACtB,MACE0H,EAAU,IAAI,CAACvK,MAAa;AAC1B,YAAM03B,MACH2F,EAAW,IAAIr9B,EAAS,KAAK,OAAO,aAAa,KAAK,KAAK;AAC9D,aAAO;AAAA,QACL,OAAO,OAAOA,EAAS,EAAE;AAAA,QACzB,OAAO23B,GAAoB33B,GAAU03B,EAAS;AAAA,MAAA;AAAA,IAElD,CAAC;AAAA,IACH,CAAC2F,GAAY9yB,CAAS;AAAA,EAAA,GAGlBgzB,IAAiB16B,GAAQ,MAAM26B,GAAA,GAAwB,CAAA,CAAE,GACzDC,IACJC,GAAyBtW,EAAK,WAAWlnB,CAAS,KAClDknB,EAAK,eACL,IAEIuW,IAAmB96B,GAAQ,MAAM;;AACrC,WAAIukB,EAAK,WAAW,OAAa,SAC1BxoC,IAAA6sC,EAAO,KAAK,CAACj3B,OAASA,GAAK,OAAO4yB,EAAK,OAAO,MAA9C,gBAAAxoC,EAAiD,SAAQ;AAAA,EAClE,GAAG,CAACwoC,EAAK,SAASqE,CAAM,CAAC,GAEnBjE,IAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,SAASJ,EAAK,SAAS,GACnBG,IACJH,EAAK,cAAc,WAAWA,EAAK,cAAc,YAC7C,eACA,cACAwW,KAAoBC;AAAA,IACxBzW;AAAA,IACA;AAAA,MACE,oBAAoB4V;AAAA,MACpB,kBAAkBC;AAAA,MAClB,sBAAsB3V;AAAA,MACtB,kBAAkBA;AAAA,IAAA;AAAA,IAEpBnxB,EAAM;AAAA,EAAA,GAGF2nC,KAAgBzS,GAAoBjE,CAAI;AAE9C,SAAK2D,GAAiB50B,EAAM,IAAI,IAG9B,gBAAA/U,EAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,IAAA+U,EAAM,SAAS,UAAUA,EAAM,SAAS,iBACvC,gBAAA/U,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAA37B;AAAA,QAACupC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAOjD,EAAK,cAAc,OAAO,OAAOA,EAAK,UAAU,IAAI;AAAA,UAC3D,UAAU,CAAClkC;AAAA,UACX,YAAU;AAAA,UACV,aAAY;AAAA,UACZ,SAASo6C;AAAA,UACT,UAAU,CAACz6C,MAAS;AAClB,kBAAMk7C,KAAal7C,IAAO,OAAOA,CAAI,IAAI,MACnCmd,IAAWuK,EAAU,KAAK,CAAC/V,OAASA,GAAK,OAAOupC,EAAU,GAC1DC,KAAYlB,GAAmB,SAAS1V,EAAK,SAAS,IACxDA,EAAK,YACL;AACJ,YAAAgW,EAAM;AAAA,cACJ,YAAYW,KAAa,aAAa;AAAA,cACtC,YAAAA;AAAA,cACA,WAAW;AAAA,cACX,SAAS;AAAA,cACT,YAAYA,KAAa,aAAa;AAAA,cACtC,WAAAC;AAAA,cACA,aACEA,OAAc,iBACVh+B,KAAA,gBAAAA,EAAU,SAAQ,OAClBonB,EAAK;AAAA,cACX,gBACE4W,OAAc,iBACVh+B,KAAA,gBAAAA,EAAU,YAAWonB,EAAK,iBAC1BA,EAAK;AAAA,YAAA,CACZ;AAAA,UACH;AAAA,QAAA;AAAA,MAAA;AAAA,MAEDA,EAAK,cAAc,OAClB,gBAAAhmC,EAAC,OAAA,EAAI,WAAU,0BAAyB,MAAK,SAAQ,cAAW,WAC9D,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WACEsmC,EAAK,cAAc,gBAAgB,cAAc;AAAA,YAEnD,UAAU,CAAClkC;AAAA,YACX,SAAS,MAAM;AACb,oBAAM8c,IAAWuK,EAAU;AAAA,gBACzB,CAAC/V,OAASA,GAAK,OAAO4yB,EAAK;AAAA,cAAA;AAE7B,cAAAgW,EAAM;AAAA,gBACJ,WAAW;AAAA,gBACX,cAAap9B,KAAA,gBAAAA,EAAU,SAAQonB,EAAK;AAAA,cAAA,CACrC;AAAA,YACH;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAtmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WACEsmC,EAAK,cAAc,gBAAgB,cAAc;AAAA,YAEnD,UAAU,CAAClkC;AAAA,YACX,SAAS,MAAM;AACb,oBAAM8c,IAAWuK,EAAU;AAAA,gBACzB,CAAC/V,OAASA,GAAK,OAAO4yB,EAAK;AAAA,cAAA;AAE7B,cAAAgW,EAAM;AAAA,gBACJ,WAAW;AAAA,gBACX,iBACEp9B,KAAA,gBAAAA,EAAU,YAAWonB,EAAK;AAAA,cAAA,CAC7B;AAAA,YACH;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAtmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WACEsmC,EAAK,cAAc,gBAAgB,cAAc;AAAA,YAEnD,UAAU,CAAClkC;AAAA,YACX,SAAS,MAAMk6C,EAAM,EAAE,WAAW,eAAe;AAAA,YAClD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF,IACE;AAAA,MACHhW,EAAK,cAAc,QAAQA,EAAK,cAAc,gBAC7C,gBAAAhmC,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,UAAA;AAAA,UAEvC,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM;AAAA,cACN,UAAU,CAACoC;AAAA,cACX,OAAOkkC,EAAK,eAAe;AAAA,cAC3B,OAAO;AAAA,gBACL,WAAWrmB;AAAA,kBACTqmB,EAAK,SAASjxB,EAAM,MAAM;AAAA,gBAAA;AAAA,cAC5B;AAAA,cAEF,UAAU,CAACjP,MAAMk2C,EAAM,EAAE,aAAal2C,EAAE,OAAO,SAAS,KAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAChE,GACF;AAAA,QACA,gBAAApG;AAAA,UAAC+lC;AAAA,UAAA;AAAA,YACC,OAAOO,EAAK,SAASjxB,EAAM,MAAM,SAAS8nC;AAAA,YAC1C,UAAU,CAAC/6C;AAAA,YACX,UAAU,CAAC4e,MAAsBs7B,EAAM,EAAE,OAAAt7B,GAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAClD,EAAA,CACF,IACE;AAAA,IAAA,EAAA,CACN,IACE;AAAA,IAEH3L,EAAM,SAAS,WACd,gBAAA/U,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,SAAI,WAAU,0BAAyB,MAAK,SAAQ,cAAW,kBAC9D,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWsmC,EAAK,cAAc,iBAAiB,cAAc;AAAA,YAC7D,UAAU,CAAClkC;AAAA,YACX,SAAS,MACPk6C,EAAM;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,YAAA,CACZ;AAAA,YAEJ,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAt8C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWsmC,EAAK,cAAc,iBAAiB,cAAc;AAAA,YAC7D,UAAU,CAAClkC;AAAA,YACX,SAAS,MACPk6C,EAAM;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,YAAA,CACZ;AAAA,YAEJ,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MACChW,EAAK,cAAc,iBAClB,gBAAAhmC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAa;AAAA,YACb,YAAY;AAAA,YACZ,UAAU,CAACoC;AAAA,YACX,aAAY;AAAA,YACZ,cAAW;AAAA,YACX,OAAOkkC,EAAK,kBAAkB;AAAA,YAC9B,UAAU,CAAClgC,MACTk2C,EAAM;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,cACX,gBAAgBl2C,EAAE,OAAO,MAAM,SAASA,EAAE,OAAO,MAAM,SAAS;AAAA,YAAA,CACjE;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJkgC,EAAK,kBAAkB,CAAC8W,GAAe9W,EAAK,cAAc,IACzD,gBAAAtmC,EAAC,QAAA,EAAK,WAAU,wBAAuB,UAAA,gDAAA,CAEvC,IACE;AAAA,MAAA,EAAA,CACN,IAEA,gBAAAM,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,UAAA;AAAA,UAEvC,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM;AAAA,cACN,UAAU,CAACoC;AAAA,cACX,OAAOkkC,EAAK,eAAe;AAAA,cAC3B,OAAO;AAAA,gBACL,WAAWrmB;AAAA,kBACTqmB,EAAK,SAASjxB,EAAM,MAAM;AAAA,gBAAA;AAAA,cAC5B;AAAA,cAEF,UAAU,CAACjP,MACTk2C,EAAM;AAAA,gBACJ,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,aAAal2C,EAAE,OAAO,SAAS;AAAA,cAAA,CAChC;AAAA,YAAA;AAAA,UAAA;AAAA,QAEL,GACF;AAAA,QACA,gBAAApG;AAAA,UAAC+lC;AAAA,UAAA;AAAA,YACC,OAAOO,EAAK,SAASjxB,EAAM,MAAM,SAAS8nC;AAAA,YAC1C,UAAU,CAAC/6C;AAAA,YACX,UAAU,CAAC4e,MAAsBs7B,EAAM,EAAE,OAAAt7B,GAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAClD,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ,IACE;AAAA,IAEH3L,EAAM,SAAS,YACd,gBAAArV;AAAA,MAACupC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAOoT;AAAA,QACP,UAAU,CAACv6C;AAAA,QACX,YAAU;AAAA,QACV,aAAY;AAAA,QACZ,SAASq6C;AAAA,QACT,UAAU,CAAC16C,MAAS;AAClB,gBAAMs7C,KAAYt7C,IACdu7C,GAAwBv7C,GAAMqd,CAAS,IACvC;AACJ,UAAAk9B,EAAM;AAAA,YACJ,YAAYv6C,IAAO,YAAY;AAAA,YAC/B,WAAAs7C;AAAA,YACA,aAAat7C,KAAQ;AAAA,YACrB,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,WAAW;AAAA,UAAA,CACZ;AAAA,QACH;AAAA,MAAA;AAAA,IAAA,IAEA;AAAA,IAEHsT,EAAM,SAAS,iBACd,gBAAArV;AAAA,MAACu9C;AAAA,MAAA;AAAA,QACC,OAAOjX,EAAK,eAAeuW,KAAoB;AAAA,QAC/C,UAAU,CAACz6C;AAAA,QACX,UAAU,CAACk+B,MAAS;AAClB,gBAAMkd,KAAUld,EAAK,KAAA;AACrB,UAAAgc,EAAM;AAAA,YACJ,YAAYkB,KAAU,UAAU;AAAA,YAChC,SAASA,KAAUlX,EAAK,UAAU;AAAA,YAClC,aAAahG,MAAS,KAAK,OAAOA;AAAA,YAClC,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,WAAW;AAAA,UAAA,CACZ;AAAA,QACH;AAAA,MAAA;AAAA,IAAA,IAEA;AAAA,IAEJ,gBAAAtgC;AAAA,MAACqmC;AAAA,MAAA;AAAA,QACC,MAAAC;AAAA,QACA,SAAAlkC;AAAA,QACA,mBAAmBqnC;AAAA,UACjBp0B,EAAM;AAAA,UACNkxB;AAAA,QAAA;AAAA,QAEF,gBAAgBuW;AAAA,QAChB,gBAAArW;AAAA,QACA,eAAAC;AAAA,QACA,SAAS4V;AAAA,MAAA;AAAA,IAAA;AAAA,IAEVl6C,IACC,gBAAApC,EAAC,OAAA,EAAI,WAAU,4DACb,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,UAAKg9C,MACLZ,EAAA;AAAA,QACF;AAAA,QACA,UAAU,CAACY;AAAA,QACZ,UAAA;AAAA,MAAA;AAAA,IAAA,GAGH,IACE;AAAA,EAAA,GACN,IA7RwC;AA+R5C;AAEA,SAASO,GAAe;AAAA,EACtB,OAAAjhB;AAAA,EACA,UAAAn5B;AAAA,EACA,UAAA0gC;AACF,GAIG;AACD,SACE,gBAAAvjC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,IAAA;AAAA,IAEvC,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAa;AAAA,QACb,YAAY;AAAA,QACZ,UAAAmD;AAAA,QACA,aAAY;AAAA,QACZ,cAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAAm5B;AAAA,QACA,UAAU,CAACl2B,MAAMy9B,EAASz9B,EAAE,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1C,GACF;AAEJ;AChcO,SAASq3C,GAAe;AAAA,EAC7B,QAAA7oC;AAAA,EACA,aAAA4U;AAAA,EACA,SAAApnB;AAAA,EACA,mBAAAmkC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAA0V;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAxV;AACF,GASG;;AACD,QAAMzF,IAAOtsB,EACV,OAAO,CAACS,MAAU40B,GAAiB50B,EAAM,IAAI,CAAC,EAC9C,IAAI,CAACA,MAAU;AACd,UAAMoQ,IAAW+D,EAAY,KAAK,CAAClJ,MAAQA,EAAI,YAAYjL,EAAM,EAAE;AACnE,WAAOoQ,IACH6b,GAAqB7b,GAAUpQ,EAAM,IAAI,IACzCiyB,GAAqBjyB,EAAM,IAAIA,EAAM,IAAI;AAAA,EAC/C,CAAC,GACGqoC,IAASC,GAAoBzc,CAAI,GACjC0c,IAAmBhpC,EAAO,OAAO,CAACS,MAAU40B,GAAiB50B,EAAM,IAAI,CAAC,GACxEwoC,IACJD,EAAiB,SAAS,KAC1BA,EAAiB;AAAA,IACf,CAACvoC,MAAUA,EAAM,SAAS,aAAaA,EAAM,SAAS;AAAA,EAAA,GAEpDyoC,IAAc,IAAI,IAAIF,EAAiB,IAAI,CAACvoC,MAAUA,EAAM,IAAI,CAAC,GACjEoxB,IAAiBoX,IAAW,eAAe,cAC3Cf,IACJgB,EAAY,SAAS,IACjBf;AAAA,IACE7b,EAAK,CAAC;AAAA,IACN;AAAA,MACE,oBAAoBgb;AAAA,MACpB,kBAAkBC;AAAA,MAClB,sBAAsB3V;AAAA,MACtB,kBAAkBA;AAAA,IAAA;AAAA,KAEpB1oC,IAAA8/C,EAAiB,CAAC,MAAlB,gBAAA9/C,EAAqB;AAAA,EAAA,IAEvB0oC,GACAuX,IACJD,EAAY,SAAS,IACjBrU,IAA0B/7B,IAAAkwC,EAAiB,CAAC,MAAlB,gBAAAlwC,EAAqB,MAAM64B,CAAiB,IACtEA;AAEN,SACE,gBAAAjmC,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,SAAI,WAAU,0BACZ,UAAA4U,EAAO,IAAI,CAACS,MACX,gBAAArV,EAAC,QAAA,EAAoB,WAAU,yBAC5B,UAAAqV,EAAM,IAAA,GADEA,EAAM,EAEjB,CACD,GACH;AAAA,IACA,gBAAArV;AAAA,MAACg+C;AAAA,MAAA;AAAA,QACC,OAAON,EAAO;AAAA,QACd,UAAU,CAACt7C;AAAA,QACX,UAAU,CAACgX,MAASutB,EAAQ,EAAE,MAAAvtB,GAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAEtC,gBAAApZ;AAAA,MAACi+C;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOP,EAAO;AAAA,QACd,UAAUK;AAAA,QACV,OAAOL,EAAO;AAAA,QACd,UAAU,CAACt7C;AAAA,QACX,UAAU,CAAC+kC,MAAYR,EAAQ,EAAE,SAAAQ,GAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5C,gBAAAnnC;AAAA,MAACi+C;AAAA,MAAA;AAAA,QACC,OAAOxX;AAAA,QACP,OAAOiX,EAAO;AAAA,QACd,UAAUZ;AAAA,QACV,OAAOY,EAAO;AAAA,QACd,UAAU,CAACt7C;AAAA,QACX,UAAU,CAACglC,MAAcT,EAAQ,EAAE,WAAAS,GAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EAChD,GACF;AAEJ;AAEA,SAAS4W,GAAY;AAAA,EACnB,OAAA1hB;AAAA,EACA,UAAAn5B;AAAA,EACA,UAAA0hC;AACF,GAIG;AACD,QAAM,CAAC3hB,GAAO+gB,CAAQ,IAAIpiB,EAAS,MAAOya,MAAU,KAAK,KAAK,OAAOA,CAAK,CAAE,GACtE4H,IAAUxY,GAAO,EAAK;AAE5B,EAAA1J,GAAU,MAAM;AACd,IAAKkiB,EAAQ,WAASD,EAAS3H,MAAU,KAAK,KAAK,OAAOA,CAAK,CAAC;AAAA,EAClE,GAAG,CAACA,CAAK,CAAC;AAEV,QAAM4hB,IAAiB,CAAC1hB,GAAa6H,MAA+B;AAClE,QAAI,CAAC7H,EAAI,QAAQ;AACf,MAAAyH,EAAS,EAAE;AACX;AAAA,IACF;AACA,UAAMpG,IAAS0G,GAAsB/H,CAAG;AACxC,QAAI,CAACqB,EAAO,UAAU;AACpB,MAAAoG,EAASzH,CAAG;AACZ;AAAA,IACF;AACA,IAAAyH,EAAS,OAAOpG,EAAO,MAAM,CAAC,GAC9BgH,EAAShH,EAAO,MAAM,GAClBwG,KAAmBJ,EAAS,OAAOpG,EAAO,MAAM,CAAC;AAAA,EACvD,GAEM70B,IAAO,CAACuG,MAAkB;AAE9B,UAAMxN,KADOu6B,MAAU,KAAK5c,KAA0B4c,KAClC/sB;AACpB,IAAA00B,EAAS,OAAOliC,CAAI,CAAC,GACrB8iC,EAAS9iC,CAAI;AAAA,EACf;AAEA,SACE,gBAAAzB,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA0B,UAAA,QAAI;AAAA,sBAC7C,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAAmD;AAAA,UACA,cAAW;AAAA,UACX,SAAS,MAAM6F,EAAK,EAAE;AAAA,UACvB,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAhJ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAOkjB;AAAA,UACP,UAAA/f;AAAA,UACA,cAAW;AAAA,UACX,SAAS,MAAM;AACb,YAAA+gC,EAAQ,UAAU;AAAA,UACpB;AAAA,UACA,UAAU,CAAC99B,MAAM83C,EAAe93C,EAAE,OAAO,OAAO,EAAK;AAAA,UACrD,QAAQ,MAAM;AACZ,YAAA89B,EAAQ,UAAU,IAClBga,EAAeh7B,GAAO,EAAI;AAAA,UAC5B;AAAA,UACA,WAAW,CAAC9c,MAAM;AAChB,gBAAIA,EAAE,QAAQ,SAAS;AACrB,cAAAA,EAAE,eAAA,GACDA,EAAE,OAA4B,KAAA;AAC/B;AAAA,YACF;AAGA,gBAFIA,EAAE,QAAQ,aAAaA,EAAE,QAAQ,gBACrCA,EAAE,eAAA,GACEjD,GAAU;AACd,kBAAMoM,IAAQnJ,EAAE,QAAQ,YAAY,IAAI,IAClCy3B,IAAS0G,GAAsBrhB,CAAK,GAMpCnhB,KALO87B,EAAO,WAChBA,EAAO,SACPvB,MAAU,KACR5c,KACA4c,KACc/sB;AACpB,YAAA00B,EAAS,OAAOliC,CAAI,CAAC,GACrB8iC,EAAS9iC,CAAI;AAAA,UACf;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAA/B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAAmD;AAAA,UACA,cAAW;AAAA,UACX,SAAS,MAAM6F,EAAK,CAAC;AAAA,UACtB,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAEA,SAASi1C,GAAa;AAAA,EACpB,OAAA3+B;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAoI;AAAA,EACA,OAAAyZ;AAAA,EACA,UAAAh7C;AAAA,EACA,UAAA0hC;AACF,GAOG;AACD,QAAMG,IAAc,CAACmZ,KAASjgC,GAAmBoe,CAAK,GAChD+I,IAAU8Y,IACZ,KACAnZ,IACEM,KACAhJ,EAAM,SACJA,IACAoI,GACFmU,IAAasF,KAAS,EAAQ7hB,EAAM,QACpC,CAACkH,GAAK+B,CAAM,IAAI1jB,EAASmjB,IAAc,KAAKK,CAAO;AAEzD,EAAArjB,GAAU,MAAM;AACd,IAAAujB,EAAOP,IAAc,KAAKK,CAAO;AAAA,EACnC,GAAG,CAACA,GAASL,CAAW,CAAC;AAEzB,QAAMQ,IAAS,CAACzjC,MAAiB;AAC/B,QAAI,CAACA,EAAK,KAAA,KAAUmc,GAAmBnc,CAAI,GAAG;AAC5C,MAAAwjC,EAAO,EAAE,GACJ4Y,KAAOtZ,EAASS,EAAiB;AACtC;AAAA,IACF;AACA,UAAMG,IAAanC,GAAkBvhC,CAAI;AACzC,QAAI,CAAC0jC,GAAY;AACf,MAAAF,EAAOP,IAAc,KAAKK,CAAO;AACjC;AAAA,IACF;AACA,IAAAE,EAAOE,CAAU,GACjBZ,EAASY,CAAU;AAAA,EACrB;AAEA,SACE,gBAAAnlC,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,2BACb,UAAA;AAAA,MAAAgf;AAAA,MACAu5B,IACC,gBAAA74C;AAAA,QAACojC;AAAA,QAAA;AAAA,UACC,OAAA9jB;AAAA,UACA,UAAAnc;AAAA,UACA,SAAS,MAAM0hC,EAAS,IAAI;AAAA,QAAA;AAAA,MAAA,IAE5B;AAAA,IAAA,GACN;AAAA,IACA,gBAAA7kC;AAAA,MAACwkC;AAAA,MAAA;AAAA,QACC,OAAAllB;AAAA,QACA,KAAAkkB;AAAA,QACA,QAAQ6B;AAAA,QACR,UAAAX;AAAA,QACA,UAAAvhC;AAAA,QACA,oBAAoB,CAACg7C;AAAA,QACrB,aAAa5Y;AAAA,QACb,UAAU,MAAMC,EAAOhC,CAAG;AAAA,QAC1B,QAAQgC;AAAA,MAAA;AAAA,IAAA;AAAA,EACV,GACF;AAEJ;ACnRA,SAAS4Y,KAAU;AACjB,SACE,gBAAAp+C;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,eAAW;AAAA,MAEX,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IACjB;AAAA,EAAA;AAGN;AAEO,SAASq+C,GAAkB;AAAA,EAChC,cAAAC;AAAA,EACA,UAAAn7C,IAAW;AAAA,EACX,eAAAo7C;AACF,GAIG;AACD,QAAMC,IAASC,GAAA,GACTC,IAAYhzB,GAA0B,IAAI,GAC1CizB,IAAUjzB,GAAuB,IAAI,GACrC,CAAChZ,GAAMksC,CAAO,IAAI/8B,EAAS,EAAK,GAChC,CAACgtB,GAAOC,CAAQ,IAAIjtB,EAAwB,IAAI,GAChD,CAACg9B,GAASC,CAAU,IAAIj9B,EAKpB,IAAI,GAERk9B,IAAQxW,GAAY,MAAM;AAC9B,IAAAqW,EAAQ,EAAK,GACbE,EAAW,IAAI;AAAA,EACjB,GAAG,CAAA,CAAE,GAECE,IAAgBzW,GAAY,MAAM;AACtC,UAAMtpC,IAAKy/C,EAAU;AACrB,QAAI,CAACz/C,EAAI;AACT,UAAMic,IAAOjc,EAAG,sBAAA,GACVggD,IAAa,OAAO,cAAc/jC,EAAK,SAAS,GAChDgkC,IAAahkC,EAAK,MAAM,GACxBikC,IAAY,KAAK,IAAI,KAAK,KAAK,IAAIF,GAAYC,GAAY,GAAG,CAAC,GAC/DE,IAAYH,IAAa,OAAOC,IAAaD;AACnD,IAAAH,EAAW;AAAA,MACT,KAAKM,IAAY,KAAK,IAAI,GAAGlkC,EAAK,MAAMikC,IAAY,CAAC,IAAIjkC,EAAK,SAAS;AAAA,MACvE,MAAMA,EAAK;AAAA,MACX,OAAO,KAAK,IAAIA,EAAK,OAAO,GAAG;AAAA,MAC/B,WAAAikC;AAAA,IAAA,CACD;AAAA,EACH,GAAG,CAAA,CAAE,GAECE,IAAiBf,EAAa,IAAI,CAAC1gD,MAAUA,EAAM,EAAE,EAAE,KAAK,GAAG;AAiCrE,MAhCAokB,GAAU,MAAM;AACd,IAAA8sB,EAAS,IAAI,GACbiQ,EAAA;AAAA,EACF,GAAG,CAACA,GAAOM,CAAc,CAAC,GAE1Br9B,GAAU,MAAM;AACd,QAAI,CAACtP,EAAM;AACX,IAAAssC,EAAA;AACA,UAAMM,IAAQ,CAACl5C,MAAkB;;AAC/B,YAAM9D,IAAI8D,EAAE;AACZ,OAAItI,IAAA4gD,EAAU,YAAV,QAAA5gD,EAAmB,SAASwE,OAAMoL,IAAAixC,EAAQ,YAAR,QAAAjxC,EAAiB,SAASpL,MAChEy8C,EAAA;AAAA,IACF,GACM9pB,IAAQ,CAAC7uB,MAAqB;;AAClC,MAAIA,EAAE,QAAQ,aACZ24C,EAAA,IACAjhD,IAAA4gD,EAAU,YAAV,QAAA5gD,EAAmB;AAAA,IAEvB,GACM8zC,IAAS,MAAMoN,EAAA;AACrB,oBAAS,iBAAiB,aAAaM,CAAK,GAC5C,SAAS,iBAAiB,WAAWrqB,CAAK,GAC1C,OAAO,iBAAiB,UAAU2c,CAAM,GACxC,OAAO,iBAAiB,UAAUA,GAAQ,EAAI,GACvC,MAAM;AACX,eAAS,oBAAoB,aAAa0N,CAAK,GAC/C,SAAS,oBAAoB,WAAWrqB,CAAK,GAC7C,OAAO,oBAAoB,UAAU2c,CAAM,GAC3C,OAAO,oBAAoB,UAAUA,GAAQ,EAAI;AAAA,IACnD;AAAA,EACF,GAAG,CAACmN,GAAOrsC,GAAMssC,CAAa,CAAC,GAE3BV,EAAa,WAAW,EAAG,QAAO;AAEtC,QAAMiB,IACJ7sC,KAAQmsC,KAAW,CAAC17C,IAChBwvC;AAAA,IACE,gBAAA3yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK2+C;AAAA,QACL,IAAIH;AAAA,QACJ,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAW;AAAA,QACX,OAAO;AAAA,UACL,KAAKK,EAAQ;AAAA,UACb,MAAMA,EAAQ;AAAA,UACd,OAAOA,EAAQ;AAAA,UACf,WAAWA,EAAQ;AAAA,QAAA;AAAA,QAGrB,UAAA,gBAAA7+C,EAAC,MAAA,EAAG,WAAU,0BACX,UAAAs+C,EAAa,IAAI,CAAC1gD,MACjB,gBAAAoC,EAAC,MAAA,EAAkB,MAAK,UACtB,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AACb,oBAAMw/C,IAAYjB,EAAc3gD,EAAM,EAAE;AACxC,cAAAkxC,EAAS0Q,CAAS,GACbA,KAAWT,EAAA;AAAA,YAClB;AAAA,YAEC,UAAAnhD,EAAM;AAAA,UAAA;AAAA,QAAA,KAVFA,EAAM,EAYf,CACD,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,EAAA,IAEX;AAEN,SACE,gBAAA0C,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,IAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKo+C;AAAA,QACL,MAAK;AAAA,QACL,WACEhsC,IAAO,mCAAmC;AAAA,QAE5C,cAAW;AAAA,QACX,iBAAc;AAAA,QACd,iBAAeA;AAAA,QACf,iBAAeA,IAAO8rC,IAAS;AAAA,QAC/B,UAAAr7C;AAAA,QACA,SAAS,MAAM;AACb,UAAIA,MACJ2rC,EAAS,IAAI,GACb8P,EAAQ,CAACtiB,MAAU,CAACA,CAAK;AAAA,QAC3B;AAAA,QACD,UAAA;AAAA,UAAA;AAAA,4BAEE8hB,IAAA,CAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEVmB;AAAA,IACA1Q,IACC,gBAAA7uC,EAAC,KAAA,EAAE,WAAU,wBAAuB,OAAO,EAAE,OAAO,UAAA,GACjD,UAAA6uC,EAAA,CACH,IACE;AAAA,EAAA,GACN;AAEJ;AC/JA,MAAM4Q,KAAgB;AAGf,SAASC,GAAiB;AAAA,EAC/B,OAAApgC;AAAA,EACA,SAAAld;AAAA,EACA,gBAAAokC;AAAA,EACA,UAAA3C;AACF,GAKG;AACD,QAAM,CAACzqB,GAAMumC,CAAO,IAAI99B,EAASvC,EAAM,QAAQoX,EAAqB,GAC9D,CAAC3V,GAAQ6+B,CAAS,IAAI/9B,EAASvC,EAAM,UAAU,CAAC,GAChDugC,IAAUn0B,GAAOtS,CAAI,GACrB0mC,IAAYp0B,GAAO3K,CAAM;AAC/B,EAAA8+B,EAAQ,UAAUzmC,GAClB0mC,EAAU,UAAU/+B;AACpB,QAAM8lB,IAAYnb,GAAyC,EAAE;AAE7D,EAAA1J,GAAU,MAAM;AACd,IAAA29B,EAAQrgC,EAAM,QAAQoX,EAAqB,GAC3CkpB,EAAUtgC,EAAM,UAAU,CAAC;AAAA,EAC7B,GAAG,CAACA,CAAK,CAAC,GAEV0C;AAAA,IACE,MAAM,MAAM;AACT,aAAO,OAAO6kB,EAAU,OAAO,EAAe;AAAA,QAAQ,CAACvwB,MACtD,OAAO,cAAcA,CAAE;AAAA,MAAA;AAAA,IAE3B;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMkvB,IAAS+C;AAAA,IACb,CAACC,GAA8B2P,MAA8B;AAC3D,UAAI,CAAC/1C,EAAS;AACd,YAAM29C,IAAWxlC,GAAkBiuB,EAAQ,QAAQqX,EAAQ,OAAO,GAC5DG,IAAaxX,EAAQ,UAAUsX,EAAU;AAC/C,MAAItX,EAAQ,QAAQ,SAClBmX,EAAQI,CAAQ,GAChBF,EAAQ,UAAUE,IAEhBvX,EAAQ,UAAU,SACpBoX,EAAUI,CAAU,GACpBF,EAAU,UAAUE,IAEtBnc;AAAA,QACE;AAAA,UACE,GAAGvkB;AAAA,UACH,GAAGkpB;AAAA,UACH,MAAMuX;AAAA,UACN,QAAQC;AAAA,QAAA;AAAA,QAEV7H;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,CAAC/1C,GAASkd,GAAOukB,CAAQ;AAAA,EAAA,GAGrBiD,IAAO,CAACznC,GAAckQ,MAAkB;AAC5C,QAAIlQ,MAAQ,QAAQ;AAClB,MAAAmmC,EAAO;AAAA,QACL,MAAMjrB,GAAkB6rB,GAAgByZ,EAAQ,SAAStwC,CAAK,CAAC;AAAA,MAAA,CAChE;AACD;AAAA,IACF;AACA,IAAAi2B,EAAO,EAAE,QAAQY,GAAgB0Z,EAAU,SAASvwC,CAAK,GAAG;AAAA,EAC9D,GAEMy3B,IAAW,CAAC3nC,MAAiB;AACjC,UAAMiX,IAAKuwB,EAAU,QAAQxnC,CAAG;AAChC,IAAIiX,MACF,OAAO,cAAcA,CAAE,GACvBuwB,EAAU,QAAQxnC,CAAG,IAAI;AAAA,EAE7B,GAEM0nC,IAAY,CAAC1nC,GAAckQ,MAAkB;AACjD,IAAAy3B,EAAS3nC,CAAG,GACZwnC,EAAU,QAAQxnC,CAAG,IAAI,OAAO,YAAY,MAAMynC,EAAKznC,GAAKkQ,CAAK,GAAG,GAAG;AAAA,EACzE,GAEMyK,IAAQsF,EAAM,SAAS;AAE7B,SACE,gBAAAhf,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAN;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOxqB;AAAA,QACP,UAAU,CAAChX;AAAA,QACX,UAAU,CAACL,MAASyjC,EAAO,EAAE,MAAM,KAAK,IAAIia,IAAe19C,CAAI,GAAG;AAAA,QAClE,QAAQ,CAACwN,MAAUu3B,EAAK,QAAQv3B,CAAK;AAAA,QACrC,aAAa,CAACA,MAAUw3B,EAAU,QAAQx3B,CAAK;AAAA,QAC/C,WAAW,MAAMy3B,EAAS,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,gBAAAhnC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOnrB;AAAA,QACP,UAAUwsB;AAAA,QACV,UAAU,CAACpkC;AAAA,QACX,UAAU,CAACohC,MAAQgC,EAAO,EAAE,OAAOhC,KAAO,QAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEvD,gBAAAxjC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO7iB;AAAA,QACP,UAAU,CAAC3e;AAAA,QACX,OACE,gBAAApC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU,CAACoC;AAAA,YACX,SAAS,MAAMojC,EAAO,EAAE,QAAQU,GAAgB4Z,EAAU,OAAO,GAAG;AAAA,YAEpE,4BAAC7Z,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,UAAU,CAAClkC,MAASyjC,EAAO,EAAE,QAAQzjC,GAAM;AAAA,QAC3C,QAAQ,CAACwN,MAAUu3B,EAAK,UAAUv3B,CAAK;AAAA,QACvC,aAAa,CAACA,MAAUw3B,EAAU,UAAUx3B,CAAK;AAAA,QACjD,WAAW,MAAMy3B,EAAS,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EACpC,GACF;AAEJ;AC1HA,MAAMiZ,KAAgB;AAGf,SAASC,GAAc;AAAA,EAC5B,OAAA5gC;AAAA,EACA,SAAAld;AAAA,EACA,gBAAAokC;AAAA,EACA,UAAA3C;AACF,GAKG;AACD,QAAM,CAAC7qB,GAAMmnC,CAAO,IAAIt+B,EAASvC,EAAM,QAAQ,EAAE,GAC3C,CAAClG,GAAMumC,CAAO,IAAI99B,EAASvC,EAAM,QAAQhH,EAAkB,GAC3D,CAACyI,GAAQ6+B,CAAS,IAAI/9B,EAASvC,EAAM,UAAU,CAAC,GAChDugC,IAAUn0B,GAAOtS,CAAI,GACrB0mC,IAAYp0B,GAAO3K,CAAM,GACzBq/B,IAAc10B,GAAO,EAAK;AAChC,EAAAm0B,EAAQ,UAAUzmC,GAClB0mC,EAAU,UAAU/+B;AACpB,QAAM8lB,IAAYnb,GAAyC,EAAE;AAE7D,EAAA1J,GAAU,MAAM;AACd,IAAKo+B,EAAY,WAASD,EAAQ7gC,EAAM,QAAQ,EAAE,GAClDqgC,EAAQrgC,EAAM,QAAQhH,EAAkB,GACxCsnC,EAAUtgC,EAAM,UAAU,CAAC;AAAA,EAC7B,GAAG,CAACA,CAAK,CAAC,GAEV0C;AAAA,IACE,MAAM,MAAM;AACT,aAAO,OAAO6kB,EAAU,OAAO,EAAe;AAAA,QAAQ,CAACvwB,MACtD,OAAO,cAAcA,CAAE;AAAA,MAAA;AAAA,IAE3B;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMkvB,IAAS+C;AAAA,IACb,CAACC,GAA8B2P,MAA8B;AAC3D,UAAI,CAAC/1C,EAAS;AACd,YAAM29C,IAAW,KAAK,IAAIE,IAAezX,EAAQ,QAAQqX,EAAQ,OAAO,GAClEG,IAAaxX,EAAQ,UAAUsX,EAAU;AAC/C,MAAItX,EAAQ,QAAQ,SAClBmX,EAAQI,CAAQ,GAChBF,EAAQ,UAAUE,IAEhBvX,EAAQ,UAAU,SACpBoX,EAAUI,CAAU,GACpBF,EAAU,UAAUE;AAEtB,YAAMK,IACJ7X,EAAQ,SAAS,SACbxvB,IACAwvB,EAAQ,SAAS,KACdlpB,EAAM,QAAQjH,KACfmwB,EAAQ;AAChB,MAAA3E;AAAA,QACE;AAAA,UACE,GAAGvkB;AAAA,UACH,GAAGkpB;AAAA,UACH,MAAM6X;AAAA,UACN,MAAMN;AAAA,UACN,QAAQC;AAAA,QAAA;AAAA,QAEV7H;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,CAAC/1C,GAASkd,GAAOukB,GAAU7qB,CAAI;AAAA,EAAA,GAG3B8tB,IAAO,CAACznC,GAAckQ,MAAkB;AAC5C,QAAIlQ,MAAQ,QAAQ;AAClB,MAAAmmC,EAAO;AAAA,QACL,MAAM,KAAK,IAAIya,IAAe7Z,GAAgByZ,EAAQ,SAAStwC,CAAK,CAAC;AAAA,MAAA,CACtE;AACD;AAAA,IACF;AACA,IAAAi2B,EAAO,EAAE,QAAQY,GAAgB0Z,EAAU,SAASvwC,CAAK,GAAG;AAAA,EAC9D,GAEMy3B,IAAW,CAAC3nC,MAAiB;AACjC,UAAMiX,IAAKuwB,EAAU,QAAQxnC,CAAG;AAChC,IAAIiX,MACF,OAAO,cAAcA,CAAE,GACvBuwB,EAAU,QAAQxnC,CAAG,IAAI;AAAA,EAE7B,GAEM0nC,IAAY,CAAC1nC,GAAckQ,MAAkB;AACjD,IAAAy3B,EAAS3nC,CAAG,GACZwnC,EAAU,QAAQxnC,CAAG,IAAI,OAAO,YAAY,MAAMynC,EAAKznC,GAAKkQ,CAAK,GAAG,GAAG;AAAA,EACzE,GAEMyK,IAAQsF,EAAM,SAAS;AAE7B,SACE,gBAAAhf,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,MAAA;AAAA,MAEvC,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAOgZ;AAAA,UACP,UAAU,CAAC5W;AAAA,UACX,aAAY;AAAA,UACZ,cAAW;AAAA,UACX,OAAO,EAAE,WAAWkd,EAAM,SAAS69B,GAAA;AAAA,UACnC,SAAS,MAAM;AACb,YAAAiD,EAAY,UAAU;AAAA,UACxB;AAAA,UACA,UAAU,CAACh6C,MAAM;AACf,kBAAMrE,IAAOqE,EAAE,OAAO;AACtB,YAAA+5C,EAAQp+C,CAAI,GACZyjC,EAAO,EAAE,MAAMzjC,EAAA,GAAQ,EAAE,MAAM,IAAM;AAAA,UACvC;AAAA,UACA,QAAQ,MAAM;AACZ,YAAAq+C,EAAY,UAAU;AACtB,kBAAMr+C,IAAOiX,EAAK,KAAA;AAClB,YAAIjX,MAASiX,KAAMmnC,EAAQp+C,CAAI,GAC/ByjC,EAAO,EAAE,MAAMzjC,KAAQsW,GAAA,CAAoB;AAAA,UAC7C;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,GACF;AAAA,IACA,gBAAArY;AAAA,MAAC+lC;AAAA,MAAA;AAAA,QACC,OAAOzmB,EAAM;AAAA,QACb,UAAU,CAACld;AAAA,QACX,UAAU,CAAC4e,MAAsBwkB,EAAO,EAAE,OAAAxkB,GAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAEnD,gBAAAhhB;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOxqB;AAAA,QACP,UAAU,CAAChX;AAAA,QACX,UAAU,CAACL,MAASyjC,EAAO,EAAE,MAAM,KAAK,IAAIya,IAAel+C,CAAI,GAAG;AAAA,QAClE,QAAQ,CAACwN,MAAUu3B,EAAK,QAAQv3B,CAAK;AAAA,QACrC,aAAa,CAACA,MAAUw3B,EAAU,QAAQx3B,CAAK;AAAA,QAC/C,WAAW,MAAMy3B,EAAS,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,gBAAAhnC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOnrB;AAAA,QACP,UAAUwsB;AAAA,QACV,UAAU,CAACpkC;AAAA,QACX,UAAU,CAACohC,MAAQgC,EAAO,EAAE,OAAOhC,KAAO,QAAW;AAAA,QACrD,SAASxpB,IAAQ,MAAMwrB,EAAO,EAAE,OAAO,OAAA,CAAW,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAExD,gBAAAxlC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO7iB;AAAA,QACP,UAAU,CAAC3e;AAAA,QACX,OACE,gBAAApC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU,CAACoC;AAAA,YACX,SAAS,MAAMojC,EAAO,EAAE,QAAQU,GAAgB4Z,EAAU,OAAO,GAAG;AAAA,YAEpE,4BAAC7Z,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,UAAU,CAAClkC,MAASyjC,EAAO,EAAE,QAAQzjC,GAAM;AAAA,QAC3C,QAAQ,CAACwN,MAAUu3B,EAAK,UAAUv3B,CAAK;AAAA,QACvC,aAAa,CAACA,MAAUw3B,EAAU,UAAUx3B,CAAK;AAAA,QACjD,WAAW,MAAMy3B,EAAS,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EACpC,GACF;AAEJ;AClIO,SAASsZ,GAAU;AAAA,EACxB,OAAAjrC;AAAA,EACA,YAAAwI;AAAA,EACA,WAAAuB;AAAA,EACA,WAAAqK,IAAY,CAAA;AAAA,EACZ,QAAAkhB,IAAS,CAAA;AAAA,EACT,gBAAA4V,IAAiB,CAAA;AAAA,EACjB,SAAAn+C;AAAA,EACA,gBAAAo+C,IAAiB;AAAA,EACjB,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAArC;AAAA,EACA,QAAA/gD,IAAS,CAAA;AAAA,EACT,UAAAqjD;AAAA,EACA,mBAAAC;AAAA,EACA,kBAAApZ;AAAA,EACA,eAAAqZ;AAAA,EACA,gBAAAC,IAAiB,CAAA;AAAA,EACjB,qBAAAC,IAAsB,CAAA;AAAA,EACtB,cAAAC;AAAA,EACA,mBAAA3a;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAA0V;AAAA,EACA,gBAAAC;AACF,GAAmB;AACjB,QAAM,CAAC98C,IAAK8hD,CAAM,IAAIt/B,GAASxM,KAAA,gBAAAA,EAAO,QAAO,EAAE,GACzC,CAAC+rC,IAAUC,CAAW,IAAIx/B,EAAwB,IAAI,GACtD,CAACy/B,IAAYC,EAAa,IAAI1/B,EAAwB,IAAI;AAQhE,MANAG,GAAU,MAAM;AACd,IAAAm/B,GAAO9rC,KAAA,gBAAAA,EAAO,QAAO,EAAE,GACvBgsC,EAAY,IAAI,GAChBE,GAAc,IAAI;AAAA,EACpB,GAAG,CAAClsC,GAAOwI,CAAU,CAAC,GAElB2iC,KAAkBQ,EAAe,SAAS,KAAKE;AACjD,WACE,gBAAAlhD,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA,gBAAAA;AAAA,MAACy9C;AAAA,MAAA;AAAA,QAEC,QAAQuD;AAAA,QACR,aAAaC;AAAA,QACb,SAAA7+C;AAAA,QACA,mBAAAmkC;AAAA,QACA,gBAAAC;AAAA,QACA,kBAAA0V;AAAA,QACA,gBAAAC;AAAA,QACA,SAAS+E;AAAA,MAAA;AAAA,MARJF,EAAe,IAAI,CAACttC,OAASA,GAAK,EAAE,EAAE,KAAK,GAAG;AAAA,IAAA,GAUvD;AAIJ,MAAI,CAAC2B;AACH,WAAI,CAACmrC,KAAkB,CAACC,IAAkB,OAExC,gBAAAzgD,EAAC,OAAA,EAAI,WAAU,8BACZ,UAAAygD,GACH;AAIJ,QAAMe,KAAe,MAAM;AACzB,QAAI,CAACniD,MAAOA,OAAQgW,EAAM,KAAK;AAC7B,MAAAgsC,EAAY,IAAI;AAChB;AAAA,IACF;AACA,QAAId,EAAe,SAASlhD,EAAG,GAAG;AAChC,MAAAgiD,EAAY,wCAAwC;AACpD;AAAA,IACF;AACA,IAAAA,EAAY,IAAI,GAChBX,EAASrhD,EAAG;AAAA,EACd,GAEMoiD,KAAmBlG,GAAsB/9C,GAAQ6X,EAAM,OAAO,GAC9DqsC,KACJ,CAAClB,KACDp+C,KACAm8C,KACAkD,GAAiB,SAAS,IACxB,gBAAAzhD;AAAA,IAACq+C;AAAA,IAAA;AAAA,MACC,cAAcoD;AAAA,MACd,eAAAlD;AAAA,IAAA;AAAA,EAAA,IAEA;AAEN,SAAIiC,IAEA,gBAAAlgD,EAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,IAAA+U,EAAM,iBACL,gBAAArV,EAAC,KAAA,EAAE,WAAU,wBAAuB,iFAEpC,IACE;AAAA,IACHiqC,GAAiB50B,EAAM,IAAI,IAC1B,gBAAArV;AAAA,MAACi8C;AAAA,MAAA;AAAA,QACC,OAAA5mC;AAAA,QACA,YAAAwI;AAAA,QACA,WAAAuB;AAAA,QACA,WAAAqK;AAAA,QACA,QAAAkhB;AAAA,QACA,SAAAvoC;AAAA,QACA,mBAAAmkC;AAAA,QACA,gBAAAC;AAAA,QACA,kBAAA0V;AAAA,QACA,gBAAAC;AAAA,QACA,UAAUzU;AAAA,QACV,SAAS,MAAMoZ,KAAA,gBAAAA;AAAA,MAAoB;AAAA,IAAA,IAEnC;AAAA,EAAA,GACN,IAKF,gBAAAxgD,EAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,IAAA8Z,GAAe/E,CAAK,IACnB0rC,IACE,gBAAA/gD;AAAA,MAAC0/C;AAAA,MAAA;AAAA,QACC,OAAOrqC,EAAM;AAAA,QACb,SAAAjT;AAAA,QACA,gBAAAokC;AAAA,QACA,UAAUua;AAAA,MAAA;AAAA,IAAA,IAEV,OACF1rC,EAAM,SAAS,UACjB0rC,IACE,gBAAA/gD;AAAA,MAACkgD;AAAA,MAAA;AAAA,QACC,OAAO7qC,EAAM;AAAA,QACb,SAAAjT;AAAA,QACA,gBAAAokC;AAAA,QACA,UAAUua;AAAA,MAAA;AAAA,IAAA,IAEV,OAEJ,gBAAAzgD,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOX;AAAA,YACP,UAAU,CAAC+C;AAAA,YACX,UAAU,CAACgE,OAAM;AACf,cAAA+6C,EAAO/6C,GAAE,OAAO,KAAK,GACrBi7C,EAAY,IAAI;AAAA,YAClB;AAAA,YACA,QAAQG;AAAA,UAAA;AAAA,QAAA;AAAA,MACV,GACF;AAAA,MACCJ,KACC,gBAAAphD,EAAC,KAAA,EAAE,WAAU,wBAAuB,OAAO,EAAE,OAAO,UAAA,GACjD,UAAAohD,GAAA,CACH,IACE;AAAA,MAEHvX,GAAmBx0B,EAAM,IAAI,IAC5B,gBAAA/U,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOl0B,EAAM;AAAA,YACb,UAAU,CAACjT;AAAA,YACX,YAAY;AAAA,YACZ,SAAS0nC,GAAmBz0B,EAAM,IAAI,EAAE,IAAI,CAACnM,QAAO;AAAA,cAClD,OAAOA;AAAA,cACP,OAAOwgC,GAAkBxgC,EAAC;AAAA,YAAA,EAC1B;AAAA,YACF,UAAU,CAACnH,OAAS4+C,EAAa5+C,EAAiB;AAAA,UAAA;AAAA,QAAA;AAAA,MACpD,EAAA,CACF,IACE;AAAA,MACHsT,EAAM,SAAS,SACd,gBAAArV,EAAC,OAAE,WAAU,wBAAuB,sIAGpC,IACE;AAAA,IAAA,GACN;AAAA,IAGD4gD,KAAiBpjD,EAAO,SAAS,IAChC,gBAAA8C,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA0B,UAAA,SAAK;AAAA,QAC/C,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,OAAOl0B,EAAM,OAAO;AAAA,YAC3B,UAAU,CAACjT;AAAA,YACX,YAAY;AAAA,YACZ,SAAS5E,EAAO,IAAI,CAACI,QAAW;AAAA,cAC9B,OAAO,OAAOA,GAAM,EAAE;AAAA,cACtB,OAAOA,GAAM;AAAA,YAAA,EACb;AAAA,YACF,UAAU,CAACmE,OAAS;AAClB,cAAKA,MACLw/C,GAAcX,EAAc,OAAO7+C,EAAI,CAAC,CAAC;AAAA,YAC3C;AAAA,UAAA;AAAA,QAAA,EACF,CACF;AAAA,MAAA,GACF;AAAA,MACCu/C,KACC,gBAAAthD,EAAC,KAAA,EAAE,WAAU,wBAAuB,OAAO,EAAE,OAAO,UAAA,GACjD,UAAAshD,GAAA,CACH,IACE;AAAA,IAAA,EAAA,CACN,IACE;AAAA,IAEHl/C,MAAYs/C,MAAcb,KACzB,gBAAAvgD,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,MAAAohD;AAAA,MACAb,IACC,gBAAA7gD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM6gD,EAAA;AAAA,UAChB,UAAA;AAAA,QAAA;AAAA,MAAA,IAGC;AAAA,IAAA,EAAA,CACN,IACE;AAAA,EAAA,GACN;AAEJ;ACjRO,SAASc,GAAe;AAAA,EAC7B,UAAAC;AAAA,EACA,MAAAtkD,IAAO;AAAA,EACP,eAAA8sB;AAAA,EACA,iBAAAV;AAAA,EACA,kBAAA+qB;AAAA,EACA,gBAAA/kB;AAAA,EACA,YAAAmyB;AAAA,EACA,eAAArN;AAAA,EACA,qBAAAsN;AAAA,EACA,eAAAC;AAAA,EACA,eAAArhC;AAAA,EACA,QAAAshC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AACF,GAmBG;AACD,SACE,gBAAAniD,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAA,EAACoiD,IAAA,EAAS,UAAU,gBAAApiD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,mBAAA,CAAgB,GAE9E,UAAA,gBAAAA;AAAA,IAACqiD;AAAA,IAAA;AAAA,MACC,UAAAT;AAAA,MACA,MAAAtkD;AAAA,MACA,eAAA8sB;AAAA,MACA,iBAAAV;AAAA,MACA,kBAAA+qB;AAAA,MACA,gBAAA/kB;AAAA,MACA,YAAAmyB;AAAA,MACA,eAAArN;AAAA,MACA,qBAAAsN;AAAA,MACA,eAAAC;AAAA,MACA,eAAArhC;AAAA,MACA,QAAAshC;AAAA,MACA,eAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,eAAAC;AAAA,IAAA;AAAA,EAAA,GAEJ,EAAA,CACF;AAEJ;AClEO,SAASG,GACd3jD,GACA2X,GACA6hC,GACU;AACV,SAAI7hC,KAAM,OAAa,CAAA,IAClB6hC,KAAA,QAAAA,EAAM,WACPx5C,EAAQ,SAAS2X,CAAE,IAAU3X,EAAQ,OAAO,CAAC+U,MAASA,MAAS4C,CAAE,IAC9D,CAAC,GAAG3X,GAAS2X,CAAE,IAFM,CAACA,CAAE;AAGjC;ACHO,SAASisC,GACdr/B,GACAlN,GAQmB;AACnB,QAAMrY,IAAUulB,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,SAAS,SAAS;AACrE,SAAO4kD,GAAgB;AAAA,IACrB,aAAYxsC,KAAA,gBAAAA,EAAQ,eAAc;AAAA,IAClC,iBAAgBA,KAAA,gBAAAA,EAAQ,mBAAkB;AAAA,IAC1C,UAAUkN,EAAM;AAAA,IAChB,OAAOA,EAAM;AAAA,IACb,OAAOA,EAAM;AAAA,IACb,YAAYA,EAAM,eAAcvlB,KAAA,gBAAAA,EAAS,iBAAgB;AAAA,IACzD,cAAaA,KAAA,gBAAAA,EAAS,kBAAiB;AAAA,IACvC,WAAWulB,EAAM;AAAA,IACjB,QAAQA,EAAM;AAAA,IACd,QAAQA,EAAM,OAAO,OAAO,CAAClf,MAAM,CAACA,EAAE,UAAU;AAAA,IAChD,aAAakf,EAAM;AAAA,IACnB,SAASA,EAAM;AAAA,IACf,OAAOA,EAAM;AAAA,IACb,aAAYlN,KAAA,gBAAAA,EAAQ,eAAckN,EAAM,cAAc,CAAA;AAAA,IACtD,WAAWA,EAAM;AAAA,IACjB,sBACElN,KAAA,gBAAAA,EAAQ,wBAAuBkN,EAAM,uBAAuB,CAAA;AAAA,IAC9D,aAAalN,KAAA,gBAAAA,EAAQ;AAAA,IACrB,WAAWA,KAAA,gBAAAA,EAAQ;AAAA;AAAA,IAEnB,eAAe,CAAC3W,MAAQ;AACtB,UAAI,CAACA,EAAK,QAAO;AACjB,YAAMkkC,IAAQrgB,EAAM,OAAO;AAAA,QACzB,CAACkd,MAAMA,EAAE,iBAAiB/gC,KAAO+gC,EAAE,iBAAiB/gC;AAAA,MAAA;AAEtD,cAAOkkC,KAAA,gBAAAA,EAAO,iBAAgBlkC;AAAA,IAChC;AAAA,EAAA,CACD;AACH;AC1CA,MAAMojD,yBAAa,IAAA,GACbC,KAAsB,IAEtBC,KAAa,CAACr+B,MAAkB,4BAA4BA,CAAK;AAEvE,SAASs+B,GAAkBt+B,GAAqB;AAC9C,MAAI;AACF,mBAAe,WAAWq+B,GAAWr+B,CAAK,CAAC;AAAA,EAC7C,QAAQ;AAAA,EAER;AACF;AAMO,SAASu+B,GACdv+B,GACAzlB,GACM;AAGN,MAFA4jD,GAAO,OAAOn+B,CAAK,GACnBm+B,GAAO,IAAIn+B,GAAOzlB,CAAQ,GACtB4jD,GAAO,OAAOC,IAAqB;AACrC,UAAMI,IAASL,GAAO,KAAA,EAAO,OAAO;AACpC,IAAIK,KAAU,QAAML,GAAO,OAAOK,CAAM;AAAA,EAC1C;AACA,EAAAF,GAAkBt+B,CAAK;AACzB;AAEO,SAASy+B,GAAkBz+B,GAA6C;AAC7E,SAAAs+B,GAAkBt+B,CAAK,GAChBm+B,GAAO,IAAIn+B,CAAK,KAAK;AAC9B;AAEO,SAAS0+B,GAAmB1+B,GAAqB;AACtDm+B,EAAAA,GAAO,OAAOn+B,CAAK,GACnBs+B,GAAkBt+B,CAAK;AACzB;AC9CA,MAAMm+B,yBAAa,IAAA,GAEbE,KAAa,CAACr+B,MAAkB,2BAA2BA,CAAK;AAEtE,SAAS2+B,KAA0B;AACjC,MAAI;AACF,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAASC,GAAuB5+B,GAAqB;;AAC1D,EAAAm+B,GAAO,IAAIn+B,CAAK,IAChBxmB,IAAAmlD,GAAA,MAAA,QAAAnlD,EAAW,QAAQ6kD,GAAWr+B,CAAK,GAAG;AACxC;AAEO,SAAS6+B,GAA0B7+B,GAAwB;;AAChE,QAAM8+B,MAAStlD,IAAAmlD,SAAA,gBAAAnlD,EAAW,QAAQ6kD,GAAWr+B,CAAK,QAAO,KACnDT,IAAU4+B,GAAO,IAAIn+B,CAAK,KAAK8+B;AACrC,SAAAC,GAAwB/+B,CAAK,GACtBT;AACT;AAEO,SAASw/B,GAAwB/+B,GAAqB;;AAC3D,EAAAm+B,GAAO,OAAOn+B,CAAK,IACnBxmB,IAAAmlD,SAAA,QAAAnlD,EAAW,WAAW6kD,GAAWr+B,CAAK;AACxC;ACnBO,MAAMg/B,KAAmB,KACnBC,KAAuB;AAE7B,SAASC,GAAiBlnB,GAAuB;AACtD,SAAK,OAAO,SAASA,CAAK,IACnB,KAAK,IAAIgnB,IAAkB,KAAK,IAAI,GAAG,KAAK,MAAMhnB,IAAQ,GAAI,IAAI,GAAI,CAAC,IAD1CinB;AAEtC;AAEA,SAASE,GAAsBC,GAAyB;AACtD,SAAOF,GAAkBE,IAAU,MAAOJ,EAAgB;AAC5D;AAEA,SAASK,GAA6BC,GAAyB;AAC7D,SAAO,KAAK,MAAOJ,GAAiBI,CAAO,IAAIN,KAAoB,GAAG;AACxE;AAEO,SAASO,GAAiB;AAAA,EAC/B,aAAAv6B;AAAA,EACA,UAAAua;AACF,GAIG;AACD,QAAM6f,IAAUC,GAA6Br6B,CAAW,GAClDw6B,IAAiB,CAACxnB,OAAiC;AAAA,IACvD,aAAamnB,GAAsB,OAAOnnB,CAAK,CAAC;AAAA,EAAA;AAElD,2BACG,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAh8B,EAAC,SAAA,EAAM,WAAU,wCAAuC,UAAA;AAAA,IAAA;AAAA,IAEtD,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO0jD;AAAA,QACP,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAeA;AAAA,QACf,cAAW;AAAA,QACX,2BAAwB;AAAA,QACxB,SAAS,CAAC7rC,MAAUgsB,EAASigB,EAAejsC,EAAM,cAAc,KAAK,CAAC;AAAA,QACtE,UAAU,CAACA,MAAUgsB,EAASigB,EAAejsC,EAAM,cAAc,KAAK,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACzE,EAAA,CACF,EAAA,CACF;AAEJ;ACyIO,SAASksC,GAAU;AAAA,EACxB,MAAAzmD,IAAO;AAAA,EACP,OAAA4lB;AAAA,EACA,WAAAk2B;AAAA,EACA,SAAAh3C,IAAU;AAAA,EACV,WAAA8rC,IAAY;AAAA,EACZ,aAAA0G,IAAc;AAAA,EACd,mBAAAC,IAAoB;AAAA,EACpB,SAAAmP;AAAA,EACA,WAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAhW;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAuG;AAAA,EACA,iBAAAuP;AAAA,EACA,WAAA56B,IAAY,CAAA;AAAA,EACZ,QAAAkhB,IAAS,CAAA;AAAA,EACT,eAAAjqB;AAAA,EACA,WAAA4jC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,qBAAA9K;AAAA,EACA,aAAa+K,KAAkBlB;AAAA,EAC/B,mBAAAmB;AACF,GAAmB;AACjB,QAAMC,KAAkB5B,GAAkB7/B,EAAM,KAAK,GAC/C,CAAC9lB,GAASwnD,EAAU,IAAI/iC,EAA6B,MACrDshC,GAA0BjgC,EAAM,KAAK,IAAU,YAC5CyhC,MAAA,gBAAAA,GAAiB,YAAW,IACpC,GACK,CAACE,IAAkBC,EAAmB,IAAIjjC;AAAA,IAC9C,OAAM8iC,MAAA,gBAAAA,GAAiB,WAAU;AAAA,EAAA,GAE7B,CAACI,IAAmBC,EAAoB,IAAInjC,EAEhD,CAAA,CAAE,GACE,CAACojC,IAAcC,EAAe,IAAIrjC,EAAS,CAAC,GAC5C,CAAC2yB,GAAe2Q,EAAgB,IAAItjC,EAAwB,MAAM;;AACtE,UAAMujC,KAAgBtnD,IAAAilD,GAAkB7/B,EAAM,KAAK,MAA7B,gBAAAplB,EAAgC;AACtD,WACEsnD,KAAiB,QACjBliC,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,OAAOwnD,CAAa,IAEhDA,IAEFpnD,GAAsBklB,EAAM,MAAM;AAAA,EAC3C,CAAC,GACK,CAACuxB,IAAkB4Q,EAAmB,IAAIxjC,EAAmB,CAAA,CAAE,GAC/D,CAACqzB,IAAwBoQ,EAAyB,IAAIzjC,EAE1D,IAAI,GACA6H,KAAkB+qB,GAAiB,CAAC,KAAK,MACzC,CAAC/kB,IAAgBC,EAAiB,IAAI9N,EAAwB,IAAI,GAClE,CAAC0jC,IAAgBC,EAAiB,IAAI3jC,EAAS,CAAC,GAChD,CAAC8H,GAAmB87B,EAAoB,IAAI5jC,EAAmB,CAAA,CAAE,GACjE,CAACriB,IAAMkmD,EAAO,IAAI7jC,EAAqB,QAAQ,GAC/C,CAACyH,IAAaq8B,EAAc,IAAI9jC;AAAA,IAAS,MAC7C2hC,GAAiBiB,EAAe;AAAA,EAAA,GAE5B,CAACmB,IAAaC,EAAc,IAAIhkC,EAAS,CAAC,GAC1C,CAACikC,IAAcC,EAAe,IAAIlkC,EAAS,EAAK,GAChD,CAACmkC,IAAQC,EAAS,IAAIpkC,EAAS,EAAK,GACpC,CAACnjB,IAASwnD,EAAU,IAAIrkC,EAASxjB,EAAkB,GACnD,CAAC8nD,IAAkBC,EAAmB,IAAIvkC,EAAS,EAAK,GACxD+J,IAAYF,GAA2B,IAAI,GAC3C26B,IAAa36B,GAAOhtB,EAAO,GAC3B4nD,KAAa56B,GAAkB,EAAE,GACjC66B,KAAa76B,GAAO,EAAE,GACtB86B,KAAoB96B,GAAO,EAAK;AACtC,EAAA26B,EAAW,UAAU3nD;AACrB,QAAM+nD,KAAiBnpD,MAAS,UAC1BopD,IAAgBrpD,GAAoBC,GAAMF,CAAO,GACjDupD,IAAYD,MAAkB,UAC9BE,IAAiBl7B,GAAO;AAAA,IAC5B,WAAAi7B;AAAA,IACA,iBAAAj9B;AAAA,IACA,mBAAAC;AAAA,EAAA,CACD;AACD,EAAAi9B,EAAe,UAAU,EAAE,WAAAD,GAAW,iBAAAj9B,IAAiB,mBAAAC,EAAA,GAEvD3H,GAAU,MAAM;AACd,IAAA2jC,GAAenC,GAAiBiB,EAAe,CAAC;AAAA,EAClD,GAAG,CAACA,EAAe,CAAC;AAEpB,QAAMoC,IAAwBte,GAAY,CAACue,MAAwB;AACjE,UAAMx9B,IAAck6B,GAAiBsD,EAAM,WAAW;AACtD,IAAAnB,GAAer8B,CAAW,GAC1Bo7B,KAAA,QAAAA,EAAoB,EAAE,aAAAp7B;EACxB,GAAG,CAACo7B,CAAiB,CAAC;AAEtB,EAAA1iC,GAAU,MAAM;AACd,IAAAskC,GAAW,UAAU,CAAA,GACrBC,GAAW,UAAU,IACrBC,GAAkB,UAAU,IAC5BX,GAAe,CAAC,GAChBE,GAAgB,EAAK,GACrBf,GAAqB,CAAA,CAAE,GACvBqB,EAAW,UAAUhoD,GAAA,GACrB6nD,GAAW7nD,IAAoB;AAAA,EACjC,GAAG,CAAC6kB,EAAM,OAAOA,EAAM,QAAQ,CAAC,GAEhClB,GAAU,MAAM;AACd,QACE5kB,MAAY,cACZA,MAAY,gBACZA,MAAY,sBACZ;AACA,MAAAylD,GAAkB3/B,EAAM,OAAO;AAAA,QAC7B,SAAA9lB;AAAA,QACA,SAASo3C;AAAA,QACT,QAAQp3C,MAAY,uBAAuBynD,KAAmB;AAAA,MAAA,CAC/D;AACD;AAAA,IACF;AACA,IAAA7B,GAAmB9/B,EAAM,KAAK;AAAA,EAChC,GAAG,CAACsxB,GAAetxB,EAAM,OAAO2hC,IAAkBznD,CAAO,CAAC,GAI1D4kB,GAAU,MAAM;AAEd,QAAI,CADWkB,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,OAAO42C,CAAa,GACzD;AACX,MAAA2Q;AAAA,QACE/nD,MAAY,eACRW,GAAyBmlB,EAAM,MAAM,IACrC/lB,GAAgBC,CAAO,IACrBY,GAAsBklB,EAAM,MAAM,IAClCjlB,GAAyBilB,EAAM,MAAM;AAAA,MAAA;AAE7C;AAAA,IACF;AACA,QAAI9lB,MAAY,WAAY;AAC5B,UAAMi7C,IAASn1B,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,OAAO42C,CAAa;AACtE,SAAI6D,KAAA,gBAAAA,EAAQ,UAAS,UAAW;AAChC,UAAMt2C,IACJ3E,MAAY,eACRW,GAAyBmlB,EAAM,MAAM,IACrCjlB,GAAyBilB,EAAM,MAAM;AAC3C,IAAInhB,KAAQ,QAAQA,MAASyyC,QAAgCzyC,CAAI;AAAA,EACnE,GAAG,CAACmhB,EAAM,QAAQsxB,GAAep3C,CAAO,CAAC;AAEzC,QAAM2pD,IAAehlC;AAAA,IACnB,MAAM4f,GAAcze,GAAOojC,GAAW,OAAO;AAAA,IAC7C,CAACpjC,GAAO0iC,EAAW;AAAA,EAAA,GAGfhoC,KAAQmE;AAAA,IACZ,MAAMilC,GAAWD,EAAa,KAAK;AAAA,IACnC,CAACA,EAAa,KAAK;AAAA,EAAA,GAGfE,KAAc,OAAO,KAAKlC,EAAiB,EAAE,SAAS,GACtDmC,KAAeZ,GAAW,QAAQ,SAAS,GAC3Ca,KAAQD,MAAgBpB,MAAgBmB,IACxCG,KAAcxrB,GAAwB;AAAA,IAC1C,cAAAsrB;AAAA,IACA,cAAApB;AAAA,IACA,aAAAmB;AAAA,IACA,SAASd;AAAA,IACT,QAAAH;AAAA,EAAA,CACD;AACD,EAAAhkC,GAAU,MAAM;AACd,IAAAwiC,KAAA,QAAAA,EAAgB,EAAE,OAAO4C,IAAa,QAAApB,GAAA;AAAA,EACxC,GAAG,CAACxB,GAAewB,IAAQoB,EAAW,CAAC;AACvC,QAAMC,KAAiB37B,GAAO07B,EAAW;AACzC,EAAAC,GAAe,UAAUD,IACzBplC,GAAU,MAAM;AACd,UAAMslC,IAAiB,CAACzvC,MAA6B;AACnD,MAAAikB,GAAyBjkB,GAAOwvC,GAAe,OAAO;AAAA,IACxD,GACMnrB,IAAUF,GAAoB,MAAM;AAC1C,eAAWh9B,KAAUk9B;AACnB,MAAAl9B,EAAO,iBAAiB,gBAAgBsoD,CAAc;AAExD,WAAO,MAAM;AACX,iBAAWtoD,KAAUk9B;AACnB,QAAAl9B,EAAO,oBAAoB,gBAAgBsoD,CAAc;AAAA,IAE7D;AAAA,EACF,GAAG,CAAA,CAAE;AACL,QAAMC,KACJ,CAACvB,MAAUmB,OAAU/kD,KAAYyyC,KAAqBoS,KAClDO,KAAmBpqD,MAAY,sBAC/Bk6C,KAAcyP,EAAa,OAAO,KAAK,CAAC3mB,MAAMA,EAAE,OAAOoU,CAAa,KAAK,MACzEiT,KAAkBrpD,GAA0BhB,GAASk6C,EAAW,GAChEoQ,KAAkBtlD,KAAW,CAACqlD,IAC9BE,KAAeZ,EAAa,OAAO,KAAK,CAAC3mB,MAAMA,EAAE,SAAS,SAAS,KAAK,MACxEwnB,KACJD,OAAgBrQ,MAAA,gBAAAA,GAAa,UAAS,UAClCyP,EAAa,OAAO,OAAO,CAAC/iD,MAAMA,EAAE,YAAY2jD,GAAa,EAAE,IAC/D,CAAA,GACAE,KAAcd,EAAa,OAAO,OAAO,CAAC/iD,MAAMA,EAAE,YAAYwwC,CAAa,GAC3EvqB,KAAwBlI,GAAQ,MAAM;AAC1C,UAAM+lC,IAAmBf,EAAa,OAAO,IAAI,CAACgB,OAAS;AAAA,MACzD,GAAGA;AAAA,MACH,QAAQhB,EAAa,OAAO,OAAO,CAAC1xC,MAAUA,EAAM,YAAY0yC,EAAI,EAAE;AAAA,IAAA,EACtE,GACIC,IAAQC,GAAuBH,GAAkBtT,CAAa;AACpE,WAAKwT,IACEjB,EAAa,OAAO;AAAA,MACzB,CAAC1xC,MAAUA,EAAM,YAAY2yC,EAAM,MAAM,CAAC3yC,EAAM;AAAA,IAAA,IAF/B,CAAA;AAAA,EAIrB,GAAG,CAAC0xC,EAAa,QAAQA,EAAa,QAAQvS,CAAa,CAAC,GACtD0T,KAA4BnmC;AAAA,IAChC,MACEomC;AAAA,MACEpB,EAAa,uBAAuB,CAAA;AAAA,MACpC,OAAO,OAAOhC,EAAiB;AAAA,IAAA;AAAA,IAEnC,CAACA,IAAmBgC,EAAa,mBAAmB;AAAA,EAAA,GAEhDqB,KAAkBrmC;AAAA,IACtB,MACEwgC,GAAqBwE,GAAc;AAAA,MACjC,YAAY1C,KAAA,gBAAAA,EAAiB;AAAA,MAC7B,gBAAgBA,KAAA,gBAAAA,EAAiB;AAAA,MACjC,YAAY0C,EAAa;AAAA,MACzB,aAAa1C,KAAA,gBAAAA,EAAiB;AAAA,MAC9B,WAAA56B;AAAA,MACA,qBAAqBy+B;AAAA,IAAA,CACtB;AAAA,IACH,CAACnB,GAAc1C,GAAiB56B,GAAWy+B,EAAyB;AAAA,EAAA,GAEhEG,KAAetmC;AAAA,IACnB,MAAMglC,EAAa,QAAQ,OAAO,CAACvjD,MAAMA,EAAE,YAAYgxC,CAAa;AAAA,IACpE,CAACA,GAAeuS,EAAa,OAAO;AAAA,EAAA,GAEhCuB,KAAavmC,GAAQ,MAAM;AAC/B,UAAMwmC,IAAc,IAAI;AAAA,MACtBxB,EAAa,QAAQ,IAAI,CAACjiC,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC;AAAA,IAAA;AAE1D,WAAOiiC,EAAa,MAAM;AAAA,MACxB,CAACriD,MAAA;;AAAS,iBAAA5G,IAAAyqD,EAAY,IAAI7jD,EAAK,YAAY,MAAjC,gBAAA5G,EAAoC,aAAY02C;AAAA;AAAA,IAAA;AAAA,EAE9D,GAAG,CAACA,GAAeuS,EAAa,SAASA,EAAa,KAAK,CAAC,GACtDr0B,IACJq0B,EAAa,OAAO,KAAK,CAAC/iD,MAAMA,EAAE,OAAO0lB,EAAe,KAAK,MACzD8+B,KACJzB,EAAa,YAAY,KAAK,CAACvjD,MAAMA,EAAE,YAAYkmB,EAAe,KAAK,MAEnE++B,KAAe,MACnBnqD,GAAqB;AAAA,IACnB,KAAKgoD,GAAW;AAAA,IAChB,YAAYC,GAAW;AAAA,IACvB,iBAAiBK,EAAe,QAAQ;AAAA,IACxC,mBAAmBA,EAAe,QAAQ;AAAA,EAAA,CAC3C,GAEG8B,KAAgB,CAACnqD,MAAoC;AACzD,IAAA+nD,GAAW,UAAU/nD,EAAS,KAC9BgoD,GAAW,UAAUhoD,EAAS,YAC9B8mD;AAAA,MACE9mD,EAAS,mBAAmB,OAAO,CAAA,IAAK,CAACA,EAAS,eAAe;AAAA,IAAA,GAEnEknD,GAAqBlnD,EAAS,iBAAiB,GAC/CsnD,GAAe,CAACjhD,MAAMA,IAAI,CAAC;AAAA,EAC7B,GAEM+jD,KAAoB,CAACC,MAAsC;AAC/D,QAAI,CAAChC,EAAe,QAAQ,aAAagC,MAAS,OAAQ;AAC1D,QAAIA,MAAS,WAAW;AACtB,UAAIpC,GAAkB,QAAS;AAC/B,MAAAA,GAAkB,UAAU;AAAA,IAC9B;AACA,UAAMzkD,IAAOtD,GAAkB4nD,EAAW,SAASoC,IAAc;AACjE,IAAApC,EAAW,UAAUtkD,GACrBmkD,GAAWnkD,CAAI;AAAA,EACjB,GAEM8mD,KAAUtgB;AAAA,IACd,CAAC/pC,GAAasqD,IAA2C,WAA0B;AACjF,MAAAH,GAAkBG,CAAW;AAC7B,UAAI/mD,IAAOvD;AACX,UAAIuD,EAAK,OAAO,kBAAkBA,EAAK,MAAM,MAAM,MAAM;AACvD,cAAMuU,IAAKiwC,GAAW;AACtB,QAAAxkD,IAAO,EAAE,GAAGA,GAAM,OAAO,EAAE,GAAGA,EAAK,OAAO,IAAAuU,IAAG;AAAA,MAC/C;AACA,UAAIvU,EAAK,OAAO,mBAAmBA,EAAK,OAAO,MAAM,MAAM;AACzD,cAAMuU,IAAKiwC,GAAW;AACtB,QAAAxkD,IAAO,EAAE,GAAGA,GAAM,QAAQ,EAAE,GAAGA,EAAK,QAAQ,IAAAuU,IAAG;AAAA,MACjD;AACA,UAAIvU,EAAK,OAAO,iBAAiBA,EAAK,KAAK,MAAM,MAAM;AACrD,cAAMuU,IAAKiwC,GAAW;AACtB,QAAAxkD,IAAO,EAAE,GAAGA,GAAM,MAAM,EAAE,GAAGA,EAAK,MAAM,IAAAuU,IAAG;AAAA,MAC7C;AACA,UAAIvU,EAAK,OAAO,sBAAsBA,EAAK,UAAU,MAAM,MAAM;AAC/D,cAAMuU,IAAKiwC,GAAW;AACtB,QAAAxkD,IAAO,EAAE,GAAGA,GAAM,WAAW,EAAE,GAAGA,EAAK,WAAW,IAAAuU,IAAG;AAAA,MACvD;AAGA,aAFAgwC,GAAW,UAAUpkB,GAAgBokB,GAAW,SAASvkD,CAAI,GAC7D8jD,GAAe,CAACjhD,MAAMA,IAAI,CAAC,GACvB7C,EAAK,OAAO,iBAAuBA,EAAK,MAAM,MAAM,OACpDA,EAAK,OAAO,kBAAwBA,EAAK,OAAO,MAAM,OACtDA,EAAK,OAAO,gBAAsBA,EAAK,KAAK,MAAM,OAClDA,EAAK,OAAO,qBAA2BA,EAAK,UAAU,MAAM,OACzD;AAAA,IACT;AAAA,IACA,CAAA;AAAA,EAAC,GAGGgnD,KAAoBxgB,GAAY,MAAM;AAC1C,IAAAie,GAAkB,UAAU;AAAA,EAC9B,GAAG,CAAA,CAAE,GAECwC,KAAOzgB,GAAY,MAAM;;AAG7B,QAFI,CAACqe,EAAe,QAAQ,aAAa,CAACxkD,KAAW4jD,QACnCloD,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB,wBACnB,aAAc;AAChC,UAAMiE,IAAOnD,GAAkBynD,EAAW,SAASoC,IAAc;AACjE,IAAK1mD,MACLykD,GAAkB,UAAU,IAC5BkC,GAAc3mD,EAAK,QAAQ,GAC3BskD,EAAW,UAAUtkD,EAAK,SAC1BmkD,GAAWnkD,EAAK,OAAO;AAAA,EACzB,GAAG,CAACK,GAAS4jD,EAAM,CAAC,GAEdiD,KAAO1gB,GAAY,MAAM;AAC7B,QAAI,CAACqe,EAAe,QAAQ,aAAa,CAACxkD,KAAW4jD,GAAQ;AAC7D,UAAMjkD,IAAOjD,GAAkBunD,EAAW,SAASoC,IAAc;AACjE,IAAK1mD,MACLykD,GAAkB,UAAU,IAC5BkC,GAAc3mD,EAAK,QAAQ,GAC3BskD,EAAW,UAAUtkD,EAAK,SAC1BmkD,GAAWnkD,EAAK,OAAO;AAAA,EACzB,GAAG,CAACK,GAAS4jD,EAAM,CAAC,GAEdkD,KAAoB3gB,GAAY,YAAY;AAChD,QAAIyd,GAAQ;AACZ,UAAMpgC,IAAMxjB,IAAU8gC,GAAwBojB,GAAW,OAAO,IAAI,CAAA,GAC9D6C,IAActU,IAAoB,OAAO,OAAOkQ,EAAiB,IAAI,CAAA;AAE3E,QADI,CAACn/B,EAAI,UAAU,CAACkgC,MAAgB,CAACqD,EAAY,UAC7C,CAAC/mD,KAAW,CAAC+mD,EAAY,OAAQ;AACrC,IAAA7C,GAAW,UAAU,CAAA,GACrBT,GAAe,CAACjhD,MAAMA,IAAI,CAAC,GAC3BqhD,GAAU,EAAI;AACd,QAAImD,IAAY,CAACxjC,EAAI;AACrB,UAAMyjC,IAAcF;AACpB,QAAI;AACF,MAAIA,EAAY,UAAUjF,MACxB,MAAMA,EAAiBiF,CAAW,GAClCnE,GAAqB,CAAA,CAAE,IAErBp/B,EAAI,UAAUo+B,MAChB,MAAMA,EAAQp+B,CAAG,GACjBwjC,IAAY,KAEd,OAAMnF,KAAA,gBAAAA,MACN8B,GAAgB,EAAK,GACrBS,GAAkB,UAAU,IAC5BH,EAAW,UAAUhoD,GAAA,GACrB6nD,GAAW7nD,IAAoB;AAAA,IACjC,QAAQ;AACN,MAAIgrD,EAAY,UACdrE;AAAA,QAAqB,CAACj5C,MACpB,OAAO,KAAKA,CAAI,EAAE,SAASA,IAAO,OAAO;AAAA,UACvCs9C,EAAY,IAAI,CAAC31C,OAAS;AAAA,YACxB41C,GAAkB51C,GAAK,SAASA,GAAK,MAAM;AAAA,YAC3CA;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,MACH,GAGC01C,IAIHrD,GAAgB,EAAI,KAHpBO,GAAW,UAAU1gC,GACrBigC,GAAe,CAACjhD,MAAMA,IAAI,CAAC;AAAA,IAI/B,UAAA;AACE,MAAAqhD,GAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAAG;AAAA,IACD7jD;AAAA,IACAyyC;AAAA,IACAiR;AAAA,IACA9B;AAAA,IACAC;AAAA,IACAC;AAAA,IACAa;AAAA,IACAiB;AAAA,EAAA,CACD,GAEKuD,KAAuBhhB,GAAY,YAAY;;AACnD,QAAI,EAAAyd,MAAU,CAACmB,OACX,GAAC/kD,KAAW,CAAC6kD,OAEd,OAAO;AAAA,MACN;AAAA,IAAA,GAKJ;AAAA,OAAAnpD,IAAA8tB,EAAU,YAAV,QAAA9tB,EAAmB,oBACnBwoD,GAAW,UAAU,CAAA,GACrBC,GAAW,UAAU,IACrBC,GAAkB,UAAU,IAC5BH,EAAW,UAAUhoD,GAAA,GACrB6nD,GAAW7nD,IAAoB,GAC/B0nD,GAAgB,EAAK,GACrBf,GAAqB,CAAA,CAAE,GACvBE,GAAgB,CAACtgD,MAAMA,IAAI,CAAC,GAC5BihD,GAAe,CAACjhD,MAAMA,IAAI,CAAC,GAC3BqhD,GAAU,EAAI;AACd,UAAI;AACF,eAAM9B,KAAA,gBAAAA;AAAA,MACR,UAAA;AACE,QAAA8B,GAAU,EAAK;AAAA,MACjB;AAAA;AAAA,EACF,GAAG,CAACgB,IAAa7kD,GAAS+kD,IAAOhD,GAAW6B,EAAM,CAAC,GAE7CwD,KAAsBjhB;AAAA,IAC1B,CAACxmC,MAA6B;AAG5B,MAAAsjD,GAAoB,CAAA,CAAE,GACtBC,GAA0B,IAAI,GAC9BG,GAAqB,CAAA,CAAE,GACvB91B,GAAkB,IAAI,GAClBxyB,GAAgBC,CAAO,KAAK,CAACD,GAAgB4E,CAAI,KACnD2jD,GAAQ,QAAQ,GAChBc,GAAkB,UAAU,IAC5BH,EAAW,UAAUhoD,GAAA,GACrB6nD,GAAW7nD,IAAoB,GAC/B8mD,GAAiBlnD,GAAyBilB,EAAM,MAAM,CAAC,KAC9CnhB,MAAS,cAClB2jD,GAAQ,QAAQ,GAChBP,GAAiBnnD,GAAsBklB,EAAM,MAAM,CAAC,KAC3CnhB,MAAS,gBAClB2jD,GAAQ,QAAQ,GAChBP,GAAiBpnD,GAAyBmlB,EAAM,MAAM,CAAC,KAC9CnhB,MAAS,wBAClBojD,GAAiBlnD,GAAyBilB,EAAM,MAAM,CAAC,GAEzD0hC,GAAW7iD,CAAI;AAAA,IACjB;AAAA,IACA,CAACmhB,EAAM,QAAQ9lB,CAAO;AAAA,EAAA,GAGlBqsD,KAA0B,CAACnjC,MAAoB;AACnD,QAAIA,MAAYkuB,EAAe;AAC/B,IAAA6Q,GAAoB,CAAA,CAAE,GACtBI,GAAqB,CAAA,CAAE,GACvBN,GAAiB7+B,CAAO;AACxB,UAAMojC,IAAY3C,EAAa,OAAO,KAAK,CAACnpD,MAAUA,EAAM,OAAO0oB,CAAO;AAC1E,IAAIloB,GAA0BhB,GAASssD,CAAS,QAAW,QAAQ;AAAA,EACrE;AAEA,EAAA1nC,GAAU,MAAM;AACd,QAAI,CAAC2kC,KAAa,CAACvkD,EAAS;AAC5B,UAAM6yB,IAAQ,CAAC7uB,MAAqB;AAClC,UAAI,CAAArH,GAAuBqH,EAAE,MAAM,GACnC;AAAA,YAAIjH,GAAmBiH,CAAC,GAAG;AACzB,UAAAA,EAAE,eAAA,GACF4iD,GAAA;AACA;AAAA,QACF;AACA,QAAI5pD,GAAmBgH,CAAC,MACtBA,EAAE,eAAA,GACF6iD,GAAA;AAAA;AAAA,IAEJ;AACA,kBAAO,iBAAiB,WAAWh0B,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,EAC1D,GAAG,CAAC7yB,GAASukD,GAAWsC,IAAMD,EAAI,CAAC;AAEnC,QAAMW,KAAoBphB;AAAA,IACxB,CAACjyB,GAAmB6hC,MAA2B;AAC7C,YAAM9iC,IAAQiB,KAAM,OAAO,OAAOywC,EAAa,OAAO,KAAK,CAAC/iD,MAAMA,EAAE,OAAOsS,CAAE,GACvEszC,IACJ,GAAQzR,KAAA,QAAAA,EAAM,aACd/6C,MAAY,cACZA,MAAY,iBACXiY,KAAS,QAAQ40B,GAAiB50B,EAAM,IAAI;AAI/C,UAHAgwC,GAAoB,CAACt5C,MAASu2C,GAAqBv2C,GAAMuK,GAAI,EAAE,UAAAszC,EAAA,CAAU,CAAC,GACtEtzC,KAAM,QAAMgvC,GAA0B,IAAI,GAC9C31B,GAAkB,IAAI,GAClBrZ,KAAM,MACV;AAAA,YAAIjB,KAAS,CAACu0C,GAAU;AACtB,gBAAMC,IACJzsD,MAAY,cAAcA,MAAY,eAClCiY,EAAM,UACNy0C;AAAA,YACA/C,EAAa;AAAA,YACbvS;AAAA,YACAn/B,EAAM;AAAA,UAAA;AAEZ,UAAA8vC,GAAiB0E,CAAW;AAAA,QAC9B;AACA,QAAID,KACJhF,GAAW,CAACjmD,MAAY;AACtB,cACEA,MAAY,cACZA,MAAY,gBACZA,MAAY;AAEZ,mBAAOA;AAET,eAAI0W,KAAA,gBAAAA,EAAO,UAAS,SAAU,QAAO;AACrC,cACE1W,MAAY,gBACZA,MAAY,gBACZA,MAAY;AAEZ,mBAAOA;AAET,gBAAMorD,KAAgB10C,IAClB8nB,GAAsB9nB,GAAO0xC,EAAa,SAASA,EAAa,UAAU,IAC1E;AACJ,iBAAIgD,OAAkB,cAAoB,eACtCA,OAAkB,aAAmB,eACrC10C,KAAA,gBAAAA,EAAO,UAAS,WAAUA,KAAA,gBAAAA,EAAO,UAAS,iBAAuB,YACjEA,KAAA,gBAAAA,EAAO,UAAS,YAAkB,eAClCA,KAAA,gBAAAA,EAAO,UAAS,iBAAuB,WACpC;AAAA,QACT,CAAC;AAAA;AAAA,IACH;AAAA,IACA;AAAA,MACEm/B;AAAA,MACAp3C;AAAA,MACA2pD,EAAa;AAAA,MACbA,EAAa;AAAA,MACbA,EAAa;AAAA,MACbA,EAAa;AAAA,IAAA;AAAA,EACf,GAGIiD,KAAmB,CAACjoD,MAAqB;AAC7C,UAAMkoD,IACJ7sD,MAAY,gBAAgB,CAACqC,GAAuBsC,CAAI,IACpD,WACAA,GACAmoD,IAAWpoD,GAAetC,IAAMyqD,CAAS;AAC/C,IAAAvE,GAAQwE,CAAQ,GACXpnC,GAAgBonC,GAAU9sD,MAAY,YAAY,KAAGqoD,GAAqB,EAAE;AAAA,EACnF,GAEM0E,KAAoB,CAAC9qD,MAAgB;AACzC,IAAIjC,MAAY,gBAAgB,CAACs1B,KAAiB,CAACtwB,KAEjD4+B;AAAA,MACE+lB,EAAa;AAAA,MACbr0B,EAAc;AAAA,MACdA,EAAc;AAAA,MACdrzB;AAAA,IAAA,KAKJwpD,GAAQ;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAIn2B,EAAc;AAAA,QAClB,SAASA,EAAc;AAAA,QACvB,KAAArzB;AAAA,QACA,MAAMqzB,EAAc;AAAA,MAAA;AAAA,IACtB,CACD;AAAA,EACH,GAEM03B,KAAoB,CAAC9jC,MAAmC;AAE5D,QADI,CAACoM,KAAiB,CAACtwB,KACnBkkB,MAAYoM,EAAc,QAAS,QAAO;AAC9C,QACEsO;AAAA,MACE+lB,EAAa;AAAA,MACbr0B,EAAc;AAAA,MACdpM;AAAA,MACAoM,EAAc;AAAA,IAAA;AAGhB,aAAO;AAET,UAAM9M,IAAiB;AAAA,MACrB;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAI8M,EAAc;AAAA,UAClB,SAAApM;AAAA,UACA,KAAKoM,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,QAAA;AAAA,MACtB;AAAA,IACF;AAEF,eAAW5N,KAAUiiC,EAAa;AAChC,MAAIjiC,EAAO,YAAY4N,EAAc,MAAM5N,EAAO,YAAYwB,KAG9DV,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,IAAId,EAAO;AAAA,UACX,SAAAwB;AAAA,UACA,SAASxB,EAAO;AAAA,UAChB,MAAMA,EAAO;AAAA,UACb,GAAGA,EAAO;AAAA,UACV,GAAGA,EAAO;AAAA,UACV,aAAaA,EAAO;AAAA,QAAA;AAAA,MACtB,CACD;AAEH,WAAAulC,GAAazkC,CAAG,GAChBu/B,GAAiB7+B,CAAO,GACjB;AAAA,EACT,GAEMgkC,KAAoB,CAAChkC,MAAmC;AAC5D,QAAI,CAACoM,KAAiB,CAACtwB,EAAS,QAAO;AACvC,UAAMmoD,IAASzO,GAAoB;AAAA,MACjC,OAAOppB;AAAA,MACP,YAAY81B;AAAA,MACZ,eAAeliC;AAAA,MACf,QAAQygC,EAAa;AAAA,MACrB,SAAS,MAAMR,GAAW;AAAA,IAAA,CAC3B;AACD,WAAKgE,KACLF,GAAaE,EAAO,GAAG,GACvBlF,GAAoB,CAACkF,EAAO,OAAO,CAAC,GACpCpF,GAAiB7+B,CAAO,GACjB,QAJa;AAAA,EAKtB,GAEMkkC,KAAoB,MAAM;AAC9B,IAAIptD,MAAY,gBAAgB,CAACs1B,KAAiB,CAACtwB,MACnDymD,GAAQ,EAAE,IAAI,gBAAgB,SAASn2B,EAAc,IAAI,GACzD2yB,GAAoB,CAAA,CAAE;AAAA,EACxB,GAEMoF,KAA4B,CAChCztB,GACAzxB,GACA4sC,MACG;AACH,QAAI/6C,MAAY,gBAAgB,CAACsqD,GAAiB;AAClD,UAAMryC,IAAQ0xC,EAAa,OAAO,KAAK,CAAC/iD,MAAMA,EAAE,OAAOg5B,CAAO;AAC9D,IAAK3nB,KACLwzC;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIxzC,EAAM;AAAA,UACV,SAASA,EAAM;AAAA,UACf,KAAKA,EAAM;AAAA,UACX,MAAMA,EAAM;AAAA,UACZ,UAAA9J;AAAA,UACA,MAAM2O,GAAa3O,CAAQ;AAAA,UAC3B,gBAAgB;AAAA,QAAA;AAAA,MAClB;AAAA,MAEF4sC,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,IAAA;AAAA,EAE7B,GAEMuS,KAAoB,CAACprC,GAAmB64B,MAA8B;AAC1E,QAAI,CAACzlB,KAAiB,CAACtwB,EAAS;AAChC,QAAIgY,GAAesY,CAAa,GAAG;AACjC,YAAMi4B,KACJ5oB,GAA0B;AAAA,QACxB,GAAGrP;AAAA,QACH,OAAApT;AAAA,MAAA,CACD,KAAKA,GACFlG,KAAOuxC,GAAU,QAAQj4B,EAAc,MAAM,QAAQgE;AAM3D,UAJEtd,QAAUsZ,EAAc,MAAM,QAAQgE,QACrCi0B,GAAU,UAAU,QAAQj4B,EAAc,MAAM,UAAU,OAC1Di4B,GAAU,SAAS,SAASj4B,EAAc,MAAM,SAAS,QACzDi4B,GAAU,YAAY,SAASj4B,EAAc,MAAM,YAAY,KACnD;AACb,QAAKylB,KAAA,QAAAA,EAAM,QAAM4Q,GAAA;AACjB;AAAA,MACF;AACA,YAAMx9C,KAAWoP,GAAwB+X,EAAc,UAAUtZ,EAAI;AACrE,MAAAyvC;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,YACL,IAAIn2B,EAAc;AAAA,YAClB,SAASA,EAAc;AAAA,YACvB,KAAKA,EAAc;AAAA,YACnB,MAAMA,EAAc;AAAA,YACpB,QAAQA,EAAc;AAAA,YACtB,aAAaA,EAAc;AAAA,YAC3B,OAAOi4B;AAAA,YACP,UAAAp/C;AAAAA,YACA,MAAM2O,GAAa3O,EAAQ;AAAA,UAAA;AAAA,QAC7B;AAAA,QAEF4sC,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,MAAA,GAEtBA,KAAA,QAAAA,EAAM,QAAM4Q,GAAA;AACjB;AAAA,IACF;AACA,UAAM3vC,IAAOkG,EAAM,QAAQoT,EAAc,MAAM,QAAQpa;AAQvD,SANGgH,EAAM,QAAQ,SAASoT,EAAc,MAAM,QAAQ,OACpDtZ,OAAUsZ,EAAc,MAAM,QAAQpa,QACrCgH,EAAM,UAAU,QAAQoT,EAAc,MAAM,UAAU,OACtDpT,EAAM,SAAS,SAASoT,EAAc,MAAM,SAAS,QACrDpT,EAAM,SAAS69B,SACfzqB,EAAc,MAAM,SAASyqB,KACjB;AACb,MAAKhF,KAAA,QAAAA,EAAM,QAAM4Q,GAAA;AACjB;AAAA,IACF;AACA,UAAMx9C,IAAW0O;AAAA,MACfyY,EAAc;AAAA,MACdpT,EAAM,QAAQoT,EAAc,MAAM,QAAQ;AAAA,MAC1CtZ;AAAA,IAAA;AAEF,IAAAyvC;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIn2B,EAAc;AAAA,UAClB,SAASA,EAAc;AAAA,UACvB,KAAKA,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,UACpB,OAAApT;AAAA,UACA,UAAA/T;AAAA,UACA,MAAM2O,GAAa3O,CAAQ;AAAA,QAAA;AAAA,MAC7B;AAAA,MAEF4sC,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,IAAA,GAEtBA,KAAA,QAAAA,EAAM,QAAM4Q,GAAA;AAAA,EACnB,GAEM6B,KAAmB,CAACj5C,MAAoB;AAC5C,IAAI,CAAC+gB,KAAiB,CAACtwB,MACvBymD,GAAQ;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAIn2B,EAAc;AAAA,QAClB,SAASA,EAAc;AAAA,QACvB,KAAKA,EAAc;AAAA,QACnB,MAAA/gB;AAAA,MAAA;AAAA,IACF,CACD,GACGA,MAAS,WACXk3C,GAAQ;AAAA,MACN,IAAI;AAAA,MACJ,YAAYvhB,GAAqB5U,EAAc,IAAI,QAAQ;AAAA,IAAA,CAC5D,IACQA,EAAc,SAAS,YAChCm2B,GAAQ,EAAE,IAAI,qBAAqB,SAASn2B,EAAc,IAAI;AAAA,EAElE,GAEMm4B,KAAuB,CAAChtC,MAAkC;AAC9D,QAAI,CAAC6U,KAAiB,CAACtwB,EAAS;AAChC,UAAM8c,IAAWuK,EAAU,KAAK,CAAC/V,MAASA,EAAK,OAAOmK,EAAW,UAAU,GACrEitC,IAAUC,GAAsBr4B,GAAe7U,GAAYqB,CAAQ;AACzE,IAAA2pC,GAAQ,EAAE,IAAI,qBAAqB,YAAAhrC,EAAA,CAAY,GAC/CgrC;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIn2B,EAAc;AAAA,UAClB,SAASA,EAAc;AAAA,UACvB,KAAKA,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,UACpB,OAAOo4B,EAAQ;AAAA,UACf,OAAOA,EAAQ;AAAA,QAAA;AAAA,MACjB;AAAA,MAEF;AAAA,IAAA;AAAA,EAEJ,GAEME,KAAwB,MAAM;AAClC,IAAI,CAACt4B,KAAiB,CAACtwB,MACvBymD,GAAQ,EAAE,IAAI,qBAAqB,SAASn2B,EAAc,IAAI,GAC9Dm2B;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIn2B,EAAc;AAAA,UAClB,SAASA,EAAc;AAAA,UACvB,KAAKA,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,UACpB,OAAO,EAAE,GAAGA,EAAc,OAAO,MAAM,OAAA;AAAA,UACvC,OAAO;AAAA,YACL,GAAGA,EAAc;AAAA,YACjB,MAAM;AAAA,YACN,UAAU;AAAA,YACV,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,UAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEF;AAAA,IAAA;AAAA,EAEJ,GAEMu4B,KAAyB,CAAC3f,GAAiBtO,MAA2B;;AAC1E,QAAI,CAAC56B,EAAS;AACd,UAAMqpC,IAAQd,EAAO,KAAK,CAACj3B,OAASA,GAAK,OAAO43B,CAAO,GACjD4f,IAAkB7f;AAAA,MACtBC;AAAA,MACAyb,EAAa;AAAA,IAAA,GAETnhC,IAAiB,CAAA,GACjBulC,KAAa,CAAC70C,OAAe;AACjC,YAAMjB,KAAQ0xC,EAAa,OAAO,KAAK,CAACzmC,OAAQA,GAAI,OAAOhK,EAAE;AAC7D,MAAKjB,OACLuQ,EAAI,KAAK,EAAE,IAAI,qBAAqB,SAAStP,IAAI,GACjDsP,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIvQ,GAAM;AAAA,UACV,SAASA,GAAM;AAAA,UACf,KAAKA,GAAM;AAAA,UACX,MAAMA,GAAM;AAAA,UACZ,OAAO,EAAE,GAAGA,GAAM,OAAO,MAAM,OAAA;AAAA,UAC/B,OAAO;AAAA,YACL,GAAGA,GAAM;AAAA,YACT,MAAM;AAAA,YACN,UAAU;AAAA,YACV,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,UAAA;AAAA,QACT;AAAA,MACF,CACD;AAAA,IACH;AAIA,QAHI61C,KAAmB,QAAQA,MAAoBluB,KACjDmuB,GAAWD,CAAe,GAExBluB,KAAW,MAAM;AACnB,MAAIpX,EAAI,UAAQykC,GAAazkC,CAAG;AAChC;AAAA,IACF;AACA,UAAMvQ,KAAQ0xC,EAAa,OAAO,KAAK,CAACzmC,OAAQA,GAAI,OAAO0c,CAAO;AAClE,QAAI,CAAC3nB,MAAS,CAAC61B,GAAkB71B,GAAM,IAAI,EAAG;AAC9C,UAAMoQ,KAAWshC,EAAa,YAAY,KAAK,CAACzmC,OAAQA,GAAI,YAAY0c,CAAO,GACzEre,KAAO8G,KACT6b,GAAqB7b,IAAUpQ,GAAM,IAAI,IACzCiyB,GAAqBjyB,GAAM,IAAIA,GAAM,IAAI,GACvCwI,KAAayjB;AAAA,MACjB;AAAA,QACE,GAAG3iB;AAAA,QACH,YAAY;AAAA,QACZ,SAAA2sB;AAAA,QACA,eAAaxtC,KAAA2tC,KAAA,gBAAAA,EAAO,SAAP,gBAAA3tC,GAAa,WAAU6gB,GAAK;AAAA,QACzC,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,WAAW;AAAA,MAAA;AAAA,MAEbtJ,GAAM;AAAA,IAAA,GAEFy1C,KAAUC,GAAsB11C,IAAOwI,EAAU;AACvD,IAAA+H,EAAI,KAAK,EAAE,IAAI,qBAAqB,YAAA/H,IAAY,GAChD+H,EAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAIvQ,GAAM;AAAA,QACV,SAASA,GAAM;AAAA,QACf,KAAKA,GAAM;AAAA,QACX,MAAMA,GAAM;AAAA,QACZ,OAAOy1C,GAAQ;AAAA,QACf,OAAOA,GAAQ;AAAA,MAAA;AAAA,IACjB,CACD,GACDT,GAAazkC,CAAG;AAAA,EAClB,GAEMwlC,KAAmB,CAAC9O,MAA2B;AACnD,QAAI,CAACl6C,KAAWqyC,GAAiB,SAAS,EAAG;AAC7C,UAAM7uB,IAAiB,CAAA;AACvB,eAAWtP,KAAMm+B,IAAkB;AACjC,YAAMp/B,IAAQ0xC,EAAa,OAAO,KAAK,CAACrzC,OAASA,GAAK,OAAO4C,CAAE;AAC/D,UAAI,CAACjB,KAAS,CAAC40B,GAAiB50B,EAAM,IAAI,EAAG;AAC7C,YAAMoQ,IAAWshC,EAAa,YAAY,KAAK,CAACzmC,OAAQA,GAAI,YAAYhK,CAAE,GACpE3X,KAAU8mB,IACZ6b,GAAqB7b,GAAUpQ,EAAM,IAAI,IACzCiyB,GAAqBhxB,GAAIjB,EAAM,IAAI,GACjCg2C,KAAUC,GAAqB3sD,IAAS29C,CAAK,GAC7Cp9B,KAAWuK,EAAU,KAAK,CAAC/V,OAASA,GAAK,OAAO23C,GAAQ,UAAU,GAClEP,KAAUC,GAAsB11C,GAAOg2C,IAASnsC,EAAQ;AAC9D,MAAA0G,EAAI,KAAK,EAAE,IAAI,qBAAqB,YAAYylC,IAAS,GACzDzlC,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIvQ,EAAM;AAAA,UACV,SAASA,EAAM;AAAA,UACf,KAAKA,EAAM;AAAA,UACX,MAAMA,EAAM;AAAA,UACZ,OAAOy1C,GAAQ;AAAA,UACf,OAAOA,GAAQ;AAAA,QAAA;AAAA,MACjB,CACD;AAAA,IACH;AACA,IAAIllC,EAAI,UAAQykC,GAAazkC,CAAG;AAAA,EAClC,GAEMykC,KAAe,CAACzkC,MAAmB;AACvC,IAAAA,EAAI,QAAQ,CAACpnB,GAAI+iB,MAAUsnC,GAAQrqD,GAAI+iB,MAAU,IAAI,SAAS,MAAM,CAAC;AAAA,EACvE,GAEMgqC,KAAwB74B,IAC1ByK,GAAsBzK,GAAeq0B,EAAa,SAASA,EAAa,UAAU,IAClF,MACEyE,KACJD,OAA0B,eAAeA,OAA0B,aAC/DA,KACA,MAEAvW,KACJ,gBAAA10C,EAAAq7B,IAAA,EACE,UAAA;AAAA,IAAA,gBAAA37B;AAAA,MAACsgD;AAAA,MAAA;AAAA,QACC,OAAO5tB;AAAA,QACP,YAAY81B;AAAA,QACZ,WAAWzB,EAAa;AAAA,QACxB,WAAAt9B;AAAA,QACA,QAAAkhB;AAAA,QACA,gBAAgBkd,GACb,OAAO,CAAC7jD,MAAM,CAACywC,GAAiB,SAASzwC,EAAE,EAAE,CAAC,EAC9C,IAAI,CAACA,MAAMA,EAAE,GAAG;AAAA,QACnB,SAAA5B;AAAA,QACA,gBAAgBhF,MAAY;AAAA,QAC5B,WACEA,MAAY,YACVA,MAAY,eACZA,MAAY,YACZA,MAAY,YACZA,MAAY,gBACZA,MAAY,gBACZA,MAAY,cACV,KACA;AAAA,QAEN,gBAAgB2pD,EAAa,OAAO;AAAA,UAAO,CAAC/iD,MAC1CywC,GAAiB,SAASzwC,EAAE,EAAE;AAAA,QAAA;AAAA,QAEhC,qBAAqB+iD,EAAa,YAAY;AAAA,UAAO,CAACzmC,MACpDm0B,GAAiB,SAASn0B,EAAI,OAAO;AAAA,QAAA;AAAA,QAEvC,UAAU6pC;AAAA,QACV,cAAcS;AAAA,QACd,eAAextD,MAAY,aAAagtD,KAAoB;AAAA,QAC5D,eAAehtD,MAAY,aAAaktD,KAAoB;AAAA,QAC5D,QAAQnsD,GAAyB,YAAY4oD,EAAa,MAAM;AAAA,QAChE,UAAUyD;AAAA,QACV,mBAAmBQ;AAAA,QACnB,eAAeN;AAAA,QACf,kBAAkBG;AAAA,QAClB,cAAcO;AAAA,QACd,mBAAmBxtC,GAAM;AAAA,QACzB,gBAAgBA,GAAM;AAAA,QACtB,kBAAkBA,GAAM;AAAA,QACxB,gBAAgBA,GAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAEvBxgB,MAAY,cAAcs1B,KAAiB84B,KAC1C,gBAAAxrD;AAAA,MAACunC;AAAA,MAAA;AAAA,QACC,OAAO7U;AAAA,QACP,UAAU84B;AAAA,QACV,SAAAppD;AAAA,QACA,YAAYomD;AAAA,QACZ,mBAAmB5qC,GAAM;AAAA,QACzB,gBAAgBA,GAAM;AAAA,QACtB,KAAK;AAAA,UACH,OAAOmpC,EAAa;AAAA,UACpB,QAAQA,EAAa;AAAA,UACrB,QAAQA,EAAa;AAAA,UACrB,SAASA,EAAa;AAAA,UACtB,OAAOA,EAAa;AAAA,UACpB,YAAYA,EAAa;AAAA,UACzB,SAAS,MAAMR,GAAW;AAAA,QAAA;AAAA,QAE5B,YAAY8D;AAAA,QACZ,kBAAkBQ;AAAA,MAAA;AAAA,IAAA,IAElB;AAAA,EAAA,GACN,GAGInT,KACJxC,MAA0B,OACtBvK,EAAO,KAAK,CAACj3B,MAASA,EAAK,OAAOwhC,EAAsB,KAAK,OAC7D,MACAD,KAAoByC,KACxB,gBAAA13C;AAAA,IAAC06C;AAAA,IAAA;AAAA,MACC,OAAOhD;AAAA,MACP,cAActM,GAAyB2b,EAAa,MAAM;AAAA,MAC1D,iBAAiB1b;AAAA,QACfqM,GAAqB;AAAA,QACrBqP,EAAa;AAAA,MAAA;AAAA,MAEf,SAAA3kD;AAAA,MACA,UAAU,CAAC46B,MACTiuB,GAAuBvT,GAAqB,IAAI1a,CAAO;AAAA,IAAA;AAAA,EAAA,IAGzD,MAEEyuB,KAAqBljB;AAAA,IACzB,CAACmjB,MAA6B;AAC5B,UAAItuD,MAAY,wBAAwBo3C,KAAiB,KAAM;AAC/D,YAAMmX,IAASC,GAAuB;AAAA,QACpC,MAAMF,EAAK;AAAA,QACX,UAAUA,EAAK;AAAA,QACf,QAAQA,EAAK;AAAA,MAAA,CACd;AACD,MAAA1G,GAAqB,CAACj5C,OAAU;AAAA,QAC9B,GAAGA;AAAA,QACH,CAACu9C,GAAkB9U,GAAeqQ,EAAgB,CAAC,GAAG;AAAA,UACpD,SAASrQ;AAAA,UACT,QAAQqQ;AAAA,UACR,QAAQ8G,EAAO;AAAA,UACf,UAAUA,EAAO;AAAA,QAAA;AAAA,MACnB,EACA;AAAA,IACJ;AAAA,IACA,CAACnX,GAAeqQ,IAAkBznD,CAAO;AAAA,EAAA,GAGrCyuD,KAAoBtjB,GAAY,MAAM;AAC1C,IAAIiM,KAAiB,QACrBwQ,GAAqB,CAACj5C,OAAU;AAAA,MAC9B,GAAGA;AAAA,MACH,CAACu9C,GAAkB9U,GAAeqQ,EAAgB,CAAC,GACjDiH,GAA6BtX,GAAeqQ,EAAgB;AAAA,IAAA,EAC9D;AAAA,EACJ,GAAG,CAACrQ,GAAeqQ,EAAgB,CAAC,GAE9BkH,KAAY3uD,MAAY,eAAe,UAAUA,MAAY,aAAa,QAAQ;AAExF,SACE,gBAAAkD,EAAC,SAAI,WAAW,sCAAsChD,CAAI,IAAIgnD,KAAa,EAAE,IAC1E,UAAA;AAAA,IAAAmC,KACC,gBAAAzmD;AAAA,MAACs0C;AAAA,MAAA;AAAA,QACC,SAAAl3C;AAAA,QACA,iBAAiBosD;AAAA,QACjB,OAAOzC;AAAA,QACP,eAAAvS;AAAA,QACA,iBAAA9qB;AAAA,QACA,kBAAA+qB;AAAA,QACA,eAAekV;AAAA,QACf,cAAch6B;AAAA,QACd,aAAa,MAAM61B,GAAkB,CAAC5gD,MAAMA,IAAI,CAAC;AAAA,QACjD,WAAA6kB;AAAA,QACA,QAAAkhB;AAAA,QACA,wBAAAuK;AAAA,QACA,sBAAsBoQ;AAAA,QACtB,WAAApX;AAAA,QACA,aAAA0G;AAAA,QACA,mBAAAC;AAAA,QACA,aAAAuP;AAAA,QACA,eACEhW,IACI,OAAOjuB,MAAU;AACjB,UAAA+iC,GAAuBhgC,EAAM,KAAK;AAClC,cAAI;AACF,kBAAM5M,IAAK,MAAM83B,EAAcjuB,CAAK;AACpC,mBAAAykC,GAAW,QAAQ,GACnBvB,GAAwBngC,EAAM,KAAK,GAC5B5M;AAAA,UACT,SAASu4B,GAAO;AACd,kBAAAwU,GAAwBngC,EAAM,KAAK,GAC7B2rB;AAAA,UACR;AAAA,QACF,IACE;AAAA,QAEN,eAAAR;AAAA,QACA,eAAAC;AAAA,QACA,iBAAAC;AAAA,QACA,aAAAuG;AAAA,QACA,OAAAl3B;AAAA,QACA,eAAe,CAAC4qB,MAAY;AAC1B,UAAKoM,KACLiU;AAAA,YACE,EAAE,IAAI,gBAAgB,OAAO,EAAE,GAAG9B,EAAa,OAAO,GAAGve,IAAQ;AAAA,YACjE;AAAA,UAAA;AAAA,QAEJ;AAAA,QACA,QACE,gBAAAloC,EAAAq7B,IAAA,EACG,UAAA;AAAA,UAAAr+B,MAAS,WACR,gBAAA0C;AAAA,YAACu5C;AAAA,YAAA;AAAA,cACC,WAAAH;AAAA,cACA,UAAUl2B,EAAM;AAAA,cAChB,SAASkkC;AAAA,cACT,qBAAA1N;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,UACH6K,IACC,gBAAAvkD,EAAC,OAAA,EAAI,WAAU,0BAA0B,aAAc,IACrD;AAAA,QAAA,GACN;AAAA,QAEF,mBAAAi1C;AAAA,QACA,aAAAD;AAAA,QACA,cACE,gBAAA10C,EAAAq7B,IAAA,EACG,UAAA;AAAA,UAAA35B,GAASxC,IAAM,KAAK,IACnB,gBAAAQ,EAAC,KAAA,EAAE,WAAU,wBAAwB,UAAAgC,GAASxC,IAAM,KAAK,EAAA,CAAE,IACzD;AAAA,UACHw1C;AAAA,QAAA,GACH;AAAA,QAEF,iBACE,gBAAA10C,EAAAq7B,IAAA,EACG,UAAA;AAAA,UAAA8rB,uBACE,KAAA,EAAE,WAAU,wBAAuB,UAAA,wEAAA,CAEpC,IACEzlD,GAASxC,IAAM,OAAO,IACxB,gBAAAQ,EAAC,OAAE,WAAU,wBAAwB,aAASR,IAAM,OAAO,GAAE,IAC3D;AAAA,UACJ,gBAAAc,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,cAAA+nD,GAAa;AAAA,cAAO;AAAA,cAAgBC,GAAW;AAAA,cAAO;AAAA,YAAA,GACzD;AAAA,YACCpa,KAAasG,KAAiB,QAAQ,CAACiT,MACtC,gBAAAznD,EAAC,SAAI,WAAU,2BACb,4BAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM80C,KAAA,gBAAAA,EAAcN,IAAgB,mCAEnE,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,QAEF,wBACE,gBAAAx0C,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,kMAAA,CAIpC;AAAA,MAAA;AAAA,IAAA,IAGF;AAAA,IAEJ,gBAAAM,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAAwnD,uBACE,OAAA,EAAI,WAAU,iCAAgC,MAAK,WAAU,cAAW,UACtE,UAAAwE,GAAuB,IAAI,CAACC,MAC3B,gBAAAjsD;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAe6kD,OAAqBoH,EAAI;AAAA,YACxC,WACEpH,OAAqBoH,EAAI,KACrB,2CACA;AAAA,YAEN,SAAS,MAAMnH,GAAoBmH,EAAI,EAAE;AAAA,YAExC,UAAAA,EAAI;AAAA,UAAA;AAAA,UAXAA,EAAI;AAAA,QAAA,CAaZ,EAAA,CACH,IACEtF,IACF,gBAAA3mD;AAAA,UAACkC;AAAA,UAAA;AAAA,YACC,MAAA1C;AAAA,YACA,cAAcwqD;AAAA,YACd,SAAStC;AAAA,YACT,OAAOqE;AAAA,UAAA;AAAA,QAAA,IAEP,KAAA,CACN;AAAA,QACA,gBAAAzrD,EAAC,OAAA,EAAI,WAAU,kCACZ,UAAA;AAAA,UAAAqmD,IACC,gBAAA3mD;AAAA,YAAC6jD;AAAA,YAAA;AAAA,cACC,aAAAv6B;AAAA,cACA,UAAUu9B;AAAA,YAAA;AAAA,UAAA,IAEV;AAAA,UACJ,gBAAAvmD,EAAC,OAAA,EAAI,WAAU,6BACd,UAAA;AAAA,YAAAqmD,IACC,gBAAA3mD;AAAA,cAACgD;AAAA,cAAA;AAAA,gBACC,SAAStE,GAAQ,KAAK,SAAS,KAAKynD;AAAA,gBACpC,SAASznD,GAAQ,OAAO,SAAS;AAAA,gBACjC,UAAU,CAAC0D,KAAW4jD;AAAA,gBACtB,QAAQgD;AAAA,gBACR,QAAQC;AAAA,cAAA;AAAA,YAAA,IAER;AAAA,YACJ,gBAAAjpD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAW;AAAA,gBACX,SAAS,MAAM,KAAKupD,GAAA;AAAA,gBACpB,UAAU,CAAChC;AAAA,gBACZ,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,gBAAAjnD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAY6mD,KAAQ,iCAAiC;AAAA,gBACrD,SAAS,MAAM,KAAK+B,GAAA;AAAA,gBACpB,UAAU,CAAC3B;AAAA,gBAEV,UAAA;AAAA,kBAAAJ,uBACE,QAAA,EAAK,WAAU,gCAA+B,eAAY,QAAO,IAChE;AAAA,kBACHnB,KAAS,YAAY;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACxB,EAAA,CACA;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAECU,MAAkB,WACjB,gBAAA1mD;AAAA,QAAC2hD;AAAA,QAAA;AAAA,UAEC,UAAUyG;AAAA,UACV,MAAMZ,KAAmB,YAAY;AAAA,UACrC,iBAAiBA,KAAmB,OAAO99B;AAAA,UAC3C,kBAAkB89B,KAAmB,CAAA,IAAK/S;AAAA,UAC1C,gBAAgB+S,KAAmB,OAAO93B;AAAA,UAC1C,YAAY83B,KAAmB,SAAYjC;AAAA,UAC3C,eAAeiC,KAAmB,SAAYmC;AAAA,UAC9C,eAAAnV;AAAA,UACA,qBAAqB2Q;AAAA,UACrB,eAAe;AAAA,UACf,eAAAzkC;AAAA,UACA,QAAQ8mC,KAAmB3C,KAAmB;AAAA,UAC9C,eAAe2C;AAAA,UACf,gBAAgBA,KAAmBiE,KAAqB;AAAA,UACxD,eAAejE,KAAmBqE,KAAoB;AAAA,QAAA;AAAA,QAfjD5G;AAAA,MAAA,IAkBP,gBAAAjlD,EAAA27B,IAAA,EACE,UAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAACupB;AAAA,UAAA;AAAA,YACC,KAAKqC;AAAA,YACL,OAAO0rB;AAAA,YACP,QAAQuQ,GAAY,OAAO,CAAC7jD,MAAM,CAACA,EAAE,UAAU;AAAA,YAC/C,gBAAgB4jD,GAAc,OAAO,CAAC5jD,MAAM,CAACA,EAAE,UAAU;AAAA,YACzD,uBAAAimB;AAAA,YACA,SAASo+B;AAAA,YACT,OAAOC;AAAA,YACP,aAAavB,EAAa;AAAA,YAC1B,WAAAt9B;AAAA,YACA,WAAWs9B,EAAa;AAAA,YACxB,OAAAnpC;AAAA,YACA,MAAApe;AAAA,YACA,iBAAAkqB;AAAA,YACA,mBAAAC;AAAA,YACA,YAAYo9B,EAAa,cAAc;AAAA,YACvC,cAAaY,MAAA,gBAAAA,GAAc,kBAAiB;AAAA,YAC5C,gBACEA,MAAA,gBAAAA,GAAc,iBAAgBZ,EAAa,cAAc;AAAA,YAE3D,eAAArmC;AAAA,YACA,cACEwrC,GAAkBnF,EAAa,MAAM,KAAKY,KACtC,SACAwE;AAAA,YAEN,kBAAiB7U,MAAA,gBAAAA,GAAa,UAAS;AAAA,YACvC,UAAQ;AAAA,YACR,aAAAhuB;AAAA,YACA,WAAWlsB,MAAY;AAAA,YACvB,UAAUqqD;AAAA,YACV,QAAQuB;AAAA,YACR,0BAA0B5C;AAAA,YAC1B,cAAc4D;AAAA,YACd,eAAeL;AAAA,YACf,iBAAiBlE;AAAA,YACjB,sBAAsB,CAACt8C,GAAOC,MAAQ;AACpC,kBAAI,CAACkuC,MAAe,CAACoQ,GAAiB,QAAO;AAC7C,oBAAM0E,IAAM7F,GAAW,WACjB8F,IAAM9F,GAAW;AACvB,qBAAA8D,GAAa;AAAA,gBACX;AAAA,kBACE,IAAI;AAAA,kBACJ,QAAQ;AAAA,oBACN,IAAI+B;AAAA,oBACJ,SAAS9U,GAAY;AAAA,oBACrB,GAAGnuC,EAAM;AAAA,oBACT,GAAGA,EAAM;AAAA,oBACT,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,gBAEF;AAAA,kBACE,IAAI;AAAA,kBACJ,QAAQ;AAAA,oBACN,IAAIkjD;AAAA,oBACJ,SAAS/U,GAAY;AAAA,oBACrB,GAAGluC,EAAI;AAAA,oBACP,GAAGA,EAAI;AAAA,oBACP,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,gBAEF;AAAA,kBACE,IAAI;AAAA,kBACJ,MAAM;AAAA,oBACJ,OAAO29C,EAAa;AAAA,oBACpB,cAAcqF;AAAA,oBACd,YAAYC;AAAA,oBACZ,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,cACF,CACD,GACMA;AAAA,YACT;AAAA,YACA,oBAAoB,CAACr/C,GAAOs/C,MAAiB;AAC3C,kBAAI,CAAChV,MAAe,CAACoQ,GAAiB,QAAO;AAC7C,oBAAMpxC,IAAKuyC,GAAQ;AAAA,gBACjB,IAAI;AAAA,gBACJ,QAAQ;AAAA,kBACN,SAASvR,GAAY;AAAA,kBACrB,GAAGtqC,EAAM;AAAA,kBACT,GAAGA,EAAM;AAAA,kBACT,MAAM;AAAA,gBAAA;AAAA,cACR,CACD;AACD,qBACEsJ,KAAM,QACNg2C,KAAgB,QAChB,CAACxoC,GAAewkC,IAAYgE,GAAch2C,CAAE,KAE5CuyC;AAAA,gBACE;AAAA,kBACE,IAAI;AAAA,kBACJ,MAAM;AAAA,oBACJ,OAAO9B,EAAa;AAAA,oBACpB,cAAcuF;AAAA,oBACd,YAAYh2C;AAAA,oBACZ,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,gBAEF;AAAA,cAAA,GAGGA;AAAA,YACT;AAAA,YACA,oBAAoB,CAACgP,GAAcC,MAAe;AAChD,kBAAI,CAACmiC,GAAiB;AACtB,oBAAMlpD,IAAK4nB;AAAA,gBACT2gC,EAAa;AAAA,gBACbzhC;AAAA,gBACAC;AAAA,gBACA+iC;AAAA,gBACA,MAAM/B,GAAW;AAAA,cAAA;AAEnB,cAAI/nD,QAAYA,CAAE;AAAA,YACpB;AAAA,YACA,uBAAuB,CAACgoB,GAAQxZ,MAAU;AACxC,kBAAI,CAAC06C,MAAmB,CAACpQ,GAAa,QAAO;AAC7C,oBAAM5yC,IAAO4jD,GAAW,KAAK,CAAC50C,OAASA,GAAK,OAAO8S,CAAM;AACzD,kBAAI,CAAC9hB,EAAM,QAAO;AAClB,oBAAM,EAAE,KAAAkhB,GAAK,YAAAvB,EAAA,IAAegC,GAA4B;AAAA,gBACtD,SAASixB,GAAY;AAAA,gBACrB,OAAOyP,EAAa;AAAA,gBACpB,MAAAriD;AAAA,gBACA,OAAAsI;AAAA,gBACA,SAASq7C;AAAA,gBACT,SAAS,MAAM9B,GAAW;AAAA,cAAA,CAC3B;AACD,qBAAI3gC,EAAI,UAAQykC,GAAazkC,CAAG,GACzBvB;AAAA,YACT;AAAA,YACA,qBAAqB,CAACX,MAAa;AACjC,kBAAI,CAACgkC,GAAiB;AACtB,oBAAM9hC,IAAMoB;AAAA,gBACVtD;AAAA,gBACAqjC,EAAa;AAAA,gBACbuB;AAAA,gBACA,MAAM/B,GAAW;AAAA,cAAA;AAEnB,cAAI3gC,EAAI,UAAQykC,GAAazkC,CAAG;AAChC,oBAAMuQ,IAAU,IAAI;AAAA,gBAClBvQ,EACG,OAAO,CAACpnB,MAAOA,EAAG,OAAO,eAAe,EACxC,IAAI,CAACA,MAAOA,EAAG,QAAQ;AAAA,cAAA;AAE5B,cAAI23B,EAAQ,QACVsvB;AAAA,gBAAqB,CAAC7hC,MACpBA,EAAI,OAAO,CAACtN,MAAO,CAAC6f,EAAQ,IAAI7f,CAAE,CAAC;AAAA,cAAA;AAAA,YAGzC;AAAA,YACA,mBAAmB,CAACkQ,MAAW;AAC7B,kBAAI,CAACkhC,GAAiB;AACtB,oBAAM9hC,IAAMW,GAAmBC,GAAQ8hC,EAAU;AACjD,cAAI1iC,EAAI,UAAQykC,GAAazkC,CAAG;AAChC,oBAAMuQ,IAAU,IAAI;AAAA,gBAClBvQ,EACG,OAAO,CAACpnB,MAAOA,EAAG,OAAO,eAAe,EACxC,IAAI,CAACA,MAAOA,EAAG,QAAQ;AAAA,cAAA;AAE5B,cAAI23B,EAAQ,QACVsvB;AAAA,gBAAqB,CAAC7hC,MACpBA,EAAI,OAAO,CAACtN,MAAO,CAAC6f,EAAQ,IAAI7f,CAAE,CAAC;AAAA,cAAA;AAAA,YAGzC;AAAA,YACA,qBAAqB,CAAC0mB,GAAShwB,MAAU;AACvC,kBAAI,CAAC06C,GAAiB,QAAO;AAC7B,oBAAM1oD,IAAS6oD,GAAY,KAAK,CAACn0C,OAASA,GAAK,OAAOspB,CAAO;AAC7D,kBAAI,CAACh+B,EAAQ,QAAO;AACpB,oBAAM,EAAE,KAAA4mB,GAAK,UAAAlC,EAAA,IAAa8B,GAA0B;AAAA,gBAClD,OAAOxmB;AAAA,gBACP,SAASqpD;AAAA,gBACT,SAAS,MAAM9B,GAAW;AAAA,gBAC1B,OAAAv5C;AAAA,cAAA,CACD;AACD,qBAAI4Y,EAAI,UAAQykC,GAAazkC,CAAG,GAChC6/B,GAAqB,CAAC/hC,CAAQ,CAAC,GACxBA;AAAA,YACT;AAAA,YACA,uBAAuB,CAACsZ,GAASx4B,GAAMkQ,GAAMuQ,MAAY;AACvD,kBAAI,CAACyiC,GAAiB;AACtB,oBAAM1oD,IAAS6oD,GAAY,KAAK,CAACn0C,OAASA,GAAK,OAAOspB,CAAO;AAC7D,kBAAI,CAACh+B,EAAQ;AACb,oBAAM4mB,KAAMD,GAAuB;AAAA,gBACjC,OAAO3mB;AAAA,gBACP,SAASqpD;AAAA,gBACT,OAAOC;AAAA,gBACP,OAAOvB,EAAa;AAAA,gBACpB,MAAAviD;AAAA,gBACA,MAAAkQ;AAAA,gBACA,SAAAuQ;AAAA,gBACA,SAAS,MAAMshC,GAAW;AAAA,cAAA,CAC3B;AACD,cAAI3gC,GAAI,UAAQykC,GAAazkC,EAAG;AAAA,YAClC;AAAA,YACA,6BAA6B,CAAClC,GAAUhP,GAAMuQ,MAAY;AACxD,kBAAI,CAACyiC,GAAiB;AACtB,oBAAM5iC,IAASujC,GAAa,KAAK,CAAC30C,OAASA,GAAK,OAAOgQ,CAAQ;AAC/D,kBAAI,CAACoB,EAAQ;AACb,oBAAMc,IAAMI,GAA6B;AAAA,gBACvC,QAAAlB;AAAA,gBACA,SAASujC;AAAA,gBACT,OAAOC;AAAA,gBACP,OAAOvB,EAAa;AAAA,gBACpB,MAAAryC;AAAA,gBACA,SAAAuQ;AAAA,gBACA,SAAS,MAAMshC,GAAW;AAAA,cAAA,CAC3B;AACD,cAAI3gC,EAAI,UAAQykC,GAAazkC,CAAG;AAAA,YAClC;AAAA,YACA,qBAAqBmjC;AAAA,YACrB,cAAc,CAACrlC,GAAU/Z,GAAGC,MAAM;AAChC,kBAAI,CAAC89C,GAAiB;AACtB,oBAAM5iC,IAASujC,GAAa,KAAK,CAAC7kD,OAAMA,GAAE,OAAOkgB,CAAQ;AACzD,kBAAI,CAACoB,EAAQ;AACb,oBAAMvV,IAAQ,EAAE,GAAG5F,IAAImb,EAAO,GAAG,GAAGlb,IAAIkb,EAAO,EAAA;AAQ/C,kBAPA+jC;AAAA,gBACE;AAAA,kBACE,IAAI;AAAA,kBACJ,QAAQ,EAAE,GAAG/jC,GAAQ,GAAAnb,GAAG,GAAAC,EAAA;AAAA,gBAAE;AAAA,gBAE5B;AAAA,cAAA,GAEE,EAAA2F,EAAM,MAAM,KAAKA,EAAM,MAAM;AACjC,2BAAW7K,MAAQqiD,EAAa,OAAO;AACrC,wBAAM7iC,KAAQqoC,GAAyB7nD,IAAMgf,GAAUnU,CAAK;AAC5D,kBAAK2U,MACL2kC;AAAA,oBACE,EAAE,IAAI,eAAe,MAAM,EAAE,GAAGnkD,IAAM,OAAAwf,KAAM;AAAA,oBAC5C;AAAA,kBAAA;AAAA,gBAEJ;AAAA,YACF;AAAA,YACA,oBAAoB,CAClBsC,GACAtC,GACAi0B,MACG;AACH,kBAAI,CAACuP,GAAiB;AACtB,oBAAMhjD,IAAOqiD,EAAa,MAAM,KAAK,CAACrzC,MAASA,EAAK,OAAO8S,CAAM;AACjE,cAAK9hB,KACLmkD;AAAA,gBACE,EAAE,IAAI,eAAe,MAAM,EAAE,GAAGnkD,GAAM,OAAAwf,IAAM;AAAA,gBAC5Ci0B,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,cAAA;AAAA,YAE7B;AAAA,YACA,eAAe,CAACxmC,GAAMpG,GAAUyK,MAAW;AACzC,kBACE5Y,MAAY,gBACZ,CAACk6C,MACD,CAACoQ;AAED;AAEF,oBAAMroD,IAAMo8C;AAAA,gBACV9pC;AAAA,gBACA2pC,GAAqByL,EAAa,QAAQzP,GAAY,EAAE;AAAA,cAAA,GAEpDhhC,IAAKuyC,GAAQ;AAAA,gBACjB,IAAI;AAAA,gBACJ,OAAO;AAAA,kBACL,SAASvR,GAAY;AAAA,kBACrB,KAAAj4C;AAAA,kBACA,MAAAsS;AAAA,kBACA,UAAApG;AAAA,kBACA,MAAM2O,GAAa3O,CAAQ;AAAA,kBAC3B,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,gBAAgB;AAAA,kBAChB,OACEoG,MAAS,aACLowB,GAA0B;AAAA,oBACxB,MAAApwB;AAAA,oBACA,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,OAAOqE,KAAA,gBAAAA,EAAQ;AAAA,kBAAA,CAChB,MAAKA,KAAA,gBAAAA,EAAQ,SACdA,KAAA,gBAAAA,EAAQ;AAAA,gBAAA;AAAA,cAChB,CACD;AACD,cAAIM,KAAM,QAAMqzC,GAAkBrzC,CAAE;AAAA,YACtC;AAAA,YACA,uBAAuBm0C;AAAA,YACvB,mBAAmB,CAACt0C,MAAU;AAC5B,kBACE/Y,MAAY,gBACZ,CAACk6C,MACD,CAACoQ,MACDvxC,EAAM,WAAW;AAEjB;AAEF,oBAAMyP,IAAiB,CAAA;AACvB,kBAAI4mC,IAAkB;AACtB,oBAAMC,IAAY,IAAI;AAAA,gBACpBnR,GAAqByL,EAAa,QAAQzP,GAAY,EAAE;AAAA,cAAA;AA6C1D,kBA3CAnhC,EAAM,QAAQ,CAACu2C,MAAS;AACtB,oBAAIA,EAAK,WAAW,UAAU;AAC5B,wBAAMr3C,KAAQ0xC,EAAa,OAAO;AAAA,oBAChC,CAAC/iD,OAAMA,GAAE,OAAO0oD,EAAK;AAAA,kBAAA;AAEvB,sBAAI,CAACr3C,GAAO;AACZ,kBAAAuQ,EAAI,KAAK;AAAA,oBACP,IAAI;AAAA,oBACJ,OAAO;AAAA,sBACL,IAAIvQ,GAAM;AAAA,sBACV,SAASA,GAAM;AAAA,sBACf,KAAKA,GAAM;AAAA,sBACX,MAAMA,GAAM;AAAA,sBACZ,UAAUq3C,EAAK;AAAA,sBACf,MAAMxyC,GAAawyC,EAAK,QAAQ;AAAA,sBAChC,gBAAgB;AAAA,oBAAA;AAAA,kBAClB,CACD;AACD;AAAA,gBACF;AACA,oBAAIA,EAAK,WAAW,UAAU;AAC5B,wBAAMC,KAAgCD,EAAK,OACrCrtD,KAAMo8C,GAAciR,EAAK,MAAMD,CAAS;AAC9C,kBAAAA,EAAU,IAAIptD,EAAG,GACjBumB,EAAI,KAAK;AAAA,oBACP,IAAI;AAAA,oBACJ,OAAO;AAAA,sBACL,SAAS0xB,GAAY;AAAA,sBACrB,KAAAj4C;AAAA,sBACA,MAAMqtD,EAAK;AAAA,sBACX,UAAUA,EAAK;AAAA,sBACf,MAAMxyC,GAAawyC,EAAK,QAAQ;AAAA,sBAChC,OAAAC;AAAA,sBACA,QAAQ;AAAA,sBACR,gBAAgB;AAAA,oBAAA;AAAA,kBAClB,CACD;AACD;AAAA,gBACF;AACA,gBAAID,EAAK,YAAYhjC,OAAiB8iC,IAAkB,KACxD5mC,EAAI,KAAK,EAAE,IAAI,gBAAgB,SAAS8mC,EAAK,SAAS;AAAA,cACxD,CAAC,GACG9mC,EAAI,UAAQykC,GAAazkC,CAAG,GAC5B4mC,GAAiB;AACnB,sBAAMr5B,IAAWhd,EAAM,KAAK,CAAC/P,OAAMA,GAAE,WAAW,QAAQ;AACxD,gBAAAujD;AAAA,kBACEx2B,KAAYA,EAAS,WAAW,WAC5BA,EAAS,UACT;AAAA,gBAAA;AAAA,cAER;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAAnzB;AAAA,UAAC4sD;AAAA,UAAA;AAAA,YACC,QAAQ7F,EAAa;AAAA,YACrB,cAAc5oD,GAAyBf,GAAS2pD,EAAa,MAAM;AAAA,YACnE,kBAAgB;AAAA,YAChB,eAAAvS;AAAA,YACA,qBAAqBiV;AAAA,YACrB,UAAU,MAAA;;AAAM,sBAAA3rD,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB;AAAA;AAAA,YACnC,WAAW,MAAA;;AAAM,sBAAAA,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB;AAAA;AAAA,YACpC,SAAS,MAAA;;AAAM,sBAAAA,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB;AAAA;AAAA,UAAU;AAAA,QAAA;AAAA,MAC9C,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;ACtvDA,SAAS+uD,GAAYC,GAA0C;AAC7D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAMO,SAASC,GAAkB;AAAA,EAChC,MAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC;AAAA,EACA,MAAAve,IAAO;AAAA,EACP,SAAAwe;AAAA,EACA,UAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,GAAOC,CAAQ,IAAIzrC,EAAiC,CAAA,CAAE,GAEvD0rC,IAAUxrC,GAAQ,MAAM;AAC5B,UAAMyrC,IAAQR,EAAK,MAAM,OAAO,CAAChjD,MAAMA,EAAE,WAAW,OAAO,GACrDyjD,IAAWT,EAAK,MAAM,OAAO,CAAChjD,MAAMA,EAAE,WAAW,SAAS,GAC1D0jD,IAASV,EAAK,MAAM;AAAA,MACxB,CAAChjD,MAAMA,EAAE,kBAAkBA,EAAE,WAAW,aAAaA,EAAE,WAAW;AAAA,IAAA,GAE9D6tB,IAAQm1B,EAAK,MAAM,OAAO,CAAChjD,MAAMA,EAAE,WAAW,OAAO;AAC3D,WAAO,EAAE,OAAAwjD,GAAO,UAAAC,GAAU,QAAAC,GAAQ,OAAA71B,EAAA;AAAA,EACpC,GAAG,CAACm1B,EAAK,KAAK,CAAC;AAEf,SAAIC,IAEA,gBAAA3sD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAAktD,KACC,4EACJ;AAAA,IACCE,IACC,gBAAAptD,EAAC,UAAA,EAAO,MAAK,UAAS,SAASotD,GAAU,UAAUze,GAAM,UAAA,QAAA,CAEzD,IACE;AAAA,EAAA,GACN,IAKF,gBAAAruC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,uJAIpC;AAAA,IAECutD,EAAQ,MAAM,SAAS,uBACrB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAAjtD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QACpCitD,EAAQ,MAAM;AAAA,QAAO;AAAA,MAAA,GAC/B;AAAA,MACCA,EAAQ,MAAM,IAAI,CAAC75C,MAClB,gBAAApT,EAAC,OAAA,EAA2B,WAAU,uBACpC,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAM,YAAK,YAAA,CAAY;AAAA,QACxB,gBAAAA,EAAC,QAAA,EAAK,WAAU,yBAAyB,YAAK,QAAA,CAAQ;AAAA,MAAA,EAAA,GAF9C0T,EAAK,WAGf,CACD;AAAA,IAAA,GACH;AAAA,IAGD65C,EAAQ,SAAS,SAAS,uBACxB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAAjtD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QACjCitD,EAAQ,SAAS;AAAA,QAAO;AAAA,MAAA,GACrC;AAAA,MACCA,EAAQ,SAAS,IAAI,CAAC75C,MACrB,gBAAApT,EAAC,OAAA,EAA2B,WAAU,sDACpC,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAM,YAAK,YAAA,CAAY;AAAA,QACxB,gBAAAM,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,UAAA;AAAA,UAEvC,gBAAAN;AAAA,YAACupC;AAAA,YAAA;AAAA,cACC,WAAW,SAAS71B,EAAK,WAAW;AAAA,cACpC,OAAO25C,EAAM35C,EAAK,eAAgB,KAAK;AAAA,cACvC,UAAUi7B,KAAQ4e,EAAQ,MAAM,WAAW;AAAA,cAC3C,aAAY;AAAA,cACZ,YAAU;AAAA,cACV,SAAS;AAAA,gBACP,EAAE,OAAO,IAAI,OAAO,gBAAA;AAAA,gBACpB,GAAGA,EAAQ,MAAM,IAAI,CAAC/pD,OAAO;AAAA,kBAC3B,OAAOA,EAAE;AAAA,kBACT,OAAOA,EAAE;AAAA,gBAAA,EACT;AAAA,cAAA;AAAA,cAEJ,UAAU,CAACzB,MACTurD,EAAS,CAACvhD,OAAU;AAAA,gBAClB,GAAGA;AAAA,gBACH,CAAC2H,EAAK,eAAgB,GAAG3R;AAAA,cAAA,EACzB;AAAA,YAAA;AAAA,UAAA;AAAA,QAEN,EAAA,CACF;AAAA,MAAA,EAAA,GAxBQ2R,EAAK,WAyBf,CACD;AAAA,IAAA,GACH;AAAA,IAGD65C,EAAQ,OAAO,SAAS,uBACtB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAAjtD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QAC1BitD,EAAQ,OAAO;AAAA,QAAO;AAAA,MAAA,GAC1C;AAAA,MACA,gBAAAvtD,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,gEAEpC;AAAA,MACCutD,EAAQ,OAAO,IAAI,CAAC75C,MACnB,gBAAApT,EAAC,OAAA,EAA2B,WAAU,uBACpC,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAM,YAAK,YAAA,CAAY;AAAA,0BACvB,QAAA,EAAK,WAAU,yBAAyB,UAAA6sD,GAAYn5C,EAAK,MAAM,EAAA,CAAE;AAAA,MAAA,EAAA,GAF1DA,EAAK,WAGf,CACD;AAAA,IAAA,GACH;AAAA,IAGD65C,EAAQ,MAAM,SAAS,uBACrB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAAjtD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QACpCitD,EAAQ,MAAM;AAAA,QAAO;AAAA,MAAA,GAC/B;AAAA,MACA,gBAAAvtD,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,8DAEpC;AAAA,MACCutD,EAAQ,MAAM,IAAI,CAAC75C,wBACjB,OAAA,EAA2B,WAAU,uBACpC,UAAA,gBAAA1T,EAAC,UAAM,UAAA0T,EAAK,aAAY,EAAA,GADhBA,EAAK,WAEf,CACD;AAAA,IAAA,GACH;AAAA,IAGDs5C,EAAK,MAAM,WAAW,uBACpB,KAAA,EAAE,WAAU,wBAAuB,UAAA,6BAAA,CAA0B;AAAA,IAGhE,gBAAA1sD,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,MAAA8sD,IACC,gBAAAptD,EAAC,YAAO,MAAK,UAAS,UAAU2uC,GAAM,SAASye,GAAU,UAAA,SAAA,CAEzD,IACE;AAAA,MACJ,gBAAAptD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU2uC;AAAA,UACV,SAAS,MACP,KAAKwe,EAAQ;AAAA,YACX,WAAW;AAAA,YACX,OAAO,OAAO,QAAQE,CAAK,EACxB,OAAO,CAAC,GAAG5oD,CAAE,MAAM,EAAQA,CAAG,EAC9B,IAAI,CAAC,CAACD,GAAMmpD,CAAa,OAAO;AAAA,cAC/B,aAAa,OAAOnpD,CAAI;AAAA,cACxB,eAAAmpD;AAAA,YAAA,EACA;AAAA,UAAA,CACL;AAAA,UAGF,cAAO,cAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IACxB,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/editor/portalSurface.ts","../../src/editor/history.ts","../../src/editor/tools.tsx","../../src/editor/pathRings.ts","../../src/editor/geometryEdit.ts","../../src/editor/splitJoin.ts","../../src/editor/snapPoint.ts","../../src/editor/ortho.ts","../../src/editor/ellipseDraw.ts","../../src/editor/labelText.ts","../../src/editor/entranceIcon.ts","../../src/editor/canvas/coords.ts","../../src/editor/canvas/editorFill.ts","../../src/editor/canvas/editorHover.ts","../../src/editor/assignmentOverlay.ts","../../src/editor/canvas/AssignedShapeOverlay.tsx","../../src/editor/canvas/OutdoorSvgUnderlay.tsx","../../src/editor/canvas/underlayHint.ts","../../src/editor/routeStubs.ts","../../src/editor/canvas/EditorCanvas.tsx","../../src/editor/dirty.ts","../../src/editor/connectorAssignments.ts","../../src/editor/draftOps.ts","../../src/editor/FieldResetButton.tsx","../../src/editor/hexColor.ts","../../src/editor/panels/formRows.tsx","../../src/editor/panels/AssignmentStyleFields.tsx","../../src/editor/panels/ConnectorAssign.tsx","../../src/editor/labels.ts","../../src/editor/railAssignments.ts","../../src/editor/railKiosks.ts","../../src/editor/railListCopy.ts","../../src/editor/panels/FloorsPanel.tsx","../../src/editor/panels/LeftRail.tsx","../../src/editor/panels/ClassicMapFooter.tsx","../../src/editor/panels/CatalogKioskForm.tsx","../../src/editor/shapeCopy.ts","../../src/editor/panels/AssignForm.tsx","../../src/editor/panels/BulkAssignForm.tsx","../../src/editor/panels/CopyToLevelButton.tsx","../../src/editor/panels/EntranceIconForm.tsx","../../src/editor/panels/TextLabelForm.tsx","../../src/editor/panels/Inspector.tsx","../../src/editor/panels/PreviewOverlay.tsx","../../src/editor/shapeSelection.ts","../../src/editor/previewDocument.ts","../../src/editor/editorSectionReturn.ts","../../src/editor/floorsListReturn.ts","../../src/editor/GridPrefsControl.tsx","../../src/basemap/SurroundingsPanel.tsx","../../src/editor/MapEditor.tsx","../../src/editor/panels/ImportReviewPanel.tsx"],"sourcesContent":["import {\n defaultViewerLevelId,\n floorSwitcherLevels,\n type MapEditorHost,\n type StackLevel,\n} from '../core';\nimport type { RailSection } from './panels/LeftRail';\n\n/** What occupies the PORTAL center pane (rail is always Map options). */\nexport type PortalCenterSurface = 'viewer' | 'editor';\n\n/** Geometry canvas: Edit Map (shapes) or Wayfinding (routes). */\nexport function isEditorSection(section: RailSection | null): boolean {\n return section === 'edit-map' || section === 'wayfinding';\n}\n\n/**\n * PORTAL default is MapViewer (assign on the real map, no editor grid).\n * Edit Map and Wayfinding swap in EditorCanvas + grid. Non-PORTAL editor\n * hosts stay on the geometry canvas.\n */\nexport function portalCenterSurface(\n host: MapEditorHost,\n section: RailSection | null,\n): PortalCenterSurface {\n if (host === 'PORTAL' && !isEditorSection(section)) return 'viewer';\n return 'editor';\n}\n\n/** Building floors only — Outdoor is not routed. */\nexport function wayfindingSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n return floorSwitcherLevels(levels);\n}\n\n/** Floors in admin list order, then Outdoor at the bottom. */\nexport function editMapSelectableLevels<T extends StackLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n return [...floorSwitcherLevels(levels), ...outdoor];\n}\n\n/** Lowest building floor (bottom of the Floors list). */\nexport function defaultEditorFloorId(levels: StackLevel[]): number | null {\n return floorSwitcherLevels(levels).at(-1)?.id ?? null;\n}\n\n/**\n * Wayfinding always opens on the ground floor (bottom of the Floors list),\n * not Outdoor or the floor last used in Edit Map.\n */\nexport function levelIdOnEnterWayfinding(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/** Edit Map opens on the lowest building floor; Outdoor only if there are no floors. */\nexport function levelIdOnEnterEditMap(levels: StackLevel[]): number | null {\n return (\n defaultEditorFloorId(levels) ??\n levels.find((level) => level.kind === 'outdoor')?.id ??\n null\n );\n}\n\n/**\n * PORTAL default map always lands on the ground floor. Outdoor as the\n * active level hides building floors (`viewerLevelStack`).\n */\nexport function levelIdOnEnterDefaultMap(levels: StackLevel[]): number | null {\n return defaultViewerLevelId(levels);\n}\n\n/**\n * Top-right floor switcher. Edit Map lists floors then Outdoor.\n * Wayfinding lists building floors only.\n */\nexport function editorFloorControlLevels<T extends StackLevel & { name: string }>(\n section: RailSection | null,\n levels: T[],\n): Array<{ id: number; name: string }> {\n const selected =\n section === 'wayfinding'\n ? wayfindingSelectableLevels(levels)\n : editMapSelectableLevels(levels);\n return selected.map((level) => ({\n id: level.id,\n name: level.kind === 'outdoor' ? 'Outdoor' : level.name,\n }));\n}\n\n/** Outdoor can be viewed in Wayfinding but routes and drawing stay off. */\nexport function wayfindingOutdoorReadOnly(\n section: RailSection | null,\n level: { kind?: string } | null | undefined,\n): boolean {\n return section === 'wayfinding' && level?.kind === 'outdoor';\n}\n","import type { BatchOp } from '../core';\n\nexport const EDITOR_HISTORY_LIMIT = 100;\n\nexport type EditorHistorySnapshot = {\n ops: BatchOp[];\n nextTempId: number;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n};\n\nexport type EditorHistory = {\n past: EditorHistorySnapshot[];\n future: EditorHistorySnapshot[];\n};\n\nexport function emptyEditorHistory(): EditorHistory {\n return { past: [], future: [] };\n}\n\nexport function cloneHistorySnapshot(\n snapshot: EditorHistorySnapshot,\n): EditorHistorySnapshot {\n return {\n ops: snapshot.ops.map((op) => JSON.parse(JSON.stringify(op)) as BatchOp),\n nextTempId: snapshot.nextTempId,\n selectedShapeId: snapshot.selectedShapeId,\n selectedAnchorIds: [...snapshot.selectedAnchorIds],\n };\n}\n\nexport function pushEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): EditorHistory {\n return {\n past: [...history.past, cloneHistorySnapshot(current)].slice(-EDITOR_HISTORY_LIMIT),\n future: [],\n };\n}\n\nexport function undoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.past.length === 0) return null;\n const restored = history.past[history.past.length - 1];\n return {\n history: {\n past: history.past.slice(0, -1),\n future: [...history.future, cloneHistorySnapshot(current)],\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function redoEditorHistory(\n history: EditorHistory,\n current: EditorHistorySnapshot,\n): { history: EditorHistory; restored: EditorHistorySnapshot } | null {\n if (history.future.length === 0) return null;\n const restored = history.future[history.future.length - 1];\n return {\n history: {\n past: [...history.past, cloneHistorySnapshot(current)],\n future: history.future.slice(0, -1),\n },\n restored: cloneHistorySnapshot(restored),\n };\n}\n\nexport function isEditableTypingTarget(target: EventTarget | null): boolean {\n if (target == null || typeof target !== 'object') return false;\n const el = target as { tagName?: string; isContentEditable?: boolean };\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return Boolean(el.isContentEditable);\n}\n\ntype HotkeyEvent = Pick<\n KeyboardEvent,\n 'key' | 'metaKey' | 'ctrlKey' | 'shiftKey' | 'altKey'\n>;\n\n/** Ctrl/Cmd+Z — Windows, Linux, and macOS undo. */\nexport function isEditorUndoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey || e.shiftKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n return e.key === 'z' || e.key === 'Z';\n}\n\n/** Ctrl/Cmd+Shift+Z or Ctrl/Cmd+Y — redo on every desktop OS. */\nexport function isEditorRedoHotkey(e: HotkeyEvent): boolean {\n if (e.altKey) return false;\n if (!(e.metaKey || e.ctrlKey)) return false;\n const key = e.key.toLowerCase();\n if (key === 'z' && e.shiftKey) return true;\n return key === 'y' && !e.shiftKey;\n}\n","import React from 'react';\n\nexport type EditorTool =\n | 'select'\n | 'pan'\n | 'draw-unit'\n | 'draw-polygon'\n | 'draw-circle'\n | 'curve'\n | 'split-join'\n | 'draw-text'\n | 'draw-entrance'\n | 'draw-route'\n | 'create-route'\n | 'create-route-multi';\n\nexport const EDITOR_TOOLS: Array<{\n id: EditorTool;\n label: string;\n draw?: boolean;\n /** Route tools sit after a separator, apart from shape tools. */\n group?: 'map' | 'route';\n /** When set, the label is shown beside the icon instead of only as a tooltip. */\n caption?: string;\n /** Draw a toolbar separator immediately before this tool. */\n sepBefore?: boolean;\n /** Also show this tool on the other toolbar. Curve is shared with Wayfinding. */\n also?: 'map' | 'route';\n}> = [\n { id: 'select', label: 'Select', group: 'map' },\n { id: 'pan', label: 'Pan', group: 'map' },\n { id: 'draw-unit', label: 'Draw rectangle', draw: true, group: 'map' },\n { id: 'draw-polygon', label: 'Draw polygon', draw: true, group: 'map' },\n { id: 'draw-circle', label: 'Draw circle', draw: true, group: 'map' },\n { id: 'curve', label: 'Curve', draw: true, group: 'map', also: 'route' },\n { id: 'split-join', label: 'Split / Join', draw: true, group: 'map' },\n { id: 'draw-text', label: 'Text', draw: true, group: 'map' },\n { id: 'draw-entrance', label: 'Entrance', draw: true, group: 'map' },\n {\n id: 'draw-route',\n label: 'Wayfinding Routes',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route',\n label: 'Create Route',\n draw: true,\n group: 'route',\n },\n {\n id: 'create-route-multi',\n label: 'Multi Route',\n draw: true,\n group: 'route',\n },\n];\n\nexport function isRouteTool(tool: string): boolean {\n return (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n );\n}\n\n/** Empty-canvas clicks start a new path with Create Route or Multi Route. */\nexport function canPlaceNewRoute(tool: string): boolean {\n return tool === 'create-route' || tool === 'create-route-multi';\n}\n\n/** Tools that may be active while the Wayfinding section owns the canvas. */\nexport function isWayfindingEditorTool(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || canPlaceNewRoute(tool);\n}\n\n/** Destructive route gestures are intentionally confined to Select. */\nexport function canDeleteWayfindingItem(tool: string): boolean {\n return tool === 'select';\n}\n\n/** Multi Route keeps adding segments until Esc or another tool. */\nexport function canChainRoute(tool: string): boolean {\n return tool === 'create-route-multi';\n}\n\n/** After a segment is committed, keep the end only for Multi Route. */\nexport function nextRouteChainAnchor(\n tool: string,\n endAnchorId: number | null | undefined,\n): number | null {\n if (!canChainRoute(tool)) return null;\n return typeof endAnchorId === 'number' ? endAnchorId : null;\n}\n\nconst ICON_PROPS = {\n width: 16,\n height: 16,\n viewBox: '0 0 16 16',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction SelectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.2 2.4 12.4 8.1l-4.1.6 1.8 4.6-1.8.7-1.8-4.6-2.6 2.4z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction PanIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M4.15 8.05V6.7a.95.95 0 0 1 1.9 0V8.15M6.05 7.2V4.1a.95.95 0 1 1 1.9 0V7.05M7.95 6.9V3.2a.95.95 0 1 1 1.9 0V6.95M9.85 7V3.9a.95.95 0 1 1 1.9 0v5.05c0 2.05-1.5 3.4-3.6 3.4-1.75 0-3.15-1.05-3.35-2.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.45\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRectIcon() {\n return (\n <svg {...ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n />\n </svg>\n );\n}\n\nfunction DrawPolygonIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M8 2.5 13.2 6.2 11.2 12.5H4.8L2.8 6.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawCircleIcon() {\n return (\n <svg {...ICON_PROPS}>\n <ellipse\n cx=\"8\"\n cy=\"8\"\n rx=\"5.4\"\n ry=\"5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n />\n </svg>\n );\n}\n\nfunction CurveIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.3 11.6 C4.6 2.4 6.4 2.4 8 8 S11.4 13.6 13.7 4.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n <circle cx=\"2.3\" cy=\"11.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.7\" cy=\"4.4\" r=\"1.35\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SplitJoinIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M1.7 8H5.2M10.8 8h3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"6.15\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n <circle cx=\"9.85\" cy=\"8\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction DrawTextIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3 4.2h10M8 4.2V13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 13h5.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawEntranceIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M5.4 2.8h6.4A2.8 2.8 0 0 1 14.6 5.6v4.8a2.8 2.8 0 0 1-2.8 2.8H5.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M1.7 8h8.1M7.3 5.15 10.4 8l-3.1 2.85\"\n stroke=\"currentColor\"\n strokeWidth=\"1.55\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DrawRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 12.5c2.2-3.4 3.2-3.6 4.5-3.6 1.6 0 2.2 1.8 4.5 1.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.5\" cy=\"12.5\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8.9\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"12.5\" cy=\"10.7\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction CreateRouteIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12c1.7-2.6 3-3.3 4.8-3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12\" r=\"1.35\" fill=\"currentColor\" />\n <path\n d=\"M11.2 3.4v6.2M8.1 6.5h6.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction CreateRouteMultiIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M2.8 12.2 6.2 6.4 9.6 9.6 13.2 3.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"2.8\" cy=\"12.2\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"6.2\" cy=\"6.4\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"9.6\" cy=\"9.6\" r=\"1.35\" fill=\"currentColor\" />\n <circle cx=\"13.2\" cy=\"3.6\" r=\"1.35\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M3.5 7.5H9a3.5 3.5 0 1 1 0 7H7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6 4.5 3 7.5 6 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction RedoIcon() {\n return (\n <svg {...ICON_PROPS}>\n <path\n d=\"M12.5 7.5H7a3.5 3.5 0 1 0 0 7h1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10 4.5 13 7.5 10 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst TOOL_ICONS: Record<EditorTool, () => React.ReactElement> = {\n select: SelectIcon,\n pan: PanIcon,\n 'draw-unit': DrawRectIcon,\n 'draw-polygon': DrawPolygonIcon,\n 'draw-circle': DrawCircleIcon,\n curve: CurveIcon,\n 'split-join': SplitJoinIcon,\n 'draw-text': DrawTextIcon,\n 'draw-entrance': DrawEntranceIcon,\n 'draw-route': DrawRouteIcon,\n 'create-route': CreateRouteIcon,\n 'create-route-multi': CreateRouteMultiIcon,\n};\n\n/** Select and Curve can click a shape to make it the edit target. */\nexport function canSelectShapes(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\n/** Store geometry belongs to Edit Map; Wayfinding only edits the route graph. */\nexport function canEditShapeGeometry(\n tool: EditorTool,\n routeMode = false,\n): boolean {\n return !routeMode && canSelectShapes(tool);\n}\n\nexport function isSplitJoinTool(tool: EditorTool): boolean {\n return tool === 'split-join';\n}\n\n/** Click-to-place closed polygons. */\nexport function isPolygonDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-polygon';\n}\n\n/**\n * Points placed for a store that is not closed yet. Undo removes the last\n * one and leaves earlier finished stores in history.\n */\nexport function popPolygonDraftPoint<T>(points: readonly T[]): {\n points: T[];\n consumed: boolean;\n} {\n if (points.length === 0) return { points: [...points], consumed: false };\n return { points: points.slice(0, -1), consumed: true };\n}\n\n/** Click-drag oval / circle. */\nexport function isEllipseDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-circle';\n}\n\n/** Rectangle, polygon, and circle — plus cursor for placement. */\nexport function isShapeDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-unit' || tool === 'draw-polygon' || tool === 'draw-circle';\n}\n\n/** Click-to-place text or entrance stamps. */\nexport function isStampDrawTool(tool: EditorTool): boolean {\n return tool === 'draw-text' || tool === 'draw-entrance';\n}\n\n/** Click two open ends to join them — Select after a split, or Split / Join. */\nexport function canJoinOpenEnds(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'split-join';\n}\n\n/** Corner anchors — Select, Curve, and Split / Join. */\nexport function showsShapeAnchors(tool: EditorTool): boolean {\n return tool === 'select' || tool === 'curve' || tool === 'split-join';\n}\n\n/** Midpoint bend dots and cubic handles — only the Curve tool. */\nexport function showsCurveHandles(tool: EditorTool): boolean {\n return tool === 'curve';\n}\n\n/** Empty-canvas drag pans in Select, Curve, Pan, and Wayfinding edit. */\nexport function emptyCanvasDragPans(tool: EditorTool): boolean {\n return (\n tool === 'select' ||\n tool === 'curve' ||\n tool === 'split-join' ||\n tool === 'pan' ||\n tool === 'draw-route'\n );\n}\n\n/** Create Route or Multi Route again returns to Select. */\nexport function nextEditorTool(current: EditorTool, next: EditorTool): EditorTool {\n if (next === current && canPlaceNewRoute(next)) return 'select';\n return next;\n}\n\nexport function toolHint(tool: EditorTool, group?: 'map' | 'route'): string {\n if (group === 'route') {\n switch (tool) {\n case 'curve':\n return 'Click a walking path to show its curve handles. Drag the midpoint to pull an arch, then use the two handles to fine-tune. Double-click a handle to flatten it back to a line.';\n case 'create-route':\n return 'Click two points to create one route. Click two more to add another. Esc or Undo steps back.';\n case 'create-route-multi':\n return 'Keep clicking to add connected routes. Esc or Undo steps back without changing the tool.';\n case 'pan':\n return 'Drag the map to move around. Walking paths stay on the selected floor.';\n case 'select':\n default:\n return 'Click an anchor or a walking path to select it. Drag empty space to pan. Double-click a walking path to delete it. Use Create Route or Multi Route in the toolbar to add a point on an existing path.';\n }\n }\n switch (tool) {\n case 'pan':\n return 'Drag the map to move around.';\n case 'draw-unit':\n return 'Click and drag to draw a store rectangle.';\n case 'draw-polygon':\n return 'Click to place points. Hold Shift to draw a straight horizontal or vertical line. Hover an existing anchor to snap to it. Click the first point or press Enter to close. Undo removes the last point. Esc cancels.';\n case 'draw-circle':\n return 'Click and drag to draw an oval. Hold Shift to keep it a circle.';\n case 'curve':\n return 'Select a shape to see its anchors. Drag a midpoint to pull an arch, then use the two handles to fine-tune. Double-click a handle to flatten it back to a line.';\n case 'split-join':\n return 'Click a wall to split it open. Click an open end to switch to Select and join it to another end. To merge, click the shared wall on each store.';\n case 'draw-text':\n return 'Click the map to place text. Click existing text to select it.';\n case 'draw-entrance':\n return 'Click the map to place an entrance marker. Click an existing marker to select it.';\n case 'draw-route':\n return '';\n case 'create-route':\n return 'Click two points to create one route. Click two more to add another. Esc or Undo steps back.';\n case 'create-route-multi':\n return 'Keep clicking to add connected routes. Esc or Undo steps back without changing the tool.';\n case 'select':\n default:\n return 'Click a shape to select it. Drag empty space to pan, or hold Space to pan while another tool is active. Drag a shape to move it. Hover a side to highlight it, then click to add an anchor. Click and drag a side to move both ends and expand the shape. Hold Shift while dragging an anchor to keep the line straight. Double-click an anchor to delete it. Click two open endpoints to join them.';\n }\n}\n\nexport interface EditorToolButtonsProps {\n tool: EditorTool;\n onToolChange: (tool: EditorTool) => void;\n canEdit: boolean;\n /** Omit to show every tool. PORTAL Edit Map is `map`; Wayfinding is `route`. */\n group?: 'map' | 'route';\n}\n\nexport function EditorToolButtons({\n tool,\n onToolChange,\n canEdit,\n group,\n}: EditorToolButtonsProps) {\n const mapTools = EDITOR_TOOLS.filter((t) => t.group !== 'route');\n const routeTools = EDITOR_TOOLS.filter(\n (t) => t.group === 'route' && t.id !== 'draw-route',\n );\n const routeCurveTools =\n group === 'route' ? EDITOR_TOOLS.filter((t) => t.also === 'route') : [];\n const showMap = group !== 'route';\n const showRoute = group !== 'map';\n const selectTool = EDITOR_TOOLS.find((t) => t.id === 'select');\n const routeToolbar =\n group === 'route' && selectTool\n ? [selectTool, ...routeTools, ...routeCurveTools]\n : routeTools;\n\n const renderButton = (t: (typeof EDITOR_TOOLS)[number]) => {\n const Icon = TOOL_ICONS[t.id];\n return (\n <button\n key={t.id}\n type=\"button\"\n className={`eyeon-map-editor__tool-icon${t.caption ? ' eyeon-map-editor__tool-icon--labeled' : ''}${tool === t.id ? ' is-active' : ''}`}\n data-tooltip={t.caption ? undefined : t.label}\n aria-label={t.label}\n aria-pressed={tool === t.id}\n onClick={() => onToolChange(t.id)}\n disabled={!canEdit && t.draw}\n >\n <Icon />\n {t.caption ? (\n <span className=\"eyeon-map-editor__tool-caption\">{t.caption}</span>\n ) : null}\n </button>\n );\n };\n\n return (\n <div className=\"eyeon-map-editor__tool-icons\" role=\"toolbar\" aria-label=\"Map tools\">\n {showMap\n ? mapTools.map((t) => (\n <React.Fragment key={t.id}>\n {t.sepBefore ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {renderButton(t)}\n </React.Fragment>\n ))\n : null}\n {showMap && showRoute ? (\n <span className=\"eyeon-map-editor__tool-sep\" aria-hidden=\"true\" />\n ) : null}\n {showRoute ? routeToolbar.map(renderButton) : null}\n </div>\n );\n}\n\nexport interface EditorHistoryButtonsProps {\n canUndo: boolean;\n canRedo: boolean;\n disabled?: boolean;\n onUndo: () => void;\n onRedo: () => void;\n}\n\nexport function EditorHistoryButtons({\n canUndo,\n canRedo,\n disabled = false,\n onUndo,\n onRedo,\n}: EditorHistoryButtonsProps) {\n return (\n <div className=\"eyeon-map-editor__history\" role=\"group\" aria-label=\"Undo and redo\">\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Undo\"\n aria-label=\"Undo\"\n onClick={onUndo}\n disabled={disabled || !canUndo}\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__tool-icon\"\n data-tooltip=\"Redo\"\n aria-label=\"Redo\"\n onClick={onRedo}\n disabled={disabled || !canRedo}\n >\n <RedoIcon />\n </button>\n </div>\n );\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport {\n approximateCubic,\n buildGeometryFromPaths,\n distance,\n projectOntoSegment,\n tokenizePathData,\n} from '../core';\n\nexport type PathEdge =\n | { kind: 'line' }\n | { kind: 'cubic'; c1: Vec2; c2: Vec2 };\n\n/** One closed or open subpath as corner anchors + one edge between each pair. */\nexport interface PathRing {\n closed: boolean;\n anchors: Vec2[];\n /** `edges[i]` runs from `anchors[i]` to the next anchor (wraps when closed). */\n edges: PathEdge[];\n}\n\nconst EPS = 1e-4;\n\nexport function vecEq(a: Vec2, b: Vec2, eps = EPS): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n\nexport function cloneVec(p: Vec2): Vec2 {\n return { x: p.x, y: p.y };\n}\n\nexport function addVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function subVec(a: Vec2, b: Vec2): Vec2 {\n return { x: a.x - b.x, y: a.y - b.y };\n}\n\nexport function scaleVec(a: Vec2, s: number): Vec2 {\n return { x: a.x * s, y: a.y * s };\n}\n\nexport function lerpVec(a: Vec2, b: Vec2, t: number): Vec2 {\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };\n}\n\nexport function edgeCount(ring: PathRing): number {\n if (ring.anchors.length < 2) return 0;\n return ring.closed ? ring.anchors.length : ring.anchors.length - 1;\n}\n\nexport function edgeFrom(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[edgeIndex];\n}\n\nexport function edgeTo(ring: PathRing, edgeIndex: number): Vec2 {\n return ring.anchors[(edgeIndex + 1) % ring.anchors.length];\n}\n\nexport function edgeToPathD(ring: PathRing, edgeIndex: number): string {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n return `M ${from.x} ${from.y} C ${edge.c1.x} ${edge.c1.y} ${edge.c2.x} ${edge.c2.y} ${to.x} ${to.y}`;\n }\n return `M ${from.x} ${from.y} L ${to.x} ${to.y}`;\n}\n\nexport function fmtCoord(n: number): string {\n const r = Math.round(n * 1000) / 1000;\n return Object.is(r, -0) ? '0' : String(r);\n}\n\nexport function ringFromPolygon(poly: Vec2[], closed = true): PathRing {\n const anchors = poly.map(cloneVec);\n if (\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const edges: PathEdge[] = anchors.map(() => ({ kind: 'line' }));\n if (!closed && edges.length > 0) edges.pop();\n return { closed, anchors, edges };\n}\n\n/**\n * Quadratic (p0, q, p2) → cubic handles.\n */\nexport function quadraticToCubic(p0: Vec2, q: Vec2, p2: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n return {\n c1: lerpVec(p0, q, 2 / 3),\n c2: lerpVec(p2, q, 2 / 3),\n };\n}\n\n/**\n * Symmetric cubic that passes through `pull` at t = 0.5.\n * Used when the user drags a straight side into an arch.\n */\nexport function cubicHandlesForPull(from: Vec2, to: Vec2, pull: Vec2): {\n c1: Vec2;\n c2: Vec2;\n} {\n const mid = lerpVec(from, to, 0.5);\n const offset = scaleVec(subVec(pull, mid), 4 / 3);\n const chord = subVec(to, from);\n return {\n c1: addVec(addVec(from, scaleVec(chord, 1 / 3)), offset),\n c2: addVec(addVec(from, scaleVec(chord, 2 / 3)), offset),\n };\n}\n\nexport function cubicPoint(p0: Vec2, c1: Vec2, c2: Vec2, p3: Vec2, t: number): Vec2 {\n const u = 1 - t;\n return {\n x: u * u * u * p0.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * p3.x,\n y: u * u * u * p0.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * p3.y,\n };\n}\n\nexport function splitCubic(\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n t: number,\n): {\n left: { c1: Vec2; c2: Vec2; to: Vec2 };\n right: { c1: Vec2; c2: Vec2; to: Vec2 };\n} {\n const a = lerpVec(p0, c1, t);\n const b = lerpVec(c1, c2, t);\n const c = lerpVec(c2, p3, t);\n const d = lerpVec(a, b, t);\n const e = lerpVec(b, c, t);\n const mid = lerpVec(d, e, t);\n return {\n left: { c1: a, c2: d, to: mid },\n right: { c1: e, c2: c, to: p3 },\n };\n}\n\n/**\n * Split an SVG elliptical arc into cubics (one per ≤90° sweep) so Edit Map\n * can treat each arch as two anchors + two handles.\n */\nexport function ellipticalArcToCubics(\n p0: Vec2,\n rx: number,\n ry: number,\n xAxisRotationDeg: number,\n largeArc: boolean,\n sweep: boolean,\n p1: Vec2,\n): Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> {\n if (vecEq(p0, p1)) return [];\n let arx = Math.abs(rx);\n let ary = Math.abs(ry);\n if (arx === 0 || ary === 0 || !Number.isFinite(arx) || !Number.isFinite(ary)) {\n return [];\n }\n\n const phi = ((xAxisRotationDeg % 360) * Math.PI) / 180;\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n const dx2 = (p0.x - p1.x) / 2;\n const dy2 = (p0.y - p1.y) / 2;\n const x1p = cosPhi * dx2 + sinPhi * dy2;\n const y1p = -sinPhi * dx2 + cosPhi * dy2;\n const lambda = (x1p * x1p) / (arx * arx) + (y1p * y1p) / (ary * ary);\n if (lambda > 1) {\n const scale = Math.sqrt(lambda);\n arx *= scale;\n ary *= scale;\n }\n const rxSq = arx * arx;\n const rySq = ary * ary;\n const numerator = rxSq * rySq - rxSq * y1p * y1p - rySq * x1p * x1p;\n const denominator = rxSq * y1p * y1p + rySq * x1p * x1p;\n const factor =\n Math.sqrt(Math.max(0, numerator / denominator)) * (largeArc === sweep ? -1 : 1);\n const cxp = (factor * arx * y1p) / ary;\n const cyp = (-factor * ary * x1p) / arx;\n const cx = cosPhi * cxp - sinPhi * cyp + (p0.x + p1.x) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (p0.y + p1.y) / 2;\n const ux = (x1p - cxp) / arx;\n const uy = (y1p - cyp) / ary;\n const vx = (-x1p - cxp) / arx;\n const vy = (-y1p - cyp) / ary;\n const theta1 = Math.atan2(uy, ux);\n let deltaTheta = Math.atan2(ux * vy - uy * vx, ux * vx + uy * vy);\n if (!sweep && deltaTheta > 0) deltaTheta -= 2 * Math.PI;\n else if (sweep && deltaTheta < 0) deltaTheta += 2 * Math.PI;\n\n const ellipsePoint = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n return {\n x: cx + arx * cosPhi * cosT - ary * sinPhi * sinT,\n y: cy + arx * sinPhi * cosT + ary * cosPhi * sinT,\n };\n };\n const ellipseDeriv = (theta: number): Vec2 => {\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n const dx = -arx * sinT;\n const dy = ary * cosT;\n return {\n x: cosPhi * dx - sinPhi * dy,\n y: sinPhi * dx + cosPhi * dy,\n };\n };\n\n const out: Array<{ c1: Vec2; c2: Vec2; to: Vec2 }> = [];\n let t0 = theta1;\n let remaining = deltaTheta;\n while (Math.abs(remaining) > 1e-8) {\n const step =\n Math.sign(remaining) * Math.min(Math.abs(remaining), Math.PI / 2);\n const t1 = t0 + step;\n const k = (4 / 3) * Math.tan(step / 4);\n const start = ellipsePoint(t0);\n const end = ellipsePoint(t1);\n const d0 = ellipseDeriv(t0);\n const d1 = ellipseDeriv(t1);\n out.push({\n c1: { x: start.x + k * d0.x, y: start.y + k * d0.y },\n c2: { x: end.x - k * d1.x, y: end.y - k * d1.y },\n to: end,\n });\n t0 = t1;\n remaining -= step;\n }\n if (out.length > 0) {\n out[out.length - 1].to = cloneVec(p1);\n }\n return out;\n}\n\nexport function parsePathToRings(d: string): PathRing[] {\n const tokens = tokenizePathData(d);\n const rings: PathRing[] = [];\n let anchors: Vec2[] = [];\n let edges: PathEdge[] = [];\n let x = 0;\n let y = 0;\n let startX = 0;\n let startY = 0;\n let lastCtrl: Vec2 | null = null;\n let i = 0;\n let cmd = '';\n let started = false;\n\n const readNum = () => Number(tokens[i++]);\n\n const flush = (closed: boolean) => {\n if (\n closed &&\n anchors.length > 1 &&\n vecEq(anchors[0], anchors[anchors.length - 1])\n ) {\n anchors.pop();\n }\n const expected = closed ? anchors.length : Math.max(0, anchors.length - 1);\n while (edges.length > expected) edges.pop();\n while (edges.length < expected) edges.push({ kind: 'line' });\n if (anchors.length >= 2) {\n rings.push({\n closed,\n anchors: anchors.map(cloneVec),\n edges: edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) },\n ),\n });\n }\n anchors = [];\n edges = [];\n started = false;\n };\n\n const pushAnchor = (p: Vec2): boolean => {\n if (anchors.length > 0 && vecEq(anchors[anchors.length - 1], p)) return false;\n anchors.push(cloneVec(p));\n return true;\n };\n\n while (i < tokens.length) {\n const t = tokens[i];\n if (/[a-zA-Z]/.test(t)) {\n cmd = t;\n i++;\n }\n\n switch (cmd) {\n case 'M':\n case 'm': {\n const isRel = cmd === 'm';\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (started) flush(false);\n x = nx;\n y = ny;\n startX = x;\n startY = y;\n pushAnchor({ x, y });\n started = true;\n lastCtrl = null;\n cmd = isRel ? 'l' : 'L';\n break;\n }\n case 'L':\n case 'l': {\n const isRel = cmd === 'l';\n x = isRel ? x + readNum() : readNum();\n y = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'H':\n case 'h': {\n x = cmd === 'h' ? x + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'V':\n case 'v': {\n y = cmd === 'v' ? y + readNum() : readNum();\n if (pushAnchor({ x, y })) edges.push({ kind: 'line' });\n lastCtrl = null;\n break;\n }\n case 'C':\n case 'c': {\n const isRel = cmd === 'c';\n const x1 = isRel ? x + readNum() : readNum();\n const y1 = isRel ? y + readNum() : readNum();\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1: { x: x1, y: y1 },\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'S':\n case 's': {\n const isRel = cmd === 's';\n const c1 = lastCtrl\n ? { x: 2 * x - lastCtrl.x, y: 2 * y - lastCtrl.y }\n : { x, y };\n const x2 = isRel ? x + readNum() : readNum();\n const y2 = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({\n kind: 'cubic',\n c1,\n c2: { x: x2, y: y2 },\n });\n }\n lastCtrl = { x: x2, y: y2 };\n x = nx;\n y = ny;\n break;\n }\n case 'Q':\n case 'q': {\n const isRel = cmd === 'q';\n const qx = isRel ? x + readNum() : readNum();\n const qy = isRel ? y + readNum() : readNum();\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'T':\n case 't': {\n const isRel = cmd === 't';\n const qx: number = lastCtrl ? 2 * x - lastCtrl.x : x;\n const qy: number = lastCtrl ? 2 * y - lastCtrl.y : y;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const { c1, c2 } = quadraticToCubic({ x, y }, { x: qx, y: qy }, { x: nx, y: ny });\n if (pushAnchor({ x: nx, y: ny })) {\n edges.push({ kind: 'cubic', c1, c2 });\n }\n lastCtrl = { x: qx, y: qy };\n x = nx;\n y = ny;\n break;\n }\n case 'A':\n case 'a': {\n const isRel = cmd === 'a';\n const rx = readNum();\n const ry = readNum();\n const rot = readNum();\n const largeArc = readNum() !== 0;\n const sweep = readNum() !== 0;\n const nx = isRel ? x + readNum() : readNum();\n const ny = isRel ? y + readNum() : readNum();\n const cubics = ellipticalArcToCubics(\n { x, y },\n rx,\n ry,\n rot,\n largeArc,\n sweep,\n { x: nx, y: ny },\n );\n if (cubics.length === 0) {\n if (pushAnchor({ x: nx, y: ny })) edges.push({ kind: 'line' });\n } else {\n for (const cubic of cubics) {\n if (pushAnchor(cubic.to)) {\n edges.push({ kind: 'cubic', c1: cubic.c1, c2: cubic.c2 });\n }\n }\n }\n lastCtrl = null;\n x = nx;\n y = ny;\n break;\n }\n case 'Z':\n case 'z': {\n if (!vecEq({ x, y }, { x: startX, y: startY })) {\n edges.push({ kind: 'line' });\n }\n x = startX;\n y = startY;\n flush(true);\n lastCtrl = null;\n break;\n }\n default:\n i++;\n break;\n }\n }\n\n if (started) flush(false);\n return rings;\n}\n\nexport function ringToPathD(ring: PathRing): string {\n if (ring.anchors.length === 0) return '';\n const a0 = ring.anchors[0];\n let d = `M ${fmtCoord(a0.x)} ${fmtCoord(a0.y)}`;\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const to = edgeTo(ring, i);\n const edge = ring.edges[i];\n const closingLine =\n ring.closed && i === n - 1 && (!edge || edge.kind === 'line');\n if (closingLine) continue;\n if (!edge || edge.kind === 'line') {\n d += ` L ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n } else {\n d += ` C ${fmtCoord(edge.c1.x)} ${fmtCoord(edge.c1.y)} ${fmtCoord(edge.c2.x)} ${fmtCoord(edge.c2.y)} ${fmtCoord(to.x)} ${fmtCoord(to.y)}`;\n }\n }\n if (ring.closed) d += ' Z';\n return d;\n}\n\nexport function ringsToGeometry(rings: PathRing[]): ShapeGeometry {\n const ds = rings\n .filter((ring) => ring.anchors.length >= 2)\n .map(ringToPathD)\n .filter(Boolean);\n if (ds.length === 0) {\n return { paths: [], polygons: [] };\n }\n const geometry = buildGeometryFromPaths(ds);\n return {\n ...geometry,\n polygons: geometry.polygons.map((poly) =>\n poly.length > 1 && vecEq(poly[0], poly[poly.length - 1])\n ? poly.slice(0, -1)\n : poly,\n ),\n };\n}\n\nconst ARCH_CORNER_RAD = (28 * Math.PI) / 180;\nconst MIN_ARCH_POINTS = 4;\nconst MIN_ARCH_BULGE = 3;\nconst MIN_ARCH_BULGE_RATIO = 0.035;\n/** Wider than a semicircle (0.5) is a loop, not a storefront arch. */\nconst MAX_ARCH_BULGE_RATIO = 0.65;\n\nfunction signedTurn(prev: Vec2, cur: Vec2, next: Vec2): number {\n const ax = cur.x - prev.x;\n const ay = cur.y - prev.y;\n const bx = next.x - cur.x;\n const by = next.y - cur.y;\n return Math.atan2(ax * by - ay * bx, ax * bx + ay * by);\n}\n\nfunction runLooksLikeArch(pts: Vec2[]): boolean {\n if (pts.length < MIN_ARCH_POINTS) return false;\n const a = pts[0];\n const b = pts[pts.length - 1];\n const chord = distance(a, b);\n if (chord < EPS) return false;\n let maxDev = 0;\n let side = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const proj = projectOntoSegment(pts[i], a, b);\n maxDev = Math.max(maxDev, proj.distance);\n const s = Math.sign(\n (b.x - a.x) * (pts[i].y - a.y) - (b.y - a.y) * (pts[i].x - a.x),\n );\n if (s === 0) continue;\n if (side === 0) side = s;\n else if (s !== side) return false;\n }\n if (maxDev < Math.max(MIN_ARCH_BULGE, chord * MIN_ARCH_BULGE_RATIO)) {\n return false;\n }\n if (maxDev > chord * MAX_ARCH_BULGE_RATIO) {\n return false;\n }\n for (let i = 1; i < pts.length - 1; i++) {\n if (Math.abs(signedTurn(pts[i - 1], pts[i], pts[i + 1])) > ARCH_CORNER_RAD) {\n return false;\n }\n }\n return true;\n}\n\nfunction fitCubicThroughRun(pts: Vec2[]): PathEdge {\n const from = pts[0];\n const to = pts[pts.length - 1];\n let pull = pts[Math.floor(pts.length / 2)];\n let maxDev = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = projectOntoSegment(pts[i], from, to).distance;\n if (d > maxDev) {\n maxDev = d;\n pull = pts[i];\n }\n }\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n return { kind: 'cubic', c1, c2 };\n}\n\n/**\n * Designer SVGs often flatten an arch into many short lines. Collapse those\n * runs to one cubic (2 anchors + 2 handles) when the bulge is unambiguous.\n */\nfunction cubicDeviationFromChord(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): number {\n const samples = approximateCubic(from, c1, c2, to, 16);\n let maxDev = 0;\n for (const point of samples) {\n maxDev = Math.max(maxDev, projectOntoSegment(point, from, to).distance);\n }\n return maxDev;\n}\n\n/** A cubic whose bulge is much longer than its chord is a leftover loop, not an arch. */\nexport function cubicIsRunaway(from: Vec2, c1: Vec2, c2: Vec2, to: Vec2): boolean {\n const chord = distance(from, to);\n const dev = cubicDeviationFromChord(from, c1, c2, to);\n if (chord < EPS) return dev > EPS;\n return dev > chord * MAX_ARCH_BULGE_RATIO;\n}\n\nfunction flattenRunawayCubics(ring: PathRing): PathRing {\n const n = edgeCount(ring);\n let changed = false;\n const edges = ring.edges.map((edge, i) => {\n if (i >= n || edge.kind !== 'cubic') return edge;\n if (!cubicIsRunaway(edgeFrom(ring, i), edge.c1, edge.c2, edgeTo(ring, i))) {\n return edge;\n }\n changed = true;\n return { kind: 'line' as const };\n });\n return changed ? { ...ring, edges } : ring;\n}\n\nexport function collapseLineRunsToCubics(ring: PathRing): PathRing {\n const n = ring.anchors.length;\n if (n < MIN_ARCH_POINTS) return ring;\n const idx = (i: number) => ((i % n) + n) % n;\n\n const incoming = (i: number) =>\n ring.closed ? ring.edges[idx(i - 1)] : i > 0 ? ring.edges[i - 1] : undefined;\n const outgoing = (i: number) =>\n ring.closed ? ring.edges[i] : i < n - 1 ? ring.edges[i] : undefined;\n\n const isSharp = (i: number): boolean => {\n if (!ring.closed && (i === 0 || i === n - 1)) return true;\n if (incoming(i)?.kind === 'cubic' || outgoing(i)?.kind === 'cubic') {\n return true;\n }\n return (\n Math.abs(\n signedTurn(ring.anchors[idx(i - 1)], ring.anchors[i], ring.anchors[idx(i + 1)]),\n ) > ARCH_CORNER_RAD\n );\n };\n\n let start = 0;\n if (ring.closed) {\n const sharp = [...Array(n).keys()].find(isSharp);\n if (sharp == null) return ring;\n start = sharp;\n }\n\n const outA: Vec2[] = [];\n const outE: PathEdge[] = [];\n const walk = ring.closed ? n : n - 1;\n\n const emitRun = (fromW: number, toW: number) => {\n const pts: Vec2[] = [];\n for (let w = fromW; w <= toW; w++) {\n pts.push(ring.anchors[idx(start + w)]);\n }\n const linesOnly = pts.slice(0, -1).every((_, k) => {\n const edge = ring.edges[idx(start + fromW + k)];\n return !edge || edge.kind === 'line';\n });\n if (outA.length === 0) outA.push(cloneVec(pts[0]));\n if (linesOnly && runLooksLikeArch(pts)) {\n outA.push(cloneVec(pts[pts.length - 1]));\n outE.push(fitCubicThroughRun(pts));\n return;\n }\n for (let k = 1; k < pts.length; k++) {\n outA.push(cloneVec(pts[k]));\n outE.push(ring.edges[idx(start + fromW + k - 1)] ?? { kind: 'line' });\n }\n };\n\n let last = 0;\n for (let w = 1; w <= walk; w++) {\n const i = idx(start + w);\n if (w === walk || isSharp(i)) {\n emitRun(last, w);\n last = w;\n }\n }\n\n if (\n ring.closed &&\n outA.length > 1 &&\n vecEq(outA[0], outA[outA.length - 1])\n ) {\n outA.pop();\n }\n const expected = ring.closed ? outA.length : Math.max(0, outA.length - 1);\n while (outE.length > expected) outE.pop();\n if (outA.length < 2) return ring;\n return { closed: ring.closed, anchors: outA, edges: outE };\n}\n\nexport function geometryToRings(geometry: ShapeGeometry): PathRing[] {\n const fromPaths = geometry.paths.flatMap((p) => parsePathToRings(p.d));\n const source = fromPaths.some((ring) => ring.anchors.length >= 2)\n ? fromPaths.filter((ring) => ring.anchors.length >= 2)\n : geometry.polygons\n .filter((poly) => poly.length >= 2)\n .map((poly) => ringFromPolygon(poly, true));\n return source.map((ring) => flattenRunawayCubics(collapseLineRunsToCubics(ring)));\n}\n\n/** Closest point on one ring edge — keeps the add-anchor preview on the line. */\nexport function pointOnRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): Vec2 {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).point;\n }\n return projectOntoSegment(point, from, to).point;\n}\n\nexport function nearestTOnCubic(\n point: Vec2,\n p0: Vec2,\n c1: Vec2,\n c2: Vec2,\n p3: Vec2,\n): { t: number; point: Vec2; distance: number } {\n const samples = approximateCubic(p0, c1, c2, p3, 16);\n let bestT = 0;\n let bestPt = samples[0];\n let bestD = distance(point, samples[0]);\n for (let i = 1; i < samples.length; i++) {\n const d = distance(point, samples[i]);\n if (d < bestD) {\n bestD = d;\n bestPt = samples[i];\n bestT = i / (samples.length - 1);\n }\n }\n return { t: bestT, point: bestPt, distance: bestD };\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { geometryBBox, projectOntoSegment } from '../core';\nimport {\n addVec,\n cloneVec,\n cubicHandlesForPull,\n cubicPoint,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n subVec,\n type PathRing,\n} from './pathRings';\n\nfunction clonePolygons(polygons: Vec2[][]): Vec2[][] {\n return polygons.map((poly) => poly.map((p) => ({ x: p.x, y: p.y })));\n}\n\n/** Rebuild absolute path `d` strings from polygon rings (lossy for beziers). */\nexport function polygonsToPathD(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) {\n d += ` L ${poly[i].x} ${poly[i].y}`;\n }\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nexport function polygonsToGeometry(polygons: Vec2[][]): ShapeGeometry {\n const cleaned = polygons\n .map((poly) => {\n if (\n poly.length > 1 &&\n poly[0].x === poly[poly.length - 1].x &&\n poly[0].y === poly[poly.length - 1].y\n ) {\n return poly.slice(0, -1);\n }\n return poly;\n })\n .filter((poly) => poly.length >= 3);\n return {\n paths: cleaned.map((poly) => ({\n d: polygonsToPathD([poly]),\n closed: true,\n })),\n polygons: cleaned,\n };\n}\n\nfunction commitRings(rings: PathRing[]): ShapeGeometry {\n return ringsToGeometry(rings);\n}\n\nfunction incomingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) {\n return (anchorIndex - 1 + ring.anchors.length) % ring.anchors.length;\n }\n return anchorIndex > 0 ? anchorIndex - 1 : null;\n}\n\nfunction outgoingEdgeIndex(ring: PathRing, anchorIndex: number): number | null {\n if (ring.closed) return anchorIndex;\n return anchorIndex < ring.anchors.length - 1 ? anchorIndex : null;\n}\n\nexport function translateGeometry(\n geometry: ShapeGeometry,\n dx: number,\n dy: number,\n): ShapeGeometry {\n const delta = { x: dx, y: dy };\n const rings = geometryToRings(geometry).map((ring) => ({\n closed: ring.closed,\n anchors: ring.anchors.map((p) => addVec(p, delta)),\n edges: ring.edges.map((edge) =>\n edge.kind === 'line'\n ? { kind: 'line' as const }\n : {\n kind: 'cubic' as const,\n c1: addVec(edge.c1, delta),\n c2: addVec(edge.c2, delta),\n },\n ),\n }));\n if (rings.length === 0) {\n const polygons = clonePolygons(geometry.polygons).map((poly) =>\n poly.map((p) => ({ x: p.x + dx, y: p.y + dy })),\n );\n return polygonsToGeometry(polygons);\n }\n return commitRings(rings);\n}\n\n/** Slide one side: both endpoints (and that edge's handles) move together. */\nexport function translateEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n delta: Vec2,\n): ShapeGeometry {\n if (delta.x === 0 && delta.y === 0) return geometry;\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % ring.anchors.length;\n ring.anchors[fromIdx] = addVec(ring.anchors[fromIdx], delta);\n ring.anchors[toIdx] = addVec(ring.anchors[toIdx], delta);\n const edge = ring.edges[edgeIndex];\n if (edge?.kind === 'cubic') {\n edge.c1 = addVec(edge.c1, delta);\n edge.c2 = addVec(edge.c2, delta);\n }\n const incoming = incomingEdgeIndex(ring, fromIdx);\n if (incoming != null && incoming !== edgeIndex) {\n const prev = ring.edges[incoming];\n if (prev?.kind === 'cubic') prev.c2 = addVec(prev.c2, delta);\n }\n const outgoing = outgoingEdgeIndex(ring, toIdx);\n if (outgoing != null && outgoing !== edgeIndex) {\n const next = ring.edges[outgoing];\n if (next?.kind === 'cubic') next.c1 = addVec(next.c1, delta);\n }\n return commitRings(rings);\n}\n\n/** Connected corners used to keep a dragged anchor horizontal or vertical. */\nexport function vertexNeighborPoints(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): Vec2[] {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || ring.anchors.length < 2) return [];\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return [];\n const count = ring.anchors.length;\n const prev = ring.anchors[(vertexIndex - 1 + count) % count];\n const next = ring.anchors[(vertexIndex + 1) % count];\n const points = [cloneVec(prev)];\n if (prev.x !== next.x || prev.y !== next.y) points.push(cloneVec(next));\n return points;\n}\n\nexport function moveVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || vertexIndex < 0 || vertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const prev = ring.anchors[vertexIndex];\n const delta = subVec(point, prev);\n ring.anchors[vertexIndex] = cloneVec(point);\n const incoming = incomingEdgeIndex(ring, vertexIndex);\n const outgoing = outgoingEdgeIndex(ring, vertexIndex);\n if (incoming != null) {\n const edge = ring.edges[incoming];\n if (edge?.kind === 'cubic') edge.c2 = addVec(edge.c2, delta);\n }\n if (outgoing != null) {\n const edge = ring.edges[outgoing];\n if (edge?.kind === 'cubic') edge.c1 = addVec(edge.c1, delta);\n }\n return commitRings(rings);\n}\n\nexport function moveHandle(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n handle: 1 | 2,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n if (handle === 1) edge.c1 = cloneVec(point);\n else edge.c2 = cloneVec(point);\n return commitRings(rings);\n}\n\n/** Drop both handles so the arch becomes a straight side. */\nexport function flattenCubicEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n const edge = ring?.edges[edgeIndex];\n if (!edge || edge.kind !== 'cubic') return geometry;\n ring.edges[edgeIndex] = { kind: 'line' };\n return commitRings(rings);\n}\n\n/** Pull a straight side into a cubic arch (or reshape a cubic from its chord). */\nexport function bendEdgeToCubic(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n pull: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const { c1, c2 } = cubicHandlesForPull(from, to, pull);\n ring.edges[edgeIndex] = { kind: 'cubic', c1, c2 };\n return commitRings(rings);\n}\n\n/**\n * Insert a vertex after `vertexIndex` on the given ring (before the next point).\n */\nexport function insertVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n afterVertexIndex: number,\n point: Vec2,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring || afterVertexIndex < 0 || afterVertexIndex >= ring.anchors.length) {\n return geometry;\n }\n const edgeIndex = outgoingEdgeIndex(ring, afterVertexIndex);\n if (edgeIndex == null) return geometry;\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n\n if (edge.kind === 'cubic') {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const splitT = Math.min(0.95, Math.max(0.05, t));\n const split = splitCubic(from, edge.c1, edge.c2, to, splitT);\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(split.left.to));\n ring.edges.splice(edgeIndex, 1, { kind: 'cubic', c1: split.left.c1, c2: split.left.c2 }, {\n kind: 'cubic',\n c1: split.right.c1,\n c2: split.right.c2,\n });\n } else {\n ring.anchors.splice(afterVertexIndex + 1, 0, cloneVec(point));\n ring.edges.splice(edgeIndex, 1, { kind: 'line' }, { kind: 'line' });\n }\n return commitRings(rings);\n}\n\n/** Remove a vertex; refuses to go below 3 points on a closed ring. */\nexport function removeVertex(\n geometry: ShapeGeometry,\n polygonIndex: number,\n vertexIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry);\n const ring = rings[polygonIndex];\n if (!ring) return geometry;\n const min = ring.closed ? 3 : 2;\n if (ring.anchors.length <= min) return geometry;\n if (vertexIndex < 0 || vertexIndex >= ring.anchors.length) return geometry;\n\n const n = ring.anchors.length;\n if (ring.closed) {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n const join = vertexIndex === 0 ? ring.anchors.length - 1 : vertexIndex - 1;\n if (ring.edges[join]) ring.edges[join] = { kind: 'line' };\n } else if (vertexIndex === 0) {\n ring.anchors.splice(0, 1);\n ring.edges.splice(0, 1);\n } else if (vertexIndex === n - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n } else {\n ring.anchors.splice(vertexIndex, 1);\n ring.edges.splice(vertexIndex, 1);\n ring.edges[vertexIndex - 1] = { kind: 'line' };\n }\n return commitRings(rings);\n}\n\nexport interface VertexHit {\n polygonIndex: number;\n vertexIndex: number;\n point: Vec2;\n distance: number;\n}\n\n/** Nearest path anchor within `tolerance` world units, or null. */\nexport function hitTestVertex(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): VertexHit | null {\n let best: VertexHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n ring.anchors.forEach((vertex, vertexIndex) => {\n const distance = Math.hypot(vertex.x - point.x, vertex.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = {\n polygonIndex,\n vertexIndex,\n point: { x: vertex.x, y: vertex.y },\n distance,\n };\n }\n });\n });\n return best;\n}\n\nexport interface HandleHit {\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n point: Vec2;\n distance: number;\n}\n\nexport function hitTestHandle(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): HandleHit | null {\n let best: HandleHit | null = null;\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n const n = edgeCount(ring);\n for (let edgeIndex = 0; edgeIndex < n; edgeIndex++) {\n const edge = ring.edges[edgeIndex];\n if (edge?.kind !== 'cubic') continue;\n for (const handle of [1, 2] as const) {\n const hp = handle === 1 ? edge.c1 : edge.c2;\n const distance = Math.hypot(hp.x - point.x, hp.y - point.y);\n if (distance <= tolerance && (!best || distance < best.distance)) {\n best = { ringIndex, edgeIndex, handle, point: cloneVec(hp), distance };\n }\n }\n }\n });\n return best;\n}\n\nexport interface EdgeHit {\n polygonIndex: number;\n /** Insert after this vertex index. */\n afterVertexIndex: number;\n point: Vec2;\n distance: number;\n kind: 'line' | 'cubic';\n}\n\nfunction hitEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n preferMidpoint: boolean,\n): EdgeHit | null {\n let best: EdgeHit | null = null;\n geometryToRings(geometry).forEach((ring, polygonIndex) => {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n const a = edgeFrom(ring, i);\n const b = edgeTo(ring, i);\n const edge = ring.edges[i] ?? { kind: 'line' as const };\n let candidate: Vec2;\n let dist: number;\n if (preferMidpoint) {\n candidate =\n edge.kind === 'cubic'\n ? cubicPoint(a, edge.c1, edge.c2, b, 0.5)\n : { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n dist = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n } else if (edge.kind === 'cubic') {\n const near = nearestTOnCubic(point, a, edge.c1, edge.c2, b);\n candidate = near.point;\n dist = near.distance;\n } else {\n const proj = projectOntoSegment(point, a, b);\n candidate = proj.point;\n dist = proj.distance;\n }\n if (dist <= tolerance && (!best || dist < best.distance)) {\n best = {\n polygonIndex,\n afterVertexIndex: i,\n point: candidate,\n distance: dist,\n kind: edge.kind,\n };\n }\n }\n });\n return best;\n}\n\n/** Nearest edge midpoint within tolerance for insert. */\nexport function hitTestEdgeMidpoint(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, true);\n}\n\n/** Nearest point on any edge (for dragging a line into an arch). */\nexport function hitTestEdge(\n geometry: ShapeGeometry,\n point: Vec2,\n tolerance: number,\n): EdgeHit | null {\n return hitEdge(geometry, point, tolerance, false);\n}\n\nexport function geometryWithBBox(geometry: ShapeGeometry): {\n geometry: ShapeGeometry;\n bbox: ReturnType<typeof geometryBBox>;\n} {\n return { geometry, bbox: geometryBBox(geometry) };\n}\n\nexport {\n geometryToRings,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n pointOnRingEdge,\n ringToPathD,\n} from './pathRings';\nexport type { PathRing, PathEdge } from './pathRings';\n","import type { ShapeGeometry, ShapeKind, ShapeStyle, Vec2 } from '../core';\nimport { DEFAULT_WELD_TOLERANCE, distance, projectOntoSegment } from '../core';\nimport {\n cloneVec,\n edgeCount,\n edgeFrom,\n edgeTo,\n geometryToRings,\n nearestTOnCubic,\n ringsToGeometry,\n splitCubic,\n vecEq,\n type PathEdge,\n type PathRing,\n} from './pathRings';\nimport { hitTestEdge } from './geometryEdit';\n\nconst SHARED_EDGE_TOL = 4;\n\nexport type OpenEndId = {\n shapeId: number;\n ringIndex: number;\n end: 'start' | 'end';\n};\n\nexport type OpenEndHit = OpenEndId & { point: Vec2; distance: number };\n\nexport type SplitJoinEdgeHit = {\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n shared: boolean;\n distance: number;\n};\n\nexport type ShapeGeo = {\n id: number;\n kind: ShapeKind;\n style?: ShapeStyle;\n geometry: ShapeGeometry;\n};\n\nexport type ShapeBatchEdit =\n | { action: 'update'; shapeId: number; geometry: ShapeGeometry }\n | {\n action: 'create';\n kind: ShapeKind;\n geometry: ShapeGeometry;\n style?: ShapeStyle;\n }\n | { action: 'delete'; shapeId: number };\n\nexport function canSplitJoinKind(kind: ShapeKind): boolean {\n return kind === 'unit' || kind === 'amenity' || kind === 'parking_zone';\n}\n\nexport function sameOpenEnd(a: OpenEndId, b: OpenEndId): boolean {\n return a.shapeId === b.shapeId && a.ringIndex === b.ringIndex && a.end === b.end;\n}\n\nfunction cloneEdge(edge: PathEdge): PathEdge {\n return edge.kind === 'line'\n ? { kind: 'line' }\n : { kind: 'cubic', c1: cloneVec(edge.c1), c2: cloneVec(edge.c2) };\n}\n\nfunction cloneRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec),\n edges: ring.edges.map(cloneEdge),\n };\n}\n\nfunction reverseEdge(edge: PathEdge): PathEdge {\n if (edge.kind === 'line') return { kind: 'line' };\n return { kind: 'cubic', c1: cloneVec(edge.c2), c2: cloneVec(edge.c1) };\n}\n\nfunction reverseRing(ring: PathRing): PathRing {\n return {\n closed: ring.closed,\n anchors: ring.anchors.map(cloneVec).reverse(),\n edges: ring.edges.map(cloneEdge).reverse().map(reverseEdge),\n };\n}\n\nfunction maybeCloseCoincident(ring: PathRing, tol: number): PathRing {\n if (ring.closed || ring.anchors.length < 3) return ring;\n const first = ring.anchors[0];\n const last = ring.anchors[ring.anchors.length - 1];\n if (!vecEq(first, last, tol)) return ring;\n const next = cloneRing(ring);\n next.anchors.pop();\n next.closed = true;\n const expected = next.anchors.length;\n while (next.edges.length > expected) next.edges.pop();\n while (next.edges.length < expected) next.edges.push({ kind: 'line' });\n return next;\n}\n\nexport function listOpenEnds(geometry: ShapeGeometry): Array<{\n ringIndex: number;\n end: 'start' | 'end';\n point: Vec2;\n}> {\n const out: Array<{ ringIndex: number; end: 'start' | 'end'; point: Vec2 }> = [];\n geometryToRings(geometry).forEach((ring, ringIndex) => {\n if (ring.closed || ring.anchors.length < 2) return;\n out.push({\n ringIndex,\n end: 'start',\n point: cloneVec(ring.anchors[0]),\n });\n out.push({\n ringIndex,\n end: 'end',\n point: cloneVec(ring.anchors[ring.anchors.length - 1]),\n });\n });\n return out;\n}\n\nfunction distToRingEdge(ring: PathRing, edgeIndex: number, point: Vec2): number {\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n return nearestTOnCubic(point, from, edge.c1, edge.c2, to).distance;\n }\n return projectOntoSegment(point, from, to).distance;\n}\n\nfunction pointOnRingBoundary(point: Vec2, ring: PathRing, tol: number): boolean {\n const n = edgeCount(ring);\n for (let i = 0; i < n; i++) {\n if (distToRingEdge(ring, i, point) <= tol) return true;\n }\n return false;\n}\n\nexport function edgeLiesOnOtherShape(\n from: Vec2,\n to: Vec2,\n others: Array<{ geometry: ShapeGeometry }>,\n tol = SHARED_EDGE_TOL,\n): boolean {\n const mid = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n for (const other of others) {\n const rings = geometryToRings(other.geometry);\n const onBoundary = rings.some(\n (ring) =>\n pointOnRingBoundary(from, ring, tol) &&\n pointOnRingBoundary(to, ring, tol) &&\n pointOnRingBoundary(mid, ring, tol),\n );\n if (onBoundary) return true;\n const open = listOpenEnds(other.geometry);\n if (open.length >= 2) {\n const near = (p: Vec2) =>\n open.some((end) => distance(end.point, p) <= tol);\n if (near(from) && near(to)) return true;\n }\n }\n return false;\n}\n\nfunction cutPointsOnLine(\n from: Vec2,\n to: Vec2,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-6) return null;\n const half = Math.min(Math.max(gap, 0.35) / 2, len * 0.2);\n if (half < 0.12) return null;\n const ux = dx / len;\n const uy = dy / len;\n const proj = projectOntoSegment(point, from, to).point;\n let t = (proj.x - from.x) * ux + (proj.y - from.y) * uy;\n t = Math.min(len - half, Math.max(half, t));\n return {\n p1: { x: from.x + ux * (t - half), y: from.y + uy * (t - half) },\n p2: { x: from.x + ux * (t + half), y: from.y + uy * (t + half) },\n };\n}\n\nfunction cutPointsOnCubic(\n from: Vec2,\n edge: Extract<PathEdge, { kind: 'cubic' }>,\n to: Vec2,\n point: Vec2,\n gap: number,\n): {\n p1: Vec2;\n p2: Vec2;\n leftEdge: PathEdge;\n rightEdge: PathEdge;\n} | null {\n const { t } = nearestTOnCubic(point, from, edge.c1, edge.c2, to);\n const chord = Math.hypot(to.x - from.x, to.y - from.y);\n const dt =\n chord > 1e-6\n ? Math.min(0.04, Math.max(0.006, gap / (2 * chord)))\n : 0.015;\n const t1 = Math.min(0.92, Math.max(0.04, t - dt));\n const t2 = Math.min(0.96, Math.max(t1 + 0.012, t + dt));\n if (t2 - t1 < 0.01) return null;\n const first = splitCubic(from, edge.c1, edge.c2, to, t1);\n const local = (t2 - t1) / Math.max(1e-6, 1 - t1);\n const second = splitCubic(\n first.left.to,\n first.right.c1,\n first.right.c2,\n to,\n local,\n );\n return {\n p1: cloneVec(first.left.to),\n p2: cloneVec(second.left.to),\n leftEdge: { kind: 'cubic', c1: first.left.c1, c2: first.left.c2 },\n rightEdge: { kind: 'cubic', c1: second.right.c1, c2: second.right.c2 },\n };\n}\n\nfunction rebuildOpenFromClosedCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing {\n const n = ring.anchors.length;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(p2), cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [cloneEdge(rightEdge)];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n anchors.push(cloneVec(p1));\n edges.push(cloneEdge(leftEdge));\n return { closed: false, anchors, edges };\n}\n\nfunction splitOpenRingAtCut(\n ring: PathRing,\n edgeIndex: number,\n p1: Vec2,\n p2: Vec2,\n leftEdge: PathEdge,\n rightEdge: PathEdge,\n): PathRing[] {\n const fromIdx = edgeIndex;\n const toIdx = edgeIndex + 1;\n const left: PathRing = {\n closed: false,\n anchors: [...ring.anchors.slice(0, fromIdx + 1).map(cloneVec), cloneVec(p1)],\n edges: [\n ...ring.edges.slice(0, fromIdx).map(cloneEdge),\n cloneEdge(leftEdge),\n ],\n };\n const right: PathRing = {\n closed: false,\n anchors: [cloneVec(p2), ...ring.anchors.slice(toIdx).map(cloneVec)],\n edges: [cloneEdge(rightEdge), ...ring.edges.slice(toIdx).map(cloneEdge)],\n };\n return [left, right].filter((item) => item.anchors.length >= 2);\n}\n\nexport function openWholeEdge(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n\n if (ring.closed) {\n const n = ring.anchors.length;\n if (n < 3) return geometry;\n const fromIdx = edgeIndex;\n const toIdx = (edgeIndex + 1) % n;\n const anchors = [cloneVec(ring.anchors[toIdx])];\n const edges: PathEdge[] = [];\n let i = toIdx;\n while (i !== fromIdx) {\n const next = (i + 1) % n;\n edges.push(cloneEdge(ring.edges[i]));\n anchors.push(cloneVec(ring.anchors[next]));\n i = next;\n }\n rings[ringIndex] = { closed: false, anchors, edges };\n return ringsToGeometry(rings);\n }\n\n if (edgeIndex === 0) {\n ring.anchors.shift();\n ring.edges.shift();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n if (edgeIndex === ring.edges.length - 1) {\n ring.anchors.pop();\n ring.edges.pop();\n if (ring.anchors.length < 2) rings.splice(ringIndex, 1);\n return ringsToGeometry(rings);\n }\n\n const left: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(0, edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(0, edgeIndex).map(cloneEdge),\n };\n const right: PathRing = {\n closed: false,\n anchors: ring.anchors.slice(edgeIndex + 1).map(cloneVec),\n edges: ring.edges.slice(edgeIndex + 1).map(cloneEdge),\n };\n const next = [left, right].filter((item) => item.anchors.length >= 2);\n rings.splice(ringIndex, 1, ...next);\n return ringsToGeometry(rings);\n}\n\nexport function cutEdgeOpen(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ring = rings[ringIndex];\n if (!ring || edgeIndex < 0 || edgeIndex >= edgeCount(ring)) return geometry;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n\n let p1: Vec2;\n let p2: Vec2;\n let leftEdge: PathEdge;\n let rightEdge: PathEdge;\n\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = cut.leftEdge;\n rightEdge = cut.rightEdge;\n } else {\n const cut = cutPointsOnLine(from, to, point, gap);\n if (!cut) return openWholeEdge(geometry, ringIndex, edgeIndex);\n p1 = cut.p1;\n p2 = cut.p2;\n leftEdge = { kind: 'line' };\n rightEdge = { kind: 'line' };\n }\n\n if (ring.closed) {\n rings[ringIndex] = rebuildOpenFromClosedCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n return ringsToGeometry(rings);\n }\n\n const pieces = splitOpenRingAtCut(\n ring,\n edgeIndex,\n p1,\n p2,\n leftEdge,\n rightEdge,\n );\n rings.splice(ringIndex, 1, ...pieces);\n return ringsToGeometry(rings);\n}\n\nfunction concatOpenRings(left: PathRing, right: PathRing, tol: number): PathRing {\n const leftEnd = left.anchors[left.anchors.length - 1];\n const rightStart = right.anchors[0];\n const weld = vecEq(leftEnd, rightStart, tol);\n const anchors = weld\n ? [...left.anchors.map(cloneVec), ...right.anchors.slice(1).map(cloneVec)]\n : [...left.anchors.map(cloneVec), ...right.anchors.map(cloneVec)];\n const edges = weld\n ? [...left.edges.map(cloneEdge), ...right.edges.map(cloneEdge)]\n : [...left.edges.map(cloneEdge), { kind: 'line' as const }, ...right.edges.map(cloneEdge)];\n return maybeCloseCoincident({ closed: false, anchors, edges }, tol);\n}\n\nfunction closeOpenRing(ring: PathRing, tol: number): PathRing {\n const coincident = vecEq(\n ring.anchors[0],\n ring.anchors[ring.anchors.length - 1],\n tol,\n );\n if (coincident) return maybeCloseCoincident(ring, tol);\n return {\n closed: true,\n anchors: ring.anchors.map(cloneVec),\n edges: [...ring.edges.map(cloneEdge), { kind: 'line' }],\n };\n}\n\nexport function joinOpenEndpoints(\n geometry: ShapeGeometry,\n a: { ringIndex: number; end: 'start' | 'end' },\n b: { ringIndex: number; end: 'start' | 'end' },\n tol = DEFAULT_WELD_TOLERANCE,\n): ShapeGeometry {\n const rings = geometryToRings(geometry).map(cloneRing);\n const ra = rings[a.ringIndex];\n const rb = rings[b.ringIndex];\n if (!ra || !rb || ra.closed || rb.closed) return geometry;\n\n if (a.ringIndex === b.ringIndex) {\n if (a.end === b.end) return geometry;\n rings[a.ringIndex] = closeOpenRing(ra, tol);\n return ringsToGeometry(rings);\n }\n\n const left = a.end === 'end' ? cloneRing(ra) : reverseRing(ra);\n const right = b.end === 'start' ? cloneRing(rb) : reverseRing(rb);\n const joined = concatOpenRings(left, right, tol);\n const keep = Math.min(a.ringIndex, b.ringIndex);\n const drop = Math.max(a.ringIndex, b.ringIndex);\n rings[keep] = joined;\n rings.splice(drop, 1);\n return ringsToGeometry(rings);\n}\n\nfunction joinAcrossShapes(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n tol: number,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n const ia = shapes.findIndex((s) => s.id === a.shapeId);\n const ib = shapes.findIndex((s) => s.id === b.shapeId);\n if (ia < 0 || ib < 0) return { shapes, deleteIds: [] };\n\n if (a.shapeId === b.shapeId) {\n const next = shapes.slice();\n next[ia] = {\n ...next[ia],\n geometry: joinOpenEndpoints(next[ia].geometry, a, b, tol),\n };\n return { shapes: next, deleteIds: [] };\n }\n\n const ringsA = geometryToRings(shapes[ia].geometry).map(cloneRing);\n const ringsB = geometryToRings(shapes[ib].geometry).map(cloneRing);\n const offset = ringsA.length;\n const merged = ringsToGeometry([...ringsA, ...ringsB]);\n const joined = joinOpenEndpoints(\n merged,\n a,\n { ringIndex: b.ringIndex + offset, end: b.end },\n tol,\n );\n const next = shapes\n .filter((s) => s.id !== b.shapeId)\n .map((s) => (s.id === a.shapeId ? { ...s, geometry: joined } : s));\n return { shapes: next, deleteIds: [b.shapeId] };\n}\n\nexport function weldCoincidentOpenEnds(\n shapes: ShapeGeo[],\n tol = DEFAULT_WELD_TOLERANCE,\n): { shapes: ShapeGeo[]; deleteIds: number[] } {\n let current = shapes;\n const deleteIds: number[] = [];\n for (let n = 0; n < 24; n++) {\n const ends: OpenEndHit[] = [];\n for (const shape of current) {\n for (const end of listOpenEnds(shape.geometry)) {\n ends.push({\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n point: end.point,\n distance: 0,\n });\n }\n }\n let best: { a: OpenEndHit; b: OpenEndHit; dist: number } | null = null;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const a = ends[i];\n const b = ends[j];\n if (a.shapeId === b.shapeId && a.ringIndex === b.ringIndex) continue;\n const dist = distance(a.point, b.point);\n const pairTol = a.shapeId === b.shapeId ? Math.min(tol, 0.75) : tol;\n if (dist <= pairTol && (!best || dist < best.dist)) {\n best = { a, b, dist };\n }\n }\n }\n if (!best) break;\n const joined = joinAcrossShapes(current, best.a, best.b, tol);\n current = joined.shapes;\n deleteIds.push(...joined.deleteIds);\n }\n return { shapes: current, deleteIds };\n}\n\nexport function forkClosedRings(shape: ShapeGeo): {\n keep: ShapeGeo;\n extras: ShapeGeometry[];\n} {\n const rings = geometryToRings(shape.geometry);\n const closed = rings.filter((ring) => ring.closed && ring.anchors.length >= 3);\n const opens = rings.filter((ring) => !ring.closed && ring.anchors.length >= 2);\n if (closed.length <= 1) {\n return { keep: shape, extras: [] };\n }\n return {\n keep: {\n ...shape,\n geometry: ringsToGeometry([closed[0], ...opens]),\n },\n extras: closed.slice(1).map((ring) => ringsToGeometry([ring])),\n };\n}\n\nfunction finishEdits(\n before: ShapeGeo[],\n working: ShapeGeo[],\n extraDeletes: number[],\n): ShapeBatchEdit[] {\n const welded = weldCoincidentOpenEnds(working);\n const deleteSet = new Set([...extraDeletes, ...welded.deleteIds]);\n const extras: Array<{ fromId: number; geometry: ShapeGeometry; kind: ShapeKind; style?: ShapeStyle }> =\n [];\n const kept: ShapeGeo[] = [];\n for (const shape of welded.shapes) {\n if (deleteSet.has(shape.id)) continue;\n const forked = forkClosedRings(shape);\n kept.push(forked.keep);\n for (const geometry of forked.extras) {\n extras.push({\n fromId: shape.id,\n geometry,\n kind: shape.kind,\n style: shape.style,\n });\n }\n }\n\n const edits: ShapeBatchEdit[] = [];\n const beforeById = new Map(before.map((s) => [s.id, s]));\n for (const shape of kept) {\n const prev = beforeById.get(shape.id);\n if (!prev) continue;\n if (JSON.stringify(prev.geometry) !== JSON.stringify(shape.geometry)) {\n edits.push({\n action: 'update',\n shapeId: shape.id,\n geometry: shape.geometry,\n });\n }\n }\n for (const extra of extras) {\n edits.push({\n action: 'create',\n kind: extra.kind,\n geometry: extra.geometry,\n style: extra.style,\n });\n }\n for (const id of deleteSet) {\n if (beforeById.has(id)) edits.push({ action: 'delete', shapeId: id });\n }\n return edits;\n}\n\nexport function applySplitJoinCut(\n shapes: ShapeGeo[],\n hit: { shapeId: number; ringIndex: number; edgeIndex: number; point: Vec2 },\n gap: number,\n): ShapeBatchEdit[] {\n const target = shapes.find((s) => s.id === hit.shapeId);\n if (!target) return [];\n const others = shapes.filter((s) => s.id !== hit.shapeId);\n const rings = geometryToRings(target.geometry);\n const ring = rings[hit.ringIndex];\n if (!ring) return [];\n const from = edgeFrom(ring, hit.edgeIndex);\n const to = edgeTo(ring, hit.edgeIndex);\n const shared = edgeLiesOnOtherShape(from, to, others);\n const nextGeo = shared\n ? openWholeEdge(target.geometry, hit.ringIndex, hit.edgeIndex)\n : cutEdgeOpen(target.geometry, hit.ringIndex, hit.edgeIndex, hit.point, gap);\n const next = shapes.map((s) =>\n s.id === hit.shapeId ? { ...s, geometry: nextGeo } : s,\n );\n return finishEdits(shapes, next, []);\n}\n\nexport function applySplitJoinJoin(\n shapes: ShapeGeo[],\n a: OpenEndId,\n b: OpenEndId,\n): ShapeBatchEdit[] {\n if (sameOpenEnd(a, b)) return [];\n const joined = joinAcrossShapes(shapes, a, b, DEFAULT_WELD_TOLERANCE);\n return finishEdits(shapes, joined.shapes, joined.deleteIds);\n}\n\nexport function hitOpenEnd(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n skip?: OpenEndId | null,\n): OpenEndHit | null {\n let best: OpenEndHit | null = null;\n for (const shape of shapes) {\n for (const end of listOpenEnds(shape.geometry)) {\n const id: OpenEndId = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n if (skip && sameOpenEnd(skip, id)) continue;\n const dist = distance(point, end.point);\n if (dist > tol) continue;\n const preferOther =\n skip &&\n (shape.id !== skip.shapeId || end.ringIndex !== skip.ringIndex);\n const bestPrefer =\n best &&\n skip &&\n (best.shapeId !== skip.shapeId || best.ringIndex !== skip.ringIndex);\n if (\n !best ||\n (preferOther && !bestPrefer) ||\n (preferOther === bestPrefer && dist < best.distance)\n ) {\n best = { ...id, point: end.point, distance: dist };\n }\n }\n }\n return best;\n}\n\nexport function hitSplitJoinEdge(\n shapes: ShapeGeo[],\n point: Vec2,\n tol: number,\n): SplitJoinEdgeHit | null {\n let best: SplitJoinEdgeHit | null = null;\n for (const shape of shapes) {\n const hit = hitTestEdge(shape.geometry, point, tol);\n if (!hit) continue;\n if (!best || hit.distance < best.distance) {\n const rings = geometryToRings(shape.geometry);\n const ring = rings[hit.polygonIndex];\n const from = ring ? edgeFrom(ring, hit.afterVertexIndex) : point;\n const to = ring ? edgeTo(ring, hit.afterVertexIndex) : point;\n best = {\n shapeId: shape.id,\n ringIndex: hit.polygonIndex,\n edgeIndex: hit.afterVertexIndex,\n point: hit.point,\n shared: edgeLiesOnOtherShape(\n from,\n to,\n shapes.filter((s) => s.id !== shape.id),\n ),\n distance: hit.distance,\n };\n }\n }\n return best;\n}\n\nexport function previewCutPoints(\n geometry: ShapeGeometry,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n gap: number,\n): { p1: Vec2; p2: Vec2 } | null {\n const rings = geometryToRings(geometry);\n const ring = rings[ringIndex];\n if (!ring) return null;\n const from = edgeFrom(ring, edgeIndex);\n const to = edgeTo(ring, edgeIndex);\n const edge = ring.edges[edgeIndex] ?? { kind: 'line' as const };\n if (edge.kind === 'cubic') {\n const cut = cutPointsOnCubic(from, edge, to, point, gap);\n return cut ? { p1: cut.p1, p2: cut.p2 } : null;\n }\n return cutPointsOnLine(from, to, point, gap);\n}\n","import type { Vec2 } from '../core';\n\n/** Closest candidate within `tol` world units, or null. */\nexport function nearestSnapPoint(\n point: Vec2,\n candidates: Vec2[],\n tol: number,\n): Vec2 | null {\n let best: { point: Vec2; distance: number } | null = null;\n for (const candidate of candidates) {\n const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n if (distance <= tol && (!best || distance < best.distance)) {\n best = { point: candidate, distance };\n }\n }\n return best ? { x: best.point.x, y: best.point.y } : null;\n}\n\nexport function sameSnapPoint(a: Vec2 | null, b: Vec2 | null, eps = 1e-4): boolean {\n if (!a || !b) return false;\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps;\n}\n","import type { Vec2 } from '../core';\n\nexport type OrthoAxis = 'horizontal' | 'vertical';\n\nexport interface OrthoConstraint {\n point: Vec2;\n axis: OrthoAxis;\n /** Point the guide line passes through. */\n through: Vec2;\n}\n\n/** Snap `cursor` to the dominant 0° or 90° axis through `origin`. */\nexport function constrainOrthogonal(origin: Vec2, cursor: Vec2): OrthoConstraint {\n const dx = Math.abs(cursor.x - origin.x);\n const dy = Math.abs(cursor.y - origin.y);\n if (dx >= dy) {\n return {\n point: { x: cursor.x, y: origin.y },\n axis: 'horizontal',\n through: origin,\n };\n }\n return {\n point: { x: origin.x, y: cursor.y },\n axis: 'vertical',\n through: origin,\n };\n}\n\n/**\n * Move a dragged anchor onto the nearest horizontal or vertical line through\n * one of its connected neighbors.\n */\nexport function constrainVertexOrthogonal(\n cursor: Vec2,\n neighbors: readonly Vec2[],\n): OrthoConstraint | null {\n let best: (OrthoConstraint & { dist: number }) | null = null;\n for (const neighbor of neighbors) {\n const options: OrthoConstraint[] = [\n {\n point: { x: cursor.x, y: neighbor.y },\n axis: 'horizontal',\n through: neighbor,\n },\n {\n point: { x: neighbor.x, y: cursor.y },\n axis: 'vertical',\n through: neighbor,\n },\n ];\n for (const option of options) {\n const dist = Math.hypot(option.point.x - cursor.x, option.point.y - cursor.y);\n if (\n !best ||\n dist < best.dist - 1e-6 ||\n (Math.abs(dist - best.dist) <= 1e-6 && option.axis === 'horizontal' && best.axis !== 'horizontal')\n ) {\n best = { ...option, dist };\n }\n }\n }\n if (!best) return null;\n return { point: best.point, axis: best.axis, through: best.through };\n}\n\nexport function isSpacePanKey(event: { key: string; code?: string }): boolean {\n return event.key === ' ' || event.code === 'Space';\n}\n","import type { ShapeGeometry, Vec2 } from '../core';\nimport { buildGeometryFromPaths } from '../core';\n\nexport interface EllipseBounds {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n}\n\n/** Drag from corner `from` to `to`. Shift / lockCircle keeps rx === ry. */\nexport function ellipseBoundsFromDrag(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): EllipseBounds {\n let x1 = to.x;\n let y1 = to.y;\n if (lockCircle) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx === 0 ? (dy === 0 ? 1 : Math.sign(dy)) : Math.sign(dx);\n const sy = dy === 0 ? (dx === 0 ? 1 : Math.sign(dx)) : Math.sign(dy);\n x1 = from.x + sx * side;\n y1 = from.y + sy * side;\n }\n const rx = Math.abs(x1 - from.x) / 2;\n const ry = Math.abs(y1 - from.y) / 2;\n return {\n cx: (from.x + x1) / 2,\n cy: (from.y + y1) / 2,\n rx,\n ry,\n };\n}\n\nexport function ellipsePathD(bounds: EllipseBounds): string {\n const { cx, cy, rx, ry } = bounds;\n const arx = Math.max(rx, 1e-4);\n const ary = Math.max(ry, 1e-4);\n return `M ${cx - arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx + arx} ${cy} A ${arx} ${ary} 0 1 0 ${cx - arx} ${cy} Z`;\n}\n\nexport function ellipseGeometry(\n from: Vec2,\n to: Vec2,\n lockCircle = false,\n): ShapeGeometry {\n return buildGeometryFromPaths([\n ellipsePathD(ellipseBoundsFromDrag(from, to, lockCircle)),\n ]);\n}\n","import type { BBox, ShapeGeometry, ShapeLabel, Vec2, ViewBox } from '../core';\nimport { geometryBBox } from '../core';\nimport { MAP_FONT_FAMILY, MAP_LABEL_LINE_HEIGHT } from '../fonts/mapFont';\nimport { polygonsToGeometry } from './geometryEdit';\n\nexport const DEFAULT_LABEL_TEXT = 'Text';\nexport const DEFAULT_LABEL_SIZE = 48;\nexport const LABEL_FONT_FAMILY = MAP_FONT_FAMILY;\nexport const LABEL_LINE_HEIGHT = MAP_LABEL_LINE_HEIGHT;\n/** Fallback advance when canvas measurement is unavailable (tests / SSR). */\nconst FALLBACK_CHAR_ADVANCE = 0.5;\n\nexport function isTextLabel(shape: {\n kind: string;\n label?: { text?: string } | null;\n}): boolean {\n return shape.kind === 'label' && Boolean(shape.label?.text?.trim());\n}\n\nexport function defaultLabelSize(_viewbox?: ViewBox): number {\n return DEFAULT_LABEL_SIZE;\n}\n\nexport function labelTextLines(text: string): string[] {\n const source = text.replace(/\\r\\n/g, '\\n').trim() || DEFAULT_LABEL_TEXT;\n return source.split('\\n');\n}\n\nlet measureCtx: CanvasRenderingContext2D | null | undefined;\n\nfunction textMeasureContext(): CanvasRenderingContext2D | null {\n if (measureCtx !== undefined) return measureCtx;\n if (typeof document === 'undefined') {\n measureCtx = null;\n return null;\n }\n const canvas = document.createElement('canvas');\n measureCtx = canvas.getContext('2d');\n return measureCtx;\n}\n\nexport function measureLabelText(\n text: string,\n size: number,\n): { width: number; height: number; lines: string[] } {\n const lines = labelTextLines(text);\n const ctx = textMeasureContext();\n let width = 0;\n if (ctx) {\n ctx.font = `${size}px ${LABEL_FONT_FAMILY}`;\n for (const line of lines) {\n width = Math.max(width, ctx.measureText(line || ' ').width);\n }\n } else {\n const longest = lines.reduce((max, line) => Math.max(max, line.length), 1);\n width = longest * size * FALLBACK_CHAR_ADVANCE;\n }\n return {\n width: Math.max(width, size * 0.2),\n height: Math.max(lines.length, 1) * size * LABEL_LINE_HEIGHT,\n lines,\n };\n}\n\nexport function labelBoxCenter(box: BBox): Vec2 {\n return { x: (box.minX + box.maxX) / 2, y: (box.minY + box.maxY) / 2 };\n}\n\nexport function textLabelPolygon(origin: Vec2, text: string, size: number): Vec2[] {\n const { width, height } = measureLabelText(text, size);\n return [\n { x: origin.x, y: origin.y - height },\n { x: origin.x + width, y: origin.y - height },\n { x: origin.x + width, y: origin.y },\n { x: origin.x, y: origin.y },\n ];\n}\n\nexport function textLabelGeometry(\n origin: Vec2,\n text: string,\n size: number,\n): ShapeGeometry {\n return polygonsToGeometry([textLabelPolygon(origin, text, size)]);\n}\n\nexport function defaultTextLabel(text: string, size: number, color?: string): ShapeLabel {\n return {\n text: text.trim() || DEFAULT_LABEL_TEXT,\n size,\n color,\n autoFit: true,\n };\n}\n\n/** Keep the box anchored at the current bottom-left when the string changes. */\nexport function geometryForLabelText(\n geometry: ShapeGeometry,\n text: string,\n size: number,\n): ShapeGeometry {\n const box = geometryBBox(geometry);\n return textLabelGeometry({ x: box.minX, y: box.maxY }, text, size);\n}\n","import type { ShapeGeometry, ShapeLabel, Vec2 } from '../core';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n geometryBBox,\n isEntranceIcon,\n} from '../core';\nimport { polygonsToGeometry } from './geometryEdit';\nimport { isTextLabel, labelBoxCenter } from './labelText';\n\nexport {\n DEFAULT_ENTRANCE_SIZE,\n ENTRANCE_ICON_ID,\n canonicalizeEntranceLabel,\n clampEntranceSize,\n isEntranceIcon,\n};\n\nexport function isStampShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return isTextLabel(shape) || isEntranceIcon(shape);\n}\n\nexport function defaultEntranceLabel(size: number, color?: string): ShapeLabel {\n return {\n imageKey: ENTRANCE_ICON_ID,\n size: clampEntranceSize(size),\n color,\n rotate: 0,\n };\n}\n\nexport function entranceIconPolygon(center: Vec2, size: number): Vec2[] {\n const half = clampEntranceSize(size) / 2;\n return [\n { x: center.x - half, y: center.y - half },\n { x: center.x + half, y: center.y - half },\n { x: center.x + half, y: center.y + half },\n { x: center.x - half, y: center.y + half },\n ];\n}\n\nexport function entranceIconGeometry(center: Vec2, size: number): ShapeGeometry {\n return polygonsToGeometry([entranceIconPolygon(center, size)]);\n}\n\n/** Keep the icon centred when Size changes. */\nexport function geometryForEntranceIcon(\n geometry: ShapeGeometry,\n size: number,\n): ShapeGeometry {\n return entranceIconGeometry(labelBoxCenter(geometryBBox(geometry)), size);\n}\n","import type { Vec2 } from '../../core';\nimport { nextZoomFromWheel } from '../../core/wheelZoom';\n\n/** 2D affine matrix in DOMMatrix / SVGMatrix layout (a c e / b d f). */\nexport interface Affine2 {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport interface ViewBoxRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ClientRectLike {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Map a client (CSS pixel) point through the inverse of an SVG screen CTM.\n * Prefer {@link clientRectToViewBox} for pointer mapping — `getScreenCTM()` on\n * the root `<svg>` is wrong inside transformed admin-portal layout.\n */\nexport function clientToUser(ctm: Affine2, clientX: number, clientY: number): Vec2 {\n const det = ctm.a * ctm.d - ctm.b * ctm.c;\n if (det === 0) return { x: 0, y: 0 };\n const x = clientX - ctm.e;\n const y = clientY - ctm.f;\n return {\n x: (ctm.d * x - ctm.c * y) / det,\n y: (-ctm.b * x + ctm.a * y) / det,\n };\n}\n\n/**\n * Viewport point → SVG viewBox user space, same method OrbitControls uses\n * (`getBoundingClientRect` + letterboxed viewBox). Default map zoom-to-cursor\n * works in admin-portal because of this; Edit Map must not use `getScreenCTM()`.\n *\n * Assumes `preserveAspectRatio=\"xMidYMid meet\"` (editor canvas default).\n */\nexport function clientRectToViewBox(\n rect: ClientRectLike,\n viewBox: ViewBoxRect,\n clientX: number,\n clientY: number,\n): Vec2 {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n if (!(scale > 0) || !Number.isFinite(scale)) {\n return { x: viewBox.x, y: viewBox.y };\n }\n const originX = rect.left + (rect.width - vbW * scale) / 2;\n const originY = rect.top + (rect.height - vbH * scale) / 2;\n return {\n x: viewBox.x + (clientX - originX) / scale,\n y: viewBox.y + (clientY - originY) / scale,\n };\n}\n\nexport function pxPerUserFromViewBox(rect: ClientRectLike, viewBox: ViewBoxRect): number {\n const vbW = viewBox.width > 0 ? viewBox.width : Math.max(rect.width, 1);\n const vbH = viewBox.height > 0 ? viewBox.height : Math.max(rect.height, 1);\n const scale = Math.min(rect.width / vbW, rect.height / vbH);\n return scale > 0 && Number.isFinite(scale) ? scale : 1;\n}\n\nfunction readSvgViewBox(svg: SVGSVGElement): ViewBoxRect | null {\n const vb = svg.viewBox?.baseVal;\n if (vb && vb.width > 0 && vb.height > 0) {\n return { x: vb.x, y: vb.y, width: vb.width, height: vb.height };\n }\n const attr = svg.getAttribute('viewBox');\n if (!attr) return null;\n const parts = attr.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n))) return null;\n if (parts[2] <= 0 || parts[3] <= 0) return null;\n return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n\nexport function clientToSvgUser(svg: SVGSVGElement, clientX: number, clientY: number): Vec2 {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) {\n return clientRectToViewBox(svg.getBoundingClientRect(), viewBox, clientX, clientY);\n }\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n return clientToUser(ctm, clientX, clientY);\n}\n\nexport function pxPerUserFromSvg(svg: SVGSVGElement): number {\n const viewBox = readSvgViewBox(svg);\n if (viewBox) return pxPerUserFromViewBox(svg.getBoundingClientRect(), viewBox);\n const ctm = svg.getScreenCTM();\n if (!ctm) return 1;\n return pxPerUserFromCtm(ctm);\n}\n\n/** Invert `translate(pan) scale(zoom)` so a user-space point becomes world geometry. */\nexport function userToWorld(user: Vec2, pan: Vec2, zoom: number): Vec2 {\n const z = zoom === 0 ? 1 : zoom;\n return {\n x: (user.x - pan.x) / z,\n y: (user.y - pan.y) / z,\n };\n}\n\nexport const EDITOR_MIN_ZOOM = 0.2;\n/** High enough that designers can park on a single storefront or route node. */\nexport const EDITOR_MAX_ZOOM = 128;\n\nexport function clampEditorZoom(zoom: number): number {\n return Math.min(EDITOR_MAX_ZOOM, Math.max(EDITOR_MIN_ZOOM, zoom));\n}\n\n/** Same per-event step as PORTAL default MapViewer (three-stdlib OrbitControls). */\nexport function nextEditorZoomFromWheel(\n currentZoom: number,\n event: Pick<WheelEvent, 'deltaY'>,\n): number {\n return nextZoomFromWheel(currentZoom, event.deltaY, {\n min: EDITOR_MIN_ZOOM,\n max: EDITOR_MAX_ZOOM,\n });\n}\n\n/** CSS pixels per SVG user unit from a screen CTM (ignores translation). */\nexport function pxPerUserFromCtm(ctm: Affine2): number {\n return Math.hypot(ctm.a, ctm.b);\n}\n\n/** World-space length that draws as `px` CSS pixels after `scale(zoom)`. */\nexport function screenPxToWorld(px: number, zoom: number, pxPerUser: number): number {\n const z = zoom === 0 ? 1 : zoom;\n const scale = pxPerUser > 0 ? pxPerUser : 1;\n return px / (scale * z);\n}\n\n/**\n * Counter-scale for editor handles whose world radius was computed at\n * `sizeZoom` while the SVG group is already at `liveZoom`.\n *\n * Wheel zoom paints `scale(liveZoom)` immediately and defers React, so\n * handle radii stay at the last settled zoom. This ratio keeps those\n * circles screen-constant without re-rendering the floor.\n */\nexport function editorHandleScale(sizeZoom: number, liveZoom: number): number {\n const size = sizeZoom === 0 ? 1 : sizeZoom;\n const live = liveZoom === 0 ? 1 : liveZoom;\n return size / live;\n}\n\n/**\n * Next pan so `user` (cursor or pinch midpoint in viewBox space) stays over\n * the same world point after `zoom` → `nextZoom`. Without this, SVG\n * `scale()` pivots around the viewBox origin (top-left).\n */\nexport function panAfterZoom(\n user: Vec2,\n pan: Vec2,\n zoom: number,\n nextZoom: number,\n): Vec2 {\n const world = userToWorld(user, pan, zoom);\n return {\n x: user.x - nextZoom * world.x,\n y: user.y - nextZoom * world.y,\n };\n}\n\n/** Pan that keeps a known world point under `user` at `zoom`. */\nexport function panKeepingWorldAtUser(user: Vec2, world: Vec2, zoom: number): Vec2 {\n return {\n x: user.x - zoom * world.x,\n y: user.y - zoom * world.y,\n };\n}\n\nexport const EDITOR_ZOOM_ANIM_MS = 240;\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Interpolate pan + zoom for a smooth +/− / Reset. */\nexport function interpolateView(\n from: { pan: Vec2; zoom: number },\n to: { pan: Vec2; zoom: number },\n t: number,\n): { pan: Vec2; zoom: number } {\n const e = easeOutCubic(t);\n return {\n pan: {\n x: lerp(from.pan.x, to.pan.x, e),\n y: lerp(from.pan.y, to.pan.y, e),\n },\n zoom: lerp(from.zoom, to.zoom, e),\n };\n}\n","import type { ShapeKind, ThemeDefaults } from '../../core';\nimport {\n isTransparentColor,\n isTransparentPadKind,\n resolvedShapeFill,\n staffPadPlaceholderFill,\n WALKING_PATH_COLOR,\n} from '../../core';\n\n/**\n * Edit Map and Wayfinding fills. The graph paper paints above the canvas,\n * so shapes can stay close to their published color.\n */\nexport function editorShapeFillOpacity(kind: ShapeKind): number {\n if (kind === 'void') return 0.45;\n if (kind === 'amenity') return 0.7;\n if (kind === 'unit' || kind === 'parking_zone' || kind === 'custom') return 0.88;\n return 0.78;\n}\n\nexport function editorShapeFill(\n shape: { kind: ShapeKind; style?: { fill?: string } },\n theme: ThemeDefaults,\n assignment?: { bgColor?: string | null } | null,\n): string {\n if (shape.kind === 'walkable') return WALKING_PATH_COLOR;\n if (shape.kind === 'void') return shape.style?.fill ?? '#94a3b8';\n const published = resolvedShapeFill(\n shape.kind,\n theme,\n shape.style?.fill,\n assignment,\n );\n if (\n isTransparentPadKind(shape.kind) &&\n isTransparentColor(published)\n ) {\n return staffPadPlaceholderFill(shape.kind, theme);\n }\n return published;\n}\n","import {\n darkenShapeFill,\n INTERACTIVE_SHAPE_KINDS,\n type ShapeKind,\n} from '../../core';\nimport {\n canPlaceNewRoute,\n emptyCanvasDragPans,\n isShapeDrawTool,\n isStampDrawTool,\n type EditorTool,\n} from '../tools';\n\n/** Wayfinding / vertex chrome — not a customer Style color. */\nexport const EDITOR_GUIDE_COLOR = '#2563eb';\n\n/** Stores and other assignable items that can be highlighted by an editor tool. */\nexport function isHoverHighlightShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind) || kind === 'label' || kind === 'void';\n}\n\n/** Cursor for the map surface. Space pan wins over the active tool. */\nexport function editorMapCursor(args: {\n tool: EditorTool;\n readOnly?: boolean;\n spaceHeld?: boolean;\n panning?: boolean;\n shapeDragging?: boolean;\n /** Mid-edge hit on a walking path (insert-point target). */\n routeEdgeHover?: boolean;\n /** Any snap onto the route graph (junction or edge). */\n routeNetworkHover?: boolean;\n /** Create Route / Multi Route: hide OS cursor while the drawn + shows. */\n routeInsertHover?: boolean;\n /** Create Route / Multi Route: pointer is over a linkable store or amenity. */\n wayfindingStoreHover?: boolean;\n /** Select tool: pointer is over a wayfinding anchor. */\n anchorHover?: boolean;\n anchorDragging?: boolean;\n edgeDragging?: boolean;\n edgeHover?: boolean;\n}): string | undefined {\n if (args.spaceHeld && !args.panning) return 'grab';\n if (args.spaceHeld && args.panning) return 'grabbing';\n if (args.anchorDragging) return 'grabbing';\n if (args.edgeDragging) return 'grabbing';\n if (args.panning || args.shapeDragging) return 'grabbing';\n // Pan is spatially stable: actionable items never replace the hand.\n if (args.tool === 'pan' || args.tool === 'draw-route') return 'grab';\n if (args.tool === 'select') {\n if (args.wayfindingStoreHover) return 'pointer';\n if (args.routeNetworkHover || args.routeEdgeHover || args.anchorHover) {\n return 'pointer';\n }\n return 'grab';\n }\n if (args.tool === 'curve') {\n if (args.routeNetworkHover || args.routeEdgeHover || args.anchorHover) {\n return 'pointer';\n }\n return 'grab';\n }\n if (canPlaceNewRoute(args.tool)) {\n if (args.wayfindingStoreHover) return 'cell';\n if (args.routeInsertHover) return 'none';\n return args.readOnly ? undefined : 'cell';\n }\n if (args.tool === 'draw-text') return 'text';\n if (args.tool === 'draw-entrance') return 'cell';\n if (args.edgeHover) return 'none';\n if (emptyCanvasDragPans(args.tool)) return 'grab';\n if (isShapeDrawTool(args.tool) && !args.readOnly) return 'cell';\n return undefined;\n}\n\nexport function editorSelectCursor(args: {\n tool: EditorTool;\n selected: boolean;\n highlightable: boolean;\n dragging?: boolean;\n /** Wayfinding: only route-creation tools can act on store geometry. */\n wayfinding?: boolean;\n /** Map text placed with the Text tool. */\n textLabel?: boolean;\n /** Entrance stamp placed with the Entrance tool. */\n entranceIcon?: boolean;\n}): 'pointer' | 'grab' | 'grabbing' | 'cell' | undefined {\n if (args.dragging) return 'grabbing';\n if (isShapeDrawTool(args.tool)) return 'cell';\n if (args.wayfinding && args.highlightable) {\n return canPlaceNewRoute(args.tool) ? 'cell' : undefined;\n }\n if (isStampDrawTool(args.tool) && (args.textLabel || args.entranceIcon)) {\n return 'pointer';\n }\n if (args.tool === 'curve' || args.tool === 'split-join') {\n if (args.selected) return undefined;\n if (args.highlightable) return 'pointer';\n return undefined;\n }\n if (args.tool !== 'select') return undefined;\n if (args.selected) return 'grab';\n if (args.highlightable) return 'pointer';\n return undefined;\n}\n\nexport function editorHoverFillOpacity(\n kind: ShapeKind,\n base: number,\n hovered: boolean,\n): number {\n if (!hovered || !isHoverHighlightShape(kind)) return base;\n return Math.min(1, base + 0.1);\n}\n\n/** Hover and selection share the same darker shade of the shape fill. */\nexport function editorShapeEmphasisColor(\n fill: string,\n emphasized: boolean,\n): string {\n if (!emphasized) return fill;\n return darkenShapeFill(fill);\n}\n","import type {\n AssignmentIconTheme,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignRetailer,\n} from '../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n assignmentSpecialIconId,\n DEFAULT_ASSIGNMENT_SIZE,\n geometryBBox,\n normalizeLabelAlign,\n publishedShapeLabel,\n resolveFetchUrl,\n resolvedAssignmentIconColor,\n} from '../core';\nimport { getMapSpecialSvg, mapSpecialSvgToDataUrl } from '../specialIcons';\n\nexport type WayfindingAssignedOverlay = {\n shapeId: number;\n x: number;\n y: number;\n rotate: number;\n /** Text font size, or image width (logos are already scaled). */\n size: number;\n color: string;\n align: LabelAlign;\n text?: string;\n imageUrl?: string;\n iconId?: string;\n};\n\ntype OverlayShape = Pick<CmShape, 'id' | 'kind' | 'geometry' | 'label' | 'style'>;\n\n/**\n * Live editor display uses the session CDN URL, not the persisted S3 key —\n * same as `compileDocument` when `persistMediaKeys` is off.\n */\nexport function liveDisplayRetailer(\n retailer?: MapAssignRetailer | null,\n): MapAssignRetailer | null {\n if (!retailer) return null;\n const key = retailer.logoKey?.trim() ?? '';\n if (!retailer.logoUrl && /^https?:\\/\\//i.test(key)) return retailer;\n return { ...retailer, logoKey: null };\n}\n\n/**\n * Name, logo, or amenity / kiosk icon for an assigned polygon. Unassigned\n * leftover text is dropped. Used by the wayfinding canvas only.\n */\nexport function wayfindingAssignedOverlay(\n shape: OverlayShape,\n assignment: CmShapeAssignment | null | undefined,\n retailer: MapAssignRetailer | null | undefined,\n amenities: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>> = [],\n theme: AssignmentIconTheme,\n): WayfindingAssignedOverlay | null {\n if (shape.kind === 'label' || shape.kind === 'entrance') return null;\n const displayRetailer = liveDisplayRetailer(retailer);\n const label = publishedShapeLabel(shape, assignment, displayRetailer);\n if (!assignmentOverlayVisible(assignment, label)) return null;\n const box = geometryBBox(shape.geometry);\n const fontSize =\n label.size || assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const imageUrl = assignmentOverlayImageUrl(\n assignment,\n displayRetailer,\n label,\n );\n const iconId = imageUrl\n ? undefined\n : assignmentSpecialIconId(assignment, amenities);\n const text = imageUrl || iconId ? undefined : label.text?.trim() || undefined;\n if (!imageUrl && !iconId && !text) return null;\n return {\n shapeId: shape.id,\n x: (box.minX + box.maxX) / 2 + (label.offsetX ?? 0),\n y: (box.minY + box.maxY) / 2 + (label.offsetY ?? 0),\n rotate: label.rotate ?? 0,\n size: imageUrl\n ? assignmentOverlayRenderSize(fontSize, assignment)\n : fontSize,\n color: resolvedAssignmentIconColor(\n assignment,\n theme,\n label.color,\n shape.kind,\n ),\n align: normalizeLabelAlign(label.align),\n text,\n imageUrl,\n iconId,\n };\n}\n\nexport function wayfindingAssignedOverlays(input: {\n shapes: OverlayShape[];\n /** Outdoor/base shapes shown beneath the active building floor. */\n underlayShapes?: OverlayShape[];\n assignments: CmShapeAssignment[];\n retailers?: MapAssignRetailer[];\n amenities?: Array<Pick<CmAmenityCatalogItem, 'id' | 'code'>>;\n theme: AssignmentIconTheme;\n}): WayfindingAssignedOverlay[] {\n const retailerById = new Map(\n (input.retailers ?? []).map((item) => [item.id, item]),\n );\n const assignmentByShapeId = new Map(\n input.assignments.map((row) => [row.shapeId, row]),\n );\n const amenities = input.amenities ?? [];\n const overlays: WayfindingAssignedOverlay[] = [];\n for (const shape of [...(input.underlayShapes ?? []), ...input.shapes]) {\n const assignment = assignmentByShapeId.get(shape.id);\n const retailer =\n assignment?.retailerId != null\n ? retailerById.get(assignment.retailerId) ?? null\n : null;\n const overlay = wayfindingAssignedOverlay(\n shape,\n assignment,\n retailer,\n amenities,\n input.theme,\n );\n if (overlay) overlays.push(overlay);\n }\n return overlays;\n}\n\nexport function wayfindingOverlayHref(\n overlay: Pick<WayfindingAssignedOverlay, 'imageUrl' | 'iconId' | 'color'>,\n imageProxyUrl?: string | null,\n): string | undefined {\n if (overlay.imageUrl) return resolveFetchUrl(overlay.imageUrl, imageProxyUrl);\n if (!overlay.iconId) return undefined;\n const svg = getMapSpecialSvg(overlay.iconId);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, overlay.color);\n}\n","import React from 'react';\nimport { labelSvgTextAnchor } from '../../core';\nimport {\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n labelTextLines,\n} from '../labelText';\nimport {\n wayfindingOverlayHref,\n type WayfindingAssignedOverlay,\n} from '../assignmentOverlay';\n\n/** Pointer-events none so wayfinding hover / click stay on the polygon. */\nexport function AssignedShapeOverlay({\n overlay,\n imageProxyUrl,\n}: {\n overlay: WayfindingAssignedOverlay;\n imageProxyUrl?: string | null;\n}) {\n const { x, y, rotate, size, color, align, text } = overlay;\n const href = wayfindingOverlayHref(overlay, imageProxyUrl);\n const transform = rotate ? `rotate(${rotate} ${x} ${y})` : undefined;\n return (\n <g\n className=\"eyeon-map-canvas__assigned-overlay\"\n data-shape-id={overlay.shapeId}\n transform={transform}\n pointerEvents=\"none\"\n >\n {href ? (\n <image\n href={href}\n x={x - size / 2}\n y={y - size / 2}\n width={size}\n height={size}\n preserveAspectRatio=\"xMidYMid meet\"\n />\n ) : text ? (\n <AssignedOverlayText\n text={text}\n x={x}\n y={y}\n size={size}\n color={color}\n align={align}\n />\n ) : null}\n </g>\n );\n}\n\nfunction AssignedOverlayText({\n text,\n x,\n y,\n size,\n color,\n align,\n}: {\n text: string;\n x: number;\n y: number;\n size: number;\n color: string;\n align: WayfindingAssignedOverlay['align'];\n}) {\n const lines = labelTextLines(text);\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n return (\n <text\n fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={color}\n textAnchor={labelSvgTextAnchor(align)}\n style={{ userSelect: 'none' }}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={x}\n y={y - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n outdoorDecorationFromSvg,\n resolveFetchUrl,\n type StaticLayerTheme,\n} from '../../core';\n\nexport function OutdoorSvgUnderlay({\n url,\n imageProxyUrl,\n suppressIds,\n theme,\n}: {\n url: string;\n imageProxyUrl?: string | null;\n suppressIds?: ReadonlySet<string>;\n theme?: StaticLayerTheme | null;\n}) {\n const [svgText, setSvgText] = useState<string | null>(null);\n const suppressKey = useMemo(\n () => (suppressIds ? [...suppressIds].sort().join('\\0') : ''),\n [suppressIds],\n );\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n setSvgText(text);\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setSvgText(null);\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapEditor.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const paths = useMemo(() => {\n if (!svgText) return [];\n const blocked = suppressKey\n ? new Set(suppressKey.split('\\0').filter(Boolean))\n : undefined;\n return outdoorDecorationFromSvg(svgText, blocked, theme);\n }, [svgText, suppressKey, theme]);\n\n if (paths.length === 0) return null;\n\n return (\n <g className=\"eyeon-map-canvas__outdoor-svg\" pointerEvents=\"none\">\n {paths.map((item, index) => (\n <path\n key={`${item.id}-${index}`}\n d={item.d}\n fill={item.fill ?? 'none'}\n stroke={item.stroke ?? 'none'}\n strokeWidth={item.strokeWidth ?? 0}\n opacity={item.opacity ?? 1}\n />\n ))}\n </g>\n );\n}\n","import type { ShapeKind } from '../../core';\nimport { INTERACTIVE_SHAPE_KINDS } from '../../core';\nimport { isStampShape } from '../entranceIcon';\n\n/** Outdoor underlay items that look clickable on a floor. */\nexport function isUnderlayHintShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Text and entrance hit-boxes stay on Outdoor — do not ghost them onto building floors. */\nexport function isUnderlayDrawnShape(shape: {\n kind: string;\n label?: { text?: string; imageKey?: string | null } | null;\n}): boolean {\n return !isStampShape(shape);\n}\n\nexport function underlaySwitchHint(kind: ShapeKind): string {\n if (kind === 'unit' || kind === 'parking_zone') {\n return 'Outdoor store — click to switch to Outdoor and edit';\n }\n if (kind === 'amenity') {\n return 'Outdoor amenity — click to switch to Outdoor and edit';\n }\n if (kind === 'kiosk_screen') {\n return 'Outdoor kiosk — click to switch to Outdoor and edit';\n }\n return 'Outdoor item — click to switch to Outdoor and edit';\n}\n","import type {\n AnchorKind,\n BatchOp,\n CmAnchor,\n CmRouteEdge,\n CmShape,\n ShapeKind,\n Vec2,\n} from '../core';\nimport {\n DEFAULT_WELD_TOLERANCE,\n INTERACTIVE_SHAPE_KINDS,\n distance,\n geometryBBox,\n projectOntoRouteEdge,\n routeCurveOf,\n splitRouteCurve,\n routeAnchorKindForShape,\n type RouteCurve,\n} from '../core';\n\nexport const WAYFINDING_SNAP_PX = 28;\n/**\n * One pick radius (CSS pixels) for wayfinding: the anchor dot, the + on a\n * route, and click-to-connect. On-route and off-route use the same circle.\n */\nexport const WAYFINDING_ANCHOR_HIT_PX = 10;\n\nexport function showsWayfinding(tool: string, routeMode = false): boolean {\n if (\n tool === 'draw-route' ||\n tool === 'create-route' ||\n tool === 'create-route-multi'\n ) {\n return true;\n }\n return routeMode && (tool === 'select' || tool === 'curve');\n}\n\n/**\n * First empty Create Route click is a preview. A second click commits both\n * ends. Leaving the tool drops the draft so a lone start is never kept.\n */\n/** Esc and Undo share this: a lone preview start is local; anything else undoes. */\nexport function routeSessionUndoKind(session: {\n routeDraftPoint: Vec2 | null;\n storeLinkPreview: unknown;\n}): 'clear-only' | 'clear-and-undo' {\n if (session.routeDraftPoint != null && session.storeLinkPreview == null) {\n return 'clear-only';\n }\n return 'clear-and-undo';\n}\n\nexport function beginOrContinueRouteDraft(\n draft: Vec2 | null,\n world: Vec2,\n): { nextDraft: Vec2 | null; start: Vec2 | null; end: Vec2 | null } {\n if (!draft) return { nextDraft: world, start: null, end: null };\n return { nextDraft: null, start: draft, end: world };\n}\n\n/** Preview line from a started route/store-link to the cursor or snap. */\nexport function routeRubberBand(\n from: Vec2 | null | undefined,\n to: Vec2 | null | undefined,\n): { from: Vec2; to: Vec2 } | null {\n if (!from || !to) return null;\n if (distance(from, to) <= 0.01) return null;\n return { from, to };\n}\n\nexport function isWayfindingShape(kind: ShapeKind): boolean {\n return INTERACTIVE_SHAPE_KINDS.includes(kind);\n}\n\n/** Outdoor pad sites are not routed — helpers and store links stay indoor. */\nexport function wayfindingLinksShapes(\n level: { kind?: string } | null | undefined,\n): boolean {\n return level?.kind !== 'outdoor';\n}\n\nexport function anchorKindForShape(kind: ShapeKind): AnchorKind {\n return routeAnchorKindForShape(kind);\n}\n\nexport function shapeRoutePoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const box = geometryBBox(shape.geometry);\n if (box.maxX > box.minX || box.maxY > box.minY) {\n return {\n x: (box.minX + box.maxX) / 2,\n y: (box.minY + box.maxY) / 2,\n };\n }\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function shapeRouteAnchor(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId'>>,\n): Pick<CmAnchor, 'id' | 'shapeId'> | undefined {\n return anchors.find((anchor) => anchor.shapeId === shapeId);\n}\n\nexport function anchorHasEdge(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): boolean {\n return edges.some(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n}\n\nexport function routeComponentAnchorIds(\n anchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n): Set<number> {\n const ids = new Set([anchorId]);\n const pending = [anchorId];\n while (pending.length > 0) {\n const current = pending.pop()!;\n for (const edge of edges) {\n let next: number | null = null;\n if (edge.fromAnchorId === current) next = edge.toAnchorId;\n if (edge.toAnchorId === current) next = edge.fromAnchorId;\n if (next == null || ids.has(next)) continue;\n ids.add(next);\n pending.push(next);\n }\n }\n return ids;\n}\n\nexport function walkEdgeExists(\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n a: number,\n b: number,\n): boolean {\n return edges.some(\n (edge) =>\n (edge.fromAnchorId === a && edge.toAnchorId === b) ||\n (edge.fromAnchorId === b && edge.toAnchorId === a),\n );\n}\n\nexport type RouteSnapTarget =\n | { type: 'junction'; anchorId: number; point: Vec2; distance: number }\n | {\n type: 'edge';\n edgeId: number;\n fromAnchorId: number;\n toAnchorId: number;\n point: Vec2;\n distance: number;\n };\n\n/** Walking segments that can bend. Floor changes stay straight. */\nexport function isCurvableRouteEdge(edge: Pick<CmRouteEdge, 'kind'>): boolean {\n return (\n edge.kind === 'walk' ||\n edge.kind === 'unit_link' ||\n edge.kind === 'entrance_link'\n );\n}\n\nfunction isSnappableRouteEdge(edge: Pick<CmRouteEdge, 'kind'>): boolean {\n return isCurvableRouteEdge(edge);\n}\n\nfunction edgeWithCurve(edge: CmRouteEdge, curve: RouteCurve | null): CmRouteEdge {\n return curve ? { ...edge, curve } : edge;\n}\n\n/** Replace one segment with two, keeping a cubic arch on both halves. */\nfunction splitWalkEdge(\n source: CmRouteEdge,\n junctionId: number,\n point: Vec2,\n mapId: number,\n allocId: () => number,\n anchorById: ReadonlyMap<number, Pick<CmAnchor, 'x' | 'y'>>,\n): { point: Vec2; left: CmRouteEdge; right: CmRouteEdge } {\n const from = anchorById.get(source.fromAnchorId);\n const to = anchorById.get(source.toAnchorId);\n const curve = routeCurveOf(source);\n if (from && to && curve) {\n const split = splitRouteCurve(from, to, curve, point);\n return {\n point: split.point,\n left: edgeWithCurve(\n walkEdge(allocId(), mapId, source.fromAnchorId, junctionId, source.kind),\n split.left,\n ),\n right: edgeWithCurve(\n walkEdge(allocId(), mapId, junctionId, source.toAnchorId, source.kind),\n split.right,\n ),\n };\n }\n return {\n point,\n left: walkEdge(allocId(), mapId, source.fromAnchorId, junctionId, source.kind),\n right: walkEdge(allocId(), mapId, junctionId, source.toAnchorId, source.kind),\n };\n}\n\n/** The orange point we are linking from — not every destination on that store. */\nexport function storeLinkOriginIds(\n anchors: Array<Pick<CmAnchor, 'id' | 'shapeId' | 'x' | 'y'>>,\n preview: { shapeId: number; origin: Vec2 } | null | undefined,\n): Set<number> {\n if (!preview) return new Set();\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (\n anchor.shapeId === preview.shapeId &&\n distance(anchor, preview.origin) <= DEFAULT_WELD_TOLERANCE\n ) {\n ids.add(anchor.id);\n }\n }\n return ids;\n}\n\n/**\n * Nearest route point or edge within `maxDist` (same circular hit on and off\n * the path). An existing anchor wins only when the cursor is inside that\n * circle; otherwise a mid-edge hit stays a split so the + can sit close to\n * a neighboring point.\n */\nexport function nearestRouteSnap(\n point: Vec2,\n anchors: CmAnchor[],\n edges: CmRouteEdge[],\n excludeIds: ReadonlySet<number>,\n maxDist: number,\n anchorById: ReadonlyMap<number, CmAnchor> = new Map(\n anchors.map((anchor) => [anchor.id, anchor]),\n ),\n /** Curve tool selects the line under the pointer, even beside an anchor. */\n prefer: 'junction' | 'edge' = 'junction',\n): RouteSnapTarget | null {\n let bestJunction: RouteSnapTarget | null = null;\n let bestEdge: RouteSnapTarget | null = null;\n\n for (const anchor of anchors) {\n if (excludeIds.has(anchor.id)) continue;\n const d = distance(anchor, point);\n if (d > maxDist) continue;\n if (!bestJunction || d < bestJunction.distance) {\n bestJunction = {\n type: 'junction',\n anchorId: anchor.id,\n point: { x: anchor.x, y: anchor.y },\n distance: d,\n };\n }\n }\n\n for (const edge of edges) {\n if (!isSnappableRouteEdge(edge)) continue;\n if (excludeIds.has(edge.fromAnchorId) || excludeIds.has(edge.toAnchorId)) {\n continue;\n }\n const from = anchorById.get(edge.fromAnchorId);\n const to = anchorById.get(edge.toAnchorId);\n if (!from || !to) continue;\n const hit = projectOntoRouteEdge(point, from, to, routeCurveOf(edge));\n if (hit.distance > maxDist) continue;\n if (!bestEdge || hit.distance < bestEdge.distance) {\n bestEdge = {\n type: 'edge',\n edgeId: edge.id,\n fromAnchorId: edge.fromAnchorId,\n toAnchorId: edge.toAnchorId,\n point: hit.point,\n distance: hit.distance,\n };\n }\n }\n\n if (prefer === 'edge') return bestEdge;\n return bestJunction ?? bestEdge;\n}\n\nexport interface ConnectShapeToRouteInput {\n shape: CmShape;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n from: Vec2;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}\n\nfunction walkEdge(\n id: number,\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n kind: CmRouteEdge['kind'] = 'walk',\n): CmRouteEdge {\n return {\n id,\n mapId,\n fromAnchorId,\n toAnchorId,\n weight: null,\n directed: false,\n accessible: true,\n kind,\n };\n}\n\n/** Create a store/amenity route point at the click. Another click elsewhere adds another. */\nexport function ensureShapeRouteAnchorOps(input: {\n shape: CmShape;\n anchors: CmAnchor[];\n allocId: () => number;\n point?: Vec2;\n}): { ops: BatchOp[]; anchorId: number } {\n const { shape, anchors, allocId } = input;\n const point = input.point ?? shapeRoutePoint(shape);\n const existing = anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, point) <= DEFAULT_WELD_TOLERANCE,\n );\n if (existing) return { ops: [], anchorId: existing.id };\n const unit: CmAnchor = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: point.x,\n y: point.y,\n connectorId: null,\n };\n return { ops: [{ op: 'upsert_anchor', anchor: unit }], anchorId: unit.id };\n}\n\n/**\n * Ensure the shape has a destination anchor, then hook it to the walking path\n * at `drop` (existing junction or a split in a walk edge).\n */\nexport function connectShapeToRouteOps(input: ConnectShapeToRouteInput): BatchOp[] {\n const { shape, anchors, edges, mapId, from, drop, maxDist, allocId } = input;\n const ops: BatchOp[] = [];\n let unit =\n anchors.find(\n (anchor) =>\n anchor.shapeId === shape.id &&\n distance(anchor, from) <= DEFAULT_WELD_TOLERANCE,\n ) ?? null;\n\n if (!unit) {\n unit = {\n id: allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: anchorKindForShape(shape.kind),\n x: from.x,\n y: from.y,\n connectorId: null,\n };\n ops.push({ op: 'upsert_anchor', anchor: unit });\n }\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n new Set([unit.id]),\n maxDist,\n );\n if (!snap) return ops;\n if (distance(unit, snap.point) <= DEFAULT_WELD_TOLERANCE) return ops;\n\n let junctionId: number;\n const nextEdges = edges.slice();\n\n if (snap.type === 'junction') {\n junctionId = snap.anchorId;\n } else {\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return ops;\n junctionId = allocId();\n const split = splitWalkEdge(\n source,\n junctionId,\n snap.point,\n mapId,\n allocId,\n new Map(anchors.map((anchor) => [anchor.id, anchor])),\n );\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId: shape.levelId,\n shapeId: null,\n kind: 'junction',\n x: split.point.x,\n y: split.point.y,\n connectorId: null,\n },\n });\n ops.push({ op: 'delete_edge', edgeId: source.id });\n const left = split.left;\n const right = split.right;\n ops.push({ op: 'upsert_edge', edge: left });\n ops.push({ op: 'upsert_edge', edge: right });\n nextEdges.push(left, right);\n }\n\n if (walkEdgeExists(nextEdges, unit.id, junctionId)) return ops;\n\n const linkKind = unit.kind === 'entrance' ? 'entrance_link' : 'unit_link';\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, unit.id, junctionId, linkKind),\n });\n return ops;\n}\n\n/** Snap a loose route junction onto an existing route and join the graph. */\nexport function connectRouteAnchorToRouteOps(input: {\n anchor: CmAnchor;\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n mapId: number;\n drop: Vec2;\n maxDist: number;\n allocId: () => number;\n}): BatchOp[] {\n const { anchor, anchors, edges, mapId, drop, maxDist, allocId } = input;\n const incident = edges.filter(\n (edge) =>\n edge.fromAnchorId === anchor.id || edge.toAnchorId === anchor.id,\n );\n if (anchor.shapeId != null || incident.length > 1) return [];\n\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n routeComponentAnchorIds(anchor.id, edges),\n maxDist,\n );\n if (!snap) return [];\n\n if (snap.type === 'junction') {\n if (incident.length === 1) {\n const source = incident[0];\n const otherId =\n source.fromAnchorId === anchor.id\n ? source.toAnchorId\n : source.fromAnchorId;\n const ops: BatchOp[] = [];\n if (!walkEdgeExists(edges, otherId, snap.anchorId)) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n ...source,\n fromAnchorId:\n source.fromAnchorId === anchor.id\n ? snap.anchorId\n : source.fromAnchorId,\n toAnchorId:\n source.toAnchorId === anchor.id\n ? snap.anchorId\n : source.toAnchorId,\n },\n });\n } else {\n ops.push({ op: 'delete_edge', edgeId: source.id });\n }\n ops.push({ op: 'delete_anchor', anchorId: anchor.id });\n return ops;\n }\n\n const link = linkRouteAnchorsOp(\n mapId,\n anchor.id,\n snap.anchorId,\n edges,\n allocId,\n );\n const ops: BatchOp[] = [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: snap.point.x, y: snap.point.y },\n },\n ];\n if (link) ops.push(link);\n return ops;\n }\n\n const source = edges.find((edge) => edge.id === snap.edgeId);\n if (!source) return [];\n const split = splitWalkEdge(\n source,\n anchor.id,\n snap.point,\n mapId,\n allocId,\n new Map(anchors.map((item) => [item.id, item])),\n );\n return [\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x: split.point.x, y: split.point.y },\n },\n { op: 'delete_edge', edgeId: source.id },\n { op: 'upsert_edge', edge: split.left },\n { op: 'upsert_edge', edge: split.right },\n ];\n}\n\nexport function linkRouteAnchorsOp(\n mapId: number,\n fromAnchorId: number,\n toAnchorId: number,\n edges: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>>,\n allocId: () => number,\n): BatchOp | null {\n if (fromAnchorId === toAnchorId) return null;\n if (walkEdgeExists(edges, fromAnchorId, toAnchorId)) return null;\n return {\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, fromAnchorId, toAnchorId),\n };\n}\n\nexport function insertJunctionOnWalkEdgeOps(input: {\n levelId: number;\n mapId: number;\n edge: CmRouteEdge;\n point: Vec2;\n allocId: () => number;\n anchors?: Array<Pick<CmAnchor, 'id' | 'x' | 'y'>>;\n}): { ops: BatchOp[]; junctionId: number } {\n const { levelId, mapId, edge, point, allocId, anchors = [] } = input;\n const junctionId = allocId();\n const split = splitWalkEdge(\n edge,\n junctionId,\n point,\n mapId,\n allocId,\n new Map(anchors.map((anchor) => [anchor.id, anchor])),\n );\n return {\n junctionId,\n ops: [\n {\n op: 'upsert_anchor',\n anchor: {\n id: junctionId,\n levelId,\n shapeId: null,\n kind: 'junction',\n x: split.point.x,\n y: split.point.y,\n connectorId: null,\n },\n },\n { op: 'delete_edge', edgeId: edge.id },\n { op: 'upsert_edge', edge: split.left },\n { op: 'upsert_edge', edge: split.right },\n ],\n };\n}\n\n/**\n * Remove a walking path. Endpoints that still join other routes stay;\n * endpoints that would be left with no connections are removed too.\n */\nexport function deleteRouteEdgeOps(\n edgeId: number,\n edges: Array<Pick<CmRouteEdge, 'id' | 'fromAnchorId' | 'toAnchorId'>>,\n): BatchOp[] {\n const edge = edges.find((item) => item.id === edgeId);\n if (!edge) return [];\n const remaining = edges.filter((item) => item.id !== edgeId);\n const ops: BatchOp[] = [{ op: 'delete_edge', edgeId }];\n for (const anchorId of [edge.fromAnchorId, edge.toAnchorId]) {\n if (!anchorHasEdge(anchorId, remaining)) {\n ops.push({ op: 'delete_anchor', anchorId });\n }\n }\n return ops;\n}\n\ntype RouteAnchorRef = Pick<\n CmRouteEdge,\n 'id' | 'fromAnchorId' | 'toAnchorId' | 'kind'\n>;\n\n/**\n * What disappears with an anchor. A 2-way corridor is healed, so those\n * neighbors stay. Any other neighbor left with no route is removed too.\n */\nfunction planRouteAnchorRemoval<T extends RouteAnchorRef>(\n anchorId: number,\n edges: T[],\n): {\n incident: T[];\n heal: [number, number] | null;\n removedAnchorIds: number[];\n} {\n const incident = edges.filter(\n (edge) => edge.fromAnchorId === anchorId || edge.toAnchorId === anchorId,\n );\n const removedEdgeIds = new Set(incident.map((edge) => edge.id));\n const remaining: Array<Pick<CmRouteEdge, 'fromAnchorId' | 'toAnchorId'>> =\n edges.filter((edge) => !removedEdgeIds.has(edge.id));\n const walkNeighbors = [\n ...new Set(\n incident\n .filter((edge) => edge.kind === 'walk')\n .map((edge) =>\n edge.fromAnchorId === anchorId ? edge.toAnchorId : edge.fromAnchorId,\n ),\n ),\n ];\n const heal: [number, number] | null =\n walkNeighbors.length === 2 &&\n !walkEdgeExists(edges, walkNeighbors[0], walkNeighbors[1])\n ? [walkNeighbors[0], walkNeighbors[1]]\n : null;\n if (heal) {\n remaining.push({ fromAnchorId: heal[0], toAnchorId: heal[1] });\n }\n\n const removedAnchorIds = [anchorId];\n const seen = new Set<number>([anchorId]);\n for (const edge of incident) {\n for (const id of [edge.fromAnchorId, edge.toAnchorId]) {\n if (seen.has(id)) continue;\n seen.add(id);\n if (!anchorHasEdge(id, remaining)) removedAnchorIds.push(id);\n }\n }\n return { incident, heal, removedAnchorIds };\n}\n\n/** Anchors deleted together with `anchorId`, including ones left with no route. */\nexport function anchorsRemovedWithRouteAnchor(\n anchorId: number,\n edges: RouteAnchorRef[],\n): number[] {\n return planRouteAnchorRemoval(anchorId, edges).removedAnchorIds;\n}\n\n/**\n * Remove a route point. A 2-way corridor is healed so the path stays joined.\n * Neighbors that would be left with no route are removed too.\n */\nexport function deleteRouteAnchorOps(\n anchorId: number,\n mapId: number,\n edges: CmRouteEdge[],\n allocId: () => number,\n): BatchOp[] {\n const { incident, heal, removedAnchorIds } = planRouteAnchorRemoval(\n anchorId,\n edges,\n );\n const ops: BatchOp[] = incident.map((edge) => ({\n op: 'delete_edge' as const,\n edgeId: edge.id,\n }));\n if (heal) {\n ops.push({\n op: 'upsert_edge',\n edge: walkEdge(allocId(), mapId, heal[0], heal[1]),\n });\n }\n for (const id of removedAnchorIds) {\n ops.push({ op: 'delete_anchor', anchorId: id });\n }\n return ops;\n}\n","import React, {\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n CmAmenityCatalogItem,\n CmAnchor,\n CmLevel,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n MapAssignRetailer,\n ShapeGeometry,\n ShapeKind,\n ShapeLabel,\n RouteCurve,\n ThemeDefaults,\n Vec2,\n ViewBox,\n} from '../../core';\nimport {\n bendRouteToCubic,\n displayRouteCurve,\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n labelAlignX,\n labelSvgTextAnchor,\n normalizeLabelAlign,\n moveRouteHandle,\n routeCurveOf,\n routeEdgePathD,\n svgIdsOwnedByShapes,\n unionViewBox,\n} from '../../core';\nimport { isEditableTypingTarget } from '../history';\nimport {\n canDeleteWayfindingItem,\n canEditShapeGeometry,\n canJoinOpenEnds,\n canPlaceNewRoute,\n emptyCanvasDragPans,\n isEllipseDrawTool,\n isPolygonDrawTool,\n popPolygonDraftPoint,\n isShapeDrawTool,\n isSplitJoinTool,\n isStampDrawTool,\n isWayfindingEditorTool,\n nextRouteChainAnchor,\n showsCurveHandles,\n showsShapeAnchors,\n type EditorTool,\n} from '../tools';\nimport {\n applySplitJoinCut,\n applySplitJoinJoin,\n canSplitJoinKind,\n hitOpenEnd,\n hitSplitJoinEdge,\n listOpenEnds,\n previewCutPoints,\n sameOpenEnd,\n type OpenEndHit,\n type OpenEndId,\n type ShapeBatchEdit,\n type ShapeGeo,\n type SplitJoinEdgeHit,\n} from '../splitJoin';\nimport { nearestSnapPoint, sameSnapPoint } from '../snapPoint';\nimport {\n constrainOrthogonal,\n constrainVertexOrthogonal,\n isSpacePanKey,\n type OrthoConstraint,\n} from '../ortho';\nimport {\n bendEdgeToCubic,\n flattenCubicEdge,\n edgeCount,\n edgeFrom,\n edgeTo,\n edgeToPathD,\n geometryToRings,\n pointOnRingEdge,\n ringToPathD,\n hitTestEdge,\n hitTestEdgeMidpoint,\n hitTestHandle,\n hitTestVertex,\n insertVertex,\n moveHandle,\n moveVertex,\n vertexNeighborPoints,\n polygonsToGeometry,\n removeVertex,\n translateEdge,\n translateGeometry,\n} from '../geometryEdit';\nimport {\n ellipseBoundsFromDrag,\n ellipseGeometry,\n} from '../ellipseDraw';\nimport {\n DEFAULT_LABEL_TEXT,\n LABEL_FONT_FAMILY,\n LABEL_LINE_HEIGHT,\n defaultLabelSize,\n defaultTextLabel,\n isTextLabel,\n labelBoxCenter,\n labelTextLines,\n textLabelGeometry,\n} from '../labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n defaultEntranceLabel,\n entranceIconGeometry,\n isEntranceIcon,\n isStampShape,\n} from '../entranceIcon';\nimport { entranceIconDataUrl } from '../../specialIcons';\nimport { ensureMapFont } from '../../fonts/mapFontUrl';\nimport {\n clampEditorZoom,\n clientToSvgUser,\n EDITOR_ZOOM_ANIM_MS,\n editorHandleScale,\n interpolateView,\n nextEditorZoomFromWheel,\n panAfterZoom,\n panKeepingWorldAtUser,\n pxPerUserFromSvg,\n screenPxToWorld,\n userToWorld,\n} from './coords';\nimport { editorShapeFill, editorShapeFillOpacity } from './editorFill';\nimport {\n EDITOR_GUIDE_COLOR,\n editorHoverFillOpacity,\n editorMapCursor,\n editorSelectCursor,\n editorShapeEmphasisColor,\n isHoverHighlightShape,\n} from './editorHover';\nimport { wayfindingAssignedOverlays } from '../assignmentOverlay';\nimport { AssignedShapeOverlay } from './AssignedShapeOverlay';\nimport { OutdoorSvgUnderlay } from './OutdoorSvgUnderlay';\nimport {\n isUnderlayDrawnShape,\n isUnderlayHintShape,\n underlaySwitchHint,\n} from './underlayHint';\nimport {\n WAYFINDING_ANCHOR_HIT_PX,\n WAYFINDING_SNAP_PX,\n anchorHasEdge,\n anchorsRemovedWithRouteAnchor,\n beginOrContinueRouteDraft,\n isWayfindingShape,\n routeRubberBand,\n routeComponentAnchorIds,\n routeSessionUndoKind,\n nearestRouteSnap,\n isCurvableRouteEdge,\n showsWayfinding,\n storeLinkOriginIds,\n wayfindingLinksShapes,\n type RouteSnapTarget,\n} from '../routeStubs';\n\nconst ANCHOR_R_PX = 9;\nconst ANCHOR_R_SELECTED_PX = 11;\nconst ANCHOR_HIT_PX = 16;\nconst ANCHOR_STROKE_PX = 2;\n/** Store / amenity / kiosk route points — distinct from selected (accent) junctions. */\nconst SHAPE_ROUTE_ANCHOR_FILL = '#ea580c';\nconst VERTEX_R_PX = 7;\nconst VERTEX_R_SELECTED_PX = 9;\nconst VERTEX_HIT_PX = 14;\nconst VERTEX_STROKE_PX = 2;\nconst HANDLE_R_PX = 5;\nconst HANDLE_R_SELECTED_PX = 6;\nconst HANDLE_HIT_PX = 12;\nconst HANDLE_LINE_PX = 2.25;\nconst HANDLE_LINE_HALO_PX = 4;\nconst BEND_R_PX = 4;\nconst EDGE_DRAG_PX = 4;\n/** Hover / cut pair — tight enough to read as one break, not two far dots. */\nconst SPLIT_JOIN_GAP_PX = 7;\nconst SNAP_HIT_PX = 16;\n\nfunction rectPolygon(a: Vec2, b: Vec2): Vec2[] {\n return [\n { x: a.x, y: a.y },\n { x: b.x, y: a.y },\n { x: b.x, y: b.y },\n { x: a.x, y: b.y },\n ];\n}\n\nfunction dragSize(a: Vec2, b: Vec2): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\n/** Settled world stroke; CSS multiplies by --map-handle-scale during wheel. */\nfunction screenStrokeStyle(width: number): React.CSSProperties {\n return { ['--map-stroke-width']: width } as React.CSSProperties;\n}\n\nfunction HandleDot({\n cx,\n cy,\n r,\n hitR,\n fill,\n stroke,\n strokeWidth,\n cursor,\n fillOpacity = 1,\n strokeDasharray,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onDoubleClick,\n}: {\n cx: number;\n cy: number;\n r: number;\n hitR: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n cursor?: string;\n fillOpacity?: number;\n strokeDasharray?: string;\n onPointerDown?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerEnter?: (e: React.PointerEvent<SVGGElement>) => void;\n onPointerLeave?: (e: React.PointerEvent<SVGGElement>) => void;\n onDoubleClick?: (e: React.MouseEvent<SVGGElement>) => void;\n}) {\n return (\n <g\n onPointerDown={onPointerDown}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onMouseDown={(e) => e.preventDefault()}\n onDoubleClick={onDoubleClick}\n style={cursor ? { cursor } : undefined}\n >\n <g transform={`translate(${cx} ${cy})`}>\n <g className=\"eyeon-map-screen-const\">\n <circle cx={0} cy={0} r={hitR} fill=\"transparent\" />\n <circle\n cx={0}\n cy={0}\n r={r}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n </g>\n </g>\n </g>\n );\n}\n\nexport interface EditorCanvasProps {\n level: CmLevel | null;\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n assignments: CmShapeAssignment[];\n /** Center retailers — wayfinding draws assigned names / logos from these. */\n retailers?: MapAssignRetailer[];\n /** Amenity catalog — wayfinding draws assigned amenity / kiosk icons. */\n amenities?: CmAmenityCatalogItem[];\n theme: ThemeDefaults;\n tool: EditorTool;\n selectedShapeId: number | null;\n selectedAnchorIds: number[];\n /** Outdoor SVG underlay (designer-owned). */\n baseSvgUrl: string | null;\n baseViewbox?: ViewBox | null;\n /**\n * Live outdoor SVG. Drawn on every Edit Map and Wayfinding floor (and\n * Outdoor) so green areas, parking lanes, and icons match the assign view.\n */\n outdoorSvgUrl?: string | null;\n /** Same proxy as MapViewer — required when the SVG is cross-origin. */\n imageProxyUrl?: string | null;\n /** @deprecated Use outdoorSvgUrl. Kept so existing hosts keep compiling. */\n levelSvgUrl?: string | null;\n /** Outdoor/base shapes drawn behind the active building floor (non-interactive). */\n underlayShapes?: CmShape[];\n /** Floor below, clipped to openings so Edit Map previews the atrium. */\n openingUnderlayShapes?: CmShape[];\n /** When true (outdoor), only interactive shapes are editable. */\n interactiveOnly?: boolean;\n /** Graph-paper grid. PORTAL only mounts this canvas after Edit Map. Always above shapes. */\n showGrid?: boolean;\n /** 0–1 strength of the grid lines. */\n gridOpacity?: number;\n /** Wayfinding section: Select also shows and edits the route graph. */\n routeMode?: boolean;\n /** Pan and zoom only — used for Outdoor in Wayfinding. */\n readOnly?: boolean;\n onSelectShape: (id: number | null) => void;\n onSelectAnchors: (ids: number[]) => void;\n onCreateRoutePoint: (\n point: Vec2,\n prevAnchorId: number | null,\n ) => number | null | void;\n /** First committed Create Route segment (two points + one edge). */\n onCreateRouteSegment: (start: Vec2, end: Vec2) => number | null | void;\n /** Connect two existing junctions with a walk edge. */\n onLinkRouteAnchors?: (fromAnchorId: number, toAnchorId: number) => void;\n onInsertRouteJunction: (edgeId: number, point: Vec2) => number | null | void;\n /** Esc on a route draft uses the same path as the Undo control. */\n onUndo?: () => void;\n onRouteDraftActiveChange?: (active: boolean) => void;\n /** Esc on Multi Route (or Create Route) used to return to Select. */\n onToolChange?: (tool: EditorTool) => void;\n onDeleteRouteAnchor: (anchorId: number) => void;\n /** Double-click a walking path to remove it and any leftover endpoints. */\n onDeleteRouteEdge: (edgeId: number) => void;\n onConnectShapeToRoute: (\n shapeId: number,\n from: Vec2,\n drop: Vec2,\n maxDist: number,\n ) => void;\n onConnectRouteAnchorToRoute: (\n anchorId: number,\n drop: Vec2,\n maxDist: number,\n ) => void;\n /** Click inside a store to place its orange destination at that point. */\n onEnsureShapeAnchor: (shapeId: number, point: Vec2) => number | null | void;\n onMoveAnchor: (anchorId: number, x: number, y: number) => void;\n /** Curve tool: bend a walking segment or flatten it back to a line. */\n onUpdateRouteCurve?: (\n edgeId: number,\n curve: RouteCurve | null,\n opts?: { live?: boolean },\n ) => void;\n onCreateShape: (\n kind: ShapeKind,\n geometry: ShapeGeometry,\n extras?: { label?: ShapeLabel },\n ) => void;\n onUpdateShapeGeometry: (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => void;\n onBatchShapeEdits?: (edits: ShapeBatchEdit[]) => void;\n /** End a live drag so the next edit starts a new undo step. */\n onHistoryGestureEnd?: () => void;\n /** Shown when no floor or Outdoor is selected. */\n emptyMessage?: string;\n}\n\nexport interface EditorCanvasHandle {\n consumeRouteUndo: () => 'clear-only' | 'clear-and-undo';\n zoomIn: () => void;\n zoomOut: () => void;\n resetView: () => void;\n}\n\nfunction polygonsToPath(polygons: Vec2[][]): string {\n return polygons\n .map((poly) => {\n if (poly.length === 0) return '';\n let d = `M ${poly[0].x} ${poly[0].y}`;\n for (let i = 1; i < poly.length; i++) d += ` L ${poly[i].x} ${poly[i].y}`;\n d += ' Z';\n return d;\n })\n .join(' ');\n}\n\nfunction isEditableShape(shape: CmShape, interactiveOnly: boolean): boolean {\n if (shape.orphanedAt) return false;\n if (isStampShape(shape)) return true;\n if (!interactiveOnly) return true;\n return INTERACTIVE_SHAPE_KINDS.includes(shape.kind);\n}\n\nfunction editorCanvasClass(showGrid: boolean): string {\n if (!showGrid) return 'eyeon-map-canvas';\n return 'eyeon-map-canvas eyeon-map-canvas--grid';\n}\n\nfunction editorCanvasStyle(\n showGrid: boolean,\n gridOpacity: number,\n): React.CSSProperties | undefined {\n if (!showGrid) return undefined;\n return {\n '--eyeon-map-grid-opacity': String(gridOpacity),\n } as React.CSSProperties;\n}\n\nexport const EditorCanvas = React.forwardRef<EditorCanvasHandle, EditorCanvasProps>(\nfunction EditorCanvas({\n level,\n shapes,\n anchors,\n edges,\n assignments,\n retailers = [],\n amenities = [],\n theme,\n tool,\n selectedShapeId,\n selectedAnchorIds,\n baseSvgUrl,\n baseViewbox = null,\n outdoorSvgUrl = null,\n imageProxyUrl = null,\n levelSvgUrl = null,\n underlayShapes = [],\n openingUnderlayShapes = [],\n interactiveOnly = false,\n showGrid = true,\n gridOpacity = 0.13,\n routeMode = false,\n readOnly = false,\n emptyMessage = 'Choose a floor or Outdoor to edit',\n onSelectShape,\n onSelectAnchors,\n onCreateRoutePoint,\n onCreateRouteSegment,\n onLinkRouteAnchors,\n onInsertRouteJunction,\n onDeleteRouteAnchor,\n onDeleteRouteEdge,\n onConnectShapeToRoute,\n onConnectRouteAnchorToRoute,\n onEnsureShapeAnchor,\n onMoveAnchor,\n onUpdateRouteCurve,\n onCreateShape,\n onUpdateShapeGeometry,\n onBatchShapeEdits,\n onHistoryGestureEnd,\n onUndo,\n onRouteDraftActiveChange,\n onToolChange,\n}, ref) {\n ensureMapFont();\n const wayfindingOn = showsWayfinding(tool, routeMode);\n const svgRef = useRef<SVGSVGElement>(null);\n const viewGroupRef = useRef<SVGGElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const [, setPan] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const viewRef = useRef({ pan: { x: 0, y: 0 }, zoom: 1 });\n /** Zoom last used to compute `worldPx` handle radii in React. */\n const sizeZoomRef = useRef(1);\n const wheelFrameRef = useRef<number | null>(null);\n const wheelSettleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [pxPerUser, setPxPerUser] = useState(1);\n const pointersRef = useRef(new Map<number, Vec2>());\n const pinchRef = useRef<{\n startDist: number;\n startZoom: number;\n world: Vec2;\n } | null>(null);\n const [drawing, setDrawing] = useState<Vec2[]>([]);\n const [drawLockCircle, setDrawLockCircle] = useState(false);\n const [spaceHeld, setSpaceHeld] = useState(false);\n const spaceHeldRef = useRef(false);\n const [axisGuide, setAxisGuide] = useState<OrthoConstraint | null>(null);\n const [polygonPoints, setPolygonPoints] = useState<Vec2[]>([]);\n const [dragAnchor, setDragAnchor] = useState<number | null>(null);\n const [dragAnchorPoint, setDragAnchorPoint] = useState<Vec2 | null>(null);\n const [routeCurveDrag, setRouteCurveDrag] = useState<\n | { type: 'bend'; edgeId: number }\n | { type: 'handle'; edgeId: number; handle: 1 | 2 }\n | null\n >(null);\n const [selectedRouteHandle, setSelectedRouteHandle] = useState<{\n edgeId: number;\n handle: 1 | 2;\n } | null>(null);\n const [lastRouteAnchor, setLastRouteAnchor] = useState<number | null>(null);\n const [routeDraftPoint, setRouteDraftPoint] = useState<Vec2 | null>(null);\n const [storeLinkPreview, setStoreLinkPreview] = useState<{\n shapeId: number;\n origin: Vec2;\n } | null>(null);\n const [rubberCursor, setRubberCursor] = useState<Vec2 | null>(null);\n const [splitJoinPending, setSplitJoinPending] = useState<OpenEndId | null>(\n null,\n );\n const [splitJoinHover, setSplitJoinHover] = useState<SplitJoinEdgeHit | null>(\n null,\n );\n const [splitJoinSnapEnd, setSplitJoinSnapEnd] = useState<OpenEndHit | null>(\n null,\n );\n const [polygonSnap, setPolygonSnap] = useState<Vec2 | null>(null);\n const clearRouteSession = () => {\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n };\n useEffect(() => {\n onRouteDraftActiveChange?.(\n routeDraftPoint != null || polygonPoints.length > 0 || drawing.length > 0,\n );\n }, [drawing.length, onRouteDraftActiveChange, polygonPoints.length, routeDraftPoint]);\n useEffect(() => {\n if (lastRouteAnchor == null) return;\n if (anchors.some((anchor) => anchor.id === lastRouteAnchor)) return;\n setLastRouteAnchor(null);\n setRubberCursor(null);\n }, [anchors, lastRouteAnchor]);\n const [stubDrag, setStubDrag] = useState<{\n shapeId: number;\n origin: Vec2;\n cursor: Vec2;\n clientX: number;\n clientY: number;\n } | null>(null);\n const [shapeDrag, setShapeDrag] = useState<{\n shapeId: number;\n start: Vec2;\n originGeometry: ShapeGeometry;\n } | null>(null);\n const [shapeOffset, setShapeOffset] = useState<Vec2>({ x: 0, y: 0 });\n const [vertexDrag, setVertexDrag] = useState<{\n type: 'anchor';\n shapeId: number;\n polygonIndex: number;\n vertexIndex: number;\n } | {\n type: 'handle';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | {\n type: 'bend';\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n } | null>(null);\n const [selectedVertex, setSelectedVertex] = useState<{\n polygonIndex: number;\n vertexIndex: number;\n } | null>(null);\n const [selectedHandle, setSelectedHandle] = useState<{\n ringIndex: number;\n edgeIndex: number;\n handle: 1 | 2;\n } | null>(null);\n const [hoveredEdge, setHoveredEdge] = useState<{\n ringIndex: number;\n edgeIndex: number;\n point: Vec2;\n } | null>(null);\n const [edgePress, setEdgePress] = useState<{\n shapeId: number;\n ringIndex: number;\n edgeIndex: number;\n start: Vec2;\n clientX: number;\n clientY: number;\n insertAt: Vec2;\n originGeometry: ShapeGeometry;\n dragging: boolean;\n } | null>(null);\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [hoveredAnchorId, setHoveredAnchorId] = useState<number | null>(null);\n const [routePointerSnap, setRoutePointerSnap] =\n useState<RouteSnapTarget | null>(null);\n const [selectedRouteEdgeId, setSelectedRouteEdgeId] = useState<number | null>(\n null,\n );\n const reportAnchors = onSelectAnchors;\n const selectAnchors = (ids: number[]) => {\n setSelectedRouteEdgeId(null);\n reportAnchors(ids);\n };\n useEffect(() => {\n if (selectedRouteEdgeId == null) return;\n if (!edges.some((edge) => edge.id === selectedRouteEdgeId)) {\n setSelectedRouteEdgeId(null);\n }\n }, [edges, selectedRouteEdgeId]);\n const routeHover =\n routePointerSnap?.type === 'edge'\n ? { edgeId: routePointerSnap.edgeId, point: routePointerSnap.point }\n : null;\n const [underlayTip, setUnderlayTip] = useState<{\n x: number;\n y: number;\n text: string;\n } | null>(null);\n const panStart = useRef<{\n x: number;\n y: number;\n panX: number;\n panY: number;\n clientX: number;\n clientY: number;\n fromEmptySelect: boolean;\n } | null>(null);\n const [isPanning, setIsPanning] = useState(false);\n\n const worldPx = (px: number) =>\n screenPxToWorld(px, viewRef.current.zoom, pxPerUser);\n\n const syncViewDom = (nextPan: Vec2, nextZoom: number) => {\n const g = viewGroupRef.current;\n if (!g) return;\n g.setAttribute(\n 'transform',\n `translate(${nextPan.x}, ${nextPan.y}) scale(${nextZoom})`,\n );\n // One CSS var — not a React re-render of every store/route node.\n g.style.setProperty(\n '--map-handle-scale',\n String(editorHandleScale(sizeZoomRef.current, nextZoom)),\n );\n };\n\n const applyView = (nextPan: Vec2, nextZoom: number) => {\n cancelWheelWork();\n viewRef.current = { pan: nextPan, zoom: nextZoom };\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n // Wheel input can fire much faster than paint. Move the SVG group\n // imperatively once per frame, then let React reconcile once scrolling ends.\n // Handle dots counter-scale in that same frame so they do not swell/shrink.\n const paintView = () => {\n wheelFrameRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n syncViewDom(nextPan, nextZoom);\n };\n\n const settleWheelView = () => {\n wheelSettleRef.current = null;\n const { pan: nextPan, zoom: nextZoom } = viewRef.current;\n setPan(nextPan);\n setZoom(nextZoom);\n };\n\n const scheduleWheelPaint = () => {\n if (wheelFrameRef.current == null) {\n wheelFrameRef.current = requestAnimationFrame(paintView);\n }\n if (wheelSettleRef.current != null) clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = setTimeout(settleWheelView, 80);\n };\n\n const cancelWheelWork = () => {\n if (wheelFrameRef.current != null) {\n cancelAnimationFrame(wheelFrameRef.current);\n wheelFrameRef.current = null;\n }\n if (wheelSettleRef.current != null) {\n clearTimeout(wheelSettleRef.current);\n wheelSettleRef.current = null;\n }\n };\n\n const zoomAnimRef = useRef<number | null>(null);\n const cancelZoomAnim = () => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n };\n\n const animateViewTo = (targetPan: Vec2, targetZoom: number) => {\n cancelWheelWork();\n cancelZoomAnim();\n const from = {\n pan: { ...viewRef.current.pan },\n zoom: viewRef.current.zoom,\n };\n const to = { pan: targetPan, zoom: targetZoom };\n if (\n from.zoom === to.zoom &&\n from.pan.x === to.pan.x &&\n from.pan.y === to.pan.y\n ) {\n return;\n }\n const started = performance.now();\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / EDITOR_ZOOM_ANIM_MS);\n const next = interpolateView(from, to, t);\n applyView(next.pan, next.zoom);\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n };\n\n const zoomAroundCenter = (factor: number) => {\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const user = clientToSvgUser(\n svg,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = clampEditorZoom(currentZoom * factor);\n if (nextZoom === currentZoom) return;\n animateViewTo(panAfterZoom(user, currentPan, currentZoom, nextZoom), nextZoom);\n };\n\n useImperativeHandle(ref, () => ({\n consumeRouteUndo: () => {\n const polygon = popPolygonDraftPoint(polygonPoints);\n if (polygon.consumed) {\n setPolygonPoints(polygon.points);\n setPolygonSnap(null);\n setAxisGuide(null);\n if (polygon.points.length === 0) setRubberCursor(null);\n return 'clear-only';\n }\n if (drawing.length > 0) {\n setDrawing([]);\n setDrawLockCircle(false);\n return 'clear-only';\n }\n const kind = routeSessionUndoKind({\n routeDraftPoint,\n storeLinkPreview,\n });\n clearRouteSession();\n return kind;\n },\n zoomIn: () => zoomAroundCenter(1.25),\n zoomOut: () => zoomAroundCenter(0.8),\n resetView: () => animateViewTo({ x: 0, y: 0 }, 1),\n }));\n\n const renderedZoom = viewRef.current.zoom;\n useLayoutEffect(() => {\n // Every commit: mid-wheel hover re-renders recompute worldPx from live\n // viewRef, so the CSS scale must reset in that same paint.\n sizeZoomRef.current = renderedZoom;\n syncViewDom(viewRef.current.pan, viewRef.current.zoom);\n });\n\n useEffect(\n () => () => {\n cancelZoomAnim();\n cancelWheelWork();\n },\n [],\n );\n\n useEffect(() => {\n setDrawing([]);\n setDrawLockCircle(false);\n setPolygonPoints([]);\n setLastRouteAnchor(null);\n setRouteDraftPoint(null);\n setStoreLinkPreview(null);\n setRubberCursor(null);\n setStubDrag(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setRouteCurveDrag(null);\n setSelectedRouteHandle(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setRoutePointerSnap(null);\n setEdgePress(null);\n setSplitJoinHover(null);\n if (!canJoinOpenEnds(tool)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n }\n setPolygonSnap(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [tool]);\n\n useEffect(() => {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setEdgePress(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setShapeDrag(null);\n setVertexDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n }, [selectedShapeId]);\n\n useEffect(() => {\n clearRouteSession();\n setStubDrag(null);\n setRoutePointerSnap(null);\n setUnderlayTip(null);\n setHoveredShapeId(null);\n setHoveredAnchorId(null);\n }, [level?.id]);\n\n const viewbox = unionViewBox(level?.sourceViewbox, baseViewbox);\n const svgUnderlayUrl =\n outdoorSvgUrl ?? levelSvgUrl ?? (level?.kind === 'outdoor' ? baseSvgUrl : null);\n const svgSuppressIds = useMemo(\n () =>\n svgIdsOwnedByShapes([...underlayShapes, ...shapes], {\n omitStaticLayers: interactiveOnly,\n }),\n [underlayShapes, shapes, interactiveOnly],\n );\n\n useLayoutEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n const measure = () => {\n const next = pxPerUserFromSvg(svg);\n setPxPerUser((prev) => (Math.abs(prev - next) < 1e-6 ? prev : next));\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [level?.id, viewbox.x, viewbox.y, viewbox.width, viewbox.height]);\n\n const editableShapes = useMemo(\n () => shapes.filter((s) => isEditableShape(s, interactiveOnly)),\n [shapes, interactiveOnly],\n );\n const openingShapes = useMemo(\n () => editableShapes.filter((s) => s.kind === 'void'),\n [editableShapes],\n );\n const openingClipId = `eyeon-opening-clip-${level?.id ?? 'none'}`;\n const openingHatchId = `eyeon-opening-hatch-${level?.id ?? 'none'}`;\n\n const selectedShape =\n editableShapes.find((s) => s.id === selectedShapeId) ?? null;\n\n const displayGeometry = useMemo(() => {\n if (!selectedShape) return null;\n if (shapeDrag && shapeDrag.shapeId === selectedShape.id) {\n return translateGeometry(shapeDrag.originGeometry, shapeOffset.x, shapeOffset.y);\n }\n return selectedShape.geometry;\n }, [selectedShape, shapeDrag, shapeOffset]);\n\n const splitJoinShapes = useMemo<ShapeGeo[]>(\n () =>\n editableShapes\n .filter((s) => canSplitJoinKind(s.kind) && !isStampShape(s))\n .map((s) => ({\n id: s.id,\n kind: s.kind,\n style: s.style,\n geometry: s.geometry,\n })),\n [editableShapes],\n );\n\n const polygonAnchorCandidates = useMemo(() => {\n const pts: Vec2[] = [];\n for (const shape of editableShapes) {\n if (isStampShape(shape)) continue;\n for (const ring of geometryToRings(shape.geometry)) {\n pts.push(...ring.anchors);\n }\n }\n return pts;\n }, [editableShapes]);\n\n const nearSplitJoinAnchor = (world: Vec2, tol: number): boolean => {\n if (hitOpenEnd(splitJoinShapes, world, tol)) return true;\n return splitJoinShapes.some(\n (shape) => hitTestVertex(shape.geometry, world, tol) != null,\n );\n };\n\n const snapPolygonPoint = (world: Vec2): Vec2 | null => {\n const own = polygonPoints.length >= 3 ? [polygonPoints[0]] : [];\n return nearestSnapPoint(\n world,\n [...own, ...polygonAnchorCandidates],\n worldPx(SNAP_HIT_PX),\n );\n };\n\n const commitSplitJoinEdits = (edits: ShapeBatchEdit[]) => {\n if (!edits.length) return;\n onBatchShapeEdits?.(edits);\n const deleted = new Set(\n edits.filter((e) => e.action === 'delete').map((e) => e.shapeId),\n );\n if (selectedShapeId != null && deleted.has(selectedShapeId)) {\n const survivor = edits.find((e) => e.action === 'update');\n onSelectShape(survivor && survivor.action === 'update' ? survivor.shapeId : null);\n }\n };\n\n const tryJoinOpenEnd = (world: Vec2): boolean => {\n if (!canJoinOpenEnds(tool) || readOnly) return false;\n const endHit =\n splitJoinSnapEnd ??\n hitOpenEnd(splitJoinShapes, world, worldPx(SNAP_HIT_PX), splitJoinPending);\n if (!endHit) return false;\n if (!splitJoinPending) {\n setSplitJoinPending(endHit);\n onSelectShape(endHit.shapeId);\n if (isSplitJoinTool(tool)) onToolChange?.('select');\n return true;\n }\n if (sameOpenEnd(splitJoinPending, endHit)) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n commitSplitJoinEdits(applySplitJoinJoin(splitJoinShapes, splitJoinPending, endHit));\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return true;\n };\n\n const handleSplitJoinAt = (world: Vec2): boolean => {\n if (tryJoinOpenEnd(world)) return true;\n if (!isSplitJoinTool(tool) || readOnly) return false;\n const endTol = worldPx(SNAP_HIT_PX);\n const edgeTol = worldPx(VERTEX_HIT_PX);\n const edgeHit = hitSplitJoinEdge(splitJoinShapes, world, edgeTol);\n if (edgeHit && !nearSplitJoinAnchor(world, endTol)) {\n commitSplitJoinEdits(\n applySplitJoinCut(splitJoinShapes, edgeHit, worldPx(SPLIT_JOIN_GAP_PX)),\n );\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n onSelectShape(edgeHit.shapeId);\n return true;\n }\n if (splitJoinPending) {\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n return true;\n }\n return false;\n };\n\n const toWorld = (clientX: number, clientY: number): Vec2 => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n return userToWorld(\n clientToSvgUser(svg, clientX, clientY),\n currentPan,\n currentZoom,\n );\n };\n\n const moveUnderlayTip = (e: React.PointerEvent, kind: ShapeKind) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (!rect) return;\n setUnderlayTip({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n text: underlaySwitchHint(kind),\n });\n };\n\n const insertAnchorOnEdge = (\n shape: CmShape,\n ringIndex: number,\n edgeIndex: number,\n point: Vec2,\n ) => {\n const next = insertVertex(shape.geometry, ringIndex, edgeIndex, point);\n onUpdateShapeGeometry(shape.id, next);\n setSelectedVertex({\n polygonIndex: ringIndex,\n vertexIndex: edgeIndex + 1,\n });\n setSelectedHandle(null);\n setHoveredEdge(null);\n };\n\n const beginEdgePress = (\n ringIndex: number,\n edgeIndex: number,\n insertAt: Vec2,\n e: React.PointerEvent,\n ) => {\n if (!selectedShape) return;\n e.stopPropagation();\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setEdgePress({\n shapeId: selectedShape.id,\n ringIndex,\n edgeIndex,\n start: toWorld(e.clientX, e.clientY),\n clientX: e.clientX,\n clientY: e.clientY,\n insertAt,\n originGeometry: displayGeometry ?? selectedShape.geometry,\n dragging: false,\n });\n };\n\n const deleteShapeAnchor = (ringIndex: number, vertexIndex: number) => {\n if (!selectedShape) return;\n const next = removeVertex(selectedShape.geometry, ringIndex, vertexIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const beginSplitJoinVertexDrag = (\n world: Vec2,\n e: React.PointerEvent,\n ): boolean => {\n if (!selectedShape || !displayGeometry) return false;\n const vertexHit = hitTestVertex(\n displayGeometry,\n world,\n worldPx(VERTEX_HIT_PX),\n );\n if (!vertexHit) return false;\n if (hitOpenEnd(splitJoinShapes, vertexHit.point, worldPx(4))) return false;\n if (e.detail >= 2) {\n deleteShapeAnchor(vertexHit.polygonIndex, vertexHit.vertexIndex);\n return true;\n }\n setSelectedVertex({\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: vertexHit.polygonIndex,\n vertexIndex: vertexHit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return true;\n };\n\n const deleteShapeHandle = (ringIndex: number, edgeIndex: number) => {\n if (!selectedShape) return;\n const next = flattenCubicEdge(selectedShape.geometry, ringIndex, edgeIndex);\n if (next === selectedShape.geometry) return;\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n setVertexDrag(null);\n };\n\n const hoverEdgeAt = (\n ringIndex: number,\n edgeIndex: number,\n clientX: number,\n clientY: number,\n ) => {\n if (!selectedShape) return;\n const world = toWorld(clientX, clientY);\n const ring = geometryToRings(displayGeometry ?? selectedShape.geometry)[\n ringIndex\n ];\n setHoveredEdge({\n ringIndex,\n edgeIndex,\n point: ring ? pointOnRingEdge(ring, edgeIndex, world) : world,\n });\n };\n\n const anchorById = useMemo(\n () => new Map(anchors.map((a) => [a.id, a])),\n [anchors],\n );\n const connectedAnchorIds = useMemo(() => {\n const ids = new Set<number>();\n edges.forEach((edge) => {\n ids.add(edge.fromAnchorId);\n ids.add(edge.toAnchorId);\n });\n return ids;\n }, [edges]);\n const routeAnchorDegreeById = useMemo(() => {\n const degree = new Map<number, number>();\n edges.forEach((edge) => {\n degree.set(\n edge.fromAnchorId,\n (degree.get(edge.fromAnchorId) ?? 0) + 1,\n );\n degree.set(\n edge.toAnchorId,\n (degree.get(edge.toAnchorId) ?? 0) + 1,\n );\n });\n return degree;\n }, [edges]);\n const dragRouteExcludeIds = useMemo(\n () =>\n dragAnchor == null\n ? new Set<number>()\n : routeComponentAnchorIds(dragAnchor, edges),\n [dragAnchor, edges],\n );\n const draggingOpenRouteAnchor =\n tool === 'select' &&\n dragAnchor != null &&\n anchorById.get(dragAnchor)?.shapeId == null &&\n (routeAnchorDegreeById.get(dragAnchor) ?? 0) <= 1;\n const dragRouteSnap =\n draggingOpenRouteAnchor && dragAnchorPoint\n ? nearestRouteSnap(\n dragAnchorPoint,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n )\n : null;\n const displayAnchorById = useMemo(() => {\n if (dragAnchor == null || !dragAnchorPoint) return anchorById;\n const dragged = anchorById.get(dragAnchor);\n if (!dragged) return anchorById;\n const next = new Map(anchorById);\n next.set(dragAnchor, {\n ...dragged,\n ...(dragRouteSnap?.point ?? dragAnchorPoint),\n });\n return next;\n }, [anchorById, dragAnchor, dragAnchorPoint, dragRouteSnap]);\n const routeEdgePath = useMemo(\n () =>\n edges\n .map((edge) => {\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n if (!from || !to) return '';\n return routeEdgePathD(\n from,\n to,\n displayRouteCurve(edge, anchorById, displayAnchorById),\n );\n })\n .filter(Boolean)\n .join(' '),\n [anchorById, displayAnchorById, edges],\n );\n const assignmentByShapeId = useMemo(\n () => new Map(assignments.map((row) => [row.shapeId, row])),\n [assignments],\n );\n const assignedOverlays = useMemo(\n () =>\n wayfindingOn\n ? wayfindingAssignedOverlays({\n shapes: editableShapes,\n underlayShapes,\n assignments,\n retailers,\n amenities,\n theme,\n })\n : [],\n [\n amenities,\n assignments,\n editableShapes,\n retailers,\n theme,\n underlayShapes,\n wayfindingOn,\n ],\n );\n\n const updateRoutePointerSnap = (clientX: number, clientY: number) => {\n const world = toWorld(clientX, clientY);\n if (\n routeDraftPoint ||\n storeLinkPreview ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null)\n ) {\n setRubberCursor(world);\n }\n setRoutePointerSnap(\n nearestRouteSnap(\n world,\n anchors,\n edges,\n storeLinkOriginIds(anchors, storeLinkPreview),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n showsCurveHandles(tool) ? 'edge' : 'junction',\n ),\n );\n };\n\n const closePolygon = () => {\n if (polygonPoints.length < 3) {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n return;\n }\n onCreateShape('unit', polygonsToGeometry([polygonPoints]));\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n };\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Shift') {\n const down = e.type === 'keydown';\n if (isEllipseDrawTool(tool)) setDrawLockCircle(down);\n if (!down) setAxisGuide(null);\n return;\n }\n if (!isSpacePanKey(e)) return;\n if (isEditableTypingTarget(e.target)) return;\n e.preventDefault();\n if (e.type === 'keydown' && e.repeat) return;\n const down = e.type === 'keydown';\n spaceHeldRef.current = down;\n setSpaceHeld(down);\n };\n const onBlur = () => {\n spaceHeldRef.current = false;\n setSpaceHeld(false);\n };\n window.addEventListener('keydown', onKey);\n window.addEventListener('keyup', onKey);\n window.addEventListener('blur', onBlur);\n return () => {\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('keyup', onKey);\n window.removeEventListener('blur', onBlur);\n };\n }, [tool]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (isPolygonDrawTool(tool)) {\n if (e.key === 'Enter') {\n e.preventDefault();\n closePolygon();\n } else if (e.key === 'Escape') {\n setPolygonPoints([]);\n setRubberCursor(null);\n setPolygonSnap(null);\n setAxisGuide(null);\n }\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n splitJoinPending != null\n ) {\n e.preventDefault();\n setSplitJoinPending(null);\n setSplitJoinHover(null);\n setSplitJoinSnapEnd(null);\n return;\n }\n if (\n e.key === 'Escape' &&\n !isEditableTypingTarget(e.target) &&\n (canPlaceNewRoute(tool) ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n lastRouteAnchor != null)\n ) {\n e.preventDefault();\n onUndo?.();\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n canEditShapeGeometry(tool, routeMode) &&\n showsShapeAnchors(tool) &&\n selectedVertex\n ) {\n e.preventDefault();\n const next = removeVertex(\n selectedShape.geometry,\n selectedVertex.polygonIndex,\n selectedVertex.vertexIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedVertex(null);\n }\n }\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n selectedShape &&\n canEditShapeGeometry(tool, routeMode) &&\n showsCurveHandles(tool) &&\n selectedHandle\n ) {\n e.preventDefault();\n const next = flattenCubicEdge(\n selectedShape.geometry,\n selectedHandle.ringIndex,\n selectedHandle.edgeIndex,\n );\n if (next !== selectedShape.geometry) {\n onUpdateShapeGeometry(selectedShape.id, next);\n setSelectedHandle(null);\n }\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n tool,\n polygonPoints,\n selectedShape,\n selectedVertex,\n selectedHandle,\n storeLinkPreview,\n routeDraftPoint,\n lastRouteAnchor,\n splitJoinPending,\n onUndo,\n ]);\n\n useEffect(() => {\n const node = canvasRef.current;\n if (!node) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n if (e.deltaY === 0) return;\n const svg = svgRef.current;\n if (!svg) return;\n cancelZoomAnim();\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n const nextZoom = nextEditorZoomFromWheel(currentZoom, e);\n if (nextZoom === currentZoom) return;\n viewRef.current = {\n pan: panAfterZoom(user, currentPan, currentZoom, nextZoom),\n zoom: nextZoom,\n };\n scheduleWheelPaint();\n };\n node.addEventListener('wheel', onWheel, { passive: false, capture: true });\n return () => {\n cancelWheelWork();\n node.removeEventListener('wheel', onWheel, { capture: true });\n };\n }, [Boolean(level)]);\n\n const beginPinch = () => {\n cancelWheelWork();\n cancelZoomAnim();\n const svg = svgRef.current;\n const pts = [...pointersRef.current.values()];\n if (!svg || pts.length < 2) return;\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const { pan: currentPan, zoom: currentZoom } = viewRef.current;\n pinchRef.current = {\n startDist: Math.max(1, Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y)),\n startZoom: currentZoom,\n world: userToWorld(user, currentPan, currentZoom),\n };\n panStart.current = null;\n setIsPanning(false);\n setDrawing([]);\n setShapeDrag(null);\n setVertexDrag(null);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n };\n\n const onCanvasPointerDownCapture = (e: React.PointerEvent) => {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (pointersRef.current.size >= 2) {\n e.preventDefault();\n e.stopPropagation();\n beginPinch();\n return;\n }\n // Space pan wins over shape, vertex, and route drags, including a press\n // that starts on the selected store.\n if (!spaceHeldRef.current || e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n beginPan(e, false);\n };\n\n const onCanvasPointerMoveCapture = (e: React.PointerEvent) => {\n if (pointersRef.current.has(e.pointerId)) {\n pointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n }\n if (!pinchRef.current || pointersRef.current.size < 2) return;\n const svg = svgRef.current;\n if (!svg) return;\n e.stopPropagation();\n const pts = [...pointersRef.current.values()];\n const dist = Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y);\n const mid = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n const user = clientToSvgUser(svg, mid.x, mid.y);\n const nextZoom = clampEditorZoom(\n pinchRef.current.startZoom * (dist / pinchRef.current.startDist),\n );\n applyView(panKeepingWorldAtUser(user, pinchRef.current.world, nextZoom), nextZoom);\n };\n\n const onCanvasPointerUpCapture = (e: React.PointerEvent) => {\n const wasPinching = pinchRef.current != null;\n pointersRef.current.delete(e.pointerId);\n if (pointersRef.current.size < 2) pinchRef.current = null;\n if (wasPinching) e.stopPropagation();\n };\n\n const beginPan = (e: React.PointerEvent, fromEmptySelect: boolean) => {\n cancelZoomAnim();\n const svg = svgRef.current;\n const user = svg\n ? clientToSvgUser(svg, e.clientX, e.clientY)\n : { x: e.clientX, y: e.clientY };\n panStart.current = {\n x: user.x,\n y: user.y,\n panX: viewRef.current.pan.x,\n panY: viewRef.current.pan.y,\n clientX: e.clientX,\n clientY: e.clientY,\n fromEmptySelect,\n };\n setIsPanning(true);\n const captureNode = svgRef.current ?? e.currentTarget;\n captureNode.setPointerCapture?.(e.pointerId);\n };\n\n const insertHoveredRoutePoint = (edgeId: number, point: Vec2) => {\n const created = onInsertRouteJunction(edgeId, point);\n if (canPlaceNewRoute(tool) && typeof created === 'number') {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, created);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== created) {\n onLinkRouteAnchors?.(lastRouteAnchor, created);\n setLastRouteAnchor(nextRouteChainAnchor(tool, created));\n } else {\n setLastRouteAnchor(created);\n }\n }\n selectAnchors(typeof created === 'number' ? [created] : []);\n };\n\n const removeWayfindingEdge = (edgeId: number) => {\n if (readOnly || !wayfindingOn) return;\n const edge = edges.find((item) => item.id === edgeId);\n onDeleteRouteEdge(edgeId);\n if (edge) {\n const remaining = edges.filter((item) => item.id !== edgeId);\n const orphans = [edge.fromAnchorId, edge.toAnchorId].filter(\n (id) => !anchorHasEdge(id, remaining),\n );\n setLastRouteAnchor((prev) =>\n prev != null && orphans.includes(prev) ? null : prev,\n );\n }\n setRoutePointerSnap(null);\n };\n\n const removeWayfindingAnchor = (anchorId: number) => {\n if (readOnly || !wayfindingOn) return;\n const removed = new Set(anchorsRemovedWithRouteAnchor(anchorId, edges));\n onDeleteRouteAnchor(anchorId);\n setLastRouteAnchor((prev) =>\n prev != null && removed.has(prev) ? null : prev,\n );\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setStoreLinkPreview(null);\n setRouteDraftPoint(null);\n setRubberCursor(null);\n setHoveredAnchorId((id) => (id != null && removed.has(id) ? null : id));\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (spaceHeldRef.current) {\n beginPan(e, false);\n return;\n }\n if (readOnly || tool === 'pan' || e.button === 1) {\n beginPan(e, false);\n return;\n }\n const world = toWorld(e.clientX, e.clientY);\n if (routeMode && !isWayfindingEditorTool(tool)) {\n onToolChange?.('select');\n return;\n }\n\n if (isSplitJoinTool(tool)) {\n if (beginSplitJoinVertexDrag(world, e)) return;\n if (handleSplitJoinAt(world)) return;\n beginPan(e, true);\n return;\n }\n\n if (isPolygonDrawTool(tool)) {\n const snapped = snapPolygonPoint(world) ?? polygonSnap;\n const constrained =\n e.shiftKey && !snapped && polygonPoints.length > 0\n ? constrainOrthogonal(polygonPoints[polygonPoints.length - 1], world)\n : null;\n const placed = snapped ?? constrained?.point ?? world;\n setAxisGuide(constrained);\n if (polygonPoints.length >= 3) {\n const first = polygonPoints[0];\n if (Math.hypot(placed.x - first.x, placed.y - first.y) <= worldPx(SNAP_HIT_PX)) {\n closePolygon();\n return;\n }\n }\n setPolygonPoints((prev) => [...prev, placed]);\n setRubberCursor(placed);\n setPolygonSnap(null);\n return;\n }\n\n if (wayfindingOn) {\n if (showsCurveHandles(tool)) {\n const curveSnap = nearestRouteSnap(\n world,\n anchors,\n edges,\n new Set(),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n 'edge',\n );\n const curveEdge =\n curveSnap?.type === 'edge'\n ? edges.find((edge) => edge.id === curveSnap.edgeId)\n : null;\n if (curveEdge && isCurvableRouteEdge(curveEdge)) {\n reportAnchors([]);\n setSelectedRouteEdgeId(curveEdge.id);\n return;\n }\n beginPan(e, true);\n return;\n }\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (storeLinkPreview) {\n if (snap?.type === 'edge' || snap?.type === 'junction') {\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n snap.point,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n }\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (canDeleteWayfindingItem(tool) && e.detail >= 2) return;\n if (snap?.type === 'edge') {\n if (!canPlaceNewRoute(tool)) {\n reportAnchors([]);\n setSelectedRouteEdgeId(snap.edgeId);\n return;\n }\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n return;\n }\n if (snap?.type === 'junction') {\n if (canPlaceNewRoute(tool)) {\n if (routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, snap.anchorId);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else if (lastRouteAnchor != null && lastRouteAnchor !== snap.anchorId) {\n onLinkRouteAnchors?.(lastRouteAnchor, snap.anchorId);\n setLastRouteAnchor(nextRouteChainAnchor(tool, snap.anchorId));\n } else {\n setLastRouteAnchor(snap.anchorId);\n }\n }\n selectAnchors([snap.anchorId]);\n return;\n }\n if (canPlaceNewRoute(tool)) {\n if (lastRouteAnchor != null) {\n const created = onCreateRoutePoint(world, lastRouteAnchor);\n setLastRouteAnchor(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\n setRubberCursor(world);\n return;\n }\n const next = beginOrContinueRouteDraft(routeDraftPoint, world);\n setRouteDraftPoint(next.nextDraft);\n setRubberCursor(world);\n if (next.start && next.end) {\n const created = onCreateRouteSegment(next.start, next.end);\n setLastRouteAnchor(\n nextRouteChainAnchor(\n tool,\n typeof created === 'number' ? created : null,\n ),\n );\n }\n return;\n }\n beginPan(e, true);\n return;\n }\n if (tool === 'draw-text') {\n const size = defaultLabelSize(viewbox);\n onCreateShape(\n 'label',\n textLabelGeometry(world, DEFAULT_LABEL_TEXT, size),\n { label: defaultTextLabel(DEFAULT_LABEL_TEXT, size, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-entrance') {\n onCreateShape(\n 'entrance',\n entranceIconGeometry(world, DEFAULT_ENTRANCE_SIZE),\n { label: defaultEntranceLabel(DEFAULT_ENTRANCE_SIZE, theme.STORE_TEXT_COLOR) },\n );\n return;\n }\n if (tool === 'draw-unit' || isEllipseDrawTool(tool)) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setDrawLockCircle(e.shiftKey);\n setDrawing([world, world]);\n return;\n }\n\n if (showsCurveHandles(tool) && selectedShape && displayGeometry) {\n const handleHit = hitTestHandle(displayGeometry, world, worldPx(HANDLE_HIT_PX));\n if (handleHit) {\n if (e.detail >= 2) {\n deleteShapeHandle(handleHit.ringIndex, handleHit.edgeIndex);\n return;\n }\n setSelectedHandle({\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: handleHit.ringIndex,\n edgeIndex: handleHit.edgeIndex,\n handle: handleHit.handle,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n const midHit = hitTestEdgeMidpoint(\n displayGeometry,\n world,\n worldPx(HANDLE_HIT_PX),\n );\n if (midHit && midHit.kind === 'line') {\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setVertexDrag({\n type: 'bend',\n shapeId: selectedShape.id,\n ringIndex: midHit.polygonIndex,\n edgeIndex: midHit.afterVertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (canJoinOpenEnds(tool) && tryJoinOpenEnd(world)) return;\n\n if (showsShapeAnchors(tool) && selectedShape && displayGeometry) {\n const handleTol = worldPx(VERTEX_HIT_PX);\n const hit = hitTestVertex(displayGeometry, world, handleTol);\n if (hit) {\n if (e.detail >= 2) {\n deleteShapeAnchor(hit.polygonIndex, hit.vertexIndex);\n return;\n }\n setSelectedVertex({\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: hit.polygonIndex,\n vertexIndex: hit.vertexIndex,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n return;\n }\n }\n\n if (tool === 'select' && selectedShape && displayGeometry) {\n const edgeHit = hitTestEdge(displayGeometry, world, worldPx(VERTEX_HIT_PX));\n if (edgeHit) {\n beginEdgePress(\n edgeHit.polygonIndex,\n edgeHit.afterVertexIndex,\n edgeHit.point,\n e,\n );\n return;\n }\n }\n\n if (emptyCanvasDragPans(tool)) {\n beginPan(e, tool === 'select');\n }\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n if (panStart.current) {\n const svg = svgRef.current;\n if (!svg) return;\n const user = clientToSvgUser(svg, e.clientX, e.clientY);\n const nextPan = {\n x: panStart.current.panX + (user.x - panStart.current.x),\n y: panStart.current.panY + (user.y - panStart.current.y),\n };\n applyView(nextPan, viewRef.current.zoom);\n return;\n }\n if (edgePress && selectedShape) {\n const world = toWorld(e.clientX, e.clientY);\n const screenMove = Math.hypot(\n e.clientX - edgePress.clientX,\n e.clientY - edgePress.clientY,\n );\n if (!edgePress.dragging && screenMove < EDGE_DRAG_PX) return;\n if (!edgePress.dragging) {\n setEdgePress({ ...edgePress, dragging: true });\n setHoveredEdge(null);\n }\n const next = translateEdge(\n edgePress.originGeometry,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n { x: world.x - edgePress.start.x, y: world.y - edgePress.start.y },\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (stubDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setStubDrag({ ...stubDrag, cursor: world });\n return;\n }\n if (dragAnchor != null) {\n setDragAnchorPoint(toWorld(e.clientX, e.clientY));\n return;\n }\n if (routeCurveDrag && onUpdateRouteCurve) {\n const edge = edges.find((item) => item.id === routeCurveDrag.edgeId);\n const from = edge ? displayAnchorById.get(edge.fromAnchorId) : undefined;\n const to = edge ? displayAnchorById.get(edge.toAnchorId) : undefined;\n if (edge && from && to) {\n const world = toWorld(e.clientX, e.clientY);\n const curve =\n routeCurveDrag.type === 'bend'\n ? bendRouteToCubic(from, to, world)\n : moveRouteHandle(\n routeCurveOf(edge) ?? bendRouteToCubic(from, to, world),\n routeCurveDrag.handle,\n world,\n );\n onUpdateRouteCurve(edge.id, curve, { live: true });\n }\n return;\n }\n if (vertexDrag && selectedShape) {\n try {\n svgRef.current?.setPointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be held */\n }\n const world = toWorld(e.clientX, e.clientY);\n const constrained =\n e.shiftKey && vertexDrag.type === 'anchor'\n ? constrainVertexOrthogonal(\n world,\n vertexNeighborPoints(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n ),\n )\n : null;\n const point = constrained?.point ?? world;\n setAxisGuide(vertexDrag.type === 'anchor' ? constrained : null);\n const next =\n vertexDrag.type === 'handle'\n ? moveHandle(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n vertexDrag.handle,\n world,\n )\n : vertexDrag.type === 'bend'\n ? bendEdgeToCubic(\n selectedShape.geometry,\n vertexDrag.ringIndex,\n vertexDrag.edgeIndex,\n world,\n )\n : moveVertex(\n selectedShape.geometry,\n vertexDrag.polygonIndex,\n vertexDrag.vertexIndex,\n point,\n );\n onUpdateShapeGeometry(selectedShape.id, next, { live: true });\n return;\n }\n if (shapeDrag) {\n const world = toWorld(e.clientX, e.clientY);\n setShapeOffset({\n x: world.x - shapeDrag.start.x,\n y: world.y - shapeDrag.start.y,\n });\n return;\n }\n if (\n (tool === 'draw-unit' || isEllipseDrawTool(tool)) &&\n drawing.length > 0\n ) {\n const world = toWorld(e.clientX, e.clientY);\n if (isEllipseDrawTool(tool)) setDrawLockCircle(e.shiftKey);\n setDrawing((prev) => {\n if (prev.length === 0) return prev;\n return [prev[0], world];\n });\n }\n if (isPolygonDrawTool(tool) && polygonPoints.length > 0) {\n const world = toWorld(e.clientX, e.clientY);\n const snap = snapPolygonPoint(world);\n if (snap) {\n setPolygonSnap(snap);\n setRubberCursor(snap);\n setAxisGuide(null);\n } else if (e.shiftKey) {\n const constrained = constrainOrthogonal(\n polygonPoints[polygonPoints.length - 1],\n world,\n );\n setPolygonSnap(null);\n setRubberCursor(constrained.point);\n setAxisGuide(constrained);\n } else {\n setPolygonSnap(null);\n setRubberCursor(world);\n setAxisGuide(null);\n }\n }\n if (\n wayfindingOn &&\n !stubDrag &&\n dragAnchor == null &&\n routeCurveDrag == null\n ) {\n updateRoutePointerSnap(e.clientX, e.clientY);\n }\n if (canJoinOpenEnds(tool) && !readOnly) {\n const world = toWorld(e.clientX, e.clientY);\n const snapTol = worldPx(SNAP_HIT_PX);\n const endHit = hitOpenEnd(\n splitJoinShapes,\n world,\n snapTol,\n splitJoinPending,\n );\n if (endHit && splitJoinPending) {\n setSplitJoinSnapEnd(endHit);\n setRubberCursor(endHit.point);\n setSplitJoinHover(null);\n } else {\n setSplitJoinSnapEnd(null);\n setRubberCursor(splitJoinPending ? world : null);\n setSplitJoinHover(\n isSplitJoinTool(tool) && !nearSplitJoinAnchor(world, snapTol)\n ? hitSplitJoinEdge(splitJoinShapes, world, worldPx(VERTEX_HIT_PX))\n : null,\n );\n }\n }\n };\n\n const finishRect = () => {\n if (drawing.length < 2) {\n setDrawing([]);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n return;\n }\n const poly = rectPolygon(a, b);\n onCreateShape('unit', polygonsToGeometry([poly]));\n setDrawing([]);\n setDrawLockCircle(false);\n };\n\n const finishEllipse = (lockCircle: boolean) => {\n if (drawing.length < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n const [a, b] = [drawing[0], drawing[drawing.length - 1]];\n if (dragSize(a, b) < 2) {\n setDrawing([]);\n setDrawLockCircle(false);\n return;\n }\n onCreateShape('unit', ellipseGeometry(a, b, lockCircle));\n setDrawing([]);\n setDrawLockCircle(false);\n };\n\n const onPointerUp = (e: React.PointerEvent) => {\n if (pinchRef.current) return;\n const endedPan = panStart.current;\n panStart.current = null;\n setIsPanning(false);\n if (!e.shiftKey) setAxisGuide(null);\n if (endedPan?.fromEmptySelect) {\n const moved = Math.hypot(\n e.clientX - endedPan.clientX,\n e.clientY - endedPan.clientY,\n );\n if (moved < 4) {\n onSelectShape(null);\n selectAnchors([]);\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setSplitJoinPending(null);\n setSplitJoinSnapEnd(null);\n setRubberCursor(null);\n }\n }\n onHistoryGestureEnd?.();\n if (stubDrag) {\n try {\n svgRef.current?.releasePointerCapture?.(e.pointerId);\n } catch {\n /* capture may already be released */\n }\n const moved = Math.hypot(\n e.clientX - stubDrag.clientX,\n e.clientY - stubDrag.clientY,\n );\n if (moved >= 4) {\n onConnectShapeToRoute(\n stubDrag.shapeId,\n stubDrag.origin,\n stubDrag.cursor,\n worldPx(WAYFINDING_SNAP_PX),\n );\n }\n setStubDrag(null);\n return;\n }\n if (edgePress) {\n if (!edgePress.dragging && selectedShape) {\n insertAnchorOnEdge(\n selectedShape,\n edgePress.ringIndex,\n edgePress.edgeIndex,\n edgePress.insertAt,\n );\n }\n setEdgePress(null);\n return;\n }\n if (vertexDrag) {\n setVertexDrag(null);\n return;\n }\n if (routeCurveDrag) {\n if (onUpdateRouteCurve) {\n const edge = edges.find((item) => item.id === routeCurveDrag.edgeId);\n const curve = edge ? routeCurveOf(edge) : null;\n if (curve) {\n onUpdateRouteCurve(edge!.id, curve);\n }\n }\n setRouteCurveDrag(null);\n return;\n }\n if (shapeDrag && selectedShape) {\n const next = translateGeometry(\n shapeDrag.originGeometry,\n shapeOffset.x,\n shapeOffset.y,\n );\n if (Math.hypot(shapeOffset.x, shapeOffset.y) >= 0.5) {\n onUpdateShapeGeometry(selectedShape.id, next);\n }\n setShapeDrag(null);\n setShapeOffset({ x: 0, y: 0 });\n return;\n }\n if (dragAnchor != null) {\n const moved = anchors.find((a) => a.id === dragAnchor);\n const point = dragAnchorPoint ?? moved;\n if (moved && point) {\n if (\n tool === 'select' &&\n moved.shapeId == null &&\n (routeAnchorDegreeById.get(moved.id) ?? 0) <= 1\n ) {\n const drop = toWorld(e.clientX, e.clientY);\n const snap = nearestRouteSnap(\n drop,\n anchors,\n edges,\n dragRouteExcludeIds,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (snap) {\n onConnectRouteAnchorToRoute(\n moved.id,\n drop,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n selectAnchors([\n snap.type === 'junction' ? snap.anchorId : moved.id,\n ]);\n setDragAnchor(null);\n setDragAnchorPoint(null);\n setRoutePointerSnap(null);\n return;\n }\n }\n if (Math.hypot(point.x - moved.x, point.y - moved.y) >= 0.01) {\n onMoveAnchor(moved.id, point.x, point.y);\n onHistoryGestureEnd?.();\n }\n const near = anchors\n .filter((a) => a.id !== moved.id)\n .filter((a) => Math.hypot(a.x - point.x, a.y - point.y) <= 2.5)\n .map((a) => a.id);\n if (near.length) selectAnchors([moved.id, ...near]);\n }\n setDragAnchor(null);\n setDragAnchorPoint(null);\n return;\n }\n if (tool === 'draw-unit') finishRect();\n if (isEllipseDrawTool(tool)) finishEllipse(e.shiftKey);\n };\n\n const pathDFromGeometry = (geometry: CmShape['geometry']): string => {\n const rings = geometryToRings(geometry);\n if (rings.length > 0) {\n return rings.map(ringToPathD).join(' ');\n }\n return (\n geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(geometry.polygons)\n );\n };\n\n const shapePathD = (shape: CmShape): string => {\n if (\n selectedShapeId === shape.id &&\n displayGeometry &&\n shapeDrag?.shapeId === shape.id\n ) {\n return pathDFromGeometry(displayGeometry);\n }\n return pathDFromGeometry(shape.geometry);\n };\n\n const stubExcludeIds = stubDrag\n ? storeLinkOriginIds(anchors, stubDrag)\n : storeLinkPreview\n ? storeLinkOriginIds(anchors, storeLinkPreview)\n : null;\n const stubSnap =\n stubDrag && stubExcludeIds\n ? nearestRouteSnap(\n stubDrag.cursor,\n anchors,\n edges,\n stubExcludeIds,\n worldPx(WAYFINDING_SNAP_PX),\n anchorById,\n )\n : storeLinkPreview && rubberCursor && stubExcludeIds\n ? routePointerSnap\n : null;\n const lastRoutePoint =\n lastRouteAnchor != null ? anchorById.get(lastRouteAnchor) : undefined;\n const routeRubberSnap =\n !stubDrag &&\n !storeLinkPreview &&\n rubberCursor &&\n (routeDraftPoint ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null))\n ? routePointerSnap\n : null;\n const hoveredRouteEdgeId =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.edgeId : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.edgeId : null) ??\n routeHover?.edgeId ??\n null;\n const highlightedRouteEdgeId =\n hoveredRouteEdgeId ??\n ((tool === 'select' || tool === 'curve') ? selectedRouteEdgeId : null);\n const highlightedRouteEdge =\n highlightedRouteEdgeId == null\n ? null\n : edges.find((edge) => edge.id === highlightedRouteEdgeId) ?? null;\n const highlightedRouteFrom = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.fromAnchorId)\n : null;\n const highlightedRouteTo = highlightedRouteEdge\n ? displayAnchorById.get(highlightedRouteEdge.toAnchorId)\n : null;\n const highlightedRoutePath =\n highlightedRouteEdge && highlightedRouteFrom && highlightedRouteTo\n ? routeEdgePathD(\n highlightedRouteFrom,\n highlightedRouteTo,\n displayRouteCurve(highlightedRouteEdge, anchorById, displayAnchorById),\n )\n : null;\n const routePlusAt =\n (dragRouteSnap?.type === 'edge' ? dragRouteSnap.point : null) ??\n (stubSnap?.type === 'edge' ? stubSnap.point : null) ??\n routeHover?.point ??\n null;\n const rubberFrom =\n stubDrag?.origin ??\n storeLinkPreview?.origin ??\n routeDraftPoint ??\n (canPlaceNewRoute(tool) && lastRoutePoint\n ? { x: lastRoutePoint.x, y: lastRoutePoint.y }\n : null);\n const rubberTo =\n stubDrag != null\n ? stubSnap?.point ?? stubDrag.cursor\n : stubSnap?.point ??\n routeRubberSnap?.point ??\n routeHover?.point ??\n rubberCursor;\n const rubberBand =\n (stubDrag != null ||\n storeLinkPreview != null ||\n routeDraftPoint != null ||\n (canPlaceNewRoute(tool) && lastRouteAnchor != null && rubberCursor != null))\n ? routeRubberBand(rubberFrom, rubberTo)\n : null;\n const polygonFollow =\n isPolygonDrawTool(tool) && polygonPoints.length > 0\n ? routeRubberBand(polygonPoints[polygonPoints.length - 1], rubberCursor)\n : null;\n const polygonClose =\n isPolygonDrawTool(tool) && polygonPoints.length >= 2\n ? routeRubberBand(rubberCursor, polygonPoints[0])\n : null;\n const hoveredLinkShape =\n hoveredShapeId != null\n ? editableShapes.find((shape) => shape.id === hoveredShapeId)\n : null;\n const wayfindingStoreHover =\n wayfindingOn &&\n !readOnly &&\n canPlaceNewRoute(tool) &&\n hoveredLinkShape != null &&\n isWayfindingShape(hoveredLinkShape.kind) &&\n !isTextLabel(hoveredLinkShape) &&\n !isEntranceIcon(hoveredLinkShape);\n const routeInsertHover =\n canPlaceNewRoute(tool) &&\n routePointerSnap?.type === 'edge' &&\n !stubDrag;\n const routeNetworkHover = routePointerSnap != null && !stubDrag;\n const mapCursor = editorMapCursor({\n tool,\n readOnly,\n spaceHeld,\n panning: isPanning,\n shapeDragging: shapeDrag != null,\n routeEdgeHover: routeHover != null && !stubDrag,\n routeNetworkHover,\n routeInsertHover,\n wayfindingStoreHover,\n anchorHover:\n (tool === 'select' || tool === 'curve') && hoveredAnchorId != null,\n anchorDragging:\n dragAnchor != null || stubDrag != null || routeCurveDrag != null,\n edgeDragging: !!edgePress?.dragging,\n edgeHover: hoveredEdge != null,\n });\n const canvasStyle: React.CSSProperties = {\n ...(editorCanvasStyle(showGrid, gridOpacity) ?? {}),\n ...(mapCursor ? { cursor: mapCursor } : {}),\n };\n\n if (!level) {\n return (\n <div\n className={editorCanvasClass(showGrid)}\n style={canvasStyle}\n >\n <div className=\"eyeon-map-canvas__empty\">{emptyMessage}</div>\n </div>\n );\n }\n\n return (\n <div\n ref={canvasRef}\n className={editorCanvasClass(showGrid)}\n style={canvasStyle}\n onPointerDownCapture={onCanvasPointerDownCapture}\n onPointerMoveCapture={onCanvasPointerMoveCapture}\n onPointerUpCapture={onCanvasPointerUpCapture}\n onPointerCancelCapture={onCanvasPointerUpCapture}\n >\n <svg\n ref={svgRef}\n className={`eyeon-map-canvas__svg${wayfindingOn ? ' is-wayfinding' : ''}`}\n viewBox={`${viewbox.x} ${viewbox.y} ${viewbox.width} ${viewbox.height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onPointerLeave={() => {\n setRoutePointerSnap(null);\n }}\n onMouseDown={(e) => {\n if (tool !== 'draw-text') e.preventDefault();\n }}\n onDoubleClick={(e) => {\n e.preventDefault();\n window.getSelection()?.removeAllRanges();\n if (\n readOnly ||\n !wayfindingOn ||\n !canDeleteWayfindingItem(tool)\n ) {\n return;\n }\n const hoverId =\n routePointerSnap?.type === 'edge'\n ? routePointerSnap.edgeId\n : null;\n if (hoverId == null) return;\n e.stopPropagation();\n removeWayfindingEdge(hoverId);\n }}\n >\n <g\n ref={viewGroupRef}\n className=\"eyeon-map-canvas__view\"\n transform={`translate(${viewRef.current.pan.x}, ${viewRef.current.pan.y}) scale(${viewRef.current.zoom})`}\n >\n <defs>\n <pattern\n id={openingHatchId}\n patternUnits=\"userSpaceOnUse\"\n width={14}\n height={14}\n >\n <rect width=\"14\" height=\"14\" fill=\"#94a3b8\" fillOpacity=\"0.16\" />\n <path d=\"M-2 16 L16 -2\" stroke=\"#64748b\" strokeWidth=\"1.15\" />\n </pattern>\n {openingShapes.length > 0 ? (\n <clipPath id={openingClipId}>\n {openingShapes.map((shape) => (\n <path key={shape.id} d={shapePathD(shape)} />\n ))}\n </clipPath>\n ) : null}\n </defs>\n {svgUnderlayUrl ? (\n <OutdoorSvgUnderlay\n url={svgUnderlayUrl}\n imageProxyUrl={imageProxyUrl}\n suppressIds={svgSuppressIds}\n theme={theme}\n />\n ) : null}\n\n {underlayShapes.filter(isUnderlayDrawnShape).map((shape) => {\n const hintable = !wayfindingOn && isUnderlayHintShape(shape.kind);\n const hovered = hintable && hoveredShapeId === shape.id;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\n return (\n <path\n key={`base-${shape.id}`}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={editorShapeEmphasisColor(publishedFill, hovered)}\n fillOpacity={hovered ? 0.4 : hintable ? 0.22 : 0.32}\n stroke={hovered ? editorShapeEmphasisColor(publishedFill, true) : '#94a3b8'}\n strokeWidth={(hovered ? 2 : 1) / zoom}\n strokeDasharray={hintable ? `${5 / zoom} ${4 / zoom}` : undefined}\n pointerEvents={hintable ? 'auto' : 'none'}\n style={{ cursor: hintable ? 'pointer' : undefined }}\n onPointerEnter={\n hintable\n ? (e) => {\n setHoveredShapeId(shape.id);\n moveUnderlayTip(e, shape.kind);\n }\n : undefined\n }\n onPointerMove={\n hintable ? (e) => moveUnderlayTip(e, shape.kind) : undefined\n }\n onPointerLeave={\n hintable\n ? () => {\n setHoveredShapeId((id) => (id === shape.id ? null : id));\n setUnderlayTip(null);\n }\n : undefined\n }\n onPointerDown={\n hintable\n ? (e) => {\n e.stopPropagation();\n setUnderlayTip(null);\n onSelectShape(shape.id);\n }\n : undefined\n }\n />\n );\n })}\n\n {openingShapes.length > 0 && openingUnderlayShapes.length > 0 ? (\n <g clipPath={`url(#${openingClipId})`} pointerEvents=\"none\">\n {openingUnderlayShapes.filter(isUnderlayDrawnShape).map((shape) => (\n <path\n key={`below-${shape.id}`}\n d={\n shape.geometry.paths.map((p) => p.d).join(' ') ||\n polygonsToPath(shape.geometry.polygons)\n }\n fill={editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n )}\n fillOpacity={0.55}\n stroke=\"#94a3b8\"\n strokeWidth={0.8 / zoom}\n />\n ))}\n </g>\n ) : null}\n\n {editableShapes.map((shape) => {\n const highlightable = isHoverHighlightShape(shape.kind);\n const selected = selectedShapeId === shape.id;\n const hovered = highlightable && hoveredShapeId === shape.id && !selected;\n const dragging = shapeDrag?.shapeId === shape.id;\n const textLabel = isTextLabel(shape);\n const entranceIcon = isEntranceIcon(shape);\n const stamp = textLabel || entranceIcon;\n const cursor = spaceHeld\n ? undefined\n : editorSelectCursor({\n tool,\n selected,\n highlightable,\n dragging,\n wayfinding:\n wayfindingOn &&\n !readOnly &&\n isWayfindingShape(shape.kind) &&\n !stamp,\n textLabel,\n entranceIcon,\n }) ??\n (isStampDrawTool(tool) ||\n (canEditShapeGeometry(tool, routeMode) && !readOnly)\n ? undefined\n : isShapeDrawTool(tool)\n ? 'cell'\n : 'default');\n const beginShapePointerDown = (e: React.PointerEvent) => {\n if (spaceHeldRef.current) {\n e.stopPropagation();\n beginPan(e, false);\n return;\n }\n if (readOnly) return;\n if (storeLinkPreview) return;\n // In Wayfinding, Curve and Select are route-only. Give the route\n // graph priority when a rendered store sits underneath it.\n if (wayfindingOn && (tool === 'select' || tool === 'curve')) {\n const world = toWorld(e.clientX, e.clientY);\n const routeSnap = nearestRouteSnap(\n world,\n anchors,\n edges,\n new Set(),\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n tool === 'curve' ? 'edge' : 'junction',\n );\n if (tool === 'curve' || routeSnap != null) return;\n if (\n tool === 'select' &&\n (!isWayfindingShape(shape.kind) || stamp)\n ) {\n return;\n }\n }\n if (\n wayfindingOn &&\n canPlaceNewRoute(tool) &&\n wayfindingLinksShapes(level) &&\n isWayfindingShape(shape.kind) &&\n !stamp\n ) {\n e.stopPropagation();\n const origin = toWorld(e.clientX, e.clientY);\n onEnsureShapeAnchor(shape.id, origin);\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview({ shapeId: shape.id, origin });\n setRubberCursor(origin);\n return;\n }\n if (stamp && isStampDrawTool(tool)) {\n e.stopPropagation();\n onSelectShape(shape.id);\n onToolChange?.('select');\n return;\n }\n if (!canEditShapeGeometry(tool, routeMode)) return;\n e.stopPropagation();\n const worldAt = toWorld(e.clientX, e.clientY);\n if (isSplitJoinTool(tool)) {\n if (beginSplitJoinVertexDrag(worldAt, e)) return;\n if (\n !canSplitJoinKind(shape.kind) ||\n !handleSplitJoinAt(worldAt)\n ) {\n onSelectShape(shape.id);\n }\n return;\n }\n if (tryJoinOpenEnd(worldAt)) return;\n onSelectShape(shape.id);\n if (tool !== 'select') return;\n const canDrag = selected || highlightable;\n if (!canDrag) return;\n const world = toWorld(e.clientX, e.clientY);\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n setShapeDrag({\n shapeId: shape.id,\n start: world,\n originGeometry: geometry,\n });\n setShapeOffset({ x: 0, y: 0 });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n };\n const hoverHandlers = highlightable\n ? {\n onPointerEnter: () => setHoveredShapeId(shape.id),\n onPointerLeave: () =>\n setHoveredShapeId((id) => (id === shape.id ? null : id)),\n }\n : undefined;\n if (entranceIcon) {\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n const box = geometryBBox(geometry);\n const size = shape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const iconUrl = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\n );\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={\n wayfindingOn ? undefined : { cursor: cursor ?? 'pointer' }\n }\n {...hoverHandlers}\n >\n <path\n d={shapePathD({ ...shape, geometry })}\n fill=\"transparent\"\n stroke={\n selected || hovered ? emphasisStroke : 'transparent'\n }\n strokeWidth={selected || hovered ? 1.5 / zoom : 0}\n onPointerDown={beginShapePointerDown}\n />\n {iconUrl ? (\n <image\n href={iconUrl}\n x={box.minX}\n y={box.minY}\n width={box.maxX - box.minX}\n height={box.maxY - box.minY}\n style={{ pointerEvents: 'none' }}\n />\n ) : null}\n </g>\n );\n }\n if (isTextLabel(shape)) {\n const geometry =\n selected && displayGeometry\n ? displayGeometry\n : shape.geometry;\n const box = geometryBBox(geometry);\n const size = shape.label.size ?? defaultLabelSize(viewbox);\n const rotate = shape.label.rotate ?? 0;\n const { x: cx, y: cy } = labelBoxCenter(box);\n const align = normalizeLabelAlign(shape.label.align);\n const textX = labelAlignX(box, align);\n const lines = labelTextLines(shape.label.text ?? '');\n const lineHeight = size * LABEL_LINE_HEIGHT;\n const blockHeight = lines.length * lineHeight;\n const emphasisStroke = editorShapeEmphasisColor(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n selected || hovered,\n );\n return (\n <g\n key={shape.id}\n transform={\n rotate ? `rotate(${rotate} ${cx} ${cy})` : undefined\n }\n style={\n wayfindingOn ? undefined : { cursor: cursor ?? 'pointer' }\n }\n {...hoverHandlers}\n >\n <path\n d={shapePathD({ ...shape, geometry })}\n fill=\"transparent\"\n stroke={\n selected || hovered ? emphasisStroke : 'transparent'\n }\n strokeWidth={selected || hovered ? 1.5 / zoom : 0}\n onPointerDown={beginShapePointerDown}\n />\n <text\n fontFamily={LABEL_FONT_FAMILY}\n fontSize={size}\n fill={shape.label.color ?? theme.STORE_TEXT_COLOR}\n textAnchor={labelSvgTextAnchor(align)}\n style={{\n userSelect: 'none',\n ...(wayfindingOn\n ? {}\n : { cursor: cursor ?? 'pointer' }),\n }}\n onPointerDown={beginShapePointerDown}\n >\n {lines.map((line, index) => (\n <tspan\n key={index}\n x={textX}\n y={cy - blockHeight / 2 + (index + 0.5) * lineHeight}\n dominantBaseline=\"central\"\n >\n {line || ' '}\n </tspan>\n ))}\n </text>\n </g>\n );\n }\n const baseOpacity = editorShapeFillOpacity(shape.kind);\n const opening = shape.kind === 'void';\n const emphasized = selected || hovered;\n const publishedFill = editorShapeFill(\n shape,\n theme,\n assignmentByShapeId.get(shape.id),\n );\n const emphasisFill = editorShapeEmphasisColor(\n opening ? '#94a3b8' : publishedFill,\n emphasized,\n );\n return (\n <path\n key={shape.id}\n d={shapePathD(shape)}\n fill={\n opening\n ? `url(#${openingHatchId})`\n : editorShapeEmphasisColor(publishedFill, emphasized)\n }\n fillOpacity={\n opening\n ? 1\n : editorHoverFillOpacity(\n shape.kind,\n baseOpacity,\n emphasized,\n )\n }\n stroke={emphasized ? emphasisFill : '#64748b'}\n strokeWidth={\n selected ? 2.5 / zoom : hovered ? 2 / zoom : 1 / zoom\n }\n strokeDasharray={\n opening && !selected && !hovered\n ? `${6 / zoom} ${4 / zoom}`\n : undefined\n }\n onPointerDown={beginShapePointerDown}\n style={wayfindingOn ? undefined : cursor ? { cursor } : undefined}\n {...hoverHandlers}\n />\n );\n })}\n\n {assignedOverlays.map((overlay) => (\n <AssignedShapeOverlay\n key={`assign-overlay-${overlay.shapeId}`}\n overlay={overlay}\n imageProxyUrl={imageProxyUrl}\n />\n ))}\n\n {/* Anchors (Select, Curve, Split / Join) + curve helpers (Curve only) */}\n {canEditShapeGeometry(tool, routeMode) &&\n selectedShape &&\n !isStampShape(selectedShape) &&\n geometryToRings(displayGeometry ?? selectedShape.geometry).map(\n (ring, ri) => {\n const n = edgeCount(ring);\n const items: React.ReactNode[] = [];\n for (let ei = 0; ei < n; ei++) {\n const edge = ring.edges[ei];\n const from = edgeFrom(ring, ei);\n const to = edgeTo(ring, ei);\n const hovered =\n hoveredEdge?.ringIndex === ri && hoveredEdge.edgeIndex === ei;\n const strokeD = edgeToPathD(ring, ei);\n if (tool === 'select') {\n items.push(\n <path\n key={`edge-hit-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={worldPx(VERTEX_HIT_PX * 2)}\n strokeLinecap=\"round\"\n style={{\n cursor: edgePress?.dragging ? 'grabbing' : 'none',\n }}\n onPointerEnter={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerMove={(e) =>\n hoverEdgeAt(ri, ei, e.clientX, e.clientY)\n }\n onPointerLeave={() =>\n setHoveredEdge((prev) =>\n prev?.ringIndex === ri && prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n if (tool !== 'select') return;\n const world = toWorld(e.clientX, e.clientY);\n const clickRing = geometryToRings(\n displayGeometry ?? selectedShape.geometry,\n )[ri];\n beginEdgePress(\n ri,\n ei,\n clickRing\n ? pointOnRingEdge(clickRing, ei, world)\n : world,\n e,\n );\n }}\n />,\n );\n if (hovered && hoveredEdge && !edgePress?.dragging) {\n const preview = hoveredEdge.point;\n const plus = worldPx(5);\n items.push(\n <path\n key={`edge-glow-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(14)}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <path\n key={`edge-hi-${selectedShape.id}-${ri}-${ei}`}\n d={strokeD}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(3.5)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />,\n <g\n key={`edge-add-${selectedShape.id}-${ri}-${ei}`}\n className=\"eyeon-map-screen-const\"\n pointerEvents=\"none\"\n >\n <circle\n cx={preview.x}\n cy={preview.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${preview.x} ${preview.y - plus} L ${preview.x} ${preview.y + plus} M ${preview.x - plus} ${preview.y} L ${preview.x + plus} ${preview.y}`}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>,\n );\n }\n }\n if (!showsCurveHandles(tool)) continue;\n if (edge?.kind === 'cubic') {\n const h1 = selectedHandle?.ringIndex === ri &&\n selectedHandle.edgeIndex === ei &&\n selectedHandle.handle === 1;\n const h2 = selectedHandle?.ringIndex === ri &&\n selectedHandle.edgeIndex === ei &&\n selectedHandle.handle === 2;\n items.push(\n <line\n key={`hl1-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={from.x}\n y1={from.y}\n x2={edge.c1.x}\n y2={edge.c1.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl1-${selectedShape.id}-${ri}-${ei}`}\n x1={from.x}\n y1={from.y}\n x2={edge.c1.x}\n y2={edge.c1.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl2-halo-${selectedShape.id}-${ri}-${ei}`}\n x1={to.x}\n y1={to.y}\n x2={edge.c2.x}\n y2={edge.c2.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <line\n key={`hl2-${selectedShape.id}-${ri}-${ei}`}\n x1={to.x}\n y1={to.y}\n x2={edge.c2.x}\n y2={edge.c2.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />,\n <HandleDot\n key={`h1-${selectedShape.id}-${ri}-${ei}`}\n cx={edge.c1.x}\n cy={edge.c1.y}\n r={worldPx(h1 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h1 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsCurveHandles(tool)) return;\n deleteShapeHandle(ri, ei);\n }}\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeHandle(ri, ei);\n return;\n }\n setSelectedHandle({\n ringIndex: ri,\n edgeIndex: ei,\n handle: 1,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n handle: 1,\n });\n }}\n />,\n <HandleDot\n key={`h2-${selectedShape.id}-${ri}-${ei}`}\n cx={edge.c2.x}\n cy={edge.c2.y}\n r={worldPx(h2 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h2 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsCurveHandles(tool)) return;\n deleteShapeHandle(ri, ei);\n }}\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeHandle(ri, ei);\n return;\n }\n setSelectedHandle({\n ringIndex: ri,\n edgeIndex: ei,\n handle: 2,\n });\n setSelectedVertex(null);\n setVertexDrag({\n type: 'handle',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n handle: 2,\n });\n }}\n />,\n );\n } else {\n const mid = {\n x: (from.x + to.x) / 2,\n y: (from.y + to.y) / 2,\n };\n items.push(\n <HandleDot\n key={`bend-${selectedShape.id}-${ri}-${ei}`}\n cx={mid.x}\n cy={mid.y}\n r={worldPx(BEND_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"grab\"\n onPointerDown={(e) => {\n if (!showsCurveHandles(tool)) return;\n e.stopPropagation();\n setSelectedVertex(null);\n setSelectedHandle(null);\n setHoveredEdge(null);\n setVertexDrag({\n type: 'bend',\n shapeId: selectedShape.id,\n ringIndex: ri,\n edgeIndex: ei,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n />,\n );\n }\n }\n if (!showsShapeAnchors(tool)) return items;\n ring.anchors.forEach((vertex, vi) => {\n if (\n canJoinOpenEnds(tool) &&\n !ring.closed &&\n (vi === 0 || vi === ring.anchors.length - 1)\n ) {\n return;\n }\n const selected =\n selectedVertex?.polygonIndex === ri &&\n selectedVertex?.vertexIndex === vi;\n items.push(\n <HandleDot\n key={`v-${selectedShape.id}-${ri}-${vi}`}\n cx={vertex.x}\n cy={vertex.y}\n r={worldPx(selected ? VERTEX_R_SELECTED_PX : VERTEX_R_PX)}\n hitR={worldPx(VERTEX_HIT_PX)}\n fill={selected ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!showsShapeAnchors(tool)) return;\n deleteShapeAnchor(ri, vi);\n }}\n onPointerDown={(e) => {\n if (!showsShapeAnchors(tool)) return;\n e.stopPropagation();\n if (e.detail >= 2) {\n deleteShapeAnchor(ri, vi);\n return;\n }\n setSelectedVertex({ polygonIndex: ri, vertexIndex: vi });\n setSelectedHandle(null);\n setVertexDrag({\n type: 'anchor',\n shapeId: selectedShape.id,\n polygonIndex: ri,\n vertexIndex: vi,\n });\n }}\n />,\n );\n });\n return items;\n },\n )}\n\n {wayfindingOn && routeEdgePath ? (\n <path\n className=\"eyeon-map-screen-stroke\"\n d={routeEdgePath}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n strokeOpacity={0.95}\n pointerEvents=\"none\"\n />\n ) : null}\n\n {wayfindingOn && highlightedRoutePath ? (\n <g pointerEvents=\"none\">\n <path\n className=\"eyeon-map-screen-stroke\"\n d={highlightedRoutePath}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(12)}\n style={screenStrokeStyle(worldPx(12))}\n strokeOpacity={0.22}\n strokeLinecap=\"round\"\n />\n <path\n className=\"eyeon-map-screen-stroke\"\n d={highlightedRoutePath}\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeLinecap=\"round\"\n />\n {canPlaceNewRoute(tool) && routePlusAt && !stubDrag ? (\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={routePlusAt.x}\n cy={routePlusAt.y}\n r={worldPx(9)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n />\n <path\n d={`M ${routePlusAt.x} ${routePlusAt.y - worldPx(5)} L ${routePlusAt.x} ${routePlusAt.y + worldPx(5)} M ${routePlusAt.x - worldPx(5)} ${routePlusAt.y} L ${routePlusAt.x + worldPx(5)} ${routePlusAt.y}`}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(2)}\n strokeLinecap=\"round\"\n />\n </g>\n ) : null}\n </g>\n ) : null}\n\n {wayfindingOn && rubberBand && (\n <g pointerEvents=\"none\">\n <line\n className=\"eyeon-map-screen-stroke\"\n x1={rubberBand.from.x}\n y1={rubberBand.from.y}\n x2={rubberBand.to.x}\n y2={rubberBand.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={8 / zoom}\n style={screenStrokeStyle(8 / zoom)}\n strokeOpacity={0.85}\n strokeLinecap=\"round\"\n />\n {(stubDrag || storeLinkPreview) && (\n <HandleDot\n cx={rubberBand.to.x}\n cy={rubberBand.to.y}\n r={worldPx(stubSnap ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill={stubSnap ? '#22c55e' : EDITOR_GUIDE_COLOR}\n fillOpacity={0.85}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"grabbing\"\n />\n )}\n </g>\n )}\n\n {wayfindingOn && routeDraftPoint && (\n <HandleDot\n cx={routeDraftPoint.x}\n cy={routeDraftPoint.y}\n r={worldPx(ANCHOR_R_PX)}\n hitR={worldPx(ANCHOR_HIT_PX)}\n fill=\"#0f172a\"\n fillOpacity={1}\n stroke=\"#fff\"\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor=\"default\"\n />\n )}\n\n {wayfindingOn && showsCurveHandles(tool)\n ? edges.filter((edge) => edge.id === selectedRouteEdgeId).map((edge) => {\n if (!isCurvableRouteEdge(edge)) return null;\n const from = displayAnchorById.get(edge.fromAnchorId);\n const to = displayAnchorById.get(edge.toAnchorId);\n if (!from || !to || from.levelId !== to.levelId) return null;\n const curve = displayRouteCurve(edge, anchorById, displayAnchorById);\n if (curve) {\n const h1 =\n selectedRouteHandle?.edgeId === edge.id &&\n selectedRouteHandle.handle === 1;\n const h2 =\n selectedRouteHandle?.edgeId === edge.id &&\n selectedRouteHandle.handle === 2;\n const beginHandle = (\n handle: 1 | 2,\n event: React.PointerEvent,\n ) => {\n if (readOnly || !onUpdateRouteCurve) return;\n event.stopPropagation();\n if (event.detail >= 2) {\n onUpdateRouteCurve(edge.id, null);\n setSelectedRouteHandle(null);\n setRouteCurveDrag(null);\n return;\n }\n setSelectedRouteHandle({ edgeId: edge.id, handle });\n setRouteCurveDrag({ type: 'handle', edgeId: edge.id, handle });\n svgRef.current?.setPointerCapture?.(event.pointerId);\n };\n return (\n <g key={`route-curve-${edge.id}`}>\n <line\n x1={from.x}\n y1={from.y}\n x2={curve.c1.x}\n y2={curve.c1.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <line\n x1={from.x}\n y1={from.y}\n x2={curve.c1.x}\n y2={curve.c1.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <line\n x1={to.x}\n y1={to.y}\n x2={curve.c2.x}\n y2={curve.c2.y}\n stroke=\"#fff\"\n strokeWidth={worldPx(HANDLE_LINE_HALO_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <line\n x1={to.x}\n y1={to.y}\n x2={curve.c2.x}\n y2={curve.c2.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(HANDLE_LINE_PX)}\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n <HandleDot\n cx={curve.c1.x}\n cy={curve.c1.y}\n r={worldPx(h1 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h1 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n if (readOnly || !onUpdateRouteCurve) return;\n onUpdateRouteCurve(edge.id, null);\n setSelectedRouteHandle(null);\n setRouteCurveDrag(null);\n }}\n onPointerDown={(event) => beginHandle(1, event)}\n />\n <HandleDot\n cx={curve.c2.x}\n cy={curve.c2.y}\n r={worldPx(h2 ? HANDLE_R_SELECTED_PX : HANDLE_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill={h2 ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n if (readOnly || !onUpdateRouteCurve) return;\n onUpdateRouteCurve(edge.id, null);\n setSelectedRouteHandle(null);\n setRouteCurveDrag(null);\n }}\n onPointerDown={(event) => beginHandle(2, event)}\n />\n </g>\n );\n }\n const mid = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n return (\n <HandleDot\n key={`route-bend-${edge.id}`}\n cx={mid.x}\n cy={mid.y}\n r={worldPx(BEND_R_PX)}\n hitR={worldPx(HANDLE_HIT_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"grab\"\n onPointerDown={(event) => {\n if (readOnly || !onUpdateRouteCurve) return;\n event.stopPropagation();\n setSelectedRouteHandle(null);\n setRouteCurveDrag({ type: 'bend', edgeId: edge.id });\n svgRef.current?.setPointerCapture?.(event.pointerId);\n }}\n />\n );\n })\n : null}\n\n {wayfindingOn &&\n anchors\n .filter((anchor) => wayfindingLinksShapes(level) || anchor.shapeId == null)\n .map((anchor) => {\n const selected = selectedAnchorIds.includes(anchor.id);\n const hovered = hoveredAnchorId === anchor.id;\n const shapeNode = anchor.shapeId != null;\n const connected = connectedAnchorIds.has(anchor.id);\n const displayAnchor = displayAnchorById.get(anchor.id) ?? anchor;\n const dragConnect = dragAnchor === anchor.id && dragRouteSnap != null;\n const nearWeld =\n selected &&\n selectedAnchorIds.some((id) => {\n if (id === anchor.id) return false;\n const other = anchorById.get(id);\n return (\n other &&\n Math.hypot(\n other.x - displayAnchor.x,\n other.y - displayAnchor.y,\n ) <= 2.5\n );\n });\n const visR = selected || shapeNode ? ANCHOR_R_SELECTED_PX : ANCHOR_R_PX;\n return (\n <g key={anchor.id}>\n <HandleDot\n cx={displayAnchor.x}\n cy={displayAnchor.y}\n r={worldPx(visR)}\n hitR={worldPx(WAYFINDING_ANCHOR_HIT_PX)}\n fill={\n dragConnect\n ? '#22c55e'\n : nearWeld\n ? '#22c55e'\n : shapeNode\n ? hovered\n ? '#f97316'\n : SHAPE_ROUTE_ANCHOR_FILL\n : selected\n ? hovered\n ? '#3b82f6'\n : EDITOR_GUIDE_COLOR\n : hovered\n ? '#334155'\n : '#0f172a'\n }\n fillOpacity={1}\n stroke={selected && shapeNode ? EDITOR_GUIDE_COLOR : '#fff'}\n strokeWidth={worldPx(ANCHOR_STROKE_PX)}\n cursor={\n wayfindingOn\n ? undefined\n : readOnly\n ? 'default'\n : dragAnchor === anchor.id\n ? 'grabbing'\n : 'pointer'\n }\n onPointerEnter={() => {\n if (!readOnly) setHoveredAnchorId(anchor.id);\n }}\n onPointerLeave={() =>\n setHoveredAnchorId((id) => (id === anchor.id ? null : id))\n }\n onDoubleClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (!canDeleteWayfindingItem(tool)) return;\n removeWayfindingAnchor(anchor.id);\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (readOnly || !wayfindingOn) return;\n if (canDeleteWayfindingItem(tool) && e.detail >= 2) return;\n const world = toWorld(e.clientX, e.clientY);\n const storeExclude = storeLinkOriginIds(anchors, storeLinkPreview);\n const snap = nearestRouteSnap(\n world,\n anchors,\n edges,\n storeExclude,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n anchorById,\n );\n if (storeLinkPreview) {\n if (\n storeExclude.has(anchor.id) &&\n snap?.type !== 'edge' &&\n snap?.type !== 'junction'\n ) {\n return;\n }\n if (snap?.type === 'edge' || snap?.type === 'junction') {\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n snap.point,\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (storeExclude.has(anchor.id)) return;\n onConnectShapeToRoute(\n storeLinkPreview.shapeId,\n storeLinkPreview.origin,\n { x: displayAnchor.x, y: displayAnchor.y },\n worldPx(WAYFINDING_ANCHOR_HIT_PX),\n );\n setStoreLinkPreview(null);\n setRubberCursor(null);\n return;\n }\n if (snap?.type === 'edge' && canPlaceNewRoute(tool)) {\n insertHoveredRoutePoint(snap.edgeId, snap.point);\n return;\n }\n if (canPlaceNewRoute(tool) && routeDraftPoint) {\n onCreateRoutePoint(routeDraftPoint, anchor.id);\n setRouteDraftPoint(null);\n setLastRouteAnchor(nextRouteChainAnchor(tool, anchor.id));\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.y });\n selectAnchors([anchor.id]);\n return;\n }\n if (\n canPlaceNewRoute(tool) &&\n lastRouteAnchor != null &&\n lastRouteAnchor !== anchor.id\n ) {\n onLinkRouteAnchors?.(lastRouteAnchor, anchor.id);\n setLastRouteAnchor(nextRouteChainAnchor(tool, anchor.id));\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.y });\n selectAnchors([anchor.id]);\n return;\n }\n if (canPlaceNewRoute(tool) && shapeNode && !connected) {\n setRouteDraftPoint(null);\n setLastRouteAnchor(null);\n setStoreLinkPreview({\n shapeId: anchor.shapeId!,\n origin: { x: displayAnchor.x, y: displayAnchor.y },\n });\n setRubberCursor({ x: displayAnchor.x, y: displayAnchor.y });\n return;\n }\n setLastRouteAnchor(anchor.id);\n selectAnchors(\n e.shiftKey\n ? selectedAnchorIds.includes(anchor.id)\n ? selectedAnchorIds.filter((id) => id !== anchor.id)\n : [...selectedAnchorIds, anchor.id]\n : [anchor.id],\n );\n setDragAnchor(anchor.id);\n setDragAnchorPoint({\n x: displayAnchor.x,\n y: displayAnchor.y,\n });\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }}\n />\n </g>\n );\n })}\n\n {canJoinOpenEnds(tool) &&\n !readOnly &&\n splitJoinShapes.flatMap((shape) => {\n const rings = geometryToRings(shape.geometry);\n const items: React.ReactNode[] = [];\n if (isSplitJoinTool(tool)) {\n rings.forEach((ring, ri) => {\n const n = edgeCount(ring);\n for (let ei = 0; ei < n; ei++) {\n const hovered =\n splitJoinHover?.shapeId === shape.id &&\n splitJoinHover.ringIndex === ri &&\n splitJoinHover.edgeIndex === ei;\n items.push(\n <path\n key={`sj-hit-${shape.id}-${ri}-${ei}`}\n d={edgeToPathD(ring, ei)}\n fill=\"none\"\n stroke={hovered ? EDITOR_GUIDE_COLOR : 'transparent'}\n strokeWidth={worldPx(hovered ? 10 : VERTEX_HIT_PX * 2)}\n strokeOpacity={hovered ? 0.28 : 1}\n strokeLinecap=\"round\"\n style={{ cursor: 'cell' }}\n onPointerLeave={() =>\n setSplitJoinHover((prev) =>\n prev?.shapeId === shape.id &&\n prev.ringIndex === ri &&\n prev.edgeIndex === ei\n ? null\n : prev,\n )\n }\n onPointerDown={(e) => {\n e.stopPropagation();\n handleSplitJoinAt(toWorld(e.clientX, e.clientY));\n }}\n />,\n );\n }\n });\n }\n listOpenEnds(shape.geometry).forEach((end) => {\n const id = {\n shapeId: shape.id,\n ringIndex: end.ringIndex,\n end: end.end,\n };\n const pending =\n splitJoinPending != null && sameOpenEnd(splitJoinPending, id);\n const snapped =\n splitJoinSnapEnd != null && sameOpenEnd(splitJoinSnapEnd, id);\n items.push(\n <HandleDot\n key={`sj-end-${shape.id}-${end.ringIndex}-${end.end}`}\n cx={end.point.x}\n cy={end.point.y}\n r={worldPx(VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={pending || snapped ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"pointer\"\n onPointerDown={(e) => {\n e.stopPropagation();\n tryJoinOpenEnd(end.point);\n }}\n />,\n );\n });\n return items;\n })}\n\n {isSplitJoinTool(tool) &&\n splitJoinHover &&\n !splitJoinHover.shared &&\n !splitJoinSnapEnd &&\n !nearSplitJoinAnchor(splitJoinHover.point, worldPx(SNAP_HIT_PX)) &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinHover.shapeId,\n );\n if (!shape) return null;\n const preview = previewCutPoints(\n shape.geometry,\n splitJoinHover.ringIndex,\n splitJoinHover.edgeIndex,\n splitJoinHover.point,\n worldPx(SPLIT_JOIN_GAP_PX),\n );\n if (!preview) return null;\n const hideOnAnchor = worldPx(VERTEX_R_PX + 2);\n if (\n nearSplitJoinAnchor(preview.p1, hideOnAnchor) ||\n nearSplitJoinAnchor(preview.p2, hideOnAnchor)\n ) {\n return null;\n }\n return (\n <g pointerEvents=\"none\">\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p1.x}\n cy={preview.p1.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n <g className=\"eyeon-map-screen-const\">\n <circle\n cx={preview.p2.x}\n cy={preview.p2.y}\n r={worldPx(BEND_R_PX)}\n fill=\"#fff\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n />\n </g>\n </g>\n );\n })()}\n\n {canJoinOpenEnds(tool) &&\n splitJoinPending &&\n rubberCursor &&\n (() => {\n const shape = splitJoinShapes.find(\n (s) => s.id === splitJoinPending.shapeId,\n );\n const from = shape\n ? listOpenEnds(shape.geometry).find(\n (end) =>\n end.ringIndex === splitJoinPending.ringIndex &&\n end.end === splitJoinPending.end,\n )?.point\n : null;\n if (!from) return null;\n const snapped = splitJoinSnapEnd != null;\n return (\n <line\n x1={from.x}\n y1={from.y}\n x2={rubberCursor.x}\n y2={rubberCursor.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={(snapped ? 2.6 : 2) / zoom}\n strokeDasharray={\n snapped ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n );\n })()}\n\n {drawing.length > 1 && isEllipseDrawTool(tool) && (() => {\n const bounds = ellipseBoundsFromDrag(\n drawing[0],\n drawing[drawing.length - 1],\n drawLockCircle,\n );\n return (\n <ellipse\n cx={bounds.cx}\n cy={bounds.cy}\n rx={Math.max(bounds.rx, 0)}\n ry={Math.max(bounds.ry, 0)}\n fill={theme.STORE_DEFAULT_COLOR}\n fillOpacity={0.2}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n pointerEvents=\"none\"\n />\n );\n })()}\n {drawing.length > 1 && tool === 'draw-unit' && (\n <rect\n x={Math.min(drawing[0].x, drawing[1].x)}\n y={Math.min(drawing[0].y, drawing[1].y)}\n width={Math.abs(drawing[1].x - drawing[0].x)}\n height={Math.abs(drawing[1].y - drawing[0].y)}\n fill={theme.STORE_DEFAULT_COLOR}\n fillOpacity={0.2}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n )}\n {axisGuide && (\n <line\n x1={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.x - 100000\n : axisGuide.through.x\n }\n y1={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.y\n : axisGuide.through.y - 100000\n }\n x2={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.x + 100000\n : axisGuide.through.x\n }\n y2={\n axisGuide.axis === 'horizontal'\n ? axisGuide.through.y\n : axisGuide.through.y + 100000\n }\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={1.25 / zoom}\n strokeDasharray={`${3 / zoom} ${5 / zoom}`}\n pointerEvents=\"none\"\n />\n )}\n {polygonPoints.length > 0 && isPolygonDrawTool(tool) && (\n <>\n <polyline\n points={polygonPoints.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"none\"\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom} ${4 / zoom}`}\n />\n {polygonFollow && (\n <line\n x1={polygonFollow.from.x}\n y1={polygonFollow.from.y}\n x2={polygonFollow.to.x}\n y2={polygonFollow.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={(polygonSnap ? 2.6 : 2) / zoom}\n strokeDasharray={\n polygonSnap ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n />\n )}\n {polygonClose && (\n <line\n x1={polygonClose.from.x}\n y1={polygonClose.from.y}\n x2={polygonClose.to.x}\n y2={polygonClose.to.y}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={2 / zoom}\n strokeOpacity={polygonSnap ? 0.7 : 0.4}\n strokeDasharray={\n polygonSnap ? undefined : `${6 / zoom} ${4 / zoom}`\n }\n strokeLinecap=\"round\"\n />\n )}\n {polygonPoints.map((p, i) => {\n const snapped = sameSnapPoint(polygonSnap, p);\n return (\n <HandleDot\n key={`pp-${i}`}\n cx={p.x}\n cy={p.y}\n r={worldPx(i === 0 ? VERTEX_R_SELECTED_PX : VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={i === 0 || snapped ? EDITOR_GUIDE_COLOR : '#fff'}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n />\n );\n })}\n {polygonSnap &&\n !polygonPoints.some((p) => sameSnapPoint(polygonSnap, p)) && (\n <HandleDot\n cx={polygonSnap.x}\n cy={polygonSnap.y}\n r={worldPx(VERTEX_R_PX)}\n hitR={worldPx(SNAP_HIT_PX)}\n fill={EDITOR_GUIDE_COLOR}\n stroke={EDITOR_GUIDE_COLOR}\n strokeWidth={worldPx(VERTEX_STROKE_PX)}\n cursor=\"crosshair\"\n />\n )}\n </>\n )}\n </g>\n </svg>\n {underlayTip ? (\n <div\n className=\"eyeon-map-canvas__underlay-tip\"\n style={{ left: underlayTip.x, top: underlayTip.y }}\n role=\"tooltip\"\n >\n {underlayTip.text}\n </div>\n ) : null}\n </div>\n );\n});\n\nEditorCanvas.displayName = 'EditorCanvas';\n","/** True while leaving the editor would drop work that is not in the saved draft. */\nexport function editorShouldWarnOnLeave(state: {\n pendingEdits: boolean;\n needsPublish: boolean;\n cameraDirty: boolean;\n gesture: boolean;\n saving: boolean;\n}): boolean {\n return (\n state.saving ||\n state.pendingEdits ||\n state.needsPublish ||\n state.cameraDirty ||\n state.gesture\n );\n}\n\n/**\n * Ask the browser to confirm close, reload, or navigation away from this\n * document. Switching to another tab does not unload the page, so browsers\n * do not fire this event for that.\n */\nexport function applyBeforeUnloadWarning(\n event: { preventDefault: () => void; returnValue: string },\n shouldWarn: boolean,\n): void {\n if (!shouldWarn) return;\n event.preventDefault();\n event.returnValue = '';\n}\n\n/**\n * Storybook renders the editor in a preview iframe. Chrome only shows the\n * leave dialog for the top-level document, so the listener has to sit on\n * that window as well as the editor frame.\n */\nexport function beforeUnloadTargets(frame: Window): Window[] {\n const targets: Window[] = [frame];\n try {\n const top = frame.top;\n if (top && top !== frame) targets.push(top);\n } catch {\n // Parent frame is cross-origin; the editor frame is the only hook.\n }\n return targets;\n}\n","import type {\n BatchOp,\n CmAnchor,\n CmConnector,\n CmLevel,\n CmRouteEdge,\n CmShape,\n ConnectorDirection,\n ConnectorKind,\n Vec2,\n} from '../core';\nimport { distance, geometryCentroid } from '../core';\n\nexport type VerticalRailKind = 'escalator' | 'elevator';\n\nexport interface ParsedConnectorSource {\n family: ConnectorKind;\n group: string;\n direction?: 'up' | 'down';\n role?: 'start' | 'end';\n}\n\nconst FAMILY_PREFIXES: Array<{ prefix: string; family: ConnectorKind }> = [\n { prefix: 'escalator', family: 'escalator' },\n { prefix: 'elevator', family: 'elevator' },\n { prefix: 'travelator', family: 'travelator' },\n { prefix: 'stairs', family: 'stairs' },\n { prefix: 'ramp', family: 'ramp' },\n];\n\nfunction normalizeId(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase().replace(/_/g, '-');\n}\n\n/** Parse v1-style ids: `escalator-5-up-start`, `elevator-2`. */\nexport function parseConnectorSourceId(\n value: string | null | undefined,\n): ParsedConnectorSource | null {\n const raw = normalizeId(value);\n if (!raw) return null;\n const family = FAMILY_PREFIXES.find(\n (item) => raw === item.prefix || raw.startsWith(`${item.prefix}-`),\n );\n if (!family) return null;\n const rest = raw.slice(family.prefix.length).replace(/^-+/, '');\n const parts = rest.split('-').filter(Boolean);\n let direction: 'up' | 'down' | undefined;\n let role: 'start' | 'end' | undefined;\n const groupParts: string[] = [];\n for (const part of parts) {\n if (part === 'up' || part === 'down') direction = part;\n else if (part === 'start' || part === 'end') role = part;\n else groupParts.push(part);\n }\n return {\n family: family.family,\n group: groupParts.join('-') || '1',\n direction,\n role,\n };\n}\n\nexport function guessConnectorKind(shape: {\n kind: string;\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorKind | null {\n return (\n parseConnectorSourceId(shape.sourceSvgId)?.family ??\n parseConnectorSourceId(shape.key)?.family ??\n null\n );\n}\n\nexport function connectorIdForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number | null {\n for (const anchor of anchors) {\n if (anchor.shapeId === shapeId && anchor.connectorId != null) {\n return anchor.connectorId;\n }\n }\n return null;\n}\n\nexport function connectorForShape(\n shapeId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): CmConnector | null {\n const id = connectorIdForShape(shapeId, anchors);\n if (id == null) return null;\n return connectors.find((item) => item.id === id) ?? null;\n}\n\nexport function resolvedConnectorKind(\n shape: { id: number; kind: string; key: string; sourceSvgId?: string | null },\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): ConnectorKind | null {\n return connectorForShape(shape.id, anchors, connectors)?.kind ?? guessConnectorKind(shape);\n}\n\nexport function railConnectorShapes<\n T extends { id: number; kind: string; key: string; sourceSvgId?: string | null; orphanedAt?: string | null },\n>(\n shapes: T[],\n kind: VerticalRailKind,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n connectors: CmConnector[],\n): T[] {\n return shapes.filter((shape) => {\n if (shape.orphanedAt) return false;\n if (shape.kind !== 'connector' && guessConnectorKind(shape) !== kind) return false;\n return resolvedConnectorKind(shape, anchors, connectors) === kind;\n });\n}\n\nexport function landingAnchor(\n shapeId: number,\n anchors: CmAnchor[],\n): CmAnchor | undefined {\n return (\n anchors.find((a) => a.shapeId === shapeId && a.kind === 'connector') ??\n anchors.find((a) => a.shapeId === shapeId && a.connectorId != null) ??\n anchors.find((a) => a.shapeId === shapeId)\n );\n}\n\nexport function shapeLandingPoint(shape: Pick<CmShape, 'geometry'>): Vec2 {\n const c = geometryCentroid(shape.geometry);\n if (Number.isFinite(c.x) && Number.isFinite(c.y)) return c;\n const first = shape.geometry.polygons[0]?.[0];\n return first ?? { x: 0, y: 0 };\n}\n\nexport function inferTravelDirection(\n fromLevelIndex: number,\n toLevelIndex: number,\n hint?: 'up' | 'down',\n): ConnectorDirection {\n if (hint) return hint;\n if (toLevelIndex > fromLevelIndex) return 'up';\n if (toLevelIndex < fromLevelIndex) return 'down';\n return 'both';\n}\n\nexport function defaultConnectorName(\n kind: VerticalRailKind,\n shapes: Array<{ key: string; sourceSvgId?: string | null }>,\n): string {\n for (const shape of shapes) {\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (parsed) {\n const label = kind === 'elevator' ? 'Elevator' : 'Escalator';\n return parsed.group && parsed.group !== '1' ? `${label} ${parsed.group}` : label;\n }\n }\n return kind === 'elevator' ? 'Elevator' : 'Escalator';\n}\n\nexport function nearestWalkAnchor(\n anchors: CmAnchor[],\n levelId: number,\n point: Vec2,\n excludeIds: ReadonlySet<number> = new Set(),\n): CmAnchor | null {\n let best: CmAnchor | null = null;\n let bestDist = Infinity;\n for (const anchor of anchors) {\n if (anchor.levelId !== levelId || excludeIds.has(anchor.id)) continue;\n if (anchor.kind !== 'junction' && anchor.kind !== 'unit') continue;\n const d = distance(anchor, point);\n if (d < bestDist) {\n best = anchor;\n bestDist = d;\n }\n }\n return best;\n}\n\nexport function memberShapeIds(\n connectorId: number,\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): number[] {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.connectorId === connectorId && anchor.shapeId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return [...ids];\n}\n\nexport type ConnectorEdgeLike = Pick<\n CmRouteEdge,\n 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'\n>;\n\nexport type ConnectorAnchorLike = Pick<CmAnchor, 'id' | 'shapeId' | 'connectorId'>;\n\nexport function partnerShapesForConnector<T extends { id: number }>(\n shapeId: number,\n anchors: ConnectorAnchorLike[],\n connectors: CmConnector[],\n shapes: T[],\n): T[] {\n const connector = connectorForShape(shapeId, anchors, connectors);\n if (!connector) return [];\n const ids = memberShapeIds(connector.id, anchors);\n return shapes.filter((s) => ids.includes(s.id) && s.id !== shapeId);\n}\n\nexport function levelsWithLandings<T extends { levelId: number }>(\n landings: T[],\n levels: CmLevel[],\n): CmLevel[] {\n const ids = new Set(landings.map((item) => item.levelId));\n return levels\n .filter((level) => ids.has(level.id))\n .slice()\n .sort((a, b) => a.ordering - b.ordering || a.levelIndex - b.levelIndex);\n}\n\nexport function escalatorDirectedEnds<T extends { id: number }>(\n connectorId: number,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): { from: T; to: T } | null {\n const memberAnchors = anchors.filter((a) => a.connectorId === connectorId);\n const memberIds = new Set(memberAnchors.map((a) => a.id));\n const ride = edges.find(\n (edge) =>\n edge.kind === 'connector' &&\n edge.directed &&\n memberIds.has(edge.fromAnchorId) &&\n memberIds.has(edge.toAnchorId),\n );\n if (!ride) return null;\n const fromAnchor = anchors.find((a) => a.id === ride.fromAnchorId);\n const toAnchor = anchors.find((a) => a.id === ride.toAnchorId);\n const from = shapes.find((s) => s.id === fromAnchor?.shapeId);\n const to = shapes.find((s) => s.id === toAnchor?.shapeId);\n if (!from || !to) return null;\n return { from, to };\n}\n\nfunction floorName(\n levelId: number,\n levels: Array<{ id: number; name: string }>,\n): string {\n return levels.find((level) => level.id === levelId)?.name ?? 'Floor';\n}\n\nfunction landingRideId(\n shape: { key: string; levelId: number },\n levels: Array<{ id: number; name: string }>,\n): string {\n return `${floorName(shape.levelId, levels)} · ${shape.key}`;\n}\n\nexport type EscalatorRideEnds<T extends { id: number; key: string; levelId: number }> = {\n connectorId: number;\n from: T;\n to: T;\n};\n\nexport type EscalatorRideLandingLine = {\n shapeId: number;\n key: string;\n levelName: string;\n};\n\n/**\n * One sidebar row per linked ride. Boarding is `from`, exit is `to`.\n * Unlinked landings are omitted — they stay in the Unassigned list.\n */\nexport function groupEscalatorRides<T extends { id: number; key: string; levelId: number }>(\n connectors: Array<Pick<CmConnector, 'id' | 'kind'>>,\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n shapes: T[],\n): EscalatorRideEnds<T>[] {\n const rides: EscalatorRideEnds<T>[] = [];\n for (const connector of connectors) {\n if (connector.kind !== 'escalator') continue;\n const directed = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (directed) {\n rides.push({ connectorId: connector.id, from: directed.from, to: directed.to });\n continue;\n }\n const ids = new Set(memberShapeIds(connector.id, anchors));\n const members = shapes.filter((shape) => ids.has(shape.id));\n if (members.length < 2) continue;\n rides.push({ connectorId: connector.id, from: members[0], to: members[1] });\n }\n return rides;\n}\n\n/** Boarding on top, exit below — each with its floor name. */\nexport function escalatorRideLandingLines<\n T extends { id: number; key: string; levelId: number },\n>(\n ride: EscalatorRideEnds<T>,\n levels: Array<{ id: number; name: string }>,\n): [EscalatorRideLandingLine, EscalatorRideLandingLine] {\n return [\n {\n shapeId: ride.from.id,\n key: ride.from.key,\n levelName: floorName(ride.from.levelId, levels),\n },\n {\n shapeId: ride.to.id,\n key: ride.to.key,\n levelName: floorName(ride.to.levelId, levels),\n },\n ];\n}\n\n/** Assigned-list title: boarding → exit (escalator) or floor landings ↔ (elevator). */\nexport function connectorRideLabel(\n shape: { id: number; key: string; levelId: number },\n anchors: ConnectorAnchorLike[],\n edges: ConnectorEdgeLike[],\n connectors: CmConnector[],\n shapes: Array<{ id: number; key: string; levelId: number }>,\n levels: Array<{ id: number; name: string; ordering?: number; levelIndex?: number }> = [],\n): string | null {\n const connector = connectorForShape(shape.id, anchors, connectors);\n if (!connector) return null;\n\n if (connector.kind === 'escalator') {\n const ride = escalatorDirectedEnds(connector.id, anchors, edges, shapes);\n if (ride) {\n return `${ride.from.key} → ${ride.to.key}`;\n }\n const partners = partnerShapesForConnector(shape.id, anchors, connectors, shapes);\n if (partners.length === 1) {\n return `${shape.key} → ${partners[0].key}`;\n }\n return null;\n }\n\n const members = [shape, ...partnerShapesForConnector(shape.id, anchors, connectors, shapes)];\n if (members.length < 2) return null;\n const order = new Map(\n levels.map((level, index) => [\n level.id,\n (level.ordering ?? level.levelIndex ?? index) * 1000 + (level.levelIndex ?? index),\n ]),\n );\n const sorted = members.slice().sort((a, b) => {\n const ai = order.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = order.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n return sorted.map((item) => landingRideId(item, levels)).join(' ↔ ');\n}\n\nfunction connectorEdgesBetween(\n edges: CmRouteEdge[],\n anchorIds: ReadonlySet<number>,\n): CmRouteEdge[] {\n return edges.filter(\n (edge) =>\n edge.kind === 'connector' &&\n anchorIds.has(edge.fromAnchorId) &&\n anchorIds.has(edge.toAnchorId),\n );\n}\n\nexport interface ConnectorPlanContext {\n mapId: number;\n levels: CmLevel[];\n shapes: CmShape[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n allocId: () => number;\n}\n\nfunction ensureLanding(\n ctx: ConnectorPlanContext,\n shape: CmShape,\n connectorId: number,\n ops: BatchOp[],\n): CmAnchor {\n const existing = landingAnchor(shape.id, ctx.anchors);\n const point = existing\n ? { x: existing.x, y: existing.y }\n : shapeLandingPoint(shape);\n if (existing) {\n if (existing.connectorId !== connectorId || existing.kind !== 'connector') {\n const next: CmAnchor = {\n ...existing,\n kind: 'connector',\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: next });\n ctx.anchors = ctx.anchors.map((a) => (a.id === next.id ? next : a));\n return next;\n }\n return existing;\n }\n const created: CmAnchor = {\n id: ctx.allocId(),\n levelId: shape.levelId,\n shapeId: shape.id,\n kind: 'connector',\n x: point.x,\n y: point.y,\n connectorId,\n };\n ops.push({ op: 'upsert_anchor', anchor: created });\n ctx.anchors = [...ctx.anchors, created];\n return created;\n}\n\nfunction linkLandingToWalk(\n ctx: ConnectorPlanContext,\n landing: CmAnchor,\n ops: BatchOp[],\n) {\n const near = nearestWalkAnchor(ctx.anchors, landing.levelId, landing, new Set([landing.id]));\n if (!near) return;\n const exists = ctx.edges.some(\n (e) =>\n (e.fromAnchorId === landing.id && e.toAnchorId === near.id) ||\n (e.fromAnchorId === near.id && e.toAnchorId === landing.id),\n );\n if (exists) return;\n const edge: CmRouteEdge = {\n id: ctx.allocId(),\n mapId: ctx.mapId,\n fromAnchorId: landing.id,\n toAnchorId: near.id,\n weight: null,\n directed: false,\n accessible: true,\n kind: 'walk',\n };\n ops.push({ op: 'upsert_edge', edge });\n ctx.edges = [...ctx.edges, edge];\n}\n\nfunction applyUnlinkLocal(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n const memberAnchors = ctx.anchors.filter((a) => a.connectorId === connectorId);\n const ids = new Set(memberAnchors.map((a) => a.id));\n const ops: BatchOp[] = [];\n for (const edge of connectorEdgesBetween(ctx.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n }\n ctx.edges = ctx.edges.filter(\n (e) =>\n !(e.kind === 'connector' && ids.has(e.fromAnchorId) && ids.has(e.toAnchorId)),\n );\n for (const anchor of memberAnchors) {\n ops.push({\n op: 'upsert_anchor',\n anchor: { ...anchor, connectorId: null },\n });\n }\n ctx.anchors = ctx.anchors.map((a) =>\n a.connectorId === connectorId ? { ...a, connectorId: null } : a,\n );\n ctx.connectors = ctx.connectors.filter((c) => c.id !== connectorId);\n ops.push({ op: 'delete_connector', connectorId });\n return ops;\n}\n\nfunction unlinkConnectorOps(ctx: ConnectorPlanContext, connectorId: number): BatchOp[] {\n return applyUnlinkLocal(ctx, connectorId);\n}\n\nexport function buildUnlinkConnectorOps(\n ctx: ConnectorPlanContext,\n connectorId: number,\n): BatchOp[] {\n return unlinkConnectorOps(ctx, connectorId);\n}\n\nexport function buildEscalatorLinkOps(\n ctx: ConnectorPlanContext,\n fromShape: CmShape,\n toShape: CmShape,\n options?: { name?: string; direction?: 'up' | 'down' },\n): BatchOp[] {\n const fromLevel = ctx.levels.find((l) => l.id === fromShape.levelId);\n const toLevel = ctx.levels.find((l) => l.id === toShape.levelId);\n const direction = inferTravelDirection(\n fromLevel?.levelIndex ?? 0,\n toLevel?.levelIndex ?? 0,\n options?.direction ??\n parseConnectorSourceId(fromShape.sourceSvgId)?.direction ??\n parseConnectorSourceId(toShape.sourceSvgId)?.direction,\n );\n const name =\n options?.name ?? defaultConnectorName('escalator', [fromShape, toShape]);\n\n const existingFrom = connectorIdForShape(fromShape.id, ctx.anchors);\n const existingTo = connectorIdForShape(toShape.id, ctx.anchors);\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n\n for (const id of new Set([existingFrom, existingTo].filter((v): v is number => v != null))) {\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'escalator',\n name,\n direction,\n accessible: false,\n };\n ops.push({ op: 'upsert_connector', connector });\n working.connectors = [...working.connectors, connector];\n\n const fromAnchor = ensureLanding(working, fromShape, connectorId, ops);\n const toAnchor = ensureLanding(working, toShape, connectorId, ops);\n linkLandingToWalk(working, fromAnchor, ops);\n linkLandingToWalk(working, toAnchor, ops);\n\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: fromAnchor.id,\n toAnchorId: toAnchor.id,\n weight: null,\n directed: true,\n accessible: false,\n kind: 'connector',\n },\n });\n return ops;\n}\n\nexport function buildElevatorShaftOps(\n ctx: ConnectorPlanContext,\n memberShapes: CmShape[],\n options?: { name?: string; accessible?: boolean; connectorId?: number },\n): BatchOp[] {\n const unique = new Map(memberShapes.map((s) => [s.id, s]));\n const members = [...unique.values()];\n if (members.length < 2) return [];\n\n const ops: BatchOp[] = [];\n const working: ConnectorPlanContext = {\n ...ctx,\n anchors: ctx.anchors.slice(),\n edges: ctx.edges.slice(),\n connectors: ctx.connectors.slice(),\n };\n const existingIds = new Set(\n members\n .map((s) => connectorIdForShape(s.id, working.anchors))\n .filter((id): id is number => id != null),\n );\n const keepId =\n options?.connectorId ??\n (existingIds.size === 1 ? [...existingIds][0] : undefined);\n\n for (const id of existingIds) {\n if (id === keepId) {\n const memberAnchors = working.anchors.filter((a) => a.connectorId === id);\n const ids = new Set(memberAnchors.map((a) => a.id));\n for (const edge of connectorEdgesBetween(working.edges, ids)) {\n ops.push({ op: 'delete_edge', edgeId: edge.id });\n working.edges = working.edges.filter((e) => e.id !== edge.id);\n }\n continue;\n }\n ops.push(...applyUnlinkLocal(working, id));\n }\n\n const connectorId = keepId ?? working.allocId();\n const connector: CmConnector = {\n id: connectorId,\n mapId: working.mapId,\n kind: 'elevator',\n name: options?.name ?? defaultConnectorName('elevator', members),\n direction: 'both',\n accessible: options?.accessible ?? true,\n };\n ops.push({ op: 'upsert_connector', connector });\n\n const landings = members.map((shape) => ensureLanding(working, shape, connectorId, ops));\n for (const landing of landings) linkLandingToWalk(working, landing, ops);\n\n for (let i = 0; i < landings.length; i++) {\n for (let j = i + 1; j < landings.length; j++) {\n ops.push({\n op: 'upsert_edge',\n edge: {\n id: working.allocId(),\n mapId: working.mapId,\n fromAnchorId: landings[i].id,\n toAnchorId: landings[j].id,\n weight: null,\n directed: false,\n accessible: connector.accessible,\n kind: 'connector',\n },\n });\n }\n }\n return ops;\n}\n\nexport function suggestEscalatorPairs(\n shapes: CmShape[],\n levels: CmLevel[],\n anchors: Array<Pick<CmAnchor, 'shapeId' | 'connectorId'>>,\n): Array<{ fromShapeId: number; toShapeId: number; label: string }> {\n const groups = new Map<string, CmShape[]>();\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n if (guessConnectorKind(shape) !== 'escalator') continue;\n if (connectorIdForShape(shape.id, anchors) != null) continue;\n const parsed =\n parseConnectorSourceId(shape.sourceSvgId) ?? parseConnectorSourceId(shape.key);\n if (!parsed) continue;\n const key = `${parsed.group}:${parsed.direction ?? ''}`;\n const list = groups.get(key) ?? [];\n list.push(shape);\n groups.set(key, list);\n }\n const suggestions: Array<{ fromShapeId: number; toShapeId: number; label: string }> = [];\n for (const [key, group] of groups) {\n if (group.length !== 2) continue;\n if (group[0].levelId === group[1].levelId) continue;\n const parsed =\n parseConnectorSourceId(group[0].sourceSvgId) ?? parseConnectorSourceId(group[0].key);\n const start =\n group.find((s) => parseConnectorSourceId(s.sourceSvgId)?.role === 'start') ??\n group[0];\n const end = group.find((s) => s.id !== start.id)!;\n const fromName = levels.find((l) => l.id === start.levelId)?.name ?? 'Floor';\n const toName = levels.find((l) => l.id === end.levelId)?.name ?? 'Floor';\n const dir = parsed?.direction ? ` ${parsed.direction}` : '';\n suggestions.push({\n fromShapeId: start.id,\n toShapeId: end.id,\n label: `Escalator ${key.split(':')[0]}${dir}: ${fromName} → ${toName}`,\n });\n }\n return suggestions;\n}\n","import type {\n BatchOp,\n BBox,\n CmAmenityCatalogItem,\n CmAnchor,\n CmBuilding,\n CmConnector,\n CmLevel,\n CmResponsiveOverride,\n CmRouteEdge,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n MapGeoreference,\n ThemeDefaults,\n} from '../core';\nimport {\n bboxOf,\n canonicalizeEntranceLabel,\n geometryBBox,\n mergeEntranceAwareLabel,\n normalizeGeometrySpace,\n parseShapeAssignment,\n routeCurveOf,\n} from '../core';\n\nexport interface EditorDraftState {\n mapId: number;\n centerId: number;\n theme: Partial<ThemeDefaults>;\n georeference?: MapGeoreference | null;\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n anchors: CmAnchor[];\n edges: CmRouteEdge[];\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n baseSvgUrl?: string | null;\n responsiveOverrides?: CmResponsiveOverride[];\n}\n\nfunction geometryBbox(geometry?: ShapeGeometry | null): BBox {\n const points = (geometry?.polygons ?? []).flat();\n return bboxOf(points);\n}\n\n/** True when another live shape already uses this ID on the floor. */\nexport function shapeKeyTakenOnLevel(\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n shapeId: number,\n levelId: number,\n key: string,\n): boolean {\n return shapes.some(\n (shape) =>\n shape.id !== shapeId &&\n shape.levelId === levelId &&\n shape.key === key &&\n !shape.orphanedAt,\n );\n}\n\nfunction upsertById<T extends { id: number }>(\n rows: T[],\n next: T,\n): T[] {\n const idx = rows.findIndex((row) => row.id === next.id);\n if (idx < 0) return [...rows, next];\n const copy = rows.slice();\n copy[idx] = next;\n return copy;\n}\n\nexport function applyDraftOp(\n draft: EditorDraftState,\n op: BatchOp,\n): EditorDraftState {\n switch (op.op) {\n case 'upsert_shape': {\n const incoming = op.shape;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.shapes.find((s) => s.id === id);\n const geometry = incoming.geometry ?? existing?.geometry ?? {\n paths: [],\n polygons: [],\n };\n const shape: CmShape = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n key: incoming.key ?? existing?.key ?? `shape-${id}`,\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n geometry,\n bbox:\n incoming.bbox ??\n (incoming.geometry != null\n ? geometryBbox(geometry)\n : existing?.bbox) ??\n geometryBbox(geometry),\n zIndex: incoming.zIndex ?? existing?.zIndex ?? 0,\n style: incoming.style ?? existing?.style ?? {},\n sourceSvgId: incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n label: mergeEntranceAwareLabel(existing?.label, incoming.label, {\n kind: incoming.kind ?? existing?.kind ?? 'unit',\n origin: incoming.origin ?? existing?.origin ?? 'manual',\n sourceSvgId:\n incoming.sourceSvgId ?? existing?.sourceSvgId ?? null,\n }),\n geometryLocked:\n incoming.geometryLocked ??\n (incoming.geometry != null ? true : existing?.geometryLocked) ??\n false,\n orphanedAt: incoming.orphanedAt ?? existing?.orphanedAt ?? null,\n };\n return { ...draft, shapes: upsertById(draft.shapes, shape) };\n }\n case 'delete_shape':\n return {\n ...draft,\n shapes: draft.shapes.filter((s) => s.id !== op.shapeId),\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_assignment': {\n const kind =\n draft.shapes.find((s) => s.id === op.assignment.shapeId)?.kind ?? 'unit';\n const assignment = parseShapeAssignment(op.assignment, kind);\n const rest = draft.assignments.filter((a) => a.shapeId !== assignment.shapeId);\n return { ...draft, assignments: [...rest, assignment] };\n }\n case 'delete_assignment':\n return {\n ...draft,\n assignments: draft.assignments.filter((a) => a.shapeId !== op.shapeId),\n };\n case 'upsert_anchor': {\n const incoming = op.anchor;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.anchors.find((a) => a.id === id);\n const anchor: CmAnchor = {\n id,\n levelId: incoming.levelId ?? existing?.levelId ?? 0,\n shapeId: incoming.shapeId ?? existing?.shapeId ?? null,\n kind: incoming.kind ?? existing?.kind ?? 'junction',\n x: incoming.x ?? existing?.x ?? 0,\n y: incoming.y ?? existing?.y ?? 0,\n connectorId:\n incoming.connectorId !== undefined\n ? incoming.connectorId\n : existing?.connectorId ?? null,\n };\n return { ...draft, anchors: upsertById(draft.anchors, anchor) };\n }\n case 'delete_anchor':\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => a.id !== op.anchorId),\n edges: draft.edges.filter(\n (e) => e.fromAnchorId !== op.anchorId && e.toAnchorId !== op.anchorId,\n ),\n };\n case 'upsert_edge': {\n const incoming = op.edge;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.edges.find((e) => e.id === id);\n const curve =\n incoming.curve !== undefined\n ? routeCurveOf({ curve: incoming.curve })\n : routeCurveOf(existing);\n const edge: CmRouteEdge = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n fromAnchorId: incoming.fromAnchorId ?? existing?.fromAnchorId ?? 0,\n toAnchorId: incoming.toAnchorId ?? existing?.toAnchorId ?? 0,\n weight: incoming.weight ?? existing?.weight ?? null,\n directed: incoming.directed ?? existing?.directed ?? false,\n accessible: incoming.accessible ?? existing?.accessible ?? true,\n kind: incoming.kind ?? existing?.kind ?? 'walk',\n ...(curve ? { curve } : {}),\n };\n return { ...draft, edges: upsertById(draft.edges, edge) };\n }\n case 'delete_edge':\n return { ...draft, edges: draft.edges.filter((e) => e.id !== op.edgeId) };\n case 'weld_anchors': {\n const ids = (op.anchorIds ?? []).filter((id) => Number.isFinite(id));\n if (ids.length < 2) return draft;\n const keep = ids[0];\n const removed = new Set(ids.slice(1));\n const edges = draft.edges\n .map((e) => ({\n ...e,\n fromAnchorId: removed.has(e.fromAnchorId) ? keep : e.fromAnchorId,\n toAnchorId: removed.has(e.toAnchorId) ? keep : e.toAnchorId,\n }))\n .filter((e) => e.fromAnchorId !== e.toAnchorId);\n return {\n ...draft,\n anchors: draft.anchors.filter((a) => !removed.has(a.id)),\n edges,\n };\n }\n case 'update_theme':\n return { ...draft, theme: { ...draft.theme, ...op.theme } };\n case 'update_georeference':\n return { ...draft, georeference: op.georeference };\n case 'upsert_connector': {\n const incoming = op.connector;\n const id = incoming.id;\n if (id == null) return draft;\n const existing = draft.connectors.find((c) => c.id === id);\n const connector: CmConnector = {\n id,\n mapId: incoming.mapId ?? existing?.mapId ?? draft.mapId,\n kind: incoming.kind ?? existing?.kind ?? 'escalator',\n name: incoming.name ?? existing?.name ?? 'Connector',\n direction: incoming.direction ?? existing?.direction ?? 'both',\n accessible: incoming.accessible ?? existing?.accessible ?? false,\n };\n return { ...draft, connectors: upsertById(draft.connectors, connector) };\n }\n case 'delete_connector':\n return {\n ...draft,\n connectors: draft.connectors.filter((c) => c.id !== op.connectorId),\n anchors: draft.anchors.map((a) =>\n a.connectorId === op.connectorId ? { ...a, connectorId: null } : a,\n ),\n };\n case 'delete_level':\n return omitLevelFromDraft(draft, op.levelId);\n default:\n return draft;\n }\n}\n\n/** Drop a floor/outdoor level and every draft row that lived on it. */\nexport function omitLevelFromDraft(\n draft: EditorDraftState,\n levelId: number,\n): EditorDraftState {\n const removedShapeIds = new Set(\n draft.shapes.filter((shape) => shape.levelId === levelId).map((shape) => shape.id),\n );\n const removedAnchorIds = new Set(\n draft.anchors.filter((anchor) => anchor.levelId === levelId).map((anchor) => anchor.id),\n );\n const anchors = draft.anchors.filter((anchor) => anchor.levelId !== levelId);\n const liveConnectorIds = new Set(\n anchors\n .map((anchor) => anchor.connectorId)\n .filter((id): id is number => id != null),\n );\n return {\n ...draft,\n levels: draft.levels.filter((level) => level.id !== levelId),\n shapes: draft.shapes.filter((shape) => shape.levelId !== levelId),\n assignments: draft.assignments.filter((row) => !removedShapeIds.has(row.shapeId)),\n anchors,\n edges: draft.edges.filter(\n (edge) =>\n !removedAnchorIds.has(edge.fromAnchorId) &&\n !removedAnchorIds.has(edge.toAnchorId),\n ),\n connectors: draft.connectors.filter((connector) => liveConnectorIds.has(connector.id)),\n responsiveOverrides: (draft.responsiveOverrides ?? []).filter(\n (row) => row.levelId !== levelId,\n ),\n };\n}\n\nexport function applyDraftOps(\n draft: EditorDraftState,\n ops: BatchOp[],\n): EditorDraftState {\n const seeded = {\n ...healDraftGeometry(draft),\n connectors: draft.connectors ?? [],\n responsiveOverrides: draft.responsiveOverrides ?? [],\n };\n return ops.reduce(applyDraftOp, seeded);\n}\n\n/**\n * Rebuild `polygons` from `paths` on rows written before the Y-flip removal,\n * so the canvas outline and its vertex handles agree without a re-import.\n */\nfunction healDraftGeometry(draft: EditorDraftState): EditorDraftState {\n let changed = false;\n const shapes = draft.shapes.map((shape) => {\n const geometry = normalizeGeometrySpace(shape.geometry);\n const label = canonicalizeEntranceLabel(shape) ?? shape.label;\n const geometryChanged = geometry !== shape.geometry;\n const labelChanged = label !== shape.label;\n if (!geometryChanged && !labelChanged) return shape;\n changed = true;\n return {\n ...shape,\n geometry,\n bbox: geometryChanged ? geometryBBox(geometry) : shape.bbox,\n label,\n };\n });\n return changed ? { ...draft, shapes } : draft;\n}\n\n/** Collapse repeated updates to the same entity so Save Changes sends one op each. */\nexport function coalesceDraftOp(ops: BatchOp[], op: BatchOp): BatchOp[] {\n if (op.op === 'update_theme') {\n const prev = ops.filter((item) => item.op === 'update_theme');\n const rest = ops.filter((item) => item.op !== 'update_theme');\n const theme = prev.reduce(\n (acc, item) => (item.op === 'update_theme' ? { ...acc, ...item.theme } : acc),\n {} as Record<string, unknown>,\n );\n return [...rest, { op: 'update_theme', theme: { ...theme, ...op.theme } }];\n }\n\n if (op.op === 'update_georeference') {\n const rest = ops.filter((item) => item.op !== 'update_georeference');\n return [...rest, op];\n }\n\n if (op.op === 'upsert_shape' && op.shape.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_shape' && item.shape.id === op.shape.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_shape') {\n const next = ops.slice();\n const merged = { ...ops[idx].shape, ...op.shape };\n next[idx] = {\n op: 'upsert_shape',\n shape: {\n ...merged,\n label: mergeEntranceAwareLabel(\n ops[idx].shape.label,\n op.shape.label,\n {\n kind: merged.kind ?? 'unit',\n origin: merged.origin,\n sourceSvgId: merged.sourceSvgId,\n },\n ),\n },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_anchor' && item.anchor.id === op.anchor.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_anchor') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_anchor',\n anchor: { ...ops[idx].anchor, ...op.anchor },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_connector' && op.connector.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_connector' && item.connector.id === op.connector.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_connector') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_connector',\n connector: { ...ops[idx].connector, ...op.connector },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_edge' && op.edge.id != null) {\n const idx = ops.findIndex(\n (item) => item.op === 'upsert_edge' && item.edge.id === op.edge.id,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_edge') {\n const next = ops.slice();\n next[idx] = {\n op: 'upsert_edge',\n edge: { ...ops[idx].edge, ...op.edge },\n };\n return next;\n }\n }\n\n if (op.op === 'upsert_assignment') {\n const idx = ops.findIndex(\n (item) =>\n item.op === 'upsert_assignment' &&\n item.assignment.shapeId === op.assignment.shapeId,\n );\n if (idx >= 0 && ops[idx].op === 'upsert_assignment') {\n const next = ops.slice();\n next[idx] = { op: 'upsert_assignment', assignment: op.assignment };\n return next;\n }\n }\n\n return [...ops, op];\n}\n\n/**\n * Persist order for POST /v1/map/batch.\n * Relinking an escalator coalesces landing upserts into the earlier unlink slot,\n * which would otherwise write `connector_id` before the new connector exists.\n *\n * `delete_edge` runs before `upsert_edge`. Splitting a corridor deletes the\n * old edge and inserts a replacement with the same endpoints; inserting first\n * violates `cm_route_edges (from_anchor_id, to_anchor_id)`.\n * Keep in sync with `admin-portal-backend` `orderBatchOpsForPersist`.\n */\nconst BATCH_PERSIST_RANK: Record<BatchOp['op'], number> = {\n upsert_building: 10,\n upsert_level: 20,\n upsert_shape: 30,\n upsert_assignment: 40,\n upsert_connector: 50,\n upsert_anchor: 60,\n delete_edge: 65,\n upsert_edge: 70,\n update_theme: 80,\n update_georeference: 85,\n weld_anchors: 90,\n delete_anchor: 110,\n delete_assignment: 120,\n delete_shape: 130,\n delete_connector: 140,\n delete_building: 150,\n delete_level: 160,\n};\n\nfunction edgePairKey(\n edge: Partial<CmRouteEdge> & { fromAnchorId: number; toAnchorId: number },\n): string {\n return `${edge.fromAnchorId}:${edge.toAnchorId}`;\n}\n\n/**\n * The editor log keeps every split and heal. Persist used to insert all of\n * those edges before deleting any, so two copies of the same anchor pair\n * landed in one transaction. Drop rows that this batch both creates and\n * removes, and keep only the last edge for each endpoint pair.\n */\nfunction compactRouteOpsForPersist(ops: BatchOp[]): BatchOp[] {\n const deletedEdgeIds = new Set<number>();\n const deletedAnchorIds = new Set<number>();\n const upsertedEdgeIds = new Set<number>();\n const upsertedAnchorIds = new Set<number>();\n\n for (const op of ops) {\n if (op.op === 'delete_edge') deletedEdgeIds.add(op.edgeId);\n if (op.op === 'delete_anchor') deletedAnchorIds.add(op.anchorId);\n if (op.op === 'upsert_edge' && op.edge.id != null) upsertedEdgeIds.add(op.edge.id);\n if (op.op === 'upsert_anchor' && op.anchor.id != null) {\n upsertedAnchorIds.add(op.anchor.id);\n }\n }\n\n const ephemeralAnchorIds = new Set(\n [...upsertedAnchorIds].filter((id) => id < 0 && deletedAnchorIds.has(id)),\n );\n\n const kept: BatchOp[] = [];\n for (const op of ops) {\n if (\n op.op === 'upsert_anchor' &&\n op.anchor.id != null &&\n deletedAnchorIds.has(op.anchor.id)\n ) {\n continue;\n }\n if (\n op.op === 'delete_anchor' &&\n op.anchorId < 0 &&\n upsertedAnchorIds.has(op.anchorId)\n ) {\n continue;\n }\n if (op.op === 'upsert_edge' && op.edge.id != null && deletedEdgeIds.has(op.edge.id)) {\n continue;\n }\n if (op.op === 'delete_edge' && op.edgeId < 0 && upsertedEdgeIds.has(op.edgeId)) {\n continue;\n }\n if (\n op.op === 'upsert_edge' &&\n (ephemeralAnchorIds.has(op.edge.fromAnchorId) ||\n ephemeralAnchorIds.has(op.edge.toAnchorId))\n ) {\n continue;\n }\n kept.push(op);\n }\n\n const lastIndexByPair = new Map<string, number>();\n kept.forEach((op, index) => {\n if (op.op !== 'upsert_edge') return;\n lastIndexByPair.set(edgePairKey(op.edge), index);\n });\n\n const curveByPair = new Map<string, CmRouteEdge['curve']>();\n kept.forEach((op) => {\n if (op.op !== 'upsert_edge') return;\n if (!Object.prototype.hasOwnProperty.call(op.edge, 'curve')) return;\n curveByPair.set(edgePairKey(op.edge), op.edge.curve ?? null);\n });\n\n const drop = new Set<number>();\n const extraDeletes: BatchOp[] = [];\n kept.forEach((op, index) => {\n if (op.op !== 'upsert_edge') return;\n const winner = lastIndexByPair.get(edgePairKey(op.edge));\n if (winner == null || winner === index) return;\n drop.add(index);\n const winnerOp = kept[winner];\n if (\n op.edge.id != null &&\n op.edge.id > 0 &&\n winnerOp.op === 'upsert_edge' &&\n winnerOp.edge.id !== op.edge.id &&\n !deletedEdgeIds.has(op.edge.id)\n ) {\n extraDeletes.push({ op: 'delete_edge', edgeId: op.edge.id });\n }\n });\n\n const merged = kept\n .filter((_, index) => !drop.has(index))\n .map((op) => {\n if (op.op !== 'upsert_edge') return op;\n if (!curveByPair.has(edgePairKey(op.edge))) return op;\n const curve = curveByPair.get(edgePairKey(op.edge));\n return {\n op: 'upsert_edge' as const,\n edge: curve ? { ...op.edge, curve } : { ...op.edge, curve: null },\n };\n });\n\n return [...merged, ...extraDeletes] as BatchOp[];\n}\n\nfunction sortBatchOps(ops: BatchOp[]): BatchOp[] {\n return ops\n .map((op, index) => ({ op, index }))\n .sort((a, b) => {\n const rank = BATCH_PERSIST_RANK[a.op.op] - BATCH_PERSIST_RANK[b.op.op];\n return rank !== 0 ? rank : a.index - b.index;\n })\n .map(({ op }) => op);\n}\n\nexport function orderBatchOpsForPersist(ops: BatchOp[]): BatchOp[] {\n return sortBatchOps(compactRouteOpsForPersist(ops));\n}\n","import React from 'react';\n\nfunction FieldResetIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.3 8a4.7 4.7 0 1 0 1.15-3.15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M3.1 2.6v3.3h3.3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function FieldResetButton({\n label,\n onClick,\n disabled,\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__field-reset\"\n aria-label={`Reset ${label}`}\n title=\"Reset\"\n disabled={disabled}\n onClick={onClick}\n >\n <FieldResetIcon />\n </button>\n );\n}\n","import { isTransparentColor } from '../core/color';\n\nexport { isTransparentColor, TRANSPARENT_COLOR } from '../core/color';\n\n/** Normalize `#rgb` / `#rrggbb` (with or without `#`) for `<input type=\"color\">`. */\nexport function normalizeHexColor(value: string): string | null {\n const match = value.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('');\n }\n return `#${hex}`;\n}\n\nexport function hexColorInputValue(value: string): string {\n return normalizeHexColor(value) ?? '#000000';\n}\n\nexport function sameHexColor(a: string, b: string): boolean {\n if (isTransparentColor(a) || isTransparentColor(b)) {\n return isTransparentColor(a) && isTransparentColor(b);\n }\n const left = normalizeHexColor(a);\n const right = normalizeHexColor(b);\n return left != null && left === right;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n assignNumberFromDraft,\n commitAssignNumberDraft,\n LABEL_ALIGNS,\n normalizeLabelAlign,\n type LabelAlign,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n hexColorInputValue,\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\n\nexport function StepperRow({\n label,\n value,\n disabled,\n extra,\n onChange,\n onStep,\n onHoldStart,\n onHoldEnd,\n}: {\n label: string;\n value: number;\n disabled: boolean;\n extra?: React.ReactNode;\n onChange: (value: number) => void;\n onStep: (delta: number) => void;\n onHoldStart: (delta: number) => void;\n onHoldEnd: () => void;\n}) {\n const [draft, setDraft] = useState(() => String(value));\n const focused = useRef(false);\n const syncDraft = useRef(false);\n\n useEffect(() => {\n if (!focused.current || syncDraft.current) {\n setDraft(String(value));\n syncDraft.current = false;\n }\n }, [value]);\n\n const commitDraft = (raw: string, persistIncomplete: boolean) => {\n const parsed = persistIncomplete\n ? commitAssignNumberDraft(raw)\n : { display: raw, render: assignNumberFromDraft(raw).render };\n setDraft(parsed.display);\n onChange(parsed.render);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">{label}</span>\n <div className=\"eyeon-map-assign__control\">\n {extra}\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Decrease ${label}`}\n onClick={() => onStep(-1)}\n onMouseDown={() => onHoldStart(-1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label={label}\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => commitDraft(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n commitDraft(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n syncDraft.current = true;\n onStep(e.key === 'ArrowUp' ? 1 : -1);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Increase ${label}`}\n onClick={() => onStep(1)}\n onMouseDown={() => onHoldStart(1)}\n onMouseUp={onHoldEnd}\n onMouseLeave={onHoldEnd}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ColorSwatch({\n label,\n hex,\n swatch,\n fallback,\n disabled,\n emptyIsTransparent = true,\n onHexChange,\n onCommit,\n onPick,\n}: {\n label: string;\n hex: string;\n swatch: string;\n fallback?: string;\n disabled?: boolean;\n emptyIsTransparent?: boolean;\n onHexChange: (value: string) => void;\n onCommit: () => void;\n onPick: (hex: string) => void;\n}) {\n const lastSolid = useRef(hexColorInputValue(fallback || swatch));\n const transparent =\n isTransparentColor(swatch) ||\n (emptyIsTransparent && !hex.trim());\n\n useEffect(() => {\n const solid = normalizeHexColor(swatch);\n if (solid) lastSolid.current = solid;\n }, [swatch]);\n\n const pickerValue = hexColorInputValue(transparent ? lastSolid.current : swatch);\n\n return (\n <div className=\"eyeon-map-assign__swatch\">\n <span\n className={\n transparent\n ? 'eyeon-map-assign__swatch-well is-transparent'\n : 'eyeon-map-assign__swatch-well'\n }\n style={transparent ? undefined : { backgroundColor: hexColorInputValue(swatch) }}\n >\n <input\n type=\"color\"\n className=\"eyeon-map-assign__swatch-native\"\n disabled={disabled}\n aria-label={label}\n value={pickerValue}\n onChange={(e) => {\n lastSolid.current = e.target.value;\n onPick(e.target.value);\n }}\n />\n </span>\n <input\n type=\"text\"\n spellCheck={false}\n disabled={disabled}\n aria-label={`${label} hex`}\n placeholder=\"Transparent\"\n value={transparent ? '' : hex}\n onChange={(e) => onHexChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n </div>\n );\n}\n\nexport function ColorRow({\n label,\n value,\n fallback,\n disabled,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback: string;\n disabled: boolean;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value);\n const display = transparent ? TRANSPARENT_COLOR : value.trim() ? value : fallback;\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onChange(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {onReset ? (\n <FieldResetButton label={label} onClick={onReset} disabled={disabled} />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n\nconst ALIGN_TOOLTIPS: Record<LabelAlign, string> = {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n};\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm0 4.3h8v1.4H2V7.3zm0 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm2 4.3h8v1.4H4V7.3zm-2 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M2 3h12v1.4H2V3zm4 4.3h8v1.4H6V7.3zm-4 4.3h12v1.4H2v-1.4z\"\n />\n </svg>\n );\n}\n\nconst ALIGN_ICONS: Record<LabelAlign, React.ReactNode> = {\n left: <AlignLeftIcon />,\n center: <AlignCenterIcon />,\n right: <AlignRightIcon />,\n};\n\nexport function AlignRow({\n value,\n disabled,\n onChange,\n}: {\n value?: LabelAlign;\n disabled: boolean;\n onChange: (align: LabelAlign) => void;\n}) {\n const align = normalizeLabelAlign(value);\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Alignment</span>\n <div className=\"eyeon-map-assign__align\" role=\"group\" aria-label=\"Alignment\">\n {LABEL_ALIGNS.map((option) => (\n <button\n key={option}\n type=\"button\"\n className={option === align ? 'is-active' : undefined}\n disabled={disabled}\n aria-label={ALIGN_TOOLTIPS[option]}\n aria-pressed={option === align}\n data-tooltip={ALIGN_TOOLTIPS[option]}\n onClick={() => onChange(option)}\n >\n {ALIGN_ICONS[option]}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function RotateIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"\n />\n </svg>\n );\n}\n\nexport function nextQuarterTurn(value: number): number {\n const angle = 45;\n let next = value;\n const remainder = next % angle;\n if (remainder !== 0) next -= remainder;\n next += angle;\n return next >= 360 ? 0 : next;\n}\n\n/** +/- drops the fraction, then steps by whole numbers. Typed decimals stay until then. */\nexport function stepWholeNumber(value: number, delta: number): number {\n if (!Number.isFinite(value)) return delta;\n if (delta > 0) return Math.floor(value) + delta;\n if (Number.isInteger(value)) return value + delta;\n return Math.floor(value);\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { CmShapeAssignment } from '../../core';\nimport { ColorRow, RotateIcon, StepperRow, nextQuarterTurn } from './formRows';\n\ntype StepKey = 'size' | 'rotate' | 'offsetX' | 'offsetY';\n\nexport interface AssignmentStyleFieldsProps {\n form: Pick<\n CmShapeAssignment,\n 'size' | 'rotate' | 'offsetX' | 'offsetY' | 'bgColor' | 'textColor'\n >;\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n textColorLabel?: string;\n showTextColor?: boolean;\n onPatch: (partial: Partial<CmShapeAssignment>) => void;\n}\n\n/** Size, rotate, offset, and colors — shared by kiosk / store / escalator assign. */\nexport function AssignmentStyleFields({\n form,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n textColorLabel = 'Text Color',\n showTextColor = true,\n onPatch,\n}: AssignmentStyleFieldsProps) {\n const formRef = useRef(form);\n formRef.current = form;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const bump = (key: StepKey, delta: number) => {\n onPatch({ [key]: (formRef.current[key] ?? 0) + delta });\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n return (\n <>\n <StepperRow\n label=\"Size\"\n value={form.size}\n disabled={!canEdit}\n onChange={(size) => onPatch({ size })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <StepperRow\n label=\"Rotate\"\n value={form.rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => onPatch({ rotate: nextQuarterTurn(form.rotate ?? 0) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(rotate) => onPatch({ rotate })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n <StepperRow\n label=\"Offset X\"\n value={form.offsetX}\n disabled={!canEdit}\n onChange={(offsetX) => onPatch({ offsetX })}\n onStep={(delta) => bump('offsetX', delta)}\n onHoldStart={(delta) => startHold('offsetX', delta)}\n onHoldEnd={() => stopHold('offsetX')}\n />\n <StepperRow\n label=\"Offset Y\"\n value={form.offsetY}\n disabled={!canEdit}\n onChange={(offsetY) => onPatch({ offsetY })}\n onStep={(delta) => bump('offsetY', delta)}\n onHoldStart={(delta) => startHold('offsetY', delta)}\n onHoldEnd={() => stopHold('offsetY')}\n />\n <ColorRow\n label=\"BG Color\"\n value={form.bgColor ?? ''}\n fallback={storeDefaultColor}\n disabled={!canEdit}\n onChange={(bgColor) => onPatch({ bgColor: bgColor || null })}\n onReset={form.bgColor ? () => onPatch({ bgColor: null }) : undefined}\n />\n {showTextColor ? (\n <ColorRow\n label={textColorLabel}\n value={form.textColor ?? ''}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(textColor) => onPatch({ textColor: textColor || null })}\n onReset={form.textColor ? () => onPatch({ textColor: null }) : undefined}\n />\n ) : null}\n </>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BatchOp, CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignmentPadFillFallback,\n emptyShapeAssignment,\n parseShapeAssignment,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport {\n buildElevatorShaftOps,\n buildEscalatorLinkOps,\n buildUnlinkConnectorOps,\n connectorForShape,\n connectorIdForShape,\n levelsWithLandings,\n memberShapeIds,\n resolvedConnectorKind,\n type ConnectorPlanContext,\n type VerticalRailKind,\n} from '../connectorAssignments';\nimport { connectorSpecialIconDataUrl } from '../../specialIcons';\n\nexport interface ConnectorAssignProps {\n shape: CmShape;\n railKind: VerticalRailKind;\n ctx: ConnectorPlanContext;\n canEdit: boolean;\n assignment?: CmShapeAssignment | null;\n storeDefaultColor: string;\n storeTextColor: string;\n onApplyOps: (ops: BatchOp[]) => void;\n onSaveAssignment?: (assignment: CmShapeAssignment) => void;\n}\n\nfunction connectorStyleAssignment(\n shape: CmShape,\n assignment: CmShapeAssignment | null | undefined,\n): CmShapeAssignment {\n const parsed = assignment\n ? parseShapeAssignment(assignment, 'connector')\n : emptyShapeAssignment(shape.id, 'connector');\n return {\n ...parsed,\n shapeId: shape.id,\n layerType: 'connector',\n };\n}\n\nexport function ConnectorAssign({\n shape,\n railKind,\n ctx,\n canEdit,\n assignment = null,\n storeDefaultColor,\n storeTextColor,\n onApplyOps,\n onSaveAssignment,\n}: ConnectorAssignProps) {\n const connector = connectorForShape(shape.id, ctx.anchors, ctx.connectors);\n const memberIds = connector ? memberShapeIds(connector.id, ctx.anchors) : [];\n const members = ctx.shapes.filter((s) => memberIds.includes(s.id));\n const partners = members.filter((s) => s.id !== shape.id);\n const partner = partners[0];\n const levelName = (levelId: number) =>\n ctx.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n\n const candidates = useMemo(\n () =>\n ctx.shapes.filter((item) => {\n if (item.id === shape.id || item.orphanedAt) return false;\n if (item.levelId === shape.levelId) return false;\n return resolvedConnectorKind(item, ctx.anchors, ctx.connectors) === railKind;\n }),\n [ctx.anchors, ctx.connectors, ctx.shapes, railKind, shape.id, shape.levelId],\n );\n\n const [exitFloorId, setExitFloorId] = useState(\n partner ? String(partner.levelId) : '',\n );\n const [targetId, setTargetId] = useState(partner ? String(partner.id) : '');\n const [stopFloorId, setStopFloorId] = useState('');\n const [styleForm, setStyleForm] = useState<CmShapeAssignment>(() =>\n connectorStyleAssignment(shape, assignment),\n );\n const styleFormRef = useRef(styleForm);\n styleFormRef.current = styleForm;\n\n useEffect(() => {\n setStyleForm(connectorStyleAssignment(shape, assignment));\n }, [shape, assignment]);\n\n const patchStyle = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n const next = connectorStyleAssignment(shape, {\n ...styleFormRef.current,\n ...partial,\n shapeId: shape.id,\n });\n setStyleForm(next);\n if (!canEdit) return;\n onSaveAssignment?.(next);\n },\n [canEdit, onSaveAssignment, shape],\n );\n\n useEffect(() => {\n setExitFloorId(partner ? String(partner.levelId) : '');\n setTargetId(partner ? String(partner.id) : '');\n }, [shape.id, connector?.id, partner?.id, partner?.levelId]);\n\n const exitFloors = levelsWithLandings(candidates, ctx.levels);\n const landingsOnExitFloor = candidates.filter(\n (item) => String(item.levelId) === exitFloorId,\n );\n\n const addable = candidates.filter((item) => !memberIds.includes(item.id));\n const addFloors = levelsWithLandings(addable, ctx.levels);\n const landingsOnStopFloor = addable.filter(\n (item) => String(item.levelId) === stopFloorId,\n );\n\n const applyEscalator = (from: CmShape, to: CmShape) => {\n onApplyOps(buildEscalatorLinkOps(ctx, from, to));\n };\n\n const applyElevator = (nextMembers: CmShape[]) => {\n if (nextMembers.length < 2) return;\n onApplyOps(\n buildElevatorShaftOps(ctx, nextMembers, {\n name: connector?.name,\n accessible: connector?.accessible ?? true,\n connectorId: connector?.id,\n }),\n );\n };\n\n const pickExitLanding = (nextId: string) => {\n setTargetId(nextId);\n const to = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!to || !canEdit) return;\n applyEscalator(shape, to);\n };\n\n const pickElevatorStop = (nextId: string) => {\n const next = ctx.shapes.find((s) => s.id === Number(nextId));\n if (!next || !canEdit) return;\n applyElevator([...members, shape, next]);\n setStopFloorId('');\n };\n\n const landingOptions = (\n landings: CmShape[],\n kind: VerticalRailKind,\n ) =>\n landings.map((item) => {\n const linked = connectorIdForShape(item.id, ctx.anchors) != null;\n return {\n value: String(item.id),\n label: item.key,\n hint: linked ? 'Linked' : undefined,\n iconUrl: connectorSpecialIconDataUrl(\n kind,\n linked,\n linked ? storeTextColor : undefined,\n ),\n iconMuted: !linked,\n };\n });\n\n return (\n <div className=\"eyeon-map-inspector\">\n <div className=\"eyeon-map-inspector__heading\">\n {railKind === 'escalator' ? 'Escalator ride' : 'Elevator shaft'}\n </div>\n {railKind === 'escalator' ? (\n <p className=\"eyeon-map-rail__hint\">\n People board this landing and get off at a different place on another\n floor. Travel is one-way.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n One shaft, many floors. Riders can go between any linked landings in\n both directions.\n </p>\n )}\n\n {railKind === 'escalator' && (\n <>\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Floor\"\n value={exitFloorId}\n disabled={!canEdit || exitFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={exitFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(nextFloor) => {\n setExitFloorId(nextFloor);\n setTargetId(\n partner && String(partner.levelId) === nextFloor\n ? String(partner.id)\n : '',\n );\n }}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Escalator Point\n <ModernSelect\n ariaLabel=\"Escalator Point\"\n value={targetId}\n disabled={!canEdit || !exitFloorId}\n placeholder={\n exitFloorId\n ? 'Choose an escalator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnExitFloor, 'escalator')}\n onChange={pickExitLanding}\n />\n </label>\n {partner ? (\n <p className=\"eyeon-map-rail__hint\">\n Linked: {shape.key} → {partner.key} ({levelName(shape.levelId)} →{' '}\n {levelName(partner.levelId)}, {connector?.direction ?? 'up'})\n </p>\n ) : null}\n {canEdit && connector ? (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink\n </button>\n </div>\n ) : null}\n </>\n )}\n\n {railKind === 'elevator' && (\n <>\n <div className=\"eyeon-map-rail__heading\">Stops</div>\n {members.map((item) => (\n <div key={item.id} className=\"eyeon-map-rail__row\">\n <span>\n {levelName(item.levelId)} ·{' '}\n <span className=\"eyeon-map-rail__row-id\">{item.key}</span>\n </span>\n {canEdit && members.length > 2 && item.id !== shape.id ? (\n <button\n type=\"button\"\n className=\"eyeon-map-rail__muted\"\n onClick={() => applyElevator(members.filter((s) => s.id !== item.id))}\n >\n Remove\n </button>\n ) : null}\n </div>\n ))}\n {members.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">This landing is not in a shaft yet.</p>\n ) : null}\n <label className=\"eyeon-map-rail__field\">\n Floor\n <ModernSelect\n ariaLabel=\"Add stop floor\"\n value={stopFloorId}\n disabled={!canEdit || addFloors.length === 0}\n placeholder=\"Choose a floor\"\n options={addFloors.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={setStopFloorId}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n Elevator Point\n <ModernSelect\n ariaLabel=\"Elevator Point\"\n value=\"\"\n disabled={!canEdit || !stopFloorId}\n placeholder={\n stopFloorId\n ? 'Choose an elevator on that floor'\n : 'Choose a floor first'\n }\n searchable\n options={landingOptions(landingsOnStopFloor, 'elevator')}\n onChange={pickElevatorStop}\n />\n </label>\n {canEdit && connector ? (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n onClick={() => onApplyOps(buildUnlinkConnectorOps(ctx, connector.id))}\n >\n Unlink shaft\n </button>\n </div>\n ) : null}\n </>\n )}\n\n {onSaveAssignment ? (\n <>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Design\n </div>\n <div className=\"eyeon-map-assign\">\n <AssignmentStyleFields\n form={styleForm}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n 'connector',\n storeDefaultColor,\n )}\n storeTextColor={storeTextColor}\n textColorLabel=\"Icon Color\"\n onPatch={patchStyle}\n />\n </div>\n </>\n ) : null}\n </div>\n );\n}\n","import type { ShapeKind, UnitStatus } from '../core';\n\nexport const SHAPE_KIND_LABELS: Record<ShapeKind, string> = {\n unit: 'Store',\n amenity: 'Amenity',\n kiosk_screen: 'Kiosk',\n connector: 'Connector',\n entrance: 'Entrance',\n walkable: 'Walkway',\n void: 'Open to Below',\n wall: 'Wall',\n boundary: 'Boundary',\n floorplate: 'Floor plate',\n decor: 'Decor',\n custom: 'Custom',\n label: 'Label',\n zone: 'Zone',\n parking_zone: 'Parking',\n green_area: 'Green area',\n water: 'Water',\n parking_icon: 'Parking icon',\n};\n\n/**\n * Types staff set in Edit Map. Text and entrance markers come from\n * their own tools, not this dropdown.\n */\nexport const EDITOR_TYPE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'custom',\n 'void',\n];\n\nconst TOOL_ONLY_KINDS: ShapeKind[] = ['label', 'wall'];\n\nexport function inspectorShowsType(kind: ShapeKind): boolean {\n return !TOOL_ONLY_KINDS.includes(kind);\n}\n\n/** Type dropdown: curated kinds, and the current kind if it is outside that list. */\nexport function inspectorTypeKinds(current?: ShapeKind | null): ShapeKind[] {\n if (\n current &&\n !EDITOR_TYPE_KINDS.includes(current) &&\n inspectorShowsType(current)\n ) {\n return [...EDITOR_TYPE_KINDS, current];\n }\n return EDITOR_TYPE_KINDS;\n}\n\nexport const UNIT_STATUS_LABELS: Record<UnitStatus, string> = {\n occupied: 'Occupied',\n vacant: 'Vacant',\n coming_soon: 'Coming soon',\n under_renovation: 'Under renovation',\n};\n\nexport function shapeKindLabel(kind: string): string {\n return SHAPE_KIND_LABELS[kind as ShapeKind] ?? kind;\n}\n","import { assignmentHasTarget, type CmShapeAssignment } from '../core';\n\nexport const ASSIGNABLE_SHAPE_KINDS = [\n 'unit',\n 'parking_zone',\n 'amenity',\n 'kiosk_screen',\n 'custom',\n] as const;\n\nexport type AssignableShapeKind = (typeof ASSIGNABLE_SHAPE_KINDS)[number];\n\nexport type AssignmentLike = Pick<\n CmShapeAssignment,\n 'shapeId' | 'targetType' | 'retailerId' | 'amenityId' | 'kioskId'\n> & {\n customLabel?: string | null;\n layerType?: CmShapeAssignment['layerType'] | null;\n customImageKey?: string | null;\n};\n\nexport type AssignableShape = {\n id: number;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport function isAssignableKind(kind: string): kind is AssignableShapeKind {\n return (ASSIGNABLE_SHAPE_KINDS as readonly string[]).includes(kind);\n}\n\nexport function isStoreShapeKind(kind: string): boolean {\n return kind === 'unit' || kind === 'parking_zone';\n}\n\nexport function isRetailerAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment && assignment.targetType === 'retailer' && assignment.retailerId != null,\n );\n}\n\nexport function isAmenityAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'amenity' &&\n (assignment.amenityId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isKioskAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return Boolean(\n assignment &&\n assignment.targetType === 'kiosk' &&\n (assignment.kioskId != null || Boolean(assignment.customLabel?.trim())),\n );\n}\n\nexport function isPolygonAssigned(assignment: AssignmentLike | null | undefined): boolean {\n return assignmentHasTarget(assignment);\n}\n\nexport function assignmentByShapeId(\n assignments: AssignmentLike[],\n): Map<number, AssignmentLike> {\n return new Map(assignments.map((item) => [item.shapeId, item]));\n}\n\n/** Assigned store / amenity / kiosk polygons, plus unassigned of each kind. */\nexport function railAssignmentGroups<T extends AssignableShape>(\n shapes: T[],\n assignments: AssignmentLike[],\n): {\n stores: T[];\n amenities: T[];\n kiosks: T[];\n unassignedStores: T[];\n unassignedAmenities: T[];\n unassignedKiosks: T[];\n custom: T[];\n unassignedCustom: T[];\n unassigned: T[];\n} {\n const byShape = assignmentByShapeId(assignments);\n const stores: T[] = [];\n const amenities: T[] = [];\n const kiosks: T[] = [];\n const unassignedStores: T[] = [];\n const unassignedAmenities: T[] = [];\n const unassignedKiosks: T[] = [];\n const custom: T[] = [];\n const unassignedCustom: T[] = [];\n const unassigned: T[] = [];\n for (const shape of shapes) {\n if (shape.orphanedAt) continue;\n const assignment = byShape.get(shape.id) ?? null;\n if (shape.kind === 'custom') {\n if (isPolygonAssigned(assignment)) custom.push(shape);\n else unassignedCustom.push(shape);\n continue;\n }\n if (isRetailerAssigned(assignment)) stores.push(shape);\n else if (isAmenityAssigned(assignment)) amenities.push(shape);\n else if (isKioskAssigned(assignment)) kiosks.push(shape);\n else if (isAssignableKind(shape.kind) && !isPolygonAssigned(assignment)) {\n unassigned.push(shape);\n if (isStoreShapeKind(shape.kind)) unassignedStores.push(shape);\n else if (shape.kind === 'amenity') unassignedAmenities.push(shape);\n else if (shape.kind === 'kiosk_screen') unassignedKiosks.push(shape);\n }\n }\n return {\n stores,\n amenities,\n kiosks,\n unassignedStores,\n unassignedAmenities,\n unassignedKiosks,\n custom,\n unassignedCustom,\n unassigned,\n };\n}\n","import type { MapAssignKiosk } from '../core';\n\nexport type KioskShapeOption = {\n id: number;\n key: string;\n kind: string;\n orphanedAt?: string | null;\n};\n\nexport type CatalogKioskAssignment = {\n shapeId: number;\n kioskId?: number | null;\n};\n\nexport function isKioskScreenKind(kind: string): boolean {\n return kind === 'kiosk_screen';\n}\n\nexport function kioskScreenShapes<T extends KioskShapeOption>(shapes: T[]): T[] {\n return shapes.filter((shape) => isKioskScreenKind(shape.kind) && !shape.orphanedAt);\n}\n\nexport function catalogKioskShapeOptions(\n shapes: KioskShapeOption[],\n): Array<{ value: string; label: string }> {\n return kioskScreenShapes(shapes).map((shape) => ({\n value: String(shape.id),\n label: shape.key,\n }));\n}\n\nexport function shapeIdForCatalogKiosk(\n kioskId: number,\n assignments: CatalogKioskAssignment[],\n): number | null {\n return assignments.find((row) => row.kioskId === kioskId)?.shapeId ?? null;\n}\n\nexport function leftoverCatalogKiosks<T extends { id: number }>(\n kiosks: T[],\n assignments: CatalogKioskAssignment[],\n): T[] {\n const used = new Set(\n assignments\n .map((row) => row.kioskId)\n .filter((id): id is number => id != null),\n );\n return kiosks.filter((kiosk) => !used.has(kiosk.id));\n}\n\nexport function catalogKioskRowLabel(\n kiosk: MapAssignKiosk,\n assignedKey: string | null,\n): { title: string; id: string; tags: string[] } {\n return {\n title: kiosk.name.trim() || `Kiosk ${kiosk.id}`,\n id: `kiosk-${kiosk.id}`,\n tags: assignedKey ? [assignedKey] : ['Unlinked'],\n };\n}\n","import { compareBuildingFloors } from '../core';\n\n/** Title + tags for Map options shape lists (Stores, Amenities, …). */\nexport function railRowLabels(input: {\n key: string;\n kindLabel: string;\n levelName: string;\n assignedName?: string | null;\n /** Kind tag is only for the Unassigned module (mixed types). */\n showKindTag?: boolean;\n}): { title: string | null; id: string; tags: string[] } {\n const name = input.assignedName?.trim() || null;\n const tags = [input.levelName];\n if (input.showKindTag) tags.push(input.kindLabel);\n return { title: name, id: input.key, tags };\n}\n\nexport const RAIL_ITEM_SECTIONS = [\n 'stores',\n 'amenities',\n 'kiosks',\n 'custom',\n 'unassigned',\n 'escalators',\n 'elevators',\n] as const;\n\nexport type RailItemSection = (typeof RAIL_ITEM_SECTIONS)[number];\n\nexport function isRailItemSection(\n section: string | null,\n): section is RailItemSection {\n return (\n section != null &&\n (RAIL_ITEM_SECTIONS as readonly string[]).includes(section)\n );\n}\n\n/** Third sidebar screen: field options for the selected list item. */\nexport function railShowsItemOptions(\n section: string | null,\n selectedCount: number,\n): boolean {\n return isRailItemSection(section) && selectedCount > 0;\n}\n\ntype RailLevel = {\n id: number;\n kind: string;\n ordering: number;\n levelIndex: number;\n};\n\n/** Outdoor first, then the lowest building floor, then each floor above it. */\nexport function railListLevelOrder<T extends RailLevel>(levels: T[]): T[] {\n const outdoor = levels.filter((level) => level.kind === 'outdoor');\n const floorsLowToHigh = levels\n .filter((level) => level.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors)\n .reverse();\n return [...outdoor, ...floorsLowToHigh];\n}\n\nexport function sortShapesByRailLevel<T extends { levelId: number }>(\n shapes: T[],\n levels: RailLevel[],\n): T[] {\n const indexById = new Map(\n railListLevelOrder(levels).map((level, index) => [level.id, index]),\n );\n return shapes.slice().sort((a, b) => {\n const ai = indexById.get(a.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.levelId) ?? Number.POSITIVE_INFINITY;\n return ai - bi;\n });\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { compareBuildingFloors, type CmBuilding, type CmLevel } from '../../core';\n\nexport type CreateLevelInput = {\n name: string;\n kind: 'outdoor' | 'floor';\n buildingId?: number | null;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type UpdateLevelInput = {\n levelId: number;\n name?: string;\n file?: File;\n onProgress?: (percent: number) => void;\n};\n\nexport type FloorsScreen =\n | { mode: 'list' }\n | { mode: 'add-base' }\n | { mode: 'add-floor' }\n | { mode: 'edit'; levelId: number };\n\nexport function floorsScreenTitle(\n screen: FloorsScreen,\n levels: Array<{ id: number; kind: string }>,\n): string {\n if (screen.mode === 'add-base') return 'Add Outdoor SVG';\n if (screen.mode === 'add-floor') return 'Add Floor';\n if (screen.mode === 'edit') {\n const level = levels.find((l) => l.id === screen.levelId);\n return level?.kind === 'outdoor' ? 'Edit Outdoor' : 'Edit Floor';\n }\n return 'Floors';\n}\n\n/** Building floors only — Outdoor is a separate item and is not counted. */\nexport function visibleFloorCount(levels: Array<{ kind: string }>): number {\n return levels.filter((l) => l.kind === 'floor').length;\n}\n\n/** Insert `movedId` before or after `targetId`. Used by live floor reorder. */\nexport function placeLevelId(\n ids: number[],\n movedId: number,\n targetId: number,\n place: 'before' | 'after',\n): number[] {\n if (movedId === targetId) return ids;\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const target = without.indexOf(targetId);\n if (target < 0) return ids;\n const next = [...without];\n next.splice(place === 'after' ? target + 1 : target, 0, movedId);\n return next;\n}\n\n/** Move `movedId` to `toIndex` in the list with that id removed. */\nexport function moveLevelId(ids: number[], movedId: number, toIndex: number): number[] {\n const from = ids.indexOf(movedId);\n if (from < 0) return ids;\n const without = ids.filter((id) => id !== movedId);\n const clamped = Math.max(0, Math.min(toIndex, without.length));\n const next = [...without];\n next.splice(clamped, 0, movedId);\n return next;\n}\n\n/** Slot index from pointer Y. Uses the list box, not live row midpoints. */\nexport function insertIndexFromY(\n clientY: number,\n listTop: number,\n rowHeight: number,\n count: number,\n): number {\n if (count <= 1 || rowHeight <= 0) return 0;\n const index = Math.round((clientY - listTop - rowHeight / 2) / rowHeight);\n return Math.max(0, Math.min(count - 1, index));\n}\n\n/** Overlay Y for the drop line. Null when the item would stay put. */\nexport function dropLineTop(\n fromIndex: number,\n dropIndex: number,\n rowHeight: number,\n rowInnerHeight: number,\n): number | null {\n if (fromIndex < 0 || dropIndex === fromIndex || rowHeight <= 0) return null;\n if (dropIndex < fromIndex) return dropIndex * rowHeight;\n return dropIndex * rowHeight + rowInnerHeight;\n}\n\nfunction sameIdOrder(a: number[], b: number[]): boolean {\n return a.length === b.length && a.every((id, i) => id === b[i]);\n}\n\ntype FloorDrag = {\n id: number;\n pointerId: number;\n offsetX: number;\n offsetY: number;\n width: number;\n height: number;\n name: string;\n x: number;\n y: number;\n listTop: number;\n listLeft: number;\n listBottom: number;\n rowHeight: number;\n originIds: number[];\n dropIndex: number;\n};\n\nexport interface FloorsPanelProps {\n levels: CmLevel[];\n buildings: CmBuilding[];\n /** Shapes already imported per level — drives delete and re-import copy. */\n levelShapeCounts?: Record<number, number>;\n canFloors: boolean;\n screen: FloorsScreen;\n onScreenChange: (screen: FloorsScreen) => void;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n}\n\nfunction formatBytes(size: number): string {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction svgFileName(key: string | null | undefined): string | null {\n if (!key) return null;\n const part = key.split('/').pop()?.trim();\n return part || null;\n}\n\nfunction isSvgFile(next: File): boolean {\n return next.name.toLowerCase().endsWith('.svg') || next.type === 'image/svg+xml';\n}\n\nfunction GripIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <path\n d=\"M3 5h12M3 9h12M3 13h12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** Same glyph as admin-portal Deals/Retailers (`Trash2` from react-feather). */\nfunction TrashIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function deleteConfirmCopy(\n level: { kind: string; name: string },\n shapeCount = 0,\n) {\n const isOutdoor = level.kind === 'outdoor';\n const shapes =\n shapeCount === 1 ? '1 shape' : `${shapeCount} shapes`;\n return {\n title: isOutdoor ? 'Delete Outdoor SVG?' : `Delete “${level.name}”?`,\n body: isOutdoor\n ? `The stored outdoor SVG, its ${shapes} and every assignment on them are removed. Building floors are not affected.`\n : `This floor and its ${shapes} are removed, along with the retailer, amenity and kiosk assignments on them.`,\n action: isOutdoor ? 'Delete Outdoor' : 'Delete floor',\n };\n}\n\nexport function FloorsPanel({\n levels,\n buildings,\n levelShapeCounts,\n canFloors,\n screen,\n onScreenChange,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n}: FloorsPanelProps) {\n const [name, setName] = useState('');\n const [file, setFile] = useState<File | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [progress, setProgress] = useState<number | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<number | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [drag, setDrag] = useState<FloorDrag | null>(null);\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const [previewIds, setPreviewIds] = useState<number[] | null>(null);\n const [previewFailed, setPreviewFailed] = useState(false);\n const [localPreviewUrl, setLocalPreviewUrl] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const floorListRef = useRef<HTMLDivElement>(null);\n const ghostRef = useRef<HTMLDivElement>(null);\n const previewIdsRef = useRef<number[] | null>(null);\n const dragRef = useRef<FloorDrag | null>(null);\n\n const outdoor = useMemo(\n () => levels.find((l) => l.kind === 'outdoor') ?? null,\n [levels],\n );\n const outdoorReady = Boolean(outdoor?.sourceSvgKey || outdoor?.sourceSvgUrl);\n const shapeCount = (levelId: number) => levelShapeCounts?.[levelId] ?? 0;\n const buildingFloors = useMemo(\n () =>\n levels\n .filter((l) => l.kind === 'floor')\n .slice()\n .sort(compareBuildingFloors),\n [levels],\n );\n const committedIds = useMemo(\n () => buildingFloors.map((level) => level.id),\n [buildingFloors],\n );\n const displayFloors = useMemo(() => {\n // Keep committed order on screen while dragging so sibling rows stay put.\n const ids = drag != null ? committedIds : (previewIds ?? committedIds);\n const byId = new Map(buildingFloors.map((level) => [level.id, level]));\n return ids\n .map((id) => byId.get(id))\n .filter((level): level is CmLevel => level != null);\n }, [buildingFloors, committedIds, drag, previewIds]);\n const editing =\n screen.mode === 'edit'\n ? levels.find((l) => l.id === screen.levelId) ?? null\n : null;\n const isOutdoorForm =\n screen.mode === 'add-base' || editing?.kind === 'outdoor';\n const canManage = canFloors && !!onCreateLevel && !!onUpdateLevel;\n const canReorder = canManage && !!onReorderLevels && buildingFloors.length > 1;\n\n useEffect(() => {\n if (screen.mode === 'add-base' || editing?.kind === 'outdoor') {\n setName('Outdoor');\n setFile(null);\n } else if (screen.mode === 'add-floor') {\n setName('');\n setFile(null);\n } else if (screen.mode === 'edit' && editing) {\n setName(editing.name);\n setFile(null);\n }\n setError(null);\n setConfirmDeleteId(null);\n setDeleting(false);\n setProgress(null);\n setPreviewFailed(false);\n }, [screen, editing?.id, editing?.kind, editing?.name]);\n\n useEffect(() => {\n if (confirmDeleteId == null) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !deleting) setConfirmDeleteId(null);\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [confirmDeleteId, deleting]);\n\n useEffect(() => {\n if (!file) {\n setLocalPreviewUrl(null);\n return;\n }\n const url = URL.createObjectURL(file);\n setLocalPreviewUrl(url);\n setPreviewFailed(false);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n previewIdsRef.current = previewIds;\n dragRef.current = drag;\n\n useEffect(() => {\n if (drag != null || previewIds == null) return;\n if (sameIdOrder(committedIds, previewIds)) setPreviewIds(null);\n }, [committedIds, drag, previewIds]);\n\n const takeSvgFile = (next: File | null | undefined) => {\n if (!next) return;\n if (!isSvgFile(next)) {\n setError('Choose an SVG file.');\n return;\n }\n setError(null);\n setFile(next);\n };\n\n const openEdit = (level: CmLevel) => {\n onScreenChange({ mode: 'edit', levelId: level.id });\n };\n\n const submit = async (picked?: File | null) => {\n const svgFile = picked ?? file;\n if (isOutdoorForm) {\n if (!svgFile && (screen.mode === 'add-base' || !editing?.sourceSvgKey)) {\n setError('Choose an SVG file.');\n return;\n }\n } else if (!name.trim()) {\n setError('Enter a title.');\n return;\n }\n if (screen.mode === 'add-floor' && !svgFile) {\n setError('Choose an SVG file.');\n return;\n }\n setBusy(true);\n setError(null);\n if (svgFile) setProgress(0);\n try {\n if (screen.mode === 'add-base') {\n await onCreateLevel?.({\n name: 'Outdoor',\n kind: 'outdoor',\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'add-floor') {\n await onCreateLevel?.({\n name: name.trim(),\n kind: 'floor',\n buildingId: buildings[0]?.id ?? null,\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n } else if (screen.mode === 'edit' && editing) {\n await onUpdateLevel?.({\n levelId: editing.id,\n name: editing.kind === 'outdoor' ? 'Outdoor' : name.trim(),\n file: svgFile ?? undefined,\n onProgress: setProgress,\n });\n }\n setProgress(100);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not save floor.');\n setProgress(null);\n } finally {\n setBusy(false);\n }\n };\n\n const remove = async (level: CmLevel) => {\n if (!onDeleteLevel || deleting) return;\n setDeleting(true);\n setError(null);\n try {\n await onDeleteLevel(level.id);\n setConfirmDeleteId(null);\n onScreenChange({ mode: 'list' });\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not delete floor.');\n } finally {\n setDeleting(false);\n }\n };\n\n const renderDeleteModal = () => {\n const level = levels.find((l) => l.id === confirmDeleteId);\n if (!level) return null;\n const copy = deleteConfirmCopy(level, shapeCount(level.id));\n return (\n <div className=\"eyeon-map-modal\" role=\"presentation\">\n <div\n className=\"eyeon-map-modal__backdrop\"\n onClick={() => (deleting ? undefined : setConfirmDeleteId(null))}\n />\n <div\n className=\"eyeon-map-modal__card\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-delete-title\"\n aria-describedby=\"eyeon-map-delete-body\"\n >\n <h3 className=\"eyeon-map-modal__title\" id=\"eyeon-map-delete-title\">\n {copy.title}\n </h3>\n <p className=\"eyeon-map-modal__body\" id=\"eyeon-map-delete-body\">\n {copy.body} This cannot be undone.\n </p>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n <div className=\"eyeon-map-modal__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-modal__cancel\"\n disabled={deleting}\n onClick={() => setConfirmDeleteId(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={deleting}\n autoFocus\n onClick={() => void remove(level)}\n >\n {deleting ? (\n <>\n <span className=\"eyeon-map-floors__spinner\" aria-hidden=\"true\" />\n Deleting…\n </>\n ) : (\n copy.action\n )}\n </button>\n </div>\n </div>\n </div>\n );\n };\n\n const renderRowDelete = (level: CmLevel) => {\n if (!canManage || !onDeleteLevel) return null;\n return (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__icon-danger\"\n title={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n aria-label={`Delete ${level.kind === 'outdoor' ? 'Outdoor SVG' : level.name}`}\n disabled={busy || deleting}\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(level.id);\n }}\n >\n <TrashIcon />\n </button>\n );\n };\n\n const applyGhost = (x: number, y: number) => {\n const ghost = ghostRef.current;\n if (!ghost) return;\n ghost.style.left = `${x}px`;\n ghost.style.top = `${y}px`;\n };\n\n const previewMoveToY = (clientY: number) => {\n const current = dragRef.current;\n if (!current) return;\n const index = insertIndexFromY(\n clientY,\n current.listTop,\n current.rowHeight,\n current.originIds.length,\n );\n if (current.dropIndex !== index) {\n current.dropIndex = index;\n setDropIndex(index);\n }\n const next = moveLevelId(current.originIds, current.id, index);\n const ids = previewIdsRef.current ?? current.originIds;\n if (!sameIdOrder(ids, next)) setPreviewIds(next);\n };\n\n const persistPreview = async () => {\n const nextIds = previewIdsRef.current;\n if (!onReorderLevels || nextIds == null) return;\n if (sameIdOrder(nextIds, committedIds)) {\n setPreviewIds(null);\n return;\n }\n try {\n await onReorderLevels(nextIds);\n } catch (e) {\n setPreviewIds(null);\n setError(e instanceof Error ? e.message : 'Could not reorder floors.');\n }\n };\n\n const endDrag = () => {\n if (!dragRef.current) return;\n dragRef.current = null;\n setDrag(null);\n setDropIndex(null);\n void persistPreview();\n };\n\n useEffect(() => {\n if (!drag) return;\n const onMove = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n const x = current.listLeft;\n const maxY = current.listBottom - current.height;\n const y = Math.max(current.listTop, Math.min(maxY, e.clientY - current.offsetY));\n current.x = x;\n current.y = y;\n applyGhost(x, y);\n previewMoveToY(e.clientY);\n };\n const onUp = (e: PointerEvent) => {\n const current = dragRef.current;\n if (!current || e.pointerId !== current.pointerId) return;\n endDrag();\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [Boolean(drag)]);\n\n const startDrag = (level: CmLevel, e: React.PointerEvent<HTMLButtonElement>) => {\n const row = e.currentTarget.closest('.eyeon-map-floors__row');\n const list = floorListRef.current;\n if (!(row instanceof HTMLElement) || !list) return;\n const rect = row.getBoundingClientRect();\n const listRect = list.getBoundingClientRect();\n const rowHeight = rect.height + 2;\n e.preventDefault();\n e.stopPropagation();\n const next: FloorDrag = {\n id: level.id,\n pointerId: e.pointerId,\n offsetX: e.clientX - rect.left,\n offsetY: e.clientY - rect.top,\n width: rect.width,\n height: rect.height,\n name: level.name,\n x: listRect.left,\n y: rect.top,\n listTop: listRect.top,\n listLeft: listRect.left,\n listBottom: listRect.bottom,\n rowHeight,\n originIds: committedIds,\n dropIndex: committedIds.indexOf(level.id),\n };\n dragRef.current = next;\n setDrag(next);\n setDropIndex(committedIds.indexOf(level.id));\n setPreviewIds(committedIds);\n };\n\n const lineTop =\n drag && dropIndex != null\n ? dropLineTop(\n drag.originIds.indexOf(drag.id),\n dropIndex,\n drag.rowHeight,\n drag.height,\n )\n : null;\n\n if (screen.mode !== 'list') {\n const hasExistingSvg = Boolean(editing?.sourceSvgKey || editing?.sourceSvgUrl);\n const showEditPreview = screen.mode === 'edit' && hasExistingSvg;\n const previewUrl = localPreviewUrl ?? (showEditPreview ? editing?.sourceSvgUrl ?? null : null);\n const previewFallback =\n file?.name ?? svgFileName(editing?.sourceSvgKey) ?? 'SVG on file';\n const importedCount = editing ? shapeCount(editing.id) : 0;\n const showReimportNotice =\n !isOutdoorForm && screen.mode === 'edit' && importedCount > 0;\n const primaryLabel = isOutdoorForm ? 'Upload' : 'Import';\n const primaryBusyLabel = isOutdoorForm ? 'Uploading' : 'Importing';\n\n return (\n <div className=\"eyeon-map-floors\">\n {!isOutdoorForm && (\n <label className=\"eyeon-map-rail__field\">\n Title\n <input\n value={name}\n disabled={busy || !canManage}\n onChange={(e) => setName(e.target.value)}\n />\n </label>\n )}\n {showEditPreview ? (\n <div className=\"eyeon-map-rail__field eyeon-map-floors__svg-field\">\n SVG\n <div className=\"eyeon-map-floors__preview-card\">\n {previewUrl && !previewFailed ? (\n <img\n className=\"eyeon-map-floors__preview-img\"\n src={previewUrl}\n alt={file?.name ?? editing?.name ?? 'SVG preview'}\n onError={() => setPreviewFailed(true)}\n />\n ) : (\n <div className=\"eyeon-map-floors__preview-fallback\">{previewFallback}</div>\n )}\n </div>\n {file ? (\n <span className=\"eyeon-map-floors__drop-meta\">\n {file.name}\n {isOutdoorForm\n ? ` · ${formatBytes(file.size)} · Ready to upload`\n : ` · ${formatBytes(file.size)}`}\n </span>\n ) : null}\n {!isOutdoorForm ? (\n <p className=\"eyeon-map-rail__hint\">\n Floor SVGs are read for geometry only — no copy of the file is kept.\n </p>\n ) : (\n <p className=\"eyeon-map-rail__hint\">\n The outdoor SVG is stored and drawn live, so decoration stays\n designer-owned. Only its interactive polygons are imported.\n </p>\n )}\n <input\n ref={fileInputRef}\n hidden\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-floors__change\"\n disabled={busy || deleting || !canManage}\n onClick={() => fileInputRef.current?.click()}\n >\n {isOutdoorForm ? 'Replace SVG' : 'Re-import SVG'}\n </button>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__field\">\n {isOutdoorForm ? 'SVG file' : 'Floor SVG to import'}\n <label\n className={[\n 'eyeon-map-floors__drop',\n dragOver ? 'is-over' : '',\n file ? 'has-file' : '',\n busy ? 'is-busy' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!busy) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n if (busy || !canManage) return;\n takeSvgFile(e.dataTransfer.files?.[0]);\n }}\n >\n <input\n type=\"file\"\n accept=\".svg,image/svg+xml\"\n disabled={busy || deleting || !canManage}\n onChange={(e) => {\n takeSvgFile(e.target.files?.[0] ?? null);\n e.target.value = '';\n }}\n />\n <span className=\"eyeon-map-floors__drop-title\">\n {file ? file.name : 'Choose SVG or drop it here'}\n </span>\n <span className=\"eyeon-map-floors__drop-meta\">\n {file\n ? isOutdoorForm\n ? `${formatBytes(file.size)} · Ready to upload`\n : `${formatBytes(file.size)} · Ready to import`\n : 'SVG only'}\n </span>\n </label>\n {!isOutdoorForm && !showReimportNotice ? (\n <p className=\"eyeon-map-rail__hint\">\n The file is read for geometry only. Shapes, the INTERACTIVE group\n and line segments in the <code>routes</code> group go into the\n database; the SVG itself is not stored.\n </p>\n ) : null}\n </div>\n )}\n {showReimportNotice ? (\n <div className=\"eyeon-map-floors__notice\">\n <p className=\"eyeon-map-floors__notice-title\">\n Re-importing replaces the {importedCount} shape\n {importedCount === 1 ? '' : 's'} on this floor\n </p>\n <ul className=\"eyeon-map-floors__notice-list\">\n <li>\n Layers that keep the same Illustrator ID are redrawn from the new file\n and keep their retailer, amenity and kiosk assignments.\n </li>\n <li>\n Shapes you reshaped in Edit Map keep your geometry — the new file is\n ignored for those.\n </li>\n <li>\n IDs missing from the new file are hidden rather than deleted, so you can\n move their assignments onto a renamed layer.\n </li>\n <li>\n New IDs come in unassigned, and line segments in the{' '}\n <code>routes</code> group replace this floor’s walking paths.\n </li>\n <li>\n The artboard must stay the same size, otherwise the import is rejected.\n </li>\n </ul>\n </div>\n ) : null}\n {progress != null && (\n <div\n className=\"eyeon-map-floors__progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n <div className=\"eyeon-map-floors__progress-track\">\n <div\n className=\"eyeon-map-floors__progress-bar\"\n style={{ width: `${Math.min(100, Math.max(0, progress))}%` }}\n />\n </div>\n <span className=\"eyeon-map-floors__progress-label\">{progress}%</span>\n </div>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {screen.mode === 'edit' && editing ? (\n <div className=\"eyeon-map-floors__edit-actions\">\n <div className=\"eyeon-map-floors__edit-row\">\n {onDeleteLevel && canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={busy || deleting}\n onClick={() => setConfirmDeleteId(editing.id)}\n >\n Delete\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (editing.kind !== 'outdoor' && !name.trim())\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : 'Saving…'\n : file\n ? isOutdoorForm\n ? 'Upload & Save'\n : 'Import & Save'\n : 'Save Changes'}\n </button>\n </div>\n </div>\n ) : (\n <div className=\"eyeon-map-rail__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={\n busy ||\n deleting ||\n !canManage ||\n (isOutdoorForm ? !file : !name.trim() || !file)\n }\n onClick={() => void submit()}\n >\n {busy\n ? progress != null\n ? `${primaryBusyLabel} ${progress}%`\n : `${primaryBusyLabel}…`\n : primaryLabel}\n </button>\n </div>\n )}\n {renderDeleteModal()}\n </div>\n );\n }\n\n return (\n <div className={['eyeon-map-floors', drag ? 'is-reordering' : ''].filter(Boolean).join(' ')}>\n <div className=\"eyeon-map-floors__block\">\n {canManage && (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-floor' })}\n >\n Add Floor\n </button>\n )}\n {displayFloors.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">No floors yet.</p>\n ) : (\n <div ref={floorListRef} className=\"eyeon-map-floors__list\">\n {displayFloors.map((level) => (\n <div\n key={level.id}\n data-floor-id={level.id}\n className=\"eyeon-map-floors__entry\"\n >\n <div\n className={[\n 'eyeon-map-floors__row',\n drag?.id === level.id ? 'is-placeholder' : '',\n confirmDeleteId === level.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {canReorder ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__grip\"\n title=\"Drag to reorder\"\n aria-label={`Reorder ${level.name}`}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n startDrag(level, e);\n }}\n >\n <GripIcon />\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => {\n if (drag) return;\n openEdit(level);\n }}\n >\n {level.name}\n </button>\n {renderRowDelete(level)}\n </div>\n </div>\n ))}\n {lineTop == null ? null : (\n <div\n className=\"eyeon-map-floors__drop-line\"\n style={{ top: lineTop }}\n />\n )}\n </div>\n )}\n </div>\n\n <div className=\"eyeon-map-floors__block\">\n {outdoorReady && outdoor ? (\n <div className=\"eyeon-map-floors__entry\">\n <div\n className={[\n 'eyeon-map-floors__row',\n confirmDeleteId === outdoor.id ? 'is-confirm' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type=\"button\"\n className=\"eyeon-map-floors__item\"\n onClick={() => openEdit(outdoor)}\n >\n Outdoor SVG\n </button>\n {renderRowDelete(outdoor)}\n </div>\n </div>\n ) : canManage ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__add\"\n onClick={() => onScreenChange({ mode: 'add-base' })}\n >\n Add Outdoor SVG\n </button>\n ) : null}\n </div>\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n {renderDeleteModal()}\n {drag\n ? createPortal(\n <div\n ref={ghostRef}\n className=\"eyeon-map-floors__row eyeon-map-floors__row--ghost\"\n style={{\n left: drag.x,\n top: drag.y,\n width: drag.width,\n height: drag.height,\n }}\n >\n <span className=\"eyeon-map-floors__grip\" aria-hidden=\"true\">\n <GripIcon />\n </span>\n <span className=\"eyeon-map-floors__item\">{drag.name}</span>\n <span className=\"eyeon-map-floors__icon-danger\" aria-hidden=\"true\">\n <TrashIcon />\n </span>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport {\n clampRouteThickness,\n clampStoreRadius,\n DEFAULT_THEME,\n amenityAssignedName,\n kioskAssignedName,\n retailerOptionLabel,\n staticLayerThemeDefaults,\n type CmAmenityCatalogItem,\n type CmAnchor,\n type CmConnector,\n type CmLevel,\n type CmRouteEdge,\n type CmBuilding,\n type CmShapeAssignment,\n type MapAssignKiosk,\n type MapAssignRetailer,\n type StaticLayerThemeKey,\n type ThemeDefaults,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport {\n connectorForShape,\n connectorRideLabel,\n escalatorRideLandingLines,\n groupEscalatorRides,\n railConnectorShapes,\n} from '../connectorAssignments';\nimport {\n isTransparentColor,\n normalizeHexColor,\n sameHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { shapeKindLabel } from '../labels';\nimport { assignmentByShapeId, railAssignmentGroups } from '../railAssignments';\nimport {\n catalogKioskRowLabel,\n leftoverCatalogKiosks,\n shapeIdForCatalogKiosk,\n} from '../railKiosks';\nimport { connectorSpecialIconDataUrl, getAmenityByType } from '../../specialIcons';\nimport {\n railListLevelOrder,\n railRowLabels,\n railShowsItemOptions,\n sortShapesByRailLevel,\n} from '../railListCopy';\nimport {\n FloorsPanel,\n floorsScreenTitle,\n visibleFloorCount,\n type CreateLevelInput,\n type FloorsScreen,\n type UpdateLevelInput,\n} from './FloorsPanel';\nimport { ColorSwatch } from './formRows';\n\nexport type RailSection =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'custom'\n | 'paths'\n | 'style'\n | 'selection'\n | 'unassigned'\n | 'edit-map'\n | 'wayfinding'\n | 'map-responsiveness'\n | 'surroundings';\n\n/** @deprecated Use RailSection */\nexport type RailTab = RailSection;\n\nexport interface LeftRailDraft {\n buildings: CmBuilding[];\n levels: CmLevel[];\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n kind: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | null;\n }>;\n anchors: Array<Pick<CmAnchor, 'id' | 'levelId' | 'shapeId' | 'connectorId'>>;\n edges: Array<\n Pick<CmRouteEdge, 'id' | 'kind' | 'directed' | 'fromAnchorId' | 'toAnchorId'>\n >;\n connectors: CmConnector[];\n amenities: CmAmenityCatalogItem[];\n assignments: CmShapeAssignment[];\n}\n\nexport interface LeftRailProps {\n section: RailSection | null;\n onSectionChange: (section: RailSection | null) => void;\n draft: LeftRailDraft;\n activeLevelId: number | null;\n selectedShapeId: number | null;\n selectedShapeIds?: number[];\n onSelectShape: (id: number | null, opts?: { additive?: boolean }) => void;\n onHoverShape?: (id: number | null) => void;\n onListFocus?: () => void;\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canFloors: boolean;\n canSettings: boolean;\n canResponsiveness?: boolean;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n theme: ThemeDefaults;\n onThemeChange: (partial: Partial<ThemeDefaults>) => void;\n assignPanel: ReactNode;\n /** Saved display_kiosks: pick a kiosk shape or delete. */\n catalogKioskPanel?: ReactNode;\n selectedCatalogKioskId?: number | null;\n onSelectCatalogKiosk?: (id: number | null) => void;\n /** Draw/tools UI for Edit Map (icons + inspector). */\n editMapPanel?: ReactNode;\n /** Route tools and path stats for Wayfinding. */\n wayfindingPanel?: ReactNode;\n mapResponsivenessPanel?: ReactNode;\n /** Storybook/preview only. Hidden unless the host passes a Maps key slot. */\n showSurroundings?: boolean;\n surroundingsPanel?: ReactNode;\n footer?: ReactNode;\n}\n\nfunction BackIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M10.2 2.6 4.8 8l5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M5.8 2.6 11.2 8l-5.4 5.4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst NAV_ICON_PROPS = {\n width: 18,\n height: 18,\n viewBox: '0 0 18 18',\n fill: 'none',\n 'aria-hidden': true,\n} as const;\n\nfunction FloorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 12.5 9 15.5 15 12.5M3 9.2 9 12.2 15 9.2M9 2.5 3 5.5 9 8.5 15 5.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction StoresNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.5 7.2 4.4 14h9.2l.9-6.8H3.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 7.2 4.6 4h8.8L15 7.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M7 14V9.6h4V14\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction AmenitiesNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M9 15.2s5.2-3.6 5.2-7.1A5.2 5.2 0 0 0 9 2.8a5.2 5.2 0 0 0-5.2 5.3c0 3.5 5.2 7.1 5.2 7.1Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"9\" cy=\"8\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction KiosksNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3\"\n width=\"13\"\n height=\"8.5\"\n rx=\"1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M7 15h4M9 11.5V15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction EscalatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3 15h4V11h4V7h4V3h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ElevatorsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"4\" y=\"2.8\" width=\"10\" height=\"12.4\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9 5.4 7.2 7.6h3.6Zm0 7.2 1.8-2.2H7.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SurroundingsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <circle cx=\"9\" cy=\"9\" r=\"6.2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9 2.8c1.6 1.8 2.4 3.8 2.4 6.2S10.6 13.4 9 15.2C7.4 13.4 6.6 11.4 6.6 9S7.4 4.6 9 2.8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M3.2 9h11.6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction SettingsNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS} viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CustomNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"13\"\n height=\"11\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M5.2 8h7.6M5.2 10.8h4.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction UnassignedNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3\"\n width=\"12\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeDasharray=\"2.4 2\"\n />\n </svg>\n );\n}\n\nfunction EditMapNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect\n x=\"3\"\n y=\"3.5\"\n width=\"12\"\n height=\"11\"\n rx=\"1.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M6 11.2 11.4 5.8l1.8 1.8L7.8 13H6z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction WayfindingNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <path\n d=\"M3.4 13.4c2.4-3.6 3.5-3.8 5-3.8 1.8 0 2.5 2 5.2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"3.4\" cy=\"13.4\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"8.4\" cy=\"9.6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"13.6\" cy=\"11.6\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction MapResponsivenessNavIcon() {\n return (\n <svg {...NAV_ICON_PROPS}>\n <rect x=\"2.5\" y=\"4\" width=\"13\" height=\"9\" rx=\"1.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 13.8h6M9 13.8v1.4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.2 10.2 8.4 7l2 2 2.6-2.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\ntype RailNavCountKey =\n | 'floors'\n | 'stores'\n | 'amenities'\n | 'kiosks'\n | 'escalators'\n | 'elevators'\n | 'custom'\n | 'unassigned';\n\ntype RailNavItem = {\n id: RailSection;\n title: string;\n description: string;\n icon: () => React.ReactElement;\n countKey?: RailNavCountKey;\n};\n\ntype RailNavEntry = RailNavItem | { separator: true };\n\nconst RAIL_NAV: RailNavEntry[] = [\n {\n id: 'floors',\n title: 'Floors',\n description: 'Building floors and Outdoor SVG',\n icon: FloorsNavIcon,\n countKey: 'floors',\n },\n {\n id: 'stores',\n title: 'Stores',\n description: 'Retailers linked to the map',\n icon: StoresNavIcon,\n countKey: 'stores',\n },\n {\n id: 'amenities',\n title: 'Amenities',\n description: 'Amenities linked to the map',\n icon: AmenitiesNavIcon,\n countKey: 'amenities',\n },\n {\n id: 'kiosks',\n title: 'Kiosks',\n description: 'Link kiosk screens to devices',\n icon: KiosksNavIcon,\n countKey: 'kiosks',\n },\n {\n id: 'escalators',\n title: 'Escalators',\n description: 'One-way rides between floors',\n icon: EscalatorsNavIcon,\n countKey: 'escalators',\n },\n {\n id: 'elevators',\n title: 'Elevators',\n description: 'Two-way shafts across floors',\n icon: ElevatorsNavIcon,\n countKey: 'elevators',\n },\n {\n id: 'custom',\n title: 'Custom',\n description: 'Text and images drawn on the map',\n icon: CustomNavIcon,\n countKey: 'custom',\n },\n {\n id: 'unassigned',\n title: 'Unassigned',\n description: 'Polygons with no store, amenity, or kiosk',\n icon: UnassignedNavIcon,\n countKey: 'unassigned',\n },\n { separator: true },\n {\n id: 'edit-map',\n title: 'Edit Map',\n description: 'Draw and reshape stores, text, and lines',\n icon: EditMapNavIcon,\n },\n {\n id: 'wayfinding',\n title: 'Wayfinding',\n description: 'Walking paths and route anchors',\n icon: WayfindingNavIcon,\n },\n {\n id: 'map-responsiveness',\n title: 'Map Responsiveness',\n description: 'Starting zoom and position per floor and device',\n icon: MapResponsivenessNavIcon,\n },\n {\n id: 'surroundings',\n title: 'Surroundings',\n description: 'Line the building up on a real map',\n icon: SurroundingsNavIcon,\n },\n { separator: true },\n {\n id: 'style',\n title: 'Settings',\n description: 'Colors and map look',\n icon: SettingsNavIcon,\n },\n];\n\nconst HIDDEN_SECTION_TITLES: Partial<Record<RailSection, string>> = {\n paths: 'Walking paths',\n selection: 'Selected',\n};\n\nfunction isRailNavSeparator(entry: RailNavEntry): entry is { separator: true } {\n return 'separator' in entry;\n}\n\nfunction railSectionTitle(section: RailSection): string {\n const item = RAIL_NAV.find(\n (entry): entry is RailNavItem => !isRailNavSeparator(entry) && entry.id === section,\n );\n return item?.title ?? HIDDEN_SECTION_TITLES[section] ?? section;\n}\n\nconst HOUSE_OUTDOOR_THEME = staticLayerThemeDefaults();\n\nconst OUTDOOR_COLOR_FIELDS: Array<[StaticLayerThemeKey, string]> = [\n ['GREEN_AREA_COLOR', 'Green Areas'],\n ['WATER_COLOR', 'Water'],\n ['WALKABLE_COLOR', 'Walking Paths'],\n ['PARKING_LANE_COLOR', 'Parking Lanes'],\n ['PARKING_ICON_COLOR', 'Parking Icons'],\n];\n\nfunction SettingsField({\n label,\n onReset,\n children,\n}: {\n label: string;\n onReset?: () => void;\n children: ReactNode;\n}) {\n return (\n <div className=\"eyeon-map-rail__field eyeon-map-rail__field--inline\">\n <span className=\"eyeon-map-rail__field-label\">\n {label}\n {onReset ? <FieldResetButton label={label} onClick={onReset} /> : null}\n </span>\n {children}\n </div>\n );\n}\n\nfunction ColorField({\n label,\n value,\n fallback,\n onChange,\n onReset,\n}: {\n label: string;\n value: string;\n fallback?: string;\n onChange: (hex: string) => void;\n onReset?: () => void;\n}) {\n const transparent = isTransparentColor(value) || !value.trim();\n const [hex, setHex] = useState(transparent ? '' : value);\n\n useEffect(() => {\n setHex(transparent ? '' : value);\n }, [transparent, value]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!transparent) onChange(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : value);\n return;\n }\n setHex(normalized);\n if (normalized !== value.toLowerCase() && normalized !== value) onChange(normalized);\n };\n\n return (\n <SettingsField label={label} onReset={onReset}>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={transparent ? TRANSPARENT_COLOR : value}\n fallback={fallback}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </SettingsField>\n );\n}\n\nexport function LeftRail({\n section,\n onSectionChange,\n draft,\n activeLevelId,\n selectedShapeId,\n selectedShapeIds,\n onSelectShape,\n onHoverShape,\n onListFocus,\n retailers = [],\n kiosks = [],\n canFloors,\n canSettings,\n canResponsiveness = false,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n theme,\n onThemeChange,\n assignPanel,\n catalogKioskPanel,\n selectedCatalogKioskId = null,\n onSelectCatalogKiosk,\n editMapPanel,\n wayfindingPanel,\n mapResponsivenessPanel,\n showSurroundings = false,\n surroundingsPanel,\n footer,\n}: LeftRailProps) {\n const [floorsScreen, setFloorsScreen] = useState<FloorsScreen>({ mode: 'list' });\n\n useEffect(() => {\n if (section !== 'floors') setFloorsScreen({ mode: 'list' });\n }, [section]);\n\n useEffect(\n () => () => {\n onHoverShape?.(null);\n },\n [section, onHoverShape],\n );\n\n const assigned = useMemo(\n () => railAssignmentGroups(draft.shapes, draft.assignments),\n [draft.shapes, draft.assignments],\n );\n const storeShapes = assigned.stores;\n const amenityShapes = assigned.amenities;\n const kioskShapes = assigned.kiosks;\n const unassignedStoreShapes = assigned.unassignedStores;\n const unassignedAmenityShapes = assigned.unassignedAmenities;\n const unassignedKioskShapes = assigned.unassignedKiosks;\n const unassignedShapes = assigned.unassigned;\n const customShapes = assigned.custom;\n const unassignedCustomShapes = assigned.unassignedCustom;\n const connectors = draft.connectors ?? [];\n const escalatorShapes = railConnectorShapes(draft.shapes, 'escalator', draft.anchors, connectors);\n const elevatorShapes = railConnectorShapes(draft.shapes, 'elevator', draft.anchors, connectors);\n const unlinkedEscalators = escalatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const escalatorRides = useMemo(() => {\n const rides = groupEscalatorRides(\n connectors,\n draft.anchors,\n draft.edges,\n escalatorShapes,\n );\n const indexById = new Map(\n railListLevelOrder(draft.levels).map((level, index) => [level.id, index]),\n );\n return rides.slice().sort((a, b) => {\n const ai = indexById.get(a.from.levelId) ?? Number.POSITIVE_INFINITY;\n const bi = indexById.get(b.from.levelId) ?? Number.POSITIVE_INFINITY;\n if (ai !== bi) return ai - bi;\n return a.from.key.localeCompare(b.from.key);\n });\n }, [connectors, draft.anchors, draft.edges, draft.levels, escalatorShapes]);\n const linkedElevators = elevatorShapes.filter((s) =>\n connectorForShape(s.id, draft.anchors, connectors),\n );\n const unlinkedElevators = elevatorShapes.filter(\n (s) => !connectorForShape(s.id, draft.anchors, connectors),\n );\n const assignmentById = useMemo(\n () => assignmentByShapeId(draft.assignments),\n [draft.assignments],\n );\n const retailerById = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return new Map(\n retailers.map((retailer) => {\n const duplicate =\n (counts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return [\n retailer.id,\n retailerOptionLabel(retailer, duplicate),\n ] as const;\n }),\n );\n }, [retailers]);\n const amenityById = useMemo(\n () => new Map(draft.amenities.map((item) => [item.id, item.name])),\n [draft.amenities],\n );\n const kioskById = useMemo(\n () => new Map(kiosks.map((item) => [item.id, item.name])),\n [kiosks],\n );\n const assignedNameFor = (shape: {\n id: number;\n kind: string;\n key: string;\n levelId: number;\n }) => {\n const assignment = assignmentById.get(shape.id);\n if (assignment?.retailerId != null) {\n return retailerById.get(assignment.retailerId) ?? null;\n }\n if (assignment?.targetType === 'amenity' || assignment?.amenityId != null) {\n const catalogName =\n assignment.amenityId != null\n ? amenityById.get(assignment.amenityId) ?? null\n : null;\n const fromType = getAmenityByType(assignment.customLabel ?? '')?.name;\n return amenityAssignedName(assignment, catalogName ?? fromType ?? null);\n }\n if (assignment?.targetType === 'kiosk' || assignment?.kioskId != null) {\n return kioskAssignedName(\n assignment,\n assignment.kioskId != null\n ? kioskById.get(assignment.kioskId) ?? null\n : null,\n );\n }\n if (shape.kind === 'custom') {\n if (assignment?.layerType === 'custom_image') return 'Image';\n return assignment?.customLabel?.trim() || null;\n }\n return connectorRideLabel(\n shape,\n draft.anchors,\n draft.edges,\n connectors,\n draft.shapes,\n draft.levels,\n );\n };\n const activeLevel = draft.levels.find((l) => l.id === activeLevelId);\n const pathCount = draft.anchors.filter((a) => a.levelId === activeLevelId).length;\n const levelName = (levelId: number) =>\n draft.levels.find((l) => l.id === levelId)?.name ?? 'Floor';\n const levelShapeCounts = useMemo(() => {\n const counts: Record<number, number> = {};\n for (const shape of draft.shapes) {\n if (shape.orphanedAt) continue;\n counts[shape.levelId] = (counts[shape.levelId] ?? 0) + 1;\n }\n return counts;\n }, [draft.shapes]);\n\n const selectedIds =\n selectedShapeIds ?? (selectedShapeId != null ? [selectedShapeId] : []);\n const isShapeSelected = (id: number) => selectedIds.includes(id);\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const showingCatalogKiosk =\n section === 'kiosks' && selectedCatalogKiosk != null;\n const showingItemOptions =\n railShowsItemOptions(section, selectedIds.length) || showingCatalogKiosk;\n useEffect(() => {\n if (showingItemOptions) onHoverShape?.(null);\n }, [showingItemOptions, onHoverShape]);\n const itemOptionsTitle = (() => {\n if (showingCatalogKiosk && selectedCatalogKiosk) {\n const linkedId = shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n return {\n key: selectedCatalogKiosk.name.trim() || `Kiosk ${selectedCatalogKiosk.id}`,\n levelName: linked?.key ?? 'Unlinked',\n };\n }\n if (!showingItemOptions || selectedIds.length !== 1) return null;\n const shape = draft.shapes.find((row) => row.id === selectedIds[0]);\n if (!shape) return null;\n return { key: shape.key, levelName: levelName(shape.levelId) };\n })();\n const selectShapeFromList = (id: number, event: { shiftKey: boolean }) => {\n onSelectCatalogKiosk?.(null);\n onSelectShape(id, { additive: event.shiftKey });\n onListFocus?.();\n };\n const leftoverKiosks = leftoverCatalogKiosks(kiosks, draft.assignments);\n\n const counts: Record<RailNavCountKey, number> = {\n floors: visibleFloorCount(draft.levels),\n stores: storeShapes.length + unassignedStoreShapes.length,\n amenities: amenityShapes.length + unassignedAmenityShapes.length,\n kiosks:\n kioskShapes.length + unassignedKioskShapes.length + leftoverKiosks.length,\n escalators: escalatorShapes.length,\n elevators: elevatorShapes.length,\n custom: customShapes.length + unassignedCustomShapes.length,\n unassigned: unassignedShapes.length,\n };\n\n const renderShapeList = (\n shapes: typeof draft.shapes,\n empty: string,\n opts?: {\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string;\n showKindTag?: boolean;\n connectorIcon?: 'escalator' | 'elevator';\n connectorAssigned?: boolean;\n },\n ) =>\n shapes.length === 0 ? (\n <p className=\"eyeon-map-rail__hint\">{empty}</p>\n ) : (\n sortShapesByRailLevel(shapes, draft.levels).map((s) => {\n const copy = railRowLabels({\n key: s.key,\n kindLabel: opts?.kindLabelFor?.(s) ?? shapeKindLabel(s.kind),\n levelName: levelName(s.levelId),\n assignedName: assignedNameFor(s),\n showKindTag: opts?.showKindTag,\n });\n const iconUrl = opts?.connectorIcon\n ? connectorSpecialIconDataUrl(\n opts.connectorIcon,\n Boolean(opts.connectorAssigned),\n opts.connectorAssigned ? theme.CONNECTOR_ICON_COLOR : undefined,\n )\n : undefined;\n return (\n <button\n key={s.id}\n type=\"button\"\n className={\n isShapeSelected(s.id)\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(s.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(s.id, event)}\n >\n {iconUrl ? (\n <img\n className={\n opts?.connectorAssigned\n ? 'eyeon-map-rail__row-icon is-assigned'\n : 'eyeon-map-rail__row-icon'\n }\n src={iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-rail__row-copy\">\n {copy.title ? (\n <span className=\"eyeon-map-rail__row-title\">{copy.title}</span>\n ) : null}\n <span className=\"eyeon-map-rail__row-meta\">\n <span\n className={\n copy.title\n ? 'eyeon-map-rail__row-id'\n : 'eyeon-map-rail__row-id eyeon-map-rail__row-id--lead'\n }\n >\n {copy.id}\n </span>\n {copy.tags.length > 0 ? (\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span key={`${s.id}-${tag}`} className=\"eyeon-map-rail__tag\">\n {tag}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n );\n })\n );\n\n const renderEscalatorRideList = () =>\n escalatorRides.map((ride) => {\n const lines = escalatorRideLandingLines(ride, draft.levels);\n const active =\n isShapeSelected(ride.from.id) || isShapeSelected(ride.to.id);\n return (\n <button\n key={ride.connectorId}\n type=\"button\"\n className={\n active\n ? 'eyeon-map-rail__row eyeon-map-rail__row--ride is-active'\n : 'eyeon-map-rail__row eyeon-map-rail__row--ride'\n }\n onMouseDown={(event) => {\n if (event.shiftKey) event.preventDefault();\n }}\n onMouseEnter={() => onHoverShape?.(ride.from.id)}\n onMouseLeave={() => onHoverShape?.(null)}\n onClick={(event) => selectShapeFromList(ride.from.id, event)}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n {lines.map((line) => (\n <span key={line.shapeId} className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id eyeon-map-rail__row-id--lead\">\n {line.key}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n <span className=\"eyeon-map-rail__tag\">{line.levelName}</span>\n </span>\n </span>\n ))}\n </span>\n </button>\n );\n });\n\n const renderAssignedUnassigned = (\n assignedList: typeof draft.shapes,\n unassignedList: typeof draft.shapes,\n kindLabelFor?: (shape: (typeof draft.shapes)[number]) => string,\n connectorIcon?: 'escalator' | 'elevator',\n ) => (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({assignedList.length})\n </div>\n {assignedList.length > 0\n ? renderShapeList(assignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: true,\n })\n : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedList.length})\n </div>\n {unassignedList.length > 0\n ? renderShapeList(unassignedList, '', {\n kindLabelFor,\n connectorIcon,\n connectorAssigned: false,\n })\n : null}\n </>\n );\n\n return (\n <aside className=\"eyeon-map-rail\">\n {section ? (\n <div className=\"eyeon-map-rail__header\">\n <button\n type=\"button\"\n className=\"eyeon-map-rail__back\"\n onClick={() => {\n if (section === 'floors' && floorsScreen.mode !== 'list') {\n setFloorsScreen({ mode: 'list' });\n return;\n }\n if (showingCatalogKiosk) {\n onSelectCatalogKiosk?.(null);\n return;\n }\n if (showingItemOptions) {\n onSelectShape(null);\n onHoverShape?.(null);\n return;\n }\n onSectionChange(null);\n }}\n aria-label=\"Back\"\n >\n <BackIcon />\n </button>\n <div className=\"eyeon-map-rail__header-title\">\n {section === 'floors' ? (\n floorsScreenTitle(floorsScreen, draft.levels)\n ) : itemOptionsTitle ? (\n <span className=\"eyeon-map-assign__tag\">{itemOptionsTitle.key}</span>\n ) : (\n railSectionTitle(section)\n )}\n </div>\n {itemOptionsTitle ? (\n <span className=\"eyeon-map-rail__tag\">{itemOptionsTitle.levelName}</span>\n ) : null}\n </div>\n ) : (\n <div className=\"eyeon-map-rail__header\">\n <div className=\"eyeon-map-rail__header-title\">Configure Center Map</div>\n </div>\n )}\n\n <div className=\"eyeon-map-rail__body\">\n {!section && (\n <nav className=\"eyeon-map-rail__nav\" aria-label=\"Map options\">\n {RAIL_NAV.filter(\n (entry) =>\n showSurroundings ||\n isRailNavSeparator(entry) ||\n entry.id !== 'surroundings',\n ).map((entry, index) => {\n if (isRailNavSeparator(entry)) {\n return (\n <div\n key={`sep-${index}`}\n className=\"eyeon-map-rail__nav-sep\"\n role=\"separator\"\n />\n );\n }\n const Icon = entry.icon;\n return (\n <button\n key={entry.id}\n type=\"button\"\n className=\"eyeon-map-rail__nav-item\"\n onClick={() => onSectionChange(entry.id)}\n >\n <span className=\"eyeon-map-rail__nav-icon\">\n <Icon />\n </span>\n <span className=\"eyeon-map-rail__nav-copy\">\n <span className=\"eyeon-map-rail__nav-title\">{entry.title}</span>\n <span className=\"eyeon-map-rail__nav-desc\">{entry.description}</span>\n </span>\n <span className=\"eyeon-map-rail__nav-meta\">\n {entry.countKey != null ? (\n <span className=\"eyeon-map-rail__nav-count\">\n {counts[entry.countKey]}\n </span>\n ) : null}\n <ChevronIcon />\n </span>\n </button>\n );\n })}\n </nav>\n )}\n\n {section === 'edit-map' && (\n <div className=\"eyeon-map-rail__section\">{editMapPanel}</div>\n )}\n\n {section === 'wayfinding' && (\n <div className=\"eyeon-map-rail__section\">{wayfindingPanel}</div>\n )}\n\n {section === 'map-responsiveness' && (\n <div className=\"eyeon-map-rail__section\">{mapResponsivenessPanel}</div>\n )}\n\n {section === 'surroundings' && (\n <div className=\"eyeon-map-rail__section\">{surroundingsPanel}</div>\n )}\n\n {section === 'floors' && (\n <FloorsPanel\n levels={draft.levels}\n buildings={draft.buildings}\n levelShapeCounts={levelShapeCounts}\n canFloors={canFloors}\n screen={floorsScreen}\n onScreenChange={setFloorsScreen}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n const id = await onCreateLevel(input);\n setFloorsScreen({ mode: 'list' });\n return id;\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n />\n )}\n\n {section === 'stores' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(storeShapes, unassignedStoreShapes)}\n </div>\n )}\n\n {section === 'amenities' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(\n amenityShapes,\n unassignedAmenityShapes,\n )}\n </div>\n )}\n\n {section === 'custom' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions\n ? assignPanel\n : renderAssignedUnassigned(customShapes, unassignedCustomShapes)}\n </div>\n )}\n\n {section === 'unassigned' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unassignedShapes.length})\n </div>\n {renderShapeList(\n unassignedShapes,\n 'Every assignable polygon has a link.',\n { showKindTag: true },\n )}\n </>\n )}\n </div>\n )}\n\n {section === 'escalators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n <>\n <p className=\"eyeon-map-rail__hint\">\n Pick the boarding landing, then the floor and exit landing.\n A linked ride is one row: boarding on top, exit below. Rides\n are one-way.\n </p>\n <div className=\"eyeon-map-rail__heading\">\n Assigned ({escalatorRides.length})\n </div>\n {escalatorRides.length > 0 ? renderEscalatorRideList() : null}\n <div className=\"eyeon-map-rail__heading\">\n Unassigned ({unlinkedEscalators.length})\n </div>\n {unlinkedEscalators.length > 0\n ? renderShapeList(unlinkedEscalators, '')\n : null}\n </>\n )}\n </div>\n )}\n\n {section === 'elevators' && (\n <div className=\"eyeon-map-rail__section\">\n {showingItemOptions ? (\n assignPanel\n ) : (\n renderAssignedUnassigned(\n linkedElevators,\n unlinkedElevators,\n undefined,\n 'elevator',\n )\n )}\n </div>\n )}\n\n {section === 'kiosks' && (\n <div className=\"eyeon-map-rail__section\">\n {showingCatalogKiosk\n ? catalogKioskPanel\n : showingItemOptions\n ? assignPanel\n : (\n <>\n {renderAssignedUnassigned(kioskShapes, unassignedKioskShapes)}\n {leftoverKiosks.length > 0 ? (\n <>\n <div className=\"eyeon-map-rail__heading\">\n Existing kiosks ({leftoverKiosks.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Saved kiosk devices (shared with Classic Map). Open\n one to attach or remove a New map shape — the device\n itself is not deleted.\n </p>\n {leftoverKiosks.map((kiosk) => {\n const linkedId = shapeIdForCatalogKiosk(\n kiosk.id,\n draft.assignments,\n );\n const linked = linkedId\n ? draft.shapes.find((row) => row.id === linkedId)\n : null;\n const copy = catalogKioskRowLabel(\n kiosk,\n linked?.key ?? null,\n );\n return (\n <button\n key={kiosk.id}\n type=\"button\"\n className={\n selectedCatalogKioskId === kiosk.id\n ? 'eyeon-map-rail__row is-active'\n : 'eyeon-map-rail__row'\n }\n onClick={() => {\n onSelectShape(null);\n onSelectCatalogKiosk?.(kiosk.id);\n }}\n >\n <span className=\"eyeon-map-rail__row-copy\">\n <span className=\"eyeon-map-rail__row-title\">\n {copy.title}\n </span>\n <span className=\"eyeon-map-rail__row-meta\">\n <span className=\"eyeon-map-rail__row-id\">\n {copy.id}\n </span>\n <span className=\"eyeon-map-rail__tags\">\n {copy.tags.map((tag) => (\n <span\n key={`${kiosk.id}-${tag}`}\n className=\"eyeon-map-rail__tag\"\n >\n {tag}\n </span>\n ))}\n </span>\n </span>\n </span>\n </button>\n );\n })}\n </>\n ) : null}\n </>\n )}\n </div>\n )}\n\n {section === 'paths' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n Use Wayfinding to place the walking path, then drag each faded\n store point onto that path to hook the store in.\n </p>\n <div className=\"eyeon-map-rail__stat\">\n {pathCount} path points · {draft.edges.length} connections\n </div>\n {canFloors && activeLevelId != null && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"eyeon-map-rail__section\">\n {!canSettings ? (\n <p className=\"eyeon-map-rail__hint\">\n You do not have permission to change map colors.\n </p>\n ) : (\n <>\n <div className=\"eyeon-map-rail__heading\">Map Settings</div>\n <SettingsField\n label=\"Background\"\n onReset={\n theme.SURROUNDINGS === DEFAULT_THEME.SURROUNDINGS\n ? undefined\n : () => onThemeChange({ SURROUNDINGS: DEFAULT_THEME.SURROUNDINGS })\n }\n >\n <ModernSelect\n ariaLabel=\"Background\"\n searchable={false}\n value={theme.SURROUNDINGS}\n options={[\n { value: 'transparent', label: 'Transparent' },\n { value: 'google', label: 'Google Map' },\n ]}\n onChange={(next) =>\n onThemeChange({\n SURROUNDINGS: next === 'google' ? 'google' : 'transparent',\n })\n }\n />\n </SettingsField>\n {(\n [\n ['STORE_DEFAULT_COLOR', 'Stores'],\n ] as const\n ).map(([key, label]) => {\n const house = DEFAULT_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\n <SettingsField label=\"Stores Radius\">\n <input\n className=\"eyeon-map-rail__number-sm\"\n type=\"number\"\n min={0}\n step={1}\n inputMode=\"decimal\"\n value={theme.STORE_RADIUS}\n aria-label=\"Stores Radius\"\n onChange={(e) =>\n onThemeChange({ STORE_RADIUS: clampStoreRadius(e.target.value) })\n }\n />\n </SettingsField>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Route Settings\n </div>\n <ColorField\n label=\"Route Path\"\n value={theme.ROUTE_COLOR}\n fallback={DEFAULT_THEME.ROUTE_COLOR}\n onChange={(hex) => onThemeChange({ ROUTE_COLOR: hex })}\n onReset={\n sameHexColor(theme.ROUTE_COLOR, DEFAULT_THEME.ROUTE_COLOR)\n ? undefined\n : () =>\n onThemeChange({ ROUTE_COLOR: DEFAULT_THEME.ROUTE_COLOR })\n }\n />\n <SettingsField\n label=\"Route Thickness\"\n onReset={\n theme.ROUTE_THICKNESS === DEFAULT_THEME.ROUTE_THICKNESS\n ? undefined\n : () =>\n onThemeChange({\n ROUTE_THICKNESS: DEFAULT_THEME.ROUTE_THICKNESS,\n })\n }\n >\n <input\n className=\"eyeon-map-rail__number-sm\"\n type=\"number\"\n min={1}\n step={1}\n inputMode=\"decimal\"\n value={theme.ROUTE_THICKNESS}\n aria-label=\"Route Thickness\"\n onChange={(e) =>\n onThemeChange({\n ROUTE_THICKNESS: clampRouteThickness(e.target.value),\n })\n }\n />\n </SettingsField>\n <div className=\"eyeon-map-rail__heading eyeon-map-rail__heading--section\">\n Outdoor Settings\n </div>\n {OUTDOOR_COLOR_FIELDS.map(([key, label]) => {\n const house = HOUSE_OUTDOOR_THEME[key];\n const customized = !sameHexColor(theme[key], house);\n return (\n <ColorField\n key={key}\n label={label}\n value={theme[key]}\n fallback={house}\n onChange={(hex) => onThemeChange({ [key]: hex })}\n onReset={\n customized\n ? () => onThemeChange({ [key]: house })\n : undefined\n }\n />\n );\n })}\n </>\n )}\n </div>\n )}\n\n {section === 'selection' && (\n <div className=\"eyeon-map-rail__section\">\n <p className=\"eyeon-map-rail__hint\">\n {activeLevel\n ? `Editing a shape on ${activeLevel.name}.`\n : 'Editing the selected shape.'}\n </p>\n {assignPanel}\n </div>\n )}\n </div>\n\n {footer}\n </aside>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\n\ntype ClassicPresence = 'unknown' | 'yes' | 'no' | 'error';\n\nexport interface ClassicMapFooterProps {\n /** Admin API origin, no trailing slash. Cookie session is sent with each call. */\n webApiURI: string;\n centerId: number;\n /** Local editor edits that a switch back to Classic would discard. */\n unsaved?: boolean;\n /** Host swaps to Classic after `centers.map_version` is set to 1. */\n onMapVersionChanged?: (mapVersion: 1 | 2) => void;\n}\n\ntype SetupStatus = {\n has_classic_data?: boolean;\n};\n\nasync function readError(res: Response): Promise<string> {\n const text = (await res.text()).trim();\n try {\n const body = JSON.parse(text) as { error?: { description?: string } };\n const description = body?.error?.description;\n if (typeof description === 'string' && description) return description;\n } catch {\n // Response was not JSON.\n }\n return text || `Request failed (HTTP ${res.status})`;\n}\n\nasync function apiFetch<T>(\n webApiURI: string,\n path: string,\n init?: RequestInit,\n): Promise<T> {\n const base = webApiURI.replace(/\\/$/, '');\n const res = await fetch(`${base}${path}`, {\n credentials: 'include',\n ...init,\n headers: {\n Accept: 'application/json',\n ...(init?.body ? { 'Content-Type': 'application/json' } : {}),\n ...init?.headers,\n },\n });\n if (!res.ok) throw new Error(await readError(res));\n if (res.status === 204) return undefined as T;\n const ct = res.headers.get('content-type') ?? '';\n if (!ct.includes('application/json')) return undefined as T;\n return (await res.json()) as T;\n}\n\n/**\n * PORTAL left-rail footer. Developer-only, and only while Classic mapit2_*\n * data still exists. Switching and deleting go through `/v1/map/*`.\n */\nexport function ClassicMapFooter({\n webApiURI,\n centerId,\n unsaved = false,\n onMapVersionChanged,\n}: ClassicMapFooterProps) {\n const [isDeveloper, setIsDeveloper] = useState(false);\n const [classicPresence, setClassicPresence] = useState<ClassicPresence>('unknown');\n const [dialog, setDialog] = useState<'switch' | 'delete' | null>(null);\n const [acknowledged, setAcknowledged] = useState(false);\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!webApiURI || !centerId) return;\n let cancelled = false;\n setIsDeveloper(false);\n setClassicPresence('unknown');\n void (async () => {\n try {\n const user = await apiFetch<{ is_developer?: boolean }>(\n webApiURI,\n '/v1/auth/is-authenticated',\n );\n if (cancelled) return;\n if (user?.is_developer !== true) {\n setIsDeveloper(false);\n setClassicPresence('no');\n return;\n }\n setIsDeveloper(true);\n } catch {\n if (!cancelled) {\n setIsDeveloper(false);\n setClassicPresence('no');\n }\n return;\n }\n try {\n const status = await apiFetch<SetupStatus>(\n webApiURI,\n `/v1/map/setup-status?center_id=${centerId}`,\n );\n if (cancelled) return;\n setClassicPresence(status?.has_classic_data ? 'yes' : 'no');\n } catch {\n if (!cancelled) setClassicPresence('error');\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [webApiURI, centerId]);\n\n const openSwitch = useCallback(() => {\n if (pending) return;\n if (unsaved) {\n const leave = window.confirm(\n 'You have unsaved map changes. Switching back to Classic will discard them.',\n );\n if (!leave) return;\n }\n setError(null);\n setAcknowledged(false);\n setDialog('switch');\n }, [pending, unsaved]);\n\n const confirmSwitch = useCallback(async () => {\n if (pending || !webApiURI || !centerId) return;\n setPending(true);\n setError(null);\n try {\n await apiFetch(webApiURI, `/v1/map/version?center_id=${centerId}`, {\n method: 'PUT',\n body: JSON.stringify({ map_version: 1 }),\n });\n setDialog(null);\n onMapVersionChanged?.(1);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to switch map version');\n } finally {\n setPending(false);\n }\n }, [centerId, onMapVersionChanged, pending, webApiURI]);\n\n const confirmDelete = useCallback(async () => {\n if (pending || !acknowledged || !webApiURI || !centerId) return;\n setPending(true);\n setError(null);\n try {\n await apiFetch(webApiURI, `/v1/map/classic-data?center_id=${centerId}`, {\n method: 'DELETE',\n });\n setClassicPresence('no');\n setDialog(null);\n setAcknowledged(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to delete old Classic map data');\n } finally {\n setPending(false);\n }\n }, [acknowledged, centerId, pending, webApiURI]);\n\n const showSwitch = isDeveloper && (classicPresence === 'yes' || classicPresence === 'error');\n const showDelete = isDeveloper && classicPresence === 'yes';\n if (!showSwitch && !dialog) return null;\n\n return (\n <>\n {showSwitch ? (\n <div className=\"eyeon-map-rail__footer\">\n <div className=\"eyeon-map-version\">\n <button\n type=\"button\"\n className=\"eyeon-map-version__link\"\n disabled={pending}\n onClick={openSwitch}\n >\n Switch Back to Classic Map\n </button>\n {showDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-version__delete\"\n disabled={pending}\n onClick={() => {\n setError(null);\n setAcknowledged(false);\n setDialog('delete');\n }}\n >\n Delete Old Map Data\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {dialog ? (\n <div className=\"eyeon-map-modal\" role=\"presentation\">\n <div\n className=\"eyeon-map-modal__backdrop\"\n onClick={() => {\n if (!pending) setDialog(null);\n }}\n />\n <div\n className=\"eyeon-map-modal__card eyeon-map-modal__card--copy\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-version-title\"\n >\n <h3 className=\"eyeon-map-modal__title\" id=\"eyeon-map-version-title\">\n {dialog === 'delete'\n ? 'Delete old Classic map data?'\n : 'Switch this center back to the Classic map?'}\n </h3>\n {dialog === 'switch' ? (\n <>\n <p className=\"eyeon-map-version__lead\">\n Center Map in Admin, websites, WordPress, and kiosks for this center will go back\n to the Classic map.\n </p>\n <ul className=\"eyeon-map-version__list\">\n <li>Your Classic floors, placements, and settings are unchanged.</li>\n <li>Work on the New map is kept, so you can switch to New again later.</li>\n <li>Switching only changes which map is shown. Edits do not sync between them.</li>\n </ul>\n </>\n ) : (\n <>\n <p className=\"eyeon-map-version__lead\">\n This permanently removes Classic map data for this center. The New map is not\n affected, and you will not be able to switch back to Classic afterward.\n </p>\n <p className=\"eyeon-map-version__label\">This will delete</p>\n <ul className=\"eyeon-map-version__list\">\n <li>Classic floor plans and their uploaded SVG files</li>\n <li>Classic store, amenity, and kiosk placements on the map</li>\n <li>Classic map colors and display settings</li>\n <li>Classic camera positions saved for different screen sizes</li>\n </ul>\n <p className=\"eyeon-map-version__label\">This will not delete</p>\n <ul className=\"eyeon-map-version__list\">\n <li>Retailer, amenity, and kiosk records used elsewhere in the portal</li>\n <li>Floors, shapes, routes, or media that belong to the New map</li>\n </ul>\n <label className=\"eyeon-map-version__ack\">\n <input\n type=\"checkbox\"\n checked={acknowledged}\n disabled={pending}\n onChange={(e) => setAcknowledged(e.target.checked)}\n />\n <span>\n I understand this permanently deletes the Classic map and cannot be undone.\n </span>\n </label>\n </>\n )}\n {error ? <div className=\"eyeon-map-floors__error\">{error}</div> : null}\n <div className=\"eyeon-map-modal__actions\">\n <button\n type=\"button\"\n className=\"eyeon-map-modal__cancel\"\n disabled={pending}\n onClick={() => setDialog(null)}\n >\n Cancel\n </button>\n {dialog === 'switch' ? (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={pending}\n onClick={() => void confirmSwitch()}\n >\n {pending ? 'Switching…' : 'Switch to Classic'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"eyeon-map-floors__danger\"\n disabled={pending || !acknowledged}\n onClick={() => void confirmDelete()}\n >\n {pending ? 'Deleting…' : 'Delete Old Map Data'}\n </button>\n )}\n </div>\n </div>\n </div>\n ) : null}\n </>\n );\n}\n","import React from 'react';\nimport type { MapAssignKiosk } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\n/**\n * Link a shared display_kiosks device to a New-map kiosk_screen shape.\n * Does NOT delete the physical kiosk — that would break Classic placements,\n * kiosk-electron identity, and display ads. Use Unlink / Remove from New Map.\n */\nexport function CatalogKioskForm({\n kiosk,\n shapeOptions,\n assignedShapeId,\n canEdit,\n onAssign,\n}: {\n kiosk: MapAssignKiosk;\n shapeOptions: Array<{ value: string; label: string }>;\n assignedShapeId: number | null;\n canEdit: boolean;\n onAssign: (shapeId: number | null) => void;\n}) {\n const hasShape = assignedShapeId != null;\n const empty = shapeOptions.length === 0;\n\n return (\n <div className=\"eyeon-map-assign\">\n <p className=\"eyeon-map-rail__hint\">\n Link this saved kiosk device to a kiosk shape on the New map. Removing it\n here only clears the New map placement — the device stays available for\n Classic Map, kiosk apps, and ads.\n </p>\n <ModernSelect\n ariaLabel=\"Kiosk shape\"\n value={hasShape ? String(assignedShapeId) : ''}\n disabled={!canEdit || empty}\n searchable={shapeOptions.length > 8}\n placeholder={empty ? 'No kiosk shapes on the map' : 'Choose a kiosk shape…'}\n options={shapeOptions}\n onChange={(next) => onAssign(next ? Number(next) : null)}\n />\n <div className=\"eyeon-map-assign__actions\">\n {canEdit && hasShape ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onAssign(null)}\n >\n Remove from New Map\n </button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n","import type {\n BatchOp,\n CmShape,\n CmShapeAssignment,\n ShapeGeometry,\n ShapeKind,\n} from '../core';\n\n/** Short, readable prefix for staff-facing shape IDs (`unit-k4n8`). */\nconst SHAPE_KEY_PREFIX: Record<ShapeKind, string> = {\n unit: 'unit',\n amenity: 'amenity',\n kiosk_screen: 'kiosk',\n connector: 'conn',\n entrance: 'entry',\n walkable: 'walk',\n void: 'void',\n wall: 'wall',\n boundary: 'bound',\n floorplate: 'slab',\n decor: 'decor',\n custom: 'custom',\n label: 'text',\n zone: 'zone',\n parking_zone: 'park',\n green_area: 'green',\n water: 'water',\n parking_icon: 'picon',\n};\n\n/** No 0/O/1/I/L — keeps IDs short and easy to read. */\nexport const SHAPE_KEY_ALPHABET = 'abcdefghjkmnpqrstuvwxyz23456789';\nexport const SHAPE_KEY_SUFFIX_LENGTH = 4;\n\nexport function shapeKeyPrefix(kind: string): string {\n return SHAPE_KEY_PREFIX[kind as ShapeKind] ?? kind.replace(/_/g, '');\n}\n\nexport function randomShapeKeySuffix(\n length = SHAPE_KEY_SUFFIX_LENGTH,\n): string {\n const bytes = new Uint8Array(length);\n globalThis.crypto.getRandomValues(bytes);\n let out = '';\n for (let i = 0; i < length; i++) {\n out += SHAPE_KEY_ALPHABET[bytes[i]! % SHAPE_KEY_ALPHABET.length];\n }\n return out;\n}\n\nconst SHAPE_KEY_PATTERN = /^[a-z]+-[a-z0-9]{4}$/;\n\n/** True for the short IDs we mint (`unit-k4n8`), not SVG ids like `unit-101`. */\nexport function isAllocatedShapeKey(key: string): boolean {\n return SHAPE_KEY_PATTERN.test(key);\n}\n\nexport function liveShapeKeysOnLevel(\n shapes: Array<{\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>,\n levelId: number,\n): string[] {\n return shapes\n .filter((shape) => shape.levelId === levelId && !shape.orphanedAt)\n .map((shape) => shape.key);\n}\n\nexport function copyDestinationLevels<T extends { id: number }>(\n levels: T[],\n currentLevelId: number,\n): T[] {\n return levels.filter((level) => level.id !== currentLevelId);\n}\n\n/**\n * Mint a short unique key for a new or copied shape.\n * `suffix` is injectable so tests can pin the random part.\n */\nexport function allocShapeKey(\n kind: string,\n taken: Iterable<string>,\n suffix: () => string = randomShapeKeySuffix,\n): string {\n const prefix = shapeKeyPrefix(kind);\n const used = taken instanceof Set ? taken : new Set(taken);\n for (let i = 0; i < 24; i++) {\n const key = `${prefix}-${suffix()}`;\n if (!used.has(key)) return key;\n }\n let n = 2;\n while (used.has(`${prefix}-${n}`)) n += 1;\n return `${prefix}-${n}`;\n}\n\nexport function cloneShapeGeometry(geometry: ShapeGeometry): ShapeGeometry {\n return {\n paths: geometry.paths.map((path) => ({ d: path.d, closed: path.closed })),\n polygons: geometry.polygons.map((ring) =>\n ring.map((point) => ({ x: point.x, y: point.y })),\n ),\n };\n}\n\nexport function copyShapeToLevelOps(args: {\n shape: CmShape;\n assignment?: CmShapeAssignment | null;\n targetLevelId: number;\n shapes: Array<{\n id: number;\n levelId: number;\n key: string;\n orphanedAt?: string | null;\n }>;\n allocId: () => number;\n allocKey?: (kind: string, taken: Iterable<string>) => string;\n}): { ops: BatchOp[]; shapeId: number; key: string } | null {\n const { shape, targetLevelId } = args;\n if (targetLevelId === shape.levelId) return null;\n const taken = liveShapeKeysOnLevel(args.shapes, targetLevelId);\n const id = args.allocId();\n const key = (args.allocKey ?? allocShapeKey)(shape.kind, taken);\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id,\n levelId: targetLevelId,\n key,\n kind: shape.kind,\n geometry: cloneShapeGeometry(shape.geometry),\n bbox: { ...shape.bbox },\n zIndex: shape.zIndex,\n style: { ...shape.style },\n label: { ...shape.label },\n sourceSvgId: null,\n origin: 'manual',\n geometryLocked: true,\n },\n },\n ];\n if (args.assignment) {\n ops.push({\n op: 'upsert_assignment',\n assignment: { ...args.assignment, shapeId: id },\n });\n }\n return { ops, shapeId: id, key };\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n AssignmentLayerType,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n LabelAlign,\n MapAssignKiosk,\n MapAssignRetailer,\n} from '../../core';\nimport {\n assignmentHasTarget,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n DEFAULT_LABEL_ALIGN,\n emptyShapeAssignment,\n isHttpImageUrl,\n normalizeLabelAlign,\n parseShapeAssignment,\n retailerOptionLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport {\n amenityAssignOptions,\n amenityCatalogIdForType,\n amenityTypeFromCatalogId,\n} from '../../specialIcons';\nimport { isAssignableKind } from '../railAssignments';\nimport { AssignmentStyleFields } from './AssignmentStyleFields';\nimport { AlignRow } from './formRows';\n\nconst RETAIL_LAYER_TYPES: AssignmentLayerType[] = [\n 'retail_name',\n 'retail_logo',\n 'retail_text',\n];\n\nexport interface AssignFormProps {\n shape: CmShape;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onChange: (assignment: CmShapeAssignment) => void;\n onClear: () => void;\n}\n\nexport function AssignForm({\n shape,\n assignment,\n amenities,\n retailers,\n kiosks = [],\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onChange,\n onClear,\n}: AssignFormProps) {\n const [form, setForm] = useState<CmShapeAssignment>(() =>\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n const formRef = useRef(form);\n formRef.current = form;\n\n useEffect(() => {\n setForm(\n assignment\n ? parseShapeAssignment(assignment, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind),\n );\n }, [shape, assignment]);\n\n const commit = useCallback(\n (next: CmShapeAssignment) => {\n setForm(next);\n if (!canEdit) return;\n onChange(parseShapeAssignment(next, shape.kind));\n },\n [canEdit, onChange, shape.kind],\n );\n\n const patch = useCallback(\n (partial: Partial<CmShapeAssignment>) => {\n commit({ ...formRef.current, shapeId: shape.id, ...partial });\n },\n [commit, shape.id],\n );\n\n const nameCounts = useMemo(() => {\n const counts = new Map<string, number>();\n for (const retailer of retailers) {\n const key = retailer.name.trim().toLowerCase();\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n }, [retailers]);\n\n const retailerOptions = useMemo(\n () =>\n retailers.map((retailer) => {\n const duplicate =\n (nameCounts.get(retailer.name.trim().toLowerCase()) ?? 0) > 1;\n return {\n value: String(retailer.id),\n label: retailerOptionLabel(retailer, duplicate),\n };\n }),\n [nameCounts, retailers],\n );\n\n const amenityOptions = useMemo(() => amenityAssignOptions(), []);\n const selectedAmenityType =\n amenityTypeFromCatalogId(form.amenityId, amenities) ||\n form.customLabel ||\n '';\n\n const kioskCatalogName = useMemo(() => {\n if (form.kioskId == null) return null;\n return kiosks.find((item) => item.id === form.kioskId)?.name ?? null;\n }, [form.kioskId, kiosks]);\n\n const showTextColor = [\n 'retail_name',\n 'retail_text',\n 'custom_text',\n 'kiosk',\n 'amenity',\n ].includes(form.layerType);\n const textColorLabel =\n form.layerType === 'kiosk' || form.layerType === 'amenity'\n ? 'Icon Color'\n : 'Text Color';\n const textColorFallback = assignmentIconThemeFallback(\n form,\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n shape.kind,\n );\n\n const hasAssignment = assignmentHasTarget(form);\n\n if (!isAssignableKind(shape.kind)) return null;\n\n return (\n <div className=\"eyeon-map-assign\">\n {shape.kind === 'unit' || shape.kind === 'parking_zone' ? (\n <>\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={form.retailerId != null ? String(form.retailerId) : ''}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose a Retailer…\"\n options={retailerOptions}\n onChange={(next) => {\n const retailerId = next ? Number(next) : null;\n const retailer = retailers.find((item) => item.id === retailerId);\n const layerType = RETAIL_LAYER_TYPES.includes(form.layerType)\n ? form.layerType\n : 'retail_name';\n patch({\n targetType: retailerId ? 'retailer' : 'none',\n retailerId,\n amenityId: null,\n kioskId: null,\n unitStatus: retailerId ? 'occupied' : 'vacant',\n layerType,\n customLabel:\n layerType === 'retail_name'\n ? retailer?.name ?? null\n : form.customLabel,\n customImageKey:\n layerType === 'retail_logo'\n ? retailer?.logoKey ?? form.customImageKey\n : form.customImageKey,\n });\n }}\n />\n {form.retailerId != null ? (\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Display\">\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_name' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_name',\n customLabel: retailer?.name ?? form.customLabel,\n });\n }}\n >\n Retail Name\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_logo' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => {\n const retailer = retailers.find(\n (item) => item.id === form.retailerId,\n );\n patch({\n layerType: 'retail_logo',\n customImageKey:\n retailer?.logoKey ?? form.customImageKey,\n });\n }}\n >\n Retail Logo\n </button>\n <button\n type=\"button\"\n className={\n form.layerType === 'retail_text' ? 'is-active' : undefined\n }\n disabled={!canEdit}\n onClick={() => patch({ layerType: 'retail_text' })}\n >\n Custom Text\n </button>\n </div>\n ) : null}\n {form.retailerId != null && form.layerType === 'retail_text' ? (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n className=\"eyeon-map-assign__text\"\n rows={3}\n disabled={!canEdit}\n value={form.customLabel ?? ''}\n style={{\n textAlign: normalizeLabelAlign(\n form.align ?? shape.label.align,\n ),\n }}\n onChange={(e) => patch({ customLabel: e.target.value || null })}\n />\n </label>\n <AlignRow\n value={form.align ?? shape.label.align ?? DEFAULT_LABEL_ALIGN}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => patch({ align })}\n />\n </>\n ) : null}\n </>\n ) : null}\n\n {shape.kind === 'custom' ? (\n <>\n <div className=\"eyeon-map-assign__tabs\" role=\"group\" aria-label=\"Custom display\">\n <button\n type=\"button\"\n className={form.layerType !== 'custom_image' ? 'is-active' : undefined}\n disabled={!canEdit}\n onClick={() =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_text',\n })\n }\n >\n Text\n </button>\n <button\n type=\"button\"\n className={form.layerType === 'custom_image' ? 'is-active' : undefined}\n disabled={!canEdit}\n onClick={() =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_image',\n })\n }\n >\n Image\n </button>\n </div>\n {form.layerType === 'custom_image' ? (\n <label className=\"eyeon-map-rail__field\">\n Image URL\n <input\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={!canEdit}\n placeholder=\"https://\"\n aria-label=\"Custom image URL\"\n value={form.customImageKey ?? ''}\n onChange={(e) =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_image',\n customImageKey: e.target.value.trim() ? e.target.value.trim() : null,\n })\n }\n />\n {form.customImageKey && !isHttpImageUrl(form.customImageKey) ? (\n <span className=\"eyeon-map-rail__hint\">\n Use a full http:// or https:// image address.\n </span>\n ) : null}\n </label>\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n className=\"eyeon-map-assign__text\"\n rows={3}\n disabled={!canEdit}\n value={form.customLabel ?? ''}\n style={{\n textAlign: normalizeLabelAlign(\n form.align ?? shape.label.align,\n ),\n }}\n onChange={(e) =>\n patch({\n targetType: 'none',\n retailerId: null,\n amenityId: null,\n kioskId: null,\n layerType: 'custom_text',\n customLabel: e.target.value || null,\n })\n }\n />\n </label>\n <AlignRow\n value={form.align ?? shape.label.align ?? DEFAULT_LABEL_ALIGN}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => patch({ align })}\n />\n </>\n )}\n </>\n ) : null}\n\n {shape.kind === 'amenity' ? (\n <ModernSelect\n ariaLabel=\"Choose Amenity\"\n value={selectedAmenityType}\n disabled={!canEdit}\n searchable\n placeholder=\"Choose Amenity…\"\n options={amenityOptions}\n onChange={(next) => {\n const amenityId = next\n ? amenityCatalogIdForType(next, amenities)\n : null;\n patch({\n targetType: next ? 'amenity' : 'none',\n amenityId,\n customLabel: next || null,\n retailerId: null,\n kioskId: null,\n layerType: 'amenity',\n });\n }}\n />\n ) : null}\n\n {shape.kind === 'kiosk_screen' ? (\n <KioskNameField\n value={form.customLabel ?? kioskCatalogName ?? ''}\n disabled={!canEdit}\n onChange={(name) => {\n const trimmed = name.trim();\n patch({\n targetType: trimmed ? 'kiosk' : 'none',\n kioskId: trimmed ? form.kioskId : null,\n customLabel: name === '' ? null : name,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n });\n }}\n />\n ) : null}\n\n <AssignmentStyleFields\n form={form}\n canEdit={canEdit}\n storeDefaultColor={assignmentPadFillFallback(\n shape.kind,\n storeDefaultColor,\n )}\n storeTextColor={textColorFallback}\n textColorLabel={textColorLabel}\n showTextColor={showTextColor}\n onPatch={patch}\n />\n {canEdit ? (\n <div className=\"eyeon-map-assign__actions eyeon-map-assign__actions--end\">\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => {\n if (!hasAssignment) return;\n onClear();\n }}\n disabled={!hasAssignment}\n >\n Unassign\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction KioskNameField({\n value,\n disabled,\n onChange,\n}: {\n value: string;\n disabled: boolean;\n onChange: (name: string) => void;\n}) {\n return (\n <label className=\"eyeon-map-rail__field\">\n Name\n <input\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder=\"e.g. Food court entrance\"\n aria-label=\"Kiosk name\"\n maxLength={50}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { CmShape, CmShapeAssignment } from '../../core';\nimport {\n assignNumberFromDraft,\n assignmentIconThemeFallback,\n assignmentPadFillFallback,\n bulkAssignFormState,\n DEFAULT_ASSIGNMENT_SIZE,\n emptyShapeAssignment,\n parseShapeAssignment,\n type BulkAssignPatch,\n} from '../../core';\nimport { FieldResetButton } from '../FieldResetButton';\nimport {\n isTransparentColor,\n normalizeHexColor,\n TRANSPARENT_COLOR,\n} from '../hexColor';\nimport { isAssignableKind } from '../railAssignments';\nimport { ColorSwatch } from './formRows';\n\nexport function BulkAssignForm({\n shapes,\n assignments,\n canEdit,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n onPatch,\n}: {\n shapes: CmShape[];\n assignments: CmShapeAssignment[];\n canEdit: boolean;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n onPatch: (patch: BulkAssignPatch) => void;\n}) {\n const rows = shapes\n .filter((shape) => isAssignableKind(shape.kind))\n .map((shape) => {\n const existing = assignments.find((row) => row.shapeId === shape.id);\n return existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n });\n const common = bulkAssignFormState(rows);\n const assignableShapes = shapes.filter((shape) => isAssignableKind(shape.kind));\n const iconOnly =\n assignableShapes.length > 0 &&\n assignableShapes.every(\n (shape) => shape.kind === 'amenity' || shape.kind === 'kiosk_screen',\n );\n const uniqueKinds = new Set(assignableShapes.map((shape) => shape.kind));\n const textColorLabel = iconOnly ? 'Icon Color' : 'Text Color';\n const textColorFallback =\n uniqueKinds.size === 1\n ? assignmentIconThemeFallback(\n rows[0],\n {\n AMENITY_ICON_COLOR: amenityIconColor,\n KIOSK_ICON_COLOR: kioskIconColor,\n CONNECTOR_ICON_COLOR: storeTextColor,\n STORE_TEXT_COLOR: storeTextColor,\n },\n assignableShapes[0]?.kind,\n )\n : storeTextColor;\n const bgColorFallback =\n uniqueKinds.size === 1\n ? assignmentPadFillFallback(assignableShapes[0]?.kind, storeDefaultColor)\n : storeDefaultColor;\n\n return (\n <div className=\"eyeon-map-assign\">\n <div className=\"eyeon-map-assign__tags\">\n {shapes.map((shape) => (\n <span key={shape.id} className=\"eyeon-map-assign__tag\">\n {shape.key}\n </span>\n ))}\n </div>\n <BulkSizeRow\n value={common.size}\n disabled={!canEdit}\n onCommit={(size) => onPatch({ size })}\n />\n <BulkColorRow\n label=\"BG Color\"\n value={common.bgColor}\n fallback={bgColorFallback}\n mixed={common.bgColorMixed}\n disabled={!canEdit}\n onCommit={(bgColor) => onPatch({ bgColor })}\n />\n <BulkColorRow\n label={textColorLabel}\n value={common.textColor}\n fallback={textColorFallback}\n mixed={common.textColorMixed}\n disabled={!canEdit}\n onCommit={(textColor) => onPatch({ textColor })}\n />\n </div>\n );\n}\n\nfunction BulkSizeRow({\n value,\n disabled,\n onCommit,\n}: {\n value: number | '';\n disabled: boolean;\n onCommit: (size: number) => void;\n}) {\n const [draft, setDraft] = useState(() => (value === '' ? '' : String(value)));\n const focused = useRef(false);\n\n useEffect(() => {\n if (!focused.current) setDraft(value === '' ? '' : String(value));\n }, [value]);\n\n const emitIfComplete = (raw: string, persistIncomplete: boolean) => {\n if (!raw.trim()) {\n setDraft('');\n return;\n }\n const parsed = assignNumberFromDraft(raw);\n if (!parsed.complete) {\n setDraft(raw);\n return;\n }\n setDraft(String(parsed.render));\n onCommit(parsed.render);\n if (persistIncomplete) setDraft(String(parsed.render));\n };\n\n const step = (delta: number) => {\n const base = value === '' ? DEFAULT_ASSIGNMENT_SIZE : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Size</span>\n <div className=\"eyeon-map-assign__control\">\n <div className=\"eyeon-map-assign__stepper\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Decrease Size\"\n onClick={() => step(-1)}\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n disabled={disabled}\n aria-label=\"Size\"\n onFocus={() => {\n focused.current = true;\n }}\n onChange={(e) => emitIfComplete(e.target.value, false)}\n onBlur={() => {\n focused.current = false;\n emitIfComplete(draft, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.target as HTMLInputElement).blur();\n return;\n }\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;\n e.preventDefault();\n if (disabled) return;\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const parsed = assignNumberFromDraft(draft);\n const base = parsed.complete\n ? parsed.render\n : value === ''\n ? DEFAULT_ASSIGNMENT_SIZE\n : value;\n const next = base + delta;\n setDraft(String(next));\n onCommit(next);\n }}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Increase Size\"\n onClick={() => step(1)}\n >\n +\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BulkColorRow({\n label,\n value,\n fallback,\n mixed,\n disabled,\n onCommit,\n}: {\n label: string;\n value: string;\n fallback: string;\n mixed: boolean;\n disabled: boolean;\n onCommit: (hex: string | null) => void;\n}) {\n const transparent = !mixed && isTransparentColor(value);\n const display = mixed\n ? ''\n : transparent\n ? TRANSPARENT_COLOR\n : value.trim()\n ? value\n : fallback;\n const customized = mixed || Boolean(value.trim());\n const [hex, setHex] = useState(transparent ? '' : display);\n\n useEffect(() => {\n setHex(transparent ? '' : display);\n }, [display, transparent]);\n\n const commit = (next: string) => {\n if (!next.trim() || isTransparentColor(next)) {\n setHex('');\n if (!mixed) onCommit(TRANSPARENT_COLOR);\n return;\n }\n const normalized = normalizeHexColor(next);\n if (!normalized) {\n setHex(transparent ? '' : display);\n return;\n }\n setHex(normalized);\n onCommit(normalized);\n };\n\n return (\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">\n {label}\n {customized ? (\n <FieldResetButton\n label={label}\n disabled={disabled}\n onClick={() => onCommit(null)}\n />\n ) : null}\n </span>\n <ColorSwatch\n label={label}\n hex={hex}\n swatch={display}\n fallback={fallback}\n disabled={disabled}\n emptyIsTransparent={!mixed}\n onHexChange={setHex}\n onCommit={() => commit(hex)}\n onPick={commit}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport '../../ui/modern-select.css';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CopyToLevelButton({\n destinations,\n disabled = false,\n onCopyToLevel,\n}: {\n destinations: Array<{ id: number; name: string }>;\n disabled?: boolean;\n onCopyToLevel: (levelId: number) => string | null;\n}) {\n const listId = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setMenuPos(null);\n }, []);\n\n const updateMenuPos = useCallback(() => {\n const el = buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 168),\n maxHeight,\n });\n }, []);\n\n const destinationKey = destinations.map((level) => level.id).join(',');\n useEffect(() => {\n setError(null);\n close();\n }, [close, destinationKey]);\n\n useEffect(() => {\n if (!open) return;\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (buttonRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n buttonRef.current?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos]);\n\n if (destinations.length === 0) return null;\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label=\"Duplicate to floor\"\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {destinations.map((level) => (\n <li key={level.id} role=\"option\">\n <button\n type=\"button\"\n className=\"eyeon-map-select__option\"\n onClick={() => {\n const nextError = onCopyToLevel(level.id);\n setError(nextError);\n if (!nextError) close();\n }}\n >\n {level.name}\n </button>\n </li>\n ))}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div className=\"eyeon-map-assign__copy-wrap\">\n <button\n ref={buttonRef}\n type=\"button\"\n className={\n open ? 'eyeon-map-assign__copy is-open' : 'eyeon-map-assign__copy'\n }\n aria-label=\"Duplicate to another floor\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setError(null);\n setOpen((value) => !value);\n }}\n >\n Duplicate\n <Chevron />\n </button>\n {menu}\n {error ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ShapeLabel } from '../../core';\nimport { DEFAULT_ENTRANCE_SIZE, clampEntranceSize } from '../entranceIcon';\nimport {\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_ICON_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function EntranceIconForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [size, setSize] = useState(label.size ?? DEFAULT_ENTRANCE_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n setSize(label.size ?? DEFAULT_ENTRANCE_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = clampEntranceSize(partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n onChange(\n {\n ...label,\n ...partial,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: clampEntranceSize(stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <StepperRow\n label=\"Size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_ICON_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n DEFAULT_LABEL_ALIGN,\n type LabelAlign,\n type ShapeLabel,\n} from '../../core';\nimport { DEFAULT_LABEL_SIZE, DEFAULT_LABEL_TEXT } from '../labelText';\nimport {\n AlignRow,\n ColorRow,\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from './formRows';\n\nconst MIN_FONT_SIZE = 8;\ntype StepKey = 'size' | 'rotate';\n\nexport function TextLabelForm({\n label,\n canEdit,\n storeTextColor,\n onChange,\n}: {\n label: ShapeLabel;\n canEdit: boolean;\n storeTextColor: string;\n onChange: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n}) {\n const [text, setText] = useState(label.text ?? '');\n const [size, setSize] = useState(label.size ?? DEFAULT_LABEL_SIZE);\n const [rotate, setRotate] = useState(label.rotate ?? 0);\n const sizeRef = useRef(size);\n const rotateRef = useRef(rotate);\n const textFocused = useRef(false);\n sizeRef.current = size;\n rotateRef.current = rotate;\n const intervals = useRef<Partial<Record<StepKey, number>>>({});\n\n useEffect(() => {\n if (!textFocused.current) setText(label.text ?? '');\n setSize(label.size ?? DEFAULT_LABEL_SIZE);\n setRotate(label.rotate ?? 0);\n }, [label]);\n\n useEffect(\n () => () => {\n (Object.values(intervals.current) as number[]).forEach((id) =>\n window.clearInterval(id),\n );\n },\n [],\n );\n\n const commit = useCallback(\n (partial: Partial<ShapeLabel>, opts?: { live?: boolean }) => {\n if (!canEdit) return;\n const nextSize = Math.max(MIN_FONT_SIZE, partial.size ?? sizeRef.current);\n const nextRotate = partial.rotate ?? rotateRef.current;\n if (partial.size != null) {\n setSize(nextSize);\n sizeRef.current = nextSize;\n }\n if (partial.rotate != null) {\n setRotate(nextRotate);\n rotateRef.current = nextRotate;\n }\n const nextText =\n partial.text === undefined\n ? text\n : partial.text === ''\n ? (label.text ?? DEFAULT_LABEL_TEXT)\n : partial.text;\n onChange(\n {\n ...label,\n ...partial,\n text: nextText,\n size: nextSize,\n rotate: nextRotate,\n },\n opts,\n );\n },\n [canEdit, label, onChange, text],\n );\n\n const bump = (key: StepKey, delta: number) => {\n if (key === 'size') {\n commit({\n size: Math.max(MIN_FONT_SIZE, stepWholeNumber(sizeRef.current, delta)),\n });\n return;\n }\n commit({ rotate: stepWholeNumber(rotateRef.current, delta) });\n };\n\n const stopHold = (key: StepKey) => {\n const id = intervals.current[key];\n if (id) {\n window.clearInterval(id);\n intervals.current[key] = undefined;\n }\n };\n\n const startHold = (key: StepKey, delta: number) => {\n stopHold(key);\n intervals.current[key] = window.setInterval(() => bump(key, delta), 200);\n };\n\n const color = label.color ?? '';\n\n return (\n <div className=\"eyeon-map-assign\">\n <label className=\"eyeon-map-rail__field\">\n Text\n <textarea\n rows={3}\n value={text}\n disabled={!canEdit}\n placeholder=\"Text on the map\"\n aria-label=\"Text\"\n style={{ textAlign: label.align ?? DEFAULT_LABEL_ALIGN }}\n onFocus={() => {\n textFocused.current = true;\n }}\n onChange={(e) => {\n const next = e.target.value;\n setText(next);\n commit({ text: next }, { live: true });\n }}\n onBlur={() => {\n textFocused.current = false;\n const next = text.trim();\n if (next !== text) setText(next);\n commit({ text: next || DEFAULT_LABEL_TEXT });\n }}\n />\n </label>\n <AlignRow\n value={label.align}\n disabled={!canEdit}\n onChange={(align: LabelAlign) => commit({ align })}\n />\n <StepperRow\n label=\"Font size\"\n value={size}\n disabled={!canEdit}\n onChange={(next) => commit({ size: Math.max(MIN_FONT_SIZE, next) })}\n onStep={(delta) => bump('size', delta)}\n onHoldStart={(delta) => startHold('size', delta)}\n onHoldEnd={() => stopHold('size')}\n />\n <ColorRow\n label=\"Text color\"\n value={color}\n fallback={storeTextColor}\n disabled={!canEdit}\n onChange={(hex) => commit({ color: hex || undefined })}\n onReset={color ? () => commit({ color: undefined }) : undefined}\n />\n <StepperRow\n label=\"Rotate\"\n value={rotate}\n disabled={!canEdit}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n disabled={!canEdit}\n onClick={() => commit({ rotate: nextQuarterTurn(rotateRef.current) })}\n >\n <RotateIcon />\n </button>\n }\n onChange={(next) => commit({ rotate: next })}\n onStep={(delta) => bump('rotate', delta)}\n onHoldStart={(delta) => startHold('rotate', delta)}\n onHoldEnd={() => stopHold('rotate')}\n />\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n BulkAssignPatch,\n CmAmenityCatalogItem,\n CmShape,\n CmShapeAssignment,\n MapAssignKiosk,\n MapAssignRetailer,\n ShapeKind,\n ShapeLabel,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { inspectorShowsType, inspectorTypeKinds, SHAPE_KIND_LABELS } from '../labels';\nimport { isAssignableKind } from '../railAssignments';\nimport { copyDestinationLevels } from '../shapeCopy';\nimport { isEntranceIcon } from '../entranceIcon';\nimport { AssignForm } from './AssignForm';\nimport { BulkAssignForm } from './BulkAssignForm';\nimport { CopyToLevelButton } from './CopyToLevelButton';\nimport { EntranceIconForm } from './EntranceIconForm';\nimport { TextLabelForm } from './TextLabelForm';\n\nexport interface InspectorProps {\n shape: CmShape | null;\n assignment: CmShapeAssignment | null;\n amenities: CmAmenityCatalogItem[];\n retailers?: MapAssignRetailer[];\n kiosks?: MapAssignKiosk[];\n /** Other shape keys on the same level — used for uniqueness validation. */\n levelShapeKeys?: string[];\n canEdit: boolean;\n /** Retailer / amenity / kiosk assignment. Off in Edit Map (ID and Type only). */\n showAssignment?: boolean;\n /** Empty-state copy when nothing is selected. */\n emptyHint?: string;\n onRename: (key: string) => void;\n onChangeKind: (kind: ShapeKind) => void;\n onChangeLevel?: (levelId: number) => string | null;\n /** Duplicate geometry onto another floor. Edit Map only — not assign. */\n onCopyToLevel?: (levelId: number) => string | null;\n levels?: Array<{ id: number; name: string }>;\n onDelete?: () => void;\n onClearAssignment?: () => void;\n onSaveAssignment: (assignment: CmShapeAssignment) => void;\n onUpdateLabel?: (label: ShapeLabel, opts?: { live?: boolean }) => void;\n selectedShapes?: CmShape[];\n selectedAssignments?: CmShapeAssignment[];\n onBulkAssign?: (patch: BulkAssignPatch) => void;\n storeDefaultColor: string;\n storeTextColor: string;\n amenityIconColor: string;\n kioskIconColor: string;\n}\n\nexport function Inspector({\n shape,\n assignment,\n amenities,\n retailers = [],\n kiosks = [],\n levelShapeKeys = [],\n canEdit,\n showAssignment = true,\n emptyHint = 'Pick an item from the list below, or click it on the map.',\n onRename,\n onChangeKind,\n onChangeLevel,\n onCopyToLevel,\n levels = [],\n onDelete,\n onClearAssignment,\n onSaveAssignment,\n onUpdateLabel,\n selectedShapes = [],\n selectedAssignments = [],\n onBulkAssign,\n storeDefaultColor,\n storeTextColor,\n amenityIconColor,\n kioskIconColor,\n}: InspectorProps) {\n const [key, setKey] = useState(shape?.key ?? '');\n const [keyError, setKeyError] = useState<string | null>(null);\n const [levelError, setLevelError] = useState<string | null>(null);\n\n useEffect(() => {\n setKey(shape?.key ?? '');\n setKeyError(null);\n setLevelError(null);\n }, [shape, assignment]);\n\n if (showAssignment && selectedShapes.length > 1 && onBulkAssign) {\n return (\n <div className=\"eyeon-map-inspector\">\n <BulkAssignForm\n key={selectedShapes.map((item) => item.id).join(',')}\n shapes={selectedShapes}\n assignments={selectedAssignments}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onPatch={onBulkAssign}\n />\n </div>\n );\n }\n\n if (!shape) {\n if (!showAssignment || !emptyHint) return null;\n return (\n <div className=\"eyeon-map-inspector__empty\">\n {emptyHint}\n </div>\n );\n }\n\n const commitRename = () => {\n if (!key || key === shape.key) {\n setKeyError(null);\n return;\n }\n if (levelShapeKeys.includes(key)) {\n setKeyError('That ID is already used on this level.');\n return;\n }\n setKeyError(null);\n onRename(key);\n };\n\n const copyDestinations = copyDestinationLevels(levels, shape.levelId);\n const copyButton =\n !showAssignment &&\n canEdit &&\n onCopyToLevel &&\n copyDestinations.length > 0 ? (\n <CopyToLevelButton\n destinations={copyDestinations}\n onCopyToLevel={onCopyToLevel}\n />\n ) : null;\n\n if (showAssignment) {\n return (\n <div className=\"eyeon-map-inspector\">\n {shape.geometryLocked ? (\n <p className=\"eyeon-map-rail__hint\">\n Geometry locked — outdoor re-uploads will not overwrite this shape.\n </p>\n ) : null}\n {isAssignableKind(shape.kind) ? (\n <AssignForm\n shape={shape}\n assignment={assignment}\n amenities={amenities}\n retailers={retailers}\n kiosks={kiosks}\n canEdit={canEdit}\n storeDefaultColor={storeDefaultColor}\n storeTextColor={storeTextColor}\n amenityIconColor={amenityIconColor}\n kioskIconColor={kioskIconColor}\n onChange={onSaveAssignment}\n onClear={() => onClearAssignment?.()}\n />\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-inspector\">\n {isEntranceIcon(shape) ? (\n onUpdateLabel ? (\n <EntranceIconForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : shape.kind === 'label' ? (\n onUpdateLabel ? (\n <TextLabelForm\n label={shape.label}\n canEdit={canEdit}\n storeTextColor={storeTextColor}\n onChange={onUpdateLabel}\n />\n ) : null\n ) : (\n <>\n <label className=\"eyeon-map-rail__field\">\n ID\n <input\n className=\"eyeon-map-rail__id-input\"\n value={key}\n disabled={!canEdit}\n onChange={(e) => {\n setKey(e.target.value);\n setKeyError(null);\n }}\n onBlur={commitRename}\n />\n </label>\n {keyError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {keyError}\n </p>\n ) : null}\n\n {inspectorShowsType(shape.kind) ? (\n <label className=\"eyeon-map-rail__field\">\n Type\n <ModernSelect\n ariaLabel=\"Type\"\n value={shape.kind}\n disabled={!canEdit}\n searchable={false}\n options={inspectorTypeKinds(shape.kind).map((k) => ({\n value: k,\n label: SHAPE_KIND_LABELS[k],\n }))}\n onChange={(next) => onChangeKind(next as ShapeKind)}\n />\n </label>\n ) : null}\n {shape.kind === 'void' ? (\n <p className=\"eyeon-map-rail__hint\">\n Open to Below looks through to the floor below — walkways and\n floor plates are cut out so the lower level shows through.\n </p>\n ) : null}\n </>\n )}\n\n {onChangeLevel && levels.length > 0 ? (\n <>\n <div className=\"eyeon-map-assign__row\">\n <span className=\"eyeon-map-assign__label\">Floor</span>\n <div className=\"eyeon-map-assign__floor\">\n <ModernSelect\n ariaLabel=\"Floor\"\n value={String(shape.levelId)}\n disabled={!canEdit}\n searchable={false}\n options={levels.map((level) => ({\n value: String(level.id),\n label: level.name,\n }))}\n onChange={(next) => {\n if (!next) return;\n setLevelError(onChangeLevel(Number(next)));\n }}\n />\n </div>\n </div>\n {levelError ? (\n <p className=\"eyeon-map-rail__hint\" style={{ color: '#b91c1c' }}>\n {levelError}\n </p>\n ) : null}\n </>\n ) : null}\n\n {canEdit && (copyButton || onDelete) ? (\n <div className=\"eyeon-map-assign__actions\">\n {copyButton}\n {onDelete ? (\n <button\n type=\"button\"\n className=\"eyeon-map-assign__unassign\"\n onClick={() => onDelete()}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import React, { Suspense } from 'react';\nimport type {\n DeviceType,\n MapViewerHost,\n PublishedDocument,\n ThemeDefaults,\n} from '../../core';\nimport { MapViewer } from '../../viewer/MapViewer';\nimport type { CameraViewSnapshot } from '../../viewer/components/CameraRig';\n\nexport function PreviewOverlay({\n document,\n host = 'PORTAL_ASSIGN',\n onSelectShape,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId,\n focusNonce,\n activeLevelId,\n onActiveLevelChange,\n routeOnSelect,\n imageProxyUrl,\n device,\n captureCamera,\n onCameraChange,\n onCameraSample,\n onCameraReset,\n themeOverrides,\n transparentBackground,\n googleMapsApiKey,\n}: {\n document: PublishedDocument;\n /** Assign mode and public website hide search. */\n host?: MapViewerHost;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusNonce?: number;\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Default true (public navigate). False when assigning in PORTAL. */\n routeOnSelect?: boolean;\n /** Without this the outdoor SVG is fetched cross-origin and CORS blocks it. */\n imageProxyUrl?: string | null;\n device?: DeviceType;\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraSample?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n themeOverrides?: Partial<ThemeDefaults>;\n /** Lets a basemap show through the viewer canvas. */\n transparentBackground?: boolean;\n /** Shows the saved Google map behind the building when the document has one. */\n googleMapsApiKey?: string;\n}) {\n return (\n <div className=\"eyeon-map-preview\">\n <Suspense fallback={<div className=\"eyeon-map-preview__loading\">Loading preview…</div>}>\n {/* Viewer chrome stays on the canvas — never in the Map options rail. */}\n <MapViewer\n document={document}\n host={host}\n onSelectShape={onSelectShape}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n focusNonce={focusNonce}\n activeLevelId={activeLevelId}\n onActiveLevelChange={onActiveLevelChange}\n routeOnSelect={routeOnSelect}\n imageProxyUrl={imageProxyUrl}\n device={device}\n captureCamera={captureCamera}\n onCameraChange={onCameraChange}\n onCameraSample={onCameraSample}\n onCameraReset={onCameraReset}\n themeOverrides={themeOverrides}\n transparentBackground={transparentBackground}\n googleMapsApiKey={googleMapsApiKey}\n />\n </Suspense>\n </div>\n );\n}\n","export type ShapeSelectOpts = { additive?: boolean };\n\n/** Plain click replaces; Shift-click toggles the id in the set. */\nexport function nextSelectedShapeIds(\n current: number[],\n id: number | null,\n opts?: ShapeSelectOpts,\n): number[] {\n if (id == null) return [];\n if (!opts?.additive) return [id];\n if (current.includes(id)) return current.filter((item) => item !== id);\n return [...current, id];\n}\n","import type {\n CmConnector,\n CmResponsiveOverride,\n MapAssignRetailer,\n PublishedDocument,\n} from '../core';\nimport { compileDocument } from '../core';\nimport type { EditorDraftState } from './draftOps';\n\nexport function compileEditorPreview(\n draft: EditorDraftState,\n extras?: {\n revisionId?: number;\n revisionNumber?: number;\n connectors?: CmConnector[];\n publishedAt?: string;\n retailers?: MapAssignRetailer[];\n responsiveOverrides?: CmResponsiveOverride[];\n },\n): PublishedDocument {\n const outdoor = draft.levels.find((level) => level.kind === 'outdoor');\n return compileDocument({\n revisionId: extras?.revisionId ?? 0,\n revisionNumber: extras?.revisionNumber ?? 0,\n centerId: draft.centerId,\n mapId: draft.mapId,\n theme: draft.theme,\n baseSvgUrl: draft.baseSvgUrl ?? outdoor?.sourceSvgUrl ?? null,\n baseViewbox: outdoor?.sourceViewbox ?? null,\n buildings: draft.buildings,\n levels: draft.levels,\n shapes: draft.shapes.filter((s) => !s.orphanedAt),\n assignments: draft.assignments,\n anchors: draft.anchors,\n edges: draft.edges,\n connectors: extras?.connectors ?? draft.connectors ?? [],\n amenities: draft.amenities,\n responsiveOverrides:\n extras?.responsiveOverrides ?? draft.responsiveOverrides ?? [],\n publishedAt: extras?.publishedAt,\n retailers: extras?.retailers,\n georeference: draft.georeference,\n /** Prefer already-resolved CDN URLs on draft levels (outdoor SVG). */\n resolveSvgUrl: (key) => {\n if (!key) return null;\n const match = draft.levels.find(\n (l) => l.sourceSvgKey === key || l.sourceSvgUrl === key,\n );\n return match?.sourceSvgUrl ?? key;\n },\n });\n}\n","import type { DeviceType } from '../core';\n\nexport type RestoredEditorSection = {\n section: 'edit-map' | 'wayfinding' | 'map-responsiveness';\n levelId: number | null;\n device?: DeviceType;\n};\n\nconst memory = new Map<number, RestoredEditorSection>();\nconst MAX_REMEMBERED_MAPS = 20;\n\nconst storageKey = (mapId: number) => `eyeon-map-editor-section:${mapId}`;\n\nfunction dropLegacyStorage(mapId: number): void {\n try {\n sessionStorage.removeItem(storageKey(mapId));\n } catch {\n /* private mode / SSR */\n }\n}\n\n/**\n * Keep Edit Map / Wayfinding / Map Responsiveness open across an in-page remount (save).\n * Memory only — a full page refresh returns to Map options.\n */\nexport function markEditorSection(\n mapId: number,\n restored: RestoredEditorSection,\n): void {\n memory.delete(mapId);\n memory.set(mapId, restored);\n if (memory.size > MAX_REMEMBERED_MAPS) {\n const oldest = memory.keys().next().value;\n if (oldest != null) memory.delete(oldest);\n }\n dropLegacyStorage(mapId);\n}\n\nexport function peekEditorSection(mapId: number): RestoredEditorSection | null {\n dropLegacyStorage(mapId);\n return memory.get(mapId) ?? null;\n}\n\nexport function clearEditorSection(mapId: number): void {\n memory.delete(mapId);\n dropLegacyStorage(mapId);\n}\n","const memory = new Set<number>();\n\nconst storageKey = (mapId: number) => `eyeon-map-return-floors:${mapId}`;\n\nfunction storage(): Storage | null {\n try {\n return sessionStorage;\n } catch {\n return null;\n }\n}\n\n/** Remember to reopen the floors list after a remount (reload after add). */\nexport function markReturnToFloorsList(mapId: number): void {\n memory.add(mapId);\n storage()?.setItem(storageKey(mapId), '1');\n}\n\nexport function consumeReturnToFloorsList(mapId: number): boolean {\n const stored = storage()?.getItem(storageKey(mapId)) === '1';\n const pending = memory.has(mapId) || stored;\n clearReturnToFloorsList(mapId);\n return pending;\n}\n\nexport function clearReturnToFloorsList(mapId: number): void {\n memory.delete(mapId);\n storage()?.removeItem(storageKey(mapId));\n}\n","import React from 'react';\n\n/** Edit Map / Wayfinding graph paper strength. Per-user, not per center. */\nexport type MapGridPrefs = {\n /** 0–0.3. The slider still travels 0–100. Diagonals stay at half this value. */\n gridOpacity: number;\n};\n\n/** Right end of the slider. The control itself stays 0–100. */\nexport const MAX_GRID_OPACITY = 0.3;\nexport const DEFAULT_GRID_OPACITY = 0.13;\n\nexport function clampGridOpacity(value: number): number {\n if (!Number.isFinite(value)) return DEFAULT_GRID_OPACITY;\n return Math.min(MAX_GRID_OPACITY, Math.max(0, Math.round(value * 1000) / 1000));\n}\n\nfunction gridOpacityFromSlider(percent: number): number {\n return clampGridOpacity((percent / 100) * MAX_GRID_OPACITY);\n}\n\nfunction sliderPercentFromGridOpacity(opacity: number): number {\n return Math.round((clampGridOpacity(opacity) / MAX_GRID_OPACITY) * 100);\n}\n\nexport function GridPrefsControl({\n gridOpacity,\n onChange,\n}: {\n gridOpacity: number;\n /** Fires on every slider move so the host can update the canvas and persist immediately. */\n onChange: (prefs: MapGridPrefs) => void;\n}) {\n const percent = sliderPercentFromGridOpacity(gridOpacity);\n const prefsFromInput = (value: string): MapGridPrefs => ({\n gridOpacity: gridOpacityFromSlider(Number(value)),\n });\n return (\n <div className=\"eyeon-map-editor__grid-prefs\">\n <label className=\"eyeon-map-editor__grid-prefs-opacity\">\n Grid Opacity\n <input\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={percent}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-label=\"Grid Opacity\"\n data-eyeon-grid-opacity=\"\"\n onInput={(event) => onChange(prefsFromInput(event.currentTarget.value))}\n onChange={(event) => onChange(prefsFromInput(event.currentTarget.value))}\n />\n </label>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n RotateIcon,\n StepperRow,\n nextQuarterTurn,\n stepWholeNumber,\n} from '../editor/panels/formRows';\nimport {\n BASEMAP_ZOOM_STEP,\n clampBasemapZoom,\n geocodeAddress,\n loadGoogleMaps,\n type BasemapView,\n} from './googleMaps';\n\nfunction formatCoord(value: number): string {\n return value.toFixed(6);\n}\n\nexport function SurroundingsPanel({\n apiKey,\n view,\n mallOpacity,\n satellite,\n onMallOpacity,\n onSatellite,\n onHeading,\n onZoom,\n onPanTo,\n}: {\n apiKey: string;\n view: BasemapView;\n mallOpacity: number;\n satellite: boolean;\n onMallOpacity: (value: number) => void;\n onSatellite: (value: boolean) => void;\n onHeading: (heading: number) => void;\n onZoom: (zoom: number) => void;\n onPanTo: (lat: number, lng: number) => void;\n}) {\n const [query, setQuery] = useState('');\n const [searching, setSearching] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const [latText, setLatText] = useState(() => formatCoord(view.lat));\n const [lngText, setLngText] = useState(() => formatCoord(view.lng));\n const [coordError, setCoordError] = useState<string | null>(null);\n const latFocused = useRef(false);\n const lngFocused = useRef(false);\n const headingRef = useRef(view.heading);\n const zoomRef = useRef(view.zoom);\n const holdRef = useRef<number | null>(null);\n headingRef.current = view.heading;\n zoomRef.current = view.zoom;\n\n useEffect(() => {\n if (!latFocused.current) setLatText(formatCoord(view.lat));\n }, [view.lat]);\n\n useEffect(() => {\n if (!lngFocused.current) setLngText(formatCoord(view.lng));\n }, [view.lng]);\n\n useEffect(\n () => () => {\n if (holdRef.current != null) window.clearInterval(holdRef.current);\n },\n [],\n );\n\n const stopHold = () => {\n if (holdRef.current == null) return;\n window.clearInterval(holdRef.current);\n holdRef.current = null;\n };\n\n const bumpHeading = (delta: number) => {\n onHeading(stepWholeNumber(headingRef.current, delta));\n };\n\n const startHold = (delta: number) => {\n stopHold();\n holdRef.current = window.setInterval(() => bumpHeading(delta), 200);\n };\n\n const bumpZoom = (direction: number) => {\n onZoom(clampBasemapZoom(zoomRef.current + direction * BASEMAP_ZOOM_STEP));\n };\n\n const startZoomHold = (direction: number) => {\n stopHold();\n holdRef.current = window.setInterval(() => bumpZoom(direction), 200);\n };\n\n const search = async () => {\n const address = query.trim();\n if (!address || !apiKey) return;\n setSearching(true);\n setSearchError(null);\n try {\n const maps = await loadGoogleMaps(apiKey);\n const place = await geocodeAddress(maps, address);\n onPanTo(place.lat, place.lng);\n } catch (reason) {\n setSearchError(reason instanceof Error ? reason.message : 'Search failed');\n } finally {\n setSearching(false);\n }\n };\n\n const goToCoordinates = () => {\n const latRaw = latText.trim();\n const lngRaw = lngText.trim();\n const lat = Number(latRaw);\n const lng = Number(lngRaw);\n if (!latRaw || !lngRaw) {\n setCoordError('Enter both latitude and longitude.');\n return;\n }\n if (!Number.isFinite(lat) || lat < -90 || lat > 90) {\n setCoordError('Latitude must be between -90 and 90.');\n return;\n }\n if (!Number.isFinite(lng) || lng < -180 || lng > 180) {\n setCoordError('Longitude must be between -180 and 180.');\n return;\n }\n setCoordError(null);\n onPanTo(lat, lng);\n };\n\n if (!apiKey) {\n return (\n <p className=\"eyeon-map-rail__hint\">\n Add STORYBOOK_GOOGLE_MAPS_API_KEY to apps/storybook/.env.local, then\n restart Storybook.\n </p>\n );\n }\n\n return (\n <>\n <p className=\"eyeon-map-rail__hint\">\n Search or enter coordinates, then drag the map and scroll to zoom.\n Rotate sets the map angle. The building stays still.\n </p>\n <form\n className=\"eyeon-map-rail__field\"\n onSubmit={(event) => {\n event.preventDefault();\n void search();\n }}\n >\n <span>Find the mall</span>\n <input\n value={query}\n placeholder=\"Mall name or address\"\n aria-label=\"Find the mall\"\n onChange={(event) => setQuery(event.target.value)}\n />\n </form>\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => void search()} disabled={searching || !query.trim()}>\n {searching ? 'Searching…' : 'Search'}\n </button>\n </div>\n {searchError ? <p className=\"eyeon-map-rail__hint\">{searchError}</p> : null}\n\n <div className=\"eyeon-map-surroundings__or\" role=\"separator\">\n <span>OR</span>\n </div>\n\n <form\n className=\"eyeon-map-surroundings__coords-form\"\n onSubmit={(event) => {\n event.preventDefault();\n goToCoordinates();\n }}\n >\n <div className=\"eyeon-map-surroundings__coords\">\n <label className=\"eyeon-map-rail__field\">\n <span>Latitude</span>\n <input\n value={latText}\n inputMode=\"decimal\"\n aria-label=\"Latitude\"\n onFocus={() => {\n latFocused.current = true;\n }}\n onBlur={() => {\n latFocused.current = false;\n }}\n onChange={(event) => setLatText(event.target.value)}\n />\n </label>\n <label className=\"eyeon-map-rail__field\">\n <span>Longitude</span>\n <input\n value={lngText}\n inputMode=\"decimal\"\n aria-label=\"Longitude\"\n onFocus={() => {\n lngFocused.current = true;\n }}\n onBlur={() => {\n lngFocused.current = false;\n }}\n onChange={(event) => setLngText(event.target.value)}\n />\n </label>\n </div>\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"submit\">Go to coordinates</button>\n </div>\n {coordError ? <p className=\"eyeon-map-rail__hint\">{coordError}</p> : null}\n </form>\n\n <StepperRow\n label=\"Rotate\"\n value={view.heading}\n disabled={false}\n extra={\n <button\n type=\"button\"\n className=\"eyeon-map-assign__rotate\"\n aria-label=\"Rotate 45 degrees\"\n onClick={() => onHeading(nextQuarterTurn(view.heading))}\n >\n <RotateIcon />\n </button>\n }\n onChange={onHeading}\n onStep={bumpHeading}\n onHoldStart={startHold}\n onHoldEnd={stopHold}\n />\n <div className=\"eyeon-map-surroundings__zoom\">\n <StepperRow\n label=\"Zoom\"\n value={clampBasemapZoom(view.zoom)}\n disabled={false}\n onChange={(zoom) => onZoom(clampBasemapZoom(zoom))}\n onStep={bumpZoom}\n onHoldStart={startZoomHold}\n onHoldEnd={stopHold}\n />\n </div>\n\n <label className=\"eyeon-map-rail__field eyeon-map-rail__field--inline eyeon-map-surroundings__opacity\">\n <span>Building opacity</span>\n <input\n type=\"range\"\n min={0.35}\n max={1}\n step={0.01}\n value={mallOpacity}\n aria-label=\"Building opacity\"\n onChange={(event) => onMallOpacity(Number(event.target.value))}\n />\n </label>\n\n <p className=\"eyeon-map-rail__hint\">\n Drag to move. Scroll or use the map’s +/− to zoom. Hold Shift and drag,\n or use Rotate, to set an angle.\n </p>\n\n <div className=\"eyeon-map-surroundings__row\">\n <button\n type=\"button\"\n className={satellite ? undefined : 'is-active'}\n onClick={() => onSatellite(false)}\n >\n Road\n </button>\n <button\n type=\"button\"\n className={satellite ? 'is-active' : undefined}\n onClick={() => onSatellite(true)}\n >\n Satellite\n </button>\n </div>\n <p className=\"eyeon-map-rail__hint\">\n {view.lat.toFixed(5)}, {view.lng.toFixed(5)} · zoom {view.zoom.toFixed(1)} ·{' '}\n {Math.round(view.heading)}°\n </p>\n <p className=\"eyeon-map-rail__hint\">\n Save Changes stores this place, zoom, and rotation on the center and\n publishes it for the public map.\n </p>\n </>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport type {\n BatchOp,\n CmShapeAssignment,\n DeviceType,\n MapAssignKiosk,\n MapAssignRetailer,\n MapEditorHost,\n PublishedDocument,\n ResponsiveCamera,\n RouteCurve,\n ShapeKind,\n Vec3,\n} from '../core';\nimport type { ShapeGeometry, ShapeLabel, ShapeStyle } from '../core';\nimport { assignmentVisualPatch, applyBulkAssignPatch, DEFAULT_LABEL_ALIGN, emptyResponsiveOverrideInput, emptyShapeAssignment, geometryBBox, hasBuildingFloors, isDefaultMapGeoreference, MAP_NO_FLOORS_MESSAGE, mergeResponsiveOverrides, mergeTheme, nextLowerBuildingFloor, parseMapGeoreference, parseShapeAssignment, poseToResponsiveFields, sameMapGeoreference, shiftRouteCurveForAnchor, RESPONSIVE_DEVICE_TABS, responsiveSlotKey, viewerLevelIdAfterShapeSelect } from '../core';\nimport type { CameraViewSnapshot } from '../viewer/components/CameraRig';\nimport type { BulkAssignPatch } from '../core';\nimport { MapControls } from '../viewer/ui/MapControls';\nimport {\n editorFloorControlLevels,\n isEditorSection,\n levelIdOnEnterDefaultMap,\n levelIdOnEnterEditMap,\n levelIdOnEnterWayfinding,\n portalCenterSurface,\n wayfindingOutdoorReadOnly,\n} from './portalSurface';\nimport { EditorCanvas, type EditorCanvasHandle } from './canvas/EditorCanvas';\nimport {\n applyBeforeUnloadWarning,\n beforeUnloadTargets,\n editorShouldWarnOnLeave,\n} from './dirty';\nimport {\n resolvedConnectorKind,\n type VerticalRailKind,\n} from './connectorAssignments';\nimport {\n applyDraftOps,\n coalesceDraftOp,\n orderBatchOpsForPersist,\n shapeKeyTakenOnLevel,\n type EditorDraftState,\n} from './draftOps';\nimport { ConnectorAssign } from './panels/ConnectorAssign';\nimport { LeftRail, type RailSection } from './panels/LeftRail';\nimport { ClassicMapFooter } from './panels/ClassicMapFooter';\nimport type { CreateLevelInput, UpdateLevelInput } from './panels/FloorsPanel';\nimport { CatalogKioskForm } from './panels/CatalogKioskForm';\nimport { Inspector } from './panels/Inspector';\nimport { PreviewOverlay } from './panels/PreviewOverlay';\nimport { isAssignableKind } from './railAssignments';\nimport {\n catalogKioskShapeOptions,\n isKioskScreenKind,\n shapeIdForCatalogKiosk,\n} from './railKiosks';\nimport { allocShapeKey, copyShapeToLevelOps, liveShapeKeysOnLevel } from './shapeCopy';\nimport { nextSelectedShapeIds, type ShapeSelectOpts } from './shapeSelection';\nimport { compileEditorPreview } from './previewDocument';\nimport { geometryForLabelText, DEFAULT_LABEL_SIZE } from './labelText';\nimport {\n DEFAULT_ENTRANCE_SIZE,\n canonicalizeEntranceLabel,\n geometryForEntranceIcon,\n isEntranceIcon,\n} from './entranceIcon';\nimport {\n cloneHistorySnapshot,\n emptyEditorHistory,\n isEditableTypingTarget,\n isEditorRedoHotkey,\n isEditorUndoHotkey,\n pushEditorHistory,\n redoEditorHistory,\n undoEditorHistory,\n type EditorHistorySnapshot,\n} from './history';\nimport {\n connectRouteAnchorToRouteOps,\n connectShapeToRouteOps,\n deleteRouteAnchorOps,\n deleteRouteEdgeOps,\n ensureShapeRouteAnchorOps,\n insertJunctionOnWalkEdgeOps,\n linkRouteAnchorsOp,\n showsWayfinding,\n walkEdgeExists,\n} from './routeStubs';\nimport {\n clearEditorSection,\n markEditorSection,\n peekEditorSection,\n} from './editorSectionReturn';\nimport {\n clearReturnToFloorsList,\n consumeReturnToFloorsList,\n markReturnToFloorsList,\n} from './floorsListReturn';\nimport {\n EditorHistoryButtons,\n EditorToolButtons,\n isWayfindingEditorTool,\n nextEditorTool,\n toolHint,\n type EditorTool,\n} from './tools';\nimport {\n clampGridOpacity,\n DEFAULT_GRID_OPACITY,\n GridPrefsControl,\n type MapGridPrefs,\n} from './GridPrefsControl';\nimport { GoogleBasemap, type GoogleBasemapHandle } from '../basemap/GoogleBasemap';\nimport { SurroundingsPanel } from '../basemap/SurroundingsPanel';\nimport {\n DEFAULT_BASEMAP_VIEW,\n keepHeading,\n keepZoom,\n normalizeHeading,\n type BasemapView,\n} from '../basemap/googleMaps';\nimport './editor.css';\n\nexport type { EditorDraftState } from './draftOps';\nexport type { MapEditorHost } from '../core';\nexport type { EditorTool } from './tools';\n\nexport type ResponsiveOverrideInput = {\n levelId: number;\n device: DeviceType;\n camera: ResponsiveCamera;\n controls: Vec3;\n};\n\nexport interface MapEditorProps {\n /**\n * Where the editor is embedded. `PORTAL` (default) always includes Map\n * options (LeftRail: Floors, Kiosks, Settings, plus Edit Map — never viewer\n * chrome). Default center is MapViewer (click-to-assign, no grid). Edit\n * Map swaps in the geometry canvas and editor grid. `WEBSITE` is canvas +\n * toolbar only — public sites should use `MapViewer`, not this editor.\n */\n host?: MapEditorHost;\n draft: EditorDraftState;\n webApiURI: string;\n canEdit?: boolean;\n canFloors?: boolean;\n canSettings?: boolean;\n canResponsiveness?: boolean;\n onBatch?: (ops: BatchOp[]) => Promise<void>;\n onPublish?: () => Promise<void>;\n onSaveResponsive?: (items: ResponsiveOverrideInput[]) => Promise<void>;\n /** Reload the draft from the database after discarding local edits. */\n onDiscard?: () => Promise<void> | void;\n onImportSvg?: (levelId: number, file: File) => Promise<void>;\n onCreateLevel?: (input: CreateLevelInput) => Promise<number | void>;\n onUpdateLevel?: (input: UpdateLevelInput) => Promise<void>;\n onDeleteLevel?: (levelId: number) => Promise<void>;\n onReorderLevels?: (orderedIds: number[]) => Promise<void>;\n onAutoroute?: (levelId: number) => Promise<void>;\n previewDocument?: PublishedDocument | null;\n /**\n * Center retailers for the default-map assign form (v1 retailer dropdown).\n */\n retailers?: MapAssignRetailer[];\n /** Center kiosks for leftover ID-only assignments; new kiosks are named in Assign. */\n kiosks?: MapAssignKiosk[];\n /**\n * Media proxy base for remote http(s) media, same contract as v1\n * `IMAGE_PROXY_URL`. Required whenever the outdoor SVG is served from an\n * origin that does not send CORS headers. Inlined amenity data URLs skip it.\n */\n imageProxyUrl?: string | null;\n className?: string;\n /** Quiet extra actions under the left rail, after the built-in Classic links. */\n sidebarFooter?: ReactNode;\n /**\n * Fires when local edits, an in-progress shape/route, or a save-in-flight\n * should block leaving the page. Quiet again after a successful save.\n */\n onDirtyChange?: (state: { dirty: boolean; saving: boolean }) => void;\n /**\n * PORTAL host: fired after this center is switched back to Classic.\n * The editor unmounts once the host renders the Classic map.\n */\n onMapVersionChanged?: (mapVersion: 1 | 2) => void;\n /**\n * Edit Map and Wayfinding graph paper strength. Saved per user by the host.\n * The grid always paints above shapes.\n */\n gridOpacity?: number;\n /** Fires on every slider move so the host can update the canvas and persist immediately. */\n onGridPrefsChange?: (prefs: MapGridPrefs) => void;\n /**\n * When set, Map options includes Surroundings: a Google map behind the\n * building for alignment. Pass an empty string to show the section with a\n * missing-key message. Omit it to hide the section.\n */\n googleMapsApiKey?: string;\n}\n\nexport function MapEditor({\n host = 'PORTAL',\n draft,\n webApiURI,\n canEdit = true,\n canFloors = true,\n canSettings = true,\n canResponsiveness = false,\n onBatch,\n onPublish,\n onSaveResponsive,\n onDiscard,\n onImportSvg,\n onCreateLevel,\n onUpdateLevel,\n onDeleteLevel,\n onReorderLevels,\n onAutoroute,\n previewDocument,\n retailers = [],\n kiosks = [],\n imageProxyUrl,\n className,\n sidebarFooter,\n onDirtyChange,\n onMapVersionChanged,\n gridOpacity: gridOpacityProp = DEFAULT_GRID_OPACITY,\n onGridPrefsChange,\n googleMapsApiKey,\n}: MapEditorProps) {\n const restoredSection = peekEditorSection(draft.mapId);\n const [section, setSection] = useState<RailSection | null>(() => {\n if (consumeReturnToFloorsList(draft.mapId)) return 'floors';\n return restoredSection?.section ?? null;\n });\n const [responsiveDevice, setResponsiveDevice] = useState<DeviceType>(\n () => restoredSection?.device ?? 'admin_portal',\n );\n const [pendingResponsive, setPendingResponsive] = useState<\n Record<string, ResponsiveOverrideInput>\n >({});\n const [previewEpoch, setPreviewEpoch] = useState(0);\n const [activeLevelId, setActiveLevelId] = useState<number | null>(() => {\n const restoredLevel = peekEditorSection(draft.mapId)?.levelId;\n if (\n restoredLevel != null &&\n draft.levels.some((level) => level.id === restoredLevel)\n ) {\n return restoredLevel;\n }\n return levelIdOnEnterEditMap(draft.levels);\n });\n const [selectedShapeIds, setSelectedShapeIds] = useState<number[]>([]);\n const [selectedCatalogKioskId, setSelectedCatalogKioskId] = useState<\n number | null\n >(null);\n const selectedShapeId = selectedShapeIds[0] ?? null;\n const [hoveredShapeId, setHoveredShapeId] = useState<number | null>(null);\n const [listFocusNonce, setListFocusNonce] = useState(0);\n const [selectedAnchorIds, setSelectedAnchorIds] = useState<number[]>([]);\n const [tool, setTool] = useState<EditorTool>('select');\n const [gridOpacity, setGridOpacity] = useState(() =>\n clampGridOpacity(gridOpacityProp),\n );\n const showSurroundings = googleMapsApiKey !== undefined;\n const basemapRef = useRef<GoogleBasemapHandle>(null);\n const mallCameraRef = useRef<CameraViewSnapshot | null>(null);\n const [basemapView, setBasemapView] = useState<BasemapView>(\n () => parseMapGeoreference(draft.georeference) ?? DEFAULT_BASEMAP_VIEW,\n );\n const [mallOpacity, setMallOpacity] = useState(0.82);\n const [basemapSatellite, setBasemapSatellite] = useState(false);\n const [editVersion, setEditVersion] = useState(0);\n const [needsPublish, setNeedsPublish] = useState(false);\n const [saving, setSaving] = useState(false);\n const [history, setHistory] = useState(emptyEditorHistory);\n const [routeDraftActive, setRouteDraftActive] = useState(false);\n const canvasRef = useRef<EditorCanvasHandle>(null);\n const historyRef = useRef(history);\n const pendingOps = useRef<BatchOp[]>([]);\n const nextTempId = useRef(-1);\n const historyGestureRef = useRef(false);\n historyRef.current = history;\n const showMapOptions = host === 'PORTAL';\n const centerSurface = portalCenterSurface(host, section);\n const isEditMap = centerSurface === 'editor';\n const historyMetaRef = useRef({\n isEditMap,\n selectedShapeId,\n selectedAnchorIds,\n });\n historyMetaRef.current = { isEditMap, selectedShapeId, selectedAnchorIds };\n\n useEffect(() => {\n setGridOpacity(clampGridOpacity(gridOpacityProp));\n }, [gridOpacityProp]);\n\n const handleGridPrefsChange = useCallback((prefs: MapGridPrefs) => {\n const gridOpacity = clampGridOpacity(prefs.gridOpacity);\n setGridOpacity(gridOpacity);\n onGridPrefsChange?.({ gridOpacity });\n }, [onGridPrefsChange]);\n\n useEffect(() => {\n pendingOps.current = [];\n nextTempId.current = -1;\n historyGestureRef.current = false;\n setEditVersion(0);\n setNeedsPublish(false);\n setPendingResponsive({});\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n }, [draft.mapId, draft.centerId]);\n\n useEffect(() => {\n if (\n section === 'edit-map' ||\n section === 'wayfinding' ||\n section === 'map-responsiveness'\n ) {\n markEditorSection(draft.mapId, {\n section,\n levelId: activeLevelId,\n device: section === 'map-responsiveness' ? responsiveDevice : undefined,\n });\n return;\n }\n clearEditorSection(draft.mapId);\n }, [activeLevelId, draft.mapId, responsiveDevice, section]);\n\n // Levels can arrive after the first render, or the active one can be deleted.\n // Default map / Wayfinding must not stay on Outdoor — that hides floors.\n useEffect(() => {\n const exists = draft.levels.some((level) => level.id === activeLevelId);\n if (!exists) {\n setActiveLevelId(\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : isEditorSection(section)\n ? levelIdOnEnterEditMap(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels),\n );\n return;\n }\n if (section === 'edit-map') return;\n const active = draft.levels.find((level) => level.id === activeLevelId);\n if (active?.kind !== 'outdoor') return;\n const next =\n section === 'wayfinding'\n ? levelIdOnEnterWayfinding(draft.levels)\n : levelIdOnEnterDefaultMap(draft.levels);\n if (next != null && next !== activeLevelId) setActiveLevelId(next);\n }, [draft.levels, activeLevelId, section]);\n\n const workingDraft = useMemo(\n () => applyDraftOps(draft, pendingOps.current),\n [draft, editVersion],\n );\n\n const theme = useMemo(\n () => mergeTheme(workingDraft.theme),\n [workingDraft.theme],\n );\n\n const cameraDirty = Object.keys(pendingResponsive).length > 0;\n const pendingEdits = pendingOps.current.length > 0;\n const dirty = pendingEdits || needsPublish || cameraDirty;\n const warnOnLeave = editorShouldWarnOnLeave({\n pendingEdits,\n needsPublish,\n cameraDirty,\n gesture: routeDraftActive,\n saving,\n });\n useEffect(() => {\n onDirtyChange?.({ dirty: warnOnLeave, saving });\n }, [onDirtyChange, saving, warnOnLeave]);\n const warnOnLeaveRef = useRef(warnOnLeave);\n warnOnLeaveRef.current = warnOnLeave;\n useEffect(() => {\n const onBeforeUnload = (event: BeforeUnloadEvent) => {\n applyBeforeUnloadWarning(event, warnOnLeaveRef.current);\n };\n const targets = beforeUnloadTargets(window);\n for (const target of targets) {\n target.addEventListener('beforeunload', onBeforeUnload);\n }\n return () => {\n for (const target of targets) {\n target.removeEventListener('beforeunload', onBeforeUnload);\n }\n };\n }, []);\n const canPersist =\n !saving && dirty && (canEdit || (canResponsiveness && cameraDirty));\n const isResponsiveness = section === 'map-responsiveness';\n const isSurroundings = section === 'surroundings' && showSurroundings;\n const activeLevel = workingDraft.levels.find((l) => l.id === activeLevelId) ?? null;\n const outdoorViewOnly = wayfindingOutdoorReadOnly(section, activeLevel);\n const canDrawOnCanvas = canEdit && !outdoorViewOnly;\n const outdoorLevel = workingDraft.levels.find((l) => l.kind === 'outdoor') ?? null;\n const outdoorShapes =\n outdoorLevel && activeLevel?.kind === 'floor'\n ? workingDraft.shapes.filter((s) => s.levelId === outdoorLevel.id)\n : [];\n const levelShapes = workingDraft.shapes.filter((s) => s.levelId === activeLevelId);\n const openingUnderlayShapes = useMemo(() => {\n const levelsWithShapes = workingDraft.levels.map((lvl) => ({\n ...lvl,\n shapes: workingDraft.shapes.filter((shape) => shape.levelId === lvl.id),\n }));\n const lower = nextLowerBuildingFloor(levelsWithShapes, activeLevelId);\n if (!lower) return [];\n return workingDraft.shapes.filter(\n (shape) => shape.levelId === lower.id && !shape.orphanedAt,\n );\n }, [workingDraft.levels, workingDraft.shapes, activeLevelId]);\n const mergedResponsiveOverrides = useMemo(\n () =>\n mergeResponsiveOverrides(\n workingDraft.responsiveOverrides ?? [],\n Object.values(pendingResponsive),\n ),\n [pendingResponsive, workingDraft.responsiveOverrides],\n );\n const compiledPreview = useMemo(\n () =>\n compileEditorPreview(workingDraft, {\n revisionId: previewDocument?.revisionId,\n revisionNumber: previewDocument?.revisionNumber,\n connectors: workingDraft.connectors,\n publishedAt: previewDocument?.publishedAt,\n retailers,\n responsiveOverrides: mergedResponsiveOverrides,\n }),\n [workingDraft, previewDocument, retailers, mergedResponsiveOverrides],\n );\n const levelAnchors = useMemo(\n () => workingDraft.anchors.filter((a) => a.levelId === activeLevelId),\n [activeLevelId, workingDraft.anchors],\n );\n const levelEdges = useMemo(() => {\n const anchorsById = new Map(\n workingDraft.anchors.map((anchor) => [anchor.id, anchor]),\n );\n return workingDraft.edges.filter(\n (edge) => anchorsById.get(edge.fromAnchorId)?.levelId === activeLevelId,\n );\n }, [activeLevelId, workingDraft.anchors, workingDraft.edges]);\n const selectedShape =\n workingDraft.shapes.find((s) => s.id === selectedShapeId) ?? null;\n const selectedAssignment =\n workingDraft.assignments.find((a) => a.shapeId === selectedShapeId) ?? null;\n\n const takeSnapshot = (): EditorHistorySnapshot =>\n cloneHistorySnapshot({\n ops: pendingOps.current,\n nextTempId: nextTempId.current,\n selectedShapeId: historyMetaRef.current.selectedShapeId,\n selectedAnchorIds: historyMetaRef.current.selectedAnchorIds,\n });\n\n const applySnapshot = (snapshot: EditorHistorySnapshot) => {\n pendingOps.current = snapshot.ops;\n nextTempId.current = snapshot.nextTempId;\n setSelectedShapeIds(\n snapshot.selectedShapeId == null ? [] : [snapshot.selectedShapeId],\n );\n setSelectedAnchorIds(snapshot.selectedAnchorIds);\n setEditVersion((n) => n + 1);\n };\n\n const recordHistoryStep = (mode: 'step' | 'gesture' | 'none') => {\n if (!historyMetaRef.current.isEditMap || mode === 'none') return;\n if (mode === 'gesture') {\n if (historyGestureRef.current) return;\n historyGestureRef.current = true;\n }\n const next = pushEditorHistory(historyRef.current, takeSnapshot());\n historyRef.current = next;\n setHistory(next);\n };\n\n const queueOp = useCallback(\n (op: BatchOp, historyMode: 'step' | 'gesture' | 'none' = 'step'): number | null => {\n recordHistoryStep(historyMode);\n let next = op;\n if (next.op === 'upsert_shape' && next.shape.id == null) {\n const id = nextTempId.current--;\n next = { ...next, shape: { ...next.shape, id } };\n }\n if (next.op === 'upsert_anchor' && next.anchor.id == null) {\n const id = nextTempId.current--;\n next = { ...next, anchor: { ...next.anchor, id } };\n }\n if (next.op === 'upsert_edge' && next.edge.id == null) {\n const id = nextTempId.current--;\n next = { ...next, edge: { ...next.edge, id } };\n }\n if (next.op === 'upsert_connector' && next.connector.id == null) {\n const id = nextTempId.current--;\n next = { ...next, connector: { ...next.connector, id } };\n }\n pendingOps.current = coalesceDraftOp(pendingOps.current, next);\n setEditVersion((n) => n + 1);\n if (next.op === 'upsert_shape') return next.shape.id ?? null;\n if (next.op === 'upsert_anchor') return next.anchor.id ?? null;\n if (next.op === 'upsert_edge') return next.edge.id ?? null;\n if (next.op === 'upsert_connector') return next.connector.id ?? null;\n return null;\n },\n [],\n );\n\n const savedGeoreferenceKey = JSON.stringify(draft.georeference ?? null);\n const basemapViewRef = useRef(basemapView);\n basemapViewRef.current = basemapView;\n const draftGeorefRef = useRef(draft.georeference);\n draftGeorefRef.current = draft.georeference;\n const georeferenceWithAnchor = useCallback((view: BasemapView) => {\n const parsed = parseMapGeoreference(view);\n if (!parsed) return null;\n const cam = mallCameraRef.current;\n if (cam && cam.zoom > 0) {\n return {\n ...parsed,\n anchorZoom: Math.round(cam.zoom * 1000) / 1000,\n anchorX: cam.target[0],\n anchorY: cam.target[1],\n };\n }\n const saved = parseMapGeoreference(draftGeorefRef.current);\n if (saved?.anchorZoom != null && saved.anchorZoom > 0) {\n return {\n ...parsed,\n anchorZoom: saved.anchorZoom,\n anchorX: saved.anchorX,\n anchorY: saved.anchorY,\n };\n }\n return parsed;\n }, []);\n useEffect(() => {\n if (pendingOps.current.some((op) => op.op === 'update_georeference')) return;\n const saved = parseMapGeoreference(draft.georeference);\n setBasemapView(saved ?? DEFAULT_BASEMAP_VIEW);\n }, [savedGeoreferenceKey]);\n\n useEffect(() => {\n if (!canEdit) return;\n const current = georeferenceWithAnchor(basemapView);\n if (!current) return;\n const saved = parseMapGeoreference(draft.georeference);\n if (!saved && isDefaultMapGeoreference(current)) return;\n if (saved && sameMapGeoreference(saved, current)) return;\n queueOp({ op: 'update_georeference', georeference: current }, 'none');\n }, [basemapView, canEdit, georeferenceWithAnchor, queueOp, savedGeoreferenceKey]);\n\n const endHistoryGesture = useCallback(() => {\n historyGestureRef.current = false;\n }, []);\n\n const undo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const routeKind = canvasRef.current?.consumeRouteUndo();\n if (routeKind === 'clear-only') return;\n const next = undoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const redo = useCallback(() => {\n if (!historyMetaRef.current.isEditMap || !canEdit || saving) return;\n const next = redoEditorHistory(historyRef.current, takeSnapshot());\n if (!next) return;\n historyGestureRef.current = false;\n applySnapshot(next.restored);\n historyRef.current = next.history;\n setHistory(next.history);\n }, [canEdit, saving]);\n\n const handleSaveChanges = useCallback(async () => {\n if (saving) return;\n if (canEdit) {\n const current = georeferenceWithAnchor(basemapView);\n const saved = parseMapGeoreference(draft.georeference);\n const changed =\n current != null &&\n !(saved == null && isDefaultMapGeoreference(current)) &&\n !(saved != null && sameMapGeoreference(saved, current));\n if (changed && current) {\n pendingOps.current = coalesceDraftOp(pendingOps.current, {\n op: 'update_georeference',\n georeference: current,\n });\n }\n }\n const ops = canEdit ? orderBatchOpsForPersist(pendingOps.current) : [];\n const cameraItems = canResponsiveness ? Object.values(pendingResponsive) : [];\n if (!ops.length && !needsPublish && !cameraItems.length) return;\n if (!canEdit && !cameraItems.length) return;\n pendingOps.current = [];\n setEditVersion((n) => n + 1);\n setSaving(true);\n let persisted = !ops.length;\n const savedCamera = cameraItems;\n try {\n if (cameraItems.length && onSaveResponsive) {\n await onSaveResponsive(cameraItems);\n setPendingResponsive({});\n }\n if (ops.length && onBatch) {\n await onBatch(ops);\n persisted = true;\n }\n await onPublish?.();\n setNeedsPublish(false);\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n } catch {\n if (savedCamera.length) {\n setPendingResponsive((prev) =>\n Object.keys(prev).length ? prev : Object.fromEntries(\n savedCamera.map((item) => [\n responsiveSlotKey(item.levelId, item.device),\n item,\n ]),\n ),\n );\n }\n if (!persisted) {\n pendingOps.current = ops;\n setEditVersion((n) => n + 1);\n } else {\n setNeedsPublish(true);\n }\n } finally {\n setSaving(false);\n }\n }, [\n basemapView,\n canEdit,\n georeferenceWithAnchor,\n canResponsiveness,\n draft.georeference,\n needsPublish,\n onBatch,\n onPublish,\n onSaveResponsive,\n pendingResponsive,\n saving,\n ]);\n\n const handleDiscardChanges = useCallback(async () => {\n if (saving || !dirty) return;\n if (!canEdit && !cameraDirty) return;\n if (\n !window.confirm(\n 'Discard unsaved changes and reload the map from the database?',\n )\n ) {\n return;\n }\n canvasRef.current?.consumeRouteUndo();\n pendingOps.current = [];\n const saved = parseMapGeoreference(draft.georeference);\n setBasemapView(saved ?? DEFAULT_BASEMAP_VIEW);\n nextTempId.current = -1;\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setNeedsPublish(false);\n setPendingResponsive({});\n setPreviewEpoch((n) => n + 1);\n setEditVersion((n) => n + 1);\n setSaving(true);\n try {\n await onDiscard?.();\n } finally {\n setSaving(false);\n }\n }, [cameraDirty, canEdit, dirty, draft.georeference, onDiscard, saving]);\n\n const handleSectionChange = useCallback(\n (next: RailSection | null) => {\n // Leave item-options (level 3) whenever the rail module changes so\n // Stores / Amenities / … always open on their list (level 2).\n setSelectedShapeIds([]);\n setSelectedCatalogKioskId(null);\n setSelectedAnchorIds([]);\n setHoveredShapeId(null);\n if (isEditorSection(section) && !isEditorSection(next)) {\n setTool('select');\n historyGestureRef.current = false;\n historyRef.current = emptyEditorHistory();\n setHistory(emptyEditorHistory());\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n } else if (next === 'edit-map') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterEditMap(draft.levels));\n } else if (next === 'wayfinding') {\n setTool('select');\n setActiveLevelId(levelIdOnEnterWayfinding(draft.levels));\n } else if (next === 'map-responsiveness' || next === 'surroundings') {\n setActiveLevelId(levelIdOnEnterDefaultMap(draft.levels));\n }\n setSection(next);\n },\n [draft.levels, section],\n );\n\n const handleCanvasLevelChange = (levelId: number) => {\n if (levelId === activeLevelId) return;\n setSelectedShapeIds([]);\n setSelectedAnchorIds([]);\n setActiveLevelId(levelId);\n const nextLevel = workingDraft.levels.find((level) => level.id === levelId);\n if (wayfindingOutdoorReadOnly(section, nextLevel)) setTool('select');\n };\n\n useEffect(() => {\n if (!isEditMap || !canEdit) return;\n const onKey = (e: KeyboardEvent) => {\n if (isEditableTypingTarget(e.target)) return;\n if (isEditorUndoHotkey(e)) {\n e.preventDefault();\n undo();\n return;\n }\n if (isEditorRedoHotkey(e)) {\n e.preventDefault();\n redo();\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [canEdit, isEditMap, redo, undo]);\n\n const handleSelectShape = useCallback(\n (id: number | null, opts?: ShapeSelectOpts) => {\n const shape = id == null ? null : workingDraft.shapes.find((s) => s.id === id);\n const additive =\n Boolean(opts?.additive) &&\n section !== 'edit-map' &&\n section !== 'wayfinding' &&\n (shape == null || isAssignableKind(shape.kind));\n setSelectedShapeIds((prev) => nextSelectedShapeIds(prev, id, { additive }));\n if (id != null) setSelectedCatalogKioskId(null);\n setHoveredShapeId(null);\n if (id == null) return;\n if (shape && !additive) {\n const nextLevelId =\n section === 'edit-map' || section === 'wayfinding'\n ? shape.levelId\n : viewerLevelIdAfterShapeSelect(\n workingDraft.levels,\n activeLevelId,\n shape.levelId,\n );\n setActiveLevelId(nextLevelId);\n }\n if (additive) return;\n setSection((current) => {\n if (\n current === 'edit-map' ||\n current === 'wayfinding' ||\n current === 'map-responsiveness'\n ) {\n return current;\n }\n if (shape?.kind === 'custom') return 'custom';\n if (\n current === 'unassigned' ||\n current === 'escalators' ||\n current === 'elevators'\n ) {\n return current;\n }\n const connectorKind = shape\n ? resolvedConnectorKind(shape, workingDraft.anchors, workingDraft.connectors)\n : null;\n if (connectorKind === 'escalator') return 'escalators';\n if (connectorKind === 'elevator') return 'elevators';\n if (shape?.kind === 'unit' || shape?.kind === 'parking_zone') return 'stores';\n if (shape?.kind === 'amenity') return 'amenities';\n if (shape?.kind === 'kiosk_screen') return 'kiosks';\n return 'selection';\n });\n },\n [\n activeLevelId,\n section,\n workingDraft.anchors,\n workingDraft.connectors,\n workingDraft.levels,\n workingDraft.shapes,\n ],\n );\n\n const handleToolChange = (next: EditorTool) => {\n const requested =\n section === 'wayfinding' && !isWayfindingEditorTool(next)\n ? 'select'\n : next;\n const resolved = nextEditorTool(tool, requested);\n setTool(resolved);\n if (!showsWayfinding(resolved, section === 'wayfinding')) setSelectedAnchorIds([]);\n };\n\n const handleRenameShape = (key: string) => {\n if (section === 'wayfinding' || !selectedShape || !canEdit) return;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n selectedShape.levelId,\n key,\n )\n ) {\n return;\n }\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key,\n kind: selectedShape.kind,\n },\n });\n };\n\n const handleChangeLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n if (levelId === selectedShape.levelId) return null;\n if (\n shapeKeyTakenOnLevel(\n workingDraft.shapes,\n selectedShape.id,\n levelId,\n selectedShape.key,\n )\n ) {\n return 'That ID is already used on this floor.';\n }\n const ops: BatchOp[] = [\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n },\n },\n ];\n for (const anchor of workingDraft.anchors) {\n if (anchor.shapeId !== selectedShape.id || anchor.levelId === levelId) {\n continue;\n }\n ops.push({\n op: 'upsert_anchor',\n anchor: {\n id: anchor.id,\n levelId,\n shapeId: anchor.shapeId,\n kind: anchor.kind,\n x: anchor.x,\n y: anchor.y,\n connectorId: anchor.connectorId,\n },\n });\n }\n queueOpBatch(ops);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleCopyToLevel = (levelId: number): string | null => {\n if (!selectedShape || !canEdit) return null;\n const copied = copyShapeToLevelOps({\n shape: selectedShape,\n assignment: selectedAssignment,\n targetLevelId: levelId,\n shapes: workingDraft.shapes,\n allocId: () => nextTempId.current--,\n });\n if (!copied) return 'Pick a different floor.';\n queueOpBatch(copied.ops);\n setSelectedShapeIds([copied.shapeId]);\n setActiveLevelId(levelId);\n return null;\n };\n\n const handleDeleteShape = () => {\n if (section === 'wayfinding' || !selectedShape || !canEdit) return;\n queueOp({ op: 'delete_shape', shapeId: selectedShape.id });\n setSelectedShapeIds([]);\n };\n\n const handleUpdateShapeGeometry = (\n shapeId: number,\n geometry: ShapeGeometry,\n opts?: { live?: boolean },\n ) => {\n if (section === 'wayfinding' || !canDrawOnCanvas) return;\n const shape = workingDraft.shapes.find((s) => s.id === shapeId);\n if (!shape) return;\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry,\n bbox: geometryBBox(geometry),\n geometryLocked: true,\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n };\n\n const handleUpdateLabel = (label: ShapeLabel, opts?: { live?: boolean }) => {\n if (!selectedShape || !canEdit) return;\n if (isEntranceIcon(selectedShape)) {\n const nextLabel =\n canonicalizeEntranceLabel({\n ...selectedShape,\n label,\n }) ?? label;\n const size = nextLabel.size ?? selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE;\n const sameLabel =\n size === (selectedShape.label.size ?? DEFAULT_ENTRANCE_SIZE) &&\n (nextLabel.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (nextLabel.color ?? '') === (selectedShape.label.color ?? '') &&\n (nextLabel.imageKey ?? '') === (selectedShape.label.imageKey ?? '');\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForEntranceIcon(selectedShape.geometry, size);\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n origin: selectedShape.origin,\n sourceSvgId: selectedShape.sourceSvgId,\n label: nextLabel,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const size = label.size ?? selectedShape.label.size ?? DEFAULT_LABEL_SIZE;\n const sameLabel =\n (label.text ?? '') === (selectedShape.label.text ?? '') &&\n size === (selectedShape.label.size ?? DEFAULT_LABEL_SIZE) &&\n (label.rotate ?? 0) === (selectedShape.label.rotate ?? 0) &&\n (label.color ?? '') === (selectedShape.label.color ?? '') &&\n (label.align ?? DEFAULT_LABEL_ALIGN) ===\n (selectedShape.label.align ?? DEFAULT_LABEL_ALIGN);\n if (sameLabel) {\n if (!opts?.live) endHistoryGesture();\n return;\n }\n const geometry = geometryForLabelText(\n selectedShape.geometry,\n label.text ?? selectedShape.label.text ?? '',\n size,\n );\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n label,\n geometry,\n bbox: geometryBBox(geometry),\n },\n },\n opts?.live ? 'gesture' : 'step',\n );\n if (!opts?.live) endHistoryGesture();\n };\n\n const handleChangeKind = (kind: ShapeKind) => {\n if (!selectedShape || !canEdit) return;\n queueOp({\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind,\n },\n });\n if (kind === 'custom') {\n queueOp({\n op: 'upsert_assignment',\n assignment: emptyShapeAssignment(selectedShape.id, 'custom'),\n });\n } else if (selectedShape.kind === 'custom') {\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\n }\n };\n\n const handleSaveAssignment = (assignment: CmShapeAssignment) => {\n if (!selectedShape || !canEdit) return;\n const retailer = retailers.find((item) => item.id === assignment.retailerId);\n const visuals = assignmentVisualPatch(selectedShape, assignment, retailer);\n queueOp({ op: 'upsert_assignment', assignment });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n },\n 'none',\n );\n };\n\n const handleClearAssignment = () => {\n if (!selectedShape || !canEdit) return;\n queueOp({ op: 'delete_assignment', shapeId: selectedShape.id });\n queueOp(\n {\n op: 'upsert_shape',\n shape: {\n id: selectedShape.id,\n levelId: selectedShape.levelId,\n key: selectedShape.key,\n kind: selectedShape.kind,\n style: { ...selectedShape.style, fill: undefined },\n label: {\n ...selectedShape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n },\n 'none',\n );\n };\n\n const handleLinkCatalogKiosk = (kioskId: number, shapeId: number | null) => {\n if (!canEdit) return;\n const kiosk = kiosks.find((item) => item.id === kioskId);\n const previousShapeId = shapeIdForCatalogKiosk(\n kioskId,\n workingDraft.assignments,\n );\n const ops: BatchOp[] = [];\n const clearShape = (id: number) => {\n const shape = workingDraft.shapes.find((row) => row.id === id);\n if (!shape) return;\n ops.push({ op: 'delete_assignment', shapeId: id });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: { ...shape.style, fill: undefined },\n label: {\n ...shape.label,\n text: undefined,\n imageKey: undefined,\n size: undefined,\n rotate: undefined,\n offsetX: undefined,\n offsetY: undefined,\n color: undefined,\n },\n },\n });\n };\n if (previousShapeId != null && previousShapeId !== shapeId) {\n clearShape(previousShapeId);\n }\n if (shapeId == null) {\n if (ops.length) queueOpBatch(ops);\n return;\n }\n const shape = workingDraft.shapes.find((row) => row.id === shapeId);\n if (!shape || !isKioskScreenKind(shape.kind)) return;\n const existing = workingDraft.assignments.find((row) => row.shapeId === shapeId);\n const base = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(shape.id, shape.kind);\n const assignment = parseShapeAssignment(\n {\n ...base,\n targetType: 'kiosk',\n kioskId,\n customLabel: kiosk?.name?.trim() || base.customLabel,\n retailerId: null,\n amenityId: null,\n layerType: 'kiosk',\n },\n shape.kind,\n );\n const visuals = assignmentVisualPatch(shape, assignment);\n ops.push({ op: 'upsert_assignment', assignment });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n });\n queueOpBatch(ops);\n };\n\n const handleBulkAssign = (patch: BulkAssignPatch) => {\n if (!canEdit || selectedShapeIds.length < 2) return;\n const ops: BatchOp[] = [];\n for (const id of selectedShapeIds) {\n const shape = workingDraft.shapes.find((item) => item.id === id);\n if (!shape || !isAssignableKind(shape.kind)) continue;\n const existing = workingDraft.assignments.find((row) => row.shapeId === id);\n const current = existing\n ? parseShapeAssignment(existing, shape.kind)\n : emptyShapeAssignment(id, shape.kind);\n const patched = applyBulkAssignPatch(current, patch);\n const retailer = retailers.find((item) => item.id === patched.retailerId);\n const visuals = assignmentVisualPatch(shape, patched, retailer);\n ops.push({ op: 'upsert_assignment', assignment: patched });\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n style: visuals.style,\n label: visuals.label,\n },\n });\n }\n if (ops.length) queueOpBatch(ops);\n };\n\n const queueOpBatch = (ops: BatchOp[]) => {\n ops.forEach((op, index) => queueOp(op, index === 0 ? 'step' : 'none'));\n };\n\n const selectedConnectorKind = selectedShape\n ? resolvedConnectorKind(selectedShape, workingDraft.anchors, workingDraft.connectors)\n : null;\n const connectorRailKind: VerticalRailKind | null =\n selectedConnectorKind === 'escalator' || selectedConnectorKind === 'elevator'\n ? selectedConnectorKind\n : null;\n\n const assignPanel = (\n <>\n <Inspector\n shape={selectedShape}\n assignment={selectedAssignment}\n amenities={workingDraft.amenities}\n retailers={retailers}\n kiosks={kiosks}\n levelShapeKeys={levelShapes\n .filter((s) => !selectedShapeIds.includes(s.id))\n .map((s) => s.key)}\n canEdit={canEdit}\n showAssignment={section !== 'edit-map'}\n emptyHint={\n section === 'stores' ||\n section === 'amenities' ||\n section === 'kiosks' ||\n section === 'custom' ||\n section === 'unassigned' ||\n section === 'escalators' ||\n section === 'elevators'\n ? ''\n : undefined\n }\n selectedShapes={workingDraft.shapes.filter((s) =>\n selectedShapeIds.includes(s.id),\n )}\n selectedAssignments={workingDraft.assignments.filter((row) =>\n selectedShapeIds.includes(row.shapeId),\n )}\n onRename={handleRenameShape}\n onChangeKind={handleChangeKind}\n onChangeLevel={section === 'edit-map' ? handleChangeLevel : undefined}\n onCopyToLevel={section === 'edit-map' ? handleCopyToLevel : undefined}\n levels={editorFloorControlLevels('edit-map', workingDraft.levels)}\n onDelete={handleDeleteShape}\n onClearAssignment={handleClearAssignment}\n onUpdateLabel={handleUpdateLabel}\n onSaveAssignment={handleSaveAssignment}\n onBulkAssign={handleBulkAssign}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.STORE_TEXT_COLOR}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n kioskIconColor={theme.KIOSK_ICON_COLOR}\n />\n {section !== 'edit-map' && selectedShape && connectorRailKind ? (\n <ConnectorAssign\n shape={selectedShape}\n railKind={connectorRailKind}\n canEdit={canEdit}\n assignment={selectedAssignment}\n storeDefaultColor={theme.STORE_DEFAULT_COLOR}\n storeTextColor={theme.CONNECTOR_ICON_COLOR}\n ctx={{\n mapId: workingDraft.mapId,\n levels: workingDraft.levels,\n shapes: workingDraft.shapes,\n anchors: workingDraft.anchors,\n edges: workingDraft.edges,\n connectors: workingDraft.connectors,\n allocId: () => nextTempId.current--,\n }}\n onApplyOps={queueOpBatch}\n onSaveAssignment={handleSaveAssignment}\n />\n ) : null}\n </>\n );\n\n const selectedCatalogKiosk =\n selectedCatalogKioskId != null\n ? kiosks.find((item) => item.id === selectedCatalogKioskId) ?? null\n : null;\n const catalogKioskPanel = selectedCatalogKiosk ? (\n <CatalogKioskForm\n kiosk={selectedCatalogKiosk}\n shapeOptions={catalogKioskShapeOptions(workingDraft.shapes)}\n assignedShapeId={shapeIdForCatalogKiosk(\n selectedCatalogKiosk.id,\n workingDraft.assignments,\n )}\n canEdit={canEdit}\n onAssign={(shapeId) =>\n handleLinkCatalogKiosk(selectedCatalogKiosk.id, shapeId)\n }\n />\n ) : null;\n\n const handleCameraChange = useCallback(\n (view: CameraViewSnapshot) => {\n if (section !== 'map-responsiveness' || activeLevelId == null) return;\n const fields = poseToResponsiveFields({\n zoom: view.zoom,\n position: view.position,\n target: view.target,\n });\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]: {\n levelId: activeLevelId,\n device: responsiveDevice,\n camera: fields.camera,\n controls: fields.controls,\n },\n }));\n },\n [activeLevelId, responsiveDevice, section],\n );\n\n const handleCameraReset = useCallback(() => {\n if (activeLevelId == null) return;\n setPendingResponsive((prev) => ({\n ...prev,\n [responsiveSlotKey(activeLevelId, responsiveDevice)]:\n emptyResponsiveOverrideInput(activeLevelId, responsiveDevice),\n }));\n }, [activeLevelId, responsiveDevice]);\n\n const toolGroup = section === 'wayfinding' ? 'route' : section === 'edit-map' ? 'map' : undefined;\n\n return (\n <div className={`eyeon-map-editor eyeon-map-editor--${host} ${className ?? ''}`}>\n {showMapOptions ? (\n <LeftRail\n section={section}\n onSectionChange={handleSectionChange}\n draft={workingDraft}\n activeLevelId={activeLevelId}\n selectedShapeId={selectedShapeId}\n selectedShapeIds={selectedShapeIds}\n onSelectShape={handleSelectShape}\n onHoverShape={setHoveredShapeId}\n onListFocus={() => setListFocusNonce((n) => n + 1)}\n retailers={retailers}\n kiosks={kiosks}\n selectedCatalogKioskId={selectedCatalogKioskId}\n onSelectCatalogKiosk={setSelectedCatalogKioskId}\n canFloors={canFloors}\n canSettings={canSettings}\n canResponsiveness={canResponsiveness}\n showSurroundings={showSurroundings}\n surroundingsPanel={\n <SurroundingsPanel\n apiKey={googleMapsApiKey ?? ''}\n view={basemapView}\n mallOpacity={mallOpacity}\n satellite={basemapSatellite}\n onMallOpacity={setMallOpacity}\n onSatellite={setBasemapSatellite}\n onHeading={(heading) => {\n const next = normalizeHeading(heading);\n basemapRef.current?.setHeading(next);\n setBasemapView((current) => ({ ...current, heading: next }));\n }}\n onZoom={(zoom) => {\n basemapRef.current?.setZoom(zoom);\n setBasemapView((current) => ({ ...current, zoom }));\n }}\n onPanTo={(lat, lng) => {\n basemapRef.current?.panTo(lat, lng, 17);\n setBasemapView((current) => ({ ...current, lat, lng, zoom: 17 }));\n }}\n />\n }\n onImportSvg={onImportSvg}\n onCreateLevel={\n onCreateLevel\n ? async (input) => {\n markReturnToFloorsList(draft.mapId);\n try {\n const id = await onCreateLevel(input);\n setSection('floors');\n clearReturnToFloorsList(draft.mapId);\n return id;\n } catch (error) {\n clearReturnToFloorsList(draft.mapId);\n throw error;\n }\n }\n : undefined\n }\n onUpdateLevel={onUpdateLevel}\n onDeleteLevel={onDeleteLevel}\n onReorderLevels={onReorderLevels}\n onAutoroute={onAutoroute}\n theme={theme}\n onThemeChange={(partial) => {\n if (!canSettings) return;\n queueOp(\n { op: 'update_theme', theme: { ...workingDraft.theme, ...partial } },\n 'none',\n );\n }}\n footer={\n <>\n {host === 'PORTAL' ? (\n <ClassicMapFooter\n webApiURI={webApiURI}\n centerId={draft.centerId}\n unsaved={warnOnLeave}\n onMapVersionChanged={onMapVersionChanged}\n />\n ) : null}\n {sidebarFooter ? (\n <div className=\"eyeon-map-rail__footer\">{sidebarFooter}</div>\n ) : null}\n </>\n }\n catalogKioskPanel={catalogKioskPanel}\n assignPanel={assignPanel}\n editMapPanel={\n <>\n {toolHint(tool, 'map') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'map')}</p>\n ) : null}\n {assignPanel}\n </>\n }\n wayfindingPanel={\n <>\n {outdoorViewOnly ? (\n <p className=\"eyeon-map-rail__hint\">\n Outdoor is view-only in Wayfinding. Switch to a floor to edit routes.\n </p>\n ) : toolHint(tool, 'route') ? (\n <p className=\"eyeon-map-rail__hint\">{toolHint(tool, 'route')}</p>\n ) : null}\n <div className=\"eyeon-map-rail__tool-extras\">\n <div className=\"eyeon-map-rail__stat\">\n {levelAnchors.length} path points · {levelEdges.length} connections\n </div>\n {canFloors && activeLevelId != null && !outdoorViewOnly && (\n <div className=\"eyeon-map-rail__actions\">\n <button type=\"button\" onClick={() => onAutoroute?.(activeLevelId)}>\n Suggest walking paths\n </button>\n </div>\n )}\n </div>\n </>\n }\n mapResponsivenessPanel={\n <p className=\"eyeon-map-rail__hint\">\n Pan and zoom the map for each floor and device. Reset fits the\n whole floor so you can start from the default view. Save Changes\n stores that starting view for Admin Portal, website, and kiosk.\n </p>\n }\n />\n ) : null}\n\n <div className=\"eyeon-map-editor__center\">\n <div className=\"eyeon-map-editor__toolbar\">\n <div className=\"eyeon-map-editor__tools\">\n {isResponsiveness ? (\n <div className=\"eyeon-map-editor__device-tabs\" role=\"tablist\" aria-label=\"Device\">\n {RESPONSIVE_DEVICE_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={responsiveDevice === tab.id}\n className={\n responsiveDevice === tab.id\n ? 'eyeon-map-editor__device-tab is-active'\n : 'eyeon-map-editor__device-tab'\n }\n onClick={() => setResponsiveDevice(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n ) : isEditMap ? (\n <EditorToolButtons\n tool={tool}\n onToolChange={handleToolChange}\n canEdit={canDrawOnCanvas}\n group={toolGroup}\n />\n ) : null}\n </div>\n <div className=\"eyeon-map-editor__toolbar-side\">\n {isEditMap ? (\n <GridPrefsControl\n gridOpacity={gridOpacity}\n onChange={handleGridPrefsChange}\n />\n ) : null}\n <div className=\"eyeon-map-editor__actions\">\n {isEditMap ? (\n <EditorHistoryButtons\n canUndo={history.past.length > 0 || routeDraftActive}\n canRedo={history.future.length > 0}\n disabled={!canEdit || saving}\n onUndo={undo}\n onRedo={redo}\n />\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-editor__discard\"\n aria-label=\"Discard Changes\"\n onClick={() => void handleDiscardChanges()}\n disabled={!canPersist}\n >\n Discard Changes\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-editor__save\"\n aria-label={dirty ? 'Save Changes (unsaved edits)' : 'Save Changes'}\n onClick={() => void handleSaveChanges()}\n disabled={!canPersist}\n >\n {dirty ? (\n <span className=\"eyeon-map-editor__save-badge\" aria-hidden=\"true\" />\n ) : null}\n {saving ? 'Saving…' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n\n {isSurroundings ? (\n <div className=\"eyeon-map-surroundings\">\n {googleMapsApiKey ? (\n <GoogleBasemap\n key={savedGeoreferenceKey}\n ref={basemapRef}\n apiKey={googleMapsApiKey}\n satellite={basemapSatellite}\n initialView={basemapView}\n onViewChange={(view) => {\n setBasemapView((current) => ({\n ...view,\n heading: keepHeading(current.heading, view.heading),\n zoom: keepZoom(current.zoom, view.zoom),\n }));\n }}\n />\n ) : (\n <div className=\"eyeon-map-surroundings__error\">\n Google Maps key is missing. Restart Storybook after adding it.\n </div>\n )}\n <div\n className=\"eyeon-map-surroundings__mall\"\n style={{ opacity: mallOpacity }}\n >\n <PreviewOverlay\n key={previewEpoch}\n document={compiledPreview}\n host=\"PORTAL_ASSIGN\"\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n themeOverrides={{ MAP_BACKGROUND_COLOR: 'transparent' }}\n transparentBackground\n onCameraSample={(view) => {\n const prev = mallCameraRef.current;\n mallCameraRef.current = view;\n if (!prev || !canEdit) return;\n if (\n Math.abs(prev.zoom - view.zoom) < 0.001 &&\n Math.abs(prev.target[0] - view.target[0]) < 0.05 &&\n Math.abs(prev.target[1] - view.target[1]) < 0.05\n ) {\n return;\n }\n const current = georeferenceWithAnchor(basemapViewRef.current);\n if (!current) return;\n const saved = parseMapGeoreference(draftGeorefRef.current);\n if (!saved && isDefaultMapGeoreference(current)) return;\n if (saved && sameMapGeoreference(saved, current)) return;\n queueOp({ op: 'update_georeference', georeference: current }, 'none');\n }}\n />\n </div>\n </div>\n ) : centerSurface === 'viewer' ? (\n <PreviewOverlay\n key={previewEpoch}\n document={compiledPreview}\n host={isResponsiveness ? 'WEBSITE' : 'PORTAL_ASSIGN'}\n selectedShapeId={isResponsiveness ? null : selectedShapeId}\n selectedShapeIds={isResponsiveness ? [] : selectedShapeIds}\n hoveredShapeId={isResponsiveness ? null : hoveredShapeId}\n focusNonce={isResponsiveness ? undefined : listFocusNonce}\n onSelectShape={isResponsiveness ? undefined : handleSelectShape}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n routeOnSelect={false}\n imageProxyUrl={imageProxyUrl}\n device={isResponsiveness ? responsiveDevice : undefined}\n captureCamera={isResponsiveness}\n onCameraChange={isResponsiveness ? handleCameraChange : undefined}\n onCameraReset={isResponsiveness ? handleCameraReset : undefined}\n googleMapsApiKey={googleMapsApiKey}\n />\n ) : (\n <>\n <div className=\"eyeon-map-editor__canvas-wrap\">\n <EditorCanvas\n ref={canvasRef}\n level={activeLevel}\n shapes={levelShapes.filter((s) => !s.orphanedAt)}\n underlayShapes={outdoorShapes.filter((s) => !s.orphanedAt)}\n openingUnderlayShapes={openingUnderlayShapes}\n anchors={levelAnchors}\n edges={levelEdges}\n assignments={workingDraft.assignments}\n retailers={retailers}\n amenities={workingDraft.amenities}\n theme={theme}\n tool={tool}\n selectedShapeId={selectedShapeId}\n selectedAnchorIds={selectedAnchorIds}\n baseSvgUrl={workingDraft.baseSvgUrl ?? null}\n baseViewbox={outdoorLevel?.sourceViewbox ?? null}\n outdoorSvgUrl={\n outdoorLevel?.sourceSvgUrl ?? workingDraft.baseSvgUrl ?? null\n }\n imageProxyUrl={imageProxyUrl}\n emptyMessage={\n hasBuildingFloors(workingDraft.levels) || outdoorLevel\n ? undefined\n : MAP_NO_FLOORS_MESSAGE\n }\n interactiveOnly={activeLevel?.kind === 'outdoor'}\n showGrid\n gridOpacity={gridOpacity}\n routeMode={section === 'wayfinding'}\n readOnly={outdoorViewOnly}\n onUndo={undo}\n onRouteDraftActiveChange={setRouteDraftActive}\n onToolChange={handleToolChange}\n onSelectShape={handleSelectShape}\n onSelectAnchors={setSelectedAnchorIds}\n onCreateRouteSegment={(start, end) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id1 = nextTempId.current--;\n const id2 = nextTempId.current--;\n queueOpBatch([\n {\n op: 'upsert_anchor',\n anchor: {\n id: id1,\n levelId: activeLevel.id,\n x: start.x,\n y: start.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_anchor',\n anchor: {\n id: id2,\n levelId: activeLevel.id,\n x: end.x,\n y: end.y,\n kind: 'junction',\n },\n },\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: id1,\n toAnchorId: id2,\n kind: 'walk',\n },\n },\n ]);\n return id2;\n }}\n onCreateRoutePoint={(point, prevAnchorId) => {\n if (!activeLevel || !canDrawOnCanvas) return null;\n const id = queueOp({\n op: 'upsert_anchor',\n anchor: {\n levelId: activeLevel.id,\n x: point.x,\n y: point.y,\n kind: 'junction',\n },\n });\n if (\n id != null &&\n prevAnchorId != null &&\n !walkEdgeExists(levelEdges, prevAnchorId, id)\n ) {\n queueOp(\n {\n op: 'upsert_edge',\n edge: {\n mapId: workingDraft.mapId,\n fromAnchorId: prevAnchorId,\n toAnchorId: id,\n kind: 'walk',\n },\n },\n 'none',\n );\n }\n return id;\n }}\n onLinkRouteAnchors={(fromAnchorId, toAnchorId) => {\n if (!canDrawOnCanvas) return;\n const op = linkRouteAnchorsOp(\n workingDraft.mapId,\n fromAnchorId,\n toAnchorId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (op) queueOp(op);\n }}\n onInsertRouteJunction={(edgeId, point) => {\n if (!canDrawOnCanvas || !activeLevel) return null;\n const edge = levelEdges.find((item) => item.id === edgeId);\n if (!edge) return null;\n const { ops, junctionId } = insertJunctionOnWalkEdgeOps({\n levelId: activeLevel.id,\n mapId: workingDraft.mapId,\n edge,\n point,\n anchors: levelAnchors,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n return junctionId;\n }}\n onDeleteRouteAnchor={(anchorId) => {\n if (!canDrawOnCanvas) return;\n const ops = deleteRouteAnchorOps(\n anchorId,\n workingDraft.mapId,\n levelEdges,\n () => nextTempId.current--,\n );\n if (ops.length) queueOpBatch(ops);\n const removed = new Set(\n ops\n .filter((op) => op.op === 'delete_anchor')\n .map((op) => op.anchorId),\n );\n if (removed.size) {\n setSelectedAnchorIds((ids) =>\n ids.filter((id) => !removed.has(id)),\n );\n }\n }}\n onDeleteRouteEdge={(edgeId) => {\n if (!canDrawOnCanvas) return;\n const ops = deleteRouteEdgeOps(edgeId, levelEdges);\n if (ops.length) queueOpBatch(ops);\n const removed = new Set(\n ops\n .filter((op) => op.op === 'delete_anchor')\n .map((op) => op.anchorId),\n );\n if (removed.size) {\n setSelectedAnchorIds((ids) =>\n ids.filter((id) => !removed.has(id)),\n );\n }\n }}\n onEnsureShapeAnchor={(shapeId, point) => {\n if (!canDrawOnCanvas) return null;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return null;\n const { ops, anchorId } = ensureShapeRouteAnchorOps({\n shape: target,\n anchors: levelAnchors,\n allocId: () => nextTempId.current--,\n point,\n });\n if (ops.length) queueOpBatch(ops);\n setSelectedAnchorIds([anchorId]);\n return anchorId;\n }}\n onConnectShapeToRoute={(shapeId, from, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const target = levelShapes.find((item) => item.id === shapeId);\n if (!target) return;\n const ops = connectShapeToRouteOps({\n shape: target,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n from,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onConnectRouteAnchorToRoute={(anchorId, drop, maxDist) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((item) => item.id === anchorId);\n if (!anchor) return;\n const ops = connectRouteAnchorToRouteOps({\n anchor,\n anchors: levelAnchors,\n edges: levelEdges,\n mapId: workingDraft.mapId,\n drop,\n maxDist,\n allocId: () => nextTempId.current--,\n });\n if (ops.length) queueOpBatch(ops);\n }}\n onHistoryGestureEnd={endHistoryGesture}\n onMoveAnchor={(anchorId, x, y) => {\n if (!canDrawOnCanvas) return;\n const anchor = levelAnchors.find((a) => a.id === anchorId);\n if (!anchor) return;\n const delta = { x: x - anchor.x, y: y - anchor.y };\n queueOp(\n {\n op: 'upsert_anchor',\n anchor: { ...anchor, x, y },\n },\n 'gesture',\n );\n if (delta.x === 0 && delta.y === 0) return;\n for (const edge of workingDraft.edges) {\n const curve = shiftRouteCurveForAnchor(edge, anchorId, delta);\n if (!curve) continue;\n queueOp(\n { op: 'upsert_edge', edge: { ...edge, curve } },\n 'none',\n );\n }\n }}\n onUpdateRouteCurve={(\n edgeId: number,\n curve: RouteCurve | null,\n opts?: { live?: boolean },\n ) => {\n if (!canDrawOnCanvas) return;\n const edge = workingDraft.edges.find((item) => item.id === edgeId);\n if (!edge) return;\n queueOp(\n { op: 'upsert_edge', edge: { ...edge, curve } },\n opts?.live ? 'gesture' : 'step',\n );\n }}\n onCreateShape={(kind, geometry, extras) => {\n if (\n section === 'wayfinding' ||\n !activeLevel ||\n !canDrawOnCanvas\n ) {\n return;\n }\n const key = allocShapeKey(\n kind,\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n const id = queueOp({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind,\n geometry,\n bbox: geometryBBox(geometry),\n origin: 'manual',\n sourceSvgId: null,\n geometryLocked: true,\n label:\n kind === 'entrance'\n ? canonicalizeEntranceLabel({\n kind,\n origin: 'manual',\n sourceSvgId: null,\n label: extras?.label,\n }) ?? extras?.label\n : extras?.label,\n },\n });\n if (id != null) handleSelectShape(id);\n }}\n onUpdateShapeGeometry={handleUpdateShapeGeometry}\n onBatchShapeEdits={(edits) => {\n if (\n section === 'wayfinding' ||\n !activeLevel ||\n !canDrawOnCanvas ||\n edits.length === 0\n ) {\n return;\n }\n const ops: BatchOp[] = [];\n let deletedSelected = false;\n const takenKeys = new Set(\n liveShapeKeysOnLevel(workingDraft.shapes, activeLevel.id),\n );\n edits.forEach((edit) => {\n if (edit.action === 'update') {\n const shape = workingDraft.shapes.find(\n (s) => s.id === edit.shapeId,\n );\n if (!shape) return;\n ops.push({\n op: 'upsert_shape',\n shape: {\n id: shape.id,\n levelId: shape.levelId,\n key: shape.key,\n kind: shape.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.action === 'create') {\n const style: ShapeStyle | undefined = edit.style;\n const key = allocShapeKey(edit.kind, takenKeys);\n takenKeys.add(key);\n ops.push({\n op: 'upsert_shape',\n shape: {\n levelId: activeLevel.id,\n key,\n kind: edit.kind,\n geometry: edit.geometry,\n bbox: geometryBBox(edit.geometry),\n style,\n origin: 'manual',\n geometryLocked: true,\n },\n });\n return;\n }\n if (edit.shapeId === selectedShapeId) deletedSelected = true;\n ops.push({ op: 'delete_shape', shapeId: edit.shapeId });\n });\n if (ops.length) queueOpBatch(ops);\n if (deletedSelected) {\n const survivor = edits.find((e) => e.action === 'update');\n handleSelectShape(\n survivor && survivor.action === 'update'\n ? survivor.shapeId\n : null,\n );\n }\n }}\n />\n <MapControls\n levels={workingDraft.levels}\n floorOptions={editorFloorControlLevels(section, workingDraft.levels)}\n alwaysShowFloors\n activeLevelId={activeLevelId}\n onActiveLevelChange={handleCanvasLevelChange}\n onZoomIn={() => canvasRef.current?.zoomIn()}\n onZoomOut={() => canvasRef.current?.zoomOut()}\n onReset={() => canvasRef.current?.resetView()}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nexport default MapEditor;\n","import React, { useMemo, useState } from 'react';\nimport type { ImportDiff, ImportDiffItem } from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\n\nexport interface ImportReviewProps {\n diff: ImportDiff;\n viewBoxChanged?: boolean;\n blockedMessage?: string | null;\n busy?: boolean;\n onApply: (payload: {\n acceptAll: boolean;\n remap: Array<{ fromShapeId: number; toSourceSvgId: string }>;\n }) => Promise<void> | void;\n onCancel?: () => void;\n}\n\nfunction bucketLabel(change: ImportDiffItem['change']): string {\n switch (change) {\n case 'added':\n return 'Added';\n case 'removed':\n return 'Orphaned';\n case 'moved':\n return 'Moved';\n case 'kind_changed':\n return 'Kind changed';\n default:\n return 'Unchanged';\n }\n}\n\n/**\n * Outdoor (or floor) re-upload review — shows added / orphaned / locked / drifted\n * buckets before apply. Host wires POST .../import + .../import/apply.\n */\nexport function ImportReviewPanel({\n diff,\n viewBoxChanged = false,\n blockedMessage,\n busy = false,\n onApply,\n onCancel,\n}: ImportReviewProps) {\n const [remap, setRemap] = useState<Record<number, string>>({});\n\n const buckets = useMemo(() => {\n const added = diff.items.filter((i) => i.change === 'added');\n const orphaned = diff.items.filter((i) => i.change === 'removed');\n const locked = diff.items.filter(\n (i) => i.geometryLocked && i.change !== 'removed' && i.change !== 'added',\n );\n const moved = diff.items.filter((i) => i.change === 'moved');\n return { added, orphaned, locked, moved };\n }, [diff.items]);\n\n if (viewBoxChanged) {\n return (\n <div className=\"eyeon-map-import-review\">\n <div className=\"eyeon-map-floors__error\">\n {blockedMessage ??\n 'SVG viewBox changed — restore the original artboard before re-uploading.'}\n </div>\n {onCancel ? (\n <button type=\"button\" onClick={onCancel} disabled={busy}>\n Close\n </button>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"eyeon-map-import-review\">\n <p className=\"eyeon-map-rail__hint\">\n Review changes before applying. Orphaned shapes keep their retailer\n assignments — remap them onto a newly added id if the designer renamed\n a store.\n </p>\n\n {buckets.added.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Added ({buckets.added.length})\n </div>\n {buckets.added.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{item.newKind}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.orphaned.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Orphaned ({buckets.orphaned.length})\n </div>\n {buckets.orphaned.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row eyeon-map-import-review__remap\">\n <span>{item.sourceSvgId}</span>\n <label className=\"eyeon-map-rail__field\">\n Remap to\n <ModernSelect\n ariaLabel={`Remap ${item.sourceSvgId}`}\n value={remap[item.existingShapeId!] ?? ''}\n disabled={busy || buckets.added.length === 0}\n placeholder=\"Keep orphaned\"\n searchable\n options={[\n { value: '', label: 'Keep orphaned' },\n ...buckets.added.map((a) => ({\n value: a.sourceSvgId,\n label: a.sourceSvgId,\n })),\n ]}\n onChange={(next) =>\n setRemap((prev) => ({\n ...prev,\n [item.existingShapeId!]: next,\n }))\n }\n />\n </label>\n </div>\n ))}\n </section>\n )}\n\n {buckets.locked.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Geometry locked ({buckets.locked.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Portal edits win — kind/style may update, geometry will not.\n </p>\n {buckets.locked.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n <span className=\"eyeon-map-rail__muted\">{bucketLabel(item.change)}</span>\n </div>\n ))}\n </section>\n )}\n\n {buckets.moved.length > 0 && (\n <section>\n <div className=\"eyeon-map-inspector__heading\">\n Moved ({buckets.moved.length})\n </div>\n <p className=\"eyeon-map-rail__hint\">\n Centroid drifted — check nearby walking paths after apply.\n </p>\n {buckets.moved.map((item) => (\n <div key={item.sourceSvgId} className=\"eyeon-map-rail__row\">\n <span>{item.sourceSvgId}</span>\n </div>\n ))}\n </section>\n )}\n\n {diff.items.length === 0 && (\n <p className=\"eyeon-map-rail__hint\">No shape changes detected.</p>\n )}\n\n <div className=\"eyeon-map-rail__actions\">\n {onCancel ? (\n <button type=\"button\" disabled={busy} onClick={onCancel}>\n Cancel\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"eyeon-map-floors__primary\"\n disabled={busy}\n onClick={() =>\n void onApply({\n acceptAll: true,\n remap: Object.entries(remap)\n .filter(([, to]) => Boolean(to))\n .map(([from, toSourceSvgId]) => ({\n fromShapeId: Number(from),\n toSourceSvgId,\n })),\n })\n }\n >\n {busy ? 'Applying…' : 'Apply import'}\n </button>\n </div>\n </div>\n );\n}\n"],"names":["isEditorSection","section","portalCenterSurface","host","wayfindingSelectableLevels","levels","floorSwitcherLevels","editMapSelectableLevels","outdoor","level","defaultEditorFloorId","_a","levelIdOnEnterWayfinding","levelIdOnEnterEditMap","levelIdOnEnterDefaultMap","defaultViewerLevelId","editorFloorControlLevels","wayfindingOutdoorReadOnly","emptyEditorHistory","cloneHistorySnapshot","snapshot","op","pushEditorHistory","history","current","undoEditorHistory","restored","redoEditorHistory","isEditableTypingTarget","target","el","tag","isEditorUndoHotkey","isEditorRedoHotkey","key","EDITOR_TOOLS","canPlaceNewRoute","tool","isWayfindingEditorTool","canDeleteWayfindingItem","canChainRoute","nextRouteChainAnchor","endAnchorId","ICON_PROPS","SelectIcon","jsx","PanIcon","DrawRectIcon","DrawPolygonIcon","DrawCircleIcon","CurveIcon","jsxs","SplitJoinIcon","DrawTextIcon","DrawEntranceIcon","DrawRouteIcon","CreateRouteIcon","CreateRouteMultiIcon","UndoIcon","RedoIcon","TOOL_ICONS","canSelectShapes","canEditShapeGeometry","routeMode","isSplitJoinTool","isPolygonDrawTool","popPolygonDraftPoint","points","isEllipseDrawTool","isShapeDrawTool","isStampDrawTool","canJoinOpenEnds","showsShapeAnchors","showsCurveHandles","emptyCanvasDragPans","nextEditorTool","next","toolHint","group","EditorToolButtons","onToolChange","canEdit","mapTools","t","routeTools","routeCurveTools","showMap","showRoute","selectTool","routeToolbar","renderButton","Icon","React","EditorHistoryButtons","canUndo","canRedo","disabled","onUndo","onRedo","EPS","vecEq","a","b","eps","cloneVec","p","addVec","subVec","scaleVec","s","lerpVec","edgeCount","ring","edgeFrom","edgeIndex","edgeTo","edgeToPathD","from","to","edge","fmtCoord","n","r","ringFromPolygon","poly","closed","anchors","edges","quadraticToCubic","p0","q","p2","cubicHandlesForPull","pull","mid","offset","chord","cubicPoint","c1","c2","p3","u","splitCubic","c","d","e","ellipticalArcToCubics","rx","ry","xAxisRotationDeg","largeArc","sweep","p1","arx","ary","phi","cosPhi","sinPhi","dx2","dy2","x1p","y1p","lambda","scale","rxSq","rySq","numerator","denominator","factor","cxp","cyp","cx","cy","ux","uy","vx","vy","theta1","deltaTheta","ellipsePoint","theta","cosT","sinT","ellipseDeriv","dx","dy","out","t0","remaining","step","t1","k","start","end","d0","d1","parsePathToRings","tokens","tokenizePathData","rings","x","y","startX","startY","lastCtrl","i","cmd","started","readNum","flush","expected","pushAnchor","isRel","nx","ny","x1","y1","x2","y2","qx","qy","rot","cubics","cubic","ringToPathD","a0","ringsToGeometry","ds","geometry","buildGeometryFromPaths","ARCH_CORNER_RAD","MIN_ARCH_POINTS","MIN_ARCH_BULGE","MIN_ARCH_BULGE_RATIO","MAX_ARCH_BULGE_RATIO","signedTurn","prev","cur","ax","ay","bx","by","runLooksLikeArch","pts","distance","maxDev","side","proj","projectOntoSegment","fitCubicThroughRun","cubicDeviationFromChord","samples","approximateCubic","point","cubicIsRunaway","dev","flattenRunawayCubics","changed","collapseLineRunsToCubics","idx","incoming","outgoing","isSharp","_b","sharp","outA","outE","walk","emitRun","fromW","toW","linesOnly","_","last","w","geometryToRings","fromPaths","pointOnRingEdge","nearestTOnCubic","bestT","bestPt","bestD","clonePolygons","polygons","polygonsToPathD","polygonsToGeometry","cleaned","commitRings","incomingEdgeIndex","anchorIndex","outgoingEdgeIndex","translateGeometry","delta","translateEdge","ringIndex","fromIdx","toIdx","vertexNeighborPoints","polygonIndex","vertexIndex","count","moveVertex","moveHandle","handle","flattenCubicEdge","bendEdgeToCubic","insertVertex","afterVertexIndex","splitT","split","removeVertex","min","join","hitTestVertex","tolerance","best","vertex","hitTestHandle","hp","hitEdge","preferMidpoint","candidate","dist","near","hitTestEdgeMidpoint","hitTestEdge","SHARED_EDGE_TOL","canSplitJoinKind","kind","sameOpenEnd","cloneEdge","cloneRing","reverseEdge","reverseRing","maybeCloseCoincident","tol","first","listOpenEnds","distToRingEdge","pointOnRingBoundary","edgeLiesOnOtherShape","others","other","open","cutPointsOnLine","gap","len","half","cutPointsOnCubic","dt","t2","local","second","rebuildOpenFromClosedCut","leftEdge","rightEdge","splitOpenRingAtCut","left","right","item","openWholeEdge","cutEdgeOpen","cut","pieces","concatOpenRings","leftEnd","rightStart","weld","closeOpenRing","joinOpenEndpoints","DEFAULT_WELD_TOLERANCE","ra","rb","joined","keep","drop","joinAcrossShapes","shapes","ia","ib","ringsA","ringsB","merged","weldCoincidentOpenEnds","deleteIds","ends","shape","j","pairTol","forkClosedRings","opens","finishEdits","before","working","extraDeletes","welded","deleteSet","extras","kept","forked","edits","beforeById","extra","id","applySplitJoinCut","hit","nextGeo","applySplitJoinJoin","hitOpenEnd","skip","preferOther","bestPrefer","hitSplitJoinEdge","previewCutPoints","nearestSnapPoint","candidates","sameSnapPoint","constrainOrthogonal","origin","cursor","constrainVertexOrthogonal","neighbors","neighbor","options","option","isSpacePanKey","event","ellipseBoundsFromDrag","lockCircle","sx","sy","ellipsePathD","bounds","ellipseGeometry","DEFAULT_LABEL_TEXT","DEFAULT_LABEL_SIZE","LABEL_FONT_FAMILY","MAP_FONT_FAMILY","LABEL_LINE_HEIGHT","MAP_LABEL_LINE_HEIGHT","FALLBACK_CHAR_ADVANCE","isTextLabel","defaultLabelSize","_viewbox","labelTextLines","text","measureCtx","textMeasureContext","measureLabelText","size","lines","ctx","width","line","max","labelBoxCenter","box","textLabelPolygon","height","textLabelGeometry","defaultTextLabel","color","geometryForLabelText","geometryBBox","isStampShape","isEntranceIcon","defaultEntranceLabel","ENTRANCE_ICON_ID","clampEntranceSize","entranceIconPolygon","center","entranceIconGeometry","geometryForEntranceIcon","clientToUser","ctm","clientX","clientY","det","clientRectToViewBox","rect","viewBox","vbW","vbH","originX","originY","pxPerUserFromViewBox","readSvgViewBox","svg","vb","attr","parts","clientToSvgUser","pxPerUserFromSvg","pxPerUserFromCtm","userToWorld","user","pan","zoom","z","EDITOR_MIN_ZOOM","EDITOR_MAX_ZOOM","clampEditorZoom","nextEditorZoomFromWheel","currentZoom","nextZoomFromWheel","screenPxToWorld","px","pxPerUser","editorHandleScale","sizeZoom","liveZoom","panAfterZoom","nextZoom","world","panKeepingWorldAtUser","EDITOR_ZOOM_ANIM_MS","easeOutCubic","lerp","interpolateView","editorShapeFillOpacity","editorShapeFill","theme","assignment","WALKING_PATH_COLOR","published","resolvedShapeFill","isTransparentPadKind","isTransparentColor","staffPadPlaceholderFill","EDITOR_GUIDE_COLOR","isHoverHighlightShape","INTERACTIVE_SHAPE_KINDS","editorMapCursor","args","editorSelectCursor","editorHoverFillOpacity","base","hovered","editorShapeEmphasisColor","fill","emphasized","darkenShapeFill","liveDisplayRetailer","retailer","wayfindingAssignedOverlay","amenities","displayRetailer","label","publishedShapeLabel","assignmentOverlayVisible","fontSize","DEFAULT_ASSIGNMENT_SIZE","imageUrl","assignmentOverlayImageUrl","iconId","assignmentSpecialIconId","assignmentOverlayRenderSize","resolvedAssignmentIconColor","normalizeLabelAlign","wayfindingAssignedOverlays","input","retailerById","assignmentByShapeId","row","overlays","overlay","wayfindingOverlayHref","imageProxyUrl","resolveFetchUrl","getMapSpecialSvg","mapSpecialSvgToDataUrl","AssignedShapeOverlay","rotate","align","href","transform","AssignedOverlayText","lineHeight","blockHeight","labelSvgTextAnchor","index","OutdoorSvgUnderlay","url","suppressIds","svgText","setSvgText","useState","suppressKey","useMemo","useEffect","cancelled","controller","fetchUrl","res","err","paths","blocked","outdoorDecorationFromSvg","isUnderlayHintShape","isUnderlayDrawnShape","underlaySwitchHint","WAYFINDING_SNAP_PX","WAYFINDING_ANCHOR_HIT_PX","showsWayfinding","routeSessionUndoKind","session","beginOrContinueRouteDraft","draft","routeRubberBand","isWayfindingShape","wayfindingLinksShapes","anchorKindForShape","routeAnchorKindForShape","shapeRoutePoint","anchorHasEdge","anchorId","routeComponentAnchorIds","ids","pending","walkEdgeExists","isCurvableRouteEdge","isSnappableRouteEdge","edgeWithCurve","curve","splitWalkEdge","source","junctionId","mapId","allocId","anchorById","routeCurveOf","splitRouteCurve","walkEdge","storeLinkOriginIds","preview","anchor","nearestRouteSnap","excludeIds","maxDist","prefer","bestJunction","bestEdge","projectOntoRouteEdge","fromAnchorId","toAnchorId","ensureShapeRouteAnchorOps","existing","unit","connectShapeToRouteOps","ops","snap","nextEdges","linkKind","connectRouteAnchorToRouteOps","incident","otherId","link","linkRouteAnchorsOp","insertJunctionOnWalkEdgeOps","levelId","deleteRouteEdgeOps","edgeId","planRouteAnchorRemoval","removedEdgeIds","walkNeighbors","heal","removedAnchorIds","seen","anchorsRemovedWithRouteAnchor","deleteRouteAnchorOps","ANCHOR_R_PX","ANCHOR_R_SELECTED_PX","ANCHOR_HIT_PX","ANCHOR_STROKE_PX","SHAPE_ROUTE_ANCHOR_FILL","VERTEX_R_PX","VERTEX_R_SELECTED_PX","VERTEX_HIT_PX","VERTEX_STROKE_PX","HANDLE_R_PX","HANDLE_R_SELECTED_PX","HANDLE_HIT_PX","HANDLE_LINE_PX","HANDLE_LINE_HALO_PX","BEND_R_PX","EDGE_DRAG_PX","SPLIT_JOIN_GAP_PX","SNAP_HIT_PX","rectPolygon","dragSize","screenStrokeStyle","HandleDot","hitR","stroke","strokeWidth","fillOpacity","strokeDasharray","onPointerDown","onPointerEnter","onPointerLeave","onDoubleClick","polygonsToPath","isEditableShape","interactiveOnly","editorCanvasClass","showGrid","editorCanvasStyle","gridOpacity","EditorCanvas","assignments","retailers","selectedShapeId","selectedAnchorIds","baseSvgUrl","baseViewbox","outdoorSvgUrl","levelSvgUrl","underlayShapes","openingUnderlayShapes","readOnly","emptyMessage","onSelectShape","onSelectAnchors","onCreateRoutePoint","onCreateRouteSegment","onLinkRouteAnchors","onInsertRouteJunction","onDeleteRouteAnchor","onDeleteRouteEdge","onConnectShapeToRoute","onConnectRouteAnchorToRoute","onEnsureShapeAnchor","onMoveAnchor","onUpdateRouteCurve","onCreateShape","onUpdateShapeGeometry","onBatchShapeEdits","onHistoryGestureEnd","onRouteDraftActiveChange","ref","ensureMapFont","wayfindingOn","svgRef","useRef","viewGroupRef","canvasRef","setPan","setZoom","viewRef","sizeZoomRef","wheelFrameRef","wheelSettleRef","setPxPerUser","pointersRef","pinchRef","drawing","setDrawing","drawLockCircle","setDrawLockCircle","spaceHeld","setSpaceHeld","spaceHeldRef","axisGuide","setAxisGuide","polygonPoints","setPolygonPoints","dragAnchor","setDragAnchor","dragAnchorPoint","setDragAnchorPoint","routeCurveDrag","setRouteCurveDrag","selectedRouteHandle","setSelectedRouteHandle","lastRouteAnchor","setLastRouteAnchor","routeDraftPoint","setRouteDraftPoint","storeLinkPreview","setStoreLinkPreview","rubberCursor","setRubberCursor","splitJoinPending","setSplitJoinPending","splitJoinHover","setSplitJoinHover","splitJoinSnapEnd","setSplitJoinSnapEnd","polygonSnap","setPolygonSnap","clearRouteSession","stubDrag","setStubDrag","shapeDrag","setShapeDrag","shapeOffset","setShapeOffset","vertexDrag","setVertexDrag","selectedVertex","setSelectedVertex","selectedHandle","setSelectedHandle","hoveredEdge","setHoveredEdge","edgePress","setEdgePress","hoveredShapeId","setHoveredShapeId","hoveredAnchorId","setHoveredAnchorId","routePointerSnap","setRoutePointerSnap","selectedRouteEdgeId","setSelectedRouteEdgeId","reportAnchors","selectAnchors","routeHover","underlayTip","setUnderlayTip","panStart","isPanning","setIsPanning","worldPx","syncViewDom","nextPan","g","applyView","cancelWheelWork","paintView","settleWheelView","scheduleWheelPaint","zoomAnimRef","cancelZoomAnim","animateViewTo","targetPan","targetZoom","now","zoomAroundCenter","currentPan","useImperativeHandle","polygon","renderedZoom","useLayoutEffect","viewbox","unionViewBox","svgUnderlayUrl","svgSuppressIds","svgIdsOwnedByShapes","measure","ro","editableShapes","openingShapes","openingClipId","openingHatchId","selectedShape","displayGeometry","splitJoinShapes","polygonAnchorCandidates","nearSplitJoinAnchor","snapPolygonPoint","own","commitSplitJoinEdits","deleted","survivor","tryJoinOpenEnd","endHit","handleSplitJoinAt","endTol","edgeTol","edgeHit","toWorld","moveUnderlayTip","insertAnchorOnEdge","beginEdgePress","insertAt","deleteShapeAnchor","beginSplitJoinVertexDrag","vertexHit","deleteShapeHandle","hoverEdgeAt","connectedAnchorIds","routeAnchorDegreeById","degree","dragRouteExcludeIds","dragRouteSnap","displayAnchorById","dragged","routeEdgePath","routeEdgePathD","displayRouteCurve","assignedOverlays","updateRoutePointerSnap","closePolygon","onKey","down","onBlur","node","onWheel","beginPinch","onCanvasPointerDownCapture","beginPan","onCanvasPointerMoveCapture","onCanvasPointerUpCapture","wasPinching","fromEmptySelect","captureNode","insertHoveredRoutePoint","created","removeWayfindingEdge","orphans","removeWayfindingAnchor","removed","snapped","constrained","placed","curveSnap","curveEdge","storeExclude","DEFAULT_ENTRANCE_SIZE","handleHit","_d","_c","midHit","_f","_e","handleTol","_h","_g","onPointerMove","screenMove","bendRouteToCubic","moveRouteHandle","snapTol","finishRect","finishEllipse","onPointerUp","endedPan","moved","pathDFromGeometry","shapePathD","stubExcludeIds","stubSnap","lastRoutePoint","routeRubberSnap","highlightedRouteEdgeId","highlightedRouteEdge","highlightedRouteFrom","highlightedRouteTo","highlightedRoutePath","routePlusAt","rubberFrom","rubberTo","rubberBand","polygonFollow","polygonClose","hoveredLinkShape","wayfindingStoreHover","routeInsertHover","routeNetworkHover","mapCursor","canvasStyle","hoverId","hintable","publishedFill","highlightable","selected","dragging","textLabel","entranceIcon","stamp","beginShapePointerDown","routeSnap","worldAt","hoverHandlers","iconUrl","entranceIconDataUrl","emphasisStroke","textX","labelAlignX","baseOpacity","opening","emphasisFill","ri","items","ei","strokeD","clickRing","plus","h1","h2","vi","beginHandle","shapeNode","connected","displayAnchor","dragConnect","nearWeld","visR","hideOnAnchor","Fragment","editorShouldWarnOnLeave","state","applyBeforeUnloadWarning","shouldWarn","beforeUnloadTargets","frame","targets","top","FAMILY_PREFIXES","normalizeId","value","parseConnectorSourceId","raw","family","direction","role","groupParts","part","guessConnectorKind","connectorIdForShape","shapeId","connectorForShape","connectors","resolvedConnectorKind","railConnectorShapes","landingAnchor","shapeLandingPoint","geometryCentroid","inferTravelDirection","fromLevelIndex","toLevelIndex","hint","defaultConnectorName","parsed","nearestWalkAnchor","bestDist","memberShapeIds","connectorId","partnerShapesForConnector","connector","levelsWithLandings","landings","escalatorDirectedEnds","memberAnchors","memberIds","ride","fromAnchor","toAnchor","floorName","landingRideId","groupEscalatorRides","rides","directed","members","escalatorRideLandingLines","connectorRideLabel","partners","order","ai","bi","connectorEdgesBetween","anchorIds","ensureLanding","linkLandingToWalk","landing","applyUnlinkLocal","unlinkConnectorOps","buildUnlinkConnectorOps","buildEscalatorLinkOps","fromShape","toShape","fromLevel","l","toLevel","name","existingFrom","existingTo","v","buildElevatorShaftOps","memberShapes","existingIds","keepId","geometryBbox","bboxOf","shapeKeyTakenOnLevel","upsertById","rows","copy","applyDraftOp","mergeEntranceAwareLabel","parseShapeAssignment","rest","omitLevelFromDraft","removedShapeIds","liveConnectorIds","applyDraftOps","seeded","healDraftGeometry","normalizeGeometrySpace","canonicalizeEntranceLabel","geometryChanged","labelChanged","coalesceDraftOp","acc","BATCH_PERSIST_RANK","edgePairKey","compactRouteOpsForPersist","deletedEdgeIds","deletedAnchorIds","upsertedEdgeIds","upsertedAnchorIds","ephemeralAnchorIds","lastIndexByPair","curveByPair","winner","winnerOp","sortBatchOps","rank","orderBatchOpsForPersist","FieldResetIcon","FieldResetButton","onClick","normalizeHexColor","match","hex","ch","hexColorInputValue","sameHexColor","StepperRow","onChange","onStep","onHoldStart","onHoldEnd","setDraft","focused","syncDraft","commitDraft","persistIncomplete","commitAssignNumberDraft","assignNumberFromDraft","ColorSwatch","swatch","fallback","emptyIsTransparent","onHexChange","onCommit","onPick","lastSolid","transparent","solid","pickerValue","ColorRow","onReset","display","TRANSPARENT_COLOR","setHex","commit","normalized","ALIGN_TOOLTIPS","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","ALIGN_ICONS","AlignRow","LABEL_ALIGNS","RotateIcon","nextQuarterTurn","remainder","stepWholeNumber","AssignmentStyleFields","form","storeDefaultColor","storeTextColor","textColorLabel","showTextColor","onPatch","formRef","intervals","bump","startHold","stopHold","offsetX","offsetY","bgColor","textColor","connectorStyleAssignment","emptyShapeAssignment","ConnectorAssign","railKind","onApplyOps","onSaveAssignment","partner","levelName","exitFloorId","setExitFloorId","targetId","setTargetId","stopFloorId","setStopFloorId","styleForm","setStyleForm","styleFormRef","patchStyle","useCallback","partial","exitFloors","landingsOnExitFloor","addable","addFloors","landingsOnStopFloor","applyEscalator","applyElevator","nextMembers","pickExitLanding","nextId","pickElevatorStop","landingOptions","linked","connectorSpecialIconDataUrl","ModernSelect","nextFloor","assignmentPadFillFallback","SHAPE_KIND_LABELS","EDITOR_TYPE_KINDS","TOOL_ONLY_KINDS","inspectorShowsType","inspectorTypeKinds","shapeKindLabel","ASSIGNABLE_SHAPE_KINDS","isAssignableKind","isStoreShapeKind","isRetailerAssigned","isAmenityAssigned","isKioskAssigned","isPolygonAssigned","assignmentHasTarget","railAssignmentGroups","byShape","stores","kiosks","unassignedStores","unassignedAmenities","unassignedKiosks","custom","unassignedCustom","unassigned","isKioskScreenKind","kioskScreenShapes","catalogKioskShapeOptions","shapeIdForCatalogKiosk","kioskId","leftoverCatalogKiosks","used","kiosk","catalogKioskRowLabel","assignedKey","railRowLabels","tags","RAIL_ITEM_SECTIONS","isRailItemSection","railShowsItemOptions","selectedCount","railListLevelOrder","floorsLowToHigh","compareBuildingFloors","sortShapesByRailLevel","indexById","floorsScreenTitle","screen","visibleFloorCount","moveLevelId","movedId","toIndex","without","clamped","insertIndexFromY","listTop","rowHeight","dropLineTop","fromIndex","dropIndex","rowInnerHeight","sameIdOrder","formatBytes","svgFileName","isSvgFile","GripIcon","TrashIcon","deleteConfirmCopy","shapeCount","isOutdoor","FloorsPanel","buildings","levelShapeCounts","canFloors","onScreenChange","onCreateLevel","onUpdateLevel","onDeleteLevel","onReorderLevels","setName","file","setFile","busy","setBusy","error","setError","progress","setProgress","dragOver","setDragOver","confirmDeleteId","setConfirmDeleteId","deleting","setDeleting","drag","setDrag","setDropIndex","previewIds","setPreviewIds","previewFailed","setPreviewFailed","localPreviewUrl","setLocalPreviewUrl","fileInputRef","floorListRef","ghostRef","previewIdsRef","dragRef","outdoorReady","buildingFloors","committedIds","displayFloors","byId","editing","isOutdoorForm","canManage","canReorder","takeSvgFile","openEdit","submit","picked","svgFile","remove","renderDeleteModal","renderRowDelete","applyGhost","ghost","previewMoveToY","persistPreview","nextIds","endDrag","onMove","maxY","onUp","startDrag","list","listRect","lineTop","hasExistingSvg","showEditPreview","previewUrl","previewFallback","importedCount","showReimportNotice","primaryLabel","primaryBusyLabel","createPortal","BackIcon","ChevronIcon","NAV_ICON_PROPS","FloorsNavIcon","StoresNavIcon","AmenitiesNavIcon","KiosksNavIcon","EscalatorsNavIcon","ElevatorsNavIcon","SurroundingsNavIcon","SettingsNavIcon","CustomNavIcon","UnassignedNavIcon","EditMapNavIcon","WayfindingNavIcon","MapResponsivenessNavIcon","RAIL_NAV","HIDDEN_SECTION_TITLES","isRailNavSeparator","entry","railSectionTitle","HOUSE_OUTDOOR_THEME","staticLayerThemeDefaults","OUTDOOR_COLOR_FIELDS","SettingsField","children","ColorField","LeftRail","onSectionChange","activeLevelId","selectedShapeIds","onHoverShape","onListFocus","canSettings","canResponsiveness","onAutoroute","onThemeChange","assignPanel","catalogKioskPanel","selectedCatalogKioskId","onSelectCatalogKiosk","editMapPanel","wayfindingPanel","mapResponsivenessPanel","showSurroundings","surroundingsPanel","footer","floorsScreen","setFloorsScreen","assigned","storeShapes","amenityShapes","kioskShapes","unassignedStoreShapes","unassignedAmenityShapes","unassignedKioskShapes","unassignedShapes","customShapes","unassignedCustomShapes","escalatorShapes","elevatorShapes","unlinkedEscalators","escalatorRides","linkedElevators","unlinkedElevators","assignmentById","counts","duplicate","retailerOptionLabel","amenityById","kioskById","assignedNameFor","catalogName","fromType","getAmenityByType","amenityAssignedName","kioskAssignedName","activeLevel","pathCount","selectedIds","isShapeSelected","selectedCatalogKiosk","showingCatalogKiosk","showingItemOptions","itemOptionsTitle","linkedId","selectShapeFromList","leftoverKiosks","renderShapeList","empty","opts","renderEscalatorRideList","active","renderAssignedUnassigned","assignedList","unassignedList","kindLabelFor","connectorIcon","DEFAULT_THEME","house","customized","clampStoreRadius","clampRouteThickness","readError","body","description","apiFetch","webApiURI","path","init","ClassicMapFooter","centerId","unsaved","onMapVersionChanged","isDeveloper","setIsDeveloper","classicPresence","setClassicPresence","dialog","setDialog","acknowledged","setAcknowledged","setPending","status","openSwitch","confirmSwitch","confirmDelete","showSwitch","showDelete","CatalogKioskForm","shapeOptions","assignedShapeId","onAssign","hasShape","SHAPE_KEY_PREFIX","SHAPE_KEY_ALPHABET","SHAPE_KEY_SUFFIX_LENGTH","shapeKeyPrefix","randomShapeKeySuffix","length","bytes","liveShapeKeysOnLevel","copyDestinationLevels","currentLevelId","allocShapeKey","taken","suffix","prefix","cloneShapeGeometry","copyShapeToLevelOps","targetLevelId","RETAIL_LAYER_TYPES","AssignForm","amenityIconColor","kioskIconColor","onClear","setForm","patch","nameCounts","retailerOptions","amenityOptions","amenityAssignOptions","selectedAmenityType","amenityTypeFromCatalogId","kioskCatalogName","textColorFallback","assignmentIconThemeFallback","hasAssignment","retailerId","layerType","DEFAULT_LABEL_ALIGN","isHttpImageUrl","amenityId","amenityCatalogIdForType","KioskNameField","trimmed","BulkAssignForm","common","bulkAssignFormState","assignableShapes","iconOnly","uniqueKinds","bgColorFallback","BulkSizeRow","BulkColorRow","emitIfComplete","mixed","Chevron","CopyToLevelButton","destinations","onCopyToLevel","listId","useId","buttonRef","menuRef","setOpen","menuPos","setMenuPos","close","updateMenuPos","spaceBelow","spaceAbove","maxHeight","openAbove","destinationKey","onDoc","menu","nextError","MIN_ICON_SIZE","EntranceIconForm","setSize","setRotate","sizeRef","rotateRef","nextSize","nextRotate","MIN_FONT_SIZE","TextLabelForm","setText","textFocused","nextText","Inspector","levelShapeKeys","showAssignment","emptyHint","onRename","onChangeKind","onChangeLevel","onDelete","onClearAssignment","onUpdateLabel","selectedShapes","selectedAssignments","onBulkAssign","setKey","keyError","setKeyError","levelError","setLevelError","commitRename","copyDestinations","copyButton","PreviewOverlay","document","focusNonce","onActiveLevelChange","routeOnSelect","device","captureCamera","onCameraChange","onCameraSample","onCameraReset","themeOverrides","transparentBackground","googleMapsApiKey","Suspense","MapViewer","nextSelectedShapeIds","compileEditorPreview","compileDocument","memory","MAX_REMEMBERED_MAPS","storageKey","dropLegacyStorage","markEditorSection","oldest","peekEditorSection","clearEditorSection","storage","markReturnToFloorsList","consumeReturnToFloorsList","stored","clearReturnToFloorsList","MAX_GRID_OPACITY","DEFAULT_GRID_OPACITY","clampGridOpacity","gridOpacityFromSlider","percent","sliderPercentFromGridOpacity","opacity","GridPrefsControl","prefsFromInput","formatCoord","SurroundingsPanel","apiKey","view","mallOpacity","satellite","onMallOpacity","onSatellite","onHeading","onZoom","onPanTo","query","setQuery","searching","setSearching","searchError","setSearchError","latText","setLatText","lngText","setLngText","coordError","setCoordError","latFocused","lngFocused","headingRef","zoomRef","holdRef","bumpHeading","bumpZoom","clampBasemapZoom","BASEMAP_ZOOM_STEP","startZoomHold","search","address","maps","loadGoogleMaps","place","geocodeAddress","reason","goToCoordinates","latRaw","lngRaw","lat","lng","MapEditor","onBatch","onPublish","onSaveResponsive","onDiscard","onImportSvg","previewDocument","className","sidebarFooter","onDirtyChange","gridOpacityProp","onGridPrefsChange","restoredSection","setSection","responsiveDevice","setResponsiveDevice","pendingResponsive","setPendingResponsive","previewEpoch","setPreviewEpoch","setActiveLevelId","restoredLevel","setSelectedShapeIds","setSelectedCatalogKioskId","listFocusNonce","setListFocusNonce","setSelectedAnchorIds","setTool","setGridOpacity","basemapRef","mallCameraRef","basemapView","setBasemapView","parseMapGeoreference","DEFAULT_BASEMAP_VIEW","setMallOpacity","basemapSatellite","setBasemapSatellite","editVersion","setEditVersion","needsPublish","setNeedsPublish","saving","setSaving","setHistory","routeDraftActive","setRouteDraftActive","historyRef","pendingOps","nextTempId","historyGestureRef","showMapOptions","centerSurface","isEditMap","historyMetaRef","handleGridPrefsChange","prefs","workingDraft","mergeTheme","cameraDirty","pendingEdits","dirty","warnOnLeave","warnOnLeaveRef","onBeforeUnload","canPersist","isResponsiveness","isSurroundings","outdoorViewOnly","canDrawOnCanvas","outdoorLevel","outdoorShapes","levelShapes","levelsWithShapes","lvl","lower","nextLowerBuildingFloor","mergedResponsiveOverrides","mergeResponsiveOverrides","compiledPreview","levelAnchors","levelEdges","anchorsById","selectedAssignment","takeSnapshot","applySnapshot","recordHistoryStep","mode","queueOp","historyMode","savedGeoreferenceKey","basemapViewRef","draftGeorefRef","georeferenceWithAnchor","cam","saved","isDefaultMapGeoreference","sameMapGeoreference","endHistoryGesture","undo","redo","handleSaveChanges","cameraItems","persisted","savedCamera","responsiveSlotKey","handleDiscardChanges","handleSectionChange","handleCanvasLevelChange","nextLevel","handleSelectShape","additive","nextLevelId","viewerLevelIdAfterShapeSelect","connectorKind","handleToolChange","requested","resolved","handleRenameShape","handleChangeLevel","queueOpBatch","handleCopyToLevel","copied","handleDeleteShape","handleUpdateShapeGeometry","handleUpdateLabel","nextLabel","handleChangeKind","handleSaveAssignment","visuals","assignmentVisualPatch","handleClearAssignment","handleLinkCatalogKiosk","previousShapeId","clearShape","handleBulkAssign","patched","applyBulkAssignPatch","selectedConnectorKind","connectorRailKind","handleCameraChange","fields","poseToResponsiveFields","handleCameraReset","emptyResponsiveOverrideInput","toolGroup","heading","normalizeHeading","RESPONSIVE_DEVICE_TABS","tab","GoogleBasemap","keepHeading","keepZoom","hasBuildingFloors","MAP_NO_FLOORS_MESSAGE","id1","id2","prevAnchorId","shiftRouteCurveForAnchor","deletedSelected","takenKeys","edit","style","MapControls","bucketLabel","change","ImportReviewPanel","diff","viewBoxChanged","blockedMessage","onApply","onCancel","remap","setRemap","buckets","added","orphaned","locked","toSourceSvgId"],"mappings":";;;;;;AAYO,SAASA,GAAgBC,GAAsC;AACpE,SAAOA,MAAY,cAAcA,MAAY;AAC/C;AAOO,SAASC,GACdC,GACAF,GACqB;AACrB,SAAIE,MAAS,YAAY,CAACH,GAAgBC,CAAO,IAAU,WACpD;AACT;AAGO,SAASG,GAAiDC,GAAkB;AACjF,SAAOC,GAAoBD,CAAM;AACnC;AAGO,SAASE,GAA8CF,GAAkB;AAC9E,QAAMG,IAAUH,EAAO,OAAO,CAACI,MAAUA,EAAM,SAAS,SAAS;AACjE,SAAO,CAAC,GAAGH,GAAoBD,CAAM,GAAG,GAAGG,CAAO;AACpD;AAGO,SAASE,GAAqBL,GAAqC;;AACxE,WAAOM,IAAAL,GAAoBD,CAAM,EAAE,GAAG,EAAE,MAAjC,gBAAAM,EAAoC,OAAM;AACnD;AAMO,SAASC,GAAyBP,GAAqC;;AAC5E,SACEK,GAAqBL,CAAM,OAC3BM,IAAAN,EAAO,KAAK,CAACI,MAAUA,EAAM,SAAS,SAAS,MAA/C,gBAAAE,EAAkD,OAClD;AAEJ;AAGO,SAASE,GAAsBR,GAAqC;;AACzE,SACEK,GAAqBL,CAAM,OAC3BM,IAAAN,EAAO,KAAK,CAACI,MAAUA,EAAM,SAAS,SAAS,MAA/C,gBAAAE,EAAkD,OAClD;AAEJ;AAMO,SAASG,GAAyBT,GAAqC;AAC5E,SAAOU,GAAqBV,CAAM;AACpC;AAMO,SAASW,GACdf,GACAI,GACqC;AAKrC,UAHEJ,MAAY,eACRG,GAA2BC,CAAM,IACjCE,GAAwBF,CAAM,GACpB,IAAI,CAACI,OAAW;AAAA,IAC9B,IAAIA,EAAM;AAAA,IACV,MAAMA,EAAM,SAAS,YAAY,YAAYA,EAAM;AAAA,EAAA,EACnD;AACJ;AAGO,SAASQ,GACdhB,GACAQ,GACS;AACT,SAAOR,MAAY,iBAAgBQ,KAAA,gBAAAA,EAAO,UAAS;AACrD;AClFO,SAASS,KAAoC;AAClD,SAAO,EAAE,MAAM,IAAI,QAAQ,CAAA,EAAC;AAC9B;AAEO,SAASC,GACdC,GACuB;AACvB,SAAO;AAAA,IACL,KAAKA,EAAS,IAAI,IAAI,CAACC,MAAO,KAAK,MAAM,KAAK,UAAUA,CAAE,CAAC,CAAY;AAAA,IACvE,YAAYD,EAAS;AAAA,IACrB,iBAAiBA,EAAS;AAAA,IAC1B,mBAAmB,CAAC,GAAGA,EAAS,iBAAiB;AAAA,EAAA;AAErD;AAEO,SAASE,GACdC,GACAC,GACe;AACf,SAAO;AAAA,IACL,MAAM,CAAC,GAAGD,EAAQ,MAAMJ,GAAqBK,CAAO,CAAC,EAAE,MAAM,IAAqB;AAAA,IAClF,QAAQ,CAAA;AAAA,EAAC;AAEb;AAEO,SAASC,GACdF,GACAC,GACoE;AACpE,MAAID,EAAQ,KAAK,WAAW,EAAG,QAAO;AACtC,QAAMG,IAAWH,EAAQ,KAAKA,EAAQ,KAAK,SAAS,CAAC;AACrD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAMA,EAAQ,KAAK,MAAM,GAAG,EAAE;AAAA,MAC9B,QAAQ,CAAC,GAAGA,EAAQ,QAAQJ,GAAqBK,CAAO,CAAC;AAAA,IAAA;AAAA,IAE3D,UAAUL,GAAqBO,CAAQ;AAAA,EAAA;AAE3C;AAEO,SAASC,GACdJ,GACAC,GACoE;AACpE,MAAID,EAAQ,OAAO,WAAW,EAAG,QAAO;AACxC,QAAMG,IAAWH,EAAQ,OAAOA,EAAQ,OAAO,SAAS,CAAC;AACzD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM,CAAC,GAAGA,EAAQ,MAAMJ,GAAqBK,CAAO,CAAC;AAAA,MACrD,QAAQD,EAAQ,OAAO,MAAM,GAAG,EAAE;AAAA,IAAA;AAAA,IAEpC,UAAUJ,GAAqBO,CAAQ;AAAA,EAAA;AAE3C;AAEO,SAASE,GAAuBC,GAAqC;AAC1E,MAAIA,KAAU,QAAQ,OAAOA,KAAW,SAAU,QAAO;AACzD,QAAMC,IAAKD,GACLE,IAAMD,EAAG;AACf,SAAIC,MAAQ,WAAWA,MAAQ,cAAcA,MAAQ,WAAiB,KAC/D,EAAQD,EAAG;AACpB;AAQO,SAASE,GAAmB,GAAyB;AAE1D,SADI,EAAE,UAAU,EAAE,YACd,EAAE,EAAE,WAAW,EAAE,WAAiB,KAC/B,EAAE,QAAQ,OAAO,EAAE,QAAQ;AACpC;AAGO,SAASC,GAAmB,GAAyB;AAE1D,MADI,EAAE,UACF,EAAE,EAAE,WAAW,EAAE,SAAU,QAAO;AACtC,QAAMC,IAAM,EAAE,IAAI,YAAA;AAClB,SAAIA,MAAQ,OAAO,EAAE,WAAiB,KAC/BA,MAAQ,OAAO,CAAC,EAAE;AAC3B;AClFO,MAAMC,KAYR;AAAA,EACH,EAAE,IAAI,UAAU,OAAO,UAAU,OAAO,MAAA;AAAA,EACxC,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,MAAA;AAAA,EAClC,EAAE,IAAI,aAAa,OAAO,kBAAkB,MAAM,IAAM,OAAO,MAAA;AAAA,EAC/D,EAAE,IAAI,gBAAgB,OAAO,gBAAgB,MAAM,IAAM,OAAO,MAAA;AAAA,EAChE,EAAE,IAAI,eAAe,OAAO,eAAe,MAAM,IAAM,OAAO,MAAA;AAAA,EAC9D,EAAE,IAAI,SAAS,OAAO,SAAS,MAAM,IAAM,OAAO,OAAO,MAAM,QAAA;AAAA,EAC/D,EAAE,IAAI,cAAc,OAAO,gBAAgB,MAAM,IAAM,OAAO,MAAA;AAAA,EAC9D,EAAE,IAAI,aAAa,OAAO,QAAQ,MAAM,IAAM,OAAO,MAAA;AAAA,EACrD,EAAE,IAAI,iBAAiB,OAAO,YAAY,MAAM,IAAM,OAAO,MAAA;AAAA,EAC7D;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAEX;AAWO,SAASC,GAAiBC,GAAuB;AACtD,SAAOA,MAAS,kBAAkBA,MAAS;AAC7C;AAGO,SAASC,GAAuBD,GAA2B;AAChE,SAAOA,MAAS,YAAYA,MAAS,WAAWD,GAAiBC,CAAI;AACvE;AAGO,SAASE,GAAwBF,GAAuB;AAC7D,SAAOA,MAAS;AAClB;AAGO,SAASG,GAAcH,GAAuB;AACnD,SAAOA,MAAS;AAClB;AAGO,SAASI,GACdJ,GACAK,GACe;AACf,SAAKF,GAAcH,CAAI,KAChB,OAAOK,KAAgB,WAAWA,IADR;AAEnC;AAEA,MAAMC,KAAa;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,eAAe;AACjB;AAEA,SAASC,KAAa;AACpB,SACE,gBAAAC,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EAAA,GAET;AAEJ;AAEA,SAASC,KAAU;AACjB,SACE,gBAAAD,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASE,KAAe;AACtB,SACE,gBAAAF,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA,IAAA;AAAA,EAAA,GAEhB;AAEJ;AAEA,SAASG,KAAkB;AACzB,SACE,gBAAAH,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASI,KAAiB;AACxB,SACE,gBAAAJ,EAAC,OAAA,EAAK,GAAGF,IACP,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA,IAAA;AAAA,EAAA,GAEhB;AAEJ;AAEA,SAASK,KAAY;AACnB,SACE,gBAAAC,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,MAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAEP,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACxD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAASO,KAAgB;AACvB,SACE,gBAAAD,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,KAAI,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACtD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,KAAI,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,EAAA,GACxD;AAEJ;AAEA,SAASQ,KAAe;AACtB,SACE,gBAAAF,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EAChB,GACF;AAEJ;AAEA,SAASS,KAAmB;AAC1B,SACE,gBAAAH,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASU,KAAgB;AACvB,SACE,gBAAAJ,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,KAAI,IAAG,OAAM,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACpD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAASW,KAAkB;AACzB,SACE,gBAAAL,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,MAAK,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACtD,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EAChB,GACF;AAEJ;AAEA,SAASY,KAAuB;AAC9B,SACE,gBAAAN,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACxD,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,OAAM,GAAE,QAAO,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAASa,KAAW;AAClB,SACE,gBAAAP,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASc,KAAW;AAClB,SACE,gBAAAR,EAAC,OAAA,EAAK,GAAGR,IACP,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,MAAMe,KAA2D;AAAA,EAC/D,QAAQhB;AAAA,EACR,KAAKE;AAAA,EACL,aAAaC;AAAA,EACb,gBAAgBC;AAAA,EAChB,eAAeC;AAAA,EACf,OAAOC;AAAA,EACP,cAAcE;AAAA,EACd,aAAaC;AAAA,EACb,iBAAiBC;AAAA,EACjB,cAAcC;AAAA,EACd,gBAAgBC;AAAA,EAChB,sBAAsBC;AACxB;AAGO,SAASI,GAAgBxB,GAA2B;AACzD,SAAOA,MAAS,YAAYA,MAAS,WAAWA,MAAS;AAC3D;AAGO,SAASyB,GACdzB,GACA0B,IAAY,IACH;AACT,SAAO,CAACA,KAAaF,GAAgBxB,CAAI;AAC3C;AAEO,SAAS2B,GAAgB3B,GAA2B;AACzD,SAAOA,MAAS;AAClB;AAGO,SAAS4B,GAAkB5B,GAA2B;AAC3D,SAAOA,MAAS;AAClB;AAMO,SAAS6B,GAAwBC,GAGtC;AACA,SAAIA,EAAO,WAAW,IAAU,EAAE,QAAQ,CAAC,GAAGA,CAAM,GAAG,UAAU,GAAA,IAC1D,EAAE,QAAQA,EAAO,MAAM,GAAG,EAAE,GAAG,UAAU,GAAA;AAClD;AAGO,SAASC,GAAkB/B,GAA2B;AAC3D,SAAOA,MAAS;AAClB;AAGO,SAASgC,GAAgBhC,GAA2B;AACzD,SAAOA,MAAS,eAAeA,MAAS,kBAAkBA,MAAS;AACrE;AAGO,SAASiC,GAAgBjC,GAA2B;AACzD,SAAOA,MAAS,eAAeA,MAAS;AAC1C;AAGO,SAASkC,GAAgBlC,GAA2B;AACzD,SAAOA,MAAS,YAAYA,MAAS;AACvC;AAGO,SAASmC,GAAkBnC,GAA2B;AAC3D,SAAOA,MAAS,YAAYA,MAAS,WAAWA,MAAS;AAC3D;AAGO,SAASoC,GAAkBpC,GAA2B;AAC3D,SAAOA,MAAS;AAClB;AAGO,SAASqC,GAAoBrC,GAA2B;AAC7D,SACEA,MAAS,YACTA,MAAS,WACTA,MAAS,gBACTA,MAAS,SACTA,MAAS;AAEb;AAGO,SAASsC,GAAenD,GAAqBoD,GAA8B;AAChF,SAAIA,MAASpD,KAAWY,GAAiBwC,CAAI,IAAU,WAChDA;AACT;AAEO,SAASC,GAASxC,GAAkByC,GAAiC;AAC1E,MAAIA,MAAU;AACZ,YAAQzC,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IAAA;AAGb,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EAAA;AAEb;AAUO,SAAS0C,GAAkB;AAAA,EAChC,MAAA1C;AAAA,EACA,cAAA2C;AAAA,EACA,SAAAC;AAAA,EACA,OAAAH;AACF,GAA2B;AACzB,QAAMI,IAAW/C,GAAa,OAAO,CAACgD,MAAMA,EAAE,UAAU,OAAO,GACzDC,IAAajD,GAAa;AAAA,IAC9B,CAACgD,MAAMA,EAAE,UAAU,WAAWA,EAAE,OAAO;AAAA,EAAA,GAEnCE,IACJP,MAAU,UAAU3C,GAAa,OAAO,CAACgD,MAAMA,EAAE,SAAS,OAAO,IAAI,CAAA,GACjEG,IAAUR,MAAU,SACpBS,IAAYT,MAAU,OACtBU,IAAarD,GAAa,KAAK,CAACgD,MAAMA,EAAE,OAAO,QAAQ,GACvDM,IACJX,MAAU,WAAWU,IACjB,CAACA,GAAY,GAAGJ,GAAY,GAAGC,CAAe,IAC9CD,GAEAM,IAAe,CAACP,MAAqC;AACzD,UAAMQ,IAAO/B,GAAWuB,EAAE,EAAE;AAC5B,WACE,gBAAAhC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,8BAA8BgC,EAAE,UAAU,0CAA0C,EAAE,GAAG9C,MAAS8C,EAAE,KAAK,eAAe,EAAE;AAAA,QACrI,gBAAcA,EAAE,UAAU,SAAYA,EAAE;AAAA,QACxC,cAAYA,EAAE;AAAA,QACd,gBAAc9C,MAAS8C,EAAE;AAAA,QACzB,SAAS,MAAMH,EAAaG,EAAE,EAAE;AAAA,QAChC,UAAU,CAACF,KAAWE,EAAE;AAAA,QAExB,UAAA;AAAA,UAAA,gBAAAtC,EAAC8C,GAAA,EAAK;AAAA,UACLR,EAAE,UACD,gBAAAtC,EAAC,QAAA,EAAK,WAAU,kCAAkC,UAAAsC,EAAE,SAAQ,IAC1D;AAAA,QAAA;AAAA,MAAA;AAAA,MAZCA,EAAE;AAAA,IAAA;AAAA,EAeb;AAEA,2BACG,OAAA,EAAI,WAAU,gCAA+B,MAAK,WAAU,cAAW,aACrE,UAAA;AAAA,IAAAG,IACGJ,EAAS,IAAI,CAACC,MACZ,gBAAAhC,EAACyC,GAAM,UAAN,EACE,UAAA;AAAA,MAAAT,EAAE,YACD,gBAAAtC,EAAC,QAAA,EAAK,WAAU,8BAA6B,eAAY,QAAO,IAC9D;AAAA,MACH6C,EAAaP,CAAC;AAAA,IAAA,EAAA,GAJIA,EAAE,EAKvB,CACD,IACD;AAAA,IACHG,KAAWC,IACV,gBAAA1C,EAAC,QAAA,EAAK,WAAU,8BAA6B,eAAY,QAAO,IAC9D;AAAA,IACH0C,IAAYE,EAAa,IAAIC,CAAY,IAAI;AAAA,EAAA,GAChD;AAEJ;AAUO,SAASG,GAAqB;AAAA,EACnC,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,QAAAC;AACF,GAA8B;AAC5B,2BACG,OAAA,EAAI,WAAU,6BAA4B,MAAK,SAAQ,cAAW,iBACjE,UAAA;AAAA,IAAA,gBAAArD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,gBAAa;AAAA,QACb,cAAW;AAAA,QACX,SAASoD;AAAA,QACT,UAAUD,KAAY,CAACF;AAAA,QAEvB,4BAACpC,IAAA,CAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAEZ,gBAAAb;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,gBAAa;AAAA,QACb,cAAW;AAAA,QACX,SAASqD;AAAA,QACT,UAAUF,KAAY,CAACD;AAAA,QAEvB,4BAACpC,IAAA,CAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GACF;AAEJ;ACrjBA,MAAMwC,KAAM;AAEL,SAASC,GAAMC,GAASC,GAASC,IAAMJ,IAAc;AAC1D,SAAO,KAAK,IAAIE,EAAE,IAAIC,EAAE,CAAC,KAAKC,KAAO,KAAK,IAAIF,EAAE,IAAIC,EAAE,CAAC,KAAKC;AAC9D;AAEO,SAASC,GAASC,GAAe;AACtC,SAAO,EAAE,GAAGA,EAAE,GAAG,GAAGA,EAAE,EAAA;AACxB;AAEO,SAASC,GAAOL,GAASC,GAAe;AAC7C,SAAO,EAAE,GAAGD,EAAE,IAAIC,EAAE,GAAG,GAAGD,EAAE,IAAIC,EAAE,EAAA;AACpC;AAEO,SAASK,GAAON,GAASC,GAAe;AAC7C,SAAO,EAAE,GAAGD,EAAE,IAAIC,EAAE,GAAG,GAAGD,EAAE,IAAIC,EAAE,EAAA;AACpC;AAEO,SAASM,GAASP,GAASQ,GAAiB;AACjD,SAAO,EAAE,GAAGR,EAAE,IAAIQ,GAAG,GAAGR,EAAE,IAAIQ,EAAA;AAChC;AAEO,SAASC,GAAQT,GAASC,GAAS,GAAiB;AACzD,SAAO,EAAE,GAAGD,EAAE,KAAKC,EAAE,IAAID,EAAE,KAAK,GAAG,GAAGA,EAAE,KAAKC,EAAE,IAAID,EAAE,KAAK,EAAA;AAC5D;AAEO,SAASU,GAAUC,GAAwB;AAChD,SAAIA,EAAK,QAAQ,SAAS,IAAU,IAC7BA,EAAK,SAASA,EAAK,QAAQ,SAASA,EAAK,QAAQ,SAAS;AACnE;AAEO,SAASC,GAASD,GAAgBE,GAAyB;AAChE,SAAOF,EAAK,QAAQE,CAAS;AAC/B;AAEO,SAASC,GAAOH,GAAgBE,GAAyB;AAC9D,SAAOF,EAAK,SAASE,IAAY,KAAKF,EAAK,QAAQ,MAAM;AAC3D;AAEO,SAASI,GAAYJ,GAAgBE,GAA2B;AACrE,QAAMG,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS;AACjC,UAAIK,KAAA,gBAAAA,EAAM,UAAS,UACV,KAAKF,EAAK,CAAC,IAAIA,EAAK,CAAC,MAAME,EAAK,GAAG,CAAC,IAAIA,EAAK,GAAG,CAAC,IAAIA,EAAK,GAAG,CAAC,IAAIA,EAAK,GAAG,CAAC,IAAID,EAAG,CAAC,IAAIA,EAAG,CAAC,KAE7F,KAAKD,EAAK,CAAC,IAAIA,EAAK,CAAC,MAAMC,EAAG,CAAC,IAAIA,EAAG,CAAC;AAChD;AAEO,SAASE,GAASC,GAAmB;AAC1C,QAAMC,IAAI,KAAK,MAAMD,IAAI,GAAI,IAAI;AACjC,SAAO,OAAO,GAAGC,GAAG,EAAE,IAAI,MAAM,OAAOA,CAAC;AAC1C;AAEO,SAASC,GAAgBC,GAAcC,IAAS,IAAgB;AACrE,QAAMC,IAAUF,EAAK,IAAIpB,EAAQ;AACjC,EACEsB,EAAQ,SAAS,KACjB1B,GAAM0B,EAAQ,CAAC,GAAGA,EAAQA,EAAQ,SAAS,CAAC,CAAC,KAE7CA,EAAQ,IAAA;AAEV,QAAMC,IAAoBD,EAAQ,IAAI,OAAO,EAAE,MAAM,SAAS;AAC9D,SAAI,CAACD,KAAUE,EAAM,SAAS,OAAS,IAAA,GAChC,EAAE,QAAAF,GAAQ,SAAAC,GAAS,OAAAC,EAAA;AAC5B;AAKO,SAASC,GAAiBC,GAAUC,GAASC,GAGlD;AACA,SAAO;AAAA,IACL,IAAIrB,GAAQmB,GAAIC,GAAG,IAAI,CAAC;AAAA,IACxB,IAAIpB,GAAQqB,GAAID,GAAG,IAAI,CAAC;AAAA,EAAA;AAE5B;AAMO,SAASE,GAAoBf,GAAYC,GAAUe,GAGxD;AACA,QAAMC,IAAMxB,GAAQO,GAAMC,GAAI,GAAG,GAC3BiB,IAAS3B,GAASD,GAAO0B,GAAMC,CAAG,GAAG,IAAI,CAAC,GAC1CE,IAAQ7B,GAAOW,GAAID,CAAI;AAC7B,SAAO;AAAA,IACL,IAAIX,GAAOA,GAAOW,GAAMT,GAAS4B,GAAO,IAAI,CAAC,CAAC,GAAGD,CAAM;AAAA,IACvD,IAAI7B,GAAOA,GAAOW,GAAMT,GAAS4B,GAAO,IAAI,CAAC,CAAC,GAAGD,CAAM;AAAA,EAAA;AAE3D;AAEO,SAASE,GAAWR,GAAUS,GAAUC,GAAUC,GAAUzD,GAAiB;AAClF,QAAM0D,IAAI,IAAI1D;AACd,SAAO;AAAA,IACL,GAAG0D,IAAIA,IAAIA,IAAIZ,EAAG,IAAI,IAAIY,IAAIA,IAAI1D,IAAIuD,EAAG,IAAI,IAAIG,IAAI1D,IAAIA,IAAIwD,EAAG,IAAIxD,IAAIA,IAAIA,IAAIyD,EAAG;AAAA,IACnF,GAAGC,IAAIA,IAAIA,IAAIZ,EAAG,IAAI,IAAIY,IAAIA,IAAI1D,IAAIuD,EAAG,IAAI,IAAIG,IAAI1D,IAAIA,IAAIwD,EAAG,IAAIxD,IAAIA,IAAIA,IAAIyD,EAAG;AAAA,EAAA;AAEvF;AAEO,SAASE,GACdb,GACAS,GACAC,GACAC,GACAzD,GAIA;AACA,QAAMkB,IAAIS,GAAQmB,GAAIS,GAAIvD,CAAC,GACrBmB,IAAIQ,GAAQ4B,GAAIC,GAAIxD,CAAC,GACrB4D,IAAIjC,GAAQ6B,GAAIC,GAAIzD,CAAC,GACrB6D,IAAIlC,GAAQT,GAAGC,GAAGnB,CAAC,GACnB8D,IAAInC,GAAQR,GAAGyC,GAAG5D,CAAC,GACnBmD,IAAMxB,GAAQkC,GAAGC,GAAG9D,CAAC;AAC3B,SAAO;AAAA,IACL,MAAM,EAAE,IAAIkB,GAAG,IAAI2C,GAAG,IAAIV,EAAA;AAAA,IAC1B,OAAO,EAAE,IAAIW,GAAG,IAAIF,GAAG,IAAIH,EAAA;AAAA,EAAG;AAElC;AAMO,SAASM,GACdjB,GACAkB,GACAC,GACAC,GACAC,GACAC,GACAC,GACyC;AACzC,MAAIpD,GAAM6B,GAAIuB,CAAE,UAAU,CAAA;AAC1B,MAAIC,IAAM,KAAK,IAAIN,CAAE,GACjBO,IAAM,KAAK,IAAIN,CAAE;AACrB,MAAIK,MAAQ,KAAKC,MAAQ,KAAK,CAAC,OAAO,SAASD,CAAG,KAAK,CAAC,OAAO,SAASC,CAAG;AACzE,WAAO,CAAA;AAGT,QAAMC,IAAQN,IAAmB,MAAO,KAAK,KAAM,KAC7CO,IAAS,KAAK,IAAID,CAAG,GACrBE,IAAS,KAAK,IAAIF,CAAG,GACrBG,KAAO7B,EAAG,IAAIuB,EAAG,KAAK,GACtBO,KAAO9B,EAAG,IAAIuB,EAAG,KAAK,GACtBQ,IAAMJ,IAASE,IAAMD,IAASE,GAC9BE,IAAM,CAACJ,IAASC,IAAMF,IAASG,GAC/BG,IAAUF,IAAMA,KAAQP,IAAMA,KAAQQ,IAAMA,KAAQP,IAAMA;AAChE,MAAIQ,IAAS,GAAG;AACd,UAAMC,IAAQ,KAAK,KAAKD,CAAM;AAC9B,IAAAT,KAAOU,GACPT,KAAOS;AAAA,EACT;AACA,QAAMC,IAAOX,IAAMA,GACbY,IAAOX,IAAMA,GACbY,IAAYF,IAAOC,IAAOD,IAAOH,IAAMA,IAAMI,IAAOL,IAAMA,GAC1DO,IAAcH,IAAOH,IAAMA,IAAMI,IAAOL,IAAMA,GAC9CQ,IACJ,KAAK,KAAK,KAAK,IAAI,GAAGF,IAAYC,CAAW,CAAC,KAAKjB,MAAaC,IAAQ,KAAK,IACzEkB,IAAOD,IAASf,IAAMQ,IAAOP,GAC7BgB,IAAO,CAACF,IAASd,IAAMM,IAAOP,GAC9BkB,KAAKf,IAASa,IAAMZ,IAASa,KAAOzC,EAAG,IAAIuB,EAAG,KAAK,GACnDoB,KAAKf,IAASY,IAAMb,IAASc,KAAOzC,EAAG,IAAIuB,EAAG,KAAK,GACnDqB,KAAMb,IAAMS,KAAOhB,GACnBqB,MAAMb,IAAMS,KAAOhB,GACnBqB,MAAM,CAACf,IAAMS,KAAOhB,GACpBuB,KAAM,CAACf,IAAMS,KAAOhB,GACpBuB,KAAS,KAAK,MAAMH,IAAID,CAAE;AAChC,MAAIK,KAAa,KAAK,MAAML,IAAKG,IAAKF,KAAKC,IAAIF,IAAKE,KAAKD,KAAKE,CAAE;AAChE,EAAI,CAACzB,KAAS2B,KAAa,IAAGA,MAAc,IAAI,KAAK,KAC5C3B,KAAS2B,KAAa,MAAGA,MAAc,IAAI,KAAK;AAEzD,QAAMC,KAAe,CAACC,MAAwB;AAC5C,UAAMC,KAAO,KAAK,IAAID,CAAK,GACrBE,KAAO,KAAK,IAAIF,CAAK;AAC3B,WAAO;AAAA,MACL,GAAGT,KAAKlB,IAAMG,IAASyB,KAAO3B,IAAMG,IAASyB;AAAA,MAC7C,GAAGV,KAAKnB,IAAMI,IAASwB,KAAO3B,IAAME,IAAS0B;AAAA,IAAA;AAAA,EAEjD,GACMC,KAAe,CAACH,MAAwB;AAC5C,UAAMC,KAAO,KAAK,IAAID,CAAK,GACrBE,KAAO,KAAK,IAAIF,CAAK,GACrBI,KAAK,CAAC/B,IAAM6B,IACZG,KAAK/B,IAAM2B;AACjB,WAAO;AAAA,MACL,GAAGzB,IAAS4B,KAAK3B,IAAS4B;AAAA,MAC1B,GAAG5B,IAAS2B,KAAK5B,IAAS6B;AAAA,IAAA;AAAA,EAE9B,GAEMC,KAA+C,CAAA;AACrD,MAAIC,KAAKV,IACLW,IAAYV;AAChB,SAAO,KAAK,IAAIU,CAAS,IAAI,QAAM;AACjC,UAAMC,IACJ,KAAK,KAAKD,CAAS,IAAI,KAAK,IAAI,KAAK,IAAIA,CAAS,GAAG,KAAK,KAAK,CAAC,GAC5DE,KAAKH,KAAKE,GACVE,KAAK,IAAI,IAAK,KAAK,IAAIF,IAAO,CAAC,GAC/BG,KAAQb,GAAaQ,EAAE,GACvBM,KAAMd,GAAaW,EAAE,GACrBI,KAAKX,GAAaI,EAAE,GACpBQ,KAAKZ,GAAaO,EAAE;AAC1B,IAAAJ,GAAI,KAAK;AAAA,MACP,IAAI,EAAE,GAAGM,GAAM,IAAID,KAAIG,GAAG,GAAG,GAAGF,GAAM,IAAID,KAAIG,GAAG,EAAA;AAAA,MACjD,IAAI,EAAE,GAAGD,GAAI,IAAIF,KAAII,GAAG,GAAG,GAAGF,GAAI,IAAIF,KAAII,GAAG,EAAA;AAAA,MAC7C,IAAIF;AAAA,IAAA,CACL,GACDN,KAAKG,IACLF,KAAaC;AAAA,EACf;AACA,SAAIH,GAAI,SAAS,MACfA,GAAIA,GAAI,SAAS,CAAC,EAAE,KAAKlF,GAASgD,CAAE,IAE/BkC;AACT;AAEO,SAASU,GAAiBpD,GAAuB;AACtD,QAAMqD,IAASC,GAAiBtD,CAAC,GAC3BuD,IAAoB,CAAA;AAC1B,MAAIzE,IAAkB,CAAA,GAClBC,IAAoB,CAAA,GACpByE,IAAI,GACJC,IAAI,GACJC,IAAS,GACTC,IAAS,GACTC,IAAwB,MACxBC,IAAI,GACJC,IAAM,IACNC,IAAU;AAEd,QAAMC,IAAU,MAAM,OAAOX,EAAOQ,GAAG,CAAC,GAElCI,IAAQ,CAACpF,MAAoB;AACjC,IACEA,KACAC,EAAQ,SAAS,KACjB1B,GAAM0B,EAAQ,CAAC,GAAGA,EAAQA,EAAQ,SAAS,CAAC,CAAC,KAE7CA,EAAQ,IAAA;AAEV,UAAMoF,IAAWrF,IAASC,EAAQ,SAAS,KAAK,IAAI,GAAGA,EAAQ,SAAS,CAAC;AACzE,WAAOC,EAAM,SAASmF,IAAU,CAAAnF,EAAM,IAAA;AACtC,WAAOA,EAAM,SAASmF,IAAU,CAAAnF,EAAM,KAAK,EAAE,MAAM,QAAQ;AAC3D,IAAID,EAAQ,UAAU,KACpByE,EAAM,KAAK;AAAA,MACT,QAAA1E;AAAA,MACA,SAASC,EAAQ,IAAItB,EAAQ;AAAA,MAC7B,OAAOuB,EAAM;AAAA,QAAI,CAACR,MAChBA,EAAK,SAAS,SACV,EAAE,MAAM,WACR,EAAE,MAAM,SAAS,IAAIf,GAASe,EAAK,EAAE,GAAG,IAAIf,GAASe,EAAK,EAAE,EAAA;AAAA,MAAE;AAAA,IACpE,CACD,GAEHO,IAAU,CAAA,GACVC,IAAQ,CAAA,GACRgF,IAAU;AAAA,EACZ,GAEMI,IAAa,CAAC1G,MACdqB,EAAQ,SAAS,KAAK1B,GAAM0B,EAAQA,EAAQ,SAAS,CAAC,GAAGrB,CAAC,IAAU,MACxEqB,EAAQ,KAAKtB,GAASC,CAAC,CAAC,GACjB;AAGT,SAAOoG,IAAIR,EAAO,UAAQ;AACxB,UAAMlH,IAAIkH,EAAOQ,CAAC;AAMlB,YALI,WAAW,KAAK1H,CAAC,MACnB2H,IAAM3H,GACN0H,MAGMC,GAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMM,IAAQN,MAAQ,KAChBO,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA;AACnC,QAAID,OAAe,EAAK,GACxBP,IAAIa,GACJZ,IAAIa,GACJZ,IAASF,GACTG,IAASF,GACTU,EAAW,EAAE,GAAAX,GAAG,GAAAC,GAAG,GACnBM,IAAU,IACVH,IAAW,MACXE,IAAMM,IAAQ,MAAM;AACpB;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMA,IAAQN,MAAQ;AACtB,QAAAN,IAAIY,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC5BP,IAAIW,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GACxBG,EAAW,EAAE,GAAAX,GAAG,GAAAC,EAAA,CAAG,KAAG1E,EAAM,KAAK,EAAE,MAAM,QAAQ,GACrD6E,IAAW;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,QAAAJ,IAAIM,MAAQ,MAAMN,IAAIQ,EAAA,IAAYA,EAAA,GAC9BG,EAAW,EAAE,GAAAX,GAAG,GAAAC,EAAA,CAAG,KAAG1E,EAAM,KAAK,EAAE,MAAM,QAAQ,GACrD6E,IAAW;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,QAAAH,IAAIK,MAAQ,MAAML,IAAIO,EAAA,IAAYA,EAAA,GAC9BG,EAAW,EAAE,GAAAX,GAAG,GAAAC,EAAA,CAAG,KAAG1E,EAAM,KAAK,EAAE,MAAM,QAAQ,GACrD6E,IAAW;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMQ,IAAQN,MAAQ,KAChBS,IAAKH,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BQ,IAAKJ,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BS,IAAKL,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BU,IAAKN,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA;AACnC,QAAIG,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,EAAE,GAAGwF,GAAI,GAAGC,EAAA;AAAA,UAChB,IAAI,EAAE,GAAGC,GAAI,GAAGC,EAAA;AAAA,QAAG,CACpB,GAEHd,IAAW,EAAE,GAAGa,GAAI,GAAGC,EAAA,GACvBlB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChBpE,IAAKkE,IACP,EAAE,GAAG,IAAIJ,IAAII,EAAS,GAAG,GAAG,IAAIH,IAAIG,EAAS,EAAA,IAC7C,EAAE,GAAAJ,GAAG,GAAAC,EAAA,GACHgB,IAAKL,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BU,IAAKN,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA;AACnC,QAAIG,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAAW;AAAA,UACA,IAAI,EAAE,GAAG+E,GAAI,GAAGC,EAAA;AAAA,QAAG,CACpB,GAEHd,IAAW,EAAE,GAAGa,GAAI,GAAGC,EAAA,GACvBlB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChBa,IAAKP,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BY,IAAKR,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7BK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7B,EAAE,IAAAtE,GAAI,IAAAC,EAAA,IAAOX,GAAiB,EAAE,GAAAwE,GAAG,GAAAC,KAAK,EAAE,GAAGkB,GAAI,GAAGC,KAAM,EAAE,GAAGP,GAAI,GAAGC,GAAI;AAChF,QAAIH,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK,EAAE,MAAM,SAAS,IAAAW,GAAI,IAAAC,GAAI,GAEtCiE,IAAW,EAAE,GAAGe,GAAI,GAAGC,EAAA,GACvBpB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChBa,IAAaf,IAAW,IAAIJ,IAAII,EAAS,IAAIJ,GAC7CoB,IAAahB,IAAW,IAAIH,IAAIG,EAAS,IAAIH,GAC7CY,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,IAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7B,EAAE,IAAAtE,GAAI,IAAAC,EAAA,IAAOX,GAAiB,EAAE,GAAAwE,GAAG,GAAAC,KAAK,EAAE,GAAGkB,GAAI,GAAGC,KAAM,EAAE,GAAGP,GAAI,GAAGC,GAAI;AAChF,QAAIH,EAAW,EAAE,GAAGE,GAAI,GAAGC,EAAA,CAAI,KAC7BvF,EAAM,KAAK,EAAE,MAAM,SAAS,IAAAW,GAAI,IAAAC,GAAI,GAEtCiE,IAAW,EAAE,GAAGe,GAAI,GAAGC,EAAA,GACvBpB,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,cAAMF,IAAQN,MAAQ,KAChB3D,IAAK6D,EAAA,GACL5D,IAAK4D,EAAA,GACLa,IAAMb,EAAA,GACN1D,IAAW0D,QAAc,GACzBzD,IAAQyD,QAAc,GACtBK,IAAKD,IAAQZ,IAAIQ,EAAA,IAAYA,EAAA,GAC7BM,KAAKF,IAAQX,IAAIO,EAAA,IAAYA,EAAA,GAC7Bc,KAAS5E;AAAA,UACb,EAAE,GAAAsD,GAAG,GAAAC,EAAA;AAAA,UACLtD;AAAA,UACAC;AAAA,UACAyE;AAAA,UACAvE;AAAA,UACAC;AAAA,UACA,EAAE,GAAG8D,GAAI,GAAGC,GAAA;AAAA,QAAG;AAEjB,YAAIQ,GAAO,WAAW;AACpB,UAAIX,EAAW,EAAE,GAAGE,GAAI,GAAGC,IAAI,KAAGvF,EAAM,KAAK,EAAE,MAAM,QAAQ;AAAA;AAE7D,qBAAWgG,KAASD;AAClB,YAAIX,EAAWY,EAAM,EAAE,KACrBhG,EAAM,KAAK,EAAE,MAAM,SAAS,IAAIgG,EAAM,IAAI,IAAIA,EAAM,GAAA,CAAI;AAI9D,QAAAnB,IAAW,MACXJ,IAAIa,GACJZ,IAAIa;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,KAAK;AACR,QAAKlH,GAAM,EAAE,GAAAoG,GAAG,GAAAC,EAAA,GAAK,EAAE,GAAGC,GAAQ,GAAGC,EAAA,CAAQ,KAC3C5E,EAAM,KAAK,EAAE,MAAM,OAAA,CAAQ,GAE7ByE,IAAIE,GACJD,IAAIE,GACJM,EAAM,EAAI,GACVL,IAAW;AACX;AAAA,MACF;AAAA,MACA;AACE,QAAAC;AACA;AAAA,IAAA;AAAA,EAEN;AAEA,SAAIE,OAAe,EAAK,GACjBR;AACT;AAEO,SAASyB,GAAYhH,GAAwB;AAClD,MAAIA,EAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,QAAMiH,IAAKjH,EAAK,QAAQ,CAAC;AACzB,MAAIgC,IAAI,KAAKxB,GAASyG,EAAG,CAAC,CAAC,IAAIzG,GAASyG,EAAG,CAAC,CAAC;AAC7C,QAAMxG,IAAIV,GAAUC,CAAI;AACxB,WAAS,IAAI,GAAG,IAAIS,GAAG,KAAK;AAC1B,UAAMH,IAAKH,GAAOH,GAAM,CAAC,GACnBO,IAAOP,EAAK,MAAM,CAAC;AAGzB,IADEA,EAAK,UAAU,MAAMS,IAAI,MAAM,CAACF,KAAQA,EAAK,SAAS,YAEpD,CAACA,KAAQA,EAAK,SAAS,SACzByB,KAAK,MAAMxB,GAASF,EAAG,CAAC,CAAC,IAAIE,GAASF,EAAG,CAAC,CAAC,KAE3C0B,KAAK,MAAMxB,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASD,EAAK,GAAG,CAAC,CAAC,IAAIC,GAASF,EAAG,CAAC,CAAC,IAAIE,GAASF,EAAG,CAAC,CAAC;AAAA,EAE3I;AACA,SAAIN,EAAK,WAAQgC,KAAK,OACfA;AACT;AAEO,SAASkF,GAAgB3B,GAAkC;AAChE,QAAM4B,IAAK5B,EACR,OAAO,CAACvF,MAASA,EAAK,QAAQ,UAAU,CAAC,EACzC,IAAIgH,EAAW,EACf,OAAO,OAAO;AACjB,MAAIG,EAAG,WAAW;AAChB,WAAO,EAAE,OAAO,IAAI,UAAU,CAAA,EAAC;AAEjC,QAAMC,IAAWC,GAAuBF,CAAE;AAC1C,SAAO;AAAA,IACL,GAAGC;AAAA,IACH,UAAUA,EAAS,SAAS;AAAA,MAAI,CAACxG,MAC/BA,EAAK,SAAS,KAAKxB,GAAMwB,EAAK,CAAC,GAAGA,EAAKA,EAAK,SAAS,CAAC,CAAC,IACnDA,EAAK,MAAM,GAAG,EAAE,IAChBA;AAAA,IAAA;AAAA,EACN;AAEJ;AAEA,MAAM0G,KAAmB,KAAK,KAAK,KAAM,KACnCC,KAAkB,GAClBC,KAAiB,GACjBC,KAAuB,OAEvBC,KAAuB;AAE7B,SAASC,GAAWC,GAAYC,GAAWjK,GAAoB;AAC7D,QAAMkK,IAAKD,EAAI,IAAID,EAAK,GAClBG,IAAKF,EAAI,IAAID,EAAK,GAClBI,IAAKpK,EAAK,IAAIiK,EAAI,GAClBI,IAAKrK,EAAK,IAAIiK,EAAI;AACxB,SAAO,KAAK,MAAMC,IAAKG,IAAKF,IAAKC,GAAIF,IAAKE,IAAKD,IAAKE,CAAE;AACxD;AAEA,SAASC,GAAiBC,GAAsB;AAC9C,MAAIA,EAAI,SAASZ,GAAiB,QAAO;AACzC,QAAMlI,IAAI8I,EAAI,CAAC,GACT7I,IAAI6I,EAAIA,EAAI,SAAS,CAAC,GACtB3G,IAAQ4G,GAAS/I,GAAGC,CAAC;AAC3B,MAAIkC,IAAQrC,GAAK,QAAO;AACxB,MAAIkJ,IAAS,GACTC,IAAO;AACX,WAASzC,IAAI,GAAGA,IAAIsC,EAAI,SAAS,GAAGtC,KAAK;AACvC,UAAM0C,IAAOC,GAAmBL,EAAItC,CAAC,GAAGxG,GAAGC,CAAC;AAC5C,IAAA+I,IAAS,KAAK,IAAIA,GAAQE,EAAK,QAAQ;AACvC,UAAM1I,IAAI,KAAK;AAAA,OACZP,EAAE,IAAID,EAAE,MAAM8I,EAAItC,CAAC,EAAE,IAAIxG,EAAE,MAAMC,EAAE,IAAID,EAAE,MAAM8I,EAAItC,CAAC,EAAE,IAAIxG,EAAE;AAAA,IAAA;AAE/D,QAAIQ,MAAM;AACV,UAAIyI,MAAS,EAAG,CAAAA,IAAOzI;AAAA,eACdA,MAAMyI,EAAM,QAAO;AAAA;AAAA,EAC9B;AAIA,MAHID,IAAS,KAAK,IAAIb,IAAgBhG,IAAQiG,EAAoB,KAG9DY,IAAS7G,IAAQkG;AACnB,WAAO;AAET,WAAS7B,IAAI,GAAGA,IAAIsC,EAAI,SAAS,GAAGtC;AAClC,QAAI,KAAK,IAAI8B,GAAWQ,EAAItC,IAAI,CAAC,GAAGsC,EAAItC,CAAC,GAAGsC,EAAItC,IAAI,CAAC,CAAC,CAAC,IAAIyB;AACzD,aAAO;AAGX,SAAO;AACT;AAEA,SAASmB,GAAmBN,GAAuB;AACjD,QAAM9H,IAAO8H,EAAI,CAAC,GACZ7H,IAAK6H,EAAIA,EAAI,SAAS,CAAC;AAC7B,MAAI9G,IAAO8G,EAAI,KAAK,MAAMA,EAAI,SAAS,CAAC,CAAC,GACrCE,IAAS;AACb,WAASxC,IAAI,GAAGA,IAAIsC,EAAI,SAAS,GAAGtC,KAAK;AACvC,UAAM7D,IAAIwG,GAAmBL,EAAItC,CAAC,GAAGxF,GAAMC,CAAE,EAAE;AAC/C,IAAI0B,IAAIqG,MACNA,IAASrG,GACTX,IAAO8G,EAAItC,CAAC;AAAA,EAEhB;AACA,QAAM,EAAE,IAAAnE,GAAI,IAAAC,EAAA,IAAOP,GAAoBf,GAAMC,GAAIe,CAAI;AACrD,SAAO,EAAE,MAAM,SAAS,IAAAK,GAAI,IAAAC,EAAA;AAC9B;AAMA,SAAS+G,GAAwBrI,GAAYqB,GAAUC,GAAUrB,GAAkB;AACjF,QAAMqI,IAAUC,GAAiBvI,GAAMqB,GAAIC,GAAIrB,GAAI,EAAE;AACrD,MAAI+H,IAAS;AACb,aAAWQ,KAASF;AAClB,IAAAN,IAAS,KAAK,IAAIA,GAAQG,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE,QAAQ;AAExE,SAAO+H;AACT;AAGO,SAASS,GAAezI,GAAYqB,GAAUC,GAAUrB,GAAmB;AAChF,QAAMkB,IAAQ4G,GAAS/H,GAAMC,CAAE,GACzByI,IAAML,GAAwBrI,GAAMqB,GAAIC,GAAIrB,CAAE;AACpD,SAAIkB,IAAQrC,KAAY4J,IAAM5J,KACvB4J,IAAMvH,IAAQkG;AACvB;AAEA,SAASsB,GAAqBhJ,GAA0B;AACtD,QAAM,IAAID,GAAUC,CAAI;AACxB,MAAIiJ,IAAU;AACd,QAAMlI,IAAQf,EAAK,MAAM,IAAI,CAACO,GAAMsF,MAC9BA,KAAK,KAAKtF,EAAK,SAAS,WACxB,CAACuI,GAAe7I,GAASD,GAAM6F,CAAC,GAAGtF,EAAK,IAAIA,EAAK,IAAIJ,GAAOH,GAAM6F,CAAC,CAAC,IAC/DtF,KAET0I,IAAU,IACH,EAAE,MAAM,OAAA,EAChB;AACD,SAAOA,IAAU,EAAE,GAAGjJ,GAAM,OAAAe,MAAUf;AACxC;AAEO,SAASkJ,GAAyBlJ,GAA0B;AACjE,QAAM,IAAIA,EAAK,QAAQ;AACvB,MAAI,IAAIuH,GAAiB,QAAOvH;AAChC,QAAMmJ,IAAM,CAACtD,OAAgBA,IAAI,IAAK,KAAK,GAErCuD,IAAW,CAACvD,MAChB7F,EAAK,SAASA,EAAK,MAAMmJ,EAAItD,IAAI,CAAC,CAAC,IAAIA,IAAI,IAAI7F,EAAK,MAAM6F,IAAI,CAAC,IAAI,QAC/DwD,IAAW,CAACxD,MAChB7F,EAAK,UAAyB6F,IAAI,IAAI,IAAxB7F,EAAK,MAAM6F,CAAC,IAAgC,QAEtDyD,IAAU,CAACzD,MAAuB;;AAEtC,WADI,CAAC7F,EAAK,WAAW6F,MAAM,KAAKA,MAAM,IAAI,QACtClM,IAAAyP,EAASvD,CAAC,MAAV,gBAAAlM,EAAa,UAAS,aAAW4P,IAAAF,EAASxD,CAAC,MAAV,gBAAA0D,EAAa,UAAS,UAClD,KAGP,KAAK;AAAA,MACH5B,GAAW3H,EAAK,QAAQmJ,EAAItD,IAAI,CAAC,CAAC,GAAG7F,EAAK,QAAQ6F,CAAC,GAAG7F,EAAK,QAAQmJ,EAAItD,IAAI,CAAC,CAAC,CAAC;AAAA,IAAA,IAC5EyB;AAAA,EAER;AAEA,MAAItC,IAAQ;AACZ,MAAIhF,EAAK,QAAQ;AACf,UAAMwJ,IAAQ,CAAC,GAAG,MAAM,CAAC,EAAE,KAAA,CAAM,EAAE,KAAKF,CAAO;AAC/C,QAAIE,KAAS,KAAM,QAAOxJ;AAC1B,IAAAgF,IAAQwE;AAAA,EACV;AAEA,QAAMC,IAAe,CAAA,GACfC,IAAmB,CAAA,GACnBC,IAAO3J,EAAK,SAAS,IAAI,IAAI,GAE7B4J,IAAU,CAACC,GAAeC,MAAgB;AAC9C,UAAM3B,IAAc,CAAA;AACpB,aAAS,IAAI0B,GAAO,KAAKC,GAAK;AAC5B,MAAA3B,EAAI,KAAKnI,EAAK,QAAQmJ,EAAInE,IAAQ,CAAC,CAAC,CAAC;AAEvC,UAAM+E,IAAY5B,EAAI,MAAM,GAAG,EAAE,EAAE,MAAM,CAAC6B,GAAGjF,MAAM;AACjD,YAAMxE,IAAOP,EAAK,MAAMmJ,EAAInE,IAAQ6E,IAAQ9E,CAAC,CAAC;AAC9C,aAAO,CAACxE,KAAQA,EAAK,SAAS;AAAA,IAChC,CAAC;AAED,QADIkJ,EAAK,WAAW,KAAGA,EAAK,KAAKjK,GAAS2I,EAAI,CAAC,CAAC,CAAC,GAC7C4B,KAAa7B,GAAiBC,CAAG,GAAG;AACtC,MAAAsB,EAAK,KAAKjK,GAAS2I,EAAIA,EAAI,SAAS,CAAC,CAAC,CAAC,GACvCuB,EAAK,KAAKjB,GAAmBN,CAAG,CAAC;AACjC;AAAA,IACF;AACA,aAASpD,IAAI,GAAGA,IAAIoD,EAAI,QAAQpD;AAC9B,MAAA0E,EAAK,KAAKjK,GAAS2I,EAAIpD,CAAC,CAAC,CAAC,GAC1B2E,EAAK,KAAK1J,EAAK,MAAMmJ,EAAInE,IAAQ6E,IAAQ9E,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,QAAQ;AAAA,EAExE;AAEA,MAAIkF,IAAO;AACX,WAASC,IAAI,GAAGA,KAAKP,GAAMO,KAAK;AAC9B,UAAMrE,IAAIsD,EAAInE,IAAQkF,CAAC;AACvB,KAAIA,MAAMP,KAAQL,EAAQzD,CAAC,OACzB+D,EAAQK,GAAMC,CAAC,GACfD,IAAOC;AAAA,EAEX;AAEA,EACElK,EAAK,UACLyJ,EAAK,SAAS,KACdrK,GAAMqK,EAAK,CAAC,GAAGA,EAAKA,EAAK,SAAS,CAAC,CAAC,KAEpCA,EAAK,IAAA;AAEP,QAAMvD,IAAWlG,EAAK,SAASyJ,EAAK,SAAS,KAAK,IAAI,GAAGA,EAAK,SAAS,CAAC;AACxE,SAAOC,EAAK,SAASxD,IAAU,CAAAwD,EAAK,IAAA;AACpC,SAAID,EAAK,SAAS,IAAUzJ,IACrB,EAAE,QAAQA,EAAK,QAAQ,SAASyJ,GAAM,OAAOC,EAAA;AACtD;AAEO,SAASS,GAAgB/C,GAAqC;AACnE,QAAMgD,IAAYhD,EAAS,MAAM,QAAQ,CAAC3H,MAAM2F,GAAiB3F,EAAE,CAAC,CAAC;AAMrE,UALe2K,EAAU,KAAK,CAACpK,MAASA,EAAK,QAAQ,UAAU,CAAC,IAC5DoK,EAAU,OAAO,CAACpK,MAASA,EAAK,QAAQ,UAAU,CAAC,IACnDoH,EAAS,SACN,OAAO,CAACxG,MAASA,EAAK,UAAU,CAAC,EACjC,IAAI,CAACA,MAASD,GAAgBC,GAAM,EAAI,CAAC,GAClC,IAAI,CAACZ,MAASgJ,GAAqBE,GAAyBlJ,CAAI,CAAC,CAAC;AAClF;AAGO,SAASqK,GAAgBrK,GAAgBE,GAAmB2I,GAAmB;AACpF,QAAMxI,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAC9C,SAAIK,EAAK,SAAS,UACT+J,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,EAAE,QAErDkI,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE;AAC7C;AAEO,SAASgK,GACdzB,GACA5H,GACAS,GACAC,GACAC,GAC8C;AAC9C,QAAM+G,IAAUC,GAAiB3H,GAAIS,GAAIC,GAAIC,GAAI,EAAE;AACnD,MAAI2I,IAAQ,GACRC,IAAS7B,EAAQ,CAAC,GAClB8B,IAAQrC,GAASS,GAAOF,EAAQ,CAAC,CAAC;AACtC,WAAS9C,IAAI,GAAGA,IAAI8C,EAAQ,QAAQ9C,KAAK;AACvC,UAAM7D,IAAIoG,GAASS,GAAOF,EAAQ9C,CAAC,CAAC;AACpC,IAAI7D,IAAIyI,MACNA,IAAQzI,GACRwI,IAAS7B,EAAQ9C,CAAC,GAClB0E,IAAQ1E,KAAK8C,EAAQ,SAAS;AAAA,EAElC;AACA,SAAO,EAAE,GAAG4B,GAAO,OAAOC,GAAQ,UAAUC,EAAA;AAC9C;ACnsBA,SAASC,GAAcC,GAA8B;AACnD,SAAOA,EAAS,IAAI,CAAC/J,MAASA,EAAK,IAAI,CAACnB,OAAO,EAAE,GAAGA,EAAE,GAAG,GAAGA,EAAE,EAAA,EAAI,CAAC;AACrE;AAGO,SAASmL,GAAgBD,GAA4B;AAC1D,SAAOA,EACJ,IAAI,CAAC/J,MAAS;AACb,QAAIA,EAAK,WAAW,EAAG,QAAO;AAC9B,QAAIoB,IAAI,KAAKpB,EAAK,CAAC,EAAE,CAAC,IAAIA,EAAK,CAAC,EAAE,CAAC;AACnC,aAASiF,IAAI,GAAGA,IAAIjF,EAAK,QAAQiF;AAC/B,MAAA7D,KAAK,MAAMpB,EAAKiF,CAAC,EAAE,CAAC,IAAIjF,EAAKiF,CAAC,EAAE,CAAC;AAEnC,WAAA7D,KAAK,MACEA;AAAA,EACT,CAAC,EACA,KAAK,GAAG;AACb;AAEO,SAAS6I,GAAmBF,GAAmC;AACpE,QAAMG,IAAUH,EACb,IAAI,CAAC/J,MAEFA,EAAK,SAAS,KACdA,EAAK,CAAC,EAAE,MAAMA,EAAKA,EAAK,SAAS,CAAC,EAAE,KACpCA,EAAK,CAAC,EAAE,MAAMA,EAAKA,EAAK,SAAS,CAAC,EAAE,IAE7BA,EAAK,MAAM,GAAG,EAAE,IAElBA,CACR,EACA,OAAO,CAACA,MAASA,EAAK,UAAU,CAAC;AACpC,SAAO;AAAA,IACL,OAAOkK,EAAQ,IAAI,CAAClK,OAAU;AAAA,MAC5B,GAAGgK,GAAgB,CAAChK,CAAI,CAAC;AAAA,MACzB,QAAQ;AAAA,IAAA,EACR;AAAA,IACF,UAAUkK;AAAA,EAAA;AAEd;AAEA,SAASC,GAAYxF,GAAkC;AACrD,SAAO2B,GAAgB3B,CAAK;AAC9B;AAEA,SAASyF,GAAkBhL,GAAgBiL,GAAoC;AAC7E,SAAIjL,EAAK,UACCiL,IAAc,IAAIjL,EAAK,QAAQ,UAAUA,EAAK,QAAQ,SAEzDiL,IAAc,IAAIA,IAAc,IAAI;AAC7C;AAEA,SAASC,GAAkBlL,GAAgBiL,GAAoC;AAC7E,SAAIjL,EAAK,UACFiL,IAAcjL,EAAK,QAAQ,SAAS,IADnBiL,IACqC;AAC/D;AAEO,SAASE,GACd/D,GACA5C,GACAC,GACe;AACf,QAAM2G,IAAQ,EAAE,GAAG5G,GAAI,GAAGC,EAAA,GACpBc,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAI,CAACpH,OAAU;AAAA,IACrD,QAAQA,EAAK;AAAA,IACb,SAASA,EAAK,QAAQ,IAAI,CAACP,MAAMC,GAAOD,GAAG2L,CAAK,CAAC;AAAA,IACjD,OAAOpL,EAAK,MAAM;AAAA,MAAI,CAACO,MACrBA,EAAK,SAAS,SACV,EAAE,MAAM,WACR;AAAA,QACE,MAAM;AAAA,QACN,IAAIb,GAAOa,EAAK,IAAI6K,CAAK;AAAA,QACzB,IAAI1L,GAAOa,EAAK,IAAI6K,CAAK;AAAA,MAAA;AAAA,IAC3B;AAAA,EACN,EACA;AACF,MAAI7F,EAAM,WAAW,GAAG;AACtB,UAAMoF,IAAWD,GAActD,EAAS,QAAQ,EAAE;AAAA,MAAI,CAACxG,MACrDA,EAAK,IAAI,CAACnB,OAAO,EAAE,GAAGA,EAAE,IAAI+E,GAAI,GAAG/E,EAAE,IAAIgF,IAAK;AAAA,IAAA;AAEhD,WAAOoG,GAAmBF,CAAQ;AAAA,EACpC;AACA,SAAOI,GAAYxF,CAAK;AAC1B;AAGO,SAAS8F,GACdjE,GACAkE,GACApL,GACAkL,GACe;AACf,MAAIA,EAAM,MAAM,KAAKA,EAAM,MAAM,EAAG,QAAOhE;AAC3C,QAAM7B,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AACnE,QAAMmE,IAAUrL,GACVsL,KAAStL,IAAY,KAAKF,EAAK,QAAQ;AAC7C,EAAAA,EAAK,QAAQuL,CAAO,IAAI7L,GAAOM,EAAK,QAAQuL,CAAO,GAAGH,CAAK,GAC3DpL,EAAK,QAAQwL,CAAK,IAAI9L,GAAOM,EAAK,QAAQwL,CAAK,GAAGJ,CAAK;AACvD,QAAM7K,IAAOP,EAAK,MAAME,CAAS;AACjC,GAAIK,KAAA,gBAAAA,EAAM,UAAS,YACjBA,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK,GAC/B7K,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK;AAEjC,QAAMhC,IAAW4B,GAAkBhL,GAAMuL,CAAO;AAChD,MAAInC,KAAY,QAAQA,MAAalJ,GAAW;AAC9C,UAAM0H,IAAO5H,EAAK,MAAMoJ,CAAQ;AAChC,KAAIxB,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAKlI,GAAOkI,EAAK,IAAIwD,CAAK;AAAA,EAC7D;AACA,QAAM/B,IAAW6B,GAAkBlL,GAAMwL,CAAK;AAC9C,MAAInC,KAAY,QAAQA,MAAanJ,GAAW;AAC9C,UAAMtC,IAAOoC,EAAK,MAAMqJ,CAAQ;AAChC,KAAIzL,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAK8B,GAAO9B,EAAK,IAAIwN,CAAK;AAAA,EAC7D;AACA,SAAOL,GAAYxF,CAAK;AAC1B;AAGO,SAASkG,GACdrE,GACAsE,GACAC,GACQ;AAER,QAAM3L,IADQmK,GAAgB/C,CAAQ,EACnBsE,CAAY;AAC/B,MAAI,CAAC1L,KAAQA,EAAK,QAAQ,SAAS,UAAU,CAAA;AAC7C,MAAI2L,IAAc,KAAKA,KAAe3L,EAAK,QAAQ,eAAe,CAAA;AAClE,QAAM4L,IAAQ5L,EAAK,QAAQ,QACrB4H,IAAO5H,EAAK,SAAS2L,IAAc,IAAIC,KAASA,CAAK,GACrDhO,IAAOoC,EAAK,SAAS2L,IAAc,KAAKC,CAAK,GAC7CzO,IAAS,CAACqC,GAASoI,CAAI,CAAC;AAC9B,UAAIA,EAAK,MAAMhK,EAAK,KAAKgK,EAAK,MAAMhK,EAAK,MAAGT,EAAO,KAAKqC,GAAS5B,CAAI,CAAC,GAC/DT;AACT;AAEO,SAAS0O,GACdzE,GACAsE,GACAC,GACA9C,GACe;AACf,QAAMtD,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAMmG,CAAY;AAC/B,MAAI,CAAC1L,KAAQ2L,IAAc,KAAKA,KAAe3L,EAAK,QAAQ;AAC1D,WAAOoH;AAET,QAAMQ,IAAO5H,EAAK,QAAQ2L,CAAW,GAC/BP,IAAQzL,GAAOkJ,GAAOjB,CAAI;AAChC,EAAA5H,EAAK,QAAQ2L,CAAW,IAAInM,GAASqJ,CAAK;AAC1C,QAAMO,IAAW4B,GAAkBhL,GAAM2L,CAAW,GAC9CtC,IAAW6B,GAAkBlL,GAAM2L,CAAW;AACpD,MAAIvC,KAAY,MAAM;AACpB,UAAM7I,IAAOP,EAAK,MAAMoJ,CAAQ;AAChC,KAAI7I,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK;AAAA,EAC7D;AACA,MAAI/B,KAAY,MAAM;AACpB,UAAM9I,IAAOP,EAAK,MAAMqJ,CAAQ;AAChC,KAAI9I,KAAA,gBAAAA,EAAM,UAAS,YAASA,EAAK,KAAKb,GAAOa,EAAK,IAAI6K,CAAK;AAAA,EAC7D;AACA,SAAOL,GAAYxF,CAAK;AAC1B;AAEO,SAASuG,GACd1E,GACAkE,GACApL,GACA6L,GACAlD,GACe;AACf,QAAMtD,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS,GACtB/K,IAAOP,KAAA,gBAAAA,EAAM,MAAME;AACzB,SAAI,CAACK,KAAQA,EAAK,SAAS,UAAgB6G,KACvC2E,MAAW,IAAGxL,EAAK,KAAKf,GAASqJ,CAAK,IACrCtI,EAAK,KAAKf,GAASqJ,CAAK,GACtBkC,GAAYxF,CAAK;AAC1B;AAGO,SAASyG,GACd5E,GACAkE,GACApL,GACe;AACf,QAAMqF,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS,GACtB/K,IAAOP,KAAA,gBAAAA,EAAM,MAAME;AACzB,SAAI,CAACK,KAAQA,EAAK,SAAS,UAAgB6G,KAC3CpH,EAAK,MAAME,CAAS,IAAI,EAAE,MAAM,OAAA,GACzB6K,GAAYxF,CAAK;AAC1B;AAGO,SAAS0G,GACd7E,GACAkE,GACApL,GACAmB,GACe;AACf,QAAMkE,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AACnE,QAAM/G,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3B,EAAE,IAAAwB,GAAI,IAAAC,EAAA,IAAOP,GAAoBf,GAAMC,GAAIe,CAAI;AACrD,SAAArB,EAAK,MAAME,CAAS,IAAI,EAAE,MAAM,SAAS,IAAAwB,GAAI,IAAAC,EAAA,GACtCoJ,GAAYxF,CAAK;AAC1B;AAKO,SAAS2G,GACd9E,GACAsE,GACAS,GACAtD,GACe;AACf,QAAMtD,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAMmG,CAAY;AAC/B,MAAI,CAAC1L,KAAQmM,IAAmB,KAAKA,KAAoBnM,EAAK,QAAQ;AACpE,WAAOoH;AAET,QAAMlH,IAAYgL,GAAkBlL,GAAMmM,CAAgB;AAC1D,MAAIjM,KAAa,KAAM,QAAOkH;AAC9B,QAAM7G,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA,GACxCG,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS;AAEjC,MAAIK,EAAK,SAAS,SAAS;AACzB,UAAM,EAAE,GAAApC,EAAA,IAAMmM,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,GACzD8L,IAAS,KAAK,IAAI,MAAM,KAAK,IAAI,MAAMjO,CAAC,CAAC,GACzCkO,IAAQvK,GAAWzB,GAAME,EAAK,IAAIA,EAAK,IAAID,GAAI8L,CAAM;AAC3D,IAAApM,EAAK,QAAQ,OAAOmM,IAAmB,GAAG,GAAG3M,GAAS6M,EAAM,KAAK,EAAE,CAAC,GACpErM,EAAK,MAAM,OAAOE,GAAW,GAAG,EAAE,MAAM,SAAS,IAAImM,EAAM,KAAK,IAAI,IAAIA,EAAM,KAAK,MAAM;AAAA,MACvF,MAAM;AAAA,MACN,IAAIA,EAAM,MAAM;AAAA,MAChB,IAAIA,EAAM,MAAM;AAAA,IAAA,CACjB;AAAA,EACH;AACE,IAAArM,EAAK,QAAQ,OAAOmM,IAAmB,GAAG,GAAG3M,GAASqJ,CAAK,CAAC,GAC5D7I,EAAK,MAAM,OAAOE,GAAW,GAAG,EAAE,MAAM,OAAA,GAAU,EAAE,MAAM,OAAA,CAAQ;AAEpE,SAAO6K,GAAYxF,CAAK;AAC1B;AAGO,SAAS+G,GACdlF,GACAsE,GACAC,GACe;AACf,QAAMpG,IAAQ4E,GAAgB/C,CAAQ,GAChCpH,IAAOuF,EAAMmG,CAAY;AAC/B,MAAI,CAAC1L,EAAM,QAAOoH;AAClB,QAAMmF,IAAMvM,EAAK,SAAS,IAAI;AAE9B,MADIA,EAAK,QAAQ,UAAUuM,KACvBZ,IAAc,KAAKA,KAAe3L,EAAK,QAAQ,OAAQ,QAAOoH;AAElE,QAAM3G,IAAIT,EAAK,QAAQ;AACvB,MAAIA,EAAK,QAAQ;AACf,IAAAA,EAAK,QAAQ,OAAO2L,GAAa,CAAC,GAClC3L,EAAK,MAAM,OAAO2L,GAAa,CAAC;AAChC,UAAMa,IAAOb,MAAgB,IAAI3L,EAAK,QAAQ,SAAS,IAAI2L,IAAc;AACzE,IAAI3L,EAAK,MAAMwM,CAAI,MAAGxM,EAAK,MAAMwM,CAAI,IAAI,EAAE,MAAM,OAAA;AAAA,EACnD,MAAA,CAAWb,MAAgB,KACzB3L,EAAK,QAAQ,OAAO,GAAG,CAAC,GACxBA,EAAK,MAAM,OAAO,GAAG,CAAC,KACb2L,MAAgBlL,IAAI,KAC7BT,EAAK,QAAQ,IAAA,GACbA,EAAK,MAAM,IAAA,MAEXA,EAAK,QAAQ,OAAO2L,GAAa,CAAC,GAClC3L,EAAK,MAAM,OAAO2L,GAAa,CAAC,GAChC3L,EAAK,MAAM2L,IAAc,CAAC,IAAI,EAAE,MAAM,OAAA;AAExC,SAAOZ,GAAYxF,CAAK;AAC1B;AAUO,SAASkH,GACdrF,GACAyB,GACA6D,GACkB;AAClB,MAAIC,IAAyB;AAC7B,SAAAxC,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAM0L,MAAiB;AACxD,IAAA1L,EAAK,QAAQ,QAAQ,CAAC4M,GAAQjB,MAAgB;AAC5C,YAAMvD,IAAW,KAAK,MAAMwE,EAAO,IAAI/D,EAAM,GAAG+D,EAAO,IAAI/D,EAAM,CAAC;AAClE,MAAIT,KAAYsE,MAAc,CAACC,KAAQvE,IAAWuE,EAAK,cACrDA,IAAO;AAAA,QACL,cAAAjB;AAAA,QACA,aAAAC;AAAA,QACA,OAAO,EAAE,GAAGiB,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,QAChC,UAAAxE;AAAA,MAAA;AAAA,IAGN,CAAC;AAAA,EACH,CAAC,GACMuE;AACT;AAUO,SAASE,GACdzF,GACAyB,GACA6D,GACkB;AAClB,MAAIC,IAAyB;AAC7B,SAAAxC,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAMsL,MAAc;AACrD,UAAM7K,IAAIV,GAAUC,CAAI;AACxB,aAASE,IAAY,GAAGA,IAAYO,GAAGP,KAAa;AAClD,YAAMK,IAAOP,EAAK,MAAME,CAAS;AACjC,WAAIK,KAAA,gBAAAA,EAAM,UAAS;AACnB,mBAAWwL,KAAU,CAAC,GAAG,CAAC,GAAY;AACpC,gBAAMe,IAAKf,MAAW,IAAIxL,EAAK,KAAKA,EAAK,IACnC6H,IAAW,KAAK,MAAM0E,EAAG,IAAIjE,EAAM,GAAGiE,EAAG,IAAIjE,EAAM,CAAC;AAC1D,UAAIT,KAAYsE,MAAc,CAACC,KAAQvE,IAAWuE,EAAK,cACrDA,IAAO,EAAE,WAAArB,GAAW,WAAApL,GAAW,QAAA6L,GAAQ,OAAOvM,GAASsN,CAAE,GAAG,UAAA1E,EAAA;AAAA,QAEhE;AAAA,IACF;AAAA,EACF,CAAC,GACMuE;AACT;AAWA,SAASI,GACP3F,GACAyB,GACA6D,GACAM,GACgB;AAChB,MAAIL,IAAuB;AAC3B,SAAAxC,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAM0L,MAAiB;AACxD,UAAMjL,IAAIV,GAAUC,CAAI;AACxB,aAAS6F,IAAI,GAAGA,IAAIpF,GAAGoF,KAAK;AAC1B,YAAM,IAAI5F,GAASD,GAAM6F,CAAC,GACpBvG,IAAIa,GAAOH,GAAM6F,CAAC,GAClBtF,IAAOP,EAAK,MAAM6F,CAAC,KAAK,EAAE,MAAM,OAAA;AACtC,UAAIoH,GACAC;AACJ,UAAIF;AACF,QAAAC,IACE1M,EAAK,SAAS,UACVkB,GAAW,GAAGlB,EAAK,IAAIA,EAAK,IAAIjB,GAAG,GAAG,IACtC,EAAE,IAAI,EAAE,IAAIA,EAAE,KAAK,GAAG,IAAI,EAAE,IAAIA,EAAE,KAAK,EAAA,GAC7C4N,IAAO,KAAK,MAAMD,EAAU,IAAIpE,EAAM,GAAGoE,EAAU,IAAIpE,EAAM,CAAC;AAAA,eACrDtI,EAAK,SAAS,SAAS;AAChC,cAAM4M,IAAO7C,GAAgBzB,GAAO,GAAGtI,EAAK,IAAIA,EAAK,IAAIjB,CAAC;AAC1D,QAAA2N,IAAYE,EAAK,OACjBD,IAAOC,EAAK;AAAA,MACd,OAAO;AACL,cAAM5E,IAAOC,GAAmBK,GAAO,GAAGvJ,CAAC;AAC3C,QAAA2N,IAAY1E,EAAK,OACjB2E,IAAO3E,EAAK;AAAA,MACd;AACA,MAAI2E,KAAQR,MAAc,CAACC,KAAQO,IAAOP,EAAK,cAC7CA,IAAO;AAAA,QACL,cAAAjB;AAAA,QACA,kBAAkB7F;AAAA,QAClB,OAAOoH;AAAA,QACP,UAAUC;AAAA,QACV,MAAM3M,EAAK;AAAA,MAAA;AAAA,IAGjB;AAAA,EACF,CAAC,GACMoM;AACT;AAGO,SAASS,GACdhG,GACAyB,GACA6D,GACgB;AAChB,SAAOK,GAAQ3F,GAAUyB,GAAO6D,GAAW,EAAI;AACjD;AAGO,SAASW,GACdjG,GACAyB,GACA6D,GACgB;AAChB,SAAOK,GAAQ3F,GAAUyB,GAAO6D,GAAW,EAAK;AAClD;AC3ZA,MAAMY,KAAkB;AAoCjB,SAASC,GAAiBC,GAA0B;AACzD,SAAOA,MAAS,UAAUA,MAAS,aAAaA,MAAS;AAC3D;AAEO,SAASC,GAAYpO,GAAcC,GAAuB;AAC/D,SAAOD,EAAE,YAAYC,EAAE,WAAWD,EAAE,cAAcC,EAAE,aAAaD,EAAE,QAAQC,EAAE;AAC/E;AAEA,SAASoO,GAAUnN,GAA0B;AAC3C,SAAOA,EAAK,SAAS,SACjB,EAAE,MAAM,OAAA,IACR,EAAE,MAAM,SAAS,IAAIf,GAASe,EAAK,EAAE,GAAG,IAAIf,GAASe,EAAK,EAAE,EAAA;AAClE;AAEA,SAASoN,GAAU3N,GAA0B;AAC3C,SAAO;AAAA,IACL,QAAQA,EAAK;AAAA,IACb,SAASA,EAAK,QAAQ,IAAIR,EAAQ;AAAA,IAClC,OAAOQ,EAAK,MAAM,IAAI0N,EAAS;AAAA,EAAA;AAEnC;AAEA,SAASE,GAAYrN,GAA0B;AAC7C,SAAIA,EAAK,SAAS,SAAe,EAAE,MAAM,OAAA,IAClC,EAAE,MAAM,SAAS,IAAIf,GAASe,EAAK,EAAE,GAAG,IAAIf,GAASe,EAAK,EAAE,EAAA;AACrE;AAEA,SAASsN,GAAY7N,GAA0B;AAC7C,SAAO;AAAA,IACL,QAAQA,EAAK;AAAA,IACb,SAASA,EAAK,QAAQ,IAAIR,EAAQ,EAAE,QAAA;AAAA,IACpC,OAAOQ,EAAK,MAAM,IAAI0N,EAAS,EAAE,QAAA,EAAU,IAAIE,EAAW;AAAA,EAAA;AAE9D;AAEA,SAASE,GAAqB9N,GAAgB+N,GAAuB;AACnE,MAAI/N,EAAK,UAAUA,EAAK,QAAQ,SAAS,EAAG,QAAOA;AACnD,QAAMgO,IAAQhO,EAAK,QAAQ,CAAC,GACtBiK,IAAOjK,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC;AACjD,MAAI,CAACZ,GAAM4O,GAAO/D,GAAM8D,CAAG,EAAG,QAAO/N;AACrC,QAAMpC,IAAO+P,GAAU3N,CAAI;AAC3B,EAAApC,EAAK,QAAQ,IAAA,GACbA,EAAK,SAAS;AACd,QAAMsI,IAAWtI,EAAK,QAAQ;AAC9B,SAAOA,EAAK,MAAM,SAASsI,IAAU,CAAAtI,EAAK,MAAM,IAAA;AAChD,SAAOA,EAAK,MAAM,SAASsI,IAAU,CAAAtI,EAAK,MAAM,KAAK,EAAE,MAAM,QAAQ;AACrE,SAAOA;AACT;AAEO,SAASqQ,GAAa7G,GAI1B;AACD,QAAM1C,IAAuE,CAAA;AAC7E,SAAAyF,GAAgB/C,CAAQ,EAAE,QAAQ,CAACpH,GAAMsL,MAAc;AACrD,IAAItL,EAAK,UAAUA,EAAK,QAAQ,SAAS,MACzC0E,EAAI,KAAK;AAAA,MACP,WAAA4G;AAAA,MACA,KAAK;AAAA,MACL,OAAO9L,GAASQ,EAAK,QAAQ,CAAC,CAAC;AAAA,IAAA,CAChC,GACD0E,EAAI,KAAK;AAAA,MACP,WAAA4G;AAAA,MACA,KAAK;AAAA,MACL,OAAO9L,GAASQ,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC,CAAC;AAAA,IAAA,CACtD;AAAA,EACH,CAAC,GACM0E;AACT;AAEA,SAASwJ,GAAelO,GAAgBE,GAAmB2I,GAAqB;AAC9E,QAAMxI,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAC9C,SAAIK,EAAK,SAAS,UACT+J,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,EAAE,WAErDkI,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE;AAC7C;AAEA,SAAS6N,GAAoBtF,GAAa7I,GAAgB+N,GAAsB;AAC9E,QAAMtN,IAAIV,GAAUC,CAAI;AACxB,WAAS,IAAI,GAAG,IAAIS,GAAG;AACrB,QAAIyN,GAAelO,GAAM,GAAG6I,CAAK,KAAKkF,EAAK,QAAO;AAEpD,SAAO;AACT;AAEO,SAASK,GACd/N,GACAC,GACA+N,GACAN,IAAMT,IACG;AACT,QAAMhM,IAAM,EAAE,IAAIjB,EAAK,IAAIC,EAAG,KAAK,GAAG,IAAID,EAAK,IAAIC,EAAG,KAAK,EAAA;AAC3D,aAAWgO,KAASD,GAAQ;AAQ1B,QAPclE,GAAgBmE,EAAM,QAAQ,EACnB;AAAA,MACvB,CAACtO,MACCmO,GAAoB9N,GAAML,GAAM+N,CAAG,KACnCI,GAAoB7N,GAAIN,GAAM+N,CAAG,KACjCI,GAAoB7M,GAAKtB,GAAM+N,CAAG;AAAA,IAAA,EAEtB,QAAO;AACvB,UAAMQ,IAAON,GAAaK,EAAM,QAAQ;AACxC,QAAIC,EAAK,UAAU,GAAG;AACpB,YAAMpB,IAAO,CAAC,MACZoB,EAAK,KAAK,CAACtJ,MAAQmD,GAASnD,EAAI,OAAO,CAAC,KAAK8I,CAAG;AAClD,UAAIZ,EAAK9M,CAAI,KAAK8M,EAAK7M,CAAE,EAAG,QAAO;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASkO,GACPnO,GACAC,GACAuI,GACA4F,GAC+B;AAC/B,QAAMjK,IAAKlE,EAAG,IAAID,EAAK,GACjBoE,IAAKnE,EAAG,IAAID,EAAK,GACjBqO,IAAM,KAAK,MAAMlK,GAAIC,CAAE;AAC7B,MAAIiK,IAAM,KAAM,QAAO;AACvB,QAAMC,IAAO,KAAK,IAAI,KAAK,IAAIF,GAAK,IAAI,IAAI,GAAGC,IAAM,GAAG;AACxD,MAAIC,IAAO,KAAM,QAAO;AACxB,QAAM9K,IAAKW,IAAKkK,GACV5K,IAAKW,IAAKiK,GACVnG,IAAOC,GAAmBK,GAAOxI,GAAMC,CAAE,EAAE;AACjD,MAAInC,KAAKoK,EAAK,IAAIlI,EAAK,KAAKwD,KAAM0E,EAAK,IAAIlI,EAAK,KAAKyD;AACrD,SAAA3F,IAAI,KAAK,IAAIuQ,IAAMC,GAAM,KAAK,IAAIA,GAAMxQ,CAAC,CAAC,GACnC;AAAA,IACL,IAAI,EAAE,GAAGkC,EAAK,IAAIwD,KAAM1F,IAAIwQ,IAAO,GAAGtO,EAAK,IAAIyD,KAAM3F,IAAIwQ,GAAA;AAAA,IACzD,IAAI,EAAE,GAAGtO,EAAK,IAAIwD,KAAM1F,IAAIwQ,IAAO,GAAGtO,EAAK,IAAIyD,KAAM3F,IAAIwQ,GAAA;AAAA,EAAM;AAEnE;AAEA,SAASC,GACPvO,GACAE,GACAD,GACAuI,GACA4F,GAMO;AACP,QAAM,EAAE,GAAAtQ,EAAA,IAAMmM,GAAgBzB,GAAOxI,GAAME,EAAK,IAAIA,EAAK,IAAID,CAAE,GACzDkB,IAAQ,KAAK,MAAMlB,EAAG,IAAID,EAAK,GAAGC,EAAG,IAAID,EAAK,CAAC,GAC/CwO,IACJrN,IAAQ,OACJ,KAAK,IAAI,MAAM,KAAK,IAAI,MAAOiN,KAAO,IAAIjN,EAAM,CAAC,IACjD,OACAsD,IAAK,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM3G,IAAI0Q,CAAE,CAAC,GAC1CC,IAAK,KAAK,IAAI,MAAM,KAAK,IAAIhK,IAAK,OAAO3G,IAAI0Q,CAAE,CAAC;AACtD,MAAIC,IAAKhK,IAAK,KAAM,QAAO;AAC3B,QAAMkJ,IAAQlM,GAAWzB,GAAME,EAAK,IAAIA,EAAK,IAAID,GAAIwE,CAAE,GACjDiK,KAASD,IAAKhK,KAAM,KAAK,IAAI,MAAM,IAAIA,CAAE,GACzCkK,IAASlN;AAAA,IACbkM,EAAM,KAAK;AAAA,IACXA,EAAM,MAAM;AAAA,IACZA,EAAM,MAAM;AAAA,IACZ1N;AAAA,IACAyO;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,IAAIvP,GAASwO,EAAM,KAAK,EAAE;AAAA,IAC1B,IAAIxO,GAASwP,EAAO,KAAK,EAAE;AAAA,IAC3B,UAAU,EAAE,MAAM,SAAS,IAAIhB,EAAM,KAAK,IAAI,IAAIA,EAAM,KAAK,GAAA;AAAA,IAC7D,WAAW,EAAE,MAAM,SAAS,IAAIgB,EAAO,MAAM,IAAI,IAAIA,EAAO,MAAM,GAAA;AAAA,EAAG;AAEzE;AAEA,SAASC,GACPjP,GACAE,GACAsC,GACArB,GACA+N,GACAC,GACU;AACV,QAAM1O,IAAIT,EAAK,QAAQ,QACjBuL,IAAUrL,GACVsL,KAAStL,IAAY,KAAKO,GAC1BK,IAAU,CAACtB,GAAS2B,CAAE,GAAG3B,GAASQ,EAAK,QAAQwL,CAAK,CAAC,CAAC,GACtDzK,IAAoB,CAAC2M,GAAUyB,CAAS,CAAC;AAC/C,MAAItJ,IAAI2F;AACR,SAAO3F,MAAM0F,KAAS;AACpB,UAAM3N,KAAQiI,IAAI,KAAKpF;AACvB,IAAAM,EAAM,KAAK2M,GAAU1N,EAAK,MAAM6F,CAAC,CAAC,CAAC,GACnC/E,EAAQ,KAAKtB,GAASQ,EAAK,QAAQpC,CAAI,CAAC,CAAC,GACzCiI,IAAIjI;AAAA,EACN;AACA,SAAAkD,EAAQ,KAAKtB,GAASgD,CAAE,CAAC,GACzBzB,EAAM,KAAK2M,GAAUwB,CAAQ,CAAC,GACvB,EAAE,QAAQ,IAAO,SAAApO,GAAS,OAAAC,EAAA;AACnC;AAEA,SAASqO,GACPpP,GACAE,GACAsC,GACArB,GACA+N,GACAC,GACY;AACZ,QAAM5D,IAAUrL,GACVsL,IAAQtL,IAAY,GACpBmP,IAAiB;AAAA,IACrB,QAAQ;AAAA,IACR,SAAS,CAAC,GAAGrP,EAAK,QAAQ,MAAM,GAAGuL,IAAU,CAAC,EAAE,IAAI/L,EAAQ,GAAGA,GAASgD,CAAE,CAAC;AAAA,IAC3E,OAAO;AAAA,MACL,GAAGxC,EAAK,MAAM,MAAM,GAAGuL,CAAO,EAAE,IAAImC,EAAS;AAAA,MAC7CA,GAAUwB,CAAQ;AAAA,IAAA;AAAA,EACpB,GAEII,IAAkB;AAAA,IACtB,QAAQ;AAAA,IACR,SAAS,CAAC9P,GAAS2B,CAAE,GAAG,GAAGnB,EAAK,QAAQ,MAAMwL,CAAK,EAAE,IAAIhM,EAAQ,CAAC;AAAA,IAClE,OAAO,CAACkO,GAAUyB,CAAS,GAAG,GAAGnP,EAAK,MAAM,MAAMwL,CAAK,EAAE,IAAIkC,EAAS,CAAC;AAAA,EAAA;AAEzE,SAAO,CAAC2B,GAAMC,CAAK,EAAE,OAAO,CAACC,MAASA,EAAK,QAAQ,UAAU,CAAC;AAChE;AAEO,SAASC,GACdpI,GACAkE,GACApL,GACe;AACf,QAAMqF,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAIuG,EAAS,GAC/C3N,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AAEnE,MAAIpH,EAAK,QAAQ;AACf,UAAMS,IAAIT,EAAK,QAAQ;AACvB,QAAIS,IAAI,EAAG,QAAO2G;AAClB,UAAMmE,IAAUrL,GACVsL,KAAStL,IAAY,KAAKO,GAC1BK,IAAU,CAACtB,GAASQ,EAAK,QAAQwL,CAAK,CAAC,CAAC,GACxCzK,IAAoB,CAAA;AAC1B,QAAI8E,IAAI2F;AACR,WAAO3F,MAAM0F,KAAS;AACpB,YAAM3N,KAAQiI,IAAI,KAAKpF;AACvB,MAAAM,EAAM,KAAK2M,GAAU1N,EAAK,MAAM6F,CAAC,CAAC,CAAC,GACnC/E,EAAQ,KAAKtB,GAASQ,EAAK,QAAQpC,CAAI,CAAC,CAAC,GACzCiI,IAAIjI;AAAAA,IACN;AACA,WAAA2H,EAAM+F,CAAS,IAAI,EAAE,QAAQ,IAAO,SAAAxK,GAAS,OAAAC,EAAA,GACtCmG,GAAgB3B,CAAK;AAAA,EAC9B;AAEA,MAAIrF,MAAc;AAChB,WAAAF,EAAK,QAAQ,MAAA,GACbA,EAAK,MAAM,MAAA,GACPA,EAAK,QAAQ,SAAS,KAAGuF,EAAM,OAAO+F,GAAW,CAAC,GAC/CpE,GAAgB3B,CAAK;AAE9B,MAAIrF,MAAcF,EAAK,MAAM,SAAS;AACpC,WAAAA,EAAK,QAAQ,IAAA,GACbA,EAAK,MAAM,IAAA,GACPA,EAAK,QAAQ,SAAS,KAAGuF,EAAM,OAAO+F,GAAW,CAAC,GAC/CpE,GAAgB3B,CAAK;AAG9B,QAAM8J,IAAiB;AAAA,IACrB,QAAQ;AAAA,IACR,SAASrP,EAAK,QAAQ,MAAM,GAAGE,IAAY,CAAC,EAAE,IAAIV,EAAQ;AAAA,IAC1D,OAAOQ,EAAK,MAAM,MAAM,GAAGE,CAAS,EAAE,IAAIwN,EAAS;AAAA,EAAA,GAE/C4B,IAAkB;AAAA,IACtB,QAAQ;AAAA,IACR,SAAStP,EAAK,QAAQ,MAAME,IAAY,CAAC,EAAE,IAAIV,EAAQ;AAAA,IACvD,OAAOQ,EAAK,MAAM,MAAME,IAAY,CAAC,EAAE,IAAIwN,EAAS;AAAA,EAAA,GAEhD9P,IAAO,CAACyR,GAAMC,CAAK,EAAE,OAAO,CAACC,MAASA,EAAK,QAAQ,UAAU,CAAC;AACpE,SAAAhK,EAAM,OAAO+F,GAAW,GAAG,GAAG1N,CAAI,GAC3BsJ,GAAgB3B,CAAK;AAC9B;AAEO,SAASkK,GACdrI,GACAkE,GACApL,GACA2I,GACA4F,GACe;AACf,QAAMlJ,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAIuG,EAAS,GAC/C3N,IAAOuF,EAAM+F,CAAS;AAC5B,MAAI,CAACtL,KAAQE,IAAY,KAAKA,KAAaH,GAAUC,CAAI,EAAG,QAAOoH;AACnE,QAAM/G,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAE9C,MAAIsC,GACArB,GACA+N,GACAC;AAEJ,MAAI5O,EAAK,SAAS,SAAS;AACzB,UAAMmP,IAAMd,GAAiBvO,GAAME,GAAMD,GAAIuI,GAAO4F,CAAG;AACvD,QAAI,CAACiB,EAAK,QAAOF,GAAcpI,GAAUkE,GAAWpL,CAAS;AAC7D,IAAAsC,IAAKkN,EAAI,IACTvO,IAAKuO,EAAI,IACTR,IAAWQ,EAAI,UACfP,IAAYO,EAAI;AAAA,EAClB,OAAO;AACL,UAAMA,IAAMlB,GAAgBnO,GAAMC,GAAIuI,GAAO4F,CAAG;AAChD,QAAI,CAACiB,EAAK,QAAOF,GAAcpI,GAAUkE,GAAWpL,CAAS;AAC7D,IAAAsC,IAAKkN,EAAI,IACTvO,IAAKuO,EAAI,IACTR,IAAW,EAAE,MAAM,OAAA,GACnBC,IAAY,EAAE,MAAM,OAAA;AAAA,EACtB;AAEA,MAAInP,EAAK;AACP,WAAAuF,EAAM+F,CAAS,IAAI2D;AAAA,MACjBjP;AAAA,MACAE;AAAA,MACAsC;AAAA,MACArB;AAAA,MACA+N;AAAA,MACAC;AAAA,IAAA,GAEKjI,GAAgB3B,CAAK;AAG9B,QAAMoK,IAASP;AAAA,IACbpP;AAAA,IACAE;AAAA,IACAsC;AAAA,IACArB;AAAA,IACA+N;AAAA,IACAC;AAAA,EAAA;AAEF,SAAA5J,EAAM,OAAO+F,GAAW,GAAG,GAAGqE,CAAM,GAC7BzI,GAAgB3B,CAAK;AAC9B;AAEA,SAASqK,GAAgBP,GAAgBC,GAAiBvB,GAAuB;AAC/E,QAAM8B,IAAUR,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC,GAC9CS,IAAaR,EAAM,QAAQ,CAAC,GAC5BS,IAAO3Q,GAAMyQ,GAASC,GAAY/B,CAAG,GACrCjN,IAAUiP,IACZ,CAAC,GAAGV,EAAK,QAAQ,IAAI7P,EAAQ,GAAG,GAAG8P,EAAM,QAAQ,MAAM,CAAC,EAAE,IAAI9P,EAAQ,CAAC,IACvE,CAAC,GAAG6P,EAAK,QAAQ,IAAI7P,EAAQ,GAAG,GAAG8P,EAAM,QAAQ,IAAI9P,EAAQ,CAAC,GAC5DuB,IAAQgP,IACV,CAAC,GAAGV,EAAK,MAAM,IAAI3B,EAAS,GAAG,GAAG4B,EAAM,MAAM,IAAI5B,EAAS,CAAC,IAC5D,CAAC,GAAG2B,EAAK,MAAM,IAAI3B,EAAS,GAAG,EAAE,MAAM,OAAA,GAAmB,GAAG4B,EAAM,MAAM,IAAI5B,EAAS,CAAC;AAC3F,SAAOI,GAAqB,EAAE,QAAQ,IAAO,SAAAhN,GAAS,OAAAC,EAAA,GAASgN,CAAG;AACpE;AAEA,SAASiC,GAAchQ,GAAgB+N,GAAuB;AAM5D,SALmB3O;AAAA,IACjBY,EAAK,QAAQ,CAAC;AAAA,IACdA,EAAK,QAAQA,EAAK,QAAQ,SAAS,CAAC;AAAA,IACpC+N;AAAA,EAAA,IAEqBD,GAAqB9N,GAAM+N,CAAG,IAC9C;AAAA,IACL,QAAQ;AAAA,IACR,SAAS/N,EAAK,QAAQ,IAAIR,EAAQ;AAAA,IAClC,OAAO,CAAC,GAAGQ,EAAK,MAAM,IAAI0N,EAAS,GAAG,EAAE,MAAM,OAAA,CAAQ;AAAA,EAAA;AAE1D;AAEO,SAASuC,GACd7I,GACA/H,GACAC,GACAyO,IAAMmC,IACS;AACf,QAAM3K,IAAQ4E,GAAgB/C,CAAQ,EAAE,IAAIuG,EAAS,GAC/CwC,IAAK5K,EAAMlG,EAAE,SAAS,GACtB+Q,IAAK7K,EAAMjG,EAAE,SAAS;AAC5B,MAAI,CAAC6Q,KAAM,CAACC,KAAMD,EAAG,UAAUC,EAAG,OAAQ,QAAOhJ;AAEjD,MAAI/H,EAAE,cAAcC,EAAE;AACpB,WAAID,EAAE,QAAQC,EAAE,MAAY8H,KAC5B7B,EAAMlG,EAAE,SAAS,IAAI2Q,GAAcG,GAAIpC,CAAG,GACnC7G,GAAgB3B,CAAK;AAG9B,QAAM8J,IAAOhQ,EAAE,QAAQ,QAAQsO,GAAUwC,CAAE,IAAItC,GAAYsC,CAAE,GACvDb,IAAQhQ,EAAE,QAAQ,UAAUqO,GAAUyC,CAAE,IAAIvC,GAAYuC,CAAE,GAC1DC,IAAST,GAAgBP,GAAMC,GAAOvB,CAAG,GACzCuC,IAAO,KAAK,IAAIjR,EAAE,WAAWC,EAAE,SAAS,GACxCiR,IAAO,KAAK,IAAIlR,EAAE,WAAWC,EAAE,SAAS;AAC9C,SAAAiG,EAAM+K,CAAI,IAAID,GACd9K,EAAM,OAAOgL,GAAM,CAAC,GACbrJ,GAAgB3B,CAAK;AAC9B;AAEA,SAASiL,GACPC,GACApR,GACAC,GACAyO,GAC6C;AAC7C,QAAM2C,IAAKD,EAAO,UAAU,CAAC5Q,MAAMA,EAAE,OAAOR,EAAE,OAAO,GAC/CsR,IAAKF,EAAO,UAAU,CAAC5Q,MAAMA,EAAE,OAAOP,EAAE,OAAO;AACrD,MAAIoR,IAAK,KAAKC,IAAK,UAAU,EAAE,QAAAF,GAAQ,WAAW,GAAC;AAEnD,MAAIpR,EAAE,YAAYC,EAAE,SAAS;AAC3B,UAAM1B,IAAO6S,EAAO,MAAA;AACpB7S,WAAAA,EAAK8S,CAAE,IAAI;AAAA,MACT,GAAG9S,EAAK8S,CAAE;AAAA,MACV,UAAUT,GAAkBrS,EAAK8S,CAAE,EAAE,UAAUrR,GAAGC,GAAGyO,CAAG;AAAA,IAAA,GAEnD,EAAE,QAAQnQ,GAAM,WAAW,CAAA,EAAC;AAAA,EACrC;AAEA,QAAMgT,IAASzG,GAAgBsG,EAAOC,CAAE,EAAE,QAAQ,EAAE,IAAI/C,EAAS,GAC3DkD,IAAS1G,GAAgBsG,EAAOE,CAAE,EAAE,QAAQ,EAAE,IAAIhD,EAAS,GAC3DpM,IAASqP,EAAO,QAChBE,IAAS5J,GAAgB,CAAC,GAAG0J,GAAQ,GAAGC,CAAM,CAAC,GAC/CR,IAASJ;AAAA,IACba;AAAA,IACAzR;AAAA,IACA,EAAE,WAAWC,EAAE,YAAYiC,GAAQ,KAAKjC,EAAE,IAAA;AAAA,IAC1CyO;AAAA,EAAA;AAKF,SAAO,EAAE,QAHI0C,EACV,OAAO,CAAC5Q,MAAMA,EAAE,OAAOP,EAAE,OAAO,EAChC,IAAI,CAACO,MAAOA,EAAE,OAAOR,EAAE,UAAU,EAAE,GAAGQ,GAAG,UAAUwQ,EAAA,IAAWxQ,CAAE,GAC5C,WAAW,CAACP,EAAE,OAAO,EAAA;AAC9C;AAEO,SAASyR,GACdN,GACA1C,IAAMmC,IACuC;AAC7C,MAAI1V,IAAUiW;AACd,QAAMO,IAAsB,CAAA;AAC5B,WAASvQ,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3B,UAAMwQ,IAAqB,CAAA;AAC3B,eAAWC,KAAS1W;AAClB,iBAAWyK,KAAOgJ,GAAaiD,EAAM,QAAQ;AAC3C,QAAAD,EAAK,KAAK;AAAA,UACR,SAASC,EAAM;AAAA,UACf,WAAWjM,EAAI;AAAA,UACf,KAAKA,EAAI;AAAA,UACT,OAAOA,EAAI;AAAA,UACX,UAAU;AAAA,QAAA,CACX;AAGL,QAAI0H,IAA8D;AAClE,aAAS9G,IAAI,GAAGA,IAAIoL,EAAK,QAAQpL;AAC/B,eAASsL,IAAItL,IAAI,GAAGsL,IAAIF,EAAK,QAAQE,KAAK;AACxC,cAAM9R,IAAI4R,EAAKpL,CAAC,GACVvG,IAAI2R,EAAKE,CAAC;AAChB,YAAI9R,EAAE,YAAYC,EAAE,WAAWD,EAAE,cAAcC,EAAE,UAAW;AAC5D,cAAM4N,IAAO9E,GAAS/I,EAAE,OAAOC,EAAE,KAAK,GAChC8R,IAAU/R,EAAE,YAAYC,EAAE,UAAU,KAAK,IAAIyO,GAAK,IAAI,IAAIA;AAChE,QAAIb,KAAQkE,MAAY,CAACzE,KAAQO,IAAOP,EAAK,UAC3CA,IAAO,EAAE,GAAAtN,GAAG,GAAAC,GAAG,MAAA4N,EAAA;AAAA,MAEnB;AAEF,QAAI,CAACP,EAAM;AACX,UAAM0D,IAASG,GAAiBhW,GAASmS,EAAK,GAAGA,EAAK,GAAGoB,CAAG;AAC5D,IAAAvT,IAAU6V,EAAO,QACjBW,EAAU,KAAK,GAAGX,EAAO,SAAS;AAAA,EACpC;AACA,SAAO,EAAE,QAAQ7V,GAAS,WAAAwW,EAAA;AAC5B;AAEO,SAASK,GAAgBH,GAG9B;AACA,QAAM3L,IAAQ4E,GAAgB+G,EAAM,QAAQ,GACtCrQ,IAAS0E,EAAM,OAAO,CAACvF,MAASA,EAAK,UAAUA,EAAK,QAAQ,UAAU,CAAC,GACvEsR,IAAQ/L,EAAM,OAAO,CAACvF,MAAS,CAACA,EAAK,UAAUA,EAAK,QAAQ,UAAU,CAAC;AAC7E,SAAIa,EAAO,UAAU,IACZ,EAAE,MAAMqQ,GAAO,QAAQ,CAAA,EAAC,IAE1B;AAAA,IACL,MAAM;AAAA,MACJ,GAAGA;AAAA,MACH,UAAUhK,GAAgB,CAACrG,EAAO,CAAC,GAAG,GAAGyQ,CAAK,CAAC;AAAA,IAAA;AAAA,IAEjD,QAAQzQ,EAAO,MAAM,CAAC,EAAE,IAAI,CAACb,MAASkH,GAAgB,CAAClH,CAAI,CAAC,CAAC;AAAA,EAAA;AAEjE;AAEA,SAASuR,GACPC,GACAC,GACAC,GACkB;AAClB,QAAMC,IAASZ,GAAuBU,CAAO,GACvCG,wBAAgB,IAAI,CAAC,GAAGF,GAAc,GAAGC,EAAO,SAAS,CAAC,GAC1DE,IACJ,CAAA,GACIC,IAAmB,CAAA;AACzB,aAAWZ,KAASS,EAAO,QAAQ;AACjC,QAAIC,EAAU,IAAIV,EAAM,EAAE,EAAG;AAC7B,UAAMa,IAASV,GAAgBH,CAAK;AACpC,IAAAY,EAAK,KAAKC,EAAO,IAAI;AACrB,eAAW3K,KAAY2K,EAAO;AAC5B,MAAAF,EAAO,KAAK;AAAA,QACV,QAAQX,EAAM;AAAA,QACd,UAAA9J;AAAA,QACA,MAAM8J,EAAM;AAAA,QACZ,OAAOA,EAAM;AAAA,MAAA,CACd;AAAA,EAEL;AAEA,QAAMc,IAA0B,CAAA,GAC1BC,IAAa,IAAI,IAAIT,EAAO,IAAI,CAAC3R,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC;AACvD,aAAWqR,KAASY,GAAM;AACxB,UAAMlK,IAAOqK,EAAW,IAAIf,EAAM,EAAE;AACpC,IAAKtJ,KACD,KAAK,UAAUA,EAAK,QAAQ,MAAM,KAAK,UAAUsJ,EAAM,QAAQ,KACjEc,EAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,SAASd,EAAM;AAAA,MACf,UAAUA,EAAM;AAAA,IAAA,CACjB;AAAA,EAEL;AACA,aAAWgB,KAASL;AAClB,IAAAG,EAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,MAAME,EAAM;AAAA,MACZ,UAAUA,EAAM;AAAA,MAChB,OAAOA,EAAM;AAAA,IAAA,CACd;AAEH,aAAWC,KAAMP;AACf,IAAIK,EAAW,IAAIE,CAAE,KAAGH,EAAM,KAAK,EAAE,QAAQ,UAAU,SAASG,EAAA,CAAI;AAEtE,SAAOH;AACT;AAEO,SAASI,GACd3B,GACA4B,GACA5D,GACkB;AAClB,QAAM5T,IAAS4V,EAAO,KAAK,CAAC5Q,MAAMA,EAAE,OAAOwS,EAAI,OAAO;AACtD,MAAI,CAACxX,EAAQ,QAAO,CAAA;AACpB,QAAMwT,IAASoC,EAAO,OAAO,CAAC5Q,MAAMA,EAAE,OAAOwS,EAAI,OAAO,GAElDrS,IADQmK,GAAgBtP,EAAO,QAAQ,EAC1BwX,EAAI,SAAS;AAChC,MAAI,CAACrS,EAAM,QAAO,CAAA;AAClB,QAAMK,IAAOJ,GAASD,GAAMqS,EAAI,SAAS,GACnC/R,IAAKH,GAAOH,GAAMqS,EAAI,SAAS,GAE/BC,IADSlE,GAAqB/N,GAAMC,GAAI+N,CAAM,IAEhDmB,GAAc3U,EAAO,UAAUwX,EAAI,WAAWA,EAAI,SAAS,IAC3D5C,GAAY5U,EAAO,UAAUwX,EAAI,WAAWA,EAAI,WAAWA,EAAI,OAAO5D,CAAG,GACvE7Q,IAAO6S,EAAO;AAAA,IAAI,CAAC5Q,MACvBA,EAAE,OAAOwS,EAAI,UAAU,EAAE,GAAGxS,GAAG,UAAUyS,MAAYzS;AAAA,EAAA;AAEvD,SAAO0R,GAAYd,GAAQ7S,GAAM,EAAE;AACrC;AAEO,SAAS2U,GACd9B,GACApR,GACAC,GACkB;AAClB,MAAImO,GAAYpO,GAAGC,CAAC,UAAU,CAAA;AAC9B,QAAM+Q,IAASG,GAAiBC,GAAQpR,GAAGC,GAAG4Q,EAAsB;AACpE,SAAOqB,GAAYd,GAAQJ,EAAO,QAAQA,EAAO,SAAS;AAC5D;AAEO,SAASmC,GACd/B,GACA5H,GACAkF,GACA0E,GACmB;AACnB,MAAI9F,IAA0B;AAC9B,aAAWuE,KAAST;AAClB,eAAWxL,KAAOgJ,GAAaiD,EAAM,QAAQ,GAAG;AAC9C,YAAMiB,IAAgB;AAAA,QACpB,SAASjB,EAAM;AAAA,QACf,WAAWjM,EAAI;AAAA,QACf,KAAKA,EAAI;AAAA,MAAA;AAEX,UAAIwN,KAAQhF,GAAYgF,GAAMN,CAAE,EAAG;AACnC,YAAMjF,IAAO9E,GAASS,GAAO5D,EAAI,KAAK;AACtC,UAAIiI,IAAOa,EAAK;AAChB,YAAM2E,IACJD,MACCvB,EAAM,OAAOuB,EAAK,WAAWxN,EAAI,cAAcwN,EAAK,YACjDE,IACJhG,KACA8F,MACC9F,EAAK,YAAY8F,EAAK,WAAW9F,EAAK,cAAc8F,EAAK;AAC5D,OACE,CAAC9F,KACA+F,KAAe,CAACC,KAChBD,MAAgBC,KAAczF,IAAOP,EAAK,cAE3CA,IAAO,EAAE,GAAGwF,GAAI,OAAOlN,EAAI,OAAO,UAAUiI,EAAA;AAAA,IAEhD;AAEF,SAAOP;AACT;AAEO,SAASiG,GACdnC,GACA5H,GACAkF,GACyB;AACzB,MAAIpB,IAAgC;AACpC,aAAWuE,KAAST,GAAQ;AAC1B,UAAM4B,IAAMhF,GAAY6D,EAAM,UAAUrI,GAAOkF,CAAG;AAClD,QAAKsE,MACD,CAAC1F,KAAQ0F,EAAI,WAAW1F,EAAK,WAAU;AAEzC,YAAM3M,IADQmK,GAAgB+G,EAAM,QAAQ,EACzBmB,EAAI,YAAY,GAC7BhS,IAAOL,IAAOC,GAASD,GAAMqS,EAAI,gBAAgB,IAAIxJ,GACrDvI,IAAKN,IAAOG,GAAOH,GAAMqS,EAAI,gBAAgB,IAAIxJ;AACvD,MAAA8D,IAAO;AAAA,QACL,SAASuE,EAAM;AAAA,QACf,WAAWmB,EAAI;AAAA,QACf,WAAWA,EAAI;AAAA,QACf,OAAOA,EAAI;AAAA,QACX,QAAQjE;AAAA,UACN/N;AAAA,UACAC;AAAA,UACAmQ,EAAO,OAAO,CAAC5Q,MAAMA,EAAE,OAAOqR,EAAM,EAAE;AAAA,QAAA;AAAA,QAExC,UAAUmB,EAAI;AAAA,MAAA;AAAA,IAElB;AAAA,EACF;AACA,SAAO1F;AACT;AAEO,SAASkG,GACdzL,GACAkE,GACApL,GACA2I,GACA4F,GAC+B;AAE/B,QAAMzO,IADQmK,GAAgB/C,CAAQ,EACnBkE,CAAS;AAC5B,MAAI,CAACtL,EAAM,QAAO;AAClB,QAAMK,IAAOJ,GAASD,GAAME,CAAS,GAC/BI,IAAKH,GAAOH,GAAME,CAAS,GAC3BK,IAAOP,EAAK,MAAME,CAAS,KAAK,EAAE,MAAM,OAAA;AAC9C,MAAIK,EAAK,SAAS,SAAS;AACzB,UAAMmP,IAAMd,GAAiBvO,GAAME,GAAMD,GAAIuI,GAAO4F,CAAG;AACvD,WAAOiB,IAAM,EAAE,IAAIA,EAAI,IAAI,IAAIA,EAAI,OAAO;AAAA,EAC5C;AACA,SAAOlB,GAAgBnO,GAAMC,GAAIuI,GAAO4F,CAAG;AAC7C;ACpsBO,SAASqE,GACdjK,GACAkK,GACAhF,GACa;AACb,MAAIpB,IAAiD;AACrD,aAAWM,KAAa8F,GAAY;AAClC,UAAM3K,IAAW,KAAK,MAAM6E,EAAU,IAAIpE,EAAM,GAAGoE,EAAU,IAAIpE,EAAM,CAAC;AACxE,IAAIT,KAAY2F,MAAQ,CAACpB,KAAQvE,IAAWuE,EAAK,cAC/CA,IAAO,EAAE,OAAOM,GAAW,UAAA7E,EAAA;AAAA,EAE/B;AACA,SAAOuE,IAAO,EAAE,GAAGA,EAAK,MAAM,GAAG,GAAGA,EAAK,MAAM,EAAA,IAAM;AACvD;AAEO,SAASqG,GAAc3T,GAAgBC,GAAgBC,IAAM,MAAe;AACjF,SAAI,CAACF,KAAK,CAACC,IAAU,KACd,KAAK,IAAID,EAAE,IAAIC,EAAE,CAAC,KAAKC,KAAO,KAAK,IAAIF,EAAE,IAAIC,EAAE,CAAC,KAAKC;AAC9D;ACTO,SAAS0T,GAAoBC,GAAcC,GAA+B;AAC/E,QAAM3O,IAAK,KAAK,IAAI2O,EAAO,IAAID,EAAO,CAAC,GACjCzO,IAAK,KAAK,IAAI0O,EAAO,IAAID,EAAO,CAAC;AACvC,SAAI1O,KAAMC,IACD;AAAA,IACL,OAAO,EAAE,GAAG0O,EAAO,GAAG,GAAGD,EAAO,EAAA;AAAA,IAChC,MAAM;AAAA,IACN,SAASA;AAAA,EAAA,IAGN;AAAA,IACL,OAAO,EAAE,GAAGA,EAAO,GAAG,GAAGC,EAAO,EAAA;AAAA,IAChC,MAAM;AAAA,IACN,SAASD;AAAA,EAAA;AAEb;AAMO,SAASE,GACdD,GACAE,GACwB;AACxB,MAAI1G,IAAoD;AACxD,aAAW2G,KAAYD,GAAW;AAChC,UAAME,IAA6B;AAAA,MACjC;AAAA,QACE,OAAO,EAAE,GAAGJ,EAAO,GAAG,GAAGG,EAAS,EAAA;AAAA,QAClC,MAAM;AAAA,QACN,SAASA;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,OAAO,EAAE,GAAGA,EAAS,GAAG,GAAGH,EAAO,EAAA;AAAA,QAClC,MAAM;AAAA,QACN,SAASG;AAAA,MAAA;AAAA,IACX;AAEF,eAAWE,KAAUD,GAAS;AAC5B,YAAMrG,IAAO,KAAK,MAAMsG,EAAO,MAAM,IAAIL,EAAO,GAAGK,EAAO,MAAM,IAAIL,EAAO,CAAC;AAC5E,OACE,CAACxG,KACDO,IAAOP,EAAK,OAAO,QAClB,KAAK,IAAIO,IAAOP,EAAK,IAAI,KAAK,QAAQ6G,EAAO,SAAS,gBAAgB7G,EAAK,SAAS,kBAErFA,IAAO,EAAE,GAAG6G,GAAQ,MAAAtG,EAAA;AAAA,IAExB;AAAA,EACF;AACA,SAAKP,IACE,EAAE,OAAOA,EAAK,OAAO,MAAMA,EAAK,MAAM,SAASA,EAAK,QAAA,IADzC;AAEpB;AAEO,SAAS8G,GAAcC,GAAgD;AAC5E,SAAOA,EAAM,QAAQ,OAAOA,EAAM,SAAS;AAC7C;ACzDO,SAASC,GACdtT,GACAC,GACAsT,IAAa,IACE;AACf,MAAIrN,IAAKjG,EAAG,GACRkG,IAAKlG,EAAG;AACZ,MAAIsT,GAAY;AACd,UAAMpP,IAAKlE,EAAG,IAAID,EAAK,GACjBoE,IAAKnE,EAAG,IAAID,EAAK,GACjBiI,IAAO,KAAK,IAAI,KAAK,IAAI9D,CAAE,GAAG,KAAK,IAAIC,CAAE,CAAC,GAC1CoP,IAAKrP,MAAO,IAAKC,MAAO,IAAI,IAAI,KAAK,KAAKA,CAAE,IAAK,KAAK,KAAKD,CAAE,GAC7DsP,IAAKrP,MAAO,IAAKD,MAAO,IAAI,IAAI,KAAK,KAAKA,CAAE,IAAK,KAAK,KAAKC,CAAE;AACnE,IAAA8B,IAAKlG,EAAK,IAAIwT,IAAKvL,GACnB9B,IAAKnG,EAAK,IAAIyT,IAAKxL;AAAA,EACrB;AACA,QAAMnG,IAAK,KAAK,IAAIoE,IAAKlG,EAAK,CAAC,IAAI,GAC7B+B,IAAK,KAAK,IAAIoE,IAAKnG,EAAK,CAAC,IAAI;AACnC,SAAO;AAAA,IACL,KAAKA,EAAK,IAAIkG,KAAM;AAAA,IACpB,KAAKlG,EAAK,IAAImG,KAAM;AAAA,IACpB,IAAArE;AAAA,IACA,IAAAC;AAAA,EAAA;AAEJ;AAEO,SAAS2R,GAAaC,GAA+B;AAC1D,QAAM,EAAE,IAAArQ,GAAI,IAAAC,GAAI,IAAAzB,GAAI,IAAAC,MAAO4R,GACrBvR,IAAM,KAAK,IAAIN,GAAI,IAAI,GACvBO,IAAM,KAAK,IAAIN,GAAI,IAAI;AAC7B,SAAO,KAAKuB,IAAKlB,CAAG,IAAImB,CAAE,MAAMnB,CAAG,IAAIC,CAAG,UAAUiB,IAAKlB,CAAG,IAAImB,CAAE,MAAMnB,CAAG,IAAIC,CAAG,UAAUiB,IAAKlB,CAAG,IAAImB,CAAE;AAC5G;AAEO,SAASqQ,GACd5T,GACAC,GACAsT,IAAa,IACE;AACf,SAAOvM,GAAuB;AAAA,IAC5B0M,GAAaJ,GAAsBtT,GAAMC,GAAIsT,CAAU,CAAC;AAAA,EAAA,CACzD;AACH;AC/CO,MAAMM,KAAqB,QACrBC,KAAqB,IACrBC,KAAoBC,IACpBC,KAAoBC,IAE3BC,KAAwB;AAEvB,SAASC,GAAYvD,GAGhB;;AACV,SAAOA,EAAM,SAAS,WAAW,IAAQ3H,KAAA5P,IAAAuX,EAAM,UAAN,gBAAAvX,EAAa,SAAb,QAAA4P,EAAmB;AAC9D;AAEO,SAASmL,GAAiBC,GAA4B;AAC3D,SAAOR;AACT;AAEO,SAASS,GAAeC,GAAwB;AAErD,UADeA,EAAK,QAAQ,SAAS;AAAA,CAAI,EAAE,UAAUX,IACvC,MAAM;AAAA,CAAI;AAC1B;AAEA,IAAIY;AAEJ,SAASC,KAAsD;AAC7D,SAAID,OAAe,SAAkBA,KACjC,OAAO,WAAa,OACtBA,KAAa,MACN,SAGTA,KADe,SAAS,cAAc,QAAQ,EAC1B,WAAW,IAAI,GAC5BA;AACT;AAEO,SAASE,GACdH,GACAI,GACoD;AACpD,QAAMC,IAAQN,GAAeC,CAAI,GAC3BM,IAAMJ,GAAA;AACZ,MAAIK,IAAQ;AACZ,MAAID,GAAK;AACP,IAAAA,EAAI,OAAO,GAAGF,CAAI,MAAMb,EAAiB;AACzC,eAAWiB,KAAQH;AACjB,MAAAE,IAAQ,KAAK,IAAIA,GAAOD,EAAI,YAAYE,KAAQ,GAAG,EAAE,KAAK;AAAA,EAE9D;AAEE,IAAAD,IADgBF,EAAM,OAAO,CAACI,GAAKD,MAAS,KAAK,IAAIC,GAAKD,EAAK,MAAM,GAAG,CAAC,IACvDJ,IAAOT;AAE3B,SAAO;AAAA,IACL,OAAO,KAAK,IAAIY,GAAOH,IAAO,GAAG;AAAA,IACjC,QAAQ,KAAK,IAAIC,EAAM,QAAQ,CAAC,IAAID,IAAOX;AAAA,IAC3C,OAAAY;AAAA,EAAA;AAEJ;AAEO,SAASK,GAAeC,GAAiB;AAC9C,SAAO,EAAE,IAAIA,EAAI,OAAOA,EAAI,QAAQ,GAAG,IAAIA,EAAI,OAAOA,EAAI,QAAQ,EAAA;AACpE;AAEO,SAASC,GAAiBvC,GAAc2B,GAAcI,GAAsB;AACjF,QAAM,EAAE,OAAAG,GAAO,QAAAM,EAAA,IAAWV,GAAiBH,GAAMI,CAAI;AACrD,SAAO;AAAA,IACL,EAAE,GAAG/B,EAAO,GAAG,GAAGA,EAAO,IAAIwC,EAAA;AAAA,IAC7B,EAAE,GAAGxC,EAAO,IAAIkC,GAAO,GAAGlC,EAAO,IAAIwC,EAAA;AAAA,IACrC,EAAE,GAAGxC,EAAO,IAAIkC,GAAO,GAAGlC,EAAO,EAAA;AAAA,IACjC,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,EAAE;AAE/B;AAEO,SAASyC,GACdzC,GACA2B,GACAI,GACe;AACf,SAAOpK,GAAmB,CAAC4K,GAAiBvC,GAAQ2B,GAAMI,CAAI,CAAC,CAAC;AAClE;AAEO,SAASW,GAAiBf,GAAcI,GAAcY,GAA4B;AACvF,SAAO;AAAA,IACL,MAAMhB,EAAK,KAAA,KAAUX;AAAA,IACrB,MAAAe;AAAA,IACA,OAAAY;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;AAGO,SAASC,GACd1O,GACAyN,GACAI,GACe;AACf,QAAMO,IAAMO,GAAa3O,CAAQ;AACjC,SAAOuO,GAAkB,EAAE,GAAGH,EAAI,MAAM,GAAGA,EAAI,KAAA,GAAQX,GAAMI,CAAI;AACnE;ACnFO,SAASe,GAAa9E,GAGjB;AACV,SAAOuD,GAAYvD,CAAK,KAAK+E,GAAe/E,CAAK;AACnD;AAEO,SAASgF,GAAqBjB,GAAcY,GAA4B;AAC7E,SAAO;AAAA,IACL,UAAUM;AAAA,IACV,MAAMC,GAAkBnB,CAAI;AAAA,IAC5B,OAAAY;AAAA,IACA,QAAQ;AAAA,EAAA;AAEZ;AAEO,SAASQ,GAAoBC,GAAcrB,GAAsB;AACtE,QAAMtG,IAAOyH,GAAkBnB,CAAI,IAAI;AACvC,SAAO;AAAA,IACL,EAAE,GAAGqB,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,IACpC,EAAE,GAAG2H,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,IACpC,EAAE,GAAG2H,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,IACpC,EAAE,GAAG2H,EAAO,IAAI3H,GAAM,GAAG2H,EAAO,IAAI3H,EAAA;AAAA,EAAK;AAE7C;AAEO,SAAS4H,GAAqBD,GAAcrB,GAA6B;AAC9E,SAAOpK,GAAmB,CAACwL,GAAoBC,GAAQrB,CAAI,CAAC,CAAC;AAC/D;AAGO,SAASuB,GACdpP,GACA6N,GACe;AACf,SAAOsB,GAAqBhB,GAAeQ,GAAa3O,CAAQ,CAAC,GAAG6N,CAAI;AAC1E;ACxBO,SAASwB,GAAaC,GAAcC,GAAiBC,GAAuB;AACjF,QAAMC,IAAMH,EAAI,IAAIA,EAAI,IAAIA,EAAI,IAAIA,EAAI;AACxC,MAAIG,MAAQ,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AACjC,QAAMrR,IAAImR,IAAUD,EAAI,GAClBjR,IAAImR,IAAUF,EAAI;AACxB,SAAO;AAAA,IACL,IAAIA,EAAI,IAAIlR,IAAIkR,EAAI,IAAIjR,KAAKoR;AAAA,IAC7B,IAAI,CAACH,EAAI,IAAIlR,IAAIkR,EAAI,IAAIjR,KAAKoR;AAAA,EAAA;AAElC;AASO,SAASC,GACdC,GACAC,GACAL,GACAC,GACM;AACN,QAAMK,IAAMD,EAAQ,QAAQ,IAAIA,EAAQ,QAAQ,KAAK,IAAID,EAAK,OAAO,CAAC,GAChEG,IAAMF,EAAQ,SAAS,IAAIA,EAAQ,SAAS,KAAK,IAAID,EAAK,QAAQ,CAAC,GACnE5T,IAAQ,KAAK,IAAI4T,EAAK,QAAQE,GAAKF,EAAK,SAASG,CAAG;AAC1D,MAAI,EAAE/T,IAAQ,MAAM,CAAC,OAAO,SAASA,CAAK;AACxC,WAAO,EAAE,GAAG6T,EAAQ,GAAG,GAAGA,EAAQ,EAAA;AAEpC,QAAMG,IAAUJ,EAAK,QAAQA,EAAK,QAAQE,IAAM9T,KAAS,GACnDiU,IAAUL,EAAK,OAAOA,EAAK,SAASG,IAAM/T,KAAS;AACzD,SAAO;AAAA,IACL,GAAG6T,EAAQ,KAAKL,IAAUQ,KAAWhU;AAAA,IACrC,GAAG6T,EAAQ,KAAKJ,IAAUQ,KAAWjU;AAAA,EAAA;AAEzC;AAEO,SAASkU,GAAqBN,GAAsBC,GAA8B;AACvF,QAAMC,IAAMD,EAAQ,QAAQ,IAAIA,EAAQ,QAAQ,KAAK,IAAID,EAAK,OAAO,CAAC,GAChEG,IAAMF,EAAQ,SAAS,IAAIA,EAAQ,SAAS,KAAK,IAAID,EAAK,QAAQ,CAAC,GACnE5T,IAAQ,KAAK,IAAI4T,EAAK,QAAQE,GAAKF,EAAK,SAASG,CAAG;AAC1D,SAAO/T,IAAQ,KAAK,OAAO,SAASA,CAAK,IAAIA,IAAQ;AACvD;AAEA,SAASmU,GAAeC,GAAwC;;AAC9D,QAAMC,KAAK7d,IAAA4d,EAAI,YAAJ,gBAAA5d,EAAa;AACxB,MAAI6d,KAAMA,EAAG,QAAQ,KAAKA,EAAG,SAAS;AACpC,WAAO,EAAE,GAAGA,EAAG,GAAG,GAAGA,EAAG,GAAG,OAAOA,EAAG,OAAO,QAAQA,EAAG,OAAA;AAEzD,QAAMC,IAAOF,EAAI,aAAa,SAAS;AACvC,MAAI,CAACE,EAAM,QAAO;AAClB,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM,QAAQ,EAAE,IAAI,MAAM;AAEpD,SADIC,EAAM,WAAW,KAAKA,EAAM,KAAK,CAACjX,MAAM,CAAC,OAAO,SAASA,CAAC,CAAC,KAC3DiX,EAAM,CAAC,KAAK,KAAKA,EAAM,CAAC,KAAK,IAAU,OACpC,EAAE,GAAGA,EAAM,CAAC,GAAG,GAAGA,EAAM,CAAC,GAAG,OAAOA,EAAM,CAAC,GAAG,QAAQA,EAAM,CAAC,EAAA;AACrE;AAEO,SAASC,GAAgBJ,GAAoBZ,GAAiBC,GAAuB;AAC1F,QAAMI,IAAUM,GAAeC,CAAG;AAClC,MAAIP;AACF,WAAOF,GAAoBS,EAAI,sBAAA,GAAyBP,GAASL,GAASC,CAAO;AAEnF,QAAMF,IAAMa,EAAI,aAAA;AAChB,SAAKb,IACED,GAAaC,GAAKC,GAASC,CAAO,IADxB,EAAE,GAAG,GAAG,GAAG,EAAA;AAE9B;AAEO,SAASgB,GAAiBL,GAA4B;AAC3D,QAAMP,IAAUM,GAAeC,CAAG;AAClC,MAAIP,EAAS,QAAOK,GAAqBE,EAAI,sBAAA,GAAyBP,CAAO;AAC7E,QAAMN,IAAMa,EAAI,aAAA;AAChB,SAAKb,IACEmB,GAAiBnB,CAAG,IADV;AAEnB;AAGO,SAASoB,GAAYC,GAAYC,GAAWC,GAAoB;AACrE,QAAMC,IAAID,MAAS,IAAI,IAAIA;AAC3B,SAAO;AAAA,IACL,IAAIF,EAAK,IAAIC,EAAI,KAAKE;AAAA,IACtB,IAAIH,EAAK,IAAIC,EAAI,KAAKE;AAAA,EAAA;AAE1B;AAEO,MAAMC,KAAkB,KAElBC,KAAkB;AAExB,SAASC,GAAgBJ,GAAsB;AACpD,SAAO,KAAK,IAAIG,IAAiB,KAAK,IAAID,IAAiBF,CAAI,CAAC;AAClE;AAGO,SAASK,GACdC,GACA7E,GACQ;AACR,SAAO8E,GAAkBD,GAAa7E,EAAM,QAAQ;AAAA,IAClD,KAAKyE;AAAA,IACL,KAAKC;AAAA,EAAA,CACN;AACH;AAGO,SAASP,GAAiBnB,GAAsB;AACrD,SAAO,KAAK,MAAMA,EAAI,GAAGA,EAAI,CAAC;AAChC;AAGO,SAAS+B,GAAgBC,GAAYT,GAAcU,GAA2B;AACnF,QAAMT,IAAID,MAAS,IAAI,IAAIA,GACrB9U,IAAQwV,IAAY,IAAIA,IAAY;AAC1C,SAAOD,KAAMvV,IAAQ+U;AACvB;AAUO,SAASU,GAAkBC,GAAkBC,GAA0B;AAG5E,UAFaD,MAAa,IAAI,IAAIA,MACrBC,MAAa,IAAI,IAAIA;AAEpC;AAOO,SAASC,GACdhB,GACAC,GACAC,GACAe,GACM;AACN,QAAMC,IAAQnB,GAAYC,GAAMC,GAAKC,CAAI;AACzC,SAAO;AAAA,IACL,GAAGF,EAAK,IAAIiB,IAAWC,EAAM;AAAA,IAC7B,GAAGlB,EAAK,IAAIiB,IAAWC,EAAM;AAAA,EAAA;AAEjC;AAGO,SAASC,GAAsBnB,GAAYkB,GAAahB,GAAoB;AACjF,SAAO;AAAA,IACL,GAAGF,EAAK,IAAIE,IAAOgB,EAAM;AAAA,IACzB,GAAGlB,EAAK,IAAIE,IAAOgB,EAAM;AAAA,EAAA;AAE7B;AAEO,MAAME,KAAsB;AAE5B,SAASC,GAAajb,GAAmB;AAE9C,SAAO,KAAK,IADF,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAC,CAAC,MACd;AACxB;AAEO,SAASkb,GAAKha,GAAWC,GAAW,GAAmB;AAC5D,SAAOD,KAAKC,IAAID,KAAK;AACvB;AAGO,SAASia,GACdjZ,GACAC,GACA,GAC6B;AAC7B,QAAM2B,IAAImX,GAAa,CAAC;AACxB,SAAO;AAAA,IACL,KAAK;AAAA,MACH,GAAGC,GAAKhZ,EAAK,IAAI,GAAGC,EAAG,IAAI,GAAG2B,CAAC;AAAA,MAC/B,GAAGoX,GAAKhZ,EAAK,IAAI,GAAGC,EAAG,IAAI,GAAG2B,CAAC;AAAA,IAAA;AAAA,IAEjC,MAAMoX,GAAKhZ,EAAK,MAAMC,EAAG,MAAM2B,CAAC;AAAA,EAAA;AAEpC;ACxMO,SAASsX,GAAuB/L,GAAyB;AAC9D,SAAIA,MAAS,SAAe,OACxBA,MAAS,YAAkB,MAC3BA,MAAS,UAAUA,MAAS,kBAAkBA,MAAS,WAAiB,OACrE;AACT;AAEO,SAASgM,GACdtI,GACAuI,GACAC,GACQ;;AACR,MAAIxI,EAAM,SAAS,WAAY,QAAOyI;AACtC,MAAIzI,EAAM,SAAS,OAAQ,UAAOvX,IAAAuX,EAAM,UAAN,gBAAAvX,EAAa,SAAQ;AACvD,QAAMigB,IAAYC;AAAA,IAChB3I,EAAM;AAAA,IACNuI;AAAA,KACAlQ,IAAA2H,EAAM,UAAN,gBAAA3H,EAAa;AAAA,IACbmQ;AAAA,EAAA;AAEF,SACEI,GAAqB5I,EAAM,IAAI,KAC/B6I,GAAmBH,CAAS,IAErBI,GAAwB9I,EAAM,MAAMuI,CAAK,IAE3CG;AACT;AC1BO,MAAMK,KAAqB;AAG3B,SAASC,GAAsB1M,GAA0B;AAC9D,SAAO2M,GAAwB,SAAS3M,CAAI,KAAKA,MAAS,WAAWA,MAAS;AAChF;AAGO,SAAS4M,GAAgBC,GAmBT;AACrB,MAAIA,EAAK,aAAa,CAACA,EAAK,QAAS,QAAO;AAI5C,MAHIA,EAAK,aAAaA,EAAK,WACvBA,EAAK,kBACLA,EAAK,gBACLA,EAAK,WAAWA,EAAK,cAAe,QAAO;AAE/C,MAAIA,EAAK,SAAS,SAASA,EAAK,SAAS,aAAc,QAAO;AAC9D,MAAIA,EAAK,SAAS;AAEhB,WADIA,EAAK,wBACLA,EAAK,qBAAqBA,EAAK,kBAAkBA,EAAK,cACjD,YAEF;AAET,MAAIA,EAAK,SAAS;AAChB,WAAIA,EAAK,qBAAqBA,EAAK,kBAAkBA,EAAK,cACjD,YAEF;AAET,MAAIjf,GAAiBif,EAAK,IAAI;AAC5B,WAAIA,EAAK,uBAA6B,SAClCA,EAAK,mBAAyB,SAC3BA,EAAK,WAAW,SAAY;AAErC,MAAIA,EAAK,SAAS,YAAa,QAAO;AACtC,MAAIA,EAAK,SAAS,gBAAiB,QAAO;AAC1C,MAAIA,EAAK,UAAW,QAAO;AAC3B,MAAI3c,GAAoB2c,EAAK,IAAI,EAAG,QAAO;AAC3C,MAAIhd,GAAgBgd,EAAK,IAAI,KAAK,CAACA,EAAK,SAAU,QAAO;AAE3D;AAEO,SAASC,GAAmBD,GAWsB;AACvD,MAAIA,EAAK,SAAU,QAAO;AAC1B,MAAIhd,GAAgBgd,EAAK,IAAI,EAAG,QAAO;AACvC,MAAIA,EAAK,cAAcA,EAAK;AAC1B,WAAOjf,GAAiBif,EAAK,IAAI,IAAI,SAAS;AAEhD,MAAI/c,GAAgB+c,EAAK,IAAI,MAAMA,EAAK,aAAaA,EAAK;AACxD,WAAO;AAET,MAAIA,EAAK,SAAS,WAAWA,EAAK,SAAS;AACzC,WAAIA,EAAK,WAAU,SACfA,EAAK,gBAAsB,YAC/B;AAEF,MAAIA,EAAK,SAAS,UAClB;AAAA,QAAIA,EAAK,SAAU,QAAO;AAC1B,QAAIA,EAAK,cAAe,QAAO;AAAA;AAEjC;AAEO,SAASE,GACd/M,GACAgN,GACAC,GACQ;AACR,SAAI,CAACA,KAAW,CAACP,GAAsB1M,CAAI,IAAUgN,IAC9C,KAAK,IAAI,GAAGA,IAAO,GAAG;AAC/B;AAGO,SAASE,GACdC,GACAC,GACQ;AACR,SAAKA,IACEC,GAAgBF,CAAI,IADHA;AAE1B;AChFO,SAASG,GACdC,GAC0B;;AAC1B,MAAI,CAACA,EAAU,QAAO;AACtB,QAAM7f,MAAMvB,IAAAohB,EAAS,YAAT,gBAAAphB,EAAkB,WAAU;AACxC,SAAI,CAACohB,EAAS,WAAW,gBAAgB,KAAK7f,CAAG,IAAU6f,IACpD,EAAE,GAAGA,GAAU,SAAS,KAAA;AACjC;AAMO,SAASC,GACd9J,GACAwI,GACAqB,GACAE,IAA8D,CAAA,GAC9DxB,GACkC;;AAClC,MAAIvI,EAAM,SAAS,WAAWA,EAAM,SAAS,WAAY,QAAO;AAChE,QAAMgK,IAAkBJ,GAAoBC,CAAQ,GAC9CI,IAAQC,GAAoBlK,GAAOwI,GAAYwB,CAAe;AACpE,MAAI,CAACG,GAAyB3B,GAAYyB,CAAK,EAAG,QAAO;AACzD,QAAM3F,IAAMO,GAAa7E,EAAM,QAAQ,GACjCoK,IACJH,EAAM,SAAQzB,KAAA,gBAAAA,EAAY,SAAQ6B,IAC9BC,IAAWC;AAAA,IACf/B;AAAA,IACAwB;AAAA,IACAC;AAAA,EAAA,GAEIO,IAASF,IACX,SACAG,GAAwBjC,GAAYuB,CAAS,GAC3CpG,IAAO2G,KAAYE,IAAS,WAAY/hB,IAAAwhB,EAAM,SAAN,gBAAAxhB,EAAY,WAAU;AACpE,SAAI,CAAC6hB,KAAY,CAACE,KAAU,CAAC7G,IAAa,OACnC;AAAA,IACL,SAAS3D,EAAM;AAAA,IACf,IAAIsE,EAAI,OAAOA,EAAI,QAAQ,KAAK2F,EAAM,WAAW;AAAA,IACjD,IAAI3F,EAAI,OAAOA,EAAI,QAAQ,KAAK2F,EAAM,WAAW;AAAA,IACjD,QAAQA,EAAM,UAAU;AAAA,IACxB,MAAMK,IACFI,GAA4BN,GAAU5B,CAAU,IAChD4B;AAAA,IACJ,OAAOO;AAAA,MACLnC;AAAA,MACAD;AAAA,MACA0B,EAAM;AAAA,MACNjK,EAAM;AAAA,IAAA;AAAA,IAER,OAAO4K,GAAoBX,EAAM,KAAK;AAAA,IACtC,MAAAtG;AAAA,IACA,UAAA2G;AAAA,IACA,QAAAE;AAAA,EAAA;AAEJ;AAEO,SAASK,GAA2BC,GAQX;AAC9B,QAAMC,IAAe,IAAI;AAAA,KACtBD,EAAM,aAAa,CAAA,GAAI,IAAI,CAACzM,MAAS,CAACA,EAAK,IAAIA,CAAI,CAAC;AAAA,EAAA,GAEjD2M,IAAsB,IAAI;AAAA,IAC9BF,EAAM,YAAY,IAAI,CAACG,MAAQ,CAACA,EAAI,SAASA,CAAG,CAAC;AAAA,EAAA,GAE7ClB,IAAYe,EAAM,aAAa,CAAA,GAC/BI,IAAwC,CAAA;AAC9C,aAAWlL,KAAS,CAAC,GAAI8K,EAAM,kBAAkB,IAAK,GAAGA,EAAM,MAAM,GAAG;AACtE,UAAMtC,IAAawC,EAAoB,IAAIhL,EAAM,EAAE,GAC7C6J,KACJrB,KAAA,gBAAAA,EAAY,eAAc,OACtBuC,EAAa,IAAIvC,EAAW,UAAU,KAAK,OAC3C,MACA2C,IAAUrB;AAAA,MACd9J;AAAA,MACAwI;AAAA,MACAqB;AAAA,MACAE;AAAA,MACAe,EAAM;AAAA,IAAA;AAER,IAAIK,KAASD,EAAS,KAAKC,CAAO;AAAA,EACpC;AACA,SAAOD;AACT;AAEO,SAASE,GACdD,GACAE,GACoB;AACpB,MAAIF,EAAQ,SAAU,QAAOG,GAAgBH,EAAQ,UAAUE,CAAa;AAC5E,MAAI,CAACF,EAAQ,OAAQ;AACrB,QAAM9E,IAAMkF,GAAiBJ,EAAQ,MAAM;AAC3C,MAAK9E;AACL,WAAOmF,GAAuBnF,GAAK8E,EAAQ,KAAK;AAClD;ACnIO,SAASM,GAAqB;AAAA,EACnC,SAAAN;AAAA,EACA,eAAAE;AACF,GAGG;AACD,QAAM,EAAE,GAAA/W,GAAG,GAAAC,GAAG,QAAAmX,GAAQ,MAAA3H,GAAM,OAAAY,GAAO,OAAAgH,GAAO,MAAAhI,MAASwH,GAC7CS,IAAOR,GAAsBD,GAASE,CAAa,GACnDQ,IAAYH,IAAS,UAAUA,CAAM,IAAIpX,CAAC,IAAIC,CAAC,MAAM;AAC3D,SACE,gBAAA5J;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,iBAAewgB,EAAQ;AAAA,MACvB,WAAAU;AAAA,MACA,eAAc;AAAA,MAEb,UAAAD,IACC,gBAAAjhB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAAihB;AAAA,UACA,GAAGtX,IAAIyP,IAAO;AAAA,UACd,GAAGxP,IAAIwP,IAAO;AAAA,UACd,OAAOA;AAAA,UACP,QAAQA;AAAA,UACR,qBAAoB;AAAA,QAAA;AAAA,MAAA,IAEpBJ,IACF,gBAAAhZ;AAAA,QAACmhB;AAAA,QAAA;AAAA,UACC,MAAAnI;AAAA,UACA,GAAArP;AAAA,UACA,GAAAC;AAAA,UACA,MAAAwP;AAAA,UACA,OAAAY;AAAA,UACA,OAAAgH;AAAA,QAAA;AAAA,MAAA,IAEA;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASG,GAAoB;AAAA,EAC3B,MAAAnI;AAAA,EACA,GAAArP;AAAA,EACA,GAAAC;AAAA,EACA,MAAAwP;AAAA,EACA,OAAAY;AAAA,EACA,OAAAgH;AACF,GAOG;AACD,QAAM3H,IAAQN,GAAeC,CAAI,GAC3BoI,IAAahI,IAAOX,IACpB4I,IAAchI,EAAM,SAAS+H;AACnC,SACE,gBAAAphB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,YAAYuY;AAAA,MACZ,UAAUa;AAAA,MACV,MAAMY;AAAA,MACN,YAAYsH,GAAmBN,CAAK;AAAA,MACpC,OAAO,EAAE,YAAY,OAAA;AAAA,MAEpB,UAAA3H,EAAM,IAAI,CAACG,GAAM+H,MAChB,gBAAAvhB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,GAAA2J;AAAA,UACA,GAAGC,IAAIyX,IAAc,KAAKE,IAAQ,OAAOH;AAAA,UACzC,kBAAiB;AAAA,UAEhB,UAAA5H,KAAQ;AAAA,QAAA;AAAA,QALJ+H;AAAA,MAAA,CAOR;AAAA,IAAA;AAAA,EAAA;AAGP;ACpFO,SAASC,GAAmB;AAAA,EACjC,KAAAC;AAAA,EACA,eAAAf;AAAA,EACA,aAAAgB;AAAA,EACA,OAAA9D;AACF,GAKG;AACD,QAAM,CAAC+D,GAASC,CAAU,IAAIC,EAAwB,IAAI,GACpDC,IAAcC;AAAA,IAClB,MAAOL,IAAc,CAAC,GAAGA,CAAW,EAAE,KAAA,EAAO,KAAK,IAAI,IAAI;AAAA,IAC1D,CAACA,CAAW;AAAA,EAAA;AAGd,EAAAM,GAAU,MAAM;AACd,QAAIC,IAAY;AAChB,UAAMC,IAAa,IAAI,gBAAA,GACjBC,IAAWxB,GAAgBc,GAAKf,CAAa;AACnD,iBAAMyB,GAAU,EAAE,QAAQD,EAAW,QAAQ,EAC1C,KAAK,CAACE,MAAQ;AACb,UAAI,CAACA,EAAI,GAAI,OAAM,IAAI,MAAM,aAAaA,EAAI,MAAM,EAAE;AACtD,aAAOA,EAAI,KAAA;AAAA,IACb,CAAC,EACA,KAAK,CAACpJ,MAAS;AACd,MAAIiJ,KACJL,EAAW5I,CAAI;AAAA,IACjB,CAAC,EACA,MAAM,CAACqJ,MAAQ;AACd,MAAIJ,KACAI,aAAe,gBAAgBA,EAAI,SAAS,iBAChDT,EAAW,IAAI,GACf,QAAQ;AAAA,QACN,+CAA+CO,CAAQ;AAAA,QAEvDE;AAAA,MAAA;AAAA,IAEJ,CAAC,GACI,MAAM;AACX,MAAAJ,IAAY,IACZC,EAAW,MAAA;AAAA,IACb;AAAA,EACF,GAAG,CAACT,GAAKf,CAAa,CAAC;AAEvB,QAAM4B,IAAQP,GAAQ,MAAM;AAC1B,QAAI,CAACJ,EAAS,QAAO,CAAA;AACrB,UAAMY,IAAUT,IACZ,IAAI,IAAIA,EAAY,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC,IAC/C;AACJ,WAAOU,GAAyBb,GAASY,GAAS3E,CAAK;AAAA,EACzD,GAAG,CAAC+D,GAASG,GAAalE,CAAK,CAAC;AAEhC,SAAI0E,EAAM,WAAW,IAAU,OAG7B,gBAAAtiB,EAAC,KAAA,EAAE,WAAU,iCAAgC,eAAc,QACxD,UAAAsiB,EAAM,IAAI,CAAC5O,GAAM6N,MAChB,gBAAAvhB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,GAAG0T,EAAK;AAAA,MACR,MAAMA,EAAK,QAAQ;AAAA,MACnB,QAAQA,EAAK,UAAU;AAAA,MACvB,aAAaA,EAAK,eAAe;AAAA,MACjC,SAASA,EAAK,WAAW;AAAA,IAAA;AAAA,IALpB,GAAGA,EAAK,EAAE,IAAI6N,CAAK;AAAA,EAAA,CAO3B,GACH;AAEJ;ACxEO,SAASkB,GAAoB9Q,GAA0B;AAC5D,SAAO2M,GAAwB,SAAS3M,CAAI;AAC9C;AAGO,SAAS+Q,GAAqBrN,GAGzB;AACV,SAAO,CAAC8E,GAAa9E,CAAK;AAC5B;AAEO,SAASsN,GAAmBhR,GAAyB;AAC1D,SAAIA,MAAS,UAAUA,MAAS,iBACvB,wDAELA,MAAS,YACJ,0DAELA,MAAS,iBACJ,wDAEF;AACT;ACPO,MAAMiR,KAAqB,IAKrBC,KAA2B;AAEjC,SAASC,GAAgBtjB,GAAc0B,IAAY,IAAgB;AACxE,SACE1B,MAAS,gBACTA,MAAS,kBACTA,MAAS,uBAEF,KAEF0B,MAAc1B,MAAS,YAAYA,MAAS;AACrD;AAOO,SAASujB,GAAqBC,GAGD;AAClC,SAAIA,EAAQ,mBAAmB,QAAQA,EAAQ,oBAAoB,OAC1D,eAEF;AACT;AAEO,SAASC,GACdC,GACA9F,GACkE;AAClE,SAAK8F,IACE,EAAE,WAAW,MAAM,OAAOA,GAAO,KAAK9F,EAAA,IAD1B,EAAE,WAAWA,GAAO,OAAO,MAAM,KAAK,KAAA;AAE3D;AAGO,SAAS+F,GACd3e,GACAC,GACiC;AAEjC,SADI,CAACD,KAAQ,CAACC,KACV8H,GAAS/H,GAAMC,CAAE,KAAK,OAAa,OAChC,EAAE,MAAAD,GAAM,IAAAC,EAAA;AACjB;AAEO,SAAS2e,GAAkBzR,GAA0B;AAC1D,SAAO2M,GAAwB,SAAS3M,CAAI;AAC9C;AAGO,SAAS0R,GACdzlB,GACS;AACT,UAAOA,KAAA,gBAAAA,EAAO,UAAS;AACzB;AAEO,SAAS0lB,GAAmB3R,GAA6B;AAC9D,SAAO4R,GAAwB5R,CAAI;AACrC;AAEO,SAAS6R,GAAgBnO,GAAwC;;AACtE,QAAMsE,IAAMO,GAAa7E,EAAM,QAAQ;AACvC,SAAIsE,EAAI,OAAOA,EAAI,QAAQA,EAAI,OAAOA,EAAI,OACjC;AAAA,IACL,IAAIA,EAAI,OAAOA,EAAI,QAAQ;AAAA,IAC3B,IAAIA,EAAI,OAAOA,EAAI,QAAQ;AAAA,EAAA,MAGjB7b,IAAAuX,EAAM,SAAS,SAAS,CAAC,MAAzB,gBAAAvX,EAA6B,OAC3B,EAAE,GAAG,GAAG,GAAG,EAAA;AAC7B;AASO,SAAS2lB,GACdC,GACAxe,GACS;AACT,SAAOA,EAAM;AAAA,IACX,CAACR,MAASA,EAAK,iBAAiBgf,KAAYhf,EAAK,eAAegf;AAAA,EAAA;AAEpE;AAEO,SAASC,GACdD,GACAxe,GACa;AACb,QAAM0e,IAAM,oBAAI,IAAI,CAACF,CAAQ,CAAC,GACxBG,IAAU,CAACH,CAAQ;AACzB,SAAOG,EAAQ,SAAS,KAAG;AACzB,UAAMllB,IAAUklB,EAAQ,IAAA;AACxB,eAAWnf,KAAQQ,GAAO;AACxB,UAAInD,IAAsB;AAG1B,MAFI2C,EAAK,iBAAiB/F,MAASoD,IAAO2C,EAAK,aAC3CA,EAAK,eAAe/F,MAASoD,IAAO2C,EAAK,eACzC,EAAA3C,KAAQ,QAAQ6hB,EAAI,IAAI7hB,CAAI,OAChC6hB,EAAI,IAAI7hB,CAAI,GACZ8hB,EAAQ,KAAK9hB,CAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO6hB;AACT;AAEO,SAASE,GACd5e,GACA1B,GACAC,GACS;AACT,SAAOyB,EAAM;AAAA,IACX,CAACR,MACEA,EAAK,iBAAiBlB,KAAKkB,EAAK,eAAejB,KAC/CiB,EAAK,iBAAiBjB,KAAKiB,EAAK,eAAelB;AAAA,EAAA;AAEtD;AAcO,SAASugB,GAAoBrf,GAA0C;AAC5E,SACEA,EAAK,SAAS,UACdA,EAAK,SAAS,eACdA,EAAK,SAAS;AAElB;AAEA,SAASsf,GAAqBtf,GAA0C;AACtE,SAAOqf,GAAoBrf,CAAI;AACjC;AAEA,SAASuf,GAAcvf,GAAmBwf,GAAuC;AAC/E,SAAOA,IAAQ,EAAE,GAAGxf,GAAM,OAAAwf,MAAUxf;AACtC;AAGA,SAASyf,GACPC,GACAC,GACArX,GACAsX,GACAC,GACAC,GACwD;AACxD,QAAMhgB,IAAOggB,EAAW,IAAIJ,EAAO,YAAY,GACzC3f,IAAK+f,EAAW,IAAIJ,EAAO,UAAU,GACrCF,IAAQO,GAAaL,CAAM;AACjC,MAAI5f,KAAQC,KAAMyf,GAAO;AACvB,UAAM1T,IAAQkU,GAAgBlgB,GAAMC,GAAIyf,GAAOlX,CAAK;AACpD,WAAO;AAAA,MACL,OAAOwD,EAAM;AAAA,MACb,MAAMyT;AAAA,QACJU,GAASJ,KAAWD,GAAOF,EAAO,cAAcC,GAAYD,EAAO,IAAI;AAAA,QACvE5T,EAAM;AAAA,MAAA;AAAA,MAER,OAAOyT;AAAA,QACLU,GAASJ,KAAWD,GAAOD,GAAYD,EAAO,YAAYA,EAAO,IAAI;AAAA,QACrE5T,EAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAEJ;AACA,SAAO;AAAA,IACL,OAAAxD;AAAA,IACA,MAAM2X,GAASJ,EAAA,GAAWD,GAAOF,EAAO,cAAcC,GAAYD,EAAO,IAAI;AAAA,IAC7E,OAAOO,GAASJ,KAAWD,GAAOD,GAAYD,EAAO,YAAYA,EAAO,IAAI;AAAA,EAAA;AAEhF;AAGO,SAASQ,GACd3f,GACA4f,GACa;AACb,MAAI,CAACA,EAAS,QAAO,oBAAI,IAAA;AACzB,QAAMjB,wBAAU,IAAA;AAChB,aAAWkB,KAAU7f;AACnB,IACE6f,EAAO,YAAYD,EAAQ,WAC3BtY,GAASuY,GAAQD,EAAQ,MAAM,KAAKxQ,MAEpCuP,EAAI,IAAIkB,EAAO,EAAE;AAGrB,SAAOlB;AACT;AAQO,SAASmB,GACd/X,GACA/H,GACAC,GACA8f,GACAC,GACAT,IAA4C,IAAI;AAAA,EAC9Cvf,EAAQ,IAAI,CAAC6f,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC;AAC7C,GAEAI,IAA8B,YACN;AACxB,MAAIC,IAAuC,MACvCC,IAAmC;AAEvC,aAAWN,KAAU7f,GAAS;AAC5B,QAAI+f,EAAW,IAAIF,EAAO,EAAE,EAAG;AAC/B,UAAM3e,IAAIoG,GAASuY,GAAQ9X,CAAK;AAChC,IAAI7G,IAAI8e,MACJ,CAACE,KAAgBhf,IAAIgf,EAAa,cACpCA,IAAe;AAAA,MACb,MAAM;AAAA,MACN,UAAUL,EAAO;AAAA,MACjB,OAAO,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,MAChC,UAAU3e;AAAA,IAAA;AAAA,EAGhB;AAEA,aAAWzB,KAAQQ,GAAO;AAExB,QADI,CAAC8e,GAAqBtf,CAAI,KAC1BsgB,EAAW,IAAItgB,EAAK,YAAY,KAAKsgB,EAAW,IAAItgB,EAAK,UAAU;AACrE;AAEF,UAAMF,IAAOggB,EAAW,IAAI9f,EAAK,YAAY,GACvCD,IAAK+f,EAAW,IAAI9f,EAAK,UAAU;AACzC,QAAI,CAACF,KAAQ,CAACC,EAAI;AAClB,UAAM+R,IAAM6O,GAAqBrY,GAAOxI,GAAMC,GAAIggB,GAAa/f,CAAI,CAAC;AACpE,IAAI8R,EAAI,WAAWyO,MACf,CAACG,KAAY5O,EAAI,WAAW4O,EAAS,cACvCA,IAAW;AAAA,MACT,MAAM;AAAA,MACN,QAAQ1gB,EAAK;AAAA,MACb,cAAcA,EAAK;AAAA,MACnB,YAAYA,EAAK;AAAA,MACjB,OAAO8R,EAAI;AAAA,MACX,UAAUA,EAAI;AAAA,IAAA;AAAA,EAGpB;AAEA,SAAI0O,MAAW,SAAeE,IACvBD,KAAgBC;AACzB;AAaA,SAAST,GACPrO,GACAgO,GACAgB,GACAC,GACA5T,IAA4B,QACf;AACb,SAAO;AAAA,IACL,IAAA2E;AAAA,IACA,OAAAgO;AAAA,IACA,cAAAgB;AAAA,IACA,YAAAC;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,MAAA5T;AAAA,EAAA;AAEJ;AAGO,SAAS6T,GAA0BrF,GAKD;AACvC,QAAM,EAAE,OAAA9K,GAAO,SAAApQ,GAAS,SAAAsf,EAAA,IAAYpE,GAC9BnT,IAAQmT,EAAM,SAASqD,GAAgBnO,CAAK,GAC5CoQ,IAAWxgB,EAAQ;AAAA,IACvB,CAAC6f,MACCA,EAAO,YAAYzP,EAAM,MACzB9I,GAASuY,GAAQ9X,CAAK,KAAKqH;AAAA,EAAA;AAE/B,MAAIoR,UAAiB,EAAE,KAAK,CAAA,GAAI,UAAUA,EAAS,GAAA;AACnD,QAAMC,IAAiB;AAAA,IACrB,IAAInB,EAAA;AAAA,IACJ,SAASlP,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAMiO,GAAmBjO,EAAM,IAAI;AAAA,IACnC,GAAGrI,EAAM;AAAA,IACT,GAAGA,EAAM;AAAA,IACT,aAAa;AAAA,EAAA;AAEf,SAAO,EAAE,KAAK,CAAC,EAAE,IAAI,iBAAiB,QAAQ0Y,GAAM,GAAG,UAAUA,EAAK,GAAA;AACxE;AAMO,SAASC,GAAuBxF,GAA4C;AACjF,QAAM,EAAE,OAAA9K,GAAO,SAAApQ,GAAS,OAAAC,GAAO,OAAAof,GAAO,MAAA9f,GAAM,MAAAkQ,GAAM,SAAAuQ,GAAS,SAAAV,EAAA,IAAYpE,GACjEyF,IAAiB,CAAA;AACvB,MAAIF,IACFzgB,EAAQ;AAAA,IACN,CAAC6f,MACCA,EAAO,YAAYzP,EAAM,MACzB9I,GAASuY,GAAQtgB,CAAI,KAAK6P;AAAA,EAAA,KACzB;AAEP,EAAKqR,MACHA,IAAO;AAAA,IACL,IAAInB,EAAA;AAAA,IACJ,SAASlP,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAMiO,GAAmBjO,EAAM,IAAI;AAAA,IACnC,GAAG7Q,EAAK;AAAA,IACR,GAAGA,EAAK;AAAA,IACR,aAAa;AAAA,EAAA,GAEfohB,EAAI,KAAK,EAAE,IAAI,iBAAiB,QAAQF,GAAM;AAGhD,QAAMG,IAAOd;AAAA,IACXrQ;AAAA,IACAzP;AAAA,IACAC;AAAA,IACA,oBAAI,IAAI,CAACwgB,EAAK,EAAE,CAAC;AAAA,IACjBT;AAAA,EAAA;AAGF,MADI,CAACY,KACDtZ,GAASmZ,GAAMG,EAAK,KAAK,KAAKxR,GAAwB,QAAOuR;AAEjE,MAAIvB;AACJ,QAAMyB,IAAY5gB,EAAM,MAAA;AAExB,MAAI2gB,EAAK,SAAS;AAChB,IAAAxB,IAAawB,EAAK;AAAA,OACb;AACL,UAAMzB,IAASlf,EAAM,KAAK,CAACR,MAASA,EAAK,OAAOmhB,EAAK,MAAM;AAC3D,QAAI,CAACzB,EAAQ,QAAOwB;AACpB,IAAAvB,IAAaE,EAAA;AACb,UAAM/T,IAAQ2T;AAAA,MACZC;AAAA,MACAC;AAAA,MACAwB,EAAK;AAAA,MACLvB;AAAA,MACAC;AAAA,MACA,IAAI,IAAItf,EAAQ,IAAI,CAAC6f,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC,CAAC;AAAA,IAAA;AAEtD,IAAAc,EAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,QAAQ;AAAA,QACN,IAAIvB;AAAA,QACJ,SAAShP,EAAM;AAAA,QACf,SAAS;AAAA,QACT,MAAM;AAAA,QACN,GAAG7E,EAAM,MAAM;AAAA,QACf,GAAGA,EAAM,MAAM;AAAA,QACf,aAAa;AAAA,MAAA;AAAA,IACf,CACD,GACDoV,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQxB,EAAO,IAAI;AACjD,UAAM5Q,IAAOhD,EAAM,MACbiD,IAAQjD,EAAM;AACpB,IAAAoV,EAAI,KAAK,EAAE,IAAI,eAAe,MAAMpS,GAAM,GAC1CoS,EAAI,KAAK,EAAE,IAAI,eAAe,MAAMnS,GAAO,GAC3CqS,EAAU,KAAKtS,GAAMC,CAAK;AAAA,EAC5B;AAEA,MAAIqQ,GAAegC,GAAWJ,EAAK,IAAIrB,CAAU,EAAG,QAAOuB;AAE3D,QAAMG,IAAWL,EAAK,SAAS,aAAa,kBAAkB;AAC9D,SAAAE,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,MAAMjB,GAASJ,EAAA,GAAWD,GAAOoB,EAAK,IAAIrB,GAAY0B,CAAQ;AAAA,EAAA,CAC/D,GACMH;AACT;AAGO,SAASI,GAA6B7F,GAQ/B;AACZ,QAAM,EAAE,QAAA2E,GAAQ,SAAA7f,GAAS,OAAAC,GAAO,OAAAof,GAAO,MAAA5P,GAAM,SAAAuQ,GAAS,SAAAV,MAAYpE,GAC5D8F,IAAW/gB,EAAM;AAAA,IACrB,CAACR,MACCA,EAAK,iBAAiBogB,EAAO,MAAMpgB,EAAK,eAAeogB,EAAO;AAAA,EAAA;AAElE,MAAIA,EAAO,WAAW,QAAQmB,EAAS,SAAS,UAAU,CAAA;AAE1D,QAAMJ,IAAOd;AAAA,IACXrQ;AAAA,IACAzP;AAAA,IACAC;AAAA,IACAye,GAAwBmB,EAAO,IAAI5f,CAAK;AAAA,IACxC+f;AAAA,EAAA;AAEF,MAAI,CAACY,EAAM,QAAO,CAAA;AAElB,MAAIA,EAAK,SAAS,YAAY;AAC5B,QAAII,EAAS,WAAW,GAAG;AACzB,YAAM7B,IAAS6B,EAAS,CAAC,GACnBC,IACJ9B,EAAO,iBAAiBU,EAAO,KAC3BV,EAAO,aACPA,EAAO,cACPwB,IAAiB,CAAA;AACvB,aAAK9B,GAAe5e,GAAOghB,GAASL,EAAK,QAAQ,IAgB/CD,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQxB,EAAO,IAAI,IAfjDwB,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ,GAAGxB;AAAAA,UACH,cACEA,EAAO,iBAAiBU,EAAO,KAC3Be,EAAK,WACLzB,EAAO;AAAA,UACb,YACEA,EAAO,eAAeU,EAAO,KACzBe,EAAK,WACLzB,EAAO;AAAA,QAAA;AAAA,MACf,CACD,GAIHwB,EAAI,KAAK,EAAE,IAAI,iBAAiB,UAAUd,EAAO,IAAI,GAC9Cc;AAAAA,IACT;AAEA,UAAMO,IAAOC;AAAA,MACX9B;AAAA,MACAQ,EAAO;AAAA,MACPe,EAAK;AAAA,MACL3gB;AAAA,MACAqf;AAAA,IAAA,GAEIqB,IAAiB;AAAA,MACrB;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ,EAAE,GAAGd,GAAQ,GAAGe,EAAK,MAAM,GAAG,GAAGA,EAAK,MAAM,EAAA;AAAA,MAAE;AAAA,IACxD;AAEF,WAAIM,KAAMP,EAAI,KAAKO,CAAI,GAChBP;AAAA,EACT;AAEA,QAAMxB,IAASlf,EAAM,KAAK,CAACR,MAASA,EAAK,OAAOmhB,EAAK,MAAM;AAC3D,MAAI,CAACzB,EAAQ,QAAO,CAAA;AACpB,QAAM5T,IAAQ2T;AAAA,IACZC;AAAA,IACAU,EAAO;AAAA,IACPe,EAAK;AAAA,IACLvB;AAAA,IACAC;AAAA,IACA,IAAI,IAAItf,EAAQ,IAAI,CAACyO,MAAS,CAACA,EAAK,IAAIA,CAAI,CAAC,CAAC;AAAA,EAAA;AAEhD,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ,EAAE,GAAGoR,GAAQ,GAAGtU,EAAM,MAAM,GAAG,GAAGA,EAAM,MAAM,EAAA;AAAA,IAAE;AAAA,IAE1D,EAAE,IAAI,eAAe,QAAQ4T,EAAO,GAAA;AAAA,IACpC,EAAE,IAAI,eAAe,MAAM5T,EAAM,KAAA;AAAA,IACjC,EAAE,IAAI,eAAe,MAAMA,EAAM,MAAA;AAAA,EAAM;AAE3C;AAEO,SAAS4V,GACd9B,GACAgB,GACAC,GACArgB,GACAqf,GACgB;AAEhB,SADIe,MAAiBC,KACjBzB,GAAe5e,GAAOogB,GAAcC,CAAU,IAAU,OACrD;AAAA,IACL,IAAI;AAAA,IACJ,MAAMZ,GAASJ,EAAA,GAAWD,GAAOgB,GAAcC,CAAU;AAAA,EAAA;AAE7D;AAEO,SAASc,GAA4BlG,GAOD;AACzC,QAAM,EAAE,SAAAmG,GAAS,OAAAhC,GAAO,MAAA5f,GAAM,OAAAsI,GAAO,SAAAuX,GAAS,SAAAtf,IAAU,CAAA,EAAC,IAAMkb,GACzDkE,IAAaE,EAAA,GACb/T,IAAQ2T;AAAA,IACZzf;AAAA,IACA2f;AAAA,IACArX;AAAA,IACAsX;AAAA,IACAC;AAAA,IACA,IAAI,IAAItf,EAAQ,IAAI,CAAC6f,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC,CAAC;AAAA,EAAA;AAEtD,SAAO;AAAA,IACL,YAAAT;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,IAAIA;AAAA,UACJ,SAAAiC;AAAA,UACA,SAAS;AAAA,UACT,MAAM;AAAA,UACN,GAAG9V,EAAM,MAAM;AAAA,UACf,GAAGA,EAAM,MAAM;AAAA,UACf,aAAa;AAAA,QAAA;AAAA,MACf;AAAA,MAEF,EAAE,IAAI,eAAe,QAAQ9L,EAAK,GAAA;AAAA,MAClC,EAAE,IAAI,eAAe,MAAM8L,EAAM,KAAA;AAAA,MACjC,EAAE,IAAI,eAAe,MAAMA,EAAM,MAAA;AAAA,IAAM;AAAA,EACzC;AAEJ;AAMO,SAAS+V,GACdC,GACAthB,GACW;AACX,QAAMR,IAAOQ,EAAM,KAAK,CAACwO,MAASA,EAAK,OAAO8S,CAAM;AACpD,MAAI,CAAC9hB,EAAM,QAAO,CAAA;AAClB,QAAMqE,IAAY7D,EAAM,OAAO,CAACwO,MAASA,EAAK,OAAO8S,CAAM,GACrDZ,IAAiB,CAAC,EAAE,IAAI,eAAe,QAAAY,GAAQ;AACrD,aAAW9C,KAAY,CAAChf,EAAK,cAAcA,EAAK,UAAU;AACxD,IAAK+e,GAAcC,GAAU3a,CAAS,KACpC6c,EAAI,KAAK,EAAE,IAAI,iBAAiB,UAAAlC,GAAU;AAG9C,SAAOkC;AACT;AAWA,SAASa,GACP/C,GACAxe,GAKA;AACA,QAAM+gB,IAAW/gB,EAAM;AAAA,IACrB,CAACR,MAASA,EAAK,iBAAiBgf,KAAYhf,EAAK,eAAegf;AAAA,EAAA,GAE5DgD,IAAiB,IAAI,IAAIT,EAAS,IAAI,CAACvhB,MAASA,EAAK,EAAE,CAAC,GACxDqE,IACJ7D,EAAM,OAAO,CAACR,MAAS,CAACgiB,EAAe,IAAIhiB,EAAK,EAAE,CAAC,GAC/CiiB,IAAgB;AAAA,IACpB,GAAG,IAAI;AAAA,MACLV,EACG,OAAO,CAACvhB,MAASA,EAAK,SAAS,MAAM,EACrC;AAAA,QAAI,CAACA,MACJA,EAAK,iBAAiBgf,IAAWhf,EAAK,aAAaA,EAAK;AAAA,MAAA;AAAA,IAC1D;AAAA,EACJ,GAEIkiB,IACJD,EAAc,WAAW,KACzB,CAAC7C,GAAe5e,GAAOyhB,EAAc,CAAC,GAAGA,EAAc,CAAC,CAAC,IACrD,CAACA,EAAc,CAAC,GAAGA,EAAc,CAAC,CAAC,IACnC;AACN,EAAIC,KACF7d,EAAU,KAAK,EAAE,cAAc6d,EAAK,CAAC,GAAG,YAAYA,EAAK,CAAC,GAAG;AAG/D,QAAMC,IAAmB,CAACnD,CAAQ,GAC5BoD,IAAO,oBAAI,IAAY,CAACpD,CAAQ,CAAC;AACvC,aAAWhf,KAAQuhB;AACjB,eAAW3P,KAAM,CAAC5R,EAAK,cAAcA,EAAK,UAAU;AAClD,MAAIoiB,EAAK,IAAIxQ,CAAE,MACfwQ,EAAK,IAAIxQ,CAAE,GACNmN,GAAcnN,GAAIvN,CAAS,KAAG8d,EAAiB,KAAKvQ,CAAE;AAG/D,SAAO,EAAE,UAAA2P,GAAU,MAAAW,GAAM,kBAAAC,EAAA;AAC3B;AAGO,SAASE,GACdrD,GACAxe,GACU;AACV,SAAOuhB,GAAuB/C,GAAUxe,CAAK,EAAE;AACjD;AAMO,SAAS8hB,GACdtD,GACAY,GACApf,GACAqf,GACW;AACX,QAAM,EAAE,UAAA0B,GAAU,MAAAW,GAAM,kBAAAC,EAAA,IAAqBJ;AAAA,IAC3C/C;AAAA,IACAxe;AAAA,EAAA,GAEI0gB,IAAiBK,EAAS,IAAI,CAACvhB,OAAU;AAAA,IAC7C,IAAI;AAAA,IACJ,QAAQA,EAAK;AAAA,EAAA,EACb;AACF,EAAIkiB,KACFhB,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,MAAMjB,GAASJ,KAAWD,GAAOsC,EAAK,CAAC,GAAGA,EAAK,CAAC,CAAC;AAAA,EAAA,CAClD;AAEH,aAAWtQ,KAAMuQ;AACf,IAAAjB,EAAI,KAAK,EAAE,IAAI,iBAAiB,UAAUtP,GAAI;AAEhD,SAAOsP;AACT;AChgBA,MAAMqB,KAAc,GACdC,KAAuB,IACvBC,KAAgB,IAChBC,KAAmB,GAEnBC,KAA0B,WAC1BC,KAAc,GACdC,KAAuB,GACvBC,KAAgB,IAChBC,KAAmB,GACnBC,KAAc,GACdC,KAAuB,GACvBC,KAAgB,IAChBC,KAAiB,MACjBC,KAAsB,GACtBC,KAAY,GACZC,KAAe,GAEfC,KAAoB,GACpBC,KAAc;AAEpB,SAASC,GAAY3kB,GAASC,GAAiB;AAC7C,SAAO;AAAA,IACL,EAAE,GAAGD,EAAE,GAAG,GAAGA,EAAE,EAAA;AAAA,IACf,EAAE,GAAGC,EAAE,GAAG,GAAGD,EAAE,EAAA;AAAA,IACf,EAAE,GAAGC,EAAE,GAAG,GAAGA,EAAE,EAAA;AAAA,IACf,EAAE,GAAGD,EAAE,GAAG,GAAGC,EAAE,EAAA;AAAA,EAAE;AAErB;AAEA,SAAS2kB,GAAS5kB,GAASC,GAAiB;AAC1C,SAAO,KAAK,MAAMA,EAAE,IAAID,EAAE,GAAGC,EAAE,IAAID,EAAE,CAAC;AACxC;AAGA,SAAS6kB,GAAkB9O,GAAoC;AAC7D,SAAO,EAAG,sBAAuBA,EAAA;AACnC;AAEA,SAAS+O,GAAU;AAAA,EACjB,IAAAxgB;AAAA,EACA,IAAAC;AAAA,EACA,GAAAlD;AAAA,EACA,MAAA0jB;AAAA,EACA,MAAAzJ;AAAA,EACA,QAAA0J;AAAA,EACA,aAAAC;AAAA,EACA,QAAAnR;AAAA,EACA,aAAAoR,IAAc;AAAA,EACd,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AACF,GAeG;AACD,SACE,gBAAA/oB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAA4oB;AAAA,MACA,gBAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,aAAa,CAAC1iB,MAAMA,EAAE,eAAA;AAAA,MACtB,eAAA2iB;AAAA,MACA,OAAOzR,IAAS,EAAE,QAAAA,EAAA,IAAW;AAAA,MAE7B,UAAA,gBAAAtX,EAAC,KAAA,EAAE,WAAW,aAAa8H,CAAE,IAAIC,CAAE,KACjC,UAAA,gBAAAzH,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA;AAAA,QAAA,gBAAAN,EAAC,UAAA,EAAO,IAAI,GAAG,IAAI,GAAG,GAAGuoB,GAAM,MAAK,cAAA,CAAc;AAAA,QAClD,gBAAAvoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,GAAA6E;AAAA,YACA,MAAAia;AAAA,YACA,aAAA4J;AAAA,YACA,QAAAF;AAAA,YACA,aAAAC;AAAA,YACA,iBAAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAAA,CACF,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAyGA,SAASK,GAAela,GAA4B;AAClD,SAAOA,EACJ,IAAI,CAAC/J,MAAS;AACb,QAAIA,EAAK,WAAW,EAAG,QAAO;AAC9B,QAAIoB,IAAI,KAAKpB,EAAK,CAAC,EAAE,CAAC,IAAIA,EAAK,CAAC,EAAE,CAAC;AACnC,aAASiF,IAAI,GAAGA,IAAIjF,EAAK,QAAQiF,IAAK,CAAA7D,KAAK,MAAMpB,EAAKiF,CAAC,EAAE,CAAC,IAAIjF,EAAKiF,CAAC,EAAE,CAAC;AACvE,WAAA7D,KAAK,MACEA;AAAA,EACT,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS8iB,GAAgB5T,GAAgB6T,GAAmC;AAC1E,SAAI7T,EAAM,aAAmB,KACzB8E,GAAa9E,CAAK,KAClB,CAAC6T,IAAwB,KACtB5K,GAAwB,SAASjJ,EAAM,IAAI;AACpD;AAEA,SAAS8T,GAAkBC,GAA2B;AACpD,SAAKA,IACE,4CADe;AAExB;AAEA,SAASC,GACPD,GACAE,GACiC;AACjC,MAAKF;AACL,WAAO;AAAA,MACL,4BAA4B,OAAOE,CAAW;AAAA,IAAA;AAElD;AAEO,MAAMC,KAAexmB,GAAM;AAAA,EAClC,SAAsB;AAAA,IACpB,OAAAnF;AAAA,IACA,QAAAgX;AAAA,IACA,SAAA3P;AAAA,IACA,OAAAC;AAAA,IACA,aAAAskB;AAAA,IACA,WAAAC,IAAY,CAAA;AAAA,IACZ,WAAArK,IAAY,CAAA;AAAA,IACZ,OAAAxB;AAAA,IACA,MAAApe;AAAA,IACA,iBAAAkqB;AAAA,IACA,mBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,eAAAC,IAAgB;AAAA,IAChB,eAAApJ,IAAgB;AAAA,IAChB,aAAAqJ,IAAc;AAAA,IACd,gBAAAC,IAAiB,CAAA;AAAA,IACjB,uBAAAC,IAAwB,CAAA;AAAA,IACxB,iBAAAf,IAAkB;AAAA,IAClB,UAAAE,IAAW;AAAA,IACX,aAAAE,IAAc;AAAA,IACd,WAAApoB,IAAY;AAAA,IACZ,UAAAgpB,IAAW;AAAA,IACX,cAAAC,KAAe;AAAA,IACf,eAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,6BAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,QAAAhoB;AAAA,IACA,0BAAAioB;AAAA,IACA,cAAAlpB;AAAA,EAAA,GACCmpB,IAAK;;AACN,IAAAC,GAAA;AACA,UAAMC,KAAe1I,GAAgBtjB,GAAM0B,CAAS,GAC9CuqB,IAASC,GAAsB,IAAI,GACnCC,KAAeD,GAAoB,IAAI,GACvCE,KAAYF,GAAuB,IAAI,GACvC,CAAA,EAAGG,EAAM,IAAIhK,EAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GACpC,CAACzF,IAAM0P,EAAO,IAAIjK,EAAS,CAAC,GAC5BkK,KAAUL,GAAO,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,EAAA,GAAK,MAAM,EAAA,CAAG,GAEjDM,KAAcN,GAAO,CAAC,GACtBO,KAAgBP,GAAsB,IAAI,GAC1CQ,KAAiBR,GAA6C,IAAI,GAClE,CAAC5O,IAAWqP,EAAY,IAAItK,EAAS,CAAC,GACtCuK,KAAcV,GAAO,oBAAI,KAAmB,GAC5CW,KAAWX,GAIP,IAAI,GACR,CAACY,IAASC,EAAU,IAAI1K,EAAiB,CAAA,CAAE,GAC3C,CAAC2K,GAAgBC,CAAiB,IAAI5K,EAAS,EAAK,GACpD,CAAC6K,IAAWC,EAAY,IAAI9K,EAAS,EAAK,GAC1C+K,KAAelB,GAAO,EAAK,GAC3B,CAACmB,IAAWC,EAAY,IAAIjL,EAAiC,IAAI,GACjE,CAACkL,IAAeC,CAAgB,IAAInL,EAAiB,CAAA,CAAE,GACvD,CAACoL,GAAYC,CAAa,IAAIrL,EAAwB,IAAI,GAC1D,CAACsL,IAAiBC,EAAkB,IAAIvL,EAAsB,IAAI,GAClE,CAACwL,IAAgBC,EAAiB,IAAIzL,EAI1C,IAAI,GACA,CAAC0L,IAAqBC,EAAsB,IAAI3L,EAG5C,IAAI,GACR,CAAC4L,IAAiBC,EAAkB,IAAI7L,EAAwB,IAAI,GACpE,CAAC8L,IAAiBC,CAAkB,IAAI/L,EAAsB,IAAI,GAClE,CAACgM,IAAkBC,EAAmB,IAAIjM,EAGtC,IAAI,GACR,CAACkM,IAAcC,EAAe,IAAInM,EAAsB,IAAI,GAC5D,CAACoM,IAAkBC,EAAmB,IAAIrM;AAAA,MAC9C;AAAA,IAAA,GAEI,CAACsM,IAAgBC,EAAiB,IAAIvM;AAAA,MAC1C;AAAA,IAAA,GAEI,CAACwM,IAAkBC,EAAmB,IAAIzM;AAAA,MAC9C;AAAA,IAAA,GAEI,CAAC0M,IAAaC,EAAc,IAAI3M,EAAsB,IAAI,GAC1D4M,KAAoB,MAAM;AAC9B,MAAAb,EAAmB,IAAI,GACvBF,GAAmB,IAAI,GACvBI,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AAAA,IACtB;AACA,IAAAhM,GAAU,MAAM;AACd,MAAAqJ,MAAA,QAAAA;AAAA,QACEsC,MAAmB,QAAQZ,GAAc,SAAS,KAAKT,GAAQ,SAAS;AAAA;AAAA,IAE5E,GAAG,CAACA,GAAQ,QAAQjB,IAA0B0B,GAAc,QAAQY,EAAe,CAAC,GACpF3L,GAAU,MAAM;AACd,MAAIyL,MAAmB,SACnBxoB,EAAQ,KAAK,CAAC6f,MAAWA,EAAO,OAAO2I,EAAe,MAC1DC,GAAmB,IAAI,GACvBM,GAAgB,IAAI;AAAA,IACtB,GAAG,CAAC/oB,GAASwoB,EAAe,CAAC;AAC7B,UAAM,CAACiB,IAAUC,EAAW,IAAI9M,EAMtB,IAAI,GACR,CAAC+M,IAAWC,EAAY,IAAIhN,EAIxB,IAAI,GACR,CAACiN,IAAaC,EAAc,IAAIlN,EAAe,EAAE,GAAG,GAAG,GAAG,GAAG,GAC7D,CAACmN,IAAYC,CAAa,IAAIpN,EAgB1B,IAAI,GACR,CAACqN,IAAgBC,EAAiB,IAAItN,EAGlC,IAAI,GACR,CAACuN,IAAgBC,EAAiB,IAAIxN,EAIlC,IAAI,GACR,CAACyN,IAAaC,EAAc,IAAI1N,EAI5B,IAAI,GACR,CAAC2N,IAAWC,EAAY,IAAI5N,EAUxB,IAAI,GACR,CAAC6N,IAAgBC,EAAiB,IAAI9N,EAAwB,IAAI,GAClE,CAAC+N,IAAiBC,EAAkB,IAAIhO,EAAwB,IAAI,GACpE,CAACiO,IAAkBC,EAAmB,IAC1ClO,EAAiC,IAAI,GACjC,CAACmO,IAAqBC,EAAsB,IAAIpO;AAAA,MACpD;AAAA,IAAA,GAEIqO,KAAgB7F,GAChB8F,KAAgB,CAACvM,MAAkB;AACvC,MAAAqM,GAAuB,IAAI,GAC3BC,GAActM,CAAG;AAAA,IACnB;AACA,IAAA5B,GAAU,MAAM;AACd,MAAIgO,MAAuB,SACtB9qB,EAAM,KAAK,CAACR,MAASA,EAAK,OAAOsrB,EAAmB,KACvDC,GAAuB,IAAI;AAAA,IAE/B,GAAG,CAAC/qB,GAAO8qB,EAAmB,CAAC;AAC/B,UAAMI,MACJN,MAAA,gBAAAA,GAAkB,UAAS,SACvB,EAAE,QAAQA,GAAiB,QAAQ,OAAOA,GAAiB,MAAA,IAC3D,MACA,CAACO,IAAaC,EAAc,IAAIzO,EAI5B,IAAI,GACR0O,KAAW7E,GAQP,IAAI,GACR,CAAC8E,IAAWC,EAAY,IAAI5O,EAAS,EAAK,GAE1C6O,IAAU,CAAC7T,MACfD,GAAgBC,GAAIkP,GAAQ,QAAQ,MAAMjP,EAAS,GAE/C6T,KAAc,CAACC,GAAezT,MAAqB;AACvD,YAAM0T,IAAIlF,GAAa;AACvB,MAAKkF,MACLA,EAAE;AAAA,QACA;AAAA,QACA,aAAaD,EAAQ,CAAC,KAAKA,EAAQ,CAAC,WAAWzT,CAAQ;AAAA,MAAA,GAGzD0T,EAAE,MAAM;AAAA,QACN;AAAA,QACA,OAAO9T,GAAkBiP,GAAY,SAAS7O,CAAQ,CAAC;AAAA,MAAA;AAAA,IAE3D,GAEM2T,KAAY,CAACF,GAAezT,MAAqB;AACrD,MAAA4T,GAAA,GACAhF,GAAQ,UAAU,EAAE,KAAK6E,GAAS,MAAMzT,EAAA,GACxC0O,GAAO+E,CAAO,GACd9E,GAAQ3O,CAAQ;AAAA,IAClB,GAKM6T,KAAY,MAAM;AACtB,MAAA/E,GAAc,UAAU;AACxB,YAAM,EAAE,KAAK2E,GAAS,MAAMzT,EAAA,IAAa4O,GAAQ;AACjD,MAAA4E,GAAYC,GAASzT,CAAQ;AAAA,IAC/B,GAEM8T,KAAkB,MAAM;AAC5B,MAAA/E,GAAe,UAAU;AACzB,YAAM,EAAE,KAAK0E,GAAS,MAAMzT,EAAA,IAAa4O,GAAQ;AACjD,MAAAF,GAAO+E,CAAO,GACd9E,GAAQ3O,CAAQ;AAAA,IAClB,GAEM+T,KAAqB,MAAM;AAC/B,MAAIjF,GAAc,WAAW,SAC3BA,GAAc,UAAU,sBAAsB+E,EAAS,IAErD9E,GAAe,WAAW,QAAM,aAAaA,GAAe,OAAO,GACvEA,GAAe,UAAU,WAAW+E,IAAiB,EAAE;AAAA,IACzD,GAEMF,KAAkB,MAAM;AAC5B,MAAI9E,GAAc,WAAW,SAC3B,qBAAqBA,GAAc,OAAO,GAC1CA,GAAc,UAAU,OAEtBC,GAAe,WAAW,SAC5B,aAAaA,GAAe,OAAO,GACnCA,GAAe,UAAU;AAAA,IAE7B,GAEMiF,KAAczF,GAAsB,IAAI,GACxC0F,KAAiB,MAAM;AAC3B,MAAID,GAAY,WAAW,SAC3B,qBAAqBA,GAAY,OAAO,GACxCA,GAAY,UAAU;AAAA,IACxB,GAEME,KAAgB,CAACC,GAAiBC,MAAuB;AAC7D,MAAAR,GAAA,GACAK,GAAA;AACA,YAAM5sB,IAAO;AAAA,QACX,KAAK,EAAE,GAAGunB,GAAQ,QAAQ,IAAA;AAAA,QAC1B,MAAMA,GAAQ,QAAQ;AAAA,MAAA,GAElBtnB,IAAK,EAAE,KAAK6sB,GAAW,MAAMC,EAAA;AACnC,UACE/sB,EAAK,SAASC,EAAG,QACjBD,EAAK,IAAI,MAAMC,EAAG,IAAI,KACtBD,EAAK,IAAI,MAAMC,EAAG,IAAI;AAEtB;AAEF,YAAMyF,IAAU,YAAY,IAAA,GACtBlB,IAAO,CAACwoB,OAAgB;AAC5B,cAAMlvB,KAAI,KAAK,IAAI,IAAIkvB,KAAMtnB,KAAWoT,EAAmB,GACrDvb,KAAO0b,GAAgBjZ,GAAMC,GAAInC,EAAC;AAExC,YADAwuB,GAAU/uB,GAAK,KAAKA,GAAK,IAAI,GACzBO,KAAI,GAAG;AACT,UAAA6uB,GAAY,UAAU,sBAAsBnoB,CAAI;AAChD;AAAA,QACF;AACA,QAAAmoB,GAAY,UAAU;AAAA,MACxB;AACA,MAAAA,GAAY,UAAU,sBAAsBnoB,CAAI;AAAA,IAClD,GAEMyoB,KAAmB,CAAC9pB,MAAmB;AAC3C,YAAM+T,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK;AACV,YAAMR,IAAOQ,EAAI,sBAAA,GACXQ,IAAOJ;AAAA,QACXJ;AAAA,QACAR,EAAK,OAAOA,EAAK,QAAQ;AAAA,QACzBA,EAAK,MAAMA,EAAK,SAAS;AAAA,MAAA,GAErB,EAAE,KAAKwW,GAAY,MAAMhV,EAAA,IAAgBqP,GAAQ,SACjD5O,KAAWX,GAAgBE,IAAc/U,CAAM;AACrD,MAAIwV,OAAaT,KACjB2U,GAAcnU,GAAahB,GAAMwV,GAAYhV,GAAaS,EAAQ,GAAGA,EAAQ;AAAA,IAC/E;AAEA,IAAAwU,GAAoBrG,IAAK,OAAO;AAAA,MAC9B,kBAAkB,MAAM;AACtB,cAAMsG,IAAUvwB,GAAqB0rB,EAAa;AAClD,YAAI6E,EAAQ;AACV,iBAAA5E,EAAiB4E,EAAQ,MAAM,GAC/BpD,GAAe,IAAI,GACnB1B,GAAa,IAAI,GACb8E,EAAQ,OAAO,WAAW,QAAmB,IAAI,GAC9C;AAET,YAAItF,GAAQ,SAAS;AACnB,iBAAAC,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK,GAChB;AAET,cAAM9a,IAAOoR,GAAqB;AAAA,UAChC,iBAAA4K;AAAA,UACA,kBAAAE;AAAA,QAAA,CACD;AACD,eAAAY,GAAA,GACO9c;AAAA,MACT;AAAA,MACA,QAAQ,MAAM8f,GAAiB,IAAI;AAAA,MACnC,SAAS,MAAMA,GAAiB,GAAG;AAAA,MACnC,WAAW,MAAMJ,GAAc,EAAE,GAAG,GAAG,GAAG,EAAA,GAAK,CAAC;AAAA,IAAA,EAChD;AAEF,UAAMQ,KAAe9F,GAAQ,QAAQ;AACrC,IAAA+F,GAAgB,MAAM;AAGpB,MAAA9F,GAAY,UAAU6F,IACtBlB,GAAY5E,GAAQ,QAAQ,KAAKA,GAAQ,QAAQ,IAAI;AAAA,IACvD,CAAC,GAED/J;AAAA,MACE,MAAM,MAAM;AACV,QAAAoP,GAAA,GACAL,GAAA;AAAA,MACF;AAAA,MACA,CAAA;AAAA,IAAC,GAGH/O,GAAU,MAAM;AACd,MAAAuK,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK,GACvBO,EAAiB,CAAA,CAAE,GACnBU,GAAmB,IAAI,GACvBE,EAAmB,IAAI,GACvBE,GAAoB,IAAI,GACxBE,GAAgB,IAAI,GACpBW,GAAY,IAAI,GAChBgB,GAAkB,IAAI,GACtBE,GAAmB,IAAI,GACvBhB,GAAa,IAAI,GACjBI,EAAc,IAAI,GAClB/B,EAAc,IAAI,GAClBE,GAAmB,IAAI,GACvBE,GAAkB,IAAI,GACtBE,GAAuB,IAAI,GAC3B6B,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBQ,GAAoB,IAAI,GACxBN,GAAa,IAAI,GACjBrB,GAAkB,IAAI,GACjB1sB,GAAgBlC,CAAI,MACvB0uB,GAAoB,IAAI,GACxBI,GAAoB,IAAI,IAE1BE,GAAe,IAAI,GACnBO,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG;AAAA,IAC/B,GAAG,CAACvvB,CAAI,CAAC,GAETwiB,GAAU,MAAM;AACd,MAAAmN,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBE,GAAa,IAAI,GACjBa,GAAe,IAAI,GACnBX,GAAkB,IAAI,GACtBd,GAAa,IAAI,GACjBI,EAAc,IAAI,GAClBF,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG;AAAA,IAC/B,GAAG,CAACrF,CAAe,CAAC,GAEpB1H,GAAU,MAAM;AACd,MAAAyM,GAAA,GACAE,GAAY,IAAI,GAChBoB,GAAoB,IAAI,GACxBO,GAAe,IAAI,GACnBX,GAAkB,IAAI,GACtBE,GAAmB,IAAI;AAAA,IACzB,GAAG,CAACjyB,KAAA,gBAAAA,EAAO,EAAE,CAAC;AAEd,UAAMm0B,KAAUC,GAAap0B,KAAA,gBAAAA,EAAO,eAAeisB,CAAW,GACxDoI,KACJnI,KAAiBC,OAAgBnsB,KAAA,gBAAAA,EAAO,UAAS,YAAYgsB,IAAa,OACtEsI,IAAiBnQ;AAAA,MACrB,MACEoQ,GAAoB,CAAC,GAAGnI,GAAgB,GAAGpV,CAAM,GAAG;AAAA,QAClD,kBAAkBsU;AAAA,MAAA,CACnB;AAAA,MACH,CAACc,GAAgBpV,GAAQsU,CAAe;AAAA,IAAA;AAG1C,IAAA4I,GAAgB,MAAM;AACpB,YAAMpW,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK;AACV,YAAM0W,IAAU,MAAM;AACpB,cAAMrwB,IAAOga,GAAiBL,CAAG;AACjC,QAAAyQ,GAAa,CAACpgB,MAAU,KAAK,IAAIA,IAAOhK,CAAI,IAAI,OAAOgK,IAAOhK,CAAK;AAAA,MACrE;AACA,MAAAqwB,EAAA;AACA,YAAMC,IAAK,IAAI,eAAeD,CAAO;AACrC,aAAAC,EAAG,QAAQ3W,CAAG,GACP,MAAM2W,EAAG,WAAA;AAAA,IAClB,GAAG,CAACz0B,KAAA,gBAAAA,EAAO,IAAIm0B,GAAQ,GAAGA,GAAQ,GAAGA,GAAQ,OAAOA,GAAQ,MAAM,CAAC;AAEnE,UAAMO,IAAiBvQ;AAAA,MACrB,MAAMnN,EAAO,OAAO,CAAC5Q,MAAMilB,GAAgBjlB,GAAGklB,CAAe,CAAC;AAAA,MAC9D,CAACtU,GAAQsU,CAAe;AAAA,IAAA,GAEpBqJ,IAAgBxQ;AAAA,MACpB,MAAMuQ,EAAe,OAAO,CAACtuB,MAAMA,EAAE,SAAS,MAAM;AAAA,MACpD,CAACsuB,CAAc;AAAA,IAAA,GAEXE,IAAgB,uBAAsB50B,KAAA,gBAAAA,EAAO,OAAM,MAAM,IACzD60B,IAAiB,wBAAuB70B,KAAA,gBAAAA,EAAO,OAAM,MAAM,IAE3D80B,IACJJ,EAAe,KAAK,CAACtuB,MAAMA,EAAE,OAAO0lB,CAAe,KAAK,MAEpDiJ,KAAkB5Q,GAAQ,MACzB2Q,IACD9D,MAAaA,GAAU,YAAY8D,EAAc,KAC5CpjB,GAAkBsf,GAAU,gBAAgBE,GAAY,GAAGA,GAAY,CAAC,IAE1E4D,EAAc,WAJM,MAK1B,CAACA,GAAe9D,IAAWE,EAAW,CAAC,GAEpC8D,KAAkB7Q;AAAA,MACtB,MACEuQ,EACG,OAAO,CAACtuB,MAAM0N,GAAiB1N,EAAE,IAAI,KAAK,CAACmW,GAAanW,CAAC,CAAC,EAC1D,IAAI,CAACA,OAAO;AAAA,QACX,IAAIA,EAAE;AAAA,QACN,MAAMA,EAAE;AAAA,QACR,OAAOA,EAAE;AAAA,QACT,UAAUA,EAAE;AAAA,MAAA,EACZ;AAAA,MACN,CAACsuB,CAAc;AAAA,IAAA,GAGXO,KAA0B9Q,GAAQ,MAAM;AAC5C,YAAMzV,IAAc,CAAA;AACpB,iBAAW+I,KAASid;AAClB,YAAI,CAAAnY,GAAa9E,CAAK;AACtB,qBAAWlR,KAAQmK,GAAgB+G,EAAM,QAAQ;AAC/C,YAAA/I,EAAI,KAAK,GAAGnI,EAAK,OAAO;AAG5B,aAAOmI;AAAA,IACT,GAAG,CAACgmB,CAAc,CAAC,GAEbQ,KAAsB,CAAC1V,GAAalL,MACpCyE,GAAWic,IAAiBxV,GAAOlL,CAAG,IAAU,KAC7C0gB,GAAgB;AAAA,MACrB,CAACvd,MAAUzE,GAAcyE,EAAM,UAAU+H,GAAOlL,CAAG,KAAK;AAAA,IAAA,GAItD6gB,KAAmB,CAAC3V,MAA6B;AACrD,YAAM4V,IAAMjG,GAAc,UAAU,IAAI,CAACA,GAAc,CAAC,CAAC,IAAI,CAAA;AAC7D,aAAO9V;AAAA,QACLmG;AAAA,QACA,CAAC,GAAG4V,GAAK,GAAGH,EAAuB;AAAA,QACnCnC,EAAQxI,EAAW;AAAA,MAAA;AAAA,IAEvB,GAEM+K,KAAuB,CAAC9c,MAA4B;AACxD,UAAI,CAACA,EAAM,OAAQ;AACnB,MAAAgV,MAAA,QAAAA,GAAoBhV;AACpB,YAAM+c,IAAU,IAAI;AAAA,QAClB/c,EAAM,OAAO,CAAC/P,MAAMA,EAAE,WAAW,QAAQ,EAAE,IAAI,CAACA,MAAMA,EAAE,OAAO;AAAA,MAAA;AAEjE,UAAIsjB,KAAmB,QAAQwJ,EAAQ,IAAIxJ,CAAe,GAAG;AAC3D,cAAMyJ,IAAWhd,EAAM,KAAK,CAAC/P,MAAMA,EAAE,WAAW,QAAQ;AACxD,QAAAgkB,GAAc+I,KAAYA,EAAS,WAAW,WAAWA,EAAS,UAAU,IAAI;AAAA,MAClF;AAAA,IACF,GAEMC,KAAiB,CAAChW,MAAyB;AAC/C,UAAI,CAAC1b,GAAgBlC,CAAI,KAAK0qB,EAAU,QAAO;AAC/C,YAAMmJ,IACJhF,MACA1X,GAAWic,IAAiBxV,GAAOsT,EAAQxI,EAAW,GAAG+F,EAAgB;AAC3E,aAAKoF,IACApF,KAMDrc,GAAYqc,IAAkBoF,CAAM,KACtCnF,GAAoB,IAAI,GACxBI,GAAoB,IAAI,GACjB,OAET2E,GAAqBvc,GAAmBkc,IAAiB3E,IAAkBoF,CAAM,CAAC,GAClFnF,GAAoB,IAAI,GACxBE,GAAkB,IAAI,GACtBE,GAAoB,IAAI,GACjB,OAdLJ,GAAoBmF,CAAM,GAC1BjJ,GAAciJ,EAAO,OAAO,GACxBlyB,GAAgB3B,CAAI,MAAG2C,MAAA,QAAAA,GAAe,YACnC,MALW;AAAA,IAiBtB,GAEMmxB,KAAoB,CAAClW,MAAyB;AAClD,UAAIgW,GAAehW,CAAK,EAAG,QAAO;AAClC,UAAI,CAACjc,GAAgB3B,CAAI,KAAK0qB,EAAU,QAAO;AAC/C,YAAMqJ,IAAS7C,EAAQxI,EAAW,GAC5BsL,IAAU9C,EAAQlJ,EAAa,GAC/BiM,IAAU1c,GAAiB6b,IAAiBxV,GAAOoW,CAAO;AAChE,aAAIC,KAAW,CAACX,GAAoB1V,GAAOmW,CAAM,KAC/CN;AAAA,QACE1c,GAAkBqc,IAAiBa,GAAS/C,EAAQzI,EAAiB,CAAC;AAAA,MAAA,GAExEiG,GAAoB,IAAI,GACxBE,GAAkB,IAAI,GACtBE,GAAoB,IAAI,GACxBlE,GAAcqJ,EAAQ,OAAO,GACtB,MAELxF,MACFC,GAAoB,IAAI,GACxBI,GAAoB,IAAI,GACjB,MAEF;AAAA,IACT,GAEMoF,KAAU,CAAC5Y,GAAiBC,MAA0B;AAC1D,YAAMW,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK,QAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AAC5B,YAAM,EAAE,KAAKgW,GAAY,MAAMhV,EAAA,IAAgBqP,GAAQ;AACvD,aAAO9P;AAAA,QACLH,GAAgBJ,GAAKZ,GAASC,CAAO;AAAA,QACrC2W;AAAA,QACAhV;AAAA,MAAA;AAAA,IAEJ,GAEMiX,KAAkB,CAACvtB,GAAuBuL,MAAoB;;AAClE,YAAMuJ,KAAOpd,IAAA8tB,GAAU,YAAV,gBAAA9tB,EAAmB;AAChC,MAAKod,KACLoV,GAAe;AAAA,QACb,GAAGlqB,EAAE,UAAU8U,EAAK;AAAA,QACpB,GAAG9U,EAAE,UAAU8U,EAAK;AAAA,QACpB,MAAMyH,GAAmBhR,CAAI;AAAA,MAAA,CAC9B;AAAA,IACH,GAEMiiB,KAAqB,CACzBve,GACA5F,GACApL,GACA2I,MACG;AACH,YAAMjL,IAAOsO,GAAagF,EAAM,UAAU5F,GAAWpL,GAAW2I,CAAK;AACrE,MAAAke,GAAsB7V,EAAM,IAAItT,CAAI,GACpCotB,GAAkB;AAAA,QAChB,cAAc1f;AAAA,QACd,aAAapL,IAAY;AAAA,MAAA,CAC1B,GACDgrB,GAAkB,IAAI,GACtBE,GAAe,IAAI;AAAA,IACrB,GAEMsE,KAAiB,CACrBpkB,GACApL,GACAyvB,GACA1tB,MACG;;AACH,MAAKssB,MACLtsB,EAAE,gBAAA,IACFsH,KAAA5P,IAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,EAAA,KAAA5P,GAAoCsI,EAAE,YACtCqpB,GAAa;AAAA,QACX,SAASiD,EAAc;AAAA,QACvB,WAAAjjB;AAAA,QACA,WAAApL;AAAA,QACA,OAAOqvB,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAAA,QACnC,SAASA,EAAE;AAAA,QACX,SAASA,EAAE;AAAA,QACX,UAAA0tB;AAAA,QACA,gBAAgBnB,MAAmBD,EAAc;AAAA,QACjD,UAAU;AAAA,MAAA,CACX;AAAA,IACH,GAEMqB,KAAoB,CAACtkB,GAAmBK,MAAwB;AACpE,UAAI,CAAC4iB,EAAe;AACpB,YAAM3wB,IAAO0O,GAAaiiB,EAAc,UAAUjjB,GAAWK,CAAW;AACxE,MAAI/N,MAAS2wB,EAAc,aAC3BxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CotB,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBJ,EAAc,IAAI;AAAA,IACpB,GAEM+E,KAA2B,CAC/B5W,GACAhX,MACY;;AACZ,UAAI,CAACssB,KAAiB,CAACC,GAAiB,QAAO;AAC/C,YAAMsB,IAAYrjB;AAAA,QAChB+hB;AAAA,QACAvV;AAAA,QACAsT,EAAQlJ,EAAa;AAAA,MAAA;AAGvB,aADI,CAACyM,KACDtd,GAAWic,IAAiBqB,EAAU,OAAOvD,EAAQ,CAAC,CAAC,IAAU,KACjEtqB,EAAE,UAAU,KACd2tB,GAAkBE,EAAU,cAAcA,EAAU,WAAW,GACxD,OAET9E,GAAkB;AAAA,QAChB,cAAc8E,EAAU;AAAA,QACxB,aAAaA,EAAU;AAAA,MAAA,CACxB,GACD5E,GAAkB,IAAI,GACtBJ,EAAc;AAAA,QACZ,MAAM;AAAA,QACN,SAASyD,EAAc;AAAA,QACvB,cAAcuB,EAAU;AAAA,QACxB,aAAaA,EAAU;AAAA,MAAA,CACxB,IACDvmB,KAAA5P,IAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,EAAA,KAAA5P,GAAoCsI,EAAE,YAC/B;AAAA,IACT,GAEM8tB,KAAoB,CAACzkB,GAAmBpL,MAAsB;AAClE,UAAI,CAACquB,EAAe;AACpB,YAAM3wB,IAAOoO,GAAiBuiB,EAAc,UAAUjjB,GAAWpL,CAAS;AAC1E,MAAItC,MAAS2wB,EAAc,aAC3BxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CstB,GAAkB,IAAI,GACtBJ,EAAc,IAAI;AAAA,IACpB,GAEMkF,KAAc,CAClB1kB,GACApL,GACAyW,GACAC,MACG;AACH,UAAI,CAAC2X,EAAe;AACpB,YAAMtV,IAAQsW,GAAQ5Y,GAASC,CAAO,GAChC5W,IAAOmK,GAAgBqkB,MAAmBD,EAAc,QAAQ,EACpEjjB,CACF;AACA,MAAA8f,GAAe;AAAA,QACb,WAAA9f;AAAA,QACA,WAAApL;AAAA,QACA,OAAOF,IAAOqK,GAAgBrK,GAAME,GAAW+Y,CAAK,IAAIA;AAAA,MAAA,CACzD;AAAA,IACH,GAEMoH,KAAazC;AAAA,MACjB,MAAM,IAAI,IAAI9c,EAAQ,IAAI,CAACzB,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC;AAAA,MAC3C,CAACyB,CAAO;AAAA,IAAA,GAEJmvB,KAAqBrS,GAAQ,MAAM;AACvC,YAAM6B,wBAAU,IAAA;AAChB,aAAA1e,EAAM,QAAQ,CAACR,MAAS;AACtB,QAAAkf,EAAI,IAAIlf,EAAK,YAAY,GACzBkf,EAAI,IAAIlf,EAAK,UAAU;AAAA,MACzB,CAAC,GACMkf;AAAA,IACT,GAAG,CAAC1e,CAAK,CAAC,GACJmvB,KAAwBtS,GAAQ,MAAM;AAC1C,YAAMuS,wBAAa,IAAA;AACnB,aAAApvB,EAAM,QAAQ,CAACR,MAAS;AACtB,QAAA4vB,EAAO;AAAA,UACL5vB,EAAK;AAAA,WACJ4vB,EAAO,IAAI5vB,EAAK,YAAY,KAAK,KAAK;AAAA,QAAA,GAEzC4vB,EAAO;AAAA,UACL5vB,EAAK;AAAA,WACJ4vB,EAAO,IAAI5vB,EAAK,UAAU,KAAK,KAAK;AAAA,QAAA;AAAA,MAEzC,CAAC,GACM4vB;AAAA,IACT,GAAG,CAACpvB,CAAK,CAAC,GACJqvB,KAAsBxS;AAAA,MAC1B,MACEkL,KAAc,OACV,oBAAI,QACJtJ,GAAwBsJ,GAAY/nB,CAAK;AAAA,MAC/C,CAAC+nB,GAAY/nB,CAAK;AAAA,IAAA,GAOdsvB,KAJJh1B,MAAS,YACTytB,KAAc,UACdnvB,KAAA0mB,GAAW,IAAIyI,CAAU,MAAzB,gBAAAnvB,GAA4B,YAAW,SACtCu2B,GAAsB,IAAIpH,CAAU,KAAK,MAAM,KAErBE,KACvBpI;AAAA,MACEoI;AAAA,MACAloB;AAAA,MACAC;AAAA,MACAqvB;AAAA,MACA7D,EAAQ7N,EAAwB;AAAA,MAChC2B;AAAA,IAAA,IAEF,MACAiQ,KAAoB1S,GAAQ,MAAM;AACtC,UAAIkL,KAAc,QAAQ,CAACE,GAAiB,QAAO3I;AACnD,YAAMkQ,IAAUlQ,GAAW,IAAIyI,CAAU;AACzC,UAAI,CAACyH,EAAS,QAAOlQ;AACrB,YAAMziB,IAAO,IAAI,IAAIyiB,EAAU;AAC/B,aAAAziB,EAAK,IAAIkrB,GAAY;AAAA,QACnB,GAAGyH;AAAA,QACH,IAAIF,MAAA,gBAAAA,GAAe,UAASrH;AAAA,MAAA,CAC7B,GACMprB;AAAA,IACT,GAAG,CAACyiB,IAAYyI,GAAYE,IAAiBqH,EAAa,CAAC,GACrDG,KAAgB5S;AAAA,MACpB,MACE7c,EACG,IAAI,CAACR,MAAS;AACb,cAAMF,IAAOiwB,GAAkB,IAAI/vB,EAAK,YAAY,GAC9CD,IAAKgwB,GAAkB,IAAI/vB,EAAK,UAAU;AAChD,eAAI,CAACF,KAAQ,CAACC,IAAW,KAClBmwB;AAAA,UACLpwB;AAAA,UACAC;AAAA,UACAowB,GAAkBnwB,GAAM8f,IAAYiQ,EAAiB;AAAA,QAAA;AAAA,MAEzD,CAAC,EACA,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACb,CAACjQ,IAAYiQ,IAAmBvvB,CAAK;AAAA,IAAA,GAEjCmb,KAAsB0B;AAAA,MAC1B,MAAM,IAAI,IAAIyH,EAAY,IAAI,CAAClJ,MAAQ,CAACA,EAAI,SAASA,CAAG,CAAC,CAAC;AAAA,MAC1D,CAACkJ,CAAW;AAAA,IAAA,GAERsL,KAAmB/S;AAAA,MACvB,MACEyJ,KACItL,GAA2B;AAAA,QACzB,QAAQoS;AAAA,QACR,gBAAAtI;AAAA,QACA,aAAAR;AAAA,QACA,WAAAC;AAAA,QACA,WAAArK;AAAA,QACA,OAAAxB;AAAA,MAAA,CACD,IACD,CAAA;AAAA,MACN;AAAA,QACEwB;AAAA,QACAoK;AAAA,QACA8I;AAAA,QACA7I;AAAA,QACA7L;AAAA,QACAoM;AAAA,QACAwB;AAAA,MAAA;AAAA,IACF,GAGIuJ,KAAyB,CAACja,GAAiBC,MAAoB;AACnE,YAAMqC,IAAQsW,GAAQ5Y,GAASC,CAAO;AACtC,OACE4S,MACAE,MACCtuB,GAAiBC,CAAI,KAAKiuB,MAAmB,SAE9CO,GAAgB5Q,CAAK,GAEvB2S;AAAA,QACEhL;AAAA,UACE3H;AAAA,UACAnY;AAAA,UACAC;AAAA,UACA0f,GAAmB3f,GAAS4oB,EAAgB;AAAA,UAC5C6C,EAAQ7N,EAAwB;AAAA,UAChC2B;AAAA,UACA5iB,GAAkBpC,CAAI,IAAI,SAAS;AAAA,QAAA;AAAA,MACrC;AAAA,IAEJ,GAEMw1B,KAAe,MAAM;AACzB,UAAIjI,GAAc,SAAS,GAAG;AAC5B,QAAAC,EAAiB,CAAA,CAAE,GACnBgB,GAAgB,IAAI,GACpBQ,GAAe,IAAI;AACnB;AAAA,MACF;AACA,MAAAvD,GAAc,QAAQjc,GAAmB,CAAC+d,EAAa,CAAC,CAAC,GACzDC,EAAiB,CAAA,CAAE,GACnBgB,GAAgB,IAAI,GACpBQ,GAAe,IAAI;AAAA,IACrB;AAEA,IAAAxM,GAAU,MAAM;AACd,YAAMiT,IAAQ,CAAC7uB,MAAqB;AAClC,YAAIA,EAAE,QAAQ,SAAS;AACrB,gBAAM8uB,IAAO9uB,EAAE,SAAS;AACxB,UAAI7E,GAAkB/B,CAAI,KAAGitB,EAAkByI,CAAI,GAC9CA,KAAMpI,GAAa,IAAI;AAC5B;AAAA,QACF;AAIA,YAHI,CAAClV,GAAcxR,CAAC,KAChBrH,GAAuBqH,EAAE,MAAM,MACnCA,EAAE,eAAA,GACEA,EAAE,SAAS,aAAaA,EAAE,QAAQ;AACtC,cAAM8uB,IAAO9uB,EAAE,SAAS;AACxB,QAAAwmB,GAAa,UAAUsI,GACvBvI,GAAauI,CAAI;AAAA,MACnB,GACMC,IAAS,MAAM;AACnB,QAAAvI,GAAa,UAAU,IACvBD,GAAa,EAAK;AAAA,MACpB;AACA,oBAAO,iBAAiB,WAAWsI,CAAK,GACxC,OAAO,iBAAiB,SAASA,CAAK,GACtC,OAAO,iBAAiB,QAAQE,CAAM,GAC/B,MAAM;AACX,eAAO,oBAAoB,WAAWF,CAAK,GAC3C,OAAO,oBAAoB,SAASA,CAAK,GACzC,OAAO,oBAAoB,QAAQE,CAAM;AAAA,MAC3C;AAAA,IACF,GAAG,CAAC31B,CAAI,CAAC,GAETwiB,GAAU,MAAM;AACd,YAAMiT,IAAQ,CAAC7uB,MAAqB;AAYlC,YAXIhF,GAAkB5B,CAAI,MACpB4G,EAAE,QAAQ,WACZA,EAAE,eAAA,GACF4uB,GAAA,KACS5uB,EAAE,QAAQ,aACnB4mB,EAAiB,CAAA,CAAE,GACnBgB,GAAgB,IAAI,GACpBQ,GAAe,IAAI,GACnB1B,GAAa,IAAI,KAInB1mB,EAAE,QAAQ,YACV,CAACrH,GAAuBqH,EAAE,MAAM,KAChC6nB,MAAoB,MACpB;AACA,UAAA7nB,EAAE,eAAA,GACF8nB,GAAoB,IAAI,GACxBE,GAAkB,IAAI,GACtBE,GAAoB,IAAI;AACxB;AAAA,QACF;AAYA,YAVEloB,EAAE,QAAQ,YACV,CAACrH,GAAuBqH,EAAE,MAAM,MAC/B7G,GAAiBC,CAAI,KACpBquB,MAAoB,QACpBF,MAAmB,QACnBF,MAAmB,UAErBrnB,EAAE,eAAA,GACFhD,MAAA,QAAAA,QAGCgD,EAAE,QAAQ,eAAeA,EAAE,QAAQ,aACpCssB,KACAzxB,GAAqBzB,GAAM0B,CAAS,KACpCS,GAAkBnC,CAAI,KACtB0vB,IACA;AACA,UAAA9oB,EAAE,eAAA;AACF,gBAAMrE,IAAO0O;AAAA,YACXiiB,EAAc;AAAA,YACdxD,GAAe;AAAA,YACfA,GAAe;AAAA,UAAA;AAEjB,UAAIntB,MAAS2wB,EAAc,aACzBxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CotB,GAAkB,IAAI;AAAA,QAE1B;AACA,aACG/oB,EAAE,QAAQ,eAAeA,EAAE,QAAQ,aACpCssB,KACAzxB,GAAqBzB,GAAM0B,CAAS,KACpCU,GAAkBpC,CAAI,KACtB4vB,IACA;AACA,UAAAhpB,EAAE,eAAA;AACF,gBAAMrE,IAAOoO;AAAA,YACXuiB,EAAc;AAAA,YACdtD,GAAe;AAAA,YACfA,GAAe;AAAA,UAAA;AAEjB,UAAIrtB,MAAS2wB,EAAc,aACzBxH,GAAsBwH,EAAc,IAAI3wB,CAAI,GAC5CstB,GAAkB,IAAI;AAAA,QAE1B;AAAA,MACF;AACA,oBAAO,iBAAiB,WAAW4F,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,IAE1D,GAAG;AAAA,MACDz1B;AAAA,MACAutB;AAAA,MACA2F;AAAA,MACAxD;AAAA,MACAE;AAAA,MACAvB;AAAA,MACAF;AAAA,MACAF;AAAA,MACAQ;AAAA,MACA7qB;AAAA,IAAA,CACD,GAED4e,GAAU,MAAM;AACd,YAAMoT,IAAOxJ,GAAU;AACvB,UAAI,CAACwJ,EAAM;AACX,YAAMC,IAAU,CAACjvB,MAAkB;AAEjC,YADAA,EAAE,eAAA,GACEA,EAAE,WAAW,EAAG;AACpB,cAAMsV,IAAM+P,EAAO;AACnB,YAAI,CAAC/P,EAAK;AACV,QAAA0V,GAAA;AACA,cAAMlV,IAAOJ,GAAgBJ,GAAKtV,EAAE,SAASA,EAAE,OAAO,GAChD,EAAE,KAAKsrB,GAAY,MAAMhV,GAAA,IAAgBqP,GAAQ,SACjD5O,KAAWV,GAAwBC,IAAatW,CAAC;AACvD,QAAI+W,OAAaT,OACjBqP,GAAQ,UAAU;AAAA,UAChB,KAAK7O,GAAahB,GAAMwV,GAAYhV,IAAaS,EAAQ;AAAA,UACzD,MAAMA;AAAA,QAAA,GAER+T,GAAA;AAAA,MACF;AACA,aAAAkE,EAAK,iBAAiB,SAASC,GAAS,EAAE,SAAS,IAAO,SAAS,IAAM,GAClE,MAAM;AACX,QAAAtE,GAAA,GACAqE,EAAK,oBAAoB,SAASC,GAAS,EAAE,SAAS,IAAM;AAAA,MAC9D;AAAA,IACF,GAAG,CAAC,EAAQz3B,CAAM,CAAC;AAEnB,UAAM03B,KAAa,MAAM;AACvB,MAAAvE,GAAA,GACAK,GAAA;AACA,YAAM1V,IAAM+P,EAAO,SACbnf,IAAM,CAAC,GAAG8f,GAAY,QAAQ,QAAQ;AAC5C,UAAI,CAAC1Q,KAAOpP,EAAI,SAAS,EAAG;AAC5B,YAAM7G,IAAM,EAAE,IAAI6G,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,GAAG,IAAIA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,EAAA,GACjE4P,IAAOJ,GAAgBJ,GAAKjW,EAAI,GAAGA,EAAI,CAAC,GACxC,EAAE,KAAKisB,GAAY,MAAMhV,EAAA,IAAgBqP,GAAQ;AACvD,MAAAM,GAAS,UAAU;AAAA,QACjB,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM/f,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,GAAGA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,CAAC,CAAC;AAAA,QAC3E,WAAWoQ;AAAA,QACX,OAAOT,GAAYC,GAAMwV,GAAYhV,CAAW;AAAA,MAAA,GAElD6T,GAAS,UAAU,MACnBE,GAAa,EAAK,GAClBlE,GAAW,CAAA,CAAE,GACbsC,GAAa,IAAI,GACjBI,EAAc,IAAI,GAClB/B,EAAc,IAAI,GAClBE,GAAmB,IAAI;AAAA,IACzB,GAEMmI,KAA6B,CAACnvB,MAA0B;AAE5D,UADAgmB,GAAY,QAAQ,IAAIhmB,EAAE,WAAW,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,QAAA,CAAS,GAC/DgmB,GAAY,QAAQ,QAAQ,GAAG;AACjC,QAAAhmB,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFkvB,GAAA;AACA;AAAA,MACF;AAGA,MAAI,CAAC1I,GAAa,WAAWxmB,EAAE,WAAW,MAC1CA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFovB,GAASpvB,GAAG,EAAK;AAAA,IACnB,GAEMqvB,KAA6B,CAACrvB,MAA0B;AAI5D,UAHIgmB,GAAY,QAAQ,IAAIhmB,EAAE,SAAS,KACrCgmB,GAAY,QAAQ,IAAIhmB,EAAE,WAAW,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,QAAA,CAAS,GAEjE,CAACimB,GAAS,WAAWD,GAAY,QAAQ,OAAO,EAAG;AACvD,YAAM1Q,IAAM+P,EAAO;AACnB,UAAI,CAAC/P,EAAK;AACV,MAAAtV,EAAE,gBAAA;AACF,YAAMkG,IAAM,CAAC,GAAG8f,GAAY,QAAQ,QAAQ,GACtC/a,IAAO,KAAK,MAAM/E,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,GAAGA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,CAAC,GAC1D7G,IAAM,EAAE,IAAI6G,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,GAAG,IAAIA,EAAI,CAAC,EAAE,IAAIA,EAAI,CAAC,EAAE,KAAK,EAAA,GACjE4P,IAAOJ,GAAgBJ,GAAKjW,EAAI,GAAGA,EAAI,CAAC,GACxC0X,KAAWX;AAAA,QACf6P,GAAS,QAAQ,aAAahb,IAAOgb,GAAS,QAAQ;AAAA,MAAA;AAExD,MAAAyE,GAAUzT,GAAsBnB,GAAMmQ,GAAS,QAAQ,OAAOlP,EAAQ,GAAGA,EAAQ;AAAA,IACnF,GAEMuY,KAA2B,CAACtvB,MAA0B;AAC1D,YAAMuvB,IAActJ,GAAS,WAAW;AACxC,MAAAD,GAAY,QAAQ,OAAOhmB,EAAE,SAAS,GAClCgmB,GAAY,QAAQ,OAAO,SAAY,UAAU,OACjDuJ,OAAe,gBAAA;AAAA,IACrB,GAEMH,KAAW,CAACpvB,GAAuBwvB,MAA6B;;AACpE,MAAAxE,GAAA;AACA,YAAM1V,IAAM+P,EAAO,SACbvP,IAAOR,IACTI,GAAgBJ,GAAKtV,EAAE,SAASA,EAAE,OAAO,IACzC,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,QAAA;AACzB,MAAAmqB,GAAS,UAAU;AAAA,QACjB,GAAGrU,EAAK;AAAA,QACR,GAAGA,EAAK;AAAA,QACR,MAAM6P,GAAQ,QAAQ,IAAI;AAAA,QAC1B,MAAMA,GAAQ,QAAQ,IAAI;AAAA,QAC1B,SAAS3lB,EAAE;AAAA,QACX,SAASA,EAAE;AAAA,QACX,iBAAAwvB;AAAA,MAAA,GAEFnF,GAAa,EAAI;AACjB,YAAMoF,IAAcpK,EAAO,WAAWrlB,EAAE;AACxC,OAAAtI,IAAA+3B,EAAY,sBAAZ,QAAA/3B,EAAA,KAAA+3B,GAAgCzvB,EAAE;AAAA,IACpC,GAEM0vB,KAA0B,CAACtP,GAAgBxZ,MAAgB;AAC/D,YAAM+oB,IAAUtL,GAAsBjE,GAAQxZ,CAAK;AACnD,MAAIzN,GAAiBC,CAAI,KAAK,OAAOu2B,KAAY,aAC3CpI,MACFrD,GAAmBqD,IAAiBoI,CAAO,GAC3CnI,EAAmB,IAAI,GACvBF,GAAmB9tB,GAAqBJ,GAAMu2B,CAAO,CAAC,KAC7CtI,MAAmB,QAAQA,OAAoBsI,KACxDvL,KAAA,QAAAA,EAAqBiD,IAAiBsI,IACtCrI,GAAmB9tB,GAAqBJ,GAAMu2B,CAAO,CAAC,KAEtDrI,GAAmBqI,CAAO,IAG9B5F,GAAc,OAAO4F,KAAY,WAAW,CAACA,CAAO,IAAI,CAAA,CAAE;AAAA,IAC5D,GAEMC,KAAuB,CAACxP,MAAmB;AAC/C,UAAI0D,KAAY,CAACsB,GAAc;AAC/B,YAAM9mB,IAAOQ,EAAM,KAAK,CAACwO,MAASA,EAAK,OAAO8S,CAAM;AAEpD,UADAmE,GAAkBnE,CAAM,GACpB9hB,GAAM;AACR,cAAMqE,IAAY7D,EAAM,OAAO,CAACwO,MAASA,EAAK,OAAO8S,CAAM,GACrDyP,IAAU,CAACvxB,EAAK,cAAcA,EAAK,UAAU,EAAE;AAAA,UACnD,CAAC4R,MAAO,CAACmN,GAAcnN,GAAIvN,CAAS;AAAA,QAAA;AAEtC,QAAA2kB;AAAA,UAAmB,CAAC3hB,MAClBA,KAAQ,QAAQkqB,EAAQ,SAASlqB,CAAI,IAAI,OAAOA;AAAA,QAAA;AAAA,MAEpD;AACA,MAAAgkB,GAAoB,IAAI;AAAA,IAC1B,GAEMmG,KAAyB,CAACxS,MAAqB;AACnD,UAAIwG,KAAY,CAACsB,GAAc;AAC/B,YAAM2K,IAAU,IAAI,IAAIpP,GAA8BrD,GAAUxe,CAAK,CAAC;AACtE,MAAAwlB,GAAoBhH,CAAQ,GAC5BgK;AAAA,QAAmB,CAAC3hB,MAClBA,KAAQ,QAAQoqB,EAAQ,IAAIpqB,CAAI,IAAI,OAAOA;AAAA,MAAA,GAE7CmhB,EAAc,IAAI,GAClBE,GAAmB,IAAI,GACvBU,GAAoB,IAAI,GACxBF,EAAmB,IAAI,GACvBI,GAAgB,IAAI,GACpB6B,GAAmB,CAACvZ,MAAQA,KAAM,QAAQ6f,EAAQ,IAAI7f,CAAE,IAAI,OAAOA,CAAG;AAAA,IACxE,GAEMsS,KAAgB,CAACxiB,MAA0B;;AAC/C,UAAIimB,GAAS,QAAS;AACtB,UAAIO,GAAa,SAAS;AACxB,QAAA4I,GAASpvB,GAAG,EAAK;AACjB;AAAA,MACF;AACA,UAAI8jB,KAAY1qB,MAAS,SAAS4G,EAAE,WAAW,GAAG;AAChD,QAAAovB,GAASpvB,GAAG,EAAK;AACjB;AAAA,MACF;AACA,YAAMgX,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAIlF,KAAa,CAACzB,GAAuBD,CAAI,GAAG;AAC9C,QAAA2C,MAAA,QAAAA,GAAe;AACf;AAAA,MACF;AAEA,UAAIhB,GAAgB3B,CAAI,GAAG;AAEzB,YADIw0B,GAAyB5W,GAAOhX,CAAC,KACjCktB,GAAkBlW,CAAK,EAAG;AAC9B,QAAAoY,GAASpvB,GAAG,EAAI;AAChB;AAAA,MACF;AAEA,UAAIhF,GAAkB5B,CAAI,GAAG;AAC3B,cAAM42B,IAAUrD,GAAiB3V,CAAK,KAAKmR,IACrC8H,IACJjwB,EAAE,YAAY,CAACgwB,KAAWrJ,GAAc,SAAS,IAC7C3V,GAAoB2V,GAAcA,GAAc,SAAS,CAAC,GAAG3P,CAAK,IAClE,MACAkZ,KAASF,MAAWC,KAAA,gBAAAA,EAAa,UAASjZ;AAEhD,YADA0P,GAAauJ,CAAW,GACpBtJ,GAAc,UAAU,GAAG;AAC7B,gBAAM5a,KAAQ4a,GAAc,CAAC;AAC7B,cAAI,KAAK,MAAMuJ,GAAO,IAAInkB,GAAM,GAAGmkB,GAAO,IAAInkB,GAAM,CAAC,KAAKue,EAAQxI,EAAW,GAAG;AAC9E,YAAA8M,GAAA;AACA;AAAA,UACF;AAAA,QACF;AACA,QAAAhI,EAAiB,CAACjhB,OAAS,CAAC,GAAGA,IAAMuqB,EAAM,CAAC,GAC5CtI,GAAgBsI,EAAM,GACtB9H,GAAe,IAAI;AACnB;AAAA,MACF;AAEA,UAAIhD,IAAc;AAChB,YAAI5pB,GAAkBpC,CAAI,GAAG;AAC3B,gBAAM+2B,KAAYxR;AAAA,YAChB3H;AAAA,YACAnY;AAAA,YACAC;AAAA,gCACI,IAAA;AAAA,YACJwrB,EAAQ7N,EAAwB;AAAA,YAChC2B;AAAA,YACA;AAAA,UAAA,GAEIgS,MACJD,MAAA,gBAAAA,GAAW,UAAS,SAChBrxB,EAAM,KAAK,CAACR,OAASA,GAAK,OAAO6xB,GAAU,MAAM,IACjD;AACN,cAAIC,MAAazS,GAAoByS,EAAS,GAAG;AAC/C,YAAAtG,GAAc,CAAA,CAAE,GAChBD,GAAuBuG,GAAU,EAAE;AACnC;AAAA,UACF;AACA,UAAAhB,GAASpvB,GAAG,EAAI;AAChB;AAAA,QACF;AACA,cAAMqwB,IAAe7R,GAAmB3f,GAAS4oB,EAAgB,GAC3DhI,IAAOd;AAAA,UACX3H;AAAA,UACAnY;AAAA,UACAC;AAAA,UACAuxB;AAAA,UACA/F,EAAQ7N,EAAwB;AAAA,UAChC2B;AAAA,QAAA;AAEF,YAAIqJ,IAAkB;AACpB,YAAIhI,KAAA,gBAAAA,EAAM,UAAS,WAAUA,KAAA,gBAAAA,EAAM,UAAS,eAC1C+E;AAAA,YACEiD,GAAiB;AAAA,YACjBA,GAAiB;AAAA,YACjBhI,EAAK;AAAA,YACL6K,EAAQ7N,EAAwB;AAAA,UAAA,GAGpCiL,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AACpB;AAAA,QACF;AACA,YAAItuB,GAAwBF,CAAI,KAAK4G,EAAE,UAAU,EAAG;AACpD,aAAIyf,KAAA,gBAAAA,EAAM,UAAS,QAAQ;AACzB,cAAI,CAACtmB,GAAiBC,CAAI,GAAG;AAC3B,YAAA0wB,GAAc,CAAA,CAAE,GAChBD,GAAuBpK,EAAK,MAAM;AAClC;AAAA,UACF;AACA,UAAAiQ,GAAwBjQ,EAAK,QAAQA,EAAK,KAAK;AAC/C;AAAA,QACF;AACA,aAAIA,KAAA,gBAAAA,EAAM,UAAS,YAAY;AAC7B,UAAItmB,GAAiBC,CAAI,MACnBmuB,MACFrD,GAAmBqD,IAAiB9H,EAAK,QAAQ,GACjD+H,EAAmB,IAAI,GACvBF,GAAmB9tB,GAAqBJ,GAAMqmB,EAAK,QAAQ,CAAC,KACnD4H,MAAmB,QAAQA,OAAoB5H,EAAK,YAC7D2E,KAAA,QAAAA,EAAqBiD,IAAiB5H,EAAK,WAC3C6H,GAAmB9tB,GAAqBJ,GAAMqmB,EAAK,QAAQ,CAAC,KAE5D6H,GAAmB7H,EAAK,QAAQ,IAGpCsK,GAAc,CAACtK,EAAK,QAAQ,CAAC;AAC7B;AAAA,QACF;AACA,YAAItmB,GAAiBC,CAAI,GAAG;AAC1B,cAAIiuB,MAAmB,MAAM;AAC3B,kBAAMsI,KAAUzL,GAAmBlN,GAAOqQ,EAAe;AACzD,YAAAC;AAAA,cACE9tB;AAAA,gBACEJ;AAAA,gBACA,OAAOu2B,MAAY,WAAWA,KAAU;AAAA,cAAA;AAAA,YAC1C,GAEF/H,GAAgB5Q,CAAK;AACrB;AAAA,UACF;AACA,gBAAMrb,KAAOkhB,GAA0B0K,IAAiBvQ,CAAK;AAG7D,cAFAwQ,EAAmB7rB,GAAK,SAAS,GACjCisB,GAAgB5Q,CAAK,GACjBrb,GAAK,SAASA,GAAK,KAAK;AAC1B,kBAAMg0B,KAAUxL,GAAqBxoB,GAAK,OAAOA,GAAK,GAAG;AACzD,YAAA2rB;AAAA,cACE9tB;AAAA,gBACEJ;AAAA,gBACA,OAAOu2B,MAAY,WAAWA,KAAU;AAAA,cAAA;AAAA,YAC1C;AAAA,UAEJ;AACA;AAAA,QACF;AACA,QAAAP,GAASpvB,GAAG,EAAI;AAChB;AAAA,MACF;AACA,UAAI5G,MAAS,aAAa;AACxB,cAAM4Z,IAAOP,GAAwB;AACrC,QAAAoS;AAAA,UACE;AAAA,UACAnR,GAAkBsD,GAAO/E,IAAoBe,CAAI;AAAA,UACjD,EAAE,OAAOW,GAAiB1B,IAAoBe,GAAMwE,EAAM,gBAAgB,EAAA;AAAA,QAAE;AAE9E;AAAA,MACF;AACA,UAAIpe,MAAS,iBAAiB;AAC5B,QAAAyrB;AAAA,UACE;AAAA,UACAvQ,GAAqB0C,GAAOsZ,EAAqB;AAAA,UACjD,EAAE,OAAOrc,GAAqBqc,IAAuB9Y,EAAM,gBAAgB,EAAA;AAAA,QAAE;AAE/E;AAAA,MACF;AACA,UAAIpe,MAAS,eAAe+B,GAAkB/B,CAAI,GAAG;AACnD,SAAAkO,KAAA5P,IAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,EAAA,KAAA5P,GAAoCsI,EAAE,YACtCqmB,EAAkBrmB,EAAE,QAAQ,GAC5BmmB,GAAW,CAACnP,GAAOA,CAAK,CAAC;AACzB;AAAA,MACF;AAEA,UAAIxb,GAAkBpC,CAAI,KAAKkzB,KAAiBC,IAAiB;AAC/D,cAAMgE,IAAY3lB,GAAc2hB,IAAiBvV,GAAOsT,EAAQ9I,EAAa,CAAC;AAC9E,YAAI+O,GAAW;AACb,cAAIvwB,EAAE,UAAU,GAAG;AACjB,YAAA8tB,GAAkByC,EAAU,WAAWA,EAAU,SAAS;AAC1D;AAAA,UACF;AACA,UAAAtH,GAAkB;AAAA,YAChB,WAAWsH,EAAU;AAAA,YACrB,WAAWA,EAAU;AAAA,YACrB,QAAQA,EAAU;AAAA,UAAA,CACnB,GACDxH,GAAkB,IAAI,GACtBF,EAAc;AAAA,YACZ,MAAM;AAAA,YACN,SAASyD,EAAc;AAAA,YACvB,WAAWiE,EAAU;AAAA,YACrB,WAAWA,EAAU;AAAA,YACrB,QAAQA,EAAU;AAAA,UAAA,CACnB,IACDC,KAAAC,IAAAzwB,EAAE,eAAc,sBAAhB,QAAAwwB,EAAA,KAAAC,GAAoCzwB,EAAE;AACtC;AAAA,QACF;AACA,cAAM0wB,IAASvlB;AAAA,UACbohB;AAAA,UACAvV;AAAA,UACAsT,EAAQ9I,EAAa;AAAA,QAAA;AAEvB,YAAIkP,KAAUA,EAAO,SAAS,QAAQ;AACpC,UAAA3H,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBN,EAAc;AAAA,YACZ,MAAM;AAAA,YACN,SAASyD,EAAc;AAAA,YACvB,WAAWoE,EAAO;AAAA,YAClB,WAAWA,EAAO;AAAA,UAAA,CACnB,IACDC,MAAAC,KAAA5wB,EAAE,eAAc,sBAAhB,QAAA2wB,GAAA,KAAAC,IAAoC5wB,EAAE;AACtC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,EAAA1E,GAAgBlC,CAAI,KAAK4zB,GAAehW,CAAK,IAEjD;AAAA,YAAIzb,GAAkBnC,CAAI,KAAKkzB,KAAiBC,IAAiB;AAC/D,gBAAMsE,IAAYvG,EAAQlJ,EAAa,GACjChR,IAAM5F,GAAc+hB,IAAiBvV,GAAO6Z,CAAS;AAC3D,cAAIzgB,GAAK;AACP,gBAAIpQ,EAAE,UAAU,GAAG;AACjB,cAAA2tB,GAAkBvd,EAAI,cAAcA,EAAI,WAAW;AACnD;AAAA,YACF;AACA,YAAA2Y,GAAkB;AAAA,cAChB,cAAc3Y,EAAI;AAAA,cAClB,aAAaA,EAAI;AAAA,YAAA,CAClB,GACD6Y,GAAkB,IAAI,GACtBJ,EAAc;AAAA,cACZ,MAAM;AAAA,cACN,SAASyD,EAAc;AAAA,cACvB,cAAclc,EAAI;AAAA,cAClB,aAAaA,EAAI;AAAA,YAAA,CAClB,IACD0gB,MAAAC,KAAA/wB,EAAE,eAAc,sBAAhB,QAAA8wB,GAAA,KAAAC,IAAoC/wB,EAAE;AACtC;AAAA,UACF;AAAA,QACF;AAEA,YAAI5G,MAAS,YAAYkzB,KAAiBC,IAAiB;AACzD,gBAAMc,IAAUjiB,GAAYmhB,IAAiBvV,GAAOsT,EAAQlJ,EAAa,CAAC;AAC1E,cAAIiM,GAAS;AACX,YAAAI;AAAA,cACEJ,EAAQ;AAAA,cACRA,EAAQ;AAAA,cACRA,EAAQ;AAAA,cACRrtB;AAAA,YAAA;AAEF;AAAA,UACF;AAAA,QACF;AAEA,QAAIvE,GAAoBrC,CAAI,KAC1Bg2B,GAASpvB,GAAG5G,MAAS,QAAQ;AAAA;AAAA,IAEjC,GAEM43B,KAAgB,CAAChxB,MAA0B;;AAC/C,UAAI,CAAAimB,GAAS,SACb;AAAA,YAAIkE,GAAS,SAAS;AACpB,gBAAM7U,IAAM+P,EAAO;AACnB,cAAI,CAAC/P,EAAK;AACV,gBAAMQ,IAAOJ,GAAgBJ,GAAKtV,EAAE,SAASA,EAAE,OAAO,GAChDwqB,IAAU;AAAA,YACd,GAAGL,GAAS,QAAQ,QAAQrU,EAAK,IAAIqU,GAAS,QAAQ;AAAA,YACtD,GAAGA,GAAS,QAAQ,QAAQrU,EAAK,IAAIqU,GAAS,QAAQ;AAAA,UAAA;AAExD,UAAAO,GAAUF,GAAS7E,GAAQ,QAAQ,IAAI;AACvC;AAAA,QACF;AACA,YAAIyD,MAAakD,GAAe;AAC9B,gBAAMtV,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCixB,IAAa,KAAK;AAAA,YACtBjxB,EAAE,UAAUopB,GAAU;AAAA,YACtBppB,EAAE,UAAUopB,GAAU;AAAA,UAAA;AAExB,cAAI,CAACA,GAAU,YAAY6H,IAAarP,GAAc;AACtD,UAAKwH,GAAU,aACbC,GAAa,EAAE,GAAGD,IAAW,UAAU,IAAM,GAC7CD,GAAe,IAAI;AAErB,gBAAMxtB,IAAOyN;AAAA,YACXggB,GAAU;AAAA,YACVA,GAAU;AAAA,YACVA,GAAU;AAAA,YACV,EAAE,GAAGpS,EAAM,IAAIoS,GAAU,MAAM,GAAG,GAAGpS,EAAM,IAAIoS,GAAU,MAAM,EAAA;AAAA,UAAE;AAEnE,UAAAtE,GAAsBwH,EAAc,IAAI3wB,GAAM,EAAE,MAAM,IAAM;AAC5D;AAAA,QACF;AACA,YAAI2sB,IAAU;AACZ,gBAAMtR,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAAuoB,GAAY,EAAE,GAAGD,IAAU,QAAQtR,GAAO;AAC1C;AAAA,QACF;AACA,YAAI6P,KAAc,MAAM;AACtB,UAAAG,GAAmBsG,GAAQttB,EAAE,SAASA,EAAE,OAAO,CAAC;AAChD;AAAA,QACF;AACA,YAAIinB,MAAkBrC,GAAoB;AACxC,gBAAMtmB,IAAOQ,EAAM,KAAK,CAACwO,OAASA,GAAK,OAAO2Z,GAAe,MAAM,GAC7D7oB,IAAOE,IAAO+vB,GAAkB,IAAI/vB,EAAK,YAAY,IAAI,QACzDD,IAAKC,IAAO+vB,GAAkB,IAAI/vB,EAAK,UAAU,IAAI;AAC3D,cAAIA,KAAQF,KAAQC,GAAI;AACtB,kBAAM2Y,KAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpC8d,KACJmJ,GAAe,SAAS,SACpBiK,GAAiB9yB,GAAMC,GAAI2Y,EAAK,IAChCma;AAAA,cACE9S,GAAa/f,CAAI,KAAK4yB,GAAiB9yB,GAAMC,GAAI2Y,EAAK;AAAA,cACtDiQ,GAAe;AAAA,cACfjQ;AAAA,YAAA;AAER,YAAA4N,EAAmBtmB,EAAK,IAAIwf,IAAO,EAAE,MAAM,IAAM;AAAA,UACnD;AACA;AAAA,QACF;AACA,YAAI8K,MAAc0D,GAAe;AAC/B,cAAI;AACF,aAAAhlB,KAAA5P,IAAA2tB,EAAO,YAAP,gBAAA3tB,EAAgB,sBAAhB,QAAA4P,EAAA,KAAA5P,GAAoCsI,EAAE;AAAA,UACxC,QAAQ;AAAA,UAER;AACA,gBAAMgX,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCiwB,IACJjwB,EAAE,YAAY4oB,GAAW,SAAS,WAC9BzX;AAAA,YACE6F;AAAA,YACAxN;AAAA,cACE8iB,EAAc;AAAA,cACd1D,GAAW;AAAA,cACXA,GAAW;AAAA,YAAA;AAAA,UACb,IAEF,MACAhiB,KAAQqpB,KAAA,gBAAAA,EAAa,UAASjZ;AACpC,UAAA0P,GAAakC,GAAW,SAAS,WAAWqH,IAAc,IAAI;AAC9D,gBAAMt0B,KACJitB,GAAW,SAAS,WAChB/e;AAAA,YACEyiB,EAAc;AAAA,YACd1D,GAAW;AAAA,YACXA,GAAW;AAAA,YACXA,GAAW;AAAA,YACX5R;AAAA,UAAA,IAEF4R,GAAW,SAAS,SAClB5e;AAAA,YACEsiB,EAAc;AAAA,YACd1D,GAAW;AAAA,YACXA,GAAW;AAAA,YACX5R;AAAA,UAAA,IAEFpN;AAAA,YACE0iB,EAAc;AAAA,YACd1D,GAAW;AAAA,YACXA,GAAW;AAAA,YACXhiB;AAAA,UAAA;AAEV,UAAAke,GAAsBwH,EAAc,IAAI3wB,IAAM,EAAE,MAAM,IAAM;AAC5D;AAAA,QACF;AACA,YAAI6sB,IAAW;AACb,gBAAMxR,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAA2oB,GAAe;AAAA,YACb,GAAG3R,EAAM,IAAIwR,GAAU,MAAM;AAAA,YAC7B,GAAGxR,EAAM,IAAIwR,GAAU,MAAM;AAAA,UAAA,CAC9B;AACD;AAAA,QACF;AACA,aACGpvB,MAAS,eAAe+B,GAAkB/B,CAAI,MAC/C8sB,GAAQ,SAAS,GACjB;AACA,gBAAMlP,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO;AAC1C,UAAI7E,GAAkB/B,CAAI,KAAGitB,EAAkBrmB,EAAE,QAAQ,GACzDmmB,GAAW,CAACxgB,MACNA,EAAK,WAAW,IAAUA,IACvB,CAACA,EAAK,CAAC,GAAGqR,CAAK,CACvB;AAAA,QACH;AACA,YAAIhc,GAAkB5B,CAAI,KAAKutB,GAAc,SAAS,GAAG;AACvD,gBAAM3P,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCyf,IAAOkN,GAAiB3V,CAAK;AACnC,cAAIyI;AACF,YAAA2I,GAAe3I,CAAI,GACnBmI,GAAgBnI,CAAI,GACpBiH,GAAa,IAAI;AAAA,mBACR1mB,EAAE,UAAU;AACrB,kBAAMiwB,IAAcjf;AAAA,cAClB2V,GAAcA,GAAc,SAAS,CAAC;AAAA,cACtC3P;AAAA,YAAA;AAEF,YAAAoR,GAAe,IAAI,GACnBR,GAAgBqI,EAAY,KAAK,GACjCvJ,GAAauJ,CAAW;AAAA,UAC1B;AACE,YAAA7H,GAAe,IAAI,GACnBR,GAAgB5Q,CAAK,GACrB0P,GAAa,IAAI;AAAA,QAErB;AASA,YAPEtB,MACA,CAACkD,MACDzB,KAAc,QACdI,MAAkB,QAElB0H,GAAuB3uB,EAAE,SAASA,EAAE,OAAO,GAEzC1E,GAAgBlC,CAAI,KAAK,CAAC0qB,GAAU;AACtC,gBAAM9M,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpCoxB,IAAU9G,EAAQxI,EAAW,GAC7BmL,IAAS1c;AAAA,YACbic;AAAA,YACAxV;AAAA,YACAoa;AAAA,YACAvJ;AAAA,UAAA;AAEF,UAAIoF,KAAUpF,MACZK,GAAoB+E,CAAM,GAC1BrF,GAAgBqF,EAAO,KAAK,GAC5BjF,GAAkB,IAAI,MAEtBE,GAAoB,IAAI,GACxBN,GAAgBC,KAAmB7Q,IAAQ,IAAI,GAC/CgR;AAAA,YACEjtB,GAAgB3B,CAAI,KAAK,CAACszB,GAAoB1V,GAAOoa,CAAO,IACxDzgB,GAAiB6b,IAAiBxV,GAAOsT,EAAQlJ,EAAa,CAAC,IAC/D;AAAA,UAAA;AAAA,QAGV;AAAA;AAAA,IACF,GAEMiQ,KAAa,MAAM;AACvB,UAAInL,GAAQ,SAAS,GAAG;AACtB,QAAAC,GAAW,CAAA,CAAE;AACb;AAAA,MACF;AACA,YAAM,CAAC/oB,GAAGC,CAAC,IAAI,CAAC6oB,GAAQ,CAAC,GAAGA,GAAQA,GAAQ,SAAS,CAAC,CAAC;AACvD,UAAIlE,GAAS5kB,GAAGC,CAAC,IAAI,GAAG;AACtB,QAAA8oB,GAAW,CAAA,CAAE;AACb;AAAA,MACF;AACA,YAAMxnB,IAAOojB,GAAY3kB,GAAGC,CAAC;AAC7B,MAAAwnB,GAAc,QAAQjc,GAAmB,CAACjK,CAAI,CAAC,CAAC,GAChDwnB,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AAAA,IACzB,GAEMiL,KAAgB,CAAC3f,MAAwB;AAC7C,UAAIuU,GAAQ,SAAS,GAAG;AACtB,QAAAC,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AACvB;AAAA,MACF;AACA,YAAM,CAACjpB,GAAGC,CAAC,IAAI,CAAC6oB,GAAQ,CAAC,GAAGA,GAAQA,GAAQ,SAAS,CAAC,CAAC;AACvD,UAAIlE,GAAS5kB,GAAGC,CAAC,IAAI,GAAG;AACtB,QAAA8oB,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AACvB;AAAA,MACF;AACA,MAAAxB,GAAc,QAAQ7S,GAAgB5U,GAAGC,GAAGsU,CAAU,CAAC,GACvDwU,GAAW,CAAA,CAAE,GACbE,EAAkB,EAAK;AAAA,IACzB,GAEMkL,KAAc,CAACvxB,MAA0B;;AAC7C,UAAIimB,GAAS,QAAS;AACtB,YAAMuL,IAAWrH,GAAS;AAqB1B,UApBAA,GAAS,UAAU,MACnBE,GAAa,EAAK,GACbrqB,EAAE,YAAU0mB,GAAa,IAAI,GAC9B8K,KAAA,QAAAA,EAAU,mBACE,KAAK;AAAA,QACjBxxB,EAAE,UAAUwxB,EAAS;AAAA,QACrBxxB,EAAE,UAAUwxB,EAAS;AAAA,MAAA,IAEX,MACVxN,GAAc,IAAI,GAClB+F,GAAc,CAAA,CAAE,GAChBhB,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBrB,GAAoB,IAAI,GACxBI,GAAoB,IAAI,GACxBN,GAAgB,IAAI,IAGxB5C,MAAA,QAAAA,MACIsD,IAAU;AACZ,YAAI;AACF,WAAAhhB,KAAA5P,IAAA2tB,EAAO,YAAP,gBAAA3tB,EAAgB,0BAAhB,QAAA4P,EAAA,KAAA5P,GAAwCsI,EAAE;AAAA,QAC5C,QAAQ;AAAA,QAER;AAKA,QAJc,KAAK;AAAA,UACjBA,EAAE,UAAUsoB,GAAS;AAAA,UACrBtoB,EAAE,UAAUsoB,GAAS;AAAA,QAAA,KAEV,KACX9D;AAAA,UACE8D,GAAS;AAAA,UACTA,GAAS;AAAA,UACTA,GAAS;AAAA,UACTgC,EAAQ9N,EAAkB;AAAA,QAAA,GAG9B+L,GAAY,IAAI;AAChB;AAAA,MACF;AACA,UAAIa,IAAW;AACb,QAAI,CAACA,GAAU,YAAYkD,KACzBkB;AAAA,UACElB;AAAA,UACAlD,GAAU;AAAA,UACVA,GAAU;AAAA,UACVA,GAAU;AAAA,QAAA,GAGdC,GAAa,IAAI;AACjB;AAAA,MACF;AACA,UAAIT,IAAY;AACd,QAAAC,EAAc,IAAI;AAClB;AAAA,MACF;AACA,UAAI5B,IAAgB;AAClB,YAAIrC,GAAoB;AACtB,gBAAMtmB,IAAOQ,EAAM,KAAK,CAACwO,OAASA,GAAK,OAAO2Z,GAAe,MAAM,GAC7DnJ,IAAQxf,IAAO+f,GAAa/f,CAAI,IAAI;AAC1C,UAAIwf,KACF8G,EAAmBtmB,EAAM,IAAIwf,CAAK;AAAA,QAEtC;AACA,QAAAoJ,GAAkB,IAAI;AACtB;AAAA,MACF;AACA,UAAIsB,MAAa8D,GAAe;AAC9B,cAAM3wB,IAAOuN;AAAA,UACXsf,GAAU;AAAA,UACVE,GAAY;AAAA,UACZA,GAAY;AAAA,QAAA;AAEd,QAAI,KAAK,MAAMA,GAAY,GAAGA,GAAY,CAAC,KAAK,OAC9C5D,GAAsBwH,EAAc,IAAI3wB,CAAI,GAE9C8sB,GAAa,IAAI,GACjBE,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG;AAC7B;AAAA,MACF;AACA,UAAI9B,KAAc,MAAM;AACtB,cAAM4K,IAAQ5yB,EAAQ,KAAK,CAACzB,OAAMA,GAAE,OAAOypB,CAAU,GAC/CjgB,IAAQmgB,MAAmB0K;AACjC,YAAIA,KAAS7qB,GAAO;AAClB,cACExN,MAAS,YACTq4B,EAAM,WAAW,SAChBxD,GAAsB,IAAIwD,EAAM,EAAE,KAAK,MAAM,GAC9C;AACA,kBAAMnjB,KAAOgf,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACnCyf,KAAOd;AAAA,cACXrQ;AAAA,cACAzP;AAAA,cACAC;AAAA,cACAqvB;AAAA,cACA7D,EAAQ7N,EAAwB;AAAA,cAChC2B;AAAA,YAAA;AAEF,gBAAIqB,IAAM;AACR,cAAAgF;AAAA,gBACEgN,EAAM;AAAA,gBACNnjB;AAAA,gBACAgc,EAAQ7N,EAAwB;AAAA,cAAA,GAElCsN,GAAc;AAAA,gBACZtK,GAAK,SAAS,aAAaA,GAAK,WAAWgS,EAAM;AAAA,cAAA,CAClD,GACD3K,EAAc,IAAI,GAClBE,GAAmB,IAAI,GACvB2C,GAAoB,IAAI;AACxB;AAAA,YACF;AAAA,UACF;AACA,UAAI,KAAK,MAAM/iB,EAAM,IAAI6qB,EAAM,GAAG7qB,EAAM,IAAI6qB,EAAM,CAAC,KAAK,SACtD9M,EAAa8M,EAAM,IAAI7qB,EAAM,GAAGA,EAAM,CAAC,GACvCoe,MAAA,QAAAA;AAEF,gBAAM9Z,KAAOrM,EACV,OAAO,CAACzB,OAAMA,GAAE,OAAOq0B,EAAM,EAAE,EAC/B,OAAO,CAACr0B,OAAM,KAAK,MAAMA,GAAE,IAAIwJ,EAAM,GAAGxJ,GAAE,IAAIwJ,EAAM,CAAC,KAAK,GAAG,EAC7D,IAAI,CAACxJ,OAAMA,GAAE,EAAE;AAClB,UAAI8N,GAAK,UAAQ6e,GAAc,CAAC0H,EAAM,IAAI,GAAGvmB,EAAI,CAAC;AAAA,QACpD;AACA,QAAA4b,EAAc,IAAI,GAClBE,GAAmB,IAAI;AACvB;AAAA,MACF;AACA,MAAI5tB,MAAS,eAAai4B,GAAA,GACtBl2B,GAAkB/B,CAAI,KAAGk4B,GAActxB,EAAE,QAAQ;AAAA,IACvD,GAEM0xB,KAAoB,CAACvsB,MAA0C;AACnE,YAAM7B,IAAQ4E,GAAgB/C,CAAQ;AACtC,aAAI7B,EAAM,SAAS,IACVA,EAAM,IAAIyB,EAAW,EAAE,KAAK,GAAG,IAGtCI,EAAS,MAAM,IAAI,CAAC3H,MAAMA,EAAE,CAAC,EAAE,KAAK,GAAG,KACvColB,GAAezd,EAAS,QAAQ;AAAA,IAEpC,GAEMwsB,KAAa,CAAC1iB,MAEhBqU,MAAoBrU,EAAM,MAC1Bsd,OACA/D,MAAA,gBAAAA,GAAW,aAAYvZ,EAAM,KAEtByiB,GAAkBnF,EAAe,IAEnCmF,GAAkBziB,EAAM,QAAQ,GAGnC2iB,KAAiBtJ,KACnB9J,GAAmB3f,GAASypB,EAAQ,IACpCb,KACEjJ,GAAmB3f,GAAS4oB,EAAgB,IAC5C,MACAoK,KACJvJ,MAAYsJ,KACRjT;AAAA,MACE2J,GAAS;AAAA,MACTzpB;AAAA,MACAC;AAAA,MACA8yB;AAAA,MACAtH,EAAQ9N,EAAkB;AAAA,MAC1B4B;AAAA,IAAA,IAEFqJ,MAAoBE,MAAgBiK,KAClClI,KACA,MACFoI,KACJzK,MAAmB,OAAOjJ,GAAW,IAAIiJ,EAAe,IAAI,QACxD0K,KACJ,CAACzJ,MACD,CAACb,MACDE,OACCJ,MACEpuB,GAAiBC,CAAI,KAAKiuB,MAAmB,QAC5CqC,KACA,MAMAsI,OAJH5D,MAAA,gBAAAA,GAAe,UAAS,SAASA,GAAc,SAAS,WACxDyD,MAAA,gBAAAA,GAAU,UAAS,SAASA,GAAS,SAAS,UAC/C7H,MAAA,gBAAAA,GAAY,WACZ,SAGE5wB,MAAS,YAAYA,MAAS,UAAWwwB,KAAsB,OAC7DqI,KACJD,MAA0B,OACtB,OACAlzB,EAAM,KAAK,CAACR,MAASA,EAAK,OAAO0zB,EAAsB,KAAK,MAC5DE,KAAuBD,KACzB5D,GAAkB,IAAI4D,GAAqB,YAAY,IACvD,MACEE,KAAqBF,KACvB5D,GAAkB,IAAI4D,GAAqB,UAAU,IACrD,MACEG,KACJH,MAAwBC,MAAwBC,KAC5C3D;AAAA,MACE0D;AAAA,MACAC;AAAA,MACA1D,GAAkBwD,IAAsB7T,IAAYiQ,EAAiB;AAAA,IAAA,IAEvE,MACAgE,OACHjE,MAAA,gBAAAA,GAAe,UAAS,SAASA,GAAc,QAAQ,WACvDyD,MAAA,gBAAAA,GAAU,UAAS,SAASA,GAAS,QAAQ,UAC9C7H,MAAA,gBAAAA,GAAY,UACZ,MACIsI,MACJhK,MAAA,gBAAAA,GAAU,YACVb,MAAA,gBAAAA,GAAkB,WAClBF,OACCpuB,GAAiBC,CAAI,KAAK04B,KACvB,EAAE,GAAGA,GAAe,GAAG,GAAGA,GAAe,MACzC,OACAS,KACJjK,MAAY,QACRuJ,MAAA,gBAAAA,GAAU,UAASvJ,GAAS,UAC5BuJ,MAAA,gBAAAA,GAAU,WACVE,MAAA,gBAAAA,GAAiB,WACjB/H,MAAA,gBAAAA,GAAY,UACZrC,IACA6K,KACHlK,MAAY,QACXb,MAAoB,QACpBF,MAAmB,QAClBpuB,GAAiBC,CAAI,KAAKiuB,MAAmB,QAAQM,MAAgB,OACpE5K,GAAgBuV,IAAYC,EAAQ,IACpC,MACAE,KACJz3B,GAAkB5B,CAAI,KAAKutB,GAAc,SAAS,IAC9C5J,GAAgB4J,GAAcA,GAAc,SAAS,CAAC,GAAGgB,EAAY,IACrE,MACA+K,KACJ13B,GAAkB5B,CAAI,KAAKutB,GAAc,UAAU,IAC/C5J,GAAgB4K,IAAchB,GAAc,CAAC,CAAC,IAC9C,MACAgM,KACJrJ,MAAkB,OACd4C,EAAe,KAAK,CAACjd,MAAUA,EAAM,OAAOqa,EAAc,IAC1D,MACAsJ,KACJxN,MACA,CAACtB,KACD3qB,GAAiBC,CAAI,KACrBu5B,MAAoB,QACpB3V,GAAkB2V,GAAiB,IAAI,KACvC,CAACngB,GAAYmgB,EAAgB,KAC7B,CAAC3e,GAAe2e,EAAgB,GAC5BE,KACJ15B,GAAiBC,CAAI,MACrBswB,MAAA,gBAAAA,GAAkB,UAAS,UAC3B,CAACpB,IACGwK,KAAoBpJ,MAAoB,QAAQ,CAACpB,IACjDyK,KAAY5a,GAAgB;AAAA,MAChC,MAAA/e;AAAA,MACA,UAAA0qB;AAAA,MACA,WAAAwC;AAAA,MACA,SAAS8D;AAAA,MACT,eAAe5B,MAAa;AAAA,MAC5B,gBAAgBwB,MAAc,QAAQ,CAAC1B;AAAA,MACvC,mBAAAwK;AAAA,MACA,kBAAAD;AAAA,MACA,sBAAAD;AAAA,MACA,cACGx5B,MAAS,YAAYA,MAAS,YAAYowB,MAAmB;AAAA,MAChE,gBACE3C,KAAc,QAAQyB,MAAY,QAAQrB,MAAkB;AAAA,MAC9D,cAAc,CAAC,EAACmC,MAAA,QAAAA,GAAW;AAAA,MAC3B,WAAWF,MAAe;AAAA,IAAA,CAC3B,GACK8J,KAAmC;AAAA,MACvC,GAAI/P,GAAkBD,GAAUE,CAAW,KAAK,CAAA;AAAA,MAChD,GAAI6P,KAAY,EAAE,QAAQA,OAAc,CAAA;AAAA,IAAC;AAG3C,WAAKv7B,IAYH,gBAAA0C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKsrB;AAAA,QACL,WAAWzC,GAAkBC,CAAQ;AAAA,QACrC,OAAOgQ;AAAA,QACP,sBAAsB7D;AAAA,QACtB,sBAAsBE;AAAA,QACtB,oBAAoBC;AAAA,QACpB,wBAAwBA;AAAA,QAExB,UAAA;AAAA,UAAA,gBAAA11B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKyrB;AAAA,cACL,WAAW,wBAAwBD,KAAe,mBAAmB,EAAE;AAAA,cACvE,SAAS,GAAGuG,GAAQ,CAAC,IAAIA,GAAQ,CAAC,IAAIA,GAAQ,KAAK,IAAIA,GAAQ,MAAM;AAAA,cACrE,qBAAoB;AAAA,cACpB,eAAAnJ;AAAA,cACA,eAAAwO;AAAA,cACA,aAAAO;AAAA,cACA,iBAAiBA;AAAA,cACjB,gBAAgB,MAAM;AACpB,gBAAA5H,GAAoB,IAAI;AAAA,cAC1B;AAAA,cACA,aAAa,CAAC3pB,MAAM;AAClB,gBAAI5G,MAAS,eAAa4G,EAAE,eAAA;AAAA,cAC9B;AAAA,cACA,eAAe,CAACA,MAAM;;AAGpB,oBAFAA,EAAE,eAAA,IACFtI,IAAA,OAAO,aAAA,MAAP,QAAAA,EAAuB,mBAErBosB,KACA,CAACsB,MACD,CAAC9rB,GAAwBF,CAAI;AAE7B;AAEF,sBAAM65B,KACJvJ,MAAA,gBAAAA,GAAkB,UAAS,SACvBA,GAAiB,SACjB;AACN,gBAAIuJ,KAAW,SACfjzB,EAAE,gBAAA,GACF4vB,GAAqBqD,CAAO;AAAA,cAC9B;AAAA,cAEA,UAAA,gBAAA/4B;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKqrB;AAAA,kBACL,WAAU;AAAA,kBACV,WAAW,aAAaI,GAAQ,QAAQ,IAAI,CAAC,KAAKA,GAAQ,QAAQ,IAAI,CAAC,WAAWA,GAAQ,QAAQ,IAAI;AAAA,kBAEtG,UAAA;AAAA,oBAAA,gBAAAzrB,EAAC,QAAA,EACC,UAAA;AAAA,sBAAA,gBAAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAImyB;AAAA,0BACJ,cAAa;AAAA,0BACb,OAAO;AAAA,0BACP,QAAQ;AAAA,0BAER,UAAA;AAAA,4BAAA,gBAAAzyB,EAAC,QAAA,EAAK,OAAM,MAAK,QAAO,MAAK,MAAK,WAAU,aAAY,OAAA,CAAO;AAAA,8CAC9D,QAAA,EAAK,GAAE,iBAAgB,QAAO,WAAU,aAAY,OAAA,CAAO;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAE7DuyB,EAAc,SAAS,IACtB,gBAAAvyB,EAAC,cAAS,IAAIwyB,GACX,YAAc,IAAI,CAACnd,MAClB,gBAAArV,EAAC,QAAA,EAAoB,GAAG+3B,GAAW1iB,CAAK,KAA7BA,EAAM,EAA0B,CAC5C,EAAA,CACH,IACE;AAAA,oBAAA,GACN;AAAA,oBACC4c,KACC,gBAAAjyB;AAAA,sBAACwhB;AAAA,sBAAA;AAAA,wBACC,KAAKyQ;AAAA,wBACL,eAAAvR;AAAA,wBACA,aAAawR;AAAA,wBACb,OAAAtU;AAAA,sBAAA;AAAA,oBAAA,IAEA;AAAA,oBAEHoM,EAAe,OAAOtH,EAAoB,EAAE,IAAI,CAACrN,MAAU;AAC1D,4BAAMikB,IAAW,CAAC9N,MAAgB/I,GAAoBpN,EAAM,IAAI,GAC1DuJ,IAAU0a,KAAY5J,OAAmBra,EAAM,IAC/CkkB,IAAgB5b;AAAA,wBACpBtI;AAAA,wBACAuI;AAAA,wBACAyC,GAAoB,IAAIhL,EAAM,EAAE;AAAA,sBAAA;AAElC,6BACE,gBAAArV;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,GACEqV,EAAM,SAAS,MAAM,IAAI,CAACzR,MAAMA,EAAE,CAAC,EAAE,KAAK,GAAG,KAC7ColB,GAAe3T,EAAM,SAAS,QAAQ;AAAA,0BAExC,MAAMwJ,GAAyB0a,GAAe3a,CAAO;AAAA,0BACrD,aAAaA,IAAU,MAAM0a,IAAW,OAAO;AAAA,0BAC/C,QAAQ1a,IAAUC,GAAyB0a,GAAe,EAAI,IAAI;AAAA,0BAClE,cAAc3a,IAAU,IAAI,KAAKxC;AAAA,0BACjC,iBAAiBkd,IAAW,GAAG,IAAIld,EAAI,IAAI,IAAIA,EAAI,KAAK;AAAA,0BACxD,eAAekd,IAAW,SAAS;AAAA,0BACnC,OAAO,EAAE,QAAQA,IAAW,YAAY,OAAA;AAAA,0BACxC,gBACEA,IACI,CAAClzB,MAAM;AACL,4BAAAupB,GAAkBta,EAAM,EAAE,GAC1Bse,GAAgBvtB,GAAGiP,EAAM,IAAI;AAAA,0BAC/B,IACA;AAAA,0BAEN,eACEikB,IAAW,CAAClzB,MAAMutB,GAAgBvtB,GAAGiP,EAAM,IAAI,IAAI;AAAA,0BAErD,gBACEikB,IACI,MAAM;AACJ,4BAAA3J,GAAkB,CAACrZ,MAAQA,MAAOjB,EAAM,KAAK,OAAOiB,CAAG,GACvDga,GAAe,IAAI;AAAA,0BACrB,IACA;AAAA,0BAEN,eACEgJ,IACI,CAAClzB,MAAM;AACL,4BAAAA,EAAE,gBAAA,GACFkqB,GAAe,IAAI,GACnBlG,GAAc/U,EAAM,EAAE;AAAA,0BACxB,IACA;AAAA,wBAAA;AAAA,wBAtCD,QAAQA,EAAM,EAAE;AAAA,sBAAA;AAAA,oBA0C3B,CAAC;AAAA,oBAEAkd,EAAc,SAAS,KAAKtI,EAAsB,SAAS,IAC1D,gBAAAjqB,EAAC,OAAE,UAAU,QAAQwyB,CAAa,KAAK,eAAc,QAClD,UAAAvI,EAAsB,OAAOvH,EAAoB,EAAE,IAAI,CAACrN,MACvD,gBAAArV;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,GACEqV,EAAM,SAAS,MAAM,IAAI,CAACzR,MAAMA,EAAE,CAAC,EAAE,KAAK,GAAG,KAC7ColB,GAAe3T,EAAM,SAAS,QAAQ;AAAA,wBAExC,MAAMsI;AAAA,0BACJtI;AAAA,0BACAuI;AAAA,0BACAyC,GAAoB,IAAIhL,EAAM,EAAE;AAAA,wBAAA;AAAA,wBAElC,aAAa;AAAA,wBACb,QAAO;AAAA,wBACP,aAAa,MAAM+G;AAAA,sBAAA;AAAA,sBAZd,SAAS/G,EAAM,EAAE;AAAA,oBAAA,CAczB,GACH,IACE;AAAA,oBAEHid,EAAe,IAAI,CAACjd,MAAU;AAC7B,4BAAMmkB,IAAgBnb,GAAsBhJ,EAAM,IAAI,GAChDokB,IAAW/P,MAAoBrU,EAAM,IACrCuJ,IAAU4a,KAAiB9J,OAAmBra,EAAM,MAAM,CAACokB,GAC3DC,KAAW9K,MAAA,gBAAAA,GAAW,aAAYvZ,EAAM,IACxCskB,IAAY/gB,GAAYvD,CAAK,GAC7BukB,KAAexf,GAAe/E,CAAK,GACnCwkB,KAAQF,KAAaC,IACrBtiB,KAASoV,KACX,SACAjO,GAAmB;AAAA,wBACnB,MAAAjf;AAAA,wBACA,UAAAi6B;AAAA,wBACA,eAAAD;AAAA,wBACA,UAAAE;AAAA,wBACA,YACElO,MACA,CAACtB,KACD9G,GAAkB/N,EAAM,IAAI,KAC5B,CAACwkB;AAAA,wBACH,WAAAF;AAAA,wBACA,cAAAC;AAAA,sBAAA,CACD,MACAn4B,GAAgBjC,CAAI,KAClByB,GAAqBzB,GAAM0B,CAAS,KAAK,CAACgpB,IACzC,SACA1oB,GAAgBhC,CAAI,IAClB,SACA,YACFs6B,KAAwB,CAAC1zB,OAA0B;;AACvD,4BAAIwmB,GAAa,SAAS;AACxB,0BAAAxmB,GAAE,gBAAA,GACFovB,GAASpvB,IAAG,EAAK;AACjB;AAAA,wBACF;AAEA,4BADI8jB,KACA2D,GAAkB;AAGtB,4BAAIrC,OAAiBhsB,MAAS,YAAYA,MAAS,UAAU;AAC3D,gCAAM4d,KAAQsW,GAAQttB,GAAE,SAASA,GAAE,OAAO,GACpC2zB,KAAYhV;AAAA,4BAChB3H;AAAAA,4BACAnY;AAAA,4BACAC;AAAA,gDACI,IAAA;AAAA,4BACJwrB,EAAQ7N,EAAwB;AAAA,4BAChC2B;AAAA,4BACAhlB,MAAS,UAAU,SAAS;AAAA,0BAAA;AAG9B,8BADIA,MAAS,WAAWu6B,MAAa,QAEnCv6B,MAAS,aACR,CAAC4jB,GAAkB/N,EAAM,IAAI,KAAKwkB;AAEnC;AAAA,wBAEJ;AACA,4BACErO,MACAjsB,GAAiBC,CAAI,KACrB6jB,GAAsBzlB,CAAK,KAC3BwlB,GAAkB/N,EAAM,IAAI,KAC5B,CAACwkB,IACD;AACA,0BAAAzzB,GAAE,gBAAA;AACF,gCAAMiR,KAASqc,GAAQttB,GAAE,SAASA,GAAE,OAAO;AAC3C,0BAAA0kB,GAAoBzV,EAAM,IAAIgC,EAAM,GACpCuW,EAAmB,IAAI,GACvBF,GAAmB,IAAI,GACvBI,GAAoB,EAAE,SAASzY,EAAM,IAAI,QAAAgC,IAAQ,GACjD2W,GAAgB3W,EAAM;AACtB;AAAA,wBACF;AACA,4BAAIwiB,MAASp4B,GAAgBjC,CAAI,GAAG;AAClC,0BAAA4G,GAAE,gBAAA,GACFgkB,GAAc/U,EAAM,EAAE,GACtBlT,MAAA,QAAAA,GAAe;AACf;AAAA,wBACF;AACA,4BAAI,CAAClB,GAAqBzB,GAAM0B,CAAS,EAAG;AAC5C,wBAAAkF,GAAE,gBAAA;AACF,8BAAM4zB,KAAUtG,GAAQttB,GAAE,SAASA,GAAE,OAAO;AAC5C,4BAAIjF,GAAgB3B,CAAI,GAAG;AACzB,8BAAIw0B,GAAyBgG,IAAS5zB,EAAC,EAAG;AAC1C,2BACE,CAACsL,GAAiB2D,EAAM,IAAI,KAC5B,CAACie,GAAkB0G,EAAO,MAE1B5P,GAAc/U,EAAM,EAAE;AAExB;AAAA,wBACF;AAKA,4BAJI+d,GAAe4G,EAAO,MAC1B5P,GAAc/U,EAAM,EAAE,GAClB7V,MAAS,aAET,EADYi6B,KAAYD,GACd;AACd,8BAAMpc,KAAQsW,GAAQttB,GAAE,SAASA,GAAE,OAAO,GACpCmF,KACJkuB,KAAY9G,KACRA,KACAtd,EAAM;AACZ,wBAAAwZ,GAAa;AAAA,0BACX,SAASxZ,EAAM;AAAA,0BACf,OAAO+H;AAAA,0BACP,gBAAgB7R;AAAA,wBAAA,CACjB,GACDwjB,GAAe,EAAE,GAAG,GAAG,GAAG,GAAG,IAC7BrhB,MAAA5P,KAAAsI,GAAE,eAAc,sBAAhB,QAAAsH,GAAA,KAAA5P,IAAoCsI,GAAE;AAAA,sBACxC,GACM6zB,IAAgBT,IAClB;AAAA,wBACE,gBAAgB,MAAM7J,GAAkBta,EAAM,EAAE;AAAA,wBAChD,gBAAgB,MACdsa,GAAkB,CAACrZ,OAAQA,OAAOjB,EAAM,KAAK,OAAOiB,EAAG;AAAA,sBAAA,IAE3D;AACJ,0BAAIsjB,IAAc;AAChB,8BAAMruB,KACJkuB,KAAY9G,KACRA,KACAtd,EAAM,UACNsE,KAAMO,GAAa3O,EAAQ;AACpB,wBAAA8J,EAAM,MAAM,QAAQqhB;AACjC,8BAAM3V,KAAS1L,EAAM,MAAM,UAAU,GAC/B,EAAE,GAAGvN,IAAI,GAAGC,GAAA,IAAO2R,GAAeC,EAAG,GACrCugB,KAAUC;AAAA,0BACd9kB,EAAM,MAAM,SAASuI,EAAM;AAAA,wBAAA,GAEvBwc,KAAiBvb;AAAA,0BACrBxJ,EAAM,MAAM,SAASuI,EAAM;AAAA,0BAC3B6b,KAAY7a;AAAA,wBAAA;AAEd,+BACE,gBAAAte;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC,WACEygB,KAAS,UAAUA,EAAM,IAAIjZ,EAAE,IAAIC,EAAE,MAAM;AAAA,4BAE7C,OACEyjB,KAAe,SAAY,EAAE,QAAQlU,MAAU,UAAA;AAAA,4BAEhD,GAAG2iB;AAAA,4BAEJ,UAAA;AAAA,8BAAA,gBAAAj6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,GAAG+3B,GAAW,EAAE,GAAG1iB,GAAO,UAAA9J,IAAU;AAAA,kCACpC,MAAK;AAAA,kCACL,QACEkuB,KAAY7a,IAAUwb,KAAiB;AAAA,kCAEzC,aAAaX,KAAY7a,IAAU,MAAMxC,KAAO;AAAA,kCAChD,eAAe0d;AAAA,gCAAA;AAAA,8BAAA;AAAA,8BAEhBI,KACC,gBAAAl6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,MAAMk6B;AAAA,kCACN,GAAGvgB,GAAI;AAAA,kCACP,GAAGA,GAAI;AAAA,kCACP,OAAOA,GAAI,OAAOA,GAAI;AAAA,kCACtB,QAAQA,GAAI,OAAOA,GAAI;AAAA,kCACvB,OAAO,EAAE,eAAe,OAAA;AAAA,gCAAO;AAAA,8BAAA,IAE/B;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BA3BCtE,EAAM;AAAA,wBAAA;AAAA,sBA8BjB;AACA,0BAAIuD,GAAYvD,CAAK,GAAG;AACtB,8BAAM9J,KACJkuB,KAAY9G,KACRA,KACAtd,EAAM,UACNsE,KAAMO,GAAa3O,EAAQ,GAC3B6N,KAAO/D,EAAM,MAAM,QAAQwD,GAAwB,GACnDkI,KAAS1L,EAAM,MAAM,UAAU,GAC/B,EAAE,GAAGvN,IAAI,GAAGC,GAAA,IAAO2R,GAAeC,EAAG,GACrCqH,KAAQf,GAAoB5K,EAAM,MAAM,KAAK,GAC7CglB,KAAQC,GAAY3gB,IAAKqH,EAAK,GAC9B3H,KAAQN,GAAe1D,EAAM,MAAM,QAAQ,EAAE,GAC7C+L,KAAahI,KAAOX,IACpB4I,KAAchI,GAAM,SAAS+H,IAC7BgZ,KAAiBvb;AAAA,0BACrBxJ,EAAM,MAAM,SAASuI,EAAM;AAAA,0BAC3B6b,KAAY7a;AAAA,wBAAA;AAEd,+BACE,gBAAAte;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC,WACEygB,KAAS,UAAUA,EAAM,IAAIjZ,EAAE,IAAIC,EAAE,MAAM;AAAA,4BAE7C,OACEyjB,KAAe,SAAY,EAAE,QAAQlU,MAAU,UAAA;AAAA,4BAEhD,GAAG2iB;AAAA,4BAEJ,UAAA;AAAA,8BAAA,gBAAAj6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,GAAG+3B,GAAW,EAAE,GAAG1iB,GAAO,UAAA9J,IAAU;AAAA,kCACpC,MAAK;AAAA,kCACL,QACEkuB,KAAY7a,IAAUwb,KAAiB;AAAA,kCAEzC,aAAaX,KAAY7a,IAAU,MAAMxC,KAAO;AAAA,kCAChD,eAAe0d;AAAA,gCAAA;AAAA,8BAAA;AAAA,8BAEjB,gBAAA95B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,YAAYuY;AAAA,kCACZ,UAAUa;AAAA,kCACV,MAAM/D,EAAM,MAAM,SAASuI,EAAM;AAAA,kCACjC,YAAY0D,GAAmBN,EAAK;AAAA,kCACpC,OAAO;AAAA,oCACL,YAAY;AAAA,oCACZ,GAAIwK,KACA,CAAA,IACA,EAAE,QAAQlU,MAAU,UAAA;AAAA,kCAAU;AAAA,kCAEpC,eAAewiB;AAAA,kCAEd,UAAAzgB,GAAM,IAAI,CAACG,IAAM+H,OAChB,gBAAAvhB;AAAA,oCAAC;AAAA,oCAAA;AAAA,sCAEC,GAAGq6B;AAAA,sCACH,GAAGtyB,KAAKsZ,KAAc,KAAKE,KAAQ,OAAOH;AAAA,sCAC1C,kBAAiB;AAAA,sCAEhB,UAAA5H,MAAQ;AAAA,oCAAA;AAAA,oCALJ+H;AAAA,kCAAA,CAOR;AAAA,gCAAA;AAAA,8BAAA;AAAA,4BACH;AAAA,0BAAA;AAAA,0BAzCKlM,EAAM;AAAA,wBAAA;AAAA,sBA4CjB;AACA,4BAAMklB,IAAc7c,GAAuBrI,EAAM,IAAI,GAC/CmlB,KAAUnlB,EAAM,SAAS,QACzB0J,KAAa0a,KAAY7a,GACzB2a,KAAgB5b;AAAA,wBACpBtI;AAAA,wBACAuI;AAAA,wBACAyC,GAAoB,IAAIhL,EAAM,EAAE;AAAA,sBAAA,GAE5BolB,KAAe5b;AAAA,wBACnB2b,KAAU,YAAYjB;AAAA,wBACtBxa;AAAA,sBAAA;AAEF,6BACE,gBAAA/e;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,GAAG+3B,GAAW1iB,CAAK;AAAA,0BACnB,MACEmlB,KACI,QAAQ/H,CAAc,MACtB5T,GAAyB0a,IAAexa,EAAU;AAAA,0BAExD,aACEyb,KACI,IACA9b;AAAA,4BACErJ,EAAM;AAAA,4BACNklB;AAAA,4BACAxb;AAAA,0BAAA;AAAA,0BAGR,QAAQA,KAAa0b,KAAe;AAAA,0BACpC,aACEhB,IAAW,MAAMrd,KAAOwC,IAAU,IAAIxC,KAAO,IAAIA;AAAA,0BAEnD,iBACEoe,MAAW,CAACf,KAAY,CAAC7a,IACrB,GAAG,IAAIxC,EAAI,IAAI,IAAIA,EAAI,KACvB;AAAA,0BAEN,eAAe0d;AAAA,0BACf,OAAOtO,KAAe,SAAYlU,KAAS,EAAE,QAAAA,OAAW;AAAA,0BACvD,GAAG2iB;AAAA,wBAAA;AAAA,wBA3BC5kB,EAAM;AAAA,sBAAA;AAAA,oBA8BjB,CAAC;AAAA,oBAEAyf,GAAiB,IAAI,CAACtU,MACrB,gBAAAxgB;AAAA,sBAAC8gB;AAAA,sBAAA;AAAA,wBAEC,SAAAN;AAAA,wBACA,eAAAE;AAAA,sBAAA;AAAA,sBAFK,kBAAkBF,EAAQ,OAAO;AAAA,oBAAA,CAIzC;AAAA,oBAGAvf,GAAqBzB,GAAM0B,CAAS,KACnCwxB,KACA,CAACvY,GAAauY,CAAa,KAC3BpkB,GAAgBqkB,MAAmBD,EAAc,QAAQ,EAAE;AAAA,sBACzD,CAACvuB,GAAMu2B,MAAO;AACZ,8BAAM91B,IAAIV,GAAUC,CAAI,GAClBw2B,IAA2B,CAAA;AACjC,iCAASC,IAAK,GAAGA,IAAKh2B,GAAGg2B,KAAM;AAC7B,gCAAMl2B,IAAOP,EAAK,MAAMy2B,CAAE,GACpBp2B,KAAOJ,GAASD,GAAMy2B,CAAE,GACxBn2B,KAAKH,GAAOH,GAAMy2B,CAAE,GACpBhc,MACJ0Q,MAAA,gBAAAA,GAAa,eAAcoL,KAAMpL,GAAY,cAAcsL,GACvDC,KAAUt2B,GAAYJ,GAAMy2B,CAAE;AACpC,8BAAIp7B,MAAS,aACbm7B,EAAM;AAAA,4BACJ,gBAAA36B;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCAEC,GAAG66B;AAAA,gCACH,MAAK;AAAA,gCACL,QAAO;AAAA,gCACP,aAAanK,EAAQlJ,KAAgB,CAAC;AAAA,gCACtC,eAAc;AAAA,gCACd,OAAO;AAAA,kCACL,QAAQgI,MAAA,QAAAA,GAAW,WAAW,aAAa;AAAA,gCAAA;AAAA,gCAE7C,gBAAgB,CAACppB,MACf+tB,GAAYuG,GAAIE,GAAIx0B,EAAE,SAASA,EAAE,OAAO;AAAA,gCAE1C,eAAe,CAACA,MACd+tB,GAAYuG,GAAIE,GAAIx0B,EAAE,SAASA,EAAE,OAAO;AAAA,gCAE1C,gBAAgB,MACdmpB;AAAA,kCAAe,CAACxjB,OACdA,KAAA,gBAAAA,EAAM,eAAc2uB,KAAM3uB,EAAK,cAAc6uB,IACzC,OACA7uB;AAAA,gCAAA;AAAA,gCAGR,eAAe,CAAC3F,MAAM;AACpB,sCAAI5G,MAAS,SAAU;AACvB,wCAAM4d,IAAQsW,GAAQttB,EAAE,SAASA,EAAE,OAAO,GACpC00B,KAAYxsB;AAAA,oCAChBqkB,MAAmBD,EAAc;AAAA,kCAAA,EACjCgI,CAAE;AACJ,kCAAA7G;AAAA,oCACE6G;AAAA,oCACAE;AAAA,oCACAE,KACItsB,GAAgBssB,IAAWF,GAAIxd,CAAK,IACpCA;AAAA,oCACJhX;AAAA,kCAAA;AAAA,gCAEJ;AAAA,8BAAA;AAAA,8BApCK,YAAYssB,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,4BAAA;AAAA,0BAqC/C,GAEEhc,MAAW0Q,MAAe,EAACE,MAAA,QAAAA,GAAW,YAAU;AAClD,kCAAM3K,IAAUyK,GAAY,OACtByL,IAAOrK,EAAQ,CAAC;AACtB,4BAAAiK,EAAM;AAAA,8BACJ,gBAAA36B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCAEC,GAAG66B;AAAA,kCACH,MAAK;AAAA,kCACL,QAAQzc;AAAA,kCACR,aAAasS,EAAQ,EAAE;AAAA,kCACvB,eAAe;AAAA,kCACf,eAAc;AAAA,kCACd,gBAAe;AAAA,kCACf,eAAc;AAAA,gCAAA;AAAA,gCART,aAAagC,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,8BAAA;AAAA,8BAUhD,gBAAA56B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCAEC,GAAG66B;AAAA,kCACH,MAAK;AAAA,kCACL,QAAQzc;AAAA,kCACR,aAAasS,EAAQ,GAAG;AAAA,kCACxB,eAAc;AAAA,kCACd,gBAAe;AAAA,kCACf,eAAc;AAAA,gCAAA;AAAA,gCAPT,WAAWgC,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,8BAAA;AAAA,8BAS9C,gBAAAt6B;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCAEC,WAAU;AAAA,kCACV,eAAc;AAAA,kCAEd,UAAA;AAAA,oCAAA,gBAAAN;AAAA,sCAAC;AAAA,sCAAA;AAAA,wCACC,IAAI6kB,EAAQ;AAAA,wCACZ,IAAIA,EAAQ;AAAA,wCACZ,GAAG6L,EAAQ,CAAC;AAAA,wCACZ,MAAK;AAAA,wCACL,QAAQtS;AAAA,wCACR,aAAasS,EAAQ,CAAC;AAAA,sCAAA;AAAA,oCAAA;AAAA,oCAExB,gBAAA1wB;AAAA,sCAAC;AAAA,sCAAA;AAAA,wCACC,GAAG,KAAK6kB,EAAQ,CAAC,IAAIA,EAAQ,IAAIkW,CAAI,MAAMlW,EAAQ,CAAC,IAAIA,EAAQ,IAAIkW,CAAI,MAAMlW,EAAQ,IAAIkW,CAAI,IAAIlW,EAAQ,CAAC,MAAMA,EAAQ,IAAIkW,CAAI,IAAIlW,EAAQ,CAAC;AAAA,wCAC9I,MAAK;AAAA,wCACL,QAAQzG;AAAA,wCACR,aAAasS,EAAQ,CAAC;AAAA,wCACtB,eAAc;AAAA,sCAAA;AAAA,oCAAA;AAAA,kCAChB;AAAA,gCAAA;AAAA,gCAlBK,YAAYgC,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,8BAAA;AAAA,4BAmB/C;AAAA,0BAEJ;AAEA,8BAAKh5B,GAAkBpC,CAAI;AAC3B,iCAAIkF,KAAA,gBAAAA,EAAM,UAAS,SAAS;AAC1B,oCAAMs2B,KAAK5L,MAAA,gBAAAA,GAAgB,eAAcsL,KACvCtL,GAAe,cAAcwL,KAC7BxL,GAAe,WAAW,GACtB6L,KAAK7L,MAAA,gBAAAA,GAAgB,eAAcsL,KACvCtL,GAAe,cAAcwL,KAC7BxL,GAAe,WAAW;AAC5B,8BAAAuL,EAAM;AAAA,gCACJ,gBAAA36B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIwE,GAAK;AAAA,oCACT,IAAIA,GAAK;AAAA,oCACT,IAAIE,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAO;AAAA,oCACP,aAAagsB,EAAQ5I,EAAmB;AAAA,oCACxC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,YAAY4K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU/C,gBAAA56B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIwE,GAAK;AAAA,oCACT,IAAIA,GAAK;AAAA,oCACT,IAAIE,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAQ0Z;AAAA,oCACR,aAAasS,EAAQ7I,EAAc;AAAA,oCACnC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,OAAO6K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU1C,gBAAA56B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIyE,GAAG;AAAA,oCACP,IAAIA,GAAG;AAAA,oCACP,IAAIC,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAO;AAAA,oCACP,aAAagsB,EAAQ5I,EAAmB;AAAA,oCACxC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,YAAY4K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU/C,gBAAA56B;AAAA,kCAAC;AAAA,kCAAA;AAAA,oCAEC,IAAIyE,GAAG;AAAA,oCACP,IAAIA,GAAG;AAAA,oCACP,IAAIC,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,QAAQ0Z;AAAA,oCACR,aAAasS,EAAQ7I,EAAc;AAAA,oCACnC,eAAc;AAAA,oCACd,eAAc;AAAA,kCAAA;AAAA,kCART,OAAO6K,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAU1C,gBAAA56B;AAAA,kCAACsoB;AAAA,kCAAA;AAAA,oCAEC,IAAI5jB,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,GAAGgsB,EAAQsK,IAAKrT,KAAuBD,EAAW;AAAA,oCAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,oCAC3B,MAAMoT,IAAK5c,KAAqB;AAAA,oCAChC,QAAQA;AAAA,oCACR,aAAasS,EAAQjJ,EAAgB;AAAA,oCACrC,QAAO;AAAA,oCACP,eAAe,CAACrhB,OAAM;AAGpB,sCAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACGxE,GAAkBpC,CAAI,KAC3B00B,GAAkBwG,GAAIE,CAAE;AAAA,oCAC1B;AAAA,oCACA,eAAe,CAACx0B,OAAM;AACpB,0CAAKxE,GAAkBpC,CAAI,GAE3B;AAAA,4CADA4G,GAAE,gBAAA,GACEA,GAAE,UAAU,GAAG;AACjB,0CAAA8tB,GAAkBwG,GAAIE,CAAE;AACxB;AAAA,wCACF;AACA,wCAAAvL,GAAkB;AAAA,0CAChB,WAAWqL;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT,GACDzL,GAAkB,IAAI,GACtBF,EAAc;AAAA,0CACZ,MAAM;AAAA,0CACN,SAASyD,EAAc;AAAA,0CACvB,WAAWgI;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT;AAAA;AAAA,oCACH;AAAA,kCAAA;AAAA,kCAnCK,MAAMlI,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,gCAqCzC,gBAAA56B;AAAA,kCAACsoB;AAAA,kCAAA;AAAA,oCAEC,IAAI5jB,EAAK,GAAG;AAAA,oCACZ,IAAIA,EAAK,GAAG;AAAA,oCACZ,GAAGgsB,EAAQuK,IAAKtT,KAAuBD,EAAW;AAAA,oCAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,oCAC3B,MAAMqT,IAAK7c,KAAqB;AAAA,oCAChC,QAAQA;AAAA,oCACR,aAAasS,EAAQjJ,EAAgB;AAAA,oCACrC,QAAO;AAAA,oCACP,eAAe,CAACrhB,OAAM;AAGpB,sCAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACGxE,GAAkBpC,CAAI,KAC3B00B,GAAkBwG,GAAIE,CAAE;AAAA,oCAC1B;AAAA,oCACA,eAAe,CAACx0B,OAAM;AACpB,0CAAKxE,GAAkBpC,CAAI,GAE3B;AAAA,4CADA4G,GAAE,gBAAA,GACEA,GAAE,UAAU,GAAG;AACjB,0CAAA8tB,GAAkBwG,GAAIE,CAAE;AACxB;AAAA,wCACF;AACA,wCAAAvL,GAAkB;AAAA,0CAChB,WAAWqL;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT,GACDzL,GAAkB,IAAI,GACtBF,EAAc;AAAA,0CACZ,MAAM;AAAA,0CACN,SAASyD,EAAc;AAAA,0CACvB,WAAWgI;AAAA,0CACX,WAAWE;AAAA,0CACX,QAAQ;AAAA,wCAAA,CACT;AAAA;AAAA,oCACH;AAAA,kCAAA;AAAA,kCAnCK,MAAMlI,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,8BAoCzC;AAAA,4BAEJ,OAAO;AACL,oCAAMn1B,IAAM;AAAA,gCACV,IAAIjB,GAAK,IAAIC,GAAG,KAAK;AAAA,gCACrB,IAAID,GAAK,IAAIC,GAAG,KAAK;AAAA,8BAAA;AAEvB,8BAAAk2B,EAAM;AAAA,gCACJ,gBAAA36B;AAAA,kCAACsoB;AAAA,kCAAA;AAAA,oCAEC,IAAI7iB,EAAI;AAAA,oCACR,IAAIA,EAAI;AAAA,oCACR,GAAGirB,EAAQ3I,EAAS;AAAA,oCACpB,MAAM2I,EAAQ9I,EAAa;AAAA,oCAC3B,MAAK;AAAA,oCACL,QAAQxJ;AAAA,oCACR,aAAasS,EAAQjJ,EAAgB;AAAA,oCACrC,QAAO;AAAA,oCACP,eAAe,CAACrhB,MAAM;;AACpB,sCAAKxE,GAAkBpC,CAAI,MAC3B4G,EAAE,gBAAA,GACF+oB,GAAkB,IAAI,GACtBE,GAAkB,IAAI,GACtBE,GAAe,IAAI,GACnBN,EAAc;AAAA,wCACZ,MAAM;AAAA,wCACN,SAASyD,EAAc;AAAA,wCACvB,WAAWgI;AAAA,wCACX,WAAWE;AAAA,sCAAA,CACZ,IACDltB,MAAA5P,KAAAsI,EAAE,eAAc,sBAAhB,QAAAsH,GAAA,KAAA5P,IAAoCsI,EAAE;AAAA,oCACxC;AAAA,kCAAA;AAAA,kCAtBK,QAAQssB,EAAc,EAAE,IAAIgI,CAAE,IAAIE,CAAE;AAAA,gCAAA;AAAA,8BAuB3C;AAAA,4BAEJ;AAAA,wBACF;AACA,+BAAKj5B,GAAkBnC,CAAI,KAC3B2E,EAAK,QAAQ,QAAQ,CAAC4M,GAAQmqB,MAAO;AACnC,8BACEx5B,GAAgBlC,CAAI,KACpB,CAAC2E,EAAK,WACL+2B,MAAO,KAAKA,MAAO/2B,EAAK,QAAQ,SAAS;AAE1C;AAEF,gCAAMs1B,MACJvK,MAAA,gBAAAA,GAAgB,kBAAiBwL,MACjCxL,MAAA,gBAAAA,GAAgB,iBAAgBgM;AAClC,0BAAAP,EAAM;AAAA,4BACJ,gBAAA36B;AAAA,8BAACsoB;AAAA,8BAAA;AAAA,gCAEC,IAAIvX,EAAO;AAAA,gCACX,IAAIA,EAAO;AAAA,gCACX,GAAG2f,EAAQ+I,KAAWlS,KAAuBD,EAAW;AAAA,gCACxD,MAAMoJ,EAAQlJ,EAAa;AAAA,gCAC3B,MAAMiS,KAAWrb,KAAqB;AAAA,gCACtC,QAAQA;AAAA,gCACR,aAAasS,EAAQjJ,EAAgB;AAAA,gCACrC,QAAO;AAAA,gCACP,eAAe,CAACrhB,OAAM;AAGpB,kCAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACGzE,GAAkBnC,CAAI,KAC3Bu0B,GAAkB2G,GAAIQ,CAAE;AAAA,gCAC1B;AAAA,gCACA,eAAe,CAAC90B,OAAM;AACpB,sCAAKzE,GAAkBnC,CAAI,GAE3B;AAAA,wCADA4G,GAAE,gBAAA,GACEA,GAAE,UAAU,GAAG;AACjB,sCAAA2tB,GAAkB2G,GAAIQ,CAAE;AACxB;AAAA,oCACF;AACA,oCAAA/L,GAAkB,EAAE,cAAcuL,GAAI,aAAaQ,GAAI,GACvD7L,GAAkB,IAAI,GACtBJ,EAAc;AAAA,sCACZ,MAAM;AAAA,sCACN,SAASyD,EAAc;AAAA,sCACvB,cAAcgI;AAAA,sCACd,aAAaQ;AAAA,oCAAA,CACd;AAAA;AAAA,gCACH;AAAA,8BAAA;AAAA,8BA9BK,KAAKxI,EAAc,EAAE,IAAIgI,CAAE,IAAIQ,CAAE;AAAA,4BAAA;AAAA,0BA+BxC;AAAA,wBAEJ,CAAC,GACMP;AAAA,sBACT;AAAA,oBAAA;AAAA,oBAGHnP,MAAgBmJ,KACf,gBAAA30B;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,GAAG20B;AAAA,wBACH,MAAK;AAAA,wBACL,QAAQvW;AAAA,wBACR,aAAa,IAAIhC;AAAA,wBACjB,OAAOiM,GAAkB,IAAIjM,EAAI;AAAA,wBACjC,eAAc;AAAA,wBACd,eAAe;AAAA,wBACf,eAAc;AAAA,sBAAA;AAAA,oBAAA,IAEd;AAAA,oBAEHoP,MAAgBgN,KACf,gBAAAl4B,EAAC,KAAA,EAAE,eAAc,QACf,UAAA;AAAA,sBAAA,gBAAAN;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,GAAGw4B;AAAA,0BACH,MAAK;AAAA,0BACL,QAAQpa;AAAA,0BACR,aAAasS,EAAQ,EAAE;AAAA,0BACvB,OAAOrI,GAAkBqI,EAAQ,EAAE,CAAC;AAAA,0BACpC,eAAe;AAAA,0BACf,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEhB,gBAAA1wB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,GAAGw4B;AAAA,0BACH,MAAK;AAAA,0BACL,QAAO;AAAA,0BACP,aAAa,IAAIpc;AAAA,0BACjB,OAAOiM,GAAkB,IAAIjM,EAAI;AAAA,0BACjC,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEf7c,GAAiBC,CAAI,KAAKi5B,MAAe,CAAC/J,KACzC,gBAAApuB,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA;AAAA,wBAAA,gBAAAN;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,IAAIy4B,GAAY;AAAA,4BAChB,IAAIA,GAAY;AAAA,4BAChB,GAAG/H,EAAQ,CAAC;AAAA,4BACZ,MAAK;AAAA,4BACL,QAAQtS;AAAA,4BACR,aAAasS,EAAQ,CAAC;AAAA,0BAAA;AAAA,wBAAA;AAAA,wBAExB,gBAAA1wB;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,GAAG,KAAKy4B,GAAY,CAAC,IAAIA,GAAY,IAAI/H,EAAQ,CAAC,CAAC,MAAM+H,GAAY,CAAC,IAAIA,GAAY,IAAI/H,EAAQ,CAAC,CAAC,MAAM+H,GAAY,IAAI/H,EAAQ,CAAC,CAAC,IAAI+H,GAAY,CAAC,MAAMA,GAAY,IAAI/H,EAAQ,CAAC,CAAC,IAAI+H,GAAY,CAAC;AAAA,4BACtM,MAAK;AAAA,4BACL,QAAQra;AAAA,4BACR,aAAasS,EAAQ,CAAC;AAAA,4BACtB,eAAc;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAChB,EAAA,CACF,IACE;AAAA,oBAAA,EAAA,CACN,IACE;AAAA,oBAEHlF,MAAgBoN,MACb,gBAAAt4B,EAAC,KAAA,EAAE,eAAc,QACf,UAAA;AAAA,sBAAA,gBAAAN;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,IAAI44B,GAAW,KAAK;AAAA,0BACpB,IAAIA,GAAW,KAAK;AAAA,0BACpB,IAAIA,GAAW,GAAG;AAAA,0BAClB,IAAIA,GAAW,GAAG;AAAA,0BAClB,QAAQxa;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,OAAOiM,GAAkB,IAAIjM,EAAI;AAAA,0BACjC,eAAe;AAAA,0BACf,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,uBAEdsS,MAAYb,OACZ,gBAAA7tB;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BACC,IAAIsQ,GAAW,GAAG;AAAA,0BAClB,IAAIA,GAAW,GAAG;AAAA,0BAClB,GAAGlI,EAAQuH,KAAW/Q,KAAuBD,EAAW;AAAA,0BACxD,MAAMyJ,EAAQvJ,EAAa;AAAA,0BAC3B,MAAM8Q,KAAW,YAAY7Z;AAAA,0BAC7B,aAAa;AAAA,0BACb,QAAO;AAAA,0BACP,aAAasS,EAAQtJ,EAAgB;AAAA,0BACrC,QAAO;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACT,GAEJ;AAAA,oBAGHoE,MAAgBmC,MACf,gBAAA3tB;AAAA,sBAACsoB;AAAA,sBAAA;AAAA,wBACC,IAAIqF,GAAgB;AAAA,wBACpB,IAAIA,GAAgB;AAAA,wBACpB,GAAG+C,EAAQzJ,EAAW;AAAA,wBACtB,MAAMyJ,EAAQvJ,EAAa;AAAA,wBAC3B,MAAK;AAAA,wBACL,aAAa;AAAA,wBACb,QAAO;AAAA,wBACP,aAAauJ,EAAQtJ,EAAgB;AAAA,wBACrC,QAAO;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAIVoE,MAAgB5pB,GAAkBpC,CAAI,IACnC0F,EAAM,OAAO,CAACR,MAASA,EAAK,OAAOsrB,EAAmB,EAAE,IAAI,CAACtrB,MAAS;AACpE,0BAAI,CAACqf,GAAoBrf,CAAI,EAAG,QAAO;AACvC,4BAAMF,IAAOiwB,GAAkB,IAAI/vB,EAAK,YAAY,GAC9CD,IAAKgwB,GAAkB,IAAI/vB,EAAK,UAAU;AAChD,0BAAI,CAACF,KAAQ,CAACC,KAAMD,EAAK,YAAYC,EAAG,QAAS,QAAO;AACxD,4BAAMyf,IAAQ2Q,GAAkBnwB,GAAM8f,IAAYiQ,EAAiB;AACnE,0BAAIvQ,GAAO;AACT,8BAAM8W,KACJzN,MAAA,gBAAAA,GAAqB,YAAW7oB,EAAK,MACrC6oB,GAAoB,WAAW,GAC3B0N,MACJ1N,MAAA,gBAAAA,GAAqB,YAAW7oB,EAAK,MACrC6oB,GAAoB,WAAW,GAC3B4N,KAAc,CAClBjrB,IACA2H,OACG;;AACH,8BAAI,EAAAqS,KAAY,CAACc,IAEjB;AAAA,gCADAnT,GAAM,gBAAA,GACFA,GAAM,UAAU,GAAG;AACrB,8BAAAmT,EAAmBtmB,EAAK,IAAI,IAAI,GAChC8oB,GAAuB,IAAI,GAC3BF,GAAkB,IAAI;AACtB;AAAA,4BACF;AACA,4BAAAE,GAAuB,EAAE,QAAQ9oB,EAAK,IAAI,QAAAwL,IAAQ,GAClDod,GAAkB,EAAE,MAAM,UAAU,QAAQ5oB,EAAK,IAAI,QAAAwL,IAAQ,IAC7DxC,KAAA5P,IAAA2tB,EAAO,YAAP,gBAAA3tB,EAAgB,sBAAhB,QAAA4P,EAAA,KAAA5P,GAAoC+Z,GAAM;AAAA;AAAA,wBAC5C;AACA,iDACG,KAAA,EACC,UAAA;AAAA,0BAAA,gBAAA7X;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIwE,EAAK;AAAA,8BACT,IAAIA,EAAK;AAAA,8BACT,IAAI0f,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAO;AAAA,8BACP,aAAawM,EAAQ5I,EAAmB;AAAA,8BACxC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA9nB;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIwE,EAAK;AAAA,8BACT,IAAIA,EAAK;AAAA,8BACT,IAAI0f,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAQ9F;AAAA,8BACR,aAAasS,EAAQ7I,EAAc;AAAA,8BACnC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA7nB;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIyE,EAAG;AAAA,8BACP,IAAIA,EAAG;AAAA,8BACP,IAAIyf,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAO;AAAA,8BACP,aAAawM,EAAQ5I,EAAmB;AAAA,8BACxC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA9nB;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,IAAIyE,EAAG;AAAA,8BACP,IAAIA,EAAG;AAAA,8BACP,IAAIyf,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,QAAQ9F;AAAA,8BACR,aAAasS,EAAQ7I,EAAc;AAAA,8BACnC,eAAc;AAAA,8BACd,eAAc;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhB,gBAAA7nB;AAAA,4BAACsoB;AAAA,4BAAA;AAAA,8BACC,IAAIpE,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,GAAGwM,EAAQsK,IAAKrT,KAAuBD,EAAW;AAAA,8BAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,8BAC3B,MAAMoT,IAAK5c,KAAqB;AAAA,8BAChC,QAAQA;AAAA,8BACR,aAAasS,EAAQjJ,EAAgB;AAAA,8BACrC,QAAO;AAAA,8BACP,eAAe,CAAC5P,OAAU;AAGxB,gCAFAA,GAAM,gBAAA,GACNA,GAAM,eAAA,GACF,EAAAqS,KAAY,CAACc,OACjBA,EAAmBtmB,EAAK,IAAI,IAAI,GAChC8oB,GAAuB,IAAI,GAC3BF,GAAkB,IAAI;AAAA,8BACxB;AAAA,8BACA,eAAe,CAACzV,OAAUsjB,GAAY,GAAGtjB,EAAK;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEhD,gBAAA7X;AAAA,4BAACsoB;AAAA,4BAAA;AAAA,8BACC,IAAIpE,EAAM,GAAG;AAAA,8BACb,IAAIA,EAAM,GAAG;AAAA,8BACb,GAAGwM,EAAQuK,KAAKtT,KAAuBD,EAAW;AAAA,8BAClD,MAAMgJ,EAAQ9I,EAAa;AAAA,8BAC3B,MAAMqT,KAAK7c,KAAqB;AAAA,8BAChC,QAAQA;AAAA,8BACR,aAAasS,EAAQjJ,EAAgB;AAAA,8BACrC,QAAO;AAAA,8BACP,eAAe,CAAC5P,OAAU;AAGxB,gCAFAA,GAAM,gBAAA,GACNA,GAAM,eAAA,GACF,EAAAqS,KAAY,CAACc,OACjBA,EAAmBtmB,EAAK,IAAI,IAAI,GAChC8oB,GAAuB,IAAI,GAC3BF,GAAkB,IAAI;AAAA,8BACxB;AAAA,8BACA,eAAe,CAACzV,OAAUsjB,GAAY,GAAGtjB,EAAK;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBAChD,EAAA,GA9EM,eAAenT,EAAK,EAAE,EA+E9B;AAAA,sBAEJ;AACA,4BAAMe,IAAM,EAAE,IAAIjB,EAAK,IAAIC,EAAG,KAAK,GAAG,IAAID,EAAK,IAAIC,EAAG,KAAK,EAAA;AAC3D,6BACE,gBAAAzE;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BAEC,IAAI7iB,EAAI;AAAA,0BACR,IAAIA,EAAI;AAAA,0BACR,GAAGirB,EAAQ3I,EAAS;AAAA,0BACpB,MAAM2I,EAAQ9I,EAAa;AAAA,0BAC3B,MAAK;AAAA,0BACL,QAAQxJ;AAAA,0BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BACrC,QAAO;AAAA,0BACP,eAAe,CAAC5P,MAAU;;AACxB,4BAAIqS,KAAY,CAACc,MACjBnT,EAAM,gBAAA,GACN2V,GAAuB,IAAI,GAC3BF,GAAkB,EAAE,MAAM,QAAQ,QAAQ5oB,EAAK,IAAI,IACnDgJ,MAAA5P,KAAA2tB,EAAO,YAAP,gBAAA3tB,GAAgB,sBAAhB,QAAA4P,GAAA,KAAA5P,IAAoC+Z,EAAM;AAAA,0BAC5C;AAAA,wBAAA;AAAA,wBAfK,cAAcnT,EAAK,EAAE;AAAA,sBAAA;AAAA,oBAkBhC,CAAC,IACD;AAAA,oBAEH8mB,MACCvmB,EACG,OAAO,CAAC6f,MAAWzB,GAAsBzlB,CAAK,KAAKknB,EAAO,WAAW,IAAI,EACzE,IAAI,CAACA,MAAW;AACnB,4BAAM2U,IAAW9P,EAAkB,SAAS7E,EAAO,EAAE,GAC/ClG,IAAUgR,OAAoB9K,EAAO,IACrCsW,IAAYtW,EAAO,WAAW,MAC9BuW,IAAYjH,GAAmB,IAAItP,EAAO,EAAE,GAC5CwW,IAAgB7G,GAAkB,IAAI3P,EAAO,EAAE,KAAKA,GACpDyW,KAActO,MAAenI,EAAO,MAAM0P,MAAiB,MAC3DgH,KACJ/B,KACA9P,EAAkB,KAAK,CAACrT,OAAO;AAC7B,4BAAIA,OAAOwO,EAAO,GAAI,QAAO;AAC7B,8BAAMrS,IAAQ+R,GAAW,IAAIlO,EAAE;AAC/B,+BACE7D,KACA,KAAK;AAAA,0BACHA,EAAM,IAAI6oB,EAAc;AAAA,0BACxB7oB,EAAM,IAAI6oB,EAAc;AAAA,wBAAA,KACrB;AAAA,sBAET,CAAC,GACGG,KAAOhC,KAAY2B,IAAYlU,KAAuBD;AAC5D,+CACG,KAAA,EACD,UAAA,gBAAAjnB;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BACC,IAAIgT,EAAc;AAAA,0BAClB,IAAIA,EAAc;AAAA,0BAClB,GAAG5K,EAAQ+K,EAAI;AAAA,0BACf,MAAM/K,EAAQ7N,EAAwB;AAAA,0BACtC,MACE0Y,MAEIC,KADA,YAGAJ,IACExc,IACE,YACAyI,KACFoS,IACE7a,IACE,YACAR,KACFQ,IACE,YACA;AAAA,0BAEZ,aAAa;AAAA,0BACb,QAAQ6a,KAAY2B,IAAYhd,KAAqB;AAAA,0BACrD,aAAasS,EAAQtJ,EAAgB;AAAA,0BACrC,QACEoE,KACI,SACAtB,IACE,YACA+C,MAAenI,EAAO,KACpB,aACA;AAAA,0BAEV,gBAAgB,MAAM;AACpB,4BAAKoF,KAAU2F,GAAmB/K,EAAO,EAAE;AAAA,0BAC7C;AAAA,0BACA,gBAAgB,MACd+K,GAAmB,CAACvZ,OAAQA,OAAOwO,EAAO,KAAK,OAAOxO,EAAG;AAAA,0BAE3D,eAAe,CAAClQ,OAAM;AAGpB,4BAFAA,GAAE,gBAAA,GACFA,GAAE,eAAA,GACG1G,GAAwBF,CAAI,KACjC02B,GAAuBpR,EAAO,EAAE;AAAA,0BAClC;AAAA,0BACA,eAAe,CAAC1e,OAAM;;AAGpB,gCAFAA,GAAE,gBAAA,GACE8jB,KAAY,CAACsB,MACb9rB,GAAwBF,CAAI,KAAK4G,GAAE,UAAU,EAAG;AACpD,kCAAMgX,IAAQsW,GAAQttB,GAAE,SAASA,GAAE,OAAO,GACpCqwB,IAAe7R,GAAmB3f,GAAS4oB,EAAgB,GAC3DhI,KAAOd;AAAA,8BACX3H;AAAA,8BACAnY;AAAA,8BACAC;AAAA,8BACAuxB;AAAA,8BACA/F,EAAQ7N,EAAwB;AAAA,8BAChC2B;AAAA,4BAAA;AAEF,gCAAIqJ,IAAkB;AACpB,kCACE4I,EAAa,IAAI3R,EAAO,EAAE,MAC1Be,MAAA,gBAAAA,GAAM,UAAS,WACfA,MAAA,gBAAAA,GAAM,UAAS;AAEf;AAEF,mCAAIA,MAAA,gBAAAA,GAAM,UAAS,WAAUA,MAAA,gBAAAA,GAAM,UAAS,YAAY;AACtD,gCAAA+E;AAAA,kCACEiD,GAAiB;AAAA,kCACjBA,GAAiB;AAAA,kCACjBhI,GAAK;AAAA,kCACL6K,EAAQ7N,EAAwB;AAAA,gCAAA,GAElCiL,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AACpB;AAAA,8BACF;AACA,kCAAIyI,EAAa,IAAI3R,EAAO,EAAE,EAAG;AACjC,8BAAA8F;AAAA,gCACEiD,GAAiB;AAAA,gCACjBA,GAAiB;AAAA,gCACjB,EAAE,GAAGyN,EAAc,GAAG,GAAGA,EAAc,EAAA;AAAA,gCACvC5K,EAAQ7N,EAAwB;AAAA,8BAAA,GAElCiL,GAAoB,IAAI,GACxBE,GAAgB,IAAI;AACpB;AAAA,4BACF;AACA,iCAAInI,MAAA,gBAAAA,GAAM,UAAS,UAAUtmB,GAAiBC,CAAI,GAAG;AACnD,8BAAAs2B,GAAwBjQ,GAAK,QAAQA,GAAK,KAAK;AAC/C;AAAA,4BACF;AACA,gCAAItmB,GAAiBC,CAAI,KAAKmuB,IAAiB;AAC7C,8BAAArD,GAAmBqD,IAAiB7I,EAAO,EAAE,GAC7C8I,EAAmB,IAAI,GACvBF,GAAmB9tB,GAAqBJ,GAAMslB,EAAO,EAAE,CAAC,GACxDkJ,GAAgB,EAAE,GAAGsN,EAAc,GAAG,GAAGA,EAAc,GAAG,GAC1DnL,GAAc,CAACrL,EAAO,EAAE,CAAC;AACzB;AAAA,4BACF;AACA,gCACEvlB,GAAiBC,CAAI,KACrBiuB,MAAmB,QACnBA,OAAoB3I,EAAO,IAC3B;AACA,8BAAA0F,KAAA,QAAAA,EAAqBiD,IAAiB3I,EAAO,KAC7C4I,GAAmB9tB,GAAqBJ,GAAMslB,EAAO,EAAE,CAAC,GACxDkJ,GAAgB,EAAE,GAAGsN,EAAc,GAAG,GAAGA,EAAc,GAAG,GAC1DnL,GAAc,CAACrL,EAAO,EAAE,CAAC;AACzB;AAAA,4BACF;AACA,gCAAIvlB,GAAiBC,CAAI,KAAK47B,KAAa,CAACC,GAAW;AACrD,8BAAAzN,EAAmB,IAAI,GACvBF,GAAmB,IAAI,GACvBI,GAAoB;AAAA,gCAClB,SAAShJ,EAAO;AAAA,gCAChB,QAAQ,EAAE,GAAGwW,EAAc,GAAG,GAAGA,EAAc,EAAA;AAAA,8BAAE,CAClD,GACDtN,GAAgB,EAAE,GAAGsN,EAAc,GAAG,GAAGA,EAAc,GAAG;AAC1D;AAAA,4BACF;AACA,4BAAA5N,GAAmB5I,EAAO,EAAE,GAC5BqL;AAAA,8BACE/pB,GAAE,WACEujB,EAAkB,SAAS7E,EAAO,EAAE,IAClC6E,EAAkB,OAAO,CAACrT,OAAOA,OAAOwO,EAAO,EAAE,IACjD,CAAC,GAAG6E,GAAmB7E,EAAO,EAAE,IAClC,CAACA,EAAO,EAAE;AAAA,4BAAA,GAEhBoI,EAAcpI,EAAO,EAAE,GACvBsI,GAAmB;AAAA,8BACjB,GAAGkO,EAAc;AAAA,8BACjB,GAAGA,EAAc;AAAA,4BAAA,CAClB,IACD5tB,MAAA5P,KAAAsI,GAAE,eAAc,sBAAhB,QAAAsH,GAAA,KAAA5P,IAAoCsI,GAAE;AAAA,0BACxC;AAAA,wBAAA;AAAA,sBAAA,EACF,GA3IQ0e,EAAO,EA4If;AAAA,oBAEJ,CAAC;AAAA,oBAEApjB,GAAgBlC,CAAI,KACnB,CAAC0qB,KACD0I,GAAgB,QAAQ,CAACvd,MAAU;AACjC,4BAAM3L,IAAQ4E,GAAgB+G,EAAM,QAAQ,GACtCslB,IAA2B,CAAA;AACjC,6BAAIx5B,GAAgB3B,CAAI,KACtBkK,EAAM,QAAQ,CAACvF,GAAMu2B,MAAO;AAC1B,8BAAM91B,IAAIV,GAAUC,CAAI;AACxB,iCAASy2B,KAAK,GAAGA,KAAKh2B,GAAGg2B,MAAM;AAC7B,gCAAMhc,MACJuP,MAAA,gBAAAA,GAAgB,aAAY9Y,EAAM,MAClC8Y,GAAe,cAAcuM,KAC7BvM,GAAe,cAAcyM;AAC/B,0BAAAD,EAAM;AAAA,4BACJ,gBAAA36B;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCAEC,GAAGuE,GAAYJ,GAAMy2B,EAAE;AAAA,gCACvB,MAAK;AAAA,gCACL,QAAQhc,KAAUR,KAAqB;AAAA,gCACvC,aAAasS,EAAQ9R,KAAU,KAAK4I,KAAgB,CAAC;AAAA,gCACrD,eAAe5I,KAAU,OAAO;AAAA,gCAChC,eAAc;AAAA,gCACd,OAAO,EAAE,QAAQ,OAAA;AAAA,gCACjB,gBAAgB,MACdwP;AAAA,kCAAkB,CAACriB,QACjBA,MAAA,gBAAAA,GAAM,aAAYsJ,EAAM,MACxBtJ,GAAK,cAAc2uB,KACnB3uB,GAAK,cAAc6uB,KACf,OACA7uB;AAAA,gCAAA;AAAA,gCAGR,eAAe,CAAC3F,OAAM;AACpB,kCAAAA,GAAE,gBAAA,GACFktB,GAAkBI,GAAQttB,GAAE,SAASA,GAAE,OAAO,CAAC;AAAA,gCACjD;AAAA,8BAAA;AAAA,8BApBK,UAAUiP,EAAM,EAAE,IAAIqlB,CAAE,IAAIE,EAAE;AAAA,4BAAA;AAAA,0BAqBrC;AAAA,wBAEJ;AAAA,sBACF,CAAC,GAEHxoB,GAAaiD,EAAM,QAAQ,EAAE,QAAQ,CAACjM,MAAQ;AAC5C,8BAAMkN,IAAK;AAAA,0BACT,SAASjB,EAAM;AAAA,0BACf,WAAWjM,EAAI;AAAA,0BACf,KAAKA,EAAI;AAAA,wBAAA,GAELya,IACJoK,MAAoB,QAAQrc,GAAYqc,IAAkB3X,CAAE,GACxD8f,KACJ/H,MAAoB,QAAQzc,GAAYyc,IAAkB/X,CAAE;AAC9D,wBAAAqkB,EAAM;AAAA,0BACJ,gBAAA36B;AAAA,4BAACsoB;AAAA,4BAAA;AAAA,8BAEC,IAAIlf,EAAI,MAAM;AAAA,8BACd,IAAIA,EAAI,MAAM;AAAA,8BACd,GAAGsnB,EAAQpJ,EAAW;AAAA,8BACtB,MAAMoJ,EAAQxI,EAAW;AAAA,8BACzB,MAAMrE,KAAWuS,KAAUhY,KAAqB;AAAA,8BAChD,QAAQA;AAAA,8BACR,aAAasS,EAAQjJ,EAAgB;AAAA,8BACrC,QAAO;AAAA,8BACP,eAAe,CAACrhB,OAAM;AACpB,gCAAAA,GAAE,gBAAA,GACFgtB,GAAehqB,EAAI,KAAK;AAAA,8BAC1B;AAAA,4BAAA;AAAA,4BAZK,UAAUiM,EAAM,EAAE,IAAIjM,EAAI,SAAS,IAAIA,EAAI,GAAG;AAAA,0BAAA;AAAA,wBAarD;AAAA,sBAEJ,CAAC,GACMuxB;AAAA,oBACT,CAAC;AAAA,oBAEFx5B,GAAgB3B,CAAI,KACnB2uB,MACA,CAACA,GAAe,UAChB,CAACE,MACD,CAACyE,GAAoB3E,GAAe,OAAOuC,EAAQxI,EAAW,CAAC,MAC9D,MAAM;AACL,4BAAM7S,IAAQud,GAAgB;AAAA,wBAC5B,CAAC5uB,MAAMA,EAAE,OAAOmqB,GAAe;AAAA,sBAAA;AAEjC,0BAAI,CAAC9Y,EAAO,QAAO;AACnB,4BAAMwP,IAAU7N;AAAA,wBACd3B,EAAM;AAAA,wBACN8Y,GAAe;AAAA,wBACfA,GAAe;AAAA,wBACfA,GAAe;AAAA,wBACfuC,EAAQzI,EAAiB;AAAA,sBAAA;AAE3B,0BAAI,CAACpD,EAAS,QAAO;AACrB,4BAAM6W,IAAehL,EAAQpJ,KAAc,CAAC;AAC5C,6BACEwL,GAAoBjO,EAAQ,IAAI6W,CAAY,KAC5C5I,GAAoBjO,EAAQ,IAAI6W,CAAY,IAErC,OAGP,gBAAAp7B,EAAC,KAAA,EAAE,eAAc,QACf,UAAA;AAAA,wBAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA,gBAAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,IAAI6kB,EAAQ,GAAG;AAAA,4BACf,IAAIA,EAAQ,GAAG;AAAA,4BACf,GAAG6L,EAAQ3I,EAAS;AAAA,4BACpB,MAAK;AAAA,4BACL,QAAQ3J;AAAA,4BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BAAA;AAAA,wBAAA,GAEzC;AAAA,wBACA,gBAAAznB,EAAC,KAAA,EAAE,WAAU,0BACX,UAAA,gBAAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,IAAI6kB,EAAQ,GAAG;AAAA,4BACf,IAAIA,EAAQ,GAAG;AAAA,4BACf,GAAG6L,EAAQ3I,EAAS;AAAA,4BACpB,MAAK;AAAA,4BACL,QAAQ3J;AAAA,4BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BAAA;AAAA,wBAAA,EACvC,CACF;AAAA,sBAAA,GACF;AAAA,oBAEJ,GAAA;AAAA,oBAED/lB,GAAgBlC,CAAI,KACnByuB,MACAF,OACC,MAAM;;AACL,4BAAM1Y,IAAQud,GAAgB;AAAA,wBAC5B,CAAC5uB,MAAMA,EAAE,OAAOiqB,GAAiB;AAAA,sBAAA,GAE7BzpB,IAAO6Q,KACTvX,IAAAsU,GAAaiD,EAAM,QAAQ,EAAE;AAAA,wBAC3B,CAACjM,MACCA,EAAI,cAAc6kB,GAAiB,aACnC7kB,EAAI,QAAQ6kB,GAAiB;AAAA,sBAAA,MAHjC,gBAAAnwB,EAIG,QACH;AACJ,0BAAI,CAAC0G,EAAM,QAAO;AAClB,4BAAM4xB,IAAU/H,MAAoB;AACpC,6BACE,gBAAAruB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAIwE,EAAK;AAAA,0BACT,IAAIA,EAAK;AAAA,0BACT,IAAIupB,GAAa;AAAA,0BACjB,IAAIA,GAAa;AAAA,0BACjB,QAAQ3P;AAAA,0BACR,cAAcgY,IAAU,MAAM,KAAKha;AAAA,0BACnC,iBACEga,IAAU,SAAY,GAAG,IAAIha,EAAI,IAAI,IAAIA,EAAI;AAAA,0BAE/C,eAAc;AAAA,0BACd,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAGpB,GAAA;AAAA,oBAEDkQ,GAAQ,SAAS,KAAK/qB,GAAkB/B,CAAI,MAAM,MAAM;AACvD,4BAAM2Y,IAASL;AAAA,wBACbwU,GAAQ,CAAC;AAAA,wBACTA,GAAQA,GAAQ,SAAS,CAAC;AAAA,wBAC1BE;AAAA,sBAAA;AAEF,6BACE,gBAAAxsB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAImY,EAAO;AAAA,0BACX,IAAIA,EAAO;AAAA,0BACX,IAAI,KAAK,IAAIA,EAAO,IAAI,CAAC;AAAA,0BACzB,IAAI,KAAK,IAAIA,EAAO,IAAI,CAAC;AAAA,0BACzB,MAAMyF,EAAM;AAAA,0BACZ,aAAa;AAAA,0BACb,QAAQQ;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,0BACxC,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAGpB,GAAA;AAAA,oBACCkQ,GAAQ,SAAS,KAAK9sB,MAAS,eAC9B,gBAAAQ;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,GAAG,KAAK,IAAIssB,GAAQ,CAAC,EAAE,GAAGA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBACtC,GAAG,KAAK,IAAIA,GAAQ,CAAC,EAAE,GAAGA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBACtC,OAAO,KAAK,IAAIA,GAAQ,CAAC,EAAE,IAAIA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBAC3C,QAAQ,KAAK,IAAIA,GAAQ,CAAC,EAAE,IAAIA,GAAQ,CAAC,EAAE,CAAC;AAAA,wBAC5C,MAAM1O,EAAM;AAAA,wBACZ,aAAa;AAAA,wBACb,QAAQQ;AAAA,wBACR,aAAa,IAAIhC;AAAA,wBACjB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAG3CyQ,MACC,gBAAA7sB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,IACE6sB,GAAU,SAAS,eACfA,GAAU,QAAQ,IAAI,MACtBA,GAAU,QAAQ;AAAA,wBAExB,IACEA,GAAU,SAAS,eACfA,GAAU,QAAQ,IAClBA,GAAU,QAAQ,IAAI;AAAA,wBAE5B,IACEA,GAAU,SAAS,eACfA,GAAU,QAAQ,IAAI,MACtBA,GAAU,QAAQ;AAAA,wBAExB,IACEA,GAAU,SAAS,eACfA,GAAU,QAAQ,IAClBA,GAAU,QAAQ,IAAI;AAAA,wBAE5B,QAAQzO;AAAA,wBACR,aAAa,OAAOhC;AAAA,wBACpB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,wBACxC,eAAc;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAGjB2Q,GAAc,SAAS,KAAK3rB,GAAkB5B,CAAI,KACjD,gBAAAc,EAAAq7B,IAAA,EACE,UAAA;AAAA,sBAAA,gBAAA37B;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,QAAQ+sB,GAAc,IAAI,CAACnpB,MAAM,GAAGA,EAAE,CAAC,IAAIA,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,0BAC1D,MAAK;AAAA,0BACL,QAAQwa;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,iBAAiB,GAAG,IAAIA,EAAI,IAAI,IAAIA,EAAI;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEzCyc,MACC,gBAAA74B;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAI64B,GAAc,KAAK;AAAA,0BACvB,IAAIA,GAAc,KAAK;AAAA,0BACvB,IAAIA,GAAc,GAAG;AAAA,0BACrB,IAAIA,GAAc,GAAG;AAAA,0BACrB,QAAQza;AAAA,0BACR,cAAcmQ,KAAc,MAAM,KAAKnS;AAAA,0BACvC,iBACEmS,KAAc,SAAY,GAAG,IAAInS,EAAI,IAAI,IAAIA,EAAI;AAAA,0BAEnD,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGjB0c,MACC,gBAAA94B;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,IAAI84B,GAAa,KAAK;AAAA,0BACtB,IAAIA,GAAa,KAAK;AAAA,0BACtB,IAAIA,GAAa,GAAG;AAAA,0BACpB,IAAIA,GAAa,GAAG;AAAA,0BACpB,QAAQ1a;AAAA,0BACR,aAAa,IAAIhC;AAAA,0BACjB,eAAemS,KAAc,MAAM;AAAA,0BACnC,iBACEA,KAAc,SAAY,GAAG,IAAInS,EAAI,IAAI,IAAIA,EAAI;AAAA,0BAEnD,eAAc;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGjB2Q,GAAc,IAAI,CAACnpB,GAAGoG,MAAM;AAC3B,8BAAMosB,IAAUjf,GAAcoX,IAAa3qB,CAAC;AAC5C,+BACE,gBAAA5D;AAAA,0BAACsoB;AAAA,0BAAA;AAAA,4BAEC,IAAI1kB,EAAE;AAAA,4BACN,IAAIA,EAAE;AAAA,4BACN,GAAG8sB,EAAQ1mB,MAAM,IAAIud,KAAuBD,EAAW;AAAA,4BACvD,MAAMoJ,EAAQxI,EAAW;AAAA,4BACzB,MAAMle,MAAM,KAAKosB,IAAUhY,KAAqB;AAAA,4BAChD,QAAQA;AAAA,4BACR,aAAasS,EAAQjJ,EAAgB;AAAA,4BACrC,QAAO;AAAA,0BAAA;AAAA,0BARF,MAAMzd,CAAC;AAAA,wBAAA;AAAA,sBAWlB,CAAC;AAAA,sBACAukB,MACC,CAACxB,GAAc,KAAK,CAACnpB,MAAMuT,GAAcoX,IAAa3qB,CAAC,CAAC,KACtD,gBAAA5D;AAAA,wBAACsoB;AAAA,wBAAA;AAAA,0BACC,IAAIiG,GAAY;AAAA,0BAChB,IAAIA,GAAY;AAAA,0BAChB,GAAGmC,EAAQpJ,EAAW;AAAA,0BACtB,MAAMoJ,EAAQxI,EAAW;AAAA,0BACzB,MAAM9J;AAAA,0BACN,QAAQA;AAAA,0BACR,aAAasS,EAAQjJ,EAAgB;AAAA,0BACrC,QAAO;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACT,EAAA,CAEN;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,UAED4I,KACC,gBAAArwB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,MAAMqwB,GAAY,GAAG,KAAKA,GAAY,EAAA;AAAA,cAC/C,MAAK;AAAA,cAEJ,UAAAA,GAAY;AAAA,YAAA;AAAA,UAAA,IAEb;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAj8CJ,gBAAArwB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWmpB,GAAkBC,CAAQ;AAAA,QACrC,OAAOgQ;AAAA,QAEP,UAAA,gBAAAp5B,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAmqB,GAAA,CAAa;AAAA,MAAA;AAAA,IAAA;AAAA,EAg8C/D;AAAC;AAEDZ,GAAa,cAAc;AC5pHpB,SAASqS,GAAwBC,GAM5B;AACV,SACEA,EAAM,UACNA,EAAM,gBACNA,EAAM,gBACNA,EAAM,eACNA,EAAM;AAEV;AAOO,SAASC,GACdjkB,GACAkkB,GACM;AACN,EAAKA,MACLlkB,EAAM,eAAA,GACNA,EAAM,cAAc;AACtB;AAOO,SAASmkB,GAAoBC,GAAyB;AAC3D,QAAMC,IAAoB,CAACD,CAAK;AAChC,MAAI;AACF,UAAME,IAAMF,EAAM;AAClB,IAAIE,KAAOA,MAAQF,KAAOC,EAAQ,KAAKC,CAAG;AAAA,EAC5C,QAAQ;AAAA,EAER;AACA,SAAOD;AACT;ACvBA,MAAME,KAAoE;AAAA,EACxE,EAAE,QAAQ,aAAa,QAAQ,YAAA;AAAA,EAC/B,EAAE,QAAQ,YAAY,QAAQ,WAAA;AAAA,EAC9B,EAAE,QAAQ,cAAc,QAAQ,aAAA;AAAA,EAChC,EAAE,QAAQ,UAAU,QAAQ,SAAA;AAAA,EAC5B,EAAE,QAAQ,QAAQ,QAAQ,OAAA;AAC5B;AAEA,SAASC,GAAYC,GAA0C;AAC7D,UAAQA,KAAS,IAAI,KAAA,EAAO,cAAc,QAAQ,MAAM,GAAG;AAC7D;AAGO,SAASC,GACdD,GAC8B;AAC9B,QAAME,IAAMH,GAAYC,CAAK;AAC7B,MAAI,CAACE,EAAK,QAAO;AACjB,QAAMC,IAASL,GAAgB;AAAA,IAC7B,CAAC1oB,MAAS8oB,MAAQ9oB,EAAK,UAAU8oB,EAAI,WAAW,GAAG9oB,EAAK,MAAM,GAAG;AAAA,EAAA;AAEnE,MAAI,CAAC+oB,EAAQ,QAAO;AAEpB,QAAM5gB,IADO2gB,EAAI,MAAMC,EAAO,OAAO,MAAM,EAAE,QAAQ,OAAO,EAAE,EAC3C,MAAM,GAAG,EAAE,OAAO,OAAO;AAC5C,MAAIC,GACAC;AACJ,QAAMC,IAAuB,CAAA;AAC7B,aAAWC,KAAQhhB;AACjB,IAAIghB,MAAS,QAAQA,MAAS,SAAQH,IAAYG,IACzCA,MAAS,WAAWA,MAAS,QAAOF,IAAOE,IAC/CD,EAAW,KAAKC,CAAI;AAE3B,SAAO;AAAA,IACL,QAAQJ,EAAO;AAAA,IACf,OAAOG,EAAW,KAAK,GAAG,KAAK;AAAA,IAC/B,WAAAF;AAAA,IACA,MAAAC;AAAA,EAAA;AAEJ;AAEO,SAASG,GAAmBznB,GAIV;;AACvB,WACEvX,IAAAy+B,GAAuBlnB,EAAM,WAAW,MAAxC,gBAAAvX,EAA2C,aAC3C4P,IAAA6uB,GAAuBlnB,EAAM,GAAG,MAAhC,gBAAA3H,EAAmC,WACnC;AAEJ;AAEO,SAASqvB,GACdC,GACA/3B,GACe;AACf,aAAW6f,KAAU7f;AACnB,QAAI6f,EAAO,YAAYkY,KAAWlY,EAAO,eAAe;AACtD,aAAOA,EAAO;AAGlB,SAAO;AACT;AAEO,SAASmY,GACdD,GACA/3B,GACAi4B,GACoB;AACpB,QAAM5mB,IAAKymB,GAAoBC,GAAS/3B,CAAO;AAC/C,SAAIqR,KAAM,OAAa,OAChB4mB,EAAW,KAAK,CAACxpB,MAASA,EAAK,OAAO4C,CAAE,KAAK;AACtD;AAEO,SAAS6mB,GACd9nB,GACApQ,GACAi4B,GACsB;;AACtB,WAAOp/B,IAAAm/B,GAAkB5nB,EAAM,IAAIpQ,GAASi4B,CAAU,MAA/C,gBAAAp/B,EAAkD,SAAQg/B,GAAmBznB,CAAK;AAC3F;AAEO,SAAS+nB,GAGdxoB,GACAjD,GACA1M,GACAi4B,GACK;AACL,SAAOtoB,EAAO,OAAO,CAACS,MAChBA,EAAM,cACNA,EAAM,SAAS,eAAeynB,GAAmBznB,CAAK,MAAM1D,IAAa,KACtEwrB,GAAsB9nB,GAAOpQ,GAASi4B,CAAU,MAAMvrB,CAC9D;AACH;AAEO,SAAS0rB,GACdL,GACA/3B,GACsB;AACtB,SACEA,EAAQ,KAAK,CAACzB,MAAMA,EAAE,YAAYw5B,KAAWx5B,EAAE,SAAS,WAAW,KACnEyB,EAAQ,KAAK,CAACzB,MAAMA,EAAE,YAAYw5B,KAAWx5B,EAAE,eAAe,IAAI,KAClEyB,EAAQ,KAAK,CAACzB,MAAMA,EAAE,YAAYw5B,CAAO;AAE7C;AAEO,SAASM,GAAkBjoB,GAAwC;;AACxE,QAAMnP,IAAIq3B,GAAiBloB,EAAM,QAAQ;AACzC,SAAI,OAAO,SAASnP,EAAE,CAAC,KAAK,OAAO,SAASA,EAAE,CAAC,IAAUA,MAC3CpI,IAAAuX,EAAM,SAAS,SAAS,CAAC,MAAzB,gBAAAvX,EAA6B,OAC3B,EAAE,GAAG,GAAG,GAAG,EAAA;AAC7B;AAEO,SAAS0/B,GACdC,GACAC,GACAC,GACoB;AACpB,SAAIA,MACAD,IAAeD,IAAuB,OACtCC,IAAeD,IAAuB,SACnC;AACT;AAEO,SAASG,GACdjsB,GACAiD,GACQ;AACR,aAAWS,KAAST,GAAQ;AAC1B,UAAMipB,IACJtB,GAAuBlnB,EAAM,WAAW,KAAKknB,GAAuBlnB,EAAM,GAAG;AAC/E,QAAIwoB,GAAQ;AACV,YAAMve,IAAQ3N,MAAS,aAAa,aAAa;AACjD,aAAOksB,EAAO,SAASA,EAAO,UAAU,MAAM,GAAGve,CAAK,IAAIue,EAAO,KAAK,KAAKve;AAAA,IAC7E;AAAA,EACF;AACA,SAAO3N,MAAS,aAAa,aAAa;AAC5C;AAEO,SAASmsB,GACd74B,GACAqhB,GACAtZ,GACAgY,IAAkC,oBAAI,OACrB;AACjB,MAAIlU,IAAwB,MACxBitB,IAAW;AACf,aAAWjZ,KAAU7f,GAAS;AAE5B,QADI6f,EAAO,YAAYwB,KAAWtB,EAAW,IAAIF,EAAO,EAAE,KACtDA,EAAO,SAAS,cAAcA,EAAO,SAAS,OAAQ;AAC1D,UAAM3e,IAAIoG,GAASuY,GAAQ9X,CAAK;AAChC,IAAI7G,IAAI43B,MACNjtB,IAAOgU,GACPiZ,IAAW53B;AAAA,EAEf;AACA,SAAO2K;AACT;AAEO,SAASktB,GACdC,GACAh5B,GACU;AACV,QAAM2e,wBAAU,IAAA;AAChB,aAAWkB,KAAU7f;AACnB,IAAI6f,EAAO,gBAAgBmZ,KAAenZ,EAAO,WAAW,QAC1DlB,EAAI,IAAIkB,EAAO,OAAO;AAG1B,SAAO,CAAC,GAAGlB,CAAG;AAChB;AASO,SAASsa,GACdlB,GACA/3B,GACAi4B,GACAtoB,GACK;AACL,QAAMupB,IAAYlB,GAAkBD,GAAS/3B,GAASi4B,CAAU;AAChE,MAAI,CAACiB,EAAW,QAAO,CAAA;AACvB,QAAMva,IAAMoa,GAAeG,EAAU,IAAIl5B,CAAO;AAChD,SAAO2P,EAAO,OAAO,CAAC5Q,MAAM4f,EAAI,SAAS5f,EAAE,EAAE,KAAKA,EAAE,OAAOg5B,CAAO;AACpE;AAEO,SAASoB,GACdC,GACA7gC,GACW;AACX,QAAMomB,IAAM,IAAI,IAAIya,EAAS,IAAI,CAAC3qB,MAASA,EAAK,OAAO,CAAC;AACxD,SAAOlW,EACJ,OAAO,CAACI,MAAUgmB,EAAI,IAAIhmB,EAAM,EAAE,CAAC,EACnC,MAAA,EACA,KAAK,CAAC4F,GAAGC,MAAMD,EAAE,WAAWC,EAAE,YAAYD,EAAE,aAAaC,EAAE,UAAU;AAC1E;AAEO,SAAS66B,GACdL,GACAh5B,GACAC,GACA0P,GAC2B;AAC3B,QAAM2pB,IAAgBt5B,EAAQ,OAAO,CAACzB,MAAMA,EAAE,gBAAgBy6B,CAAW,GACnEO,IAAY,IAAI,IAAID,EAAc,IAAI,CAAC/6B,MAAMA,EAAE,EAAE,CAAC,GAClDi7B,IAAOv5B,EAAM;AAAA,IACjB,CAACR,MACCA,EAAK,SAAS,eACdA,EAAK,YACL85B,EAAU,IAAI95B,EAAK,YAAY,KAC/B85B,EAAU,IAAI95B,EAAK,UAAU;AAAA,EAAA;AAEjC,MAAI,CAAC+5B,EAAM,QAAO;AAClB,QAAMC,IAAaz5B,EAAQ,KAAK,CAACzB,MAAMA,EAAE,OAAOi7B,EAAK,YAAY,GAC3DE,IAAW15B,EAAQ,KAAK,CAACzB,MAAMA,EAAE,OAAOi7B,EAAK,UAAU,GACvDj6B,IAAOoQ,EAAO,KAAK,CAAC5Q,MAAMA,EAAE,QAAO06B,KAAA,gBAAAA,EAAY,QAAO,GACtDj6B,IAAKmQ,EAAO,KAAK,CAAC5Q,MAAMA,EAAE,QAAO26B,KAAA,gBAAAA,EAAU,QAAO;AACxD,SAAI,CAACn6B,KAAQ,CAACC,IAAW,OAClB,EAAE,MAAAD,GAAM,IAAAC,EAAA;AACjB;AAEA,SAASm6B,GACPtY,GACA9oB,GACQ;;AACR,WAAOM,IAAAN,EAAO,KAAK,CAACI,MAAUA,EAAM,OAAO0oB,CAAO,MAA3C,gBAAAxoB,EAA8C,SAAQ;AAC/D;AAEA,SAAS+gC,GACPxpB,GACA7X,GACQ;AACR,SAAO,GAAGohC,GAAUvpB,EAAM,SAAS7X,CAAM,CAAC,MAAM6X,EAAM,GAAG;AAC3D;AAkBO,SAASypB,GACd5B,GACAj4B,GACAC,GACA0P,GACwB;AACxB,QAAMmqB,IAAgC,CAAA;AACtC,aAAWZ,KAAajB,GAAY;AAClC,QAAIiB,EAAU,SAAS,YAAa;AACpC,UAAMa,IAAWV,GAAsBH,EAAU,IAAIl5B,GAASC,GAAO0P,CAAM;AAC3E,QAAIoqB,GAAU;AACZ,MAAAD,EAAM,KAAK,EAAE,aAAaZ,EAAU,IAAI,MAAMa,EAAS,MAAM,IAAIA,EAAS,GAAA,CAAI;AAC9E;AAAA,IACF;AACA,UAAMpb,IAAM,IAAI,IAAIoa,GAAeG,EAAU,IAAIl5B,CAAO,CAAC,GACnDg6B,IAAUrqB,EAAO,OAAO,CAACS,MAAUuO,EAAI,IAAIvO,EAAM,EAAE,CAAC;AAC1D,IAAI4pB,EAAQ,SAAS,KACrBF,EAAM,KAAK,EAAE,aAAaZ,EAAU,IAAI,MAAMc,EAAQ,CAAC,GAAG,IAAIA,EAAQ,CAAC,GAAG;AAAA,EAC5E;AACA,SAAOF;AACT;AAGO,SAASG,GAGdT,GACAjhC,GACsD;AACtD,SAAO;AAAA,IACL;AAAA,MACE,SAASihC,EAAK,KAAK;AAAA,MACnB,KAAKA,EAAK,KAAK;AAAA,MACf,WAAWG,GAAUH,EAAK,KAAK,SAASjhC,CAAM;AAAA,IAAA;AAAA,IAEhD;AAAA,MACE,SAASihC,EAAK,GAAG;AAAA,MACjB,KAAKA,EAAK,GAAG;AAAA,MACb,WAAWG,GAAUH,EAAK,GAAG,SAASjhC,CAAM;AAAA,IAAA;AAAA,EAC9C;AAEJ;AAGO,SAAS2hC,GACd9pB,GACApQ,GACAC,GACAg4B,GACAtoB,GACApX,IAAsF,IACvE;AACf,QAAM2gC,IAAYlB,GAAkB5nB,EAAM,IAAIpQ,GAASi4B,CAAU;AACjE,MAAI,CAACiB,EAAW,QAAO;AAEvB,MAAIA,EAAU,SAAS,aAAa;AAClC,UAAMM,IAAOH,GAAsBH,EAAU,IAAIl5B,GAASC,GAAO0P,CAAM;AACvE,QAAI6pB;AACF,aAAO,GAAGA,EAAK,KAAK,GAAG,MAAMA,EAAK,GAAG,GAAG;AAE1C,UAAMW,IAAWlB,GAA0B7oB,EAAM,IAAIpQ,GAASi4B,GAAYtoB,CAAM;AAChF,WAAIwqB,EAAS,WAAW,IACf,GAAG/pB,EAAM,GAAG,MAAM+pB,EAAS,CAAC,EAAE,GAAG,KAEnC;AAAA,EACT;AAEA,QAAMH,IAAU,CAAC5pB,GAAO,GAAG6oB,GAA0B7oB,EAAM,IAAIpQ,GAASi4B,GAAYtoB,CAAM,CAAC;AAC3F,MAAIqqB,EAAQ,SAAS,EAAG,QAAO;AAC/B,QAAMI,IAAQ,IAAI;AAAA,IAChB7hC,EAAO,IAAI,CAACI,GAAO2jB,MAAU;AAAA,MAC3B3jB,EAAM;AAAA,OACLA,EAAM,YAAYA,EAAM,cAAc2jB,KAAS,OAAQ3jB,EAAM,cAAc2jB;AAAA,IAAA,CAC7E;AAAA,EAAA;AAOH,SALe0d,EAAQ,MAAA,EAAQ,KAAK,CAACz7B,GAAGC,MAAM;AAC5C,UAAM67B,IAAKD,EAAM,IAAI77B,EAAE,OAAO,KAAK,OAAO,mBACpC+7B,IAAKF,EAAM,IAAI57B,EAAE,OAAO,KAAK,OAAO;AAC1C,WAAO67B,IAAKC;AAAA,EACd,CAAC,EACa,IAAI,CAAC7rB,MAASmrB,GAAcnrB,GAAMlW,CAAM,CAAC,EAAE,KAAK,KAAK;AACrE;AAEA,SAASgiC,GACPt6B,GACAu6B,GACe;AACf,SAAOv6B,EAAM;AAAA,IACX,CAACR,MACCA,EAAK,SAAS,eACd+6B,EAAU,IAAI/6B,EAAK,YAAY,KAC/B+6B,EAAU,IAAI/6B,EAAK,UAAU;AAAA,EAAA;AAEnC;AAYA,SAASg7B,GACPpmB,GACAjE,GACA4oB,GACArY,GACU;AACV,QAAMH,IAAW4X,GAAchoB,EAAM,IAAIiE,EAAI,OAAO,GAC9CtM,IAAQyY,IACV,EAAE,GAAGA,EAAS,GAAG,GAAGA,EAAS,MAC7B6X,GAAkBjoB,CAAK;AAC3B,MAAIoQ,GAAU;AACZ,QAAIA,EAAS,gBAAgBwY,KAAexY,EAAS,SAAS,aAAa;AACzE,YAAM1jB,IAAiB;AAAA,QACrB,GAAG0jB;AAAA,QACH,MAAM;AAAA,QACN,aAAAwY;AAAA,MAAA;AAEF,aAAArY,EAAI,KAAK,EAAE,IAAI,iBAAiB,QAAQ7jB,GAAM,GAC9CuX,EAAI,UAAUA,EAAI,QAAQ,IAAI,CAAC9V,MAAOA,EAAE,OAAOzB,EAAK,KAAKA,IAAOyB,CAAE,GAC3DzB;AAAA,IACT;AACA,WAAO0jB;AAAA,EACT;AACA,QAAMsQ,IAAoB;AAAA,IACxB,IAAIzc,EAAI,QAAA;AAAA,IACR,SAASjE,EAAM;AAAA,IACf,SAASA,EAAM;AAAA,IACf,MAAM;AAAA,IACN,GAAGrI,EAAM;AAAA,IACT,GAAGA,EAAM;AAAA,IACT,aAAAixB;AAAA,EAAA;AAEF,SAAArY,EAAI,KAAK,EAAE,IAAI,iBAAiB,QAAQmQ,GAAS,GACjDzc,EAAI,UAAU,CAAC,GAAGA,EAAI,SAASyc,CAAO,GAC/BA;AACT;AAEA,SAAS4J,GACPrmB,GACAsmB,GACAha,GACA;AACA,QAAMtU,IAAOwsB,GAAkBxkB,EAAI,SAASsmB,EAAQ,SAASA,GAAS,oBAAI,IAAI,CAACA,EAAQ,EAAE,CAAC,CAAC;AAO3F,MANI,CAACtuB,KACUgI,EAAI,MAAM;AAAA,IACvB,CAAClT,MACEA,EAAE,iBAAiBw5B,EAAQ,MAAMx5B,EAAE,eAAekL,EAAK,MACvDlL,EAAE,iBAAiBkL,EAAK,MAAMlL,EAAE,eAAew5B,EAAQ;AAAA,EAAA,EAEhD;AACZ,QAAMl7B,IAAoB;AAAA,IACxB,IAAI4U,EAAI,QAAA;AAAA,IACR,OAAOA,EAAI;AAAA,IACX,cAAcsmB,EAAQ;AAAA,IACtB,YAAYtuB,EAAK;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,MAAM;AAAA,EAAA;AAER,EAAAsU,EAAI,KAAK,EAAE,IAAI,eAAe,MAAAlhB,GAAM,GACpC4U,EAAI,QAAQ,CAAC,GAAGA,EAAI,OAAO5U,CAAI;AACjC;AAEA,SAASm7B,GAAiBvmB,GAA2B2kB,GAAgC;AACnF,QAAMM,IAAgBjlB,EAAI,QAAQ,OAAO,CAAC9V,MAAMA,EAAE,gBAAgBy6B,CAAW,GACvEra,IAAM,IAAI,IAAI2a,EAAc,IAAI,CAAC/6B,MAAMA,EAAE,EAAE,CAAC,GAC5CoiB,IAAiB,CAAA;AACvB,aAAWlhB,KAAQ86B,GAAsBlmB,EAAI,OAAOsK,CAAG;AACrD,IAAAgC,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQlhB,EAAK,IAAI;AAEjD,EAAA4U,EAAI,QAAQA,EAAI,MAAM;AAAA,IACpB,CAAClT,MACC,EAAEA,EAAE,SAAS,eAAewd,EAAI,IAAIxd,EAAE,YAAY,KAAKwd,EAAI,IAAIxd,EAAE,UAAU;AAAA,EAAA;AAE/E,aAAW0e,KAAUyZ;AACnB,IAAA3Y,EAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,QAAQ,EAAE,GAAGd,GAAQ,aAAa,KAAA;AAAA,IAAK,CACxC;AAEH,SAAAxL,EAAI,UAAUA,EAAI,QAAQ;AAAA,IAAI,CAAC9V,MAC7BA,EAAE,gBAAgBy6B,IAAc,EAAE,GAAGz6B,GAAG,aAAa,SAASA;AAAA,EAAA,GAEhE8V,EAAI,aAAaA,EAAI,WAAW,OAAO,CAACpT,MAAMA,EAAE,OAAO+3B,CAAW,GAClErY,EAAI,KAAK,EAAE,IAAI,oBAAoB,aAAAqY,GAAa,GACzCrY;AACT;AAEA,SAASka,GAAmBxmB,GAA2B2kB,GAAgC;AACrF,SAAO4B,GAAiBvmB,GAAK2kB,CAAW;AAC1C;AAEO,SAAS8B,GACdzmB,GACA2kB,GACW;AACX,SAAO6B,GAAmBxmB,GAAK2kB,CAAW;AAC5C;AAEO,SAAS+B,GACd1mB,GACA2mB,GACAC,GACAxoB,GACW;;AACX,QAAMyoB,IAAY7mB,EAAI,OAAO,KAAK,CAAC8mB,MAAMA,EAAE,OAAOH,EAAU,OAAO,GAC7DI,IAAU/mB,EAAI,OAAO,KAAK,CAAC8mB,MAAMA,EAAE,OAAOF,EAAQ,OAAO,GACzDxD,IAAYc;AAAA,KAChB2C,KAAA,gBAAAA,EAAW,eAAc;AAAA,KACzBE,KAAA,gBAAAA,EAAS,eAAc;AAAA,MAErBviC,IAAAy+B,GAAuB0D,EAAU,WAAW,MAA5C,gBAAAniC,EAA+C,gBAC/C4P,IAAA6uB,GAAuB2D,EAAQ,WAAW,MAA1C,gBAAAxyB,EAA6C;AAAA,EAAA,GAE3C4yB,IACa1C,GAAqB,aAAa,CAACqC,GAAWC,CAAO,CAAC,GAEnEK,IAAexD,GAAoBkD,EAAU,IAAI3mB,EAAI,OAAO,GAC5DknB,IAAazD,GAAoBmD,EAAQ,IAAI5mB,EAAI,OAAO,GACxDsM,IAAiB,CAAA,GACjBhQ,IAAgC;AAAA,IACpC,GAAG0D;AAAA,IACH,SAASA,EAAI,QAAQ,MAAA;AAAA,IACrB,OAAOA,EAAI,MAAM,MAAA;AAAA,IACjB,YAAYA,EAAI,WAAW,MAAA;AAAA,EAAM;AAGnC,aAAWhD,KAAM,IAAI,IAAI,CAACiqB,GAAcC,CAAU,EAAE,OAAO,CAACC,MAAmBA,KAAK,IAAI,CAAC;AACvF,IAAA7a,EAAI,KAAK,GAAGia,GAAiBjqB,GAASU,CAAE,CAAC;AAG3C,QAAM2nB,IAAcroB,EAAQ,QAAA,GACtBuoB,IAAyB;AAAA,IAC7B,IAAIF;AAAA,IACJ,OAAOroB,EAAQ;AAAA,IACf,MAAM;AAAA,IACN,MAAA0qB;AAAA,IACA,WAAA5D;AAAA,IACA,YAAY;AAAA,EAAA;AAEd,EAAA9W,EAAI,KAAK,EAAE,IAAI,oBAAoB,WAAAuY,GAAW,GAC9CvoB,EAAQ,aAAa,CAAC,GAAGA,EAAQ,YAAYuoB,CAAS;AAEtD,QAAMO,IAAagB,GAAc9pB,GAASqqB,GAAWhC,GAAarY,CAAG,GAC/D+Y,IAAWe,GAAc9pB,GAASsqB,GAASjC,GAAarY,CAAG;AACjE,SAAA+Z,GAAkB/pB,GAAS8oB,GAAY9Y,CAAG,GAC1C+Z,GAAkB/pB,GAAS+oB,GAAU/Y,CAAG,GAExCA,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAIhQ,EAAQ,QAAA;AAAA,MACZ,OAAOA,EAAQ;AAAA,MACf,cAAc8oB,EAAW;AAAA,MACzB,YAAYC,EAAS;AAAA,MACrB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,MAAM;AAAA,IAAA;AAAA,EACR,CACD,GACM/Y;AACT;AAEO,SAAS8a,GACdpnB,GACAqnB,GACAjpB,GACW;AAEX,QAAMunB,IAAU,CAAC,GADF,IAAI,IAAI0B,EAAa,IAAI,CAAC38B,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC,EAC9B,QAAQ;AACnC,MAAIi7B,EAAQ,SAAS,EAAG,QAAO,CAAA;AAE/B,QAAMrZ,IAAiB,CAAA,GACjBhQ,IAAgC;AAAA,IACpC,GAAG0D;AAAA,IACH,SAASA,EAAI,QAAQ,MAAA;AAAA,IACrB,OAAOA,EAAI,MAAM,MAAA;AAAA,IACjB,YAAYA,EAAI,WAAW,MAAA;AAAA,EAAM,GAE7BsnB,IAAc,IAAI;AAAA,IACtB3B,EACG,IAAI,CAACj7B,MAAM+4B,GAAoB/4B,EAAE,IAAI4R,EAAQ,OAAO,CAAC,EACrD,OAAO,CAACU,MAAqBA,KAAM,IAAI;AAAA,EAAA,GAEtCuqB,KACJnpB,KAAA,gBAAAA,EAAS,iBACRkpB,EAAY,SAAS,IAAI,CAAC,GAAGA,CAAW,EAAE,CAAC,IAAI;AAElD,aAAWtqB,KAAMsqB,GAAa;AAC5B,QAAItqB,MAAOuqB,GAAQ;AACjB,YAAMtC,IAAgB3oB,EAAQ,QAAQ,OAAO,CAACpS,MAAMA,EAAE,gBAAgB8S,CAAE,GAClEsN,IAAM,IAAI,IAAI2a,EAAc,IAAI,CAAC/6B,MAAMA,EAAE,EAAE,CAAC;AAClD,iBAAWkB,KAAQ86B,GAAsB5pB,EAAQ,OAAOgO,CAAG;AACzD,QAAAgC,EAAI,KAAK,EAAE,IAAI,eAAe,QAAQlhB,EAAK,IAAI,GAC/CkR,EAAQ,QAAQA,EAAQ,MAAM,OAAO,CAACxP,MAAMA,EAAE,OAAO1B,EAAK,EAAE;AAE9D;AAAA,IACF;AACA,IAAAkhB,EAAI,KAAK,GAAGia,GAAiBjqB,GAASU,CAAE,CAAC;AAAA,EAC3C;AAEA,QAAM2nB,IAAc4C,KAAUjrB,EAAQ,QAAA,GAChCuoB,IAAyB;AAAA,IAC7B,IAAIF;AAAA,IACJ,OAAOroB,EAAQ;AAAA,IACf,MAAM;AAAA,IACN,OAAM8B,KAAA,gBAAAA,EAAS,SAAQkmB,GAAqB,YAAYqB,CAAO;AAAA,IAC/D,WAAW;AAAA,IACX,aAAYvnB,KAAA,gBAAAA,EAAS,eAAc;AAAA,EAAA;AAErC,EAAAkO,EAAI,KAAK,EAAE,IAAI,oBAAoB,WAAAuY,GAAW;AAE9C,QAAME,IAAWY,EAAQ,IAAI,CAAC5pB,MAAUqqB,GAAc9pB,GAASP,GAAO4oB,GAAarY,CAAG,CAAC;AACvF,aAAWga,KAAWvB,EAAU,CAAAsB,GAAkB/pB,GAASgqB,GAASha,CAAG;AAEvE,WAAS5b,IAAI,GAAGA,IAAIq0B,EAAS,QAAQr0B;AACnC,aAASsL,IAAItL,IAAI,GAAGsL,IAAI+oB,EAAS,QAAQ/oB;AACvC,MAAAsQ,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ,IAAIhQ,EAAQ,QAAA;AAAA,UACZ,OAAOA,EAAQ;AAAA,UACf,cAAcyoB,EAASr0B,CAAC,EAAE;AAAA,UAC1B,YAAYq0B,EAAS/oB,CAAC,EAAE;AAAA,UACxB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY6oB,EAAU;AAAA,UACtB,MAAM;AAAA,QAAA;AAAA,MACR,CACD;AAGL,SAAOvY;AACT;ACjkBA,SAASkb,GAAav1B,GAAuC;AAC3D,QAAMjK,MAAUiK,KAAA,gBAAAA,EAAU,aAAY,CAAA,GAAI,KAAA;AAC1C,SAAOw1B,GAAOz/B,CAAM;AACtB;AAGO,SAAS0/B,GACdpsB,GAMAooB,GACA1W,GACAjnB,GACS;AACT,SAAOuV,EAAO;AAAA,IACZ,CAACS,MACCA,EAAM,OAAO2nB,KACb3nB,EAAM,YAAYiR,KAClBjR,EAAM,QAAQhW,KACd,CAACgW,EAAM;AAAA,EAAA;AAEb;AAEA,SAAS4rB,GACPC,GACAn/B,GACK;AACL,QAAMuL,IAAM4zB,EAAK,UAAU,CAAC5gB,MAAQA,EAAI,OAAOve,EAAK,EAAE;AACtD,MAAIuL,IAAM,EAAG,QAAO,CAAC,GAAG4zB,GAAMn/B,CAAI;AAClC,QAAMo/B,IAAOD,EAAK,MAAA;AAClB,SAAAC,EAAK7zB,CAAG,IAAIvL,GACLo/B;AACT;AAEO,SAASC,GACdle,GACA1kB,GACkB;;AAClB,UAAQA,EAAG,IAAA;AAAA,IACT,KAAK,gBAAgB;AACnB,YAAM+O,IAAW/O,EAAG,OACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,OAAO,KAAK,CAAClf,MAAMA,EAAE,OAAOsS,CAAE,GAC/C/K,IAAWgC,EAAS,aAAYkY,KAAA,gBAAAA,EAAU,aAAY;AAAA,QAC1D,OAAO,CAAA;AAAA,QACP,UAAU,CAAA;AAAA,MAAC,GAEPpQ,IAAiB;AAAA,QACrB,IAAAiB;AAAA,QACA,SAAS/I,EAAS,YAAWkY,KAAA,gBAAAA,EAAU,YAAW;AAAA,QAClD,KAAKlY,EAAS,QAAOkY,KAAA,gBAAAA,EAAU,QAAO,SAASnP,CAAE;AAAA,QACjD,MAAM/I,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,UAAAla;AAAA,QACA,MACEgC,EAAS,SACRA,EAAS,YAAY,OAClBuzB,GAAav1B,CAAQ,IACrBka,KAAA,gBAAAA,EAAU,SACdqb,GAAav1B,CAAQ;AAAA,QACvB,QAAQgC,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,QAC/C,OAAOlY,EAAS,UAASkY,KAAA,gBAAAA,EAAU,UAAS,CAAA;AAAA,QAC5C,aAAalY,EAAS,gBAAekY,KAAA,gBAAAA,EAAU,gBAAe;AAAA,QAC9D,QAAQlY,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,QAC/C,OAAO4b,GAAwB5b,KAAA,gBAAAA,EAAU,OAAOlY,EAAS,OAAO;AAAA,UAC9D,MAAMA,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,UACzC,QAAQlY,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,UAC/C,aACElY,EAAS,gBAAekY,KAAA,gBAAAA,EAAU,gBAAe;AAAA,QAAA,CACpD;AAAA,QACD,gBACElY,EAAS,mBACRA,EAAS,YAAY,OAAO,KAAOkY,KAAA,gBAAAA,EAAU,mBAC9C;AAAA,QACF,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,MAAA;AAE7D,aAAO,EAAE,GAAGvC,GAAO,QAAQ+d,GAAW/d,EAAM,QAAQ7N,CAAK,EAAA;AAAA,IAC3D;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAG6N;AAAA,QACH,QAAQA,EAAM,OAAO,OAAO,CAAClf,MAAMA,EAAE,OAAOxF,EAAG,OAAO;AAAA,QACtD,aAAa0kB,EAAM,YAAY,OAAO,CAAC1f,MAAMA,EAAE,YAAYhF,EAAG,OAAO;AAAA,MAAA;AAAA,IAEzE,KAAK,qBAAqB;AACxB,YAAMmT,MACJ7T,IAAAolB,EAAM,OAAO,KAAK,CAAClf,MAAMA,EAAE,OAAOxF,EAAG,WAAW,OAAO,MAAvD,gBAAAV,EAA0D,SAAQ,QAC9D+f,IAAayjB,GAAqB9iC,EAAG,YAAYmT,CAAI,GACrD4vB,IAAOre,EAAM,YAAY,OAAO,CAAC1f,MAAMA,EAAE,YAAYqa,EAAW,OAAO;AAC7E,aAAO,EAAE,GAAGqF,GAAO,aAAa,CAAC,GAAGqe,GAAM1jB,CAAU,EAAA;AAAA,IACtD;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAGqF;AAAA,QACH,aAAaA,EAAM,YAAY,OAAO,CAAC1f,MAAMA,EAAE,YAAYhF,EAAG,OAAO;AAAA,MAAA;AAAA,IAEzE,KAAK,iBAAiB;AACpB,YAAM+O,IAAW/O,EAAG,QACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,QAAQ,KAAK,CAAC1f,MAAMA,EAAE,OAAO8S,CAAE,GAChDwO,IAAmB;AAAA,QACvB,IAAAxO;AAAA,QACA,SAAS/I,EAAS,YAAWkY,KAAA,gBAAAA,EAAU,YAAW;AAAA,QAClD,SAASlY,EAAS,YAAWkY,KAAA,gBAAAA,EAAU,YAAW;AAAA,QAClD,MAAMlY,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,GAAGlY,EAAS,MAAKkY,KAAA,gBAAAA,EAAU,MAAK;AAAA,QAChC,GAAGlY,EAAS,MAAKkY,KAAA,gBAAAA,EAAU,MAAK;AAAA,QAChC,aACElY,EAAS,gBAAgB,SACrBA,EAAS,eACTkY,KAAA,gBAAAA,EAAU,gBAAe;AAAA,MAAA;AAEjC,aAAO,EAAE,GAAGvC,GAAO,SAAS+d,GAAW/d,EAAM,SAAS4B,CAAM,EAAA;AAAA,IAC9D;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAG5B;AAAA,QACH,SAASA,EAAM,QAAQ,OAAO,CAAC1f,MAAMA,EAAE,OAAOhF,EAAG,QAAQ;AAAA,QACzD,OAAO0kB,EAAM,MAAM;AAAA,UACjB,CAAC9c,MAAMA,EAAE,iBAAiB5H,EAAG,YAAY4H,EAAE,eAAe5H,EAAG;AAAA,QAAA;AAAA,MAC/D;AAAA,IAEJ,KAAK,eAAe;AAClB,YAAM+O,IAAW/O,EAAG,MACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,MAAM,KAAK,CAAC9c,MAAMA,EAAE,OAAOkQ,CAAE,GAC9C4N,IACJ3W,EAAS,UAAU,SACfkX,GAAa,EAAE,OAAOlX,EAAS,MAAA,CAAO,IACtCkX,GAAagB,CAAQ,GACrB/gB,IAAoB;AAAA,QACxB,IAAA4R;AAAA,QACA,OAAO/I,EAAS,UAASkY,KAAA,gBAAAA,EAAU,UAASvC,EAAM;AAAA,QAClD,cAAc3V,EAAS,iBAAgBkY,KAAA,gBAAAA,EAAU,iBAAgB;AAAA,QACjE,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,QAC3D,QAAQlY,EAAS,WAAUkY,KAAA,gBAAAA,EAAU,WAAU;AAAA,QAC/C,UAAUlY,EAAS,aAAYkY,KAAA,gBAAAA,EAAU,aAAY;AAAA,QACrD,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,QAC3D,MAAMlY,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,GAAIvB,IAAQ,EAAE,OAAAA,MAAU,CAAA;AAAA,MAAC;AAE3B,aAAO,EAAE,GAAGhB,GAAO,OAAO+d,GAAW/d,EAAM,OAAOxe,CAAI,EAAA;AAAA,IACxD;AAAA,IACA,KAAK;AACH,aAAO,EAAE,GAAGwe,GAAO,OAAOA,EAAM,MAAM,OAAO,CAAC9c,MAAMA,EAAE,OAAO5H,EAAG,MAAM,EAAA;AAAA,IACxE,KAAK,gBAAgB;AACnB,YAAMolB,KAAOplB,EAAG,aAAa,CAAA,GAAI,OAAO,CAAC8X,MAAO,OAAO,SAASA,CAAE,CAAC;AACnE,UAAIsN,EAAI,SAAS,EAAG,QAAOV;AAC3B,YAAMzO,IAAOmP,EAAI,CAAC,GACZuS,IAAU,IAAI,IAAIvS,EAAI,MAAM,CAAC,CAAC,GAC9B1e,IAAQge,EAAM,MACjB,IAAI,CAAC9c,OAAO;AAAA,QACX,GAAGA;AAAA,QACH,cAAc+vB,EAAQ,IAAI/vB,EAAE,YAAY,IAAIqO,IAAOrO,EAAE;AAAA,QACrD,YAAY+vB,EAAQ,IAAI/vB,EAAE,UAAU,IAAIqO,IAAOrO,EAAE;AAAA,MAAA,EACjD,EACD,OAAO,CAACA,MAAMA,EAAE,iBAAiBA,EAAE,UAAU;AAChD,aAAO;AAAA,QACL,GAAG8c;AAAA,QACH,SAASA,EAAM,QAAQ,OAAO,CAAC1f,MAAM,CAAC2yB,EAAQ,IAAI3yB,EAAE,EAAE,CAAC;AAAA,QACvD,OAAA0B;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,KAAK;AACH,aAAO,EAAE,GAAGge,GAAO,OAAO,EAAE,GAAGA,EAAM,OAAO,GAAG1kB,EAAG,QAAM;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,GAAG0kB,GAAO,cAAc1kB,EAAG,aAAA;AAAA,IACtC,KAAK,oBAAoB;AACvB,YAAM+O,IAAW/O,EAAG,WACd8X,IAAK/I,EAAS;AACpB,UAAI+I,KAAM,KAAM,QAAO4M;AACvB,YAAMuC,IAAWvC,EAAM,WAAW,KAAK,CAAChd,MAAMA,EAAE,OAAOoQ,CAAE,GACnD6nB,IAAyB;AAAA,QAC7B,IAAA7nB;AAAA,QACA,OAAO/I,EAAS,UAASkY,KAAA,gBAAAA,EAAU,UAASvC,EAAM;AAAA,QAClD,MAAM3V,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,MAAMlY,EAAS,SAAQkY,KAAA,gBAAAA,EAAU,SAAQ;AAAA,QACzC,WAAWlY,EAAS,cAAakY,KAAA,gBAAAA,EAAU,cAAa;AAAA,QACxD,YAAYlY,EAAS,eAAckY,KAAA,gBAAAA,EAAU,eAAc;AAAA,MAAA;AAE7D,aAAO,EAAE,GAAGvC,GAAO,YAAY+d,GAAW/d,EAAM,YAAYib,CAAS,EAAA;AAAA,IACvE;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAGjb;AAAA,QACH,YAAYA,EAAM,WAAW,OAAO,CAAChd,MAAMA,EAAE,OAAO1H,EAAG,WAAW;AAAA,QAClE,SAAS0kB,EAAM,QAAQ;AAAA,UAAI,CAAC1f,MAC1BA,EAAE,gBAAgBhF,EAAG,cAAc,EAAE,GAAGgF,GAAG,aAAa,SAASA;AAAA,QAAA;AAAA,MACnE;AAAA,IAEJ,KAAK;AACH,aAAOg+B,GAAmBte,GAAO1kB,EAAG,OAAO;AAAA,IAC7C;AACE,aAAO0kB;AAAA,EAAA;AAEb;AAGO,SAASse,GACdte,GACAoD,GACkB;AAClB,QAAMmb,IAAkB,IAAI;AAAA,IAC1Bve,EAAM,OAAO,OAAO,CAAC7N,MAAUA,EAAM,YAAYiR,CAAO,EAAE,IAAI,CAACjR,MAAUA,EAAM,EAAE;AAAA,EAAA,GAE7EwR,IAAmB,IAAI;AAAA,IAC3B3D,EAAM,QAAQ,OAAO,CAAC4B,MAAWA,EAAO,YAAYwB,CAAO,EAAE,IAAI,CAACxB,MAAWA,EAAO,EAAE;AAAA,EAAA,GAElF7f,IAAUie,EAAM,QAAQ,OAAO,CAAC4B,MAAWA,EAAO,YAAYwB,CAAO,GACrEob,IAAmB,IAAI;AAAA,IAC3Bz8B,EACG,IAAI,CAAC6f,MAAWA,EAAO,WAAW,EAClC,OAAO,CAACxO,MAAqBA,KAAM,IAAI;AAAA,EAAA;AAE5C,SAAO;AAAA,IACL,GAAG4M;AAAA,IACH,QAAQA,EAAM,OAAO,OAAO,CAACtlB,MAAUA,EAAM,OAAO0oB,CAAO;AAAA,IAC3D,QAAQpD,EAAM,OAAO,OAAO,CAAC7N,MAAUA,EAAM,YAAYiR,CAAO;AAAA,IAChE,aAAapD,EAAM,YAAY,OAAO,CAAC5C,MAAQ,CAACmhB,EAAgB,IAAInhB,EAAI,OAAO,CAAC;AAAA,IAChF,SAAArb;AAAA,IACA,OAAOie,EAAM,MAAM;AAAA,MACjB,CAACxe,MACC,CAACmiB,EAAiB,IAAIniB,EAAK,YAAY,KACvC,CAACmiB,EAAiB,IAAIniB,EAAK,UAAU;AAAA,IAAA;AAAA,IAEzC,YAAYwe,EAAM,WAAW,OAAO,CAACib,MAAcuD,EAAiB,IAAIvD,EAAU,EAAE,CAAC;AAAA,IACrF,sBAAsBjb,EAAM,uBAAuB,CAAA,GAAI;AAAA,MACrD,CAAC5C,MAAQA,EAAI,YAAYgG;AAAA,IAAA;AAAA,EAC3B;AAEJ;AAEO,SAASqb,GACdze,GACA0C,GACkB;AAClB,QAAMgc,IAAS;AAAA,IACb,GAAGC,GAAkB3e,CAAK;AAAA,IAC1B,YAAYA,EAAM,cAAc,CAAA;AAAA,IAChC,qBAAqBA,EAAM,uBAAuB,CAAA;AAAA,EAAC;AAErD,SAAO0C,EAAI,OAAOwb,IAAcQ,CAAM;AACxC;AAMA,SAASC,GAAkB3e,GAA2C;AACpE,MAAI9V,IAAU;AACd,QAAMwH,IAASsO,EAAM,OAAO,IAAI,CAAC7N,MAAU;AACzC,UAAM9J,IAAWu2B,GAAuBzsB,EAAM,QAAQ,GAChDiK,IAAQyiB,GAA0B1sB,CAAK,KAAKA,EAAM,OAClD2sB,IAAkBz2B,MAAa8J,EAAM,UACrC4sB,IAAe3iB,MAAUjK,EAAM;AACrC,WAAI,CAAC2sB,KAAmB,CAACC,IAAqB5sB,KAC9CjI,IAAU,IACH;AAAA,MACL,GAAGiI;AAAA,MACH,UAAA9J;AAAA,MACA,MAAMy2B,IAAkB9nB,GAAa3O,CAAQ,IAAI8J,EAAM;AAAA,MACvD,OAAAiK;AAAA,IAAA;AAAA,EAEJ,CAAC;AACD,SAAOlS,IAAU,EAAE,GAAG8V,GAAO,QAAAtO,MAAWsO;AAC1C;AAGO,SAASgf,GAAgBtc,GAAgBpnB,GAAwB;AACtE,MAAIA,EAAG,OAAO,gBAAgB;AAC5B,UAAMuN,IAAO6Z,EAAI,OAAO,CAAClS,MAASA,EAAK,OAAO,cAAc,GACtD6tB,IAAO3b,EAAI,OAAO,CAAClS,MAASA,EAAK,OAAO,cAAc,GACtDkK,IAAQ7R,EAAK;AAAA,MACjB,CAACo2B,GAAKzuB,MAAUA,EAAK,OAAO,iBAAiB,EAAE,GAAGyuB,GAAK,GAAGzuB,EAAK,MAAA,IAAUyuB;AAAA,MACzE,CAAA;AAAA,IAAC;AAEH,WAAO,CAAC,GAAGZ,GAAM,EAAE,IAAI,gBAAgB,OAAO,EAAE,GAAG3jB,GAAO,GAAGpf,EAAG,MAAA,GAAS;AAAA,EAC3E;AAEA,MAAIA,EAAG,OAAO;AAEZ,WAAO,CAAC,GADKonB,EAAI,OAAO,CAAClS,MAASA,EAAK,OAAO,qBAAqB,GAClDlV,CAAE;AAGrB,MAAIA,EAAG,OAAO,kBAAkBA,EAAG,MAAM,MAAM,MAAM;AACnD,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,kBAAkBA,EAAK,MAAM,OAAOlV,EAAG,MAAM;AAAA,IAAA;AAErE,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,gBAAgB;AAC9C,YAAMvL,IAAO6jB,EAAI,MAAA,GACX3Q,IAAS,EAAE,GAAG2Q,EAAItY,CAAG,EAAE,OAAO,GAAG9O,EAAG,MAAA;AAC1C,aAAAuD,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,GAAG2H;AAAA,UACH,OAAOosB;AAAA,YACLzb,EAAItY,CAAG,EAAE,MAAM;AAAA,YACf9O,EAAG,MAAM;AAAA,YACT;AAAA,cACE,MAAMyW,EAAO,QAAQ;AAAA,cACrB,QAAQA,EAAO;AAAA,cACf,aAAaA,EAAO;AAAA,YAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF,GAEKlT;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,mBAAmBA,EAAG,OAAO,MAAM,MAAM;AACrD,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,mBAAmBA,EAAK,OAAO,OAAOlV,EAAG,OAAO;AAAA,IAAA;AAExE,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,iBAAiB;AAC/C,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,QAAQ,EAAE,GAAGsY,EAAItY,CAAG,EAAE,QAAQ,GAAG9O,EAAG,OAAA;AAAA,MAAO,GAEtCuD;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,sBAAsBA,EAAG,UAAU,MAAM,MAAM;AAC3D,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,sBAAsBA,EAAK,UAAU,OAAOlV,EAAG,UAAU;AAAA,IAAA;AAEjF,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,oBAAoB;AAClD,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,WAAW,EAAE,GAAGsY,EAAItY,CAAG,EAAE,WAAW,GAAG9O,EAAG,UAAA;AAAA,MAAU,GAE/CuD;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,iBAAiBA,EAAG,KAAK,MAAM,MAAM;AACjD,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MAASA,EAAK,OAAO,iBAAiBA,EAAK,KAAK,OAAOlV,EAAG,KAAK;AAAA,IAAA;AAElE,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,eAAe;AAC7C,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI;AAAA,QACV,IAAI;AAAA,QACJ,MAAM,EAAE,GAAGsY,EAAItY,CAAG,EAAE,MAAM,GAAG9O,EAAG,KAAA;AAAA,MAAK,GAEhCuD;AAAA,IACT;AAAA,EACF;AAEA,MAAIvD,EAAG,OAAO,qBAAqB;AACjC,UAAM8O,IAAMsY,EAAI;AAAA,MACd,CAAClS,MACCA,EAAK,OAAO,uBACZA,EAAK,WAAW,YAAYlV,EAAG,WAAW;AAAA,IAAA;AAE9C,QAAI8O,KAAO,KAAKsY,EAAItY,CAAG,EAAE,OAAO,qBAAqB;AACnD,YAAMvL,IAAO6jB,EAAI,MAAA;AACjB,aAAA7jB,EAAKuL,CAAG,IAAI,EAAE,IAAI,qBAAqB,YAAY9O,EAAG,WAAA,GAC/CuD;AAAA,IACT;AAAA,EACF;AAEA,SAAO,CAAC,GAAG6jB,GAAKpnB,CAAE;AACpB;AAYA,MAAM4jC,KAAoD;AAAA,EACxD,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,cAAc;AAChB;AAEA,SAASC,GACP39B,GACQ;AACR,SAAO,GAAGA,EAAK,YAAY,IAAIA,EAAK,UAAU;AAChD;AAQA,SAAS49B,GAA0B1c,GAA2B;AAC5D,QAAM2c,wBAAqB,IAAA,GACrBC,wBAAuB,IAAA,GACvBC,wBAAsB,IAAA,GACtBC,wBAAwB,IAAA;AAE9B,aAAWlkC,KAAMonB;AACf,IAAIpnB,EAAG,OAAO,iBAAe+jC,EAAe,IAAI/jC,EAAG,MAAM,GACrDA,EAAG,OAAO,mBAAiBgkC,EAAiB,IAAIhkC,EAAG,QAAQ,GAC3DA,EAAG,OAAO,iBAAiBA,EAAG,KAAK,MAAM,QAAMikC,EAAgB,IAAIjkC,EAAG,KAAK,EAAE,GAC7EA,EAAG,OAAO,mBAAmBA,EAAG,OAAO,MAAM,QAC/CkkC,EAAkB,IAAIlkC,EAAG,OAAO,EAAE;AAItC,QAAMmkC,IAAqB,IAAI;AAAA,IAC7B,CAAC,GAAGD,CAAiB,EAAE,OAAO,CAACpsB,MAAOA,IAAK,KAAKksB,EAAiB,IAAIlsB,CAAE,CAAC;AAAA,EAAA,GAGpEL,IAAkB,CAAA;AACxB,aAAWzX,KAAMonB;AACf,IACEpnB,EAAG,OAAO,mBACVA,EAAG,OAAO,MAAM,QAChBgkC,EAAiB,IAAIhkC,EAAG,OAAO,EAAE,KAKjCA,EAAG,OAAO,mBACVA,EAAG,WAAW,KACdkkC,EAAkB,IAAIlkC,EAAG,QAAQ,KAI/BA,EAAG,OAAO,iBAAiBA,EAAG,KAAK,MAAM,QAAQ+jC,EAAe,IAAI/jC,EAAG,KAAK,EAAE,KAG9EA,EAAG,OAAO,iBAAiBA,EAAG,SAAS,KAAKikC,EAAgB,IAAIjkC,EAAG,MAAM,KAI3EA,EAAG,OAAO,kBACTmkC,EAAmB,IAAInkC,EAAG,KAAK,YAAY,KAC1CmkC,EAAmB,IAAInkC,EAAG,KAAK,UAAU,MAI7CyX,EAAK,KAAKzX,CAAE;AAGd,QAAMokC,wBAAsB,IAAA;AAC5B,EAAA3sB,EAAK,QAAQ,CAACzX,GAAI+iB,MAAU;AAC1B,IAAI/iB,EAAG,OAAO,iBACdokC,EAAgB,IAAIP,GAAY7jC,EAAG,IAAI,GAAG+iB,CAAK;AAAA,EACjD,CAAC;AAED,QAAMshB,wBAAkB,IAAA;AACxB,EAAA5sB,EAAK,QAAQ,CAACzX,MAAO;AACnB,IAAIA,EAAG,OAAO,iBACT,OAAO,UAAU,eAAe,KAAKA,EAAG,MAAM,OAAO,KAC1DqkC,EAAY,IAAIR,GAAY7jC,EAAG,IAAI,GAAGA,EAAG,KAAK,SAAS,IAAI;AAAA,EAC7D,CAAC;AAED,QAAMkW,wBAAW,IAAA,GACXmB,IAA0B,CAAA;AAChC,SAAAI,EAAK,QAAQ,CAACzX,GAAI+iB,MAAU;AAC1B,QAAI/iB,EAAG,OAAO,cAAe;AAC7B,UAAMskC,IAASF,EAAgB,IAAIP,GAAY7jC,EAAG,IAAI,CAAC;AACvD,QAAIskC,KAAU,QAAQA,MAAWvhB,EAAO;AACxC,IAAA7M,EAAK,IAAI6M,CAAK;AACd,UAAMwhB,IAAW9sB,EAAK6sB,CAAM;AAC5B,IACEtkC,EAAG,KAAK,MAAM,QACdA,EAAG,KAAK,KAAK,KACbukC,EAAS,OAAO,iBAChBA,EAAS,KAAK,OAAOvkC,EAAG,KAAK,MAC7B,CAAC+jC,EAAe,IAAI/jC,EAAG,KAAK,EAAE,KAE9BqX,EAAa,KAAK,EAAE,IAAI,eAAe,QAAQrX,EAAG,KAAK,IAAI;AAAA,EAE/D,CAAC,GAcM,CAAC,GAZOyX,EACZ,OAAO,CAAC9H,GAAGoT,MAAU,CAAC7M,EAAK,IAAI6M,CAAK,CAAC,EACrC,IAAI,CAAC/iB,MAAO;AAEX,QADIA,EAAG,OAAO,iBACV,CAACqkC,EAAY,IAAIR,GAAY7jC,EAAG,IAAI,CAAC,EAAG,QAAOA;AACnD,UAAM0lB,IAAQ2e,EAAY,IAAIR,GAAY7jC,EAAG,IAAI,CAAC;AAClD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM0lB,IAAQ,EAAE,GAAG1lB,EAAG,MAAM,OAAA0lB,EAAA,IAAU,EAAE,GAAG1lB,EAAG,MAAM,OAAO,KAAA;AAAA,IAAK;AAAA,EAEpE,CAAC,GAEgB,GAAGqX,CAAY;AACpC;AAEA,SAASmtB,GAAapd,GAA2B;AAC/C,SAAOA,EACJ,IAAI,CAACpnB,GAAI+iB,OAAW,EAAE,IAAA/iB,GAAI,OAAA+iB,EAAA,EAAQ,EAClC,KAAK,CAAC/d,GAAGC,MAAM;AACd,UAAMw/B,IAAOb,GAAmB5+B,EAAE,GAAG,EAAE,IAAI4+B,GAAmB3+B,EAAE,GAAG,EAAE;AACrE,WAAOw/B,MAAS,IAAIA,IAAOz/B,EAAE,QAAQC,EAAE;AAAA,EACzC,CAAC,EACA,IAAI,CAAC,EAAE,IAAAjF,EAAA,MAASA,CAAE;AACvB;AAEO,SAAS0kC,GAAwBtd,GAA2B;AACjE,SAAOod,GAAaV,GAA0B1c,CAAG,CAAC;AACpD;ACtjBA,SAASud,KAAiB;AACxB,SACE,gBAAA7iC,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACtE,UAAA;AAAA,IAAA,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEO,SAASojC,GAAiB;AAAA,EAC/B,OAAA9jB;AAAA,EACA,SAAA+jB;AAAA,EACA,UAAAlgC;AACF,GAIG;AACD,SACE,gBAAAnD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,cAAY,SAASsf,CAAK;AAAA,MAC1B,OAAM;AAAA,MACN,UAAAnc;AAAA,MACA,SAAAkgC;AAAA,MAEA,4BAACF,IAAA,CAAA,CAAe;AAAA,IAAA;AAAA,EAAA;AAGtB;ACtCO,SAASG,GAAkBhH,GAA8B;AAC9D,QAAMiH,IAAQjH,EAAM,KAAA,EAAO,MAAM,gCAAgC;AACjE,MAAI,CAACiH,EAAO,QAAO;AACnB,MAAIC,IAAMD,EAAM,CAAC,EAAE,YAAA;AACnB,SAAIC,EAAI,WAAW,MACjBA,IAAMA,EACH,MAAM,EAAE,EACR,IAAI,CAACC,MAAOA,IAAKA,CAAE,EACnB,KAAK,EAAE,IAEL,IAAID,CAAG;AAChB;AAEO,SAASE,GAAmBpH,GAAuB;AACxD,SAAOgH,GAAkBhH,CAAK,KAAK;AACrC;AAEO,SAASqH,GAAangC,GAAWC,GAAoB;AAC1D,MAAIya,GAAmB1a,CAAC,KAAK0a,GAAmBza,CAAC;AAC/C,WAAOya,GAAmB1a,CAAC,KAAK0a,GAAmBza,CAAC;AAEtD,QAAM+P,IAAO8vB,GAAkB9/B,CAAC,GAC1BiQ,IAAQ6vB,GAAkB7/B,CAAC;AACjC,SAAO+P,KAAQ,QAAQA,MAASC;AAClC;ACbO,SAASmwB,GAAW;AAAA,EACzB,OAAAtkB;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAn5B;AAAA,EACA,OAAAkT;AAAA,EACA,UAAAwtB;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AACF,GASG;AACD,QAAM,CAAC9gB,GAAO+gB,CAAQ,IAAIpiB,EAAS,MAAM,OAAOya,CAAK,CAAC,GAChD4H,IAAUxY,GAAO,EAAK,GACtByY,IAAYzY,GAAO,EAAK;AAE9B,EAAA1J,GAAU,MAAM;AACd,KAAI,CAACkiB,EAAQ,WAAWC,EAAU,aAChCF,EAAS,OAAO3H,CAAK,CAAC,GACtB6H,EAAU,UAAU;AAAA,EAExB,GAAG,CAAC7H,CAAK,CAAC;AAEV,QAAM8H,IAAc,CAAC5H,GAAa6H,MAA+B;AAC/D,UAAMxG,IAASwG,IACXC,GAAwB9H,CAAG,IAC3B,EAAE,SAASA,GAAK,QAAQ+H,GAAsB/H,CAAG,EAAE,OAAA;AACvD,IAAAyH,EAASpG,EAAO,OAAO,GACvBgG,EAAShG,EAAO,MAAM;AAAA,EACxB;AAEA,SACE,gBAAAv9B,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA2B,UAAAsf,GAAM;AAAA,IACjD,gBAAAhf,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,MAAA+V;AAAA,MACD,gBAAA/V,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAAmD;AAAA,YACA,cAAY,YAAYmc,CAAK;AAAA,YAC7B,SAAS,MAAMwkB,EAAO,EAAE;AAAA,YACxB,aAAa,MAAMC,EAAY,EAAE;AAAA,YACjC,WAAWC;AAAA,YACX,cAAcA;AAAA,YACf,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAhkC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAOkjB;AAAA,YACP,UAAA/f;AAAA,YACA,cAAYmc;AAAA,YACZ,SAAS,MAAM;AACb,cAAA4kB,EAAQ,UAAU;AAAA,YACpB;AAAA,YACA,UAAU,CAAC99B,MAAMg+B,EAAYh+B,EAAE,OAAO,OAAO,EAAK;AAAA,YAClD,QAAQ,MAAM;AACZ,cAAA89B,EAAQ,UAAU,IAClBE,EAAYlhB,GAAO,EAAI;AAAA,YACzB;AAAA,YACA,WAAW,CAAC9c,MAAM;AAChB,kBAAIA,EAAE,QAAQ,SAAS;AACrB,gBAAAA,EAAE,eAAA,GACDA,EAAE,OAA4B,KAAA;AAC/B;AAAA,cACF;AACA,cAAIA,EAAE,QAAQ,aAAaA,EAAE,QAAQ,gBACrCA,EAAE,eAAA,GACE,CAAAjD,MACJghC,EAAU,UAAU,IACpBL,EAAO19B,EAAE,QAAQ,YAAY,IAAI,EAAE;AAAA,YACrC;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAApG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAAmD;AAAA,YACA,cAAY,YAAYmc,CAAK;AAAA,YAC7B,SAAS,MAAMwkB,EAAO,CAAC;AAAA,YACvB,aAAa,MAAMC,EAAY,CAAC;AAAA,YAChC,WAAWC;AAAA,YACX,cAAcA;AAAA,YACf,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAEO,SAASQ,GAAY;AAAA,EAC1B,OAAAllB;AAAA,EACA,KAAAkkB;AAAA,EACA,QAAAiB;AAAA,EACA,UAAAC;AAAA,EACA,UAAAvhC;AAAA,EACA,oBAAAwhC,IAAqB;AAAA,EACrB,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AACF,GAUG;AACD,QAAMC,IAAYrZ,GAAOgY,GAAmBgB,KAAYD,CAAM,CAAC,GACzDO,IACJ9mB,GAAmBumB,CAAM,KACxBE,KAAsB,CAACnB,EAAI,KAAA;AAE9B,EAAAxhB,GAAU,MAAM;AACd,UAAMijB,IAAQ3B,GAAkBmB,CAAM;AACtC,IAAIQ,QAAiB,UAAUA;AAAA,EACjC,GAAG,CAACR,CAAM,CAAC;AAEX,QAAMS,IAAcxB,GAAmBsB,IAAcD,EAAU,UAAUN,CAAM;AAE/E,SACE,gBAAAnkC,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WACEglC,IACI,iDACA;AAAA,QAEN,OAAOA,IAAc,SAAY,EAAE,iBAAiBtB,GAAmBe,CAAM,EAAA;AAAA,QAE7E,UAAA,gBAAAzkC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAAmD;AAAA,YACA,cAAYmc;AAAA,YACZ,OAAO4lB;AAAA,YACP,UAAU,CAAC9+B,MAAM;AACf,cAAA2+B,EAAU,UAAU3+B,EAAE,OAAO,OAC7B0+B,EAAO1+B,EAAE,OAAO,KAAK;AAAA,YACvB;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,gBAAApG;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAAmD;AAAA,QACA,cAAY,GAAGmc,CAAK;AAAA,QACpB,aAAY;AAAA,QACZ,OAAO0lB,IAAc,KAAKxB;AAAA,QAC1B,UAAU,CAACp9B,MAAMw+B,EAAYx+B,EAAE,OAAO,KAAK;AAAA,QAC3C,QAAQy+B;AAAA,QACR,WAAW,CAACz+B,MAAM;AAChB,UAAIA,EAAE,QAAQ,YACZA,EAAE,eAAA,GACDA,EAAE,OAA4B,KAAA;AAAA,QAEnC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEO,SAAS++B,GAAS;AAAA,EACvB,OAAA7lB;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAoI;AAAA,EACA,UAAAvhC;AAAA,EACA,UAAA0gC;AAAA,EACA,SAAAuB;AACF,GAOG;AACD,QAAMJ,IAAc9mB,GAAmBoe,CAAK,GACtC+I,IAAUL,IAAcM,KAAoBhJ,EAAM,KAAA,IAASA,IAAQoI,GACnE,CAAClB,GAAK+B,CAAM,IAAI1jB,EAASmjB,IAAc,KAAKK,CAAO;AAEzD,EAAArjB,GAAU,MAAM;AACd,IAAAujB,EAAOP,IAAc,KAAKK,CAAO;AAAA,EACnC,GAAG,CAACA,GAASL,CAAW,CAAC;AAEzB,QAAMQ,IAAS,CAACzjC,MAAiB;AAC/B,QAAI,CAACA,EAAK,KAAA,KAAUmc,GAAmBnc,CAAI,GAAG;AAC5C,MAAAwjC,EAAO,EAAE,GACT1B,EAASyB,EAAiB;AAC1B;AAAA,IACF;AACA,UAAMG,IAAanC,GAAkBvhC,CAAI;AACzC,QAAI,CAAC0jC,GAAY;AACf,MAAAF,EAAOP,IAAc,KAAKK,CAAO;AACjC;AAAA,IACF;AACA,IAAAE,EAAOE,CAAU,GACjB5B,EAAS4B,CAAU;AAAA,EACrB;AAEA,SACE,gBAAAnlC,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,2BACb,UAAA;AAAA,MAAAgf;AAAA,MACA8lB,IACC,gBAAAplC,EAACojC,IAAA,EAAiB,OAAA9jB,GAAc,SAAS8lB,GAAS,UAAAjiC,GAAoB,IACpE;AAAA,IAAA,GACN;AAAA,IACA,gBAAAnD;AAAA,MAACwkC;AAAA,MAAA;AAAA,QACC,OAAAllB;AAAA,QACA,KAAAkkB;AAAA,QACA,QAAQ6B;AAAA,QACR,UAAAX;AAAA,QACA,UAAAvhC;AAAA,QACA,aAAaoiC;AAAA,QACb,UAAU,MAAMC,EAAOhC,CAAG;AAAA,QAC1B,QAAQgC;AAAA,MAAA;AAAA,IAAA;AAAA,EACV,GACF;AAEJ;AAEA,MAAME,KAA6C;AAAA,EACjD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,SAASC,KAAgB;AACvB,SACE,gBAAA3lC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAEJ;AAEA,SAAS4lC,KAAkB;AACzB,SACE,gBAAA5lC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAEJ;AAEA,SAAS6lC,KAAiB;AACxB,SACE,gBAAA7lC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAEJ;AAEA,MAAM8lC,KAAmD;AAAA,EACvD,wBAAOH,IAAA,EAAc;AAAA,EACrB,0BAASC,IAAA,EAAgB;AAAA,EACzB,yBAAQC,IAAA,CAAA,CAAe;AACzB;AAEO,SAASE,GAAS;AAAA,EACvB,OAAAzJ;AAAA,EACA,UAAAn5B;AAAA,EACA,UAAA0gC;AACF,GAIG;AACD,QAAM7iB,IAAQf,GAAoBqc,CAAK;AACvC,SACE,gBAAAh8B,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA0B,UAAA,aAAS;AAAA,IACnD,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BAA0B,MAAK,SAAQ,cAAW,aAC9D,UAAAgmC,GAAa,IAAI,CAACruB,MACjB,gBAAA3X;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW2X,MAAWqJ,IAAQ,cAAc;AAAA,QAC5C,UAAA7d;AAAA,QACA,cAAYuiC,GAAe/tB,CAAM;AAAA,QACjC,gBAAcA,MAAWqJ;AAAA,QACzB,gBAAc0kB,GAAe/tB,CAAM;AAAA,QACnC,SAAS,MAAMksB,EAASlsB,CAAM;AAAA,QAE7B,aAAYA,CAAM;AAAA,MAAA;AAAA,MATdA;AAAA,IAAA,CAWR,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEO,SAASsuB,KAAa;AAC3B,SACE,gBAAAjmC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,eAAY;AAAA,MAEZ,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AAGN;AAEO,SAASkmC,GAAgB5J,GAAuB;AAErD,MAAIv6B,IAAOu6B;AACX,QAAM6J,IAAYpkC,IAAO;AACzB,SAAIokC,MAAc,MAAGpkC,KAAQokC,IAC7BpkC,KAAQ,IACDA,KAAQ,MAAM,IAAIA;AAC3B;AAGO,SAASqkC,GAAgB9J,GAAe/sB,GAAuB;AACpE,SAAK,OAAO,SAAS+sB,CAAK,IACtB/sB,IAAQ,IAAU,KAAK,MAAM+sB,CAAK,IAAI/sB,IACtC,OAAO,UAAU+sB,CAAK,IAAUA,IAAQ/sB,IACrC,KAAK,MAAM+sB,CAAK,IAHa/sB;AAItC;ACnVO,SAAS82B,GAAsB;AAAA,EACpC,MAAAC;AAAA,EACA,SAAAlkC;AAAA,EACA,mBAAAmkC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,SAAAC;AACF,GAA+B;AAC7B,QAAMC,IAAUlb,GAAO4a,CAAI;AAC3B,EAAAM,EAAQ,UAAUN;AAClB,QAAMO,IAAYnb,GAAyC,EAAE;AAE7D,EAAA1J;AAAA,IACE,MAAM,MAAM;AACT,aAAO,OAAO6kB,EAAU,OAAO,EAAe;AAAA,QAAQ,CAACvwB,MACtD,OAAO,cAAcA,CAAE;AAAA,MAAA;AAAA,IAE3B;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMwwB,IAAO,CAACznC,GAAckQ,MAAkB;AAC5C,IAAAo3B,EAAQ,EAAE,CAACtnC,CAAG,IAAIunC,EAAQ,QAAQvnC,CAAG,KAAK,KAAKkQ,GAAO;AAAA,EACxD,GAEMw3B,IAAY,CAAC1nC,GAAckQ,MAAkB;AACjD,IAAAy3B,EAAS3nC,CAAG,GACZwnC,EAAU,QAAQxnC,CAAG,IAAI,OAAO,YAAY,MAAMynC,EAAKznC,GAAKkQ,CAAK,GAAG,GAAG;AAAA,EACzE,GAEMy3B,IAAW,CAAC3nC,MAAiB;AACjC,UAAMiX,IAAKuwB,EAAU,QAAQxnC,CAAG;AAChC,IAAIiX,MACF,OAAO,cAAcA,CAAE,GACvBuwB,EAAU,QAAQxnC,CAAG,IAAI;AAAA,EAE7B;AAEA,SACE,gBAAAiB,EAAAq7B,IAAA,EACE,UAAA;AAAA,IAAA,gBAAA37B;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,UAAU,CAACgX,MAASutB,EAAQ,EAAE,MAAAvtB,GAAM;AAAA,QACpC,QAAQ,CAAC7J,MAAUu3B,EAAK,QAAQv3B,CAAK;AAAA,QACrC,aAAa,CAACA,MAAUw3B,EAAU,QAAQx3B,CAAK;AAAA,QAC/C,WAAW,MAAMy3B,EAAS,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,gBAAAhnC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,OACE,gBAAApC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU,CAACoC;AAAA,YACX,SAAS,MAAMukC,EAAQ,EAAE,QAAQT,GAAgBI,EAAK,UAAU,CAAC,GAAG;AAAA,YAEpE,4BAACL,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,UAAU,CAACllB,MAAW4lB,EAAQ,EAAE,QAAA5lB,GAAQ;AAAA,QACxC,QAAQ,CAACxR,MAAUu3B,EAAK,UAAUv3B,CAAK;AAAA,QACvC,aAAa,CAACA,MAAUw3B,EAAU,UAAUx3B,CAAK;AAAA,QACjD,WAAW,MAAMy3B,EAAS,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAEpC,gBAAAhnC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,UAAU,CAAC6kC,MAAYN,EAAQ,EAAE,SAAAM,GAAS;AAAA,QAC1C,QAAQ,CAAC13B,MAAUu3B,EAAK,WAAWv3B,CAAK;AAAA,QACxC,aAAa,CAACA,MAAUw3B,EAAU,WAAWx3B,CAAK;AAAA,QAClD,WAAW,MAAMy3B,EAAS,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAErC,gBAAAhnC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO0C,EAAK;AAAA,QACZ,UAAU,CAAClkC;AAAA,QACX,UAAU,CAAC8kC,MAAYP,EAAQ,EAAE,SAAAO,GAAS;AAAA,QAC1C,QAAQ,CAAC33B,MAAUu3B,EAAK,WAAWv3B,CAAK;AAAA,QACxC,aAAa,CAACA,MAAUw3B,EAAU,WAAWx3B,CAAK;AAAA,QAClD,WAAW,MAAMy3B,EAAS,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAErC,gBAAAhnC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOmB,EAAK,WAAW;AAAA,QACvB,UAAUC;AAAA,QACV,UAAU,CAACnkC;AAAA,QACX,UAAU,CAAC+kC,MAAYR,EAAQ,EAAE,SAASQ,KAAW,MAAM;AAAA,QAC3D,SAASb,EAAK,UAAU,MAAMK,EAAQ,EAAE,SAAS,KAAA,CAAM,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5DD,IACC,gBAAA1mC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAOsB;AAAA,QACP,OAAOH,EAAK,aAAa;AAAA,QACzB,UAAUE;AAAA,QACV,UAAU,CAACpkC;AAAA,QACX,UAAU,CAACglC,MAAcT,EAAQ,EAAE,WAAWS,KAAa,MAAM;AAAA,QACjE,SAASd,EAAK,YAAY,MAAMK,EAAQ,EAAE,WAAW,KAAA,CAAM,IAAI;AAAA,MAAA;AAAA,IAAA,IAE/D;AAAA,EAAA,GACN;AAEJ;AC7FA,SAASU,GACPhyB,GACAwI,GACmB;AAInB,SAAO;AAAA,IACL,GAJaA,IACXyjB,GAAqBzjB,GAAY,WAAW,IAC5CypB,GAAqBjyB,EAAM,IAAI,WAAW;AAAA,IAG5C,SAASA,EAAM;AAAA,IACf,WAAW;AAAA,EAAA;AAEf;AAEO,SAASkyB,GAAgB;AAAA,EAC9B,OAAAlyB;AAAA,EACA,UAAAmyB;AAAA,EACA,KAAAluB;AAAA,EACA,SAAAlX;AAAA,EACA,YAAAyb,IAAa;AAAA,EACb,mBAAA0oB;AAAA,EACA,gBAAAC;AAAA,EACA,YAAAiB;AAAA,EACA,kBAAAC;AACF,GAAyB;AACvB,QAAMvJ,IAAYlB,GAAkB5nB,EAAM,IAAIiE,EAAI,SAASA,EAAI,UAAU,GACnEklB,IAAYL,IAAYH,GAAeG,EAAU,IAAI7kB,EAAI,OAAO,IAAI,CAAA,GACpE2lB,IAAU3lB,EAAI,OAAO,OAAO,CAACtV,MAAMw6B,EAAU,SAASx6B,EAAE,EAAE,CAAC,GAE3D2jC,IADW1I,EAAQ,OAAO,CAACj7B,MAAMA,EAAE,OAAOqR,EAAM,EAAE,EAC/B,CAAC,GACpBuyB,IAAY,CAACthB;;AACjB,aAAAxoB,IAAAwb,EAAI,OAAO,KAAK,CAAC8mB,OAAMA,GAAE,OAAO9Z,CAAO,MAAvC,gBAAAxoB,EAA0C,SAAQ;AAAA,KAE9CoZ,IAAa6K;AAAA,IACjB,MACEzI,EAAI,OAAO,OAAO,CAAC5F,MACbA,EAAK,OAAO2B,EAAM,MAAM3B,EAAK,cAC7BA,EAAK,YAAY2B,EAAM,UAAgB,KACpC8nB,GAAsBzpB,GAAM4F,EAAI,SAASA,EAAI,UAAU,MAAMkuB,CACrE;AAAA,IACH,CAACluB,EAAI,SAASA,EAAI,YAAYA,EAAI,QAAQkuB,GAAUnyB,EAAM,IAAIA,EAAM,OAAO;AAAA,EAAA,GAGvE,CAACwyB,GAAaC,CAAc,IAAIjmB;AAAA,IACpC8lB,IAAU,OAAOA,EAAQ,OAAO,IAAI;AAAA,EAAA,GAEhC,CAACI,GAAUC,CAAW,IAAInmB,EAAS8lB,IAAU,OAAOA,EAAQ,EAAE,IAAI,EAAE,GACpE,CAACM,GAAaC,CAAc,IAAIrmB,EAAS,EAAE,GAC3C,CAACsmB,GAAWC,CAAY,IAAIvmB;AAAA,IAA4B,MAC5DwlB,GAAyBhyB,GAAOwI,CAAU;AAAA,EAAA,GAEtCwqB,KAAe3c,GAAOyc,CAAS;AACrC,EAAAE,GAAa,UAAUF,GAEvBnmB,GAAU,MAAM;AACd,IAAAomB,EAAaf,GAAyBhyB,GAAOwI,CAAU,CAAC;AAAA,EAC1D,GAAG,CAACxI,GAAOwI,CAAU,CAAC;AAEtB,QAAMyqB,KAAaC;AAAA,IACjB,CAACC,MAAwC;AACvC,YAAMzmC,IAAOslC,GAAyBhyB,GAAO;AAAA,QAC3C,GAAGgzB,GAAa;AAAA,QAChB,GAAGG;AAAA,QACH,SAASnzB,EAAM;AAAA,MAAA,CAChB;AAED,MADA+yB,EAAarmC,CAAI,GACZK,MACLslC,KAAA,QAAAA,EAAmB3lC;AAAA,IACrB;AAAA,IACA,CAACK,GAASslC,GAAkBryB,CAAK;AAAA,EAAA;AAGnC,EAAA2M,GAAU,MAAM;AACd,IAAA8lB,EAAeH,IAAU,OAAOA,EAAQ,OAAO,IAAI,EAAE,GACrDK,EAAYL,IAAU,OAAOA,EAAQ,EAAE,IAAI,EAAE;AAAA,EAC/C,GAAG,CAACtyB,EAAM,IAAI8oB,KAAA,gBAAAA,EAAW,IAAIwJ,KAAA,gBAAAA,EAAS,IAAIA,KAAA,gBAAAA,EAAS,OAAO,CAAC;AAE3D,QAAMc,IAAarK,GAAmBlnB,GAAYoC,EAAI,MAAM,GACtDovB,KAAsBxxB,EAAW;AAAA,IACrC,CAACxD,MAAS,OAAOA,EAAK,OAAO,MAAMm0B;AAAA,EAAA,GAG/Bc,KAAUzxB,EAAW,OAAO,CAACxD,MAAS,CAAC8qB,EAAU,SAAS9qB,EAAK,EAAE,CAAC,GAClEk1B,IAAYxK,GAAmBuK,IAASrvB,EAAI,MAAM,GAClDuvB,KAAsBF,GAAQ;AAAA,IAClC,CAACj1B,MAAS,OAAOA,EAAK,OAAO,MAAMu0B;AAAA,EAAA,GAG/Ba,KAAiB,CAACtkC,GAAeC,MAAgB;AACrD,IAAAgjC,EAAWzH,GAAsB1mB,GAAK9U,GAAMC,CAAE,CAAC;AAAA,EACjD,GAEMskC,KAAgB,CAACC,MAA2B;AAChD,IAAIA,EAAY,SAAS,KACzBvB;AAAA,MACE/G,GAAsBpnB,GAAK0vB,GAAa;AAAA,QACtC,MAAM7K,KAAA,gBAAAA,EAAW;AAAA,QACjB,aAAYA,KAAA,gBAAAA,EAAW,eAAc;AAAA,QACrC,aAAaA,KAAA,gBAAAA,EAAW;AAAA,MAAA,CACzB;AAAA,IAAA;AAAA,EAEL,GAEM8K,KAAkB,CAACC,MAAmB;AAC1C,IAAAlB,EAAYkB,CAAM;AAClB,UAAMzkC,IAAK6U,EAAI,OAAO,KAAK,CAACtV,OAAMA,GAAE,OAAO,OAAOklC,CAAM,CAAC;AACzD,IAAI,CAACzkC,KAAM,CAACrC,KACZ0mC,GAAezzB,GAAO5Q,CAAE;AAAA,EAC1B,GAEM0kC,KAAmB,CAACD,MAAmB;AAC3C,UAAMnnC,IAAOuX,EAAI,OAAO,KAAK,CAACtV,OAAMA,GAAE,OAAO,OAAOklC,CAAM,CAAC;AAC3D,IAAI,CAACnnC,KAAQ,CAACK,MACd2mC,GAAc,CAAC,GAAG9J,GAAS5pB,GAAOtT,CAAI,CAAC,GACvCmmC,EAAe,EAAE;AAAA,EACnB,GAEMkB,KAAiB,CACrB/K,GACA1sB,MAEA0sB,EAAS,IAAI,CAAC3qB,OAAS;AACrB,UAAM21B,KAAStM,GAAoBrpB,GAAK,IAAI4F,EAAI,OAAO,KAAK;AAC5D,WAAO;AAAA,MACL,OAAO,OAAO5F,GAAK,EAAE;AAAA,MACrB,OAAOA,GAAK;AAAA,MACZ,MAAM21B,KAAS,WAAW;AAAA,MAC1B,SAASC;AAAA,QACP33B;AAAA,QACA03B;AAAA,QACAA,KAAS7C,IAAiB;AAAA,MAAA;AAAA,MAE5B,WAAW,CAAC6C;AAAA,IAAA;AAAA,EAEhB,CAAC;AAEH,SACE,gBAAA/oC,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,SAAI,WAAU,gCACZ,UAAAwnC,MAAa,cAAc,mBAAmB,kBACjD;AAAA,IACCA,MAAa,cACZ,gBAAAxnC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,kGAAA,CAGpC,IAEA,gBAAAA,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,yFAGpC;AAAA,IAGDwnC,MAAa,eACZ,gBAAAlnC,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO1B;AAAA,YACP,UAAU,CAACzlC,KAAWqmC,EAAW,WAAW;AAAA,YAC5C,aAAY;AAAA,YACZ,SAASA,EAAW,IAAI,CAAC7qC,OAAW;AAAA,cAClC,OAAO,OAAOA,EAAM,EAAE;AAAA,cACtB,OAAOA,EAAM;AAAA,YAAA,EACb;AAAA,YACF,UAAU,CAAC4rC,MAAc;AACvB,cAAA1B,EAAe0B,CAAS,GACxBxB;AAAA,gBACEL,KAAW,OAAOA,EAAQ,OAAO,MAAM6B,IACnC,OAAO7B,EAAQ,EAAE,IACjB;AAAA,cAAA;AAAA,YAER;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,GACF;AAAA,MACA,gBAAArnC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOxB;AAAA,YACP,UAAU,CAAC3lC,KAAW,CAACylC;AAAA,YACvB,aACEA,IACI,sCACA;AAAA,YAEN,YAAU;AAAA,YACV,SAASuB,GAAeV,IAAqB,WAAW;AAAA,YACxD,UAAUO;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,GACF;AAAA,MACCtB,IACC,gBAAArnC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA;AAAA,QAAA;AAAA,QACzB+U,EAAM;AAAA,QAAI;AAAA,QAAIsyB,EAAQ;AAAA,QAAI;AAAA,QAAGC,EAAUvyB,EAAM,OAAO;AAAA,QAAE;AAAA,QAAG;AAAA,QACjEuyB,EAAUD,EAAQ,OAAO;AAAA,QAAE;AAAA,SAAGxJ,KAAA,gBAAAA,EAAW,cAAa;AAAA,QAAK;AAAA,MAAA,EAAA,CAC9D,IACE;AAAA,MACH/7B,KAAW+7B,IACV,gBAAAn+B,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAMynC,EAAW1H,GAAwBzmB,GAAK6kB,EAAU,EAAE,CAAC;AAAA,UACrE,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH,IACE;AAAA,IAAA,GACN;AAAA,IAGDqJ,MAAa,cACZ,gBAAAlnC,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAA37B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA,SAAK;AAAA,MAC7Ci/B,EAAQ,IAAI,CAACvrB,MACZ,gBAAApT,EAAC,OAAA,EAAkB,WAAU,uBAC3B,UAAA;AAAA,QAAA,gBAAAA,EAAC,QAAA,EACE,UAAA;AAAA,UAAAsnC,EAAUl0B,EAAK,OAAO;AAAA,UAAE;AAAA,UAAG;AAAA,UAC5B,gBAAA1T,EAAC,QAAA,EAAK,WAAU,0BAA0B,YAAK,IAAA,CAAI;AAAA,QAAA,GACrD;AAAA,QACCoC,KAAW68B,EAAQ,SAAS,KAAKvrB,EAAK,OAAO2B,EAAM,KAClD,gBAAArV;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM+oC,GAAc9J,EAAQ,OAAO,CAACj7B,MAAMA,EAAE,OAAO0P,EAAK,EAAE,CAAC;AAAA,YACrE,UAAA;AAAA,UAAA;AAAA,QAAA,IAGC;AAAA,MAAA,KAbIA,EAAK,EAcf,CACD;AAAA,MACAurB,EAAQ,WAAW,IAClB,gBAAAj/B,EAAC,OAAE,WAAU,wBAAuB,iDAAmC,IACrE;AAAA,MACJ,gBAAAM,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOtB;AAAA,YACP,UAAU,CAAC7lC,KAAWwmC,EAAU,WAAW;AAAA,YAC3C,aAAY;AAAA,YACZ,SAASA,EAAU,IAAI,CAAChrC,OAAW;AAAA,cACjC,OAAO,OAAOA,EAAM,EAAE;AAAA,cACtB,OAAOA,EAAM;AAAA,YAAA,EACb;AAAA,YACF,UAAUsqC;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,GACF;AAAA,MACA,gBAAA5nC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAM;AAAA,YACN,UAAU,CAACnnC,KAAW,CAAC6lC;AAAA,YACvB,aACEA,IACI,qCACA;AAAA,YAEN,YAAU;AAAA,YACV,SAASmB,GAAeP,IAAqB,UAAU;AAAA,YACvD,UAAUM;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,GACF;AAAA,MACC/mC,KAAW+7B,IACV,gBAAAn+B,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAMynC,EAAW1H,GAAwBzmB,GAAK6kB,EAAU,EAAE,CAAC;AAAA,UACrE,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH,IACE;AAAA,IAAA,GACN;AAAA,IAGDuJ,IACC,gBAAApnC,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAA37B,EAAC,OAAA,EAAI,WAAU,4DAA2D,UAAA,UAE1E;AAAA,MACA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA,gBAAAA;AAAA,QAACqmC;AAAA,QAAA;AAAA,UACC,MAAM8B;AAAA,UACN,SAAA/lC;AAAA,UACA,mBAAmBqnC;AAAA,YACjB;AAAA,YACAlD;AAAA,UAAA;AAAA,UAEF,gBAAAC;AAAA,UACA,gBAAe;AAAA,UACf,SAAS8B;AAAA,QAAA;AAAA,MAAA,EACX,CACF;AAAA,IAAA,EAAA,CACF,IACE;AAAA,EAAA,GACN;AAEJ;AC5UO,MAAMoB,KAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAChB,GAMaC,KAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,KAA+B,CAAC,SAAS,MAAM;AAE9C,SAASC,GAAmBl4B,GAA0B;AAC3D,SAAO,CAACi4B,GAAgB,SAASj4B,CAAI;AACvC;AAGO,SAASm4B,GAAmBnrC,GAAyC;AAC1E,SACEA,KACA,CAACgrC,GAAkB,SAAShrC,CAAO,KACnCkrC,GAAmBlrC,CAAO,IAEnB,CAAC,GAAGgrC,IAAmBhrC,CAAO,IAEhCgrC;AACT;AASO,SAASI,GAAep4B,GAAsB;AACnD,SAAO+3B,GAAkB/3B,CAAiB,KAAKA;AACjD;AC7DO,MAAMq4B,KAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmBO,SAASC,GAAiBt4B,GAA2C;AAC1E,SAAQq4B,GAA6C,SAASr4B,CAAI;AACpE;AAEO,SAASu4B,GAAiBv4B,GAAuB;AACtD,SAAOA,MAAS,UAAUA,MAAS;AACrC;AAEO,SAASw4B,GAAmBtsB,GAAwD;AACzF,SAAO,GACLA,KAAcA,EAAW,eAAe,cAAcA,EAAW,cAAc;AAEnF;AAEO,SAASusB,GAAkBvsB,GAAwD;;AACxF,SAAO,GACLA,KACEA,EAAW,eAAe,cACzBA,EAAW,aAAa,SAAgB/f,IAAA+f,EAAW,gBAAX,QAAA/f,EAAwB;AAEvE;AAEO,SAASusC,GAAgBxsB,GAAwD;;AACtF,SAAO,GACLA,KACEA,EAAW,eAAe,YACzBA,EAAW,WAAW,SAAgB/f,IAAA+f,EAAW,gBAAX,QAAA/f,EAAwB;AAErE;AAEO,SAASwsC,GAAkBzsB,GAAwD;AACxF,SAAO0sB,GAAoB1sB,CAAU;AACvC;AAEO,SAASwC,GACdmJ,GAC6B;AAC7B,SAAO,IAAI,IAAIA,EAAY,IAAI,CAAC9V,MAAS,CAACA,EAAK,SAASA,CAAI,CAAC,CAAC;AAChE;AAGO,SAAS82B,GACd51B,GACA4U,GAWA;AACA,QAAMihB,IAAUpqB,GAAoBmJ,CAAW,GACzCkhB,IAAc,CAAA,GACdtrB,IAAiB,CAAA,GACjBurB,IAAc,CAAA,GACdC,IAAwB,CAAA,GACxBC,IAA2B,CAAA,GAC3BC,IAAwB,CAAA,GACxBC,IAAc,CAAA,GACdC,IAAwB,CAAA,GACxBC,IAAkB,CAAA;AACxB,aAAW51B,KAAST,GAAQ;AAC1B,QAAIS,EAAM,WAAY;AACtB,UAAMwI,IAAa4sB,EAAQ,IAAIp1B,EAAM,EAAE,KAAK;AAC5C,QAAIA,EAAM,SAAS,UAAU;AAC3B,MAAIi1B,GAAkBzsB,CAAU,IAAGktB,EAAO,KAAK11B,CAAK,IAC/C21B,EAAiB,KAAK31B,CAAK;AAChC;AAAA,IACF;AACA,IAAI80B,GAAmBtsB,CAAU,IAAG6sB,EAAO,KAAKr1B,CAAK,IAC5C+0B,GAAkBvsB,CAAU,IAAGuB,EAAU,KAAK/J,CAAK,IACnDg1B,GAAgBxsB,CAAU,IAAG8sB,EAAO,KAAKt1B,CAAK,IAC9C40B,GAAiB50B,EAAM,IAAI,KAAK,CAACi1B,GAAkBzsB,CAAU,MACpEotB,EAAW,KAAK51B,CAAK,GACjB60B,GAAiB70B,EAAM,IAAI,IAAGu1B,EAAiB,KAAKv1B,CAAK,IACpDA,EAAM,SAAS,YAAWw1B,EAAoB,KAAKx1B,CAAK,IACxDA,EAAM,SAAS,kBAAgBy1B,EAAiB,KAAKz1B,CAAK;AAAA,EAEvE;AACA,SAAO;AAAA,IACL,QAAAq1B;AAAA,IACA,WAAAtrB;AAAA,IACA,QAAAurB;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;AC3GO,SAASC,GAAkBv5B,GAAuB;AACvD,SAAOA,MAAS;AAClB;AAEO,SAASw5B,GAA8Cv2B,GAAkB;AAC9E,SAAOA,EAAO,OAAO,CAACS,MAAU61B,GAAkB71B,EAAM,IAAI,KAAK,CAACA,EAAM,UAAU;AACpF;AAEO,SAAS+1B,GACdx2B,GACyC;AACzC,SAAOu2B,GAAkBv2B,CAAM,EAAE,IAAI,CAACS,OAAW;AAAA,IAC/C,OAAO,OAAOA,EAAM,EAAE;AAAA,IACtB,OAAOA,EAAM;AAAA,EAAA,EACb;AACJ;AAEO,SAASg2B,GACdC,GACA9hB,GACe;;AACf,WAAO1rB,IAAA0rB,EAAY,KAAK,CAAClJ,MAAQA,EAAI,YAAYgrB,CAAO,MAAjD,gBAAAxtC,EAAoD,YAAW;AACxE;AAEO,SAASytC,GACdZ,GACAnhB,GACK;AACL,QAAMgiB,IAAO,IAAI;AAAA,IACfhiB,EACG,IAAI,CAAClJ,MAAQA,EAAI,OAAO,EACxB,OAAO,CAAChK,MAAqBA,KAAM,IAAI;AAAA,EAAA;AAE5C,SAAOq0B,EAAO,OAAO,CAACc,MAAU,CAACD,EAAK,IAAIC,EAAM,EAAE,CAAC;AACrD;AAEO,SAASC,GACdD,GACAE,GAC+C;AAC/C,SAAO;AAAA,IACL,OAAOF,EAAM,KAAK,UAAU,SAASA,EAAM,EAAE;AAAA,IAC7C,IAAI,SAASA,EAAM,EAAE;AAAA,IACrB,MAAME,IAAc,CAACA,CAAW,IAAI,CAAC,UAAU;AAAA,EAAA;AAEnD;ACxDO,SAASC,GAAczrB,GAO2B;;AACvD,QAAMmgB,MAAOxiC,IAAAqiB,EAAM,iBAAN,gBAAAriB,EAAoB,WAAU,MACrC+tC,IAAO,CAAC1rB,EAAM,SAAS;AAC7B,SAAIA,EAAM,eAAa0rB,EAAK,KAAK1rB,EAAM,SAAS,GACzC,EAAE,OAAOmgB,GAAM,IAAIngB,EAAM,KAAK,MAAA0rB,EAAA;AACvC;AAEO,MAAMC,KAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,SAASC,GACd3uC,GAC4B;AAC5B,SACEA,KAAW,QACV0uC,GAAyC,SAAS1uC,CAAO;AAE9D;AAGO,SAAS4uC,GACd5uC,GACA6uC,GACS;AACT,SAAOF,GAAkB3uC,CAAO,KAAK6uC,IAAgB;AACvD;AAUO,SAASC,GAAwC1uC,GAAkB;AACxE,QAAMG,IAAUH,EAAO,OAAO,CAACI,MAAUA,EAAM,SAAS,SAAS,GAC3DuuC,IAAkB3uC,EACrB,OAAO,CAACI,MAAUA,EAAM,SAAS,OAAO,EACxC,MAAA,EACA,KAAKwuC,EAAqB,EAC1B,QAAA;AACH,SAAO,CAAC,GAAGzuC,GAAS,GAAGwuC,CAAe;AACxC;AAEO,SAASE,GACdz3B,GACApX,GACK;AACL,QAAM8uC,IAAY,IAAI;AAAA,IACpBJ,GAAmB1uC,CAAM,EAAE,IAAI,CAACI,GAAO2jB,MAAU,CAAC3jB,EAAM,IAAI2jB,CAAK,CAAC;AAAA,EAAA;AAEpE,SAAO3M,EAAO,MAAA,EAAQ,KAAK,CAACpR,GAAGC,MAAM;AACnC,UAAM67B,IAAKgN,EAAU,IAAI9oC,EAAE,OAAO,KAAK,OAAO,mBACxC+7B,IAAK+M,EAAU,IAAI7oC,EAAE,OAAO,KAAK,OAAO;AAC9C,WAAO67B,IAAKC;AAAA,EACd,CAAC;AACH;ACnDO,SAASgN,GACdC,GACAhvC,GACQ;AACR,MAAIgvC,EAAO,SAAS,WAAY,QAAO;AACvC,MAAIA,EAAO,SAAS,YAAa,QAAO;AACxC,MAAIA,EAAO,SAAS,QAAQ;AAC1B,UAAM5uC,IAAQJ,EAAO,KAAK,CAAC4iC,MAAMA,EAAE,OAAOoM,EAAO,OAAO;AACxD,YAAO5uC,KAAA,gBAAAA,EAAO,UAAS,YAAY,iBAAiB;AAAA,EACtD;AACA,SAAO;AACT;AAGO,SAAS6uC,GAAkBjvC,GAAyC;AACzE,SAAOA,EAAO,OAAO,CAAC4iC,MAAMA,EAAE,SAAS,OAAO,EAAE;AAClD;AAqBO,SAASsM,GAAY9oB,GAAe+oB,GAAiBC,GAA2B;AAErF,MADahpB,EAAI,QAAQ+oB,CAAO,IACrB,EAAG,QAAO/oB;AACrB,QAAMipB,IAAUjpB,EAAI,OAAO,CAACtN,MAAOA,MAAOq2B,CAAO,GAC3CG,IAAU,KAAK,IAAI,GAAG,KAAK,IAAIF,GAASC,EAAQ,MAAM,CAAC,GACvD9qC,IAAO,CAAC,GAAG8qC,CAAO;AACxB,SAAA9qC,EAAK,OAAO+qC,GAAS,GAAGH,CAAO,GACxB5qC;AACT;AAGO,SAASgrC,GACdhyB,GACAiyB,GACAC,GACAl9B,GACQ;AACR,MAAIA,KAAS,KAAKk9B,KAAa,EAAG,QAAO;AACzC,QAAM1rB,IAAQ,KAAK,OAAOxG,IAAUiyB,IAAUC,IAAY,KAAKA,CAAS;AACxE,SAAO,KAAK,IAAI,GAAG,KAAK,IAAIl9B,IAAQ,GAAGwR,CAAK,CAAC;AAC/C;AAGO,SAAS2rB,GACdC,GACAC,GACAH,GACAI,GACe;AACf,SAAIF,IAAY,KAAKC,MAAcD,KAAaF,KAAa,IAAU,OACnEG,IAAYD,IAAkBC,IAAYH,IACvCG,IAAYH,IAAYI;AACjC;AAEA,SAASC,GAAY9pC,GAAaC,GAAsB;AACtD,SAAOD,EAAE,WAAWC,EAAE,UAAUD,EAAE,MAAM,CAAC8S,GAAItM,MAAMsM,MAAO7S,EAAEuG,CAAC,CAAC;AAChE;AAkCA,SAASujC,GAAYn0B,GAAsB;AACzC,SAAIA,IAAO,OAAa,GAAGA,CAAI,OAC3BA,IAAO,OAAO,OAAa,IAAIA,IAAO,MAAM,QAAQ,CAAC,CAAC,QACnD,IAAIA,KAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC7C;AAEA,SAASo0B,GAAYnuC,GAA+C;;AAClE,SAAKA,OACQvB,IAAAuB,EAAI,MAAM,GAAG,EAAE,IAAA,MAAf,gBAAAvB,EAAsB,WACpB;AACjB;AAEA,SAAS2vC,GAAU1rC,GAAqB;AACtC,SAAOA,EAAK,KAAK,YAAA,EAAc,SAAS,MAAM,KAAKA,EAAK,SAAS;AACnE;AAEA,SAAS2rC,KAAW;AAClB,SACE,gBAAA1tC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,IAAA;AAAA,EAAA,GAElB;AAEJ;AAGA,SAAS2tC,KAAY;AACnB,SACE,gBAAArtC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAN,EAAC,YAAA,EAAS,QAAO,eAAA,CAAe;AAAA,QAChC,gBAAAA,EAAC,QAAA,EAAK,GAAE,iFAAA,CAAiF;AAAA,QACzF,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,QACtC,gBAAAA,EAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG5C;AAEO,SAAS4tC,GACdhwC,GACAiwC,IAAa,GACb;AACA,QAAMC,IAAYlwC,EAAM,SAAS,WAC3BgX,IACJi5B,MAAe,IAAI,YAAY,GAAGA,CAAU;AAC9C,SAAO;AAAA,IACL,OAAOC,IAAY,wBAAwB,WAAWlwC,EAAM,IAAI;AAAA,IAChE,MAAMkwC,IACF,+BAA+Bl5B,CAAM,iFACrC,sBAAsBA,CAAM;AAAA,IAChC,QAAQk5B,IAAY,mBAAmB;AAAA,EAAA;AAE3C;AAEO,SAASC,GAAY;AAAA,EAC1B,QAAAvwC;AAAA,EACA,WAAAwwC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,QAAA1B;AAAA,EACA,gBAAA2B;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AACF,GAAqB;AACnB,QAAM,CAACjO,GAAMkO,CAAO,IAAI3sB,EAAS,EAAE,GAC7B,CAAC4sB,GAAMC,CAAO,IAAI7sB,EAAsB,IAAI,GAC5C,CAAC8sB,GAAMC,CAAO,IAAI/sB,EAAS,EAAK,GAChC,CAACgtB,GAAOC,CAAQ,IAAIjtB,EAAwB,IAAI,GAChD,CAACktB,GAAUC,CAAW,IAAIntB,EAAwB,IAAI,GACtD,CAACotB,GAAUC,CAAW,IAAIrtB,EAAS,EAAK,GACxC,CAACstB,GAAiBC,CAAkB,IAAIvtB,EAAwB,IAAI,GACpE,CAACwtB,IAAUC,EAAW,IAAIztB,EAAS,EAAK,GACxC,CAAC0tB,GAAMC,EAAO,IAAI3tB,EAA2B,IAAI,GACjD,CAACurB,IAAWqC,CAAY,IAAI5tB,EAAwB,IAAI,GACxD,CAAC6tB,IAAYC,EAAa,IAAI9tB,EAA0B,IAAI,GAC5D,CAAC+tB,IAAeC,EAAgB,IAAIhuB,EAAS,EAAK,GAClD,CAACiuB,IAAiBC,EAAkB,IAAIluB,EAAwB,IAAI,GACpEmuB,IAAetkB,GAAyB,IAAI,GAC5CukB,IAAevkB,GAAuB,IAAI,GAC1CwkB,KAAWxkB,GAAuB,IAAI,GACtCykB,KAAgBzkB,GAAwB,IAAI,GAC5C0kB,KAAU1kB,GAAyB,IAAI,GAEvC/tB,KAAUokB;AAAA,IACd,MAAMvkB,EAAO,KAAK,CAAC4iC,MAAMA,EAAE,SAAS,SAAS,KAAK;AAAA,IAClD,CAAC5iC,CAAM;AAAA,EAAA,GAEH6yC,KAAe,GAAQ1yC,MAAA,QAAAA,GAAS,gBAAgBA,MAAA,QAAAA,GAAS,eACzDkwC,KAAa,CAACvnB,OAAoB2nB,KAAA,gBAAAA,EAAmB3nB,OAAY,GACjEgqB,KAAiBvuB;AAAA,IACrB,MACEvkB,EACG,OAAO,CAAC4iC,MAAMA,EAAE,SAAS,OAAO,EAChC,QACA,KAAKgM,EAAqB;AAAA,IAC/B,CAAC5uC,CAAM;AAAA,EAAA,GAEH+yC,KAAexuB;AAAA,IACnB,MAAMuuB,GAAe,IAAI,CAAC1yC,MAAUA,EAAM,EAAE;AAAA,IAC5C,CAAC0yC,EAAc;AAAA,EAAA,GAEXE,KAAgBzuB,GAAQ,MAAM;AAElC,UAAM6B,IAAM2rB,KAAQ,OAAOgB,KAAgBb,MAAca,IACnDE,IAAO,IAAI,IAAIH,GAAe,IAAI,CAAC1yC,OAAU,CAACA,GAAM,IAAIA,EAAK,CAAC,CAAC;AACrE,WAAOgmB,EACJ,IAAI,CAACtN,OAAOm6B,EAAK,IAAIn6B,EAAE,CAAC,EACxB,OAAO,CAAC1Y,OAA4BA,MAAS,IAAI;AAAA,EACtD,GAAG,CAAC0yC,IAAgBC,IAAchB,GAAMG,EAAU,CAAC,GAC7CgB,IACJlE,EAAO,SAAS,SACZhvC,EAAO,KAAK,CAAC4iC,MAAMA,EAAE,OAAOoM,EAAO,OAAO,KAAK,OAC/C,MACAmE,KACJnE,EAAO,SAAS,eAAckE,KAAA,gBAAAA,EAAS,UAAS,WAC5CE,KAAY1C,KAAa,CAAC,CAACE,KAAiB,CAAC,CAACC,GAC9CwC,KAAaD,MAAa,CAAC,CAACrC,KAAmB+B,GAAe,SAAS;AAE7E,EAAAtuB,GAAU,MAAM;AACd,IAAIwqB,EAAO,SAAS,eAAckE,KAAA,gBAAAA,EAAS,UAAS,aAClDlC,EAAQ,SAAS,GACjBE,EAAQ,IAAI,KACHlC,EAAO,SAAS,eACzBgC,EAAQ,EAAE,GACVE,EAAQ,IAAI,KACHlC,EAAO,SAAS,UAAUkE,MACnClC,EAAQkC,EAAQ,IAAI,GACpBhC,EAAQ,IAAI,IAEdI,EAAS,IAAI,GACbM,EAAmB,IAAI,GACvBE,GAAY,EAAK,GACjBN,EAAY,IAAI,GAChBa,GAAiB,EAAK;AAAA,EACxB,GAAG,CAACrD,GAAQkE,KAAA,gBAAAA,EAAS,IAAIA,KAAA,gBAAAA,EAAS,MAAMA,KAAA,gBAAAA,EAAS,IAAI,CAAC,GAEtD1uB,GAAU,MAAM;AACd,QAAImtB,KAAmB,KAAM;AAC7B,UAAMla,IAAQ,CAAC7uB,MAAqB;AAClC,MAAIA,EAAE,QAAQ,YAAY,CAACipC,QAA6B,IAAI;AAAA,IAC9D;AACA,kBAAO,iBAAiB,WAAWpa,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,EAC1D,GAAG,CAACka,GAAiBE,EAAQ,CAAC,GAE9BrtB,GAAU,MAAM;AACd,QAAI,CAACysB,GAAM;AACT,MAAAsB,GAAmB,IAAI;AACvB;AAAA,IACF;AACA,UAAMtuB,IAAM,IAAI,gBAAgBgtB,CAAI;AACpC,WAAAsB,GAAmBtuB,CAAG,GACtBouB,GAAiB,EAAK,GACf,MAAM,IAAI,gBAAgBpuB,CAAG;AAAA,EACtC,GAAG,CAACgtB,CAAI,CAAC,GAET0B,GAAc,UAAUT,IACxBU,GAAQ,UAAUb,GAElBvtB,GAAU,MAAM;AACd,IAAIutB,KAAQ,QAAQG,MAAc,QAC9BpC,GAAYiD,IAAcb,EAAU,QAAiB,IAAI;AAAA,EAC/D,GAAG,CAACa,IAAchB,GAAMG,EAAU,CAAC;AAEnC,QAAMoB,KAAc,CAAC/uC,MAAkC;AACrD,QAAKA,GACL;AAAA,UAAI,CAAC0rC,GAAU1rC,CAAI,GAAG;AACpB,QAAA+sC,EAAS,qBAAqB;AAC9B;AAAA,MACF;AACA,MAAAA,EAAS,IAAI,GACbJ,EAAQ3sC,CAAI;AAAA;AAAA,EACd,GAEMgvC,KAAW,CAACnzC,MAAmB;AACnC,IAAAuwC,EAAe,EAAE,MAAM,QAAQ,SAASvwC,EAAM,IAAI;AAAA,EACpD,GAEMozC,KAAS,OAAOC,MAAyB;;AAC7C,UAAMC,IAAoBzC;AAC1B,QAAIkC;AACF,UAAI,CAACO,MAAY1E,EAAO,SAAS,cAAc,EAACkE,KAAA,QAAAA,EAAS,gBAAe;AACtE,QAAA5B,EAAS,qBAAqB;AAC9B;AAAA,MACF;AAAA,eACS,CAACxO,EAAK,QAAQ;AACvB,MAAAwO,EAAS,gBAAgB;AACzB;AAAA,IACF;AACA,QAAItC,EAAO,SAAS,eAAe,CAAC0E,GAAS;AAC3C,MAAApC,EAAS,qBAAqB;AAC9B;AAAA,IACF;AACA,IAAAF,EAAQ,EAAI,GACZE,EAAS,IAAI,GACToC,OAAqB,CAAC;AAC1B,QAAI;AACF,MAAI1E,EAAO,SAAS,aAClB,OAAM4B,KAAA,gBAAAA,EAAgB;AAAA,QACpB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM8C,KAAW;AAAA,QACjB,YAAYlC;AAAA,MAAA,MAELxC,EAAO,SAAS,cACzB,OAAM4B,KAAA,gBAAAA,EAAgB;AAAA,QACpB,MAAM9N,EAAK,KAAA;AAAA,QACX,MAAM;AAAA,QACN,cAAYxiC,KAAAkwC,EAAU,CAAC,MAAX,gBAAAlwC,GAAc,OAAM;AAAA,QAChC,MAAMozC,KAAW;AAAA,QACjB,YAAYlC;AAAA,MAAA,MAELxC,EAAO,SAAS,UAAUkE,KACnC,OAAMrC,KAAA,gBAAAA,EAAgB;AAAA,QACpB,SAASqC,EAAQ;AAAA,QACjB,MAAMA,EAAQ,SAAS,YAAY,YAAYpQ,EAAK,KAAA;AAAA,QACpD,MAAM4Q,KAAW;AAAA,QACjB,YAAYlC;AAAA,MAAA,KAGhBA,EAAY,GAAG,GACfb,EAAe,EAAE,MAAM,QAAQ;AAAA,IACjC,SAAS/nC,IAAG;AACV,MAAA0oC,EAAS1oC,cAAa,QAAQA,GAAE,UAAU,uBAAuB,GACjE4oC,EAAY,IAAI;AAAA,IAClB,UAAA;AACE,MAAAJ,EAAQ,EAAK;AAAA,IACf;AAAA,EACF,GAEMuC,KAAS,OAAOvzC,MAAmB;AACvC,QAAI,GAAC0wC,KAAiBe,KACtB;AAAA,MAAAC,GAAY,EAAI,GAChBR,EAAS,IAAI;AACb,UAAI;AACF,cAAMR,EAAc1wC,EAAM,EAAE,GAC5BwxC,EAAmB,IAAI,GACvBjB,EAAe,EAAE,MAAM,QAAQ;AAAA,MACjC,SAAS/nC,GAAG;AACV,QAAA0oC,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,yBAAyB;AAAA,MACrE,UAAA;AACE,QAAAkpC,GAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF,GAEM8B,KAAoB,MAAM;AAC9B,UAAMxzC,IAAQJ,EAAO,KAAK,CAAC4iC,OAAMA,GAAE,OAAO+O,CAAe;AACzD,QAAI,CAACvxC,EAAO,QAAO;AACnB,UAAMujC,IAAOyM,GAAkBhwC,GAAOiwC,GAAWjwC,EAAM,EAAE,CAAC;AAC1D,WACE,gBAAA0C,EAAC,OAAA,EAAI,WAAU,mBAAkB,MAAK,gBACpC,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAOqvC,KAAW,SAAYD,EAAmB,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAEhE,gBAAA9uC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,mBAAgB;AAAA,UAChB,oBAAiB;AAAA,UAEjB,UAAA;AAAA,YAAA,gBAAAN,EAAC,QAAG,WAAU,0BAAyB,IAAG,0BACvC,YAAK,OACR;AAAA,YACA,gBAAAM,EAAC,KAAA,EAAE,WAAU,yBAAwB,IAAG,yBACrC,UAAA;AAAA,cAAA6gC,EAAK;AAAA,cAAK;AAAA,YAAA,GACb;AAAA,YACC0N,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,YAClE,gBAAAM,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAUqvC;AAAA,kBACV,SAAS,MAAMD,EAAmB,IAAI;AAAA,kBACvC,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGD,gBAAApvC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAUqvC;AAAA,kBACV,WAAS;AAAA,kBACT,SAAS,MAAM,KAAK8B,GAAOvzC,CAAK;AAAA,kBAE/B,eACC,gBAAA0C,EAAAq7B,IAAA,EACE,UAAA;AAAA,oBAAA,gBAAA37B,EAAC,QAAA,EAAK,WAAU,6BAA4B,eAAY,QAAO;AAAA,oBAAE;AAAA,kBAAA,EAAA,CAEnE,IAEAmhC,EAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YAET,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,GACF;AAAA,EAEJ,GAEMkQ,KAAkB,CAACzzC,MACnB,CAACgzC,MAAa,CAACtC,IAAsB,OAEvC,gBAAAtuC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO,UAAUpC,EAAM,SAAS,YAAY,gBAAgBA,EAAM,IAAI;AAAA,MACtE,cAAY,UAAUA,EAAM,SAAS,YAAY,gBAAgBA,EAAM,IAAI;AAAA,MAC3E,UAAU+wC,KAAQU;AAAA,MAClB,SAAS,CAACjpC,MAAM;AACd,QAAAA,EAAE,gBAAA,GACFgpC,EAAmBxxC,EAAM,EAAE;AAAA,MAC7B;AAAA,MAEA,4BAAC+vC,IAAA,CAAA,CAAU;AAAA,IAAA;AAAA,EAAA,GAKX2D,KAAa,CAAC3nC,GAAWC,MAAc;AAC3C,UAAM2nC,KAAQrB,GAAS;AACvB,IAAKqB,OACLA,GAAM,MAAM,OAAO,GAAG5nC,CAAC,MACvB4nC,GAAM,MAAM,MAAM,GAAG3nC,CAAC;AAAA,EACxB,GAEM4nC,KAAiB,CAACz2B,MAAoB;AAC1C,UAAMpc,IAAUyxC,GAAQ;AACxB,QAAI,CAACzxC,EAAS;AACd,UAAM4iB,KAAQwrB;AAAA,MACZhyB;AAAA,MACApc,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ,UAAU;AAAA,IAAA;AAEpB,IAAIA,EAAQ,cAAc4iB,OACxB5iB,EAAQ,YAAY4iB,IACpBkuB,EAAaluB,EAAK;AAEpB,UAAMxf,KAAO2qC,GAAY/tC,EAAQ,WAAWA,EAAQ,IAAI4iB,EAAK,GACvDqC,KAAMusB,GAAc,WAAWxxC,EAAQ;AAC7C,IAAK2uC,GAAY1pB,IAAK7hB,EAAI,QAAiBA,EAAI;AAAA,EACjD,GAEM0vC,KAAiB,YAAY;AACjC,UAAMC,IAAUvB,GAAc;AAC9B,QAAI,GAAC5B,KAAmBmD,KAAW,OACnC;AAAA,UAAIpE,GAAYoE,GAASnB,EAAY,GAAG;AACtC,QAAAZ,GAAc,IAAI;AAClB;AAAA,MACF;AACA,UAAI;AACF,cAAMpB,EAAgBmD,CAAO;AAAA,MAC/B,SAAStrC,GAAG;AACV,QAAAupC,GAAc,IAAI,GAClBb,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,2BAA2B;AAAA,MACvE;AAAA;AAAA,EACF,GAEMurC,KAAU,MAAM;AACpB,IAAKvB,GAAQ,YACbA,GAAQ,UAAU,MAClBZ,GAAQ,IAAI,GACZC,EAAa,IAAI,GACZgC,GAAA;AAAA,EACP;AAEA,EAAAzvB,GAAU,MAAM;AACd,QAAI,CAACutB,EAAM;AACX,UAAMqC,IAAS,CAACxrC,OAAoB;AAClC,YAAMzH,KAAUyxC,GAAQ;AACxB,UAAI,CAACzxC,MAAWyH,GAAE,cAAczH,GAAQ,UAAW;AACnD,YAAMgL,KAAIhL,GAAQ,UACZkzC,KAAOlzC,GAAQ,aAAaA,GAAQ,QACpCiL,KAAI,KAAK,IAAIjL,GAAQ,SAAS,KAAK,IAAIkzC,IAAMzrC,GAAE,UAAUzH,GAAQ,OAAO,CAAC;AAC/E,MAAAA,GAAQ,IAAIgL,IACZhL,GAAQ,IAAIiL,IACZ0nC,GAAW3nC,IAAGC,EAAC,GACf4nC,GAAeprC,GAAE,OAAO;AAAA,IAC1B,GACM0rC,IAAO,CAAC1rC,OAAoB;AAChC,YAAMzH,KAAUyxC,GAAQ;AACxB,MAAI,CAACzxC,MAAWyH,GAAE,cAAczH,GAAQ,aACxCgzC,GAAA;AAAA,IACF;AACA,kBAAO,iBAAiB,eAAeC,CAAM,GAC7C,OAAO,iBAAiB,aAAaE,CAAI,GACzC,OAAO,iBAAiB,iBAAiBA,CAAI,GACtC,MAAM;AACX,aAAO,oBAAoB,eAAeF,CAAM,GAChD,OAAO,oBAAoB,aAAaE,CAAI,GAC5C,OAAO,oBAAoB,iBAAiBA,CAAI;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,EAAQvC,CAAK,CAAC;AAElB,QAAMwC,KAAY,CAACn0C,GAAgBwI,MAA6C;AAC9E,UAAMka,KAAMla,EAAE,cAAc,QAAQ,wBAAwB,GACtD4rC,KAAO/B,EAAa;AAC1B,QAAI,EAAE3vB,cAAe,gBAAgB,CAAC0xB,GAAM;AAC5C,UAAM92B,KAAOoF,GAAI,sBAAA,GACX2xB,KAAWD,GAAK,sBAAA,GAChB/E,KAAY/xB,GAAK,SAAS;AAChC,IAAA9U,EAAE,eAAA,GACFA,EAAE,gBAAA;AACF,UAAMrE,KAAkB;AAAA,MACtB,IAAInE,EAAM;AAAA,MACV,WAAWwI,EAAE;AAAA,MACb,SAASA,EAAE,UAAU8U,GAAK;AAAA,MAC1B,SAAS9U,EAAE,UAAU8U,GAAK;AAAA,MAC1B,OAAOA,GAAK;AAAA,MACZ,QAAQA,GAAK;AAAA,MACb,MAAMtd,EAAM;AAAA,MACZ,GAAGq0C,GAAS;AAAA,MACZ,GAAG/2B,GAAK;AAAA,MACR,SAAS+2B,GAAS;AAAA,MAClB,UAAUA,GAAS;AAAA,MACnB,YAAYA,GAAS;AAAA,MACrB,WAAAhF;AAAA,MACA,WAAWsD;AAAA,MACX,WAAWA,GAAa,QAAQ3yC,EAAM,EAAE;AAAA,IAAA;AAE1C,IAAAwyC,GAAQ,UAAUruC,IAClBytC,GAAQztC,EAAI,GACZ0tC,EAAac,GAAa,QAAQ3yC,EAAM,EAAE,CAAC,GAC3C+xC,GAAcY,EAAY;AAAA,EAC5B,GAEM2B,KACJ3C,KAAQnC,MAAa,OACjBF;AAAA,IACEqC,EAAK,UAAU,QAAQA,EAAK,EAAE;AAAA,IAC9BnC;AAAA,IACAmC,EAAK;AAAA,IACLA,EAAK;AAAA,EAAA,IAEP;AAEN,MAAI/C,EAAO,SAAS,QAAQ;AAC1B,UAAM2F,IAAiB,GAAQzB,KAAA,QAAAA,EAAS,gBAAgBA,KAAA,QAAAA,EAAS,eAC3D0B,IAAkB5F,EAAO,SAAS,UAAU2F,GAC5CE,KAAavC,OAAoBsC,KAAkB1B,KAAA,gBAAAA,EAAS,iBAAgB,OAAO,OACnF4B,MACJ7D,KAAA,gBAAAA,EAAM,SAAQjB,GAAYkD,KAAA,gBAAAA,EAAS,YAAY,KAAK,eAChD6B,KAAgB7B,IAAU7C,GAAW6C,EAAQ,EAAE,IAAI,GACnD8B,KACJ,CAAC7B,MAAiBnE,EAAO,SAAS,UAAU+F,KAAgB,GACxDE,KAAe9B,KAAgB,WAAW,UAC1C+B,KAAmB/B,KAAgB,cAAc;AAEvD,WACE,gBAAArwC,EAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,MAAA,CAACqwC,MACA,gBAAArwC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOsgC;AAAA,YACP,UAAUqO,KAAQ,CAACiC;AAAA,YACnB,UAAU,CAACxqC,MAAMooC,EAAQpoC,EAAE,OAAO,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MACzC,GACF;AAAA,MAEDgsC,IACC,gBAAA9xC,EAAC,OAAA,EAAI,WAAU,qDAAoD,UAAA;AAAA,QAAA;AAAA,0BAEhE,OAAA,EAAI,WAAU,kCACZ,UAAA+xC,MAAc,CAACzC,KACd,gBAAA5vC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,KAAKqyC;AAAA,YACL,MAAK5D,KAAA,gBAAAA,EAAM,UAAQiC,KAAA,gBAAAA,EAAS,SAAQ;AAAA,YACpC,SAAS,MAAMb,GAAiB,EAAI;AAAA,UAAA;AAAA,QAAA,IAGtC,gBAAA7vC,EAAC,OAAA,EAAI,WAAU,sCAAsC,cAAgB,GAEzE;AAAA,QACCyuC,IACC,gBAAAnuC,EAAC,QAAA,EAAK,WAAU,+BACb,UAAA;AAAA,UAAAmuC,EAAK;AAAA,UACLkC,KACG,MAAMpD,GAAYkB,EAAK,IAAI,CAAC,uBAC5B,MAAMlB,GAAYkB,EAAK,IAAI,CAAC;AAAA,QAAA,EAAA,CAClC,IACE;AAAA,QACFkC,KAKA,gBAAA3wC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,6HAGpC,IAPA,gBAAAA,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,uEAAA,CAEpC;AAAA,QAOF,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKgwC;AAAA,YACL,QAAM;AAAA,YACN,MAAK;AAAA,YACL,QAAO;AAAA,YACP,UAAUrB,KAAQU,MAAY,CAACuB;AAAA,YAC/B,UAAU,CAACxqC,MAAM;;AACf,cAAA0qC,KAAYhzC,IAAAsI,EAAE,OAAO,UAAT,gBAAAtI,EAAiB,OAAM,IAAI,GACvCsI,EAAE,OAAO,QAAQ;AAAA,YACnB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAApG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAU2uC,KAAQU,MAAY,CAACuB;AAAA,YAC/B,SAAS,MAAA;;AAAM,sBAAA9yC,IAAAkyC,EAAa,YAAb,gBAAAlyC,EAAsB;AAAA;AAAA,YAEpC,eAAgB,gBAAgB;AAAA,UAAA;AAAA,QAAA;AAAA,MACnC,EAAA,CACF,IAEA,gBAAAwC,EAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,QAAAqwC,KAAgB,aAAa;AAAA,QAC9B,gBAAArwC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA2uC,IAAW,YAAY;AAAA,cACvBR,IAAO,aAAa;AAAA,cACpBE,IAAO,YAAY;AAAA,YAAA,EAElB,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,YAAY,CAACvoC,MAAM;AACjB,cAAAA,EAAE,eAAA,GACGuoC,KAAMO,EAAY,EAAI;AAAA,YAC7B;AAAA,YACA,aAAa,MAAMA,EAAY,EAAK;AAAA,YACpC,QAAQ,CAAC9oC,MAAM;;AAGb,cAFAA,EAAE,eAAA,GACF8oC,EAAY,EAAK,GACb,EAAAP,KAAQ,CAACiC,OACbE,IAAYhzC,IAAAsI,EAAE,aAAa,UAAf,gBAAAtI,EAAuB,EAAE;AAAA,YACvC;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAkC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,UAAU2uC,KAAQU,MAAY,CAACuB;AAAA,kBAC/B,UAAU,CAACxqC,MAAM;;AACf,oBAAA0qC,KAAYhzC,IAAAsI,EAAE,OAAO,UAAT,gBAAAtI,EAAiB,OAAM,IAAI,GACvCsI,EAAE,OAAO,QAAQ;AAAA,kBACnB;AAAA,gBAAA;AAAA,cAAA;AAAA,gCAED,QAAA,EAAK,WAAU,gCACb,UAAAqoC,IAAOA,EAAK,OAAO,8BACtB;AAAA,gCACC,QAAA,EAAK,WAAU,+BACb,UAAAA,IACGkC,KACE,GAAGpD,GAAYkB,EAAK,IAAI,CAAC,uBACzB,GAAGlB,GAAYkB,EAAK,IAAI,CAAC,uBAC3B,WAAA,CACN;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAED,CAACkC,MAAiB,CAAC6B,KAClB,gBAAAlyC,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA;AAAA,UAAA;AAAA,UAET,gBAAAN,EAAC,UAAK,UAAA,SAAA,CAAM;AAAA,UAAO;AAAA,QAAA,EAAA,CAE9C,IACE;AAAA,MAAA,GACN;AAAA,MAEDwyC,KACC,gBAAAlyC,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,kCAAiC,UAAA;AAAA,UAAA;AAAA,UACjBiyC;AAAA,UAAc;AAAA,UACxCA,OAAkB,IAAI,KAAK;AAAA,UAAI;AAAA,QAAA,GAClC;AAAA,QACA,gBAAAjyC,EAAC,MAAA,EAAG,WAAU,iCACZ,UAAA;AAAA,UAAA,gBAAAN,EAAC,QAAG,UAAA,iIAAA,CAGJ;AAAA,UACA,gBAAAA,EAAC,QAAG,UAAA,0FAAA,CAGJ;AAAA,UACA,gBAAAA,EAAC,QAAG,UAAA,wHAAA,CAGJ;AAAA,4BACC,MAAA,EAAG,UAAA;AAAA,YAAA;AAAA,YACmD;AAAA,YACrD,gBAAAA,EAAC,UAAK,UAAA,SAAA,CAAM;AAAA,YAAO;AAAA,UAAA,GACrB;AAAA,UACA,gBAAAA,EAAC,QAAG,UAAA,0EAAA,CAEJ;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF,IACE;AAAA,MACH+uC,KAAY,QACX,gBAAAzuC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,iBAAeyuC;AAAA,UAEf,UAAA;AAAA,YAAA,gBAAA/uC,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG+uC,CAAQ,CAAC,CAAC,IAAA;AAAA,cAAI;AAAA,YAAA,GAE/D;AAAA,YACA,gBAAAzuC,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAA;AAAA,cAAAyuC;AAAA,cAAS;AAAA,YAAA,EAAA,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGjEF,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,MACjEwsC,EAAO,SAAS,UAAUkE,IACzB,gBAAA1wC,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,8BACZ,UAAA;AAAA,QAAAguC,KAAiBsC,KAChB,gBAAA5wC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAU2uC,KAAQU;AAAA,YAClB,SAAS,MAAMD,EAAmBsB,EAAQ,EAAE;AAAA,YAC7C,UAAA;AAAA,UAAA;AAAA,QAAA,IAGC;AAAA,QACJ,gBAAA1wC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UACE2uC,KACAU,MACA,CAACuB,MACAF,EAAQ,SAAS,aAAa,CAACpQ,EAAK,KAAA;AAAA,YAEvC,SAAS,MAAM,KAAK0Q,GAAA;AAAA,YAEnB,UAAArC,IACGI,KAAY,OACV,GAAG2D,EAAgB,IAAI3D,CAAQ,MAC/B,YACFN,IACEkC,KACE,kBACA,kBACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACR,GACF,EAAA,CACF,IAEA,gBAAA3wC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UACE2uC,KACAU,MACA,CAACuB,OACAD,KAAgB,CAAClC,IAAO,CAACnO,EAAK,KAAA,KAAU,CAACmO;AAAA,UAE5C,SAAS,MAAM,KAAKuC,GAAA;AAAA,UAEnB,UAAArC,IACGI,KAAY,OACV,GAAG2D,EAAgB,IAAI3D,CAAQ,MAC/B,GAAG2D,EAAgB,MACrBD;AAAA,QAAA;AAAA,MAAA,GAER;AAAA,MAEDrB,GAAA;AAAA,IAAkB,GACrB;AAAA,EAEJ;AAEA,SACE,gBAAA9wC,EAAC,OAAA,EAAI,WAAW,CAAC,oBAAoBivC,IAAO,kBAAkB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACxF,UAAA;AAAA,IAAA,gBAAAjvC,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,MAAAswC,MACC,gBAAA5wC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAMmuC,EAAe,EAAE,MAAM,aAAa;AAAA,UACpD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIFqC,GAAc,WAAW,IACxB,gBAAAxwC,EAAC,OAAE,WAAU,wBAAuB,UAAA,iBAAA,CAAc,IAElD,gBAAAM,EAAC,OAAA,EAAI,KAAK2vC,GAAc,WAAU,0BAC/B,UAAA;AAAA,QAAAO,GAAc,IAAI,CAAC5yC,MAClB,gBAAAoC;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,iBAAepC,EAAM;AAAA,YACrB,WAAU;AAAA,YAEV,UAAA,gBAAA0C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,mBACAivC,KAAA,gBAAAA,EAAM,QAAO3xC,EAAM,KAAK,mBAAmB;AAAA,kBAC3CuxC,MAAoBvxC,EAAM,KAAK,eAAe;AAAA,gBAAA,EAE7C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBAEV,UAAA;AAAA,kBAAAizC,KACC,gBAAA7wC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,OAAM;AAAA,sBACN,cAAY,WAAWpC,EAAM,IAAI;AAAA,sBACjC,SAAS,CAACwI,MAAMA,EAAE,gBAAA;AAAA,sBAClB,eAAe,CAACA,MAAM;AACpB,wBAAIA,EAAE,WAAW,KACjB2rC,GAAUn0C,GAAOwI,CAAC;AAAA,sBACpB;AAAA,sBAEA,4BAACsnC,IAAA,CAAA,CAAS;AAAA,oBAAA;AAAA,kBAAA,IAEV;AAAA,kBACJ,gBAAA1tC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM;AACb,wBAAIuvC,KACJwB,GAASnzC,CAAK;AAAA,sBAChB;AAAA,sBAEC,UAAAA,EAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAERyzC,GAAgBzzC,CAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACxB;AAAA,UAvCKA,EAAM;AAAA,QAAA,CAyCd;AAAA,QACAs0C,MAAW,OAAO,OACjB,gBAAAlyC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,KAAKkyC,GAAA;AAAA,UAAQ;AAAA,QAAA;AAAA,MACxB,EAAA,CAEJ;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAAlyC,EAAC,SAAI,WAAU,2BACZ,gBAAgBrC,KACf,gBAAAqC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA6uC,MAAoBxxC,GAAQ,KAAK,eAAe;AAAA,QAAA,EAE/C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QAEX,UAAA;AAAA,UAAA,gBAAAqC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM+wC,GAASpzC,EAAO;AAAA,cAChC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGA0zC,GAAgB1zC,EAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EAC1B,CACF,IACEizC,KACF,gBAAA5wC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAMmuC,EAAe,EAAE,MAAM,YAAY;AAAA,QACnD,UAAA;AAAA,MAAA;AAAA,IAAA,IAGC,KAAA,CACN;AAAA,IACCU,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,IACjEoxC,GAAA;AAAA,IACA7B,IACGoD;AAAA,MACE,gBAAAryC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK4vC;AAAA,UACL,WAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAMX,EAAK;AAAA,YACX,KAAKA,EAAK;AAAA,YACV,OAAOA,EAAK;AAAA,YACZ,QAAQA,EAAK;AAAA,UAAA;AAAA,UAGf,UAAA;AAAA,YAAA,gBAAAvvC,EAAC,UAAK,WAAU,0BAAyB,eAAY,QACnD,UAAA,gBAAAA,EAAC0tC,MAAS,EAAA,CACZ;AAAA,YACA,gBAAA1tC,EAAC,QAAA,EAAK,WAAU,0BAA0B,YAAK,MAAK;AAAA,YACpD,gBAAAA,EAAC,UAAK,WAAU,iCAAgC,eAAY,QAC1D,UAAA,gBAAAA,EAAC2tC,MAAU,EAAA,CACb;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,SAAS;AAAA,IAAA,IAEX;AAAA,EAAA,GACN;AAEJ;AC7yBA,SAASiF,KAAW;AAClB,SACE,gBAAA5yC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAAS6yC,KAAc;AACrB,SACE,gBAAA7yC,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,MAAM8yC,KAAiB;AAAA,EACrB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,eAAe;AACjB;AAEA,SAASC,KAAgB;AACvB,SACE,gBAAA/yC,EAAC,OAAA,EAAK,GAAG8yC,IACP,UAAA,gBAAA9yC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASgzC,KAAgB;AACvB,SACE,gBAAA1yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,sBAEhB,QAAA,EAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,MAAA,CAAM;AAAA,EAAA,GACnE;AAEJ;AAEA,SAASizC,KAAmB;AAC1B,SACE,gBAAA3yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,gBAAAA,EAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,EAAA,GACpD;AAEJ;AAEA,SAASkzC,KAAgB;AACvB,SACE,gBAAA5yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,IAAG;AAAA,QACH,QAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAEd,gBAAAA,EAAC,UAAK,GAAE,qBAAoB,QAAO,gBAAe,aAAY,OAAM,eAAc,QAAA,CAAQ;AAAA,EAAA,GAC5F;AAEJ;AAEA,SAASmzC,KAAoB;AAC3B,SACE,gBAAAnzC,EAAC,OAAA,EAAK,GAAG8yC,IACP,UAAA,gBAAA9yC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEnB;AAEJ;AAEA,SAASozC,KAAmB;AAC1B,SACE,gBAAA9yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC,EAAC,QAAA,EAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,QAAO,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC9F,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASqzC,KAAsB;AAC7B,SACE,gBAAA/yC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC,EAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,QAAO,gBAAe,aAAY,MAAA,CAAM;AAAA,IACtE,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,sBAEb,QAAA,EAAK,GAAE,eAAc,QAAO,gBAAe,aAAY,MAAA,CAAM;AAAA,EAAA,GAChE;AAEJ;AAEA,SAASszC,KAAkB;AACzB,SACE,gBAAAhzC,EAAC,OAAA,EAAK,GAAGwyC,IAAgB,SAAQ,aAC/B,UAAA;AAAA,IAAA,gBAAA9yC,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,QAAO,gBAAe,aAAY,MAAA,CAAM;AAAA,IACtE,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAASuzC,KAAgB;AACvB,SACE,gBAAAjzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,IAAG;AAAA,QACH,QAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAEd,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EAChB,GACF;AAEJ;AAEA,SAASwzC,KAAoB;AAC3B,SACE,gBAAAxzC,EAAC,OAAA,EAAK,GAAG8yC,IACP,UAAA,gBAAA9yC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,iBAAgB;AAAA,IAAA;AAAA,EAAA,GAEpB;AAEJ;AAEA,SAASyzC,KAAiB;AACxB,SACE,gBAAAnzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,IAAG;AAAA,QACH,QAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAEd,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAEA,SAAS0zC,KAAoB;AAC3B,SACE,gBAAApzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACvD,gBAAAA,EAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,IACtD,gBAAAA,EAAC,YAAO,IAAG,QAAO,IAAG,QAAO,GAAE,OAAM,MAAK,eAAA,CAAe;AAAA,EAAA,GAC1D;AAEJ;AAEA,SAAS2zC,KAA2B;AAClC,SACE,gBAAArzC,EAAC,OAAA,EAAK,GAAGwyC,IACP,UAAA;AAAA,IAAA,gBAAA9yC,EAAC,QAAA,EAAK,GAAE,OAAM,GAAE,KAAI,OAAM,MAAK,QAAO,KAAI,IAAG,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,IAC3F,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,MAAA;AAAA,IAAA;AAAA,IAEhB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB,GACF;AAEJ;AAsBA,MAAM4zC,KAA2B;AAAA,EAC/B;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMb;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMG;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAEZ,EAAE,WAAW,GAAA;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMN;AAAA,EAAA;AAAA,EAER,EAAE,WAAW,GAAA;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMC;AAAA,EAAA;AAEV,GAEMO,KAA8D;AAAA,EAClE,OAAO;AAAA,EACP,WAAW;AACb;AAEA,SAASC,GAAmBC,GAAmD;AAC7E,SAAO,eAAeA;AACxB;AAEA,SAASC,GAAiB52C,GAA8B;AACtD,QAAMsW,IAAOkgC,GAAS;AAAA,IACpB,CAACG,MAAgC,CAACD,GAAmBC,CAAK,KAAKA,EAAM,OAAO32C;AAAA,EAAA;AAE9E,UAAOsW,KAAA,gBAAAA,EAAM,UAASmgC,GAAsBz2C,CAAO,KAAKA;AAC1D;AAEA,MAAM62C,KAAsBC,GAAA,GAEtBC,KAA6D;AAAA,EACjE,CAAC,oBAAoB,aAAa;AAAA,EAClC,CAAC,eAAe,OAAO;AAAA,EACvB,CAAC,kBAAkB,eAAe;AAAA,EAClC,CAAC,sBAAsB,eAAe;AAAA,EACtC,CAAC,sBAAsB,eAAe;AACxC;AAEA,SAASC,GAAc;AAAA,EACrB,OAAA90B;AAAA,EACA,SAAA8lB;AAAA,EACA,UAAAiP;AACF,GAIG;AACD,SACE,gBAAA/zC,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,+BACb,UAAA;AAAA,MAAAgf;AAAA,MACA8lB,IAAU,gBAAAplC,EAACojC,IAAA,EAAiB,OAAA9jB,GAAc,SAAS8lB,GAAS,IAAK;AAAA,IAAA,GACpE;AAAA,IACCiP;AAAA,EAAA,GACH;AAEJ;AAEA,SAASC,GAAW;AAAA,EAClB,OAAAh1B;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAoI;AAAA,EACA,UAAAb;AAAA,EACA,SAAAuB;AACF,GAMG;AACD,QAAMJ,IAAc9mB,GAAmBoe,CAAK,KAAK,CAACA,EAAM,KAAA,GAClD,CAACkH,GAAK+B,CAAM,IAAI1jB,EAASmjB,IAAc,KAAK1I,CAAK;AAEvD,EAAAta,GAAU,MAAM;AACd,IAAAujB,EAAOP,IAAc,KAAK1I,CAAK;AAAA,EACjC,GAAG,CAAC0I,GAAa1I,CAAK,CAAC;AAEvB,QAAMkJ,IAAS,CAACzjC,MAAiB;AAC/B,QAAI,CAACA,EAAK,KAAA,KAAUmc,GAAmBnc,CAAI,GAAG;AAC5C,MAAAwjC,EAAO,EAAE,GACJP,KAAanB,EAASyB,EAAiB;AAC5C;AAAA,IACF;AACA,UAAMG,IAAanC,GAAkBvhC,CAAI;AACzC,QAAI,CAAC0jC,GAAY;AACf,MAAAF,EAAOP,IAAc,KAAK1I,CAAK;AAC/B;AAAA,IACF;AACA,IAAAiJ,EAAOE,CAAU,GACbA,MAAenJ,EAAM,YAAA,KAAiBmJ,MAAenJ,OAAgBmJ,CAAU;AAAA,EACrF;AAEA,SACE,gBAAAzlC,EAACo0C,IAAA,EAAc,OAAA90B,GAAc,SAAA8lB,GAC3B,UAAA,gBAAAplC;AAAA,IAACwkC;AAAA,IAAA;AAAA,MACC,OAAAllB;AAAA,MACA,KAAAkkB;AAAA,MACA,QAAQwB,IAAcM,KAAoBhJ;AAAA,MAC1C,UAAAoI;AAAA,MACA,aAAaa;AAAA,MACb,UAAU,MAAMC,EAAOhC,CAAG;AAAA,MAC1B,QAAQgC;AAAA,IAAA;AAAA,EAAA,GAEZ;AAEJ;AAEO,SAAS+O,GAAS;AAAA,EACvB,SAAAn3C;AAAA,EACA,iBAAAo3C;AAAA,EACA,OAAAtxB;AAAA,EACA,eAAAuxB;AAAA,EACA,iBAAA/qB;AAAA,EACA,kBAAAgrB;AAAA,EACA,eAAAtqB;AAAA,EACA,cAAAuqB;AAAA,EACA,aAAAC;AAAA,EACA,WAAAnrB,IAAY,CAAA;AAAA,EACZ,QAAAkhB,IAAS,CAAA;AAAA,EACT,WAAAuD;AAAA,EACA,aAAA2G;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,eAAA1G;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAwG;AAAA,EACA,OAAAn3B;AAAA,EACA,eAAAo3B;AAAA,EACA,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,wBAAAC,IAAyB;AAAA,EACzB,sBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,kBAAAC,KAAmB;AAAA,EACnB,mBAAAC;AAAA,EACA,QAAAC;AACF,GAAkB;AAChB,QAAM,CAACC,IAAcC,EAAe,IAAI/zB,EAAuB,EAAE,MAAM,QAAQ;AAE/E,EAAAG,GAAU,MAAM;AACd,IAAI5kB,MAAY,YAAUw4C,GAAgB,EAAE,MAAM,QAAQ;AAAA,EAC5D,GAAG,CAACx4C,CAAO,CAAC,GAEZ4kB;AAAA,IACE,MAAM,MAAM;AACV,MAAA2yB,KAAA,QAAAA,EAAe;AAAA,IACjB;AAAA,IACA,CAACv3C,GAASu3C,CAAY;AAAA,EAAA;AAGxB,QAAMkB,KAAW9zB;AAAA,IACf,MAAMyoB,GAAqBtnB,EAAM,QAAQA,EAAM,WAAW;AAAA,IAC1D,CAACA,EAAM,QAAQA,EAAM,WAAW;AAAA,EAAA,GAE5B4yB,KAAcD,GAAS,QACvBE,KAAgBF,GAAS,WACzBG,IAAcH,GAAS,QACvBI,IAAwBJ,GAAS,kBACjCK,KAA0BL,GAAS,qBACnCM,KAAwBN,GAAS,kBACjCO,KAAmBP,GAAS,YAC5BQ,KAAeR,GAAS,QACxBS,KAAyBT,GAAS,kBAClC3Y,KAAaha,EAAM,cAAc,CAAA,GACjCqzB,KAAkBnZ,GAAoBla,EAAM,QAAQ,aAAaA,EAAM,SAASga,EAAU,GAC1FsZ,KAAiBpZ,GAAoBla,EAAM,QAAQ,YAAYA,EAAM,SAASga,EAAU,GACxFuZ,KAAqBF,GAAgB;AAAA,IACzC,CAACvyC,MAAM,CAACi5B,GAAkBj5B,EAAE,IAAIkf,EAAM,SAASga,EAAU;AAAA,EAAA,GAErDwZ,IAAiB30B,GAAQ,MAAM;AACnC,UAAMgd,IAAQD;AAAA,MACZ5B;AAAA,MACAha,EAAM;AAAA,MACNA,EAAM;AAAA,MACNqzB;AAAA,IAAA,GAEIjK,IAAY,IAAI;AAAA,MACpBJ,GAAmBhpB,EAAM,MAAM,EAAE,IAAI,CAACtlB,GAAO2jB,OAAU,CAAC3jB,EAAM,IAAI2jB,EAAK,CAAC;AAAA,IAAA;AAE1E,WAAOwd,EAAM,MAAA,EAAQ,KAAK,CAACv7B,GAAGC,OAAM;AAClC,YAAM67B,KAAKgN,EAAU,IAAI9oC,EAAE,KAAK,OAAO,KAAK,OAAO,mBAC7C+7B,KAAK+M,EAAU,IAAI7oC,GAAE,KAAK,OAAO,KAAK,OAAO;AACnD,aAAI67B,OAAOC,KAAWD,KAAKC,KACpB/7B,EAAE,KAAK,IAAI,cAAcC,GAAE,KAAK,GAAG;AAAA,IAC5C,CAAC;AAAA,EACH,GAAG,CAACy5B,IAAYha,EAAM,SAASA,EAAM,OAAOA,EAAM,QAAQqzB,EAAe,CAAC,GACpEI,KAAkBH,GAAe;AAAA,IAAO,CAACxyC,MAC7Ci5B,GAAkBj5B,EAAE,IAAIkf,EAAM,SAASga,EAAU;AAAA,EAAA,GAE7C0Z,KAAoBJ,GAAe;AAAA,IACvC,CAACxyC,MAAM,CAACi5B,GAAkBj5B,EAAE,IAAIkf,EAAM,SAASga,EAAU;AAAA,EAAA,GAErD2Z,KAAiB90B;AAAA,IACrB,MAAM1B,GAAoB6C,EAAM,WAAW;AAAA,IAC3C,CAACA,EAAM,WAAW;AAAA,EAAA,GAEd9C,KAAe2B,GAAQ,MAAM;AACjC,UAAM+0B,wBAAa,IAAA;AACnB,eAAW53B,KAAYuK,GAAW;AAChC,YAAMpqB,IAAM6f,EAAS,KAAK,KAAA,EAAO,YAAA;AACjC43B,MAAAA,EAAO,IAAIz3C,IAAMy3C,EAAO,IAAIz3C,CAAG,KAAK,KAAK,CAAC;AAAA,IAC5C;AACA,WAAO,IAAI;AAAA,MACToqB,EAAU,IAAI,CAACvK,MAAa;AAC1B,cAAM63B,KACHD,EAAO,IAAI53B,EAAS,KAAK,OAAO,aAAa,KAAK,KAAK;AAC1D,eAAO;AAAA,UACLA,EAAS;AAAA,UACT83B,GAAoB93B,GAAU63B,CAAS;AAAA,QAAA;AAAA,MAE3C,CAAC;AAAA,IAAA;AAAA,EAEL,GAAG,CAACttB,CAAS,CAAC,GACRwtB,KAAcl1B;AAAA,IAClB,MAAM,IAAI,IAAImB,EAAM,UAAU,IAAI,CAACxP,MAAS,CAACA,EAAK,IAAIA,EAAK,IAAI,CAAC,CAAC;AAAA,IACjE,CAACwP,EAAM,SAAS;AAAA,EAAA,GAEZg0B,KAAYn1B;AAAA,IAChB,MAAM,IAAI,IAAI4oB,EAAO,IAAI,CAACj3B,MAAS,CAACA,EAAK,IAAIA,EAAK,IAAI,CAAC,CAAC;AAAA,IACxD,CAACi3B,CAAM;AAAA,EAAA,GAEHwM,KAAkB,CAAC9hC,MAKnB;;AACJ,UAAMwI,IAAag5B,GAAe,IAAIxhC,EAAM,EAAE;AAC9C,SAAIwI,KAAA,gBAAAA,EAAY,eAAc;AAC5B,aAAOuC,GAAa,IAAIvC,EAAW,UAAU,KAAK;AAEpD,SAAIA,KAAA,gBAAAA,EAAY,gBAAe,cAAaA,KAAA,gBAAAA,EAAY,cAAa,MAAM;AACzE,YAAMu5B,KACJv5B,EAAW,aAAa,OACpBo5B,GAAY,IAAIp5B,EAAW,SAAS,KAAK,OACzC,MACAw5B,MAAWv5C,IAAAw5C,GAAiBz5B,EAAW,eAAe,EAAE,MAA7C,gBAAA/f,EAAgD;AACjE,aAAOy5C,GAAoB15B,GAAYu5B,MAAeC,MAAY,IAAI;AAAA,IACxE;AACA,YAAIx5B,KAAA,gBAAAA,EAAY,gBAAe,YAAWA,KAAA,gBAAAA,EAAY,YAAW,OACxD25B;AAAA,MACL35B;AAAA,MACAA,EAAW,WAAW,OAClBq5B,GAAU,IAAIr5B,EAAW,OAAO,KAAK,OACrC;AAAA,IAAA,IAGJxI,EAAM,SAAS,YACbwI,KAAA,gBAAAA,EAAY,eAAc,iBAAuB,YAC9CnQ,KAAAmQ,KAAA,gBAAAA,EAAY,gBAAZ,gBAAAnQ,GAAyB,WAAU,OAErCyxB;AAAA,MACL9pB;AAAA,MACA6N,EAAM;AAAA,MACNA,EAAM;AAAA,MACNga;AAAA,MACAha,EAAM;AAAA,MACNA,EAAM;AAAA,IAAA;AAAA,EAEV,GACMu0B,KAAcv0B,EAAM,OAAO,KAAK,CAACkd,MAAMA,EAAE,OAAOqU,CAAa,GAC7DiD,KAAYx0B,EAAM,QAAQ,OAAO,CAAC1f,MAAMA,EAAE,YAAYixC,CAAa,EAAE,QACrE7M,KAAY,CAACthB;;AACjB,aAAAxoB,IAAAolB,EAAM,OAAO,KAAK,CAACkd,MAAMA,EAAE,OAAO9Z,CAAO,MAAzC,gBAAAxoB,EAA4C,SAAQ;AAAA,KAChDmwC,KAAmBlsB,GAAQ,MAAM;AACrC,UAAM+0B,IAAiC,CAAA;AACvC,eAAWzhC,KAAS6N,EAAM;AACxB,MAAI7N,EAAM,eACVyhC,EAAOzhC,EAAM,OAAO,KAAKyhC,EAAOzhC,EAAM,OAAO,KAAK,KAAK;AAEzD,WAAOyhC;AAAAA,EACT,GAAG,CAAC5zB,EAAM,MAAM,CAAC,GAEXy0B,KACJjD,MAAqBhrB,KAAmB,OAAO,CAACA,CAAe,IAAI,KAC/DkuB,KAAkB,CAACthC,MAAeqhC,GAAY,SAASrhC,CAAE,GACzDuhC,KACJ1C,KAA0B,OACtBxK,EAAO,KAAK,CAACj3B,MAASA,EAAK,OAAOyhC,CAAsB,KAAK,OAC7D,MACA2C,KACJ16C,MAAY,YAAYy6C,MAAwB,MAC5CE,IACJ/L,GAAqB5uC,GAASu6C,GAAY,MAAM,KAAKG;AACvD,EAAA91B,GAAU,MAAM;AACd,IAAI+1B,qBAAmC;AAAA,EACzC,GAAG,CAACA,GAAoBpD,CAAY,CAAC;AACrC,QAAMqD,KAAoB,MAAM;AAC9B,QAAIF,MAAuBD,IAAsB;AAC/C,YAAMI,IAAW5M;AAAA,QACfwM,GAAqB;AAAA,QACrB30B,EAAM;AAAA,MAAA,GAEFmmB,IAAS4O,IACX/0B,EAAM,OAAO,KAAK,CAAC5C,OAAQA,GAAI,OAAO23B,CAAQ,IAC9C;AACJ,aAAO;AAAA,QACL,KAAKJ,GAAqB,KAAK,UAAU,SAASA,GAAqB,EAAE;AAAA,QACzE,YAAWxO,KAAA,gBAAAA,EAAQ,QAAO;AAAA,MAAA;AAAA,IAE9B;AACA,QAAI,CAAC0O,KAAsBJ,GAAY,WAAW,EAAG,QAAO;AAC5D,UAAMtiC,IAAQ6N,EAAM,OAAO,KAAK,CAAC5C,MAAQA,EAAI,OAAOq3B,GAAY,CAAC,CAAC;AAClE,WAAKtiC,IACE,EAAE,KAAKA,EAAM,KAAK,WAAWuyB,GAAUvyB,EAAM,OAAO,EAAA,IADxC;AAAA,EAErB,GAAA,GACM6iC,KAAsB,CAAC5hC,GAAYuB,MAAiC;AACxE,IAAAu9B,MAAA,QAAAA,GAAuB,OACvBhrB,EAAc9T,GAAI,EAAE,UAAUuB,EAAM,UAAU,GAC9C+8B,KAAA,QAAAA;AAAA,EACF,GACMuD,KAAiB5M,GAAsBZ,GAAQznB,EAAM,WAAW,GAEhE4zB,KAA0C;AAAA,IAC9C,QAAQrK,GAAkBvpB,EAAM,MAAM;AAAA,IACtC,QAAQ4yB,GAAY,SAASG,EAAsB;AAAA,IACnD,WAAWF,GAAc,SAASG,GAAwB;AAAA,IAC1D,QACEF,EAAY,SAASG,GAAsB,SAASgC,GAAe;AAAA,IACrE,YAAY5B,GAAgB;AAAA,IAC5B,WAAWC,GAAe;AAAA,IAC1B,QAAQH,GAAa,SAASC,GAAuB;AAAA,IACrD,YAAYF,GAAiB;AAAA,EAAA,GAGzBgC,KAAkB,CACtBxjC,GACAyjC,GACAC,MAOA1jC,EAAO,WAAW,IAChB,gBAAA5U,EAAC,KAAA,EAAE,WAAU,wBAAwB,UAAAq4C,GAAM,IAE3ChM,GAAsBz3B,GAAQsO,EAAM,MAAM,EAAE,IAAI,CAAClf,OAAM;;AACrD,UAAMm9B,KAAOyK,GAAc;AAAA,MACzB,KAAK5nC,GAAE;AAAA,MACP,aAAWlG,KAAAw6C,KAAA,gBAAAA,EAAM,iBAAN,gBAAAx6C,GAAA,KAAAw6C,GAAqBt0C,QAAM+lC,GAAe/lC,GAAE,IAAI;AAAA,MAC3D,WAAW4jC,GAAU5jC,GAAE,OAAO;AAAA,MAC9B,cAAcmzC,GAAgBnzC,EAAC;AAAA,MAC/B,aAAas0C,KAAA,gBAAAA,EAAM;AAAA,IAAA,CACpB,GACKpe,KAAUoe,KAAA,QAAAA,EAAM,gBAClBhP;AAAA,MACAgP,EAAK;AAAA,MACL,EAAQA,EAAK;AAAA,MACbA,EAAK,oBAAoB16B,EAAM,uBAAuB;AAAA,IAAA,IAEtD;AACJ,WACE,gBAAAtd;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WACEs3C,GAAgB5zC,GAAE,EAAE,IAChB,kCACA;AAAA,QAEN,aAAa,CAAC6T,OAAU;AACtB,UAAIA,GAAM,YAAUA,GAAM,eAAA;AAAA,QAC5B;AAAA,QACA,cAAc,MAAM88B,KAAA,gBAAAA,EAAe3wC,GAAE;AAAA,QACrC,cAAc,MAAM2wC,KAAA,gBAAAA,EAAe;AAAA,QACnC,SAAS,CAAC98B,OAAUqgC,GAAoBl0C,GAAE,IAAI6T,EAAK;AAAA,QAElD,UAAA;AAAA,UAAAqiB,KACC,gBAAAl6B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WACEs4C,KAAA,QAAAA,EAAM,oBACF,yCACA;AAAA,cAEN,KAAKpe;AAAA,cACL,KAAI;AAAA,YAAA;AAAA,UAAA,IAEJ;AAAA,UACJ,gBAAA55B,EAAC,QAAA,EAAK,WAAU,4BACb,UAAA;AAAA,YAAA6gC,GAAK,QACJ,gBAAAnhC,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAmhC,GAAK,OAAM,IACtD;AAAA,YACJ,gBAAA7gC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WACEmhC,GAAK,QACD,2BACA;AAAA,kBAGL,UAAAA,GAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEPA,GAAK,KAAK,SAAS,IAClB,gBAAAnhC,EAAC,QAAA,EAAK,WAAU,wBACb,UAAAmhC,GAAK,KAAK,IAAI,CAACjiC,yBACb,QAAA,EAA4B,WAAU,uBACpC,UAAAA,GAAA,GADQ,GAAG8E,GAAE,EAAE,IAAI9E,EAAG,EAEzB,CACD,EAAA,CACH,IACE;AAAA,YAAA,EAAA,CACN;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MAjDK8E,GAAE;AAAA,IAAA;AAAA,EAoDb,CAAC,GAGCu0C,KAA0B,MAC9B7B,EAAe,IAAI,CAACjY,MAAS;AAC3B,UAAMplB,IAAQ6lB,GAA0BT,GAAMvb,EAAM,MAAM,GACpDs1B,IACJZ,GAAgBnZ,EAAK,KAAK,EAAE,KAAKmZ,GAAgBnZ,EAAK,GAAG,EAAE;AAC7D,WACE,gBAAAz+B;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WACEw4C,IACI,4DACA;AAAA,QAEN,aAAa,CAAC3gC,OAAU;AACtB,UAAIA,GAAM,YAAUA,GAAM,eAAA;AAAA,QAC5B;AAAA,QACA,cAAc,MAAM88B,KAAA,gBAAAA,EAAelW,EAAK,KAAK;AAAA,QAC7C,cAAc,MAAMkW,KAAA,gBAAAA,EAAe;AAAA,QACnC,SAAS,CAAC98B,OAAUqgC,GAAoBzZ,EAAK,KAAK,IAAI5mB,EAAK;AAAA,QAE3D,UAAA,gBAAA7X,EAAC,QAAA,EAAK,WAAU,4BACb,UAAAqZ,EAAM,IAAI,CAACG,OACV,gBAAAlZ,EAAC,QAAA,EAAwB,WAAU,4BACjC,UAAA;AAAA,UAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,uDACb,UAAAwZ,GAAK,KACR;AAAA,UACA,gBAAAxZ,EAAC,QAAA,EAAK,WAAU,wBACd,UAAA,gBAAAA,EAAC,UAAK,WAAU,uBAAuB,UAAAwZ,GAAK,UAAA,CAAU,EAAA,CACxD;AAAA,QAAA,KANSA,GAAK,OAOhB,CACD,EAAA,CACH;AAAA,MAAA;AAAA,MAzBKilB,EAAK;AAAA,IAAA;AAAA,EA4BhB,CAAC,GAEGga,KAA2B,CAC/BC,GACAC,GACAC,GACAC,OAEA,gBAAAv4C,EAAAq7B,IAAA,EACE,UAAA;AAAA,IAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,MAAA;AAAA,MAC5Bo4C,EAAa;AAAA,MAAO;AAAA,IAAA,GACjC;AAAA,IACCA,EAAa,SAAS,IACnBN,GAAgBM,GAAc,IAAI;AAAA,MAClC,cAAAE;AAAA,MACA,eAAAC;AAAA,MACA,mBAAmB;AAAA,IAAA,CACpB,IACC;AAAA,IACJ,gBAAAv4C,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,MAAA;AAAA,MAC1Bq4C,EAAe;AAAA,MAAO;AAAA,IAAA,GACrC;AAAA,IACCA,EAAe,SAAS,IACrBP,GAAgBO,GAAgB,IAAI;AAAA,MACpC,cAAAC;AAAA,MACA,eAAAC;AAAA,MACA,mBAAmB;AAAA,IAAA,CACpB,IACC;AAAA,EAAA,GACN;AAGF,SACE,gBAAAv4C,EAAC,SAAA,EAAM,WAAU,kBACd,UAAA;AAAA,IAAAlD,IACC,gBAAAkD,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,gBAAI5C,MAAY,YAAYu4C,GAAa,SAAS,QAAQ;AACxD,cAAAC,GAAgB,EAAE,MAAM,QAAQ;AAChC;AAAA,YACF;AACA,gBAAIkC,IAAqB;AACvB,cAAA1C,MAAA,QAAAA,GAAuB;AACvB;AAAA,YACF;AACA,gBAAI2C,GAAoB;AACtB,cAAA3tB,EAAc,IAAI,GAClBuqB,KAAA,QAAAA,EAAe;AACf;AAAA,YACF;AACA,YAAAH,EAAgB,IAAI;AAAA,UACtB;AAAA,UACA,cAAW;AAAA,UAEX,4BAAC5B,IAAA,CAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,MAEZ,gBAAA5yC,EAAC,SAAI,WAAU,gCACZ,gBAAY,WACXusC,GAAkBoJ,IAAczyB,EAAM,MAAM,IAC1C80B,IACF,gBAAAh4C,EAAC,UAAK,WAAU,yBAAyB,YAAiB,KAAI,IAE9Dg0C,GAAiB52C,CAAO,EAAA,CAE5B;AAAA,MACC46C,IACC,gBAAAh4C,EAAC,QAAA,EAAK,WAAU,uBAAuB,UAAAg4C,EAAiB,WAAU,IAChE;AAAA,IAAA,EAAA,CACN,IAEA,gBAAAh4C,EAAC,OAAA,EAAI,WAAU,0BACb,4BAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA,uBAAA,CAAoB,GACpE;AAAA,IAGF,gBAAAM,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,MAAA,CAAClD,KACA,gBAAA4C,EAAC,OAAA,EAAI,WAAU,uBAAsB,cAAW,eAC7C,UAAA4zC,GAAS;AAAA,QACR,CAACG,MACCyB,MACA1B,GAAmBC,CAAK,KACxBA,EAAM,OAAO;AAAA,MAAA,EACf,IAAI,CAACA,GAAOxyB,MAAU;AACtB,YAAIuyB,GAAmBC,CAAK;AAC1B,iBACE,gBAAA/zC;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cACV,MAAK;AAAA,YAAA;AAAA,YAFA,OAAOuhB,CAAK;AAAA,UAAA;AAMvB,cAAMze,IAAOixC,EAAM;AACnB,eACE,gBAAAzzC;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAMk0C,EAAgBT,EAAM,EAAE;AAAA,YAEvC,UAAA;AAAA,cAAA,gBAAA/zC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA,gBAAAA,EAAC8C,KAAK,GACR;AAAA,cACA,gBAAAxC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAA+zC,EAAM,OAAM;AAAA,gBACzD,gBAAA/zC,EAAC,QAAA,EAAK,WAAU,4BAA4B,YAAM,YAAA,CAAY;AAAA,cAAA,GAChE;AAAA,cACA,gBAAAM,EAAC,QAAA,EAAK,WAAU,4BACb,UAAA;AAAA,gBAAAyzC,EAAM,YAAY,OACjB,gBAAA/zC,EAAC,QAAA,EAAK,WAAU,6BACb,UAAA82C,GAAO/C,EAAM,QAAQ,EAAA,CACxB,IACE;AAAA,kCACHlB,IAAA,CAAA,CAAY;AAAA,cAAA,EAAA,CACf;AAAA,YAAA;AAAA,UAAA;AAAA,UAnBKkB,EAAM;AAAA,QAAA;AAAA,MAsBjB,CAAC,EAAA,CACH;AAAA,MAGD32C,MAAY,cACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAq1C,IAAa;AAAA,MAGxDj4C,MAAY,gBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAs1C,GAAgB;AAAA,MAG3Dl4C,MAAY,wBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAu1C,IAAuB;AAAA,MAGlEn4C,MAAY,kBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAy1C,GAAkB;AAAA,MAG7Dr4C,MAAY,YACX,gBAAA4C;AAAA,QAAC+tC;AAAA,QAAA;AAAA,UACC,QAAQ7qB,EAAM;AAAA,UACd,WAAWA,EAAM;AAAA,UACjB,kBAAA+qB;AAAA,UACA,WAAAC;AAAA,UACA,QAAQyH;AAAA,UACR,gBAAgBC;AAAA,UAChB,eACExH,IACI,OAAOjuB,MAAU;AACjB,kBAAM7J,IAAK,MAAM83B,EAAcjuB,CAAK;AACpC,mBAAAy1B,GAAgB,EAAE,MAAM,QAAQ,GACzBt/B;AAAA,UACT,IACE;AAAA,UAEN,eAAA+3B;AAAA,UACA,eAAAC;AAAA,UACA,iBAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAIHnxC,MAAY,YACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA+3C,IACG9C,IACAwD,GAAyB3C,IAAaG,CAAqB,EAAA,CACjE;AAAA,MAGD74C,MAAY,eACX,gBAAA4C,EAAC,SAAI,WAAU,2BACZ,cACGi1C,IACAwD;AAAA,QACA1C;AAAA,QACAG;AAAA,MAAA,GAEN;AAAA,MAGD94C,MAAY,YACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA+3C,IACG9C,IACAwD,GAAyBpC,IAAcC,EAAsB,EAAA,CACnE;AAAA,MAGDl5C,MAAY,gBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA+3C,IACC9C,IAEA,gBAAA30C,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,UAAA;AAAA,UAC1B81C,GAAiB;AAAA,UAAO;AAAA,QAAA,GACvC;AAAA,QACCgC;AAAA,UACChC;AAAA,UACA;AAAA,UACA,EAAE,aAAa,GAAA;AAAA,QAAK;AAAA,MACtB,EAAA,CACF,EAAA,CAEJ;AAAA,MAGDh5C,MAAY,gBACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA+3C,IACC9C,IAEA,gBAAA30C,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAA37B,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,yIAIpC;AAAA,QACA,gBAAAM,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,UAAA;AAAA,UAC5Bo2C,EAAe;AAAA,UAAO;AAAA,QAAA,GACnC;AAAA,QACCA,EAAe,SAAS,IAAI6B,GAAA,IAA4B;AAAA,QACzD,gBAAAj4C,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,UAAA;AAAA,UAC1Bm2C,GAAmB;AAAA,UAAO;AAAA,QAAA,GACzC;AAAA,QACCA,GAAmB,SAAS,IACzB2B,GAAgB3B,IAAoB,EAAE,IACtC;AAAA,MAAA,EAAA,CACN,EAAA,CAEJ;AAAA,MAGDr5C,MAAY,eACX,gBAAA4C,EAAC,SAAI,WAAU,2BACZ,cACCi1C,IAEAwD;AAAA,QACE9B;AAAA,QACAC;AAAA,QACA;AAAA,QACA;AAAA,MAAA,GAGN;AAAA,MAGDx5C,MAAY,YACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA83C,KACG5C,IACA6C,IACE9C,IAEA,gBAAA30C,EAAAq7B,IAAA,EACG,UAAA;AAAA,QAAA8c,GAAyBzC,GAAaG,EAAqB;AAAA,QAC3DgC,GAAe,SAAS,IACvB,gBAAA73C,EAAAq7B,IAAA,EACE,UAAA;AAAA,UAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA;AAAA,YAAA;AAAA,YACrB63C,GAAe;AAAA,YAAO;AAAA,UAAA,GAC1C;AAAA,UACA,gBAAAn4C,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,mIAIpC;AAAA,UACCm4C,GAAe,IAAI,CAAC1M,MAAU;AAC7B,kBAAMwM,IAAW5M;AAAA,cACfI,EAAM;AAAA,cACNvoB,EAAM;AAAA,YAAA,GAEFmmB,IAAS4O,IACX/0B,EAAM,OAAO,KAAK,CAAC5C,OAAQA,GAAI,OAAO23B,CAAQ,IAC9C,MACE9W,KAAOuK;AAAA,cACXD;AAAA,eACApC,KAAA,gBAAAA,EAAQ,QAAO;AAAA,YAAA;AAEjB,mBACE,gBAAArpC;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WACEm1C,MAA2B1J,EAAM,KAC7B,kCACA;AAAA,gBAEN,SAAS,MAAM;AACb,kBAAArhB,EAAc,IAAI,GAClBgrB,MAAA,QAAAA,GAAuB3J,EAAM;AAAA,gBAC/B;AAAA,gBAEA,UAAA,gBAAAnrC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,kBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BACb,UAAAmhC,GAAK,OACR;AAAA,kBACA,gBAAA7gC,EAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,oBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,0BACb,UAAAmhC,GAAK,IACR;AAAA,oBACA,gBAAAnhC,EAAC,UAAK,WAAU,wBACb,aAAK,KAAK,IAAI,CAACd,OACd,gBAAAc;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,WAAU;AAAA,wBAET,UAAAd;AAAA,sBAAA;AAAA,sBAHI,GAAGusC,EAAM,EAAE,IAAIvsC,EAAG;AAAA,oBAAA,CAK1B,EAAA,CACH;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,cA/BKusC,EAAM;AAAA,YAAA;AAAA,UAkCjB,CAAC;AAAA,QAAA,EAAA,CACH,IACE;AAAA,MAAA,EAAA,CACN,EAAA,CAER;AAAA,MAGDruC,MAAY,WACX,gBAAAkD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,mHAGpC;AAAA,QACA,gBAAAM,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,UAAAo3C;AAAA,UAAU;AAAA,UAAgBx0B,EAAM,MAAM;AAAA,UAAO;AAAA,QAAA,GAChD;AAAA,QACCgrB,KAAauG,KAAiB,QAC7B,gBAAAz0C,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM+0C,KAAA,gBAAAA,EAAcN,IAAgB,mCAEnE,EAAA,CACF;AAAA,MAAA,GAEJ;AAAA,MAGDr3C,MAAY,WACX,gBAAA4C,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAC60C,IAKA,gBAAAv0C,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAA37B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA,gBAAY;AAAA,QACrD,gBAAAA;AAAA,UAACo0C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,SACEx2B,EAAM,iBAAiBk7B,GAAc,eACjC,SACA,MAAM9D,EAAc,EAAE,cAAc8D,GAAc,aAAA,CAAc;AAAA,YAGtE,UAAA,gBAAA94C;AAAA,cAACupC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,OAAO3rB,EAAM;AAAA,gBACb,SAAS;AAAA,kBACP,EAAE,OAAO,eAAe,OAAO,cAAA;AAAA,kBAC/B,EAAE,OAAO,UAAU,OAAO,aAAA;AAAA,gBAAa;AAAA,gBAEzC,UAAU,CAAC7b,MACTizC,EAAc;AAAA,kBACZ,cAAcjzC,MAAS,WAAW,WAAW;AAAA,gBAAA,CAC9C;AAAA,cAAA;AAAA,YAAA;AAAA,UAEL;AAAA,QAAA;AAAA,QAGA;AAAA,UACE,CAAC,uBAAuB,QAAQ;AAAA,QAAA,EAElC,IAAI,CAAC,CAAC1C,GAAKigB,CAAK,MAAM;AACtB,gBAAMy5B,IAAQD,GAAcz5C,CAAG,GACzB25C,KAAa,CAACrV,GAAa/lB,EAAMve,CAAG,GAAG05C,CAAK;AAClD,iBACE,gBAAA/4C;AAAA,YAACs0C;AAAA,YAAA;AAAA,cAEC,OAAAh1B;AAAA,cACA,OAAO1B,EAAMve,CAAG;AAAA,cAChB,UAAU05C;AAAA,cACV,UAAU,CAACvV,OAAQwR,EAAc,EAAE,CAAC31C,CAAG,GAAGmkC,IAAK;AAAA,cAC/C,SACEwV,KACI,MAAMhE,EAAc,EAAE,CAAC31C,CAAG,GAAG05C,EAAA,CAAO,IACpC;AAAA,YAAA;AAAA,YARD15C;AAAA,UAAA;AAAA,QAYX,CAAC;AAAA,QACD,gBAAAW,EAACo0C,IAAA,EAAc,OAAM,iBACnB,UAAA,gBAAAp0C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,WAAU;AAAA,YACV,OAAO4d,EAAM;AAAA,YACb,cAAW;AAAA,YACX,UAAU,CAACxX,MACT4uC,EAAc,EAAE,cAAciE,GAAiB7yC,EAAE,OAAO,KAAK,EAAA,CAAG;AAAA,UAAA;AAAA,QAAA,GAGtE;AAAA,QACA,gBAAApG,EAAC,OAAA,EAAI,WAAU,4DAA2D,UAAA,kBAE1E;AAAA,QACA,gBAAAA;AAAA,UAACs0C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAO12B,EAAM;AAAA,YACb,UAAUk7B,GAAc;AAAA,YACxB,UAAU,CAACtV,MAAQwR,EAAc,EAAE,aAAaxR,GAAK;AAAA,YACrD,SACEG,GAAa/lB,EAAM,aAAak7B,GAAc,WAAW,IACrD,SACA,MACE9D,EAAc,EAAE,aAAa8D,GAAc,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,QAGlE,gBAAA94C;AAAA,UAACo0C;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,SACEx2B,EAAM,oBAAoBk7B,GAAc,kBACpC,SACA,MACE9D,EAAc;AAAA,cACZ,iBAAiB8D,GAAc;AAAA,YAAA,CAChC;AAAA,YAGT,UAAA,gBAAA94C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,WAAU;AAAA,gBACV,OAAO4d,EAAM;AAAA,gBACb,cAAW;AAAA,gBACX,UAAU,CAACxX,MACT4uC,EAAc;AAAA,kBACZ,iBAAiBkE,GAAoB9yC,EAAE,OAAO,KAAK;AAAA,gBAAA,CACpD;AAAA,cAAA;AAAA,YAAA;AAAA,UAEL;AAAA,QAAA;AAAA,QAEF,gBAAApG,EAAC,OAAA,EAAI,WAAU,4DAA2D,UAAA,oBAE1E;AAAA,QACCm0C,GAAqB,IAAI,CAAC,CAAC90C,GAAKigB,CAAK,MAAM;AAC1C,gBAAMy5B,IAAQ9E,GAAoB50C,CAAG,GAC/B25C,KAAa,CAACrV,GAAa/lB,EAAMve,CAAG,GAAG05C,CAAK;AAClD,iBACE,gBAAA/4C;AAAA,YAACs0C;AAAA,YAAA;AAAA,cAEC,OAAAh1B;AAAA,cACA,OAAO1B,EAAMve,CAAG;AAAA,cAChB,UAAU05C;AAAA,cACV,UAAU,CAACvV,OAAQwR,EAAc,EAAE,CAAC31C,CAAG,GAAGmkC,IAAK;AAAA,cAC/C,SACEwV,KACI,MAAMhE,EAAc,EAAE,CAAC31C,CAAG,GAAG05C,EAAA,CAAO,IACpC;AAAA,YAAA;AAAA,YARD15C;AAAA,UAAA;AAAA,QAYX,CAAC;AAAA,MAAA,EAAA,CACH,IA/HA,gBAAAW,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,mDAAA,CAEpC,EA6HA,CAEJ;AAAA,MAGD5C,MAAY,eACX,gBAAAkD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBACV,UAAAy3C,KACG,sBAAsBA,GAAY,IAAI,MACtC,8BAAA,CACN;AAAA,QACCxC;AAAA,MAAA,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IAECS;AAAA,EAAA,GACH;AAEJ;AC54CA,eAAeyD,GAAU/2B,GAAgC;;AACvD,QAAMpJ,KAAQ,MAAMoJ,EAAI,KAAA,GAAQ,KAAA;AAChC,MAAI;AACF,UAAMg3B,IAAO,KAAK,MAAMpgC,CAAI,GACtBqgC,KAAcv7C,IAAAs7C,KAAA,gBAAAA,EAAM,UAAN,gBAAAt7C,EAAa;AACjC,QAAI,OAAOu7C,KAAgB,YAAYA,EAAa,QAAOA;AAAA,EAC7D,QAAQ;AAAA,EAER;AACA,SAAOrgC,KAAQ,wBAAwBoJ,EAAI,MAAM;AACnD;AAEA,eAAek3B,GACbC,GACAC,GACAC,GACY;AACZ,QAAM96B,IAAO46B,EAAU,QAAQ,OAAO,EAAE,GAClCn3B,IAAM,MAAM,MAAM,GAAGzD,CAAI,GAAG66B,CAAI,IAAI;AAAA,IACxC,aAAa;AAAA,IACb,GAAGC;AAAA,IACH,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,GAAIA,KAAA,QAAAA,EAAM,OAAO,EAAE,gBAAgB,mBAAA,IAAuB,CAAA;AAAA,MAC1D,GAAGA,KAAA,gBAAAA,EAAM;AAAA,IAAA;AAAA,EACX,CACD;AACD,MAAI,CAACr3B,EAAI,GAAI,OAAM,IAAI,MAAM,MAAM+2B,GAAU/2B,CAAG,CAAC;AAGjD,MAFI,EAAAA,EAAI,WAAW,OAEf,EADOA,EAAI,QAAQ,IAAI,cAAc,KAAK,IACtC,SAAS,kBAAkB;AACnC,WAAQ,MAAMA,EAAI,KAAA;AACpB;AAMO,SAASs3B,GAAiB;AAAA,EAC/B,WAAAH;AAAA,EACA,UAAAI;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,qBAAAC;AACF,GAA0B;AACxB,QAAM,CAACC,GAAaC,CAAc,IAAIl4B,EAAS,EAAK,GAC9C,CAACm4B,GAAiBC,CAAkB,IAAIp4B,EAA0B,SAAS,GAC3E,CAACq4B,GAAQC,CAAS,IAAIt4B,EAAqC,IAAI,GAC/D,CAACu4B,GAAcC,CAAe,IAAIx4B,EAAS,EAAK,GAChD,CAACgC,GAASy2B,CAAU,IAAIz4B,EAAS,EAAK,GACtC,CAACgtB,GAAOC,CAAQ,IAAIjtB,EAAwB,IAAI;AAEtD,EAAAG,GAAU,MAAM;AACd,QAAI,CAACu3B,KAAa,CAACI,EAAU;AAC7B,QAAI13B,IAAY;AAChB,WAAA83B,EAAe,EAAK,GACpBE,EAAmB,SAAS,IACtB,YAAY;AAChB,UAAI;AACF,cAAM/9B,IAAO,MAAMo9B;AAAA,UACjBC;AAAA,UACA;AAAA,QAAA;AAEF,YAAIt3B,EAAW;AACf,aAAI/F,KAAA,gBAAAA,EAAM,kBAAiB,IAAM;AAC/B,UAAA69B,EAAe,EAAK,GACpBE,EAAmB,IAAI;AACvB;AAAA,QACF;AACA,QAAAF,EAAe,EAAI;AAAA,MACrB,QAAQ;AACN,QAAK93B,MACH83B,EAAe,EAAK,GACpBE,EAAmB,IAAI;AAEzB;AAAA,MACF;AACA,UAAI;AACF,cAAMM,IAAS,MAAMjB;AAAA,UACnBC;AAAA,UACA,kCAAkCI,CAAQ;AAAA,QAAA;AAE5C,YAAI13B,EAAW;AACf,QAAAg4B,EAAmBM,KAAA,QAAAA,EAAQ,mBAAmB,QAAQ,IAAI;AAAA,MAC5D,QAAQ;AACN,QAAKt4B,KAAWg4B,EAAmB,OAAO;AAAA,MAC5C;AAAA,IACF,GAAA,GACO,MAAM;AACX,MAAAh4B,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAACs3B,GAAWI,CAAQ,CAAC;AAExB,QAAMa,IAAajS,GAAY,MAAM;AACnC,IAAI1kB,KACA+1B,KAIE,CAHU,OAAO;AAAA,MACnB;AAAA,IAAA,MAIJ9K,EAAS,IAAI,GACbuL,EAAgB,EAAK,GACrBF,EAAU,QAAQ;AAAA,EACpB,GAAG,CAACt2B,GAAS+1B,CAAO,CAAC,GAEfa,IAAgBlS,GAAY,YAAY;AAC5C,QAAI,EAAA1kB,KAAW,CAAC01B,KAAa,CAACI,IAC9B;AAAA,MAAAW,EAAW,EAAI,GACfxL,EAAS,IAAI;AACb,UAAI;AACF,cAAMwK,GAASC,GAAW,6BAA6BI,CAAQ,IAAI;AAAA,UACjE,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,EAAE,aAAa,GAAG;AAAA,QAAA,CACxC,GACDQ,EAAU,IAAI,GACdN,KAAA,QAAAA,EAAsB;AAAA,MACxB,SAASzzC,GAAG;AACV,QAAA0oC,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,8BAA8B;AAAA,MAC1E,UAAA;AACE,QAAAk0C,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACX,GAAUE,GAAqBh2B,GAAS01B,CAAS,CAAC,GAEhDmB,IAAgBnS,GAAY,YAAY;AAC5C,QAAI,EAAA1kB,KAAW,CAACu2B,KAAgB,CAACb,KAAa,CAACI,IAC/C;AAAA,MAAAW,EAAW,EAAI,GACfxL,EAAS,IAAI;AACb,UAAI;AACF,cAAMwK,GAASC,GAAW,kCAAkCI,CAAQ,IAAI;AAAA,UACtE,QAAQ;AAAA,QAAA,CACT,GACDM,EAAmB,IAAI,GACvBE,EAAU,IAAI,GACdE,EAAgB,EAAK;AAAA,MACvB,SAASj0C,GAAG;AACV,QAAA0oC,EAAS1oC,aAAa,QAAQA,EAAE,UAAU,uCAAuC;AAAA,MACnF,UAAA;AACE,QAAAk0C,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACF,GAAcT,GAAU91B,GAAS01B,CAAS,CAAC,GAEzCoB,IAAab,MAAgBE,MAAoB,SAASA,MAAoB,UAC9EY,IAAad,KAAeE,MAAoB;AACtD,SAAI,CAACW,KAAc,CAACT,IAAe,OAGjC,gBAAA55C,EAAAq7B,IAAA,EACG,UAAA;AAAA,IAAAgf,sBACE,OAAA,EAAI,WAAU,0BACb,UAAA,gBAAAr6C,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU6jB;AAAA,UACV,SAAS22B;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGAI,IACC,gBAAA56C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU6jB;AAAA,UACV,SAAS,MAAM;AACb,YAAAirB,EAAS,IAAI,GACbuL,EAAgB,EAAK,GACrBF,EAAU,QAAQ;AAAA,UACpB;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA,IAGC;AAAA,IAAA,EAAA,CACN,GACF,IACE;AAAA,IAEHD,IACC,gBAAA55C,EAAC,OAAA,EAAI,WAAU,mBAAkB,MAAK,gBACpC,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAK6jB,KAASs2B,EAAU,IAAI;AAAA,UAC9B;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAA75C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,mBAAgB;AAAA,UAEhB,UAAA;AAAA,YAAA,gBAAAN,EAAC,MAAA,EAAG,WAAU,0BAAyB,IAAG,2BACvC,UAAAk6C,MAAW,WACR,iCACA,8CAAA,CACN;AAAA,YACCA,MAAW,WACV,gBAAA55C,EAAAq7B,IAAA,EACE,UAAA;AAAA,cAAA,gBAAA37B,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,yGAGvC;AAAA,cACA,gBAAAM,EAAC,MAAA,EAAG,WAAU,2BACZ,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAG,UAAA,+DAAA,CAA4D;AAAA,gBAChE,gBAAAA,EAAC,QAAG,UAAA,qEAAA,CAAkE;AAAA,gBACtE,gBAAAA,EAAC,QAAG,UAAA,6EAAA,CAA0E;AAAA,cAAA,EAAA,CAChF;AAAA,YAAA,EAAA,CACF,IAEA,gBAAAM,EAAAq7B,IAAA,EACE,UAAA;AAAA,cAAA,gBAAA37B,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,yJAGvC;AAAA,cACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA,oBAAgB;AAAA,cACxD,gBAAAM,EAAC,MAAA,EAAG,WAAU,2BACZ,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAG,UAAA,mDAAA,CAAgD;AAAA,gBACpD,gBAAAA,EAAC,QAAG,UAAA,0DAAA,CAAuD;AAAA,gBAC3D,gBAAAA,EAAC,QAAG,UAAA,0CAAA,CAAuC;AAAA,gBAC3C,gBAAAA,EAAC,QAAG,UAAA,4DAAA,CAAyD;AAAA,cAAA,GAC/D;AAAA,cACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA,wBAAoB;AAAA,cAC5D,gBAAAM,EAAC,MAAA,EAAG,WAAU,2BACZ,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAG,UAAA,oEAAA,CAAiE;AAAA,gBACrE,gBAAAA,EAAC,QAAG,UAAA,8DAAA,CAA2D;AAAA,cAAA,GACjE;AAAA,cACA,gBAAAM,EAAC,SAAA,EAAM,WAAU,0BACf,UAAA;AAAA,gBAAA,gBAAAN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASo6C;AAAA,oBACT,UAAUv2B;AAAA,oBACV,UAAU,CAACzd,MAAMi0C,EAAgBj0C,EAAE,OAAO,OAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEnD,gBAAApG,EAAC,UAAK,UAAA,8EAAA,CAEN;AAAA,cAAA,EAAA,CACF;AAAA,YAAA,GACF;AAAA,YAED6uC,IAAQ,gBAAA7uC,EAAC,OAAA,EAAI,WAAU,2BAA2B,aAAM,IAAS;AAAA,YAClE,gBAAAM,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU6jB;AAAA,kBACV,SAAS,MAAMs2B,EAAU,IAAI;AAAA,kBAC9B,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGAD,MAAW,WACV,gBAAAl6C;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU6jB;AAAA,kBACV,SAAS,MAAM,KAAK42B,EAAA;AAAA,kBAEnB,cAAU,eAAe;AAAA,gBAAA;AAAA,cAAA,IAG5B,gBAAAz6C;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU6jB,KAAW,CAACu2B;AAAA,kBACtB,SAAS,MAAM,KAAKM,EAAA;AAAA,kBAEnB,cAAU,cAAc;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC3B,EAAA,CAEJ;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF,IACE;AAAA,EAAA,GACN;AAEJ;AC1RO,SAASG,GAAiB;AAAA,EAC/B,OAAApP;AAAA,EACA,cAAAqP;AAAA,EACA,iBAAAC;AAAA,EACA,SAAA34C;AAAA,EACA,UAAA44C;AACF,GAMG;AACD,QAAMC,IAAWF,KAAmB,MAC9B1C,IAAQyC,EAAa,WAAW;AAEtC,SACE,gBAAAx6C,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,uLAIpC;AAAA,IACA,gBAAAA;AAAA,MAACupC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO0R,IAAW,OAAOF,CAAe,IAAI;AAAA,QAC5C,UAAU,CAAC34C,KAAWi2C;AAAA,QACtB,YAAYyC,EAAa,SAAS;AAAA,QAClC,aAAazC,IAAQ,+BAA+B;AAAA,QACpD,SAASyC;AAAA,QACT,UAAU,CAAC/4C,MAASi5C,EAASj5C,IAAO,OAAOA,CAAI,IAAI,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAEzD,gBAAA/B,EAAC,OAAA,EAAI,WAAU,6BACZ,eAAWi7C,IACV,gBAAAj7C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAMg7C,EAAS,IAAI;AAAA,QAC7B,UAAA;AAAA,MAAA;AAAA,IAAA,IAID,gBAAAh7C,EAAC,QAAA,CAAA,CAAK,EAAA,CAEV;AAAA,EAAA,GACF;AAEJ;AC/CA,MAAMk7C,KAA8C;AAAA,EAClD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAChB,GAGaC,KAAqB,mCACrBC,KAA0B;AAEhC,SAASC,GAAe1pC,GAAsB;AACnD,SAAOupC,GAAiBvpC,CAAiB,KAAKA,EAAK,QAAQ,MAAM,EAAE;AACrE;AAEO,SAAS2pC,GACdC,IAASH,IACD;AACR,QAAMI,IAAQ,IAAI,WAAWD,CAAM;AACnC,aAAW,OAAO,gBAAgBC,CAAK;AACvC,MAAI3yC,IAAM;AACV,WAASmB,IAAI,GAAGA,IAAIuxC,GAAQvxC;AAC1B,IAAAnB,KAAOsyC,GAAmBK,EAAMxxC,CAAC,IAAKmxC,GAAmB,MAAM;AAEjE,SAAOtyC;AACT;AASO,SAAS4yC,GACd7mC,GAKA0R,GACU;AACV,SAAO1R,EACJ,OAAO,CAACS,MAAUA,EAAM,YAAYiR,KAAW,CAACjR,EAAM,UAAU,EAChE,IAAI,CAACA,MAAUA,EAAM,GAAG;AAC7B;AAEO,SAASqmC,GACdl+C,GACAm+C,GACK;AACL,SAAOn+C,EAAO,OAAO,CAACI,MAAUA,EAAM,OAAO+9C,CAAc;AAC7D;AAMO,SAASC,GACdjqC,GACAkqC,GACAC,IAAuBR,IACf;AACR,QAAMS,IAASV,GAAe1pC,CAAI,GAC5B65B,IAAOqQ,aAAiB,MAAMA,IAAQ,IAAI,IAAIA,CAAK;AACzD,WAAS7xC,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3B,UAAM3K,IAAM,GAAG08C,CAAM,IAAID,GAAQ;AACjC,QAAI,CAACtQ,EAAK,IAAInsC,CAAG,EAAG,QAAOA;AAAA,EAC7B;AACA,MAAIuF,IAAI;AACR,SAAO4mC,EAAK,IAAI,GAAGuQ,CAAM,IAAIn3C,CAAC,EAAE,IAAG,CAAAA,KAAK;AACxC,SAAO,GAAGm3C,CAAM,IAAIn3C,CAAC;AACvB;AAEO,SAASo3C,GAAmBzwC,GAAwC;AACzE,SAAO;AAAA,IACL,OAAOA,EAAS,MAAM,IAAI,CAACiuC,OAAU,EAAE,GAAGA,EAAK,GAAG,QAAQA,EAAK,SAAS;AAAA,IACxE,UAAUjuC,EAAS,SAAS;AAAA,MAAI,CAACpH,MAC/BA,EAAK,IAAI,CAAC6I,OAAW,EAAE,GAAGA,EAAM,GAAG,GAAGA,EAAM,IAAI;AAAA,IAAA;AAAA,EAClD;AAEJ;AAEO,SAASivC,GAAoBz9B,GAYwB;AAC1D,QAAM,EAAE,OAAAnJ,GAAO,eAAA6mC,EAAA,IAAkB19B;AACjC,MAAI09B,MAAkB7mC,EAAM,QAAS,QAAO;AAC5C,QAAMwmC,IAAQJ,GAAqBj9B,EAAK,QAAQ09B,CAAa,GACvD5lC,IAAKkI,EAAK,QAAA,GACVnf,KAAOmf,EAAK,YAAYo9B,IAAevmC,EAAM,MAAMwmC,CAAK,GACxDj2B,IAAiB;AAAA,IACrB;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAAtP;AAAA,QACA,SAAS4lC;AAAA,QACT,KAAA78C;AAAA,QACA,MAAMgW,EAAM;AAAA,QACZ,UAAU2mC,GAAmB3mC,EAAM,QAAQ;AAAA,QAC3C,MAAM,EAAE,GAAGA,EAAM,KAAA;AAAA,QACjB,QAAQA,EAAM;AAAA,QACd,OAAO,EAAE,GAAGA,EAAM,MAAA;AAAA,QAClB,OAAO,EAAE,GAAGA,EAAM,MAAA;AAAA,QAClB,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAAA;AAAA,IAClB;AAAA,EACF;AAEF,SAAImJ,EAAK,cACPoH,EAAI,KAAK;AAAA,IACP,IAAI;AAAA,IACJ,YAAY,EAAE,GAAGpH,EAAK,YAAY,SAASlI,EAAA;AAAA,EAAG,CAC/C,GAEI,EAAE,KAAAsP,GAAK,SAAStP,GAAI,KAAAjX,EAAA;AAC7B;ACvHA,MAAM88C,KAA4C;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF;AAiBO,SAASC,GAAW;AAAA,EACzB,OAAA/mC;AAAA,EACA,YAAAwI;AAAA,EACA,WAAAuB;AAAA,EACA,WAAAqK;AAAA,EACA,QAAAkhB,IAAS,CAAA;AAAA,EACT,SAAAvoC;AAAA,EACA,mBAAAmkC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAA6V;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAzY;AAAA,EACA,SAAA0Y;AACF,GAAoB;AAClB,QAAM,CAACjW,GAAMkW,CAAO,IAAI36B;AAAA,IAA4B,MAClDhE,IACIyjB,GAAqBzjB,GAAYxI,EAAM,IAAI,IAC3CiyB,GAAqBjyB,EAAM,IAAIA,EAAM,IAAI;AAAA,EAAA,GAEzCuxB,IAAUlb,GAAO4a,CAAI;AAC3B,EAAAM,EAAQ,UAAUN,GAElBtkB,GAAU,MAAM;AACd,IAAAw6B;AAAA,MACE3+B,IACIyjB,GAAqBzjB,GAAYxI,EAAM,IAAI,IAC3CiyB,GAAqBjyB,EAAM,IAAIA,EAAM,IAAI;AAAA,IAAA;AAAA,EAEjD,GAAG,CAACA,GAAOwI,CAAU,CAAC;AAEtB,QAAM2nB,IAAS+C;AAAA,IACb,CAACxmC,MAA4B;AAE3B,MADAy6C,EAAQz6C,CAAI,GACPK,KACLyhC,EAASvC,GAAqBv/B,GAAMsT,EAAM,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,CAACjT,GAASyhC,GAAUxuB,EAAM,IAAI;AAAA,EAAA,GAG1BonC,IAAQlU;AAAA,IACZ,CAACC,MAAwC;AACvC,MAAAhD,EAAO,EAAE,GAAGoB,EAAQ,SAAS,SAASvxB,EAAM,IAAI,GAAGmzB,GAAS;AAAA,IAC9D;AAAA,IACA,CAAChD,GAAQnwB,EAAM,EAAE;AAAA,EAAA,GAGbqnC,IAAa36B,GAAQ,MAAM;AAC/B,UAAM+0B,wBAAa,IAAA;AACnB,eAAW53B,MAAYuK,GAAW;AAChC,YAAMpqB,KAAM6f,GAAS,KAAK,KAAA,EAAO,YAAA;AACjC,MAAA43B,EAAO,IAAIz3C,KAAMy3C,EAAO,IAAIz3C,EAAG,KAAK,KAAK,CAAC;AAAA,IAC5C;AACA,WAAOy3C;AAAA,EACT,GAAG,CAACrtB,CAAS,CAAC,GAERkzB,IAAkB56B;AAAA,IACtB,MACE0H,EAAU,IAAI,CAACvK,MAAa;AAC1B,YAAM63B,MACH2F,EAAW,IAAIx9B,EAAS,KAAK,OAAO,aAAa,KAAK,KAAK;AAC9D,aAAO;AAAA,QACL,OAAO,OAAOA,EAAS,EAAE;AAAA,QACzB,OAAO83B,GAAoB93B,GAAU63B,EAAS;AAAA,MAAA;AAAA,IAElD,CAAC;AAAA,IACH,CAAC2F,GAAYjzB,CAAS;AAAA,EAAA,GAGlBmzB,IAAiB76B,GAAQ,MAAM86B,GAAA,GAAwB,CAAA,CAAE,GACzDC,IACJC,GAAyBzW,EAAK,WAAWlnB,CAAS,KAClDknB,EAAK,eACL,IAEI0W,IAAmBj7B,GAAQ,MAAM;;AACrC,WAAIukB,EAAK,WAAW,OAAa,SAC1BxoC,IAAA6sC,EAAO,KAAK,CAACj3B,OAASA,GAAK,OAAO4yB,EAAK,OAAO,MAA9C,gBAAAxoC,EAAiD,SAAQ;AAAA,EAClE,GAAG,CAACwoC,EAAK,SAASqE,CAAM,CAAC,GAEnBjE,IAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,SAASJ,EAAK,SAAS,GACnBG,IACJH,EAAK,cAAc,WAAWA,EAAK,cAAc,YAC7C,eACA,cACA2W,KAAoBC;AAAA,IACxB5W;AAAA,IACA;AAAA,MACE,oBAAoB+V;AAAA,MACpB,kBAAkBC;AAAA,MAClB,sBAAsB9V;AAAA,MACtB,kBAAkBA;AAAA,IAAA;AAAA,IAEpBnxB,EAAM;AAAA,EAAA,GAGF8nC,KAAgB5S,GAAoBjE,CAAI;AAE9C,SAAK2D,GAAiB50B,EAAM,IAAI,IAG9B,gBAAA/U,EAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,IAAA+U,EAAM,SAAS,UAAUA,EAAM,SAAS,iBACvC,gBAAA/U,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAA37B;AAAA,QAACupC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAOjD,EAAK,cAAc,OAAO,OAAOA,EAAK,UAAU,IAAI;AAAA,UAC3D,UAAU,CAAClkC;AAAA,UACX,YAAU;AAAA,UACV,aAAY;AAAA,UACZ,SAASu6C;AAAA,UACT,UAAU,CAAC56C,MAAS;AAClB,kBAAMq7C,KAAar7C,IAAO,OAAOA,CAAI,IAAI,MACnCmd,KAAWuK,EAAU,KAAK,CAAC/V,OAASA,GAAK,OAAO0pC,EAAU,GAC1DC,IAAYlB,GAAmB,SAAS7V,EAAK,SAAS,IACxDA,EAAK,YACL;AACJ,YAAAmW,EAAM;AAAA,cACJ,YAAYW,KAAa,aAAa;AAAA,cACtC,YAAAA;AAAA,cACA,WAAW;AAAA,cACX,SAAS;AAAA,cACT,YAAYA,KAAa,aAAa;AAAA,cACtC,WAAAC;AAAA,cACA,aACEA,MAAc,iBACVn+B,MAAA,gBAAAA,GAAU,SAAQ,OAClBonB,EAAK;AAAA,cACX,gBACE+W,MAAc,iBACVn+B,MAAA,gBAAAA,GAAU,YAAWonB,EAAK,iBAC1BA,EAAK;AAAA,YAAA,CACZ;AAAA,UACH;AAAA,QAAA;AAAA,MAAA;AAAA,MAEDA,EAAK,cAAc,OAClB,gBAAAhmC,EAAC,OAAA,EAAI,WAAU,0BAAyB,MAAK,SAAQ,cAAW,WAC9D,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WACEsmC,EAAK,cAAc,gBAAgB,cAAc;AAAA,YAEnD,UAAU,CAAClkC;AAAA,YACX,SAAS,MAAM;AACb,oBAAM8c,IAAWuK,EAAU;AAAA,gBACzB,CAAC/V,OAASA,GAAK,OAAO4yB,EAAK;AAAA,cAAA;AAE7B,cAAAmW,EAAM;AAAA,gBACJ,WAAW;AAAA,gBACX,cAAav9B,KAAA,gBAAAA,EAAU,SAAQonB,EAAK;AAAA,cAAA,CACrC;AAAA,YACH;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAtmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WACEsmC,EAAK,cAAc,gBAAgB,cAAc;AAAA,YAEnD,UAAU,CAAClkC;AAAA,YACX,SAAS,MAAM;AACb,oBAAM8c,IAAWuK,EAAU;AAAA,gBACzB,CAAC/V,OAASA,GAAK,OAAO4yB,EAAK;AAAA,cAAA;AAE7B,cAAAmW,EAAM;AAAA,gBACJ,WAAW;AAAA,gBACX,iBACEv9B,KAAA,gBAAAA,EAAU,YAAWonB,EAAK;AAAA,cAAA,CAC7B;AAAA,YACH;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAtmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WACEsmC,EAAK,cAAc,gBAAgB,cAAc;AAAA,YAEnD,UAAU,CAAClkC;AAAA,YACX,SAAS,MAAMq6C,EAAM,EAAE,WAAW,eAAe;AAAA,YAClD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF,IACE;AAAA,MACHnW,EAAK,cAAc,QAAQA,EAAK,cAAc,gBAC7C,gBAAAhmC,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,UAAA;AAAA,UAEvC,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM;AAAA,cACN,UAAU,CAACoC;AAAA,cACX,OAAOkkC,EAAK,eAAe;AAAA,cAC3B,OAAO;AAAA,gBACL,WAAWrmB;AAAA,kBACTqmB,EAAK,SAASjxB,EAAM,MAAM;AAAA,gBAAA;AAAA,cAC5B;AAAA,cAEF,UAAU,CAACjP,MAAMq2C,EAAM,EAAE,aAAar2C,EAAE,OAAO,SAAS,KAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAChE,GACF;AAAA,QACA,gBAAApG;AAAA,UAAC+lC;AAAA,UAAA;AAAA,YACC,OAAOO,EAAK,SAASjxB,EAAM,MAAM,SAASioC;AAAA,YAC1C,UAAU,CAACl7C;AAAA,YACX,UAAU,CAAC4e,MAAsBy7B,EAAM,EAAE,OAAAz7B,GAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAClD,EAAA,CACF,IACE;AAAA,IAAA,EAAA,CACN,IACE;AAAA,IAEH3L,EAAM,SAAS,WACd,gBAAA/U,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,SAAI,WAAU,0BAAyB,MAAK,SAAQ,cAAW,kBAC9D,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWsmC,EAAK,cAAc,iBAAiB,cAAc;AAAA,YAC7D,UAAU,CAAClkC;AAAA,YACX,SAAS,MACPq6C,EAAM;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,YAAA,CACZ;AAAA,YAEJ,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAz8C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWsmC,EAAK,cAAc,iBAAiB,cAAc;AAAA,YAC7D,UAAU,CAAClkC;AAAA,YACX,SAAS,MACPq6C,EAAM;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,YAAA,CACZ;AAAA,YAEJ,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MACCnW,EAAK,cAAc,iBAClB,gBAAAhmC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAa;AAAA,YACb,YAAY;AAAA,YACZ,UAAU,CAACoC;AAAA,YACX,aAAY;AAAA,YACZ,cAAW;AAAA,YACX,OAAOkkC,EAAK,kBAAkB;AAAA,YAC9B,UAAU,CAAClgC,MACTq2C,EAAM;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,WAAW;AAAA,cACX,gBAAgBr2C,EAAE,OAAO,MAAM,SAASA,EAAE,OAAO,MAAM,SAAS;AAAA,YAAA,CACjE;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJkgC,EAAK,kBAAkB,CAACiX,GAAejX,EAAK,cAAc,IACzD,gBAAAtmC,EAAC,QAAA,EAAK,WAAU,wBAAuB,UAAA,gDAAA,CAEvC,IACE;AAAA,MAAA,EAAA,CACN,IAEA,gBAAAM,EAAAq7B,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,UAAA;AAAA,UAEvC,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM;AAAA,cACN,UAAU,CAACoC;AAAA,cACX,OAAOkkC,EAAK,eAAe;AAAA,cAC3B,OAAO;AAAA,gBACL,WAAWrmB;AAAA,kBACTqmB,EAAK,SAASjxB,EAAM,MAAM;AAAA,gBAAA;AAAA,cAC5B;AAAA,cAEF,UAAU,CAACjP,MACTq2C,EAAM;AAAA,gBACJ,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,aAAar2C,EAAE,OAAO,SAAS;AAAA,cAAA,CAChC;AAAA,YAAA;AAAA,UAAA;AAAA,QAEL,GACF;AAAA,QACA,gBAAApG;AAAA,UAAC+lC;AAAA,UAAA;AAAA,YACC,OAAOO,EAAK,SAASjxB,EAAM,MAAM,SAASioC;AAAA,YAC1C,UAAU,CAACl7C;AAAA,YACX,UAAU,CAAC4e,MAAsBy7B,EAAM,EAAE,OAAAz7B,GAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAClD,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ,IACE;AAAA,IAEH3L,EAAM,SAAS,YACd,gBAAArV;AAAA,MAACupC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAOuT;AAAA,QACP,UAAU,CAAC16C;AAAA,QACX,YAAU;AAAA,QACV,aAAY;AAAA,QACZ,SAASw6C;AAAA,QACT,UAAU,CAAC76C,MAAS;AAClB,gBAAMy7C,KAAYz7C,IACd07C,GAAwB17C,GAAMqd,CAAS,IACvC;AACJ,UAAAq9B,EAAM;AAAA,YACJ,YAAY16C,IAAO,YAAY;AAAA,YAC/B,WAAAy7C;AAAA,YACA,aAAaz7C,KAAQ;AAAA,YACrB,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,WAAW;AAAA,UAAA,CACZ;AAAA,QACH;AAAA,MAAA;AAAA,IAAA,IAEA;AAAA,IAEHsT,EAAM,SAAS,iBACd,gBAAArV;AAAA,MAAC09C;AAAA,MAAA;AAAA,QACC,OAAOpX,EAAK,eAAe0W,KAAoB;AAAA,QAC/C,UAAU,CAAC56C;AAAA,QACX,UAAU,CAACk+B,MAAS;AAClB,gBAAMqd,KAAUrd,EAAK,KAAA;AACrB,UAAAmc,EAAM;AAAA,YACJ,YAAYkB,KAAU,UAAU;AAAA,YAChC,SAASA,KAAUrX,EAAK,UAAU;AAAA,YAClC,aAAahG,MAAS,KAAK,OAAOA;AAAA,YAClC,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,WAAW;AAAA,UAAA,CACZ;AAAA,QACH;AAAA,MAAA;AAAA,IAAA,IAEA;AAAA,IAEJ,gBAAAtgC;AAAA,MAACqmC;AAAA,MAAA;AAAA,QACC,MAAAC;AAAA,QACA,SAAAlkC;AAAA,QACA,mBAAmBqnC;AAAA,UACjBp0B,EAAM;AAAA,UACNkxB;AAAA,QAAA;AAAA,QAEF,gBAAgB0W;AAAA,QAChB,gBAAAxW;AAAA,QACA,eAAAC;AAAA,QACA,SAAS+V;AAAA,MAAA;AAAA,IAAA;AAAA,IAEVr6C,IACC,gBAAApC,EAAC,OAAA,EAAI,WAAU,4DACb,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,UAAKm9C,MACLZ,EAAA;AAAA,QACF;AAAA,QACA,UAAU,CAACY;AAAA,QACZ,UAAA;AAAA,MAAA;AAAA,IAAA,GAGH,IACE;AAAA,EAAA,GACN,IA7RwC;AA+R5C;AAEA,SAASO,GAAe;AAAA,EACtB,OAAAphB;AAAA,EACA,UAAAn5B;AAAA,EACA,UAAA0gC;AACF,GAIG;AACD,SACE,gBAAAvjC,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,IAAA;AAAA,IAEvC,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAa;AAAA,QACb,YAAY;AAAA,QACZ,UAAAmD;AAAA,QACA,aAAY;AAAA,QACZ,cAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAAm5B;AAAA,QACA,UAAU,CAACl2B,MAAMy9B,EAASz9B,EAAE,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1C,GACF;AAEJ;AChcO,SAASw3C,GAAe;AAAA,EAC7B,QAAAhpC;AAAA,EACA,aAAA4U;AAAA,EACA,SAAApnB;AAAA,EACA,mBAAAmkC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAA6V;AAAA,EACA,gBAAAC;AAAA,EACA,SAAA3V;AACF,GASG;;AACD,QAAMzF,IAAOtsB,EACV,OAAO,CAACS,MAAU40B,GAAiB50B,EAAM,IAAI,CAAC,EAC9C,IAAI,CAACA,MAAU;AACd,UAAMoQ,IAAW+D,EAAY,KAAK,CAAClJ,MAAQA,EAAI,YAAYjL,EAAM,EAAE;AACnE,WAAOoQ,IACH6b,GAAqB7b,GAAUpQ,EAAM,IAAI,IACzCiyB,GAAqBjyB,EAAM,IAAIA,EAAM,IAAI;AAAA,EAC/C,CAAC,GACGwoC,IAASC,GAAoB5c,CAAI,GACjC6c,IAAmBnpC,EAAO,OAAO,CAACS,MAAU40B,GAAiB50B,EAAM,IAAI,CAAC,GACxE2oC,IACJD,EAAiB,SAAS,KAC1BA,EAAiB;AAAA,IACf,CAAC1oC,MAAUA,EAAM,SAAS,aAAaA,EAAM,SAAS;AAAA,EAAA,GAEpD4oC,IAAc,IAAI,IAAIF,EAAiB,IAAI,CAAC1oC,MAAUA,EAAM,IAAI,CAAC,GACjEoxB,IAAiBuX,IAAW,eAAe,cAC3Cf,IACJgB,EAAY,SAAS,IACjBf;AAAA,IACEhc,EAAK,CAAC;AAAA,IACN;AAAA,MACE,oBAAoBmb;AAAA,MACpB,kBAAkBC;AAAA,MAClB,sBAAsB9V;AAAA,MACtB,kBAAkBA;AAAA,IAAA;AAAA,KAEpB1oC,IAAAigD,EAAiB,CAAC,MAAlB,gBAAAjgD,EAAqB;AAAA,EAAA,IAEvB0oC,GACA0X,IACJD,EAAY,SAAS,IACjBxU,IAA0B/7B,IAAAqwC,EAAiB,CAAC,MAAlB,gBAAArwC,EAAqB,MAAM64B,CAAiB,IACtEA;AAEN,SACE,gBAAAjmC,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,SAAI,WAAU,0BACZ,UAAA4U,EAAO,IAAI,CAACS,MACX,gBAAArV,EAAC,QAAA,EAAoB,WAAU,yBAC5B,UAAAqV,EAAM,IAAA,GADEA,EAAM,EAEjB,CACD,GACH;AAAA,IACA,gBAAArV;AAAA,MAACm+C;AAAA,MAAA;AAAA,QACC,OAAON,EAAO;AAAA,QACd,UAAU,CAACz7C;AAAA,QACX,UAAU,CAACgX,MAASutB,EAAQ,EAAE,MAAAvtB,GAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAEtC,gBAAApZ;AAAA,MAACo+C;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOP,EAAO;AAAA,QACd,UAAUK;AAAA,QACV,OAAOL,EAAO;AAAA,QACd,UAAU,CAACz7C;AAAA,QACX,UAAU,CAAC+kC,MAAYR,EAAQ,EAAE,SAAAQ,GAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5C,gBAAAnnC;AAAA,MAACo+C;AAAA,MAAA;AAAA,QACC,OAAO3X;AAAA,QACP,OAAOoX,EAAO;AAAA,QACd,UAAUZ;AAAA,QACV,OAAOY,EAAO;AAAA,QACd,UAAU,CAACz7C;AAAA,QACX,UAAU,CAACglC,MAAcT,EAAQ,EAAE,WAAAS,GAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EAChD,GACF;AAEJ;AAEA,SAAS+W,GAAY;AAAA,EACnB,OAAA7hB;AAAA,EACA,UAAAn5B;AAAA,EACA,UAAA0hC;AACF,GAIG;AACD,QAAM,CAAC3hB,GAAO+gB,CAAQ,IAAIpiB,EAAS,MAAOya,MAAU,KAAK,KAAK,OAAOA,CAAK,CAAE,GACtE4H,IAAUxY,GAAO,EAAK;AAE5B,EAAA1J,GAAU,MAAM;AACd,IAAKkiB,EAAQ,WAASD,EAAS3H,MAAU,KAAK,KAAK,OAAOA,CAAK,CAAC;AAAA,EAClE,GAAG,CAACA,CAAK,CAAC;AAEV,QAAM+hB,IAAiB,CAAC7hB,GAAa6H,MAA+B;AAClE,QAAI,CAAC7H,EAAI,QAAQ;AACf,MAAAyH,EAAS,EAAE;AACX;AAAA,IACF;AACA,UAAMpG,IAAS0G,GAAsB/H,CAAG;AACxC,QAAI,CAACqB,EAAO,UAAU;AACpB,MAAAoG,EAASzH,CAAG;AACZ;AAAA,IACF;AACA,IAAAyH,EAAS,OAAOpG,EAAO,MAAM,CAAC,GAC9BgH,EAAShH,EAAO,MAAM,GAClBwG,KAAmBJ,EAAS,OAAOpG,EAAO,MAAM,CAAC;AAAA,EACvD,GAEM70B,IAAO,CAACuG,MAAkB;AAE9B,UAAMxN,KADOu6B,MAAU,KAAK5c,KAA0B4c,KAClC/sB;AACpB,IAAA00B,EAAS,OAAOliC,CAAI,CAAC,GACrB8iC,EAAS9iC,CAAI;AAAA,EACf;AAEA,SACE,gBAAAzB,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA0B,UAAA,QAAI;AAAA,sBAC7C,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAAmD;AAAA,UACA,cAAW;AAAA,UACX,SAAS,MAAM6F,EAAK,EAAE;AAAA,UACvB,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAhJ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAOkjB;AAAA,UACP,UAAA/f;AAAA,UACA,cAAW;AAAA,UACX,SAAS,MAAM;AACb,YAAA+gC,EAAQ,UAAU;AAAA,UACpB;AAAA,UACA,UAAU,CAAC99B,MAAMi4C,EAAej4C,EAAE,OAAO,OAAO,EAAK;AAAA,UACrD,QAAQ,MAAM;AACZ,YAAA89B,EAAQ,UAAU,IAClBma,EAAen7B,GAAO,EAAI;AAAA,UAC5B;AAAA,UACA,WAAW,CAAC9c,MAAM;AAChB,gBAAIA,EAAE,QAAQ,SAAS;AACrB,cAAAA,EAAE,eAAA,GACDA,EAAE,OAA4B,KAAA;AAC/B;AAAA,YACF;AAGA,gBAFIA,EAAE,QAAQ,aAAaA,EAAE,QAAQ,gBACrCA,EAAE,eAAA,GACEjD,GAAU;AACd,kBAAMoM,IAAQnJ,EAAE,QAAQ,YAAY,IAAI,IAClCy3B,IAAS0G,GAAsBrhB,CAAK,GAMpCnhB,KALO87B,EAAO,WAChBA,EAAO,SACPvB,MAAU,KACR5c,KACA4c,KACc/sB;AACpB,YAAA00B,EAAS,OAAOliC,CAAI,CAAC,GACrB8iC,EAAS9iC,CAAI;AAAA,UACf;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAA/B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAAmD;AAAA,UACA,cAAW;AAAA,UACX,SAAS,MAAM6F,EAAK,CAAC;AAAA,UACtB,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAEA,SAASo1C,GAAa;AAAA,EACpB,OAAA9+B;AAAA,EACA,OAAAgd;AAAA,EACA,UAAAoI;AAAA,EACA,OAAA4Z;AAAA,EACA,UAAAn7C;AAAA,EACA,UAAA0hC;AACF,GAOG;AACD,QAAMG,IAAc,CAACsZ,KAASpgC,GAAmBoe,CAAK,GAChD+I,IAAUiZ,IACZ,KACAtZ,IACEM,KACAhJ,EAAM,SACJA,IACAoI,GACFsU,IAAasF,KAAS,EAAQhiB,EAAM,QACpC,CAACkH,GAAK+B,CAAM,IAAI1jB,EAASmjB,IAAc,KAAKK,CAAO;AAEzD,EAAArjB,GAAU,MAAM;AACd,IAAAujB,EAAOP,IAAc,KAAKK,CAAO;AAAA,EACnC,GAAG,CAACA,GAASL,CAAW,CAAC;AAEzB,QAAMQ,IAAS,CAACzjC,MAAiB;AAC/B,QAAI,CAACA,EAAK,KAAA,KAAUmc,GAAmBnc,CAAI,GAAG;AAC5C,MAAAwjC,EAAO,EAAE,GACJ+Y,KAAOzZ,EAASS,EAAiB;AACtC;AAAA,IACF;AACA,UAAMG,IAAanC,GAAkBvhC,CAAI;AACzC,QAAI,CAAC0jC,GAAY;AACf,MAAAF,EAAOP,IAAc,KAAKK,CAAO;AACjC;AAAA,IACF;AACA,IAAAE,EAAOE,CAAU,GACjBZ,EAASY,CAAU;AAAA,EACrB;AAEA,SACE,gBAAAnlC,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,2BACb,UAAA;AAAA,MAAAgf;AAAA,MACA05B,IACC,gBAAAh5C;AAAA,QAACojC;AAAA,QAAA;AAAA,UACC,OAAA9jB;AAAA,UACA,UAAAnc;AAAA,UACA,SAAS,MAAM0hC,EAAS,IAAI;AAAA,QAAA;AAAA,MAAA,IAE5B;AAAA,IAAA,GACN;AAAA,IACA,gBAAA7kC;AAAA,MAACwkC;AAAA,MAAA;AAAA,QACC,OAAAllB;AAAA,QACA,KAAAkkB;AAAA,QACA,QAAQ6B;AAAA,QACR,UAAAX;AAAA,QACA,UAAAvhC;AAAA,QACA,oBAAoB,CAACm7C;AAAA,QACrB,aAAa/Y;AAAA,QACb,UAAU,MAAMC,EAAOhC,CAAG;AAAA,QAC1B,QAAQgC;AAAA,MAAA;AAAA,IAAA;AAAA,EACV,GACF;AAEJ;ACnRA,SAAS+Y,KAAU;AACjB,SACE,gBAAAv+C;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,eAAW;AAAA,MAEX,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IACjB;AAAA,EAAA;AAGN;AAEO,SAASw+C,GAAkB;AAAA,EAChC,cAAAC;AAAA,EACA,UAAAt7C,IAAW;AAAA,EACX,eAAAu7C;AACF,GAIG;AACD,QAAMC,IAASC,GAAA,GACTC,IAAYnzB,GAA0B,IAAI,GAC1CozB,IAAUpzB,GAAuB,IAAI,GACrC,CAAChZ,GAAMqsC,CAAO,IAAIl9B,EAAS,EAAK,GAChC,CAACgtB,GAAOC,CAAQ,IAAIjtB,EAAwB,IAAI,GAChD,CAACm9B,GAASC,CAAU,IAAIp9B,EAKpB,IAAI,GAERq9B,IAAQ3W,GAAY,MAAM;AAC9B,IAAAwW,EAAQ,EAAK,GACbE,EAAW,IAAI;AAAA,EACjB,GAAG,CAAA,CAAE,GAECE,IAAgB5W,GAAY,MAAM;AACtC,UAAMtpC,IAAK4/C,EAAU;AACrB,QAAI,CAAC5/C,EAAI;AACT,UAAMic,IAAOjc,EAAG,sBAAA,GACVmgD,IAAa,OAAO,cAAclkC,EAAK,SAAS,GAChDmkC,IAAankC,EAAK,MAAM,GACxBokC,IAAY,KAAK,IAAI,KAAK,KAAK,IAAIF,GAAYC,GAAY,GAAG,CAAC,GAC/DE,IAAYH,IAAa,OAAOC,IAAaD;AACnD,IAAAH,EAAW;AAAA,MACT,KAAKM,IAAY,KAAK,IAAI,GAAGrkC,EAAK,MAAMokC,IAAY,CAAC,IAAIpkC,EAAK,SAAS;AAAA,MACvE,MAAMA,EAAK;AAAA,MACX,OAAO,KAAK,IAAIA,EAAK,OAAO,GAAG;AAAA,MAC/B,WAAAokC;AAAA,IAAA,CACD;AAAA,EACH,GAAG,CAAA,CAAE,GAECE,IAAiBf,EAAa,IAAI,CAAC7gD,MAAUA,EAAM,EAAE,EAAE,KAAK,GAAG;AAiCrE,MAhCAokB,GAAU,MAAM;AACd,IAAA8sB,EAAS,IAAI,GACboQ,EAAA;AAAA,EACF,GAAG,CAACA,GAAOM,CAAc,CAAC,GAE1Bx9B,GAAU,MAAM;AACd,QAAI,CAACtP,EAAM;AACX,IAAAysC,EAAA;AACA,UAAMM,IAAQ,CAACr5C,MAAkB;;AAC/B,YAAM9D,IAAI8D,EAAE;AACZ,OAAItI,IAAA+gD,EAAU,YAAV,QAAA/gD,EAAmB,SAASwE,OAAMoL,IAAAoxC,EAAQ,YAAR,QAAApxC,EAAiB,SAASpL,MAChE48C,EAAA;AAAA,IACF,GACMjqB,IAAQ,CAAC7uB,MAAqB;;AAClC,MAAIA,EAAE,QAAQ,aACZ84C,EAAA,IACAphD,IAAA+gD,EAAU,YAAV,QAAA/gD,EAAmB;AAAA,IAEvB,GACM8zC,IAAS,MAAMuN,EAAA;AACrB,oBAAS,iBAAiB,aAAaM,CAAK,GAC5C,SAAS,iBAAiB,WAAWxqB,CAAK,GAC1C,OAAO,iBAAiB,UAAU2c,CAAM,GACxC,OAAO,iBAAiB,UAAUA,GAAQ,EAAI,GACvC,MAAM;AACX,eAAS,oBAAoB,aAAa6N,CAAK,GAC/C,SAAS,oBAAoB,WAAWxqB,CAAK,GAC7C,OAAO,oBAAoB,UAAU2c,CAAM,GAC3C,OAAO,oBAAoB,UAAUA,GAAQ,EAAI;AAAA,IACnD;AAAA,EACF,GAAG,CAACsN,GAAOxsC,GAAMysC,CAAa,CAAC,GAE3BV,EAAa,WAAW,EAAG,QAAO;AAEtC,QAAMiB,IACJhtC,KAAQssC,KAAW,CAAC77C,IAChBwvC;AAAA,IACE,gBAAA3yC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK8+C;AAAA,QACL,IAAIH;AAAA,QACJ,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAW;AAAA,QACX,OAAO;AAAA,UACL,KAAKK,EAAQ;AAAA,UACb,MAAMA,EAAQ;AAAA,UACd,OAAOA,EAAQ;AAAA,UACf,WAAWA,EAAQ;AAAA,QAAA;AAAA,QAGrB,UAAA,gBAAAh/C,EAAC,MAAA,EAAG,WAAU,0BACX,UAAAy+C,EAAa,IAAI,CAAC7gD,MACjB,gBAAAoC,EAAC,MAAA,EAAkB,MAAK,UACtB,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AACb,oBAAM2/C,IAAYjB,EAAc9gD,EAAM,EAAE;AACxC,cAAAkxC,EAAS6Q,CAAS,GACbA,KAAWT,EAAA;AAAA,YAClB;AAAA,YAEC,UAAAthD,EAAM;AAAA,UAAA;AAAA,QAAA,KAVFA,EAAM,EAYf,CACD,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,EAAA,IAEX;AAEN,SACE,gBAAA0C,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,IAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKu+C;AAAA,QACL,MAAK;AAAA,QACL,WACEnsC,IAAO,mCAAmC;AAAA,QAE5C,cAAW;AAAA,QACX,iBAAc;AAAA,QACd,iBAAeA;AAAA,QACf,iBAAeA,IAAOisC,IAAS;AAAA,QAC/B,UAAAx7C;AAAA,QACA,SAAS,MAAM;AACb,UAAIA,MACJ2rC,EAAS,IAAI,GACbiQ,EAAQ,CAACziB,MAAU,CAACA,CAAK;AAAA,QAC3B;AAAA,QACD,UAAA;AAAA,UAAA;AAAA,4BAEEiiB,IAAA,CAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEVmB;AAAA,IACA7Q,IACC,gBAAA7uC,EAAC,KAAA,EAAE,WAAU,wBAAuB,OAAO,EAAE,OAAO,UAAA,GACjD,UAAA6uC,EAAA,CACH,IACE;AAAA,EAAA,GACN;AAEJ;AC/JA,MAAM+Q,KAAgB;AAGf,SAASC,GAAiB;AAAA,EAC/B,OAAAvgC;AAAA,EACA,SAAAld;AAAA,EACA,gBAAAokC;AAAA,EACA,UAAA3C;AACF,GAKG;AACD,QAAM,CAACzqB,GAAM0mC,CAAO,IAAIj+B,EAASvC,EAAM,QAAQoX,EAAqB,GAC9D,CAAC3V,GAAQg/B,CAAS,IAAIl+B,EAASvC,EAAM,UAAU,CAAC,GAChD0gC,IAAUt0B,GAAOtS,CAAI,GACrB6mC,IAAYv0B,GAAO3K,CAAM;AAC/B,EAAAi/B,EAAQ,UAAU5mC,GAClB6mC,EAAU,UAAUl/B;AACpB,QAAM8lB,IAAYnb,GAAyC,EAAE;AAE7D,EAAA1J,GAAU,MAAM;AACd,IAAA89B,EAAQxgC,EAAM,QAAQoX,EAAqB,GAC3CqpB,EAAUzgC,EAAM,UAAU,CAAC;AAAA,EAC7B,GAAG,CAACA,CAAK,CAAC,GAEV0C;AAAA,IACE,MAAM,MAAM;AACT,aAAO,OAAO6kB,EAAU,OAAO,EAAe;AAAA,QAAQ,CAACvwB,MACtD,OAAO,cAAcA,CAAE;AAAA,MAAA;AAAA,IAE3B;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMkvB,IAAS+C;AAAA,IACb,CAACC,GAA8B8P,MAA8B;AAC3D,UAAI,CAACl2C,EAAS;AACd,YAAM89C,IAAW3lC,GAAkBiuB,EAAQ,QAAQwX,EAAQ,OAAO,GAC5DG,IAAa3X,EAAQ,UAAUyX,EAAU;AAC/C,MAAIzX,EAAQ,QAAQ,SAClBsX,EAAQI,CAAQ,GAChBF,EAAQ,UAAUE,IAEhB1X,EAAQ,UAAU,SACpBuX,EAAUI,CAAU,GACpBF,EAAU,UAAUE,IAEtBtc;AAAA,QACE;AAAA,UACE,GAAGvkB;AAAA,UACH,GAAGkpB;AAAA,UACH,MAAM0X;AAAA,UACN,QAAQC;AAAA,QAAA;AAAA,QAEV7H;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,CAACl2C,GAASkd,GAAOukB,CAAQ;AAAA,EAAA,GAGrBiD,IAAO,CAACznC,GAAckQ,MAAkB;AAC5C,QAAIlQ,MAAQ,QAAQ;AAClB,MAAAmmC,EAAO;AAAA,QACL,MAAMjrB,GAAkB6rB,GAAgB4Z,EAAQ,SAASzwC,CAAK,CAAC;AAAA,MAAA,CAChE;AACD;AAAA,IACF;AACA,IAAAi2B,EAAO,EAAE,QAAQY,GAAgB6Z,EAAU,SAAS1wC,CAAK,GAAG;AAAA,EAC9D,GAEMy3B,IAAW,CAAC3nC,MAAiB;AACjC,UAAMiX,IAAKuwB,EAAU,QAAQxnC,CAAG;AAChC,IAAIiX,MACF,OAAO,cAAcA,CAAE,GACvBuwB,EAAU,QAAQxnC,CAAG,IAAI;AAAA,EAE7B,GAEM0nC,IAAY,CAAC1nC,GAAckQ,MAAkB;AACjD,IAAAy3B,EAAS3nC,CAAG,GACZwnC,EAAU,QAAQxnC,CAAG,IAAI,OAAO,YAAY,MAAMynC,EAAKznC,GAAKkQ,CAAK,GAAG,GAAG;AAAA,EACzE,GAEMyK,IAAQsF,EAAM,SAAS;AAE7B,SACE,gBAAAhf,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAN;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOxqB;AAAA,QACP,UAAU,CAAChX;AAAA,QACX,UAAU,CAACL,MAASyjC,EAAO,EAAE,MAAM,KAAK,IAAIoa,IAAe79C,CAAI,GAAG;AAAA,QAClE,QAAQ,CAACwN,MAAUu3B,EAAK,QAAQv3B,CAAK;AAAA,QACrC,aAAa,CAACA,MAAUw3B,EAAU,QAAQx3B,CAAK;AAAA,QAC/C,WAAW,MAAMy3B,EAAS,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,gBAAAhnC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOnrB;AAAA,QACP,UAAUwsB;AAAA,QACV,UAAU,CAACpkC;AAAA,QACX,UAAU,CAACohC,MAAQgC,EAAO,EAAE,OAAOhC,KAAO,QAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEvD,gBAAAxjC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO7iB;AAAA,QACP,UAAU,CAAC3e;AAAA,QACX,OACE,gBAAApC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU,CAACoC;AAAA,YACX,SAAS,MAAMojC,EAAO,EAAE,QAAQU,GAAgB+Z,EAAU,OAAO,GAAG;AAAA,YAEpE,4BAACha,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,UAAU,CAAClkC,MAASyjC,EAAO,EAAE,QAAQzjC,GAAM;AAAA,QAC3C,QAAQ,CAACwN,MAAUu3B,EAAK,UAAUv3B,CAAK;AAAA,QACvC,aAAa,CAACA,MAAUw3B,EAAU,UAAUx3B,CAAK;AAAA,QACjD,WAAW,MAAMy3B,EAAS,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EACpC,GACF;AAEJ;AC1HA,MAAMoZ,KAAgB;AAGf,SAASC,GAAc;AAAA,EAC5B,OAAA/gC;AAAA,EACA,SAAAld;AAAA,EACA,gBAAAokC;AAAA,EACA,UAAA3C;AACF,GAKG;AACD,QAAM,CAAC7qB,GAAMsnC,CAAO,IAAIz+B,EAASvC,EAAM,QAAQ,EAAE,GAC3C,CAAClG,GAAM0mC,CAAO,IAAIj+B,EAASvC,EAAM,QAAQhH,EAAkB,GAC3D,CAACyI,GAAQg/B,CAAS,IAAIl+B,EAASvC,EAAM,UAAU,CAAC,GAChD0gC,IAAUt0B,GAAOtS,CAAI,GACrB6mC,IAAYv0B,GAAO3K,CAAM,GACzBw/B,IAAc70B,GAAO,EAAK;AAChC,EAAAs0B,EAAQ,UAAU5mC,GAClB6mC,EAAU,UAAUl/B;AACpB,QAAM8lB,IAAYnb,GAAyC,EAAE;AAE7D,EAAA1J,GAAU,MAAM;AACd,IAAKu+B,EAAY,WAASD,EAAQhhC,EAAM,QAAQ,EAAE,GAClDwgC,EAAQxgC,EAAM,QAAQhH,EAAkB,GACxCynC,EAAUzgC,EAAM,UAAU,CAAC;AAAA,EAC7B,GAAG,CAACA,CAAK,CAAC,GAEV0C;AAAA,IACE,MAAM,MAAM;AACT,aAAO,OAAO6kB,EAAU,OAAO,EAAe;AAAA,QAAQ,CAACvwB,MACtD,OAAO,cAAcA,CAAE;AAAA,MAAA;AAAA,IAE3B;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMkvB,IAAS+C;AAAA,IACb,CAACC,GAA8B8P,MAA8B;AAC3D,UAAI,CAACl2C,EAAS;AACd,YAAM89C,IAAW,KAAK,IAAIE,IAAe5X,EAAQ,QAAQwX,EAAQ,OAAO,GAClEG,IAAa3X,EAAQ,UAAUyX,EAAU;AAC/C,MAAIzX,EAAQ,QAAQ,SAClBsX,EAAQI,CAAQ,GAChBF,EAAQ,UAAUE,IAEhB1X,EAAQ,UAAU,SACpBuX,EAAUI,CAAU,GACpBF,EAAU,UAAUE;AAEtB,YAAMK,IACJhY,EAAQ,SAAS,SACbxvB,IACAwvB,EAAQ,SAAS,KACdlpB,EAAM,QAAQjH,KACfmwB,EAAQ;AAChB,MAAA3E;AAAA,QACE;AAAA,UACE,GAAGvkB;AAAA,UACH,GAAGkpB;AAAA,UACH,MAAMgY;AAAA,UACN,MAAMN;AAAA,UACN,QAAQC;AAAA,QAAA;AAAA,QAEV7H;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,CAACl2C,GAASkd,GAAOukB,GAAU7qB,CAAI;AAAA,EAAA,GAG3B8tB,IAAO,CAACznC,GAAckQ,MAAkB;AAC5C,QAAIlQ,MAAQ,QAAQ;AAClB,MAAAmmC,EAAO;AAAA,QACL,MAAM,KAAK,IAAI4a,IAAeha,GAAgB4Z,EAAQ,SAASzwC,CAAK,CAAC;AAAA,MAAA,CACtE;AACD;AAAA,IACF;AACA,IAAAi2B,EAAO,EAAE,QAAQY,GAAgB6Z,EAAU,SAAS1wC,CAAK,GAAG;AAAA,EAC9D,GAEMy3B,IAAW,CAAC3nC,MAAiB;AACjC,UAAMiX,IAAKuwB,EAAU,QAAQxnC,CAAG;AAChC,IAAIiX,MACF,OAAO,cAAcA,CAAE,GACvBuwB,EAAU,QAAQxnC,CAAG,IAAI;AAAA,EAE7B,GAEM0nC,IAAY,CAAC1nC,GAAckQ,MAAkB;AACjD,IAAAy3B,EAAS3nC,CAAG,GACZwnC,EAAU,QAAQxnC,CAAG,IAAI,OAAO,YAAY,MAAMynC,EAAKznC,GAAKkQ,CAAK,GAAG,GAAG;AAAA,EACzE,GAEMyK,IAAQsF,EAAM,SAAS;AAE7B,SACE,gBAAAhf,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,MAAA;AAAA,MAEvC,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAOgZ;AAAA,UACP,UAAU,CAAC5W;AAAA,UACX,aAAY;AAAA,UACZ,cAAW;AAAA,UACX,OAAO,EAAE,WAAWkd,EAAM,SAASg+B,GAAA;AAAA,UACnC,SAAS,MAAM;AACb,YAAAiD,EAAY,UAAU;AAAA,UACxB;AAAA,UACA,UAAU,CAACn6C,MAAM;AACf,kBAAMrE,IAAOqE,EAAE,OAAO;AACtB,YAAAk6C,EAAQv+C,CAAI,GACZyjC,EAAO,EAAE,MAAMzjC,EAAA,GAAQ,EAAE,MAAM,IAAM;AAAA,UACvC;AAAA,UACA,QAAQ,MAAM;AACZ,YAAAw+C,EAAY,UAAU;AACtB,kBAAMx+C,IAAOiX,EAAK,KAAA;AAClB,YAAIjX,MAASiX,KAAMsnC,EAAQv+C,CAAI,GAC/ByjC,EAAO,EAAE,MAAMzjC,KAAQsW,GAAA,CAAoB;AAAA,UAC7C;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,GACF;AAAA,IACA,gBAAArY;AAAA,MAAC+lC;AAAA,MAAA;AAAA,QACC,OAAOzmB,EAAM;AAAA,QACb,UAAU,CAACld;AAAA,QACX,UAAU,CAAC4e,MAAsBwkB,EAAO,EAAE,OAAAxkB,GAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAEnD,gBAAAhhB;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOxqB;AAAA,QACP,UAAU,CAAChX;AAAA,QACX,UAAU,CAACL,MAASyjC,EAAO,EAAE,MAAM,KAAK,IAAI4a,IAAer+C,CAAI,GAAG;AAAA,QAClE,QAAQ,CAACwN,MAAUu3B,EAAK,QAAQv3B,CAAK;AAAA,QACrC,aAAa,CAACA,MAAUw3B,EAAU,QAAQx3B,CAAK;AAAA,QAC/C,WAAW,MAAMy3B,EAAS,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,gBAAAhnC;AAAA,MAACmlC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOnrB;AAAA,QACP,UAAUwsB;AAAA,QACV,UAAU,CAACpkC;AAAA,QACX,UAAU,CAACohC,MAAQgC,EAAO,EAAE,OAAOhC,KAAO,QAAW;AAAA,QACrD,SAASxpB,IAAQ,MAAMwrB,EAAO,EAAE,OAAO,OAAA,CAAW,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAExD,gBAAAxlC;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO7iB;AAAA,QACP,UAAU,CAAC3e;AAAA,QACX,OACE,gBAAApC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU,CAACoC;AAAA,YACX,SAAS,MAAMojC,EAAO,EAAE,QAAQU,GAAgB+Z,EAAU,OAAO,GAAG;AAAA,YAEpE,4BAACha,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,UAAU,CAAClkC,MAASyjC,EAAO,EAAE,QAAQzjC,GAAM;AAAA,QAC3C,QAAQ,CAACwN,MAAUu3B,EAAK,UAAUv3B,CAAK;AAAA,QACvC,aAAa,CAACA,MAAUw3B,EAAU,UAAUx3B,CAAK;AAAA,QACjD,WAAW,MAAMy3B,EAAS,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EACpC,GACF;AAEJ;AClIO,SAASyZ,GAAU;AAAA,EACxB,OAAAprC;AAAA,EACA,YAAAwI;AAAA,EACA,WAAAuB;AAAA,EACA,WAAAqK,IAAY,CAAA;AAAA,EACZ,QAAAkhB,IAAS,CAAA;AAAA,EACT,gBAAA+V,IAAiB,CAAA;AAAA,EACjB,SAAAt+C;AAAA,EACA,gBAAAu+C,IAAiB;AAAA,EACjB,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAArC;AAAA,EACA,QAAAlhD,IAAS,CAAA;AAAA,EACT,UAAAwjD;AAAA,EACA,mBAAAC;AAAA,EACA,kBAAAvZ;AAAA,EACA,eAAAwZ;AAAA,EACA,gBAAAC,IAAiB,CAAA;AAAA,EACjB,qBAAAC,IAAsB,CAAA;AAAA,EACtB,cAAAC;AAAA,EACA,mBAAA9a;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAA6V;AAAA,EACA,gBAAAC;AACF,GAAmB;AACjB,QAAM,CAACj9C,IAAKiiD,CAAM,IAAIz/B,GAASxM,KAAA,gBAAAA,EAAO,QAAO,EAAE,GACzC,CAACksC,IAAUC,EAAW,IAAI3/B,EAAwB,IAAI,GACtD,CAAC4/B,GAAYC,EAAa,IAAI7/B,EAAwB,IAAI;AAQhE,MANAG,GAAU,MAAM;AACd,IAAAs/B,GAAOjsC,KAAA,gBAAAA,EAAO,QAAO,EAAE,GACvBmsC,GAAY,IAAI,GAChBE,GAAc,IAAI;AAAA,EACpB,GAAG,CAACrsC,GAAOwI,CAAU,CAAC,GAElB8iC,KAAkBQ,EAAe,SAAS,KAAKE;AACjD,WACE,gBAAArhD,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA,gBAAAA;AAAA,MAAC49C;AAAA,MAAA;AAAA,QAEC,QAAQuD;AAAA,QACR,aAAaC;AAAA,QACb,SAAAh/C;AAAA,QACA,mBAAAmkC;AAAA,QACA,gBAAAC;AAAA,QACA,kBAAA6V;AAAA,QACA,gBAAAC;AAAA,QACA,SAAS+E;AAAA,MAAA;AAAA,MARJF,EAAe,IAAI,CAACztC,OAASA,GAAK,EAAE,EAAE,KAAK,GAAG;AAAA,IAAA,GAUvD;AAIJ,MAAI,CAAC2B;AACH,WAAI,CAACsrC,KAAkB,CAACC,IAAkB,OAExC,gBAAA5gD,EAAC,OAAA,EAAI,WAAU,8BACZ,UAAA4gD,GACH;AAIJ,QAAMe,KAAe,MAAM;AACzB,QAAI,CAACtiD,MAAOA,OAAQgW,EAAM,KAAK;AAC7B,MAAAmsC,GAAY,IAAI;AAChB;AAAA,IACF;AACA,QAAId,EAAe,SAASrhD,EAAG,GAAG;AAChC,MAAAmiD,GAAY,wCAAwC;AACpD;AAAA,IACF;AACA,IAAAA,GAAY,IAAI,GAChBX,EAASxhD,EAAG;AAAA,EACd,GAEMuiD,KAAmBlG,GAAsBl+C,GAAQ6X,EAAM,OAAO,GAC9DwsC,KACJ,CAAClB,KACDv+C,KACAs8C,KACAkD,GAAiB,SAAS,IACxB,gBAAA5hD;AAAA,IAACw+C;AAAA,IAAA;AAAA,MACC,cAAcoD;AAAA,MACd,eAAAlD;AAAA,IAAA;AAAA,EAAA,IAEA;AAEN,SAAIiC,IAEA,gBAAArgD,EAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,IAAA+U,EAAM,iBACL,gBAAArV,EAAC,KAAA,EAAE,WAAU,wBAAuB,iFAEpC,IACE;AAAA,IACHiqC,GAAiB50B,EAAM,IAAI,IAC1B,gBAAArV;AAAA,MAACo8C;AAAA,MAAA;AAAA,QACC,OAAA/mC;AAAA,QACA,YAAAwI;AAAA,QACA,WAAAuB;AAAA,QACA,WAAAqK;AAAA,QACA,QAAAkhB;AAAA,QACA,SAAAvoC;AAAA,QACA,mBAAAmkC;AAAA,QACA,gBAAAC;AAAA,QACA,kBAAA6V;AAAA,QACA,gBAAAC;AAAA,QACA,UAAU5U;AAAA,QACV,SAAS,MAAMuZ,KAAA,gBAAAA;AAAA,MAAoB;AAAA,IAAA,IAEnC;AAAA,EAAA,GACN,IAKF,gBAAA3gD,EAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,IAAA8Z,GAAe/E,CAAK,IACnB6rC,IACE,gBAAAlhD;AAAA,MAAC6/C;AAAA,MAAA;AAAA,QACC,OAAOxqC,EAAM;AAAA,QACb,SAAAjT;AAAA,QACA,gBAAAokC;AAAA,QACA,UAAU0a;AAAA,MAAA;AAAA,IAAA,IAEV,OACF7rC,EAAM,SAAS,UACjB6rC,IACE,gBAAAlhD;AAAA,MAACqgD;AAAA,MAAA;AAAA,QACC,OAAOhrC,EAAM;AAAA,QACb,SAAAjT;AAAA,QACA,gBAAAokC;AAAA,QACA,UAAU0a;AAAA,MAAA;AAAA,IAAA,IAEV,OAEJ,gBAAA5gD,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOX;AAAA,YACP,UAAU,CAAC+C;AAAA,YACX,UAAU,CAACgE,OAAM;AACf,cAAAk7C,EAAOl7C,GAAE,OAAO,KAAK,GACrBo7C,GAAY,IAAI;AAAA,YAClB;AAAA,YACA,QAAQG;AAAA,UAAA;AAAA,QAAA;AAAA,MACV,GACF;AAAA,MACCJ,KACC,gBAAAvhD,EAAC,KAAA,EAAE,WAAU,wBAAuB,OAAO,EAAE,OAAO,UAAA,GACjD,UAAAuhD,GAAA,CACH,IACE;AAAA,MAEH1X,GAAmBx0B,EAAM,IAAI,IAC5B,gBAAA/U,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,QAAA;AAAA,QAEvC,gBAAAN;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOl0B,EAAM;AAAA,YACb,UAAU,CAACjT;AAAA,YACX,YAAY;AAAA,YACZ,SAAS0nC,GAAmBz0B,EAAM,IAAI,EAAE,IAAI,CAACnM,QAAO;AAAA,cAClD,OAAOA;AAAA,cACP,OAAOwgC,GAAkBxgC,EAAC;AAAA,YAAA,EAC1B;AAAA,YACF,UAAU,CAACnH,OAAS++C,EAAa/+C,EAAiB;AAAA,UAAA;AAAA,QAAA;AAAA,MACpD,EAAA,CACF,IACE;AAAA,MACHsT,EAAM,SAAS,SACd,gBAAArV,EAAC,OAAE,WAAU,wBAAuB,sIAGpC,IACE;AAAA,IAAA,GACN;AAAA,IAGD+gD,KAAiBvjD,EAAO,SAAS,IAChC,gBAAA8C,EAAAq7B,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,2BAA0B,UAAA,SAAK;AAAA,QAC/C,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA;AAAA,UAACupC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,OAAOl0B,EAAM,OAAO;AAAA,YAC3B,UAAU,CAACjT;AAAA,YACX,YAAY;AAAA,YACZ,SAAS5E,EAAO,IAAI,CAACI,QAAW;AAAA,cAC9B,OAAO,OAAOA,GAAM,EAAE;AAAA,cACtB,OAAOA,GAAM;AAAA,YAAA,EACb;AAAA,YACF,UAAU,CAACmE,OAAS;AAClB,cAAKA,MACL2/C,GAAcX,EAAc,OAAOh/C,EAAI,CAAC,CAAC;AAAA,YAC3C;AAAA,UAAA;AAAA,QAAA,EACF,CACF;AAAA,MAAA,GACF;AAAA,MACC0/C,IACC,gBAAAzhD,EAAC,KAAA,EAAE,WAAU,wBAAuB,OAAO,EAAE,OAAO,UAAA,GACjD,UAAAyhD,EAAA,CACH,IACE;AAAA,IAAA,EAAA,CACN,IACE;AAAA,IAEHr/C,MAAYy/C,MAAcb,KACzB,gBAAA1gD,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,MAAAuhD;AAAA,MACAb,IACC,gBAAAhhD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAMghD,EAAA;AAAA,UAChB,UAAA;AAAA,QAAA;AAAA,MAAA,IAGC;AAAA,IAAA,EAAA,CACN,IACE;AAAA,EAAA,GACN;AAEJ;AChRO,SAASc,GAAe;AAAA,EAC7B,UAAAC;AAAA,EACA,MAAAzkD,IAAO;AAAA,EACP,eAAA8sB;AAAA,EACA,iBAAAV;AAAA,EACA,kBAAAgrB;AAAA,EACA,gBAAAhlB;AAAA,EACA,YAAAsyB;AAAA,EACA,eAAAvN;AAAA,EACA,qBAAAwN;AAAA,EACA,eAAAC;AAAA,EACA,eAAAxhC;AAAA,EACA,QAAAyhC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,kBAAAC;AACF,GAyBG;AACD,SACE,gBAAA1iD,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAA,EAAC2iD,IAAA,EAAS,UAAU,gBAAA3iD,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,mBAAA,CAAgB,GAE9E,UAAA,gBAAAA;AAAA,IAAC4iD;AAAA,IAAA;AAAA,MACC,UAAAb;AAAA,MACA,MAAAzkD;AAAA,MACA,eAAA8sB;AAAA,MACA,iBAAAV;AAAA,MACA,kBAAAgrB;AAAA,MACA,gBAAAhlB;AAAA,MACA,YAAAsyB;AAAA,MACA,eAAAvN;AAAA,MACA,qBAAAwN;AAAA,MACA,eAAAC;AAAA,MACA,eAAAxhC;AAAA,MACA,QAAAyhC;AAAA,MACA,eAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,eAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,kBAAAC;AAAA,IAAA;AAAA,EAAA,GAEJ,EAAA,CACF;AAEJ;ACjFO,SAASG,GACdlkD,GACA2X,GACAgiC,GACU;AACV,SAAIhiC,KAAM,OAAa,CAAA,IAClBgiC,KAAA,QAAAA,EAAM,WACP35C,EAAQ,SAAS2X,CAAE,IAAU3X,EAAQ,OAAO,CAAC+U,MAASA,MAAS4C,CAAE,IAC9D,CAAC,GAAG3X,GAAS2X,CAAE,IAFM,CAACA,CAAE;AAGjC;ACHO,SAASwsC,GACd5/B,GACAlN,GAQmB;AACnB,QAAMrY,IAAUulB,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,SAAS,SAAS;AACrE,SAAOmlD,GAAgB;AAAA,IACrB,aAAY/sC,KAAA,gBAAAA,EAAQ,eAAc;AAAA,IAClC,iBAAgBA,KAAA,gBAAAA,EAAQ,mBAAkB;AAAA,IAC1C,UAAUkN,EAAM;AAAA,IAChB,OAAOA,EAAM;AAAA,IACb,OAAOA,EAAM;AAAA,IACb,YAAYA,EAAM,eAAcvlB,KAAA,gBAAAA,EAAS,iBAAgB;AAAA,IACzD,cAAaA,KAAA,gBAAAA,EAAS,kBAAiB;AAAA,IACvC,WAAWulB,EAAM;AAAA,IACjB,QAAQA,EAAM;AAAA,IACd,QAAQA,EAAM,OAAO,OAAO,CAAClf,MAAM,CAACA,EAAE,UAAU;AAAA,IAChD,aAAakf,EAAM;AAAA,IACnB,SAASA,EAAM;AAAA,IACf,OAAOA,EAAM;AAAA,IACb,aAAYlN,KAAA,gBAAAA,EAAQ,eAAckN,EAAM,cAAc,CAAA;AAAA,IACtD,WAAWA,EAAM;AAAA,IACjB,sBACElN,KAAA,gBAAAA,EAAQ,wBAAuBkN,EAAM,uBAAuB,CAAA;AAAA,IAC9D,aAAalN,KAAA,gBAAAA,EAAQ;AAAA,IACrB,WAAWA,KAAA,gBAAAA,EAAQ;AAAA,IACnB,cAAckN,EAAM;AAAA;AAAA,IAEpB,eAAe,CAAC7jB,MAAQ;AACtB,UAAI,CAACA,EAAK,QAAO;AACjB,YAAMkkC,IAAQrgB,EAAM,OAAO;AAAA,QACzB,CAACkd,MAAMA,EAAE,iBAAiB/gC,KAAO+gC,EAAE,iBAAiB/gC;AAAA,MAAA;AAEtD,cAAOkkC,KAAA,gBAAAA,EAAO,iBAAgBlkC;AAAA,IAChC;AAAA,EAAA,CACD;AACH;AC3CA,MAAM2jD,yBAAa,IAAA,GACbC,KAAsB,IAEtBC,KAAa,CAAC5+B,MAAkB,4BAA4BA,CAAK;AAEvE,SAAS6+B,GAAkB7+B,GAAqB;AAC9C,MAAI;AACF,mBAAe,WAAW4+B,GAAW5+B,CAAK,CAAC;AAAA,EAC7C,QAAQ;AAAA,EAER;AACF;AAMO,SAAS8+B,GACd9+B,GACAzlB,GACM;AAGN,MAFAmkD,GAAO,OAAO1+B,CAAK,GACnB0+B,GAAO,IAAI1+B,GAAOzlB,CAAQ,GACtBmkD,GAAO,OAAOC,IAAqB;AACrC,UAAMI,IAASL,GAAO,KAAA,EAAO,OAAO;AACpC,IAAIK,KAAU,QAAML,GAAO,OAAOK,CAAM;AAAA,EAC1C;AACA,EAAAF,GAAkB7+B,CAAK;AACzB;AAEO,SAASg/B,GAAkBh/B,GAA6C;AAC7E,SAAA6+B,GAAkB7+B,CAAK,GAChB0+B,GAAO,IAAI1+B,CAAK,KAAK;AAC9B;AAEO,SAASi/B,GAAmBj/B,GAAqB;AACtD0+B,EAAAA,GAAO,OAAO1+B,CAAK,GACnB6+B,GAAkB7+B,CAAK;AACzB;AC9CA,MAAM0+B,yBAAa,IAAA,GAEbE,KAAa,CAAC5+B,MAAkB,2BAA2BA,CAAK;AAEtE,SAASk/B,KAA0B;AACjC,MAAI;AACF,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAASC,GAAuBn/B,GAAqB;;AAC1D,EAAA0+B,GAAO,IAAI1+B,CAAK,IAChBxmB,IAAA0lD,GAAA,MAAA,QAAA1lD,EAAW,QAAQolD,GAAW5+B,CAAK,GAAG;AACxC;AAEO,SAASo/B,GAA0Bp/B,GAAwB;;AAChE,QAAMq/B,MAAS7lD,IAAA0lD,SAAA,gBAAA1lD,EAAW,QAAQolD,GAAW5+B,CAAK,QAAO,KACnDT,IAAUm/B,GAAO,IAAI1+B,CAAK,KAAKq/B;AACrC,SAAAC,GAAwBt/B,CAAK,GACtBT;AACT;AAEO,SAAS+/B,GAAwBt/B,GAAqB;;AAC3D,EAAA0+B,GAAO,OAAO1+B,CAAK,IACnBxmB,IAAA0lD,SAAA,QAAA1lD,EAAW,WAAWolD,GAAW5+B,CAAK;AACxC;ACnBO,MAAMu/B,KAAmB,KACnBC,KAAuB;AAE7B,SAASC,GAAiBznB,GAAuB;AACtD,SAAK,OAAO,SAASA,CAAK,IACnB,KAAK,IAAIunB,IAAkB,KAAK,IAAI,GAAG,KAAK,MAAMvnB,IAAQ,GAAI,IAAI,GAAI,CAAC,IAD1CwnB;AAEtC;AAEA,SAASE,GAAsBC,GAAyB;AACtD,SAAOF,GAAkBE,IAAU,MAAOJ,EAAgB;AAC5D;AAEA,SAASK,GAA6BC,GAAyB;AAC7D,SAAO,KAAK,MAAOJ,GAAiBI,CAAO,IAAIN,KAAoB,GAAG;AACxE;AAEO,SAASO,GAAiB;AAAA,EAC/B,aAAA96B;AAAA,EACA,UAAAua;AACF,GAIG;AACD,QAAMogB,IAAUC,GAA6B56B,CAAW,GAClD+6B,IAAiB,CAAC/nB,OAAiC;AAAA,IACvD,aAAa0nB,GAAsB,OAAO1nB,CAAK,CAAC;AAAA,EAAA;AAElD,2BACG,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAh8B,EAAC,SAAA,EAAM,WAAU,wCAAuC,UAAA;AAAA,IAAA;AAAA,IAEtD,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAOikD;AAAA,QACP,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAeA;AAAA,QACf,cAAW;AAAA,QACX,2BAAwB;AAAA,QACxB,SAAS,CAACpsC,MAAUgsB,EAASwgB,EAAexsC,EAAM,cAAc,KAAK,CAAC;AAAA,QACtE,UAAU,CAACA,MAAUgsB,EAASwgB,EAAexsC,EAAM,cAAc,KAAK,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACzE,EAAA,CACF,EAAA,CACF;AAEJ;AC3CA,SAASysC,GAAYhoB,GAAuB;AAC1C,SAAOA,EAAM,QAAQ,CAAC;AACxB;AAEO,SAASioB,GAAkB;AAAA,EAChC,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AACF,GAUG;AACD,QAAM,CAACC,GAAOC,CAAQ,IAAIrjC,EAAS,EAAE,GAC/B,CAACsjC,GAAWC,CAAY,IAAIvjC,EAAS,EAAK,GAC1C,CAACwjC,GAAaC,CAAc,IAAIzjC,EAAwB,IAAI,GAC5D,CAAC0jC,GAASC,CAAU,IAAI3jC,EAAS,MAAMyiC,GAAYG,EAAK,GAAG,CAAC,GAC5D,CAACgB,GAASC,CAAU,IAAI7jC,EAAS,MAAMyiC,GAAYG,EAAK,GAAG,CAAC,GAC5D,CAACkB,GAAYC,CAAa,IAAI/jC,EAAwB,IAAI,GAC1DgkC,IAAan6B,GAAO,EAAK,GACzBo6B,IAAap6B,GAAO,EAAK,GACzBq6B,IAAar6B,GAAO+4B,EAAK,OAAO,GAChCuB,KAAUt6B,GAAO+4B,EAAK,IAAI,GAC1BwB,KAAUv6B,GAAsB,IAAI;AAC1C,EAAAq6B,EAAW,UAAUtB,EAAK,SAC1BuB,GAAQ,UAAUvB,EAAK,MAEvBziC,GAAU,MAAM;AACd,IAAK6jC,EAAW,aAAoBvB,GAAYG,EAAK,GAAG,CAAC;AAAA,EAC3D,GAAG,CAACA,EAAK,GAAG,CAAC,GAEbziC,GAAU,MAAM;AACd,IAAK8jC,EAAW,aAAoBxB,GAAYG,EAAK,GAAG,CAAC;AAAA,EAC3D,GAAG,CAACA,EAAK,GAAG,CAAC,GAEbziC;AAAA,IACE,MAAM,MAAM;AACV,MAAIikC,GAAQ,WAAW,QAAM,OAAO,cAAcA,GAAQ,OAAO;AAAA,IACnE;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMjf,IAAW,MAAM;AACrB,IAAIif,GAAQ,WAAW,SACvB,OAAO,cAAcA,GAAQ,OAAO,GACpCA,GAAQ,UAAU;AAAA,EACpB,GAEMC,KAAc,CAAC32C,OAAkB;AACrC,IAAAu1C,EAAU1e,GAAgB2f,EAAW,SAASx2C,EAAK,CAAC;AAAA,EACtD,GAEMw3B,KAAY,CAACx3B,OAAkB;AACnC,IAAAy3B,EAAA,GACAif,GAAQ,UAAU,OAAO,YAAY,MAAMC,GAAY32C,EAAK,GAAG,GAAG;AAAA,EACpE,GAEM42C,IAAW,CAACzpB,OAAsB;AACtC,IAAAqoB,EAAOqB,GAAiBJ,GAAQ,UAAUtpB,KAAY2pB,EAAiB,CAAC;AAAA,EAC1E,GAEMC,KAAgB,CAAC5pB,OAAsB;AAC3C,IAAAsK,EAAA,GACAif,GAAQ,UAAU,OAAO,YAAY,MAAME,EAASzpB,EAAS,GAAG,GAAG;AAAA,EACrE,GAEM6pB,KAAS,YAAY;AACzB,UAAMC,KAAUvB,EAAM,KAAA;AACtB,QAAI,GAACuB,MAAW,CAAChC,IACjB;AAAA,MAAAY,EAAa,EAAI,GACjBE,EAAe,IAAI;AACnB,UAAI;AACF,cAAMmB,KAAO,MAAMC,GAAelC,CAAM,GAClCmC,KAAQ,MAAMC,GAAeH,IAAMD,EAAO;AAChD,QAAAxB,EAAQ2B,GAAM,KAAKA,GAAM,GAAG;AAAA,MAC9B,SAASE,IAAQ;AACf,QAAAvB,EAAeuB,cAAkB,QAAQA,GAAO,UAAU,eAAe;AAAA,MAC3E,UAAA;AACE,QAAAzB,EAAa,EAAK;AAAA,MACpB;AAAA;AAAA,EACF,GAEM0B,KAAkB,MAAM;AAC5B,UAAMC,KAASxB,EAAQ,KAAA,GACjByB,KAASvB,EAAQ,KAAA,GACjBwB,KAAM,OAAOF,EAAM,GACnBG,IAAM,OAAOF,EAAM;AACzB,QAAI,CAACD,MAAU,CAACC,IAAQ;AACtB,MAAApB,EAAc,oCAAoC;AAClD;AAAA,IACF;AACA,QAAI,CAAC,OAAO,SAASqB,EAAG,KAAKA,KAAM,OAAOA,KAAM,IAAI;AAClD,MAAArB,EAAc,sCAAsC;AACpD;AAAA,IACF;AACA,QAAI,CAAC,OAAO,SAASsB,CAAG,KAAKA,IAAM,QAAQA,IAAM,KAAK;AACpD,MAAAtB,EAAc,yCAAyC;AACvD;AAAA,IACF;AACA,IAAAA,EAAc,IAAI,GAClBZ,EAAQiC,IAAKC,CAAG;AAAA,EAClB;AAEA,SAAK1C,IAUH,gBAAAlkD,EAAAq7B,IAAA,EACE,UAAA;AAAA,IAAA,gBAAA37B,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,2HAGpC;AAAA,IACA,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,CAACuX,OAAU;AACnB,UAAAA,GAAM,eAAA,GACD0uC,GAAA;AAAA,QACP;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAvmD,EAAC,UAAK,UAAA,gBAAA,CAAa;AAAA,UACnB,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAOilD;AAAA,cACP,aAAY;AAAA,cACZ,cAAW;AAAA,cACX,UAAU,CAACptC,OAAUqtC,EAASrtC,GAAM,OAAO,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QAClD;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAA7X,EAAC,SAAI,WAAU,2BACb,4BAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM,KAAKumD,MAAU,UAAUpB,KAAa,CAACF,EAAM,QAC/E,UAAAE,IAAY,eAAe,SAAA,CAC9B,EAAA,CACF;AAAA,IACCE,IAAc,gBAAArlD,EAAC,KAAA,EAAE,WAAU,wBAAwB,aAAY,IAAO;AAAA,IAEvE,gBAAAA,EAAC,SAAI,WAAU,8BAA6B,MAAK,aAC/C,UAAA,gBAAAA,EAAC,QAAA,EAAK,UAAA,KAAA,CAAE,EAAA,CACV;AAAA,IAEA,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,CAACuX,OAAU;AACnB,UAAAA,GAAM,eAAA,GACNivC,GAAA;AAAA,QACF;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAxmD,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,yBACf,UAAA;AAAA,cAAA,gBAAAN,EAAC,UAAK,UAAA,WAAA,CAAQ;AAAA,cACd,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAOulD;AAAA,kBACP,WAAU;AAAA,kBACV,cAAW;AAAA,kBACX,SAAS,MAAM;AACb,oBAAAM,EAAW,UAAU;AAAA,kBACvB;AAAA,kBACA,QAAQ,MAAM;AACZ,oBAAAA,EAAW,UAAU;AAAA,kBACvB;AAAA,kBACA,UAAU,CAAChuC,OAAU2tC,EAAW3tC,GAAM,OAAO,KAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACpD,GACF;AAAA,YACA,gBAAAvX,EAAC,SAAA,EAAM,WAAU,yBACf,UAAA;AAAA,cAAA,gBAAAN,EAAC,UAAK,UAAA,YAAA,CAAS;AAAA,cACf,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAOylD;AAAA,kBACP,WAAU;AAAA,kBACV,cAAW;AAAA,kBACX,SAAS,MAAM;AACb,oBAAAK,EAAW,UAAU;AAAA,kBACvB;AAAA,kBACA,QAAQ,MAAM;AACZ,oBAAAA,EAAW,UAAU;AAAA,kBACvB;AAAA,kBACA,UAAU,CAACjuC,OAAU6tC,EAAW7tC,GAAM,OAAO,KAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACpD,EAAA,CACF;AAAA,UAAA,GACF;AAAA,UACA,gBAAA7X,EAAC,SAAI,WAAU,2BACb,4BAAC,UAAA,EAAO,MAAK,UAAS,UAAA,oBAAA,CAAiB,EAAA,CACzC;AAAA,UACC2lD,IAAa,gBAAA3lD,EAAC,KAAA,EAAE,WAAU,wBAAwB,aAAW,IAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGvE,gBAAAA;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO6gB,EAAK;AAAA,QACZ,UAAU;AAAA,QACV,OACE,gBAAAzkD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,SAAS,MAAM8kD,EAAU5e,GAAgBue,EAAK,OAAO,CAAC;AAAA,YAEtD,4BAACxe,IAAA,CAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhB,UAAU6e;AAAA,QACV,QAAQoB;AAAA,QACR,aAAanf;AAAA,QACb,WAAWC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEb,gBAAAhnC,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAA;AAAA,MAAC4jC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAOwiB,GAAiB3B,EAAK,IAAI;AAAA,QACjC,UAAU;AAAA,QACV,UAAU,CAACroC,OAAS2oC,EAAOqB,GAAiBhqC,EAAI,CAAC;AAAA,QACjD,QAAQ+pC;AAAA,QACR,aAAaG;AAAA,QACb,WAAWtf;AAAA,MAAA;AAAA,IAAA,GAEf;AAAA,IAEA,gBAAA1mC,EAAC,SAAA,EAAM,WAAU,uFACf,UAAA;AAAA,MAAA,gBAAAN,EAAC,UAAK,UAAA,mBAAA,CAAgB;AAAA,MACtB,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO0kD;AAAA,UACP,cAAW;AAAA,UACX,UAAU,CAAC7sC,OAAU+sC,EAAc,OAAO/sC,GAAM,OAAO,KAAK,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAC/D,GACF;AAAA,IAEA,gBAAA7X,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,2GAGpC;AAAA,IAEA,gBAAAM,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW2kD,IAAY,SAAY;AAAA,UACnC,SAAS,MAAME,EAAY,EAAK;AAAA,UACjC,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAA7kD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW2kD,IAAY,cAAc;AAAA,UACrC,SAAS,MAAME,EAAY,EAAI;AAAA,UAChC,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GACF;AAAA,IACA,gBAAAvkD,EAAC,KAAA,EAAE,WAAU,wBACV,UAAA;AAAA,MAAAmkD,EAAK,IAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,MAAGA,EAAK,IAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,MAASA,EAAK,KAAK,QAAQ,CAAC;AAAA,MAAE;AAAA,MAAG;AAAA,MAC5E,KAAK,MAAMA,EAAK,OAAO;AAAA,MAAE;AAAA,IAAA,GAC5B;AAAA,IACA,gBAAAzkD,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,wGAAA,CAGpC;AAAA,EAAA,GACF,IA7JE,gBAAAA,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,2FAGpC;AA4JN;ACjFO,SAASmnD,GAAU;AAAA,EACxB,MAAA7pD,IAAO;AAAA,EACP,OAAA4lB;AAAA,EACA,WAAAq2B;AAAA,EACA,SAAAn3C,IAAU;AAAA,EACV,WAAA8rC,IAAY;AAAA,EACZ,aAAA2G,IAAc;AAAA,EACd,mBAAAC,IAAoB;AAAA,EACpB,SAAAsS;AAAA,EACA,WAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAApZ;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAwG;AAAA,EACA,iBAAA0S;AAAA,EACA,WAAAh+B,IAAY,CAAA;AAAA,EACZ,QAAAkhB,IAAS,CAAA;AAAA,EACT,eAAAjqB;AAAA,EACA,WAAAgnC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,qBAAA/N;AAAA,EACA,aAAagO,KAAkB/D;AAAA,EAC/B,mBAAAgE;AAAA,EACA,kBAAApF;AACF,GAAmB;AACjB,QAAMqF,KAAkBzE,GAAkBpgC,EAAM,KAAK,GAC/C,CAAC9lB,GAAS4qD,EAAU,IAAInmC,EAA6B,MACrD6hC,GAA0BxgC,EAAM,KAAK,IAAU,YAC5C6kC,MAAA,gBAAAA,GAAiB,YAAW,IACpC,GACK,CAACE,IAAkBC,EAAmB,IAAIrmC;AAAA,IAC9C,OAAMkmC,MAAA,gBAAAA,GAAiB,WAAU;AAAA,EAAA,GAE7B,CAACI,IAAmBC,EAAoB,IAAIvmC,EAEhD,CAAA,CAAE,GACE,CAACwmC,IAAcC,CAAe,IAAIzmC,EAAS,CAAC,GAC5C,CAAC4yB,GAAe8T,EAAgB,IAAI1mC,EAAwB,MAAM;;AACtE,UAAM2mC,KAAgB1qD,IAAAwlD,GAAkBpgC,EAAM,KAAK,MAA7B,gBAAAplB,EAAgC;AACtD,WACE0qD,KAAiB,QACjBtlC,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,OAAO4qD,CAAa,IAEhDA,IAEFxqD,GAAsBklB,EAAM,MAAM;AAAA,EAC3C,CAAC,GACK,CAACwxB,IAAkB+T,EAAmB,IAAI5mC,EAAmB,CAAA,CAAE,GAC/D,CAACszB,IAAwBuT,EAAyB,IAAI7mC,EAE1D,IAAI,GACA6H,KAAkBgrB,GAAiB,CAAC,KAAK,MACzC,CAAChlB,IAAgBC,EAAiB,IAAI9N,EAAwB,IAAI,GAClE,CAAC8mC,IAAgBC,CAAiB,IAAI/mC,EAAS,CAAC,GAChD,CAAC8H,IAAmBk/B,EAAoB,IAAIhnC,EAAmB,CAAA,CAAE,GACjE,CAACriB,IAAMspD,EAAO,IAAIjnC,EAAqB,QAAQ,GAC/C,CAACyH,IAAay/B,EAAc,IAAIlnC;AAAA,IAAS,MAC7CkiC,GAAiB8D,EAAe;AAAA,EAAA,GAE5BrS,KAAmBkN,OAAqB,QACxCsG,KAAat9B,GAA4B,IAAI,GAC7Cu9B,KAAgBv9B,GAAkC,IAAI,GACtD,CAACw9B,IAAaC,EAAc,IAAItnC;AAAA,IACpC,MAAMunC,GAAqBlmC,EAAM,YAAY,KAAKmmC;AAAA,EAAA,GAE9C,CAAC3E,IAAa4E,EAAc,IAAIznC,EAAS,IAAI,GAC7C,CAAC0nC,IAAkBC,EAAmB,IAAI3nC,EAAS,EAAK,GACxD,CAAC4nC,GAAaC,CAAc,IAAI7nC,EAAS,CAAC,GAC1C,CAAC8nC,IAAcC,EAAe,IAAI/nC,EAAS,EAAK,GAChD,CAACgoC,IAAQC,EAAS,IAAIjoC,EAAS,EAAK,GACpC,CAACnjB,IAASqrD,EAAU,IAAIloC,EAASxjB,EAAkB,GACnD,CAAC2rD,GAAkBC,CAAmB,IAAIpoC,EAAS,EAAK,GACxD+J,IAAYF,GAA2B,IAAI,GAC3Cw+B,KAAax+B,GAAOhtB,EAAO,GAC3ByrD,KAAaz+B,GAAkB,EAAE,GACjC0+B,KAAa1+B,GAAO,EAAE,GACtB2+B,KAAoB3+B,GAAO,EAAK;AACtC,EAAAw+B,GAAW,UAAUxrD;AACrB,QAAM4rD,KAAiBhtD,MAAS,UAC1BitD,KAAgBltD,GAAoBC,GAAMF,CAAO,GACjDotD,KAAYD,OAAkB,UAC9BE,KAAiB/+B,GAAO;AAAA,IAC5B,WAAA8+B;AAAA,IACA,iBAAA9gC;AAAA,IACA,mBAAAC;AAAA,EAAA,CACD;AACD,EAAA8gC,GAAe,UAAU,EAAE,WAAAD,IAAW,iBAAA9gC,IAAiB,mBAAAC,GAAA,GAEvD3H,GAAU,MAAM;AACd,IAAA+mC,GAAehF,GAAiB8D,EAAe,CAAC;AAAA,EAClD,GAAG,CAACA,EAAe,CAAC;AAEpB,QAAM6C,KAAwBniB,GAAY,CAACoiB,MAAwB;AACjE,UAAMrhC,IAAcy6B,GAAiB4G,EAAM,WAAW;AACtD,IAAA5B,GAAez/B,CAAW,GAC1Bw+B,KAAA,QAAAA,EAAoB,EAAE,aAAAx+B;EACxB,GAAG,CAACw+B,CAAiB,CAAC;AAEtB,EAAA9lC,GAAU,MAAM;AACd,IAAAmoC,GAAW,UAAU,CAAA,GACrBC,GAAW,UAAU,IACrBC,GAAkB,UAAU,IAC5BX,EAAe,CAAC,GAChBE,GAAgB,EAAK,GACrBxB,GAAqB,CAAA,CAAE,GACvB8B,GAAW,UAAU7rD,GAAA,GACrB0rD,GAAW1rD,IAAoB;AAAA,EACjC,GAAG,CAAC6kB,EAAM,OAAOA,EAAM,QAAQ,CAAC,GAEhClB,GAAU,MAAM;AACd,QACE5kB,MAAY,cACZA,MAAY,gBACZA,MAAY,sBACZ;AACA,MAAAgmD,GAAkBlgC,EAAM,OAAO;AAAA,QAC7B,SAAA9lB;AAAA,QACA,SAASq3C;AAAA,QACT,QAAQr3C,MAAY,uBAAuB6qD,KAAmB;AAAA,MAAA,CAC/D;AACD;AAAA,IACF;AACA,IAAA1E,GAAmBrgC,EAAM,KAAK;AAAA,EAChC,GAAG,CAACuxB,GAAevxB,EAAM,OAAO+kC,IAAkB7qD,CAAO,CAAC,GAI1D4kB,GAAU,MAAM;AAEd,QAAI,CADWkB,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,OAAO62C,CAAa,GACzD;AACX,MAAA8T;AAAA,QACEnrD,MAAY,eACRW,GAAyBmlB,EAAM,MAAM,IACrC/lB,GAAgBC,CAAO,IACrBY,GAAsBklB,EAAM,MAAM,IAClCjlB,GAAyBilB,EAAM,MAAM;AAAA,MAAA;AAE7C;AAAA,IACF;AACA,QAAI9lB,MAAY,WAAY;AAC5B,UAAMo7C,IAASt1B,EAAM,OAAO,KAAK,CAACtlB,MAAUA,EAAM,OAAO62C,CAAa;AACtE,SAAI+D,KAAA,gBAAAA,EAAQ,UAAS,UAAW;AAChC,UAAMz2C,IACJ3E,MAAY,eACRW,GAAyBmlB,EAAM,MAAM,IACrCjlB,GAAyBilB,EAAM,MAAM;AAC3C,IAAInhB,KAAQ,QAAQA,MAAS0yC,QAAgC1yC,CAAI;AAAA,EACnE,GAAG,CAACmhB,EAAM,QAAQuxB,GAAer3C,CAAO,CAAC;AAEzC,QAAMwtD,IAAe7oC;AAAA,IACnB,MAAM4f,GAAcze,GAAOinC,GAAW,OAAO;AAAA,IAC7C,CAACjnC,GAAOumC,CAAW;AAAA,EAAA,GAGf7rC,KAAQmE;AAAA,IACZ,MAAM8oC,GAAWD,EAAa,KAAK;AAAA,IACnC,CAACA,EAAa,KAAK;AAAA,EAAA,GAGfE,KAAc,OAAO,KAAK3C,EAAiB,EAAE,SAAS,GACtD4C,KAAeZ,GAAW,QAAQ,SAAS,GAC3Ca,KAAQD,MAAgBpB,MAAgBmB,IACxCG,KAAcrvB,GAAwB;AAAA,IAC1C,cAAAmvB;AAAA,IACA,cAAApB;AAAA,IACA,aAAAmB;AAAA,IACA,SAASd;AAAA,IACT,QAAAH;AAAA,EAAA,CACD;AACD,EAAA7nC,GAAU,MAAM;AACd,IAAA4lC,KAAA,QAAAA,EAAgB,EAAE,OAAOqD,IAAa,QAAApB,GAAA;AAAA,EACxC,GAAG,CAACjC,GAAeiC,IAAQoB,EAAW,CAAC;AACvC,QAAMC,KAAiBx/B,GAAOu/B,EAAW;AACzC,EAAAC,GAAe,UAAUD,IACzBjpC,GAAU,MAAM;AACd,UAAMmpC,IAAiB,CAACtzC,MAA6B;AACnD,MAAAikB,GAAyBjkB,GAAOqzC,GAAe,OAAO;AAAA,IACxD,GACMhvB,IAAUF,GAAoB,MAAM;AAC1C,eAAWh9B,KAAUk9B;AACnB,MAAAl9B,EAAO,iBAAiB,gBAAgBmsD,CAAc;AAExD,WAAO,MAAM;AACX,iBAAWnsD,KAAUk9B;AACnB,QAAAl9B,EAAO,oBAAoB,gBAAgBmsD,CAAc;AAAA,IAE7D;AAAA,EACF,GAAG,CAAA,CAAE;AACL,QAAMC,KACJ,CAACvB,MAAUmB,OAAU5oD,KAAY0yC,KAAqBgW,KAClDO,KAAmBjuD,MAAY,sBAC/BkuD,KAAiBluD,MAAY,kBAAkBo4C,IAC/CiC,KAAcmT,EAAa,OAAO,KAAK,CAACxqB,MAAMA,EAAE,OAAOqU,CAAa,KAAK,MACzE8W,KAAkBntD,GAA0BhB,GAASq6C,EAAW,GAChE+T,KAAkBppD,KAAW,CAACmpD,IAC9BE,KAAeb,EAAa,OAAO,KAAK,CAACxqB,MAAMA,EAAE,SAAS,SAAS,KAAK,MACxEsrB,KACJD,OAAgBhU,MAAA,gBAAAA,GAAa,UAAS,UAClCmT,EAAa,OAAO,OAAO,CAAC5mD,MAAMA,EAAE,YAAYynD,GAAa,EAAE,IAC/D,CAAA,GACAE,KAAcf,EAAa,OAAO,OAAO,CAAC5mD,MAAMA,EAAE,YAAYywC,CAAa,GAC3ExqB,KAAwBlI,GAAQ,MAAM;AAC1C,UAAM6pC,IAAmBhB,EAAa,OAAO,IAAI,CAACiB,OAAS;AAAA,MACzD,GAAGA;AAAA,MACH,QAAQjB,EAAa,OAAO,OAAO,CAACv1C,MAAUA,EAAM,YAAYw2C,EAAI,EAAE;AAAA,IAAA,EACtE,GACIC,IAAQC,GAAuBH,GAAkBnX,CAAa;AACpE,WAAKqX,IACElB,EAAa,OAAO;AAAA,MACzB,CAACv1C,MAAUA,EAAM,YAAYy2C,EAAM,MAAM,CAACz2C,EAAM;AAAA,IAAA,IAF/B,CAAA;AAAA,EAIrB,GAAG,CAACu1C,EAAa,QAAQA,EAAa,QAAQnW,CAAa,CAAC,GACtDuX,KAA4BjqC;AAAA,IAChC,MACEkqC;AAAA,MACErB,EAAa,uBAAuB,CAAA;AAAA,MACpC,OAAO,OAAOzC,EAAiB;AAAA,IAAA;AAAA,IAEnC,CAACA,IAAmByC,EAAa,mBAAmB;AAAA,EAAA,GAEhDsB,KAAkBnqC;AAAA,IACtB,MACE+gC,GAAqB8H,GAAc;AAAA,MACjC,YAAYnD,KAAA,gBAAAA,EAAiB;AAAA,MAC7B,gBAAgBA,KAAA,gBAAAA,EAAiB;AAAA,MACjC,YAAYmD,EAAa;AAAA,MACzB,aAAanD,KAAA,gBAAAA,EAAiB;AAAA,MAC9B,WAAAh+B;AAAA,MACA,qBAAqBuiC;AAAA,IAAA,CACtB;AAAA,IACH,CAACpB,GAAcnD,GAAiBh+B,GAAWuiC,EAAyB;AAAA,EAAA,GAEhEG,KAAepqC;AAAA,IACnB,MAAM6oC,EAAa,QAAQ,OAAO,CAACpnD,MAAMA,EAAE,YAAYixC,CAAa;AAAA,IACpE,CAACA,GAAemW,EAAa,OAAO;AAAA,EAAA,GAEhCwB,KAAarqC,GAAQ,MAAM;AAC/B,UAAMsqC,IAAc,IAAI;AAAA,MACtBzB,EAAa,QAAQ,IAAI,CAAC9lC,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC;AAAA,IAAA;AAE1D,WAAO8lC,EAAa,MAAM;AAAA,MACxB,CAAClmD,MAAA;;AAAS,iBAAA5G,IAAAuuD,EAAY,IAAI3nD,EAAK,YAAY,MAAjC,gBAAA5G,EAAoC,aAAY22C;AAAA;AAAA,IAAA;AAAA,EAE9D,GAAG,CAACA,GAAemW,EAAa,SAASA,EAAa,KAAK,CAAC,GACtDl4B,IACJk4B,EAAa,OAAO,KAAK,CAAC5mD,MAAMA,EAAE,OAAO0lB,EAAe,KAAK,MACzD4iC,KACJ1B,EAAa,YAAY,KAAK,CAACpnD,MAAMA,EAAE,YAAYkmB,EAAe,KAAK,MAEnE6iC,KAAe,MACnBjuD,GAAqB;AAAA,IACnB,KAAK6rD,GAAW;AAAA,IAChB,YAAYC,GAAW;AAAA,IACvB,iBAAiBK,GAAe,QAAQ;AAAA,IACxC,mBAAmBA,GAAe,QAAQ;AAAA,EAAA,CAC3C,GAEG+B,KAAgB,CAACjuD,MAAoC;AACzD,IAAA4rD,GAAW,UAAU5rD,EAAS,KAC9B6rD,GAAW,UAAU7rD,EAAS,YAC9BkqD;AAAA,MACElqD,EAAS,mBAAmB,OAAO,CAAA,IAAK,CAACA,EAAS,eAAe;AAAA,IAAA,GAEnEsqD,GAAqBtqD,EAAS,iBAAiB,GAC/CmrD,EAAe,CAAC9kD,MAAMA,IAAI,CAAC;AAAA,EAC7B,GAEM6nD,KAAoB,CAACC,MAAsC;AAC/D,QAAI,CAACjC,GAAe,QAAQ,aAAaiC,MAAS,OAAQ;AAC1D,QAAIA,MAAS,WAAW;AACtB,UAAIrC,GAAkB,QAAS;AAC/B,MAAAA,GAAkB,UAAU;AAAA,IAC9B;AACA,UAAMtoD,IAAOtD,GAAkByrD,GAAW,SAASqC,IAAc;AACjE,IAAArC,GAAW,UAAUnoD,GACrBgoD,GAAWhoD,CAAI;AAAA,EACjB,GAEM4qD,KAAUpkB;AAAA,IACd,CAAC/pC,GAAaouD,IAA2C,WAA0B;AACjF,MAAAH,GAAkBG,CAAW;AAC7B,UAAI7qD,IAAOvD;AACX,UAAIuD,EAAK,OAAO,kBAAkBA,EAAK,MAAM,MAAM,MAAM;AACvD,cAAMuU,IAAK8zC,GAAW;AACtB,QAAAroD,IAAO,EAAE,GAAGA,GAAM,OAAO,EAAE,GAAGA,EAAK,OAAO,IAAAuU,IAAG;AAAA,MAC/C;AACA,UAAIvU,EAAK,OAAO,mBAAmBA,EAAK,OAAO,MAAM,MAAM;AACzD,cAAMuU,IAAK8zC,GAAW;AACtB,QAAAroD,IAAO,EAAE,GAAGA,GAAM,QAAQ,EAAE,GAAGA,EAAK,QAAQ,IAAAuU,IAAG;AAAA,MACjD;AACA,UAAIvU,EAAK,OAAO,iBAAiBA,EAAK,KAAK,MAAM,MAAM;AACrD,cAAMuU,IAAK8zC,GAAW;AACtB,QAAAroD,IAAO,EAAE,GAAGA,GAAM,MAAM,EAAE,GAAGA,EAAK,MAAM,IAAAuU,IAAG;AAAA,MAC7C;AACA,UAAIvU,EAAK,OAAO,sBAAsBA,EAAK,UAAU,MAAM,MAAM;AAC/D,cAAMuU,IAAK8zC,GAAW;AACtB,QAAAroD,IAAO,EAAE,GAAGA,GAAM,WAAW,EAAE,GAAGA,EAAK,WAAW,IAAAuU,IAAG;AAAA,MACvD;AAGA,aAFA6zC,GAAW,UAAUjoB,GAAgBioB,GAAW,SAASpoD,CAAI,GAC7D2nD,EAAe,CAAC9kD,MAAMA,IAAI,CAAC,GACvB7C,EAAK,OAAO,iBAAuBA,EAAK,MAAM,MAAM,OACpDA,EAAK,OAAO,kBAAwBA,EAAK,OAAO,MAAM,OACtDA,EAAK,OAAO,gBAAsBA,EAAK,KAAK,MAAM,OAClDA,EAAK,OAAO,qBAA2BA,EAAK,UAAU,MAAM,OACzD;AAAA,IACT;AAAA,IACA,CAAA;AAAA,EAAC,GAGG8qD,KAAuB,KAAK,UAAU3pC,EAAM,gBAAgB,IAAI,GAChE4pC,KAAiBphC,GAAOw9B,EAAW;AACzC,EAAA4D,GAAe,UAAU5D;AACzB,QAAM6D,KAAiBrhC,GAAOxI,EAAM,YAAY;AAChD,EAAA6pC,GAAe,UAAU7pC,EAAM;AAC/B,QAAM8pC,KAAyBzkB,GAAY,CAACkc,MAAsB;AAChE,UAAM5mB,IAASurB,GAAqB3E,CAAI;AACxC,QAAI,CAAC5mB,EAAQ,QAAO;AACpB,UAAMovB,IAAMhE,GAAc;AAC1B,QAAIgE,KAAOA,EAAI,OAAO;AACpB,aAAO;AAAA,QACL,GAAGpvB;AAAA,QACH,YAAY,KAAK,MAAMovB,EAAI,OAAO,GAAI,IAAI;AAAA,QAC1C,SAASA,EAAI,OAAO,CAAC;AAAA,QACrB,SAASA,EAAI,OAAO,CAAC;AAAA,MAAA;AAGzB,UAAMC,IAAQ9D,GAAqB2D,GAAe,OAAO;AACzD,YAAIG,KAAA,gBAAAA,EAAO,eAAc,QAAQA,EAAM,aAAa,IAC3C;AAAA,MACL,GAAGrvB;AAAA,MACH,YAAYqvB,EAAM;AAAA,MAClB,SAASA,EAAM;AAAA,MACf,SAASA,EAAM;AAAA,IAAA,IAGZrvB;AAAA,EACT,GAAG,CAAA,CAAE;AACL,EAAA7b,GAAU,MAAM;AACd,QAAImoC,GAAW,QAAQ,KAAK,CAAC3rD,MAAOA,EAAG,OAAO,qBAAqB,EAAG;AACtE,UAAM0uD,IAAQ9D,GAAqBlmC,EAAM,YAAY;AACrD,IAAAimC,GAAe+D,KAAS7D,EAAoB;AAAA,EAC9C,GAAG,CAACwD,EAAoB,CAAC,GAEzB7qC,GAAU,MAAM;AACd,QAAI,CAAC5f,EAAS;AACd,UAAMzD,IAAUquD,GAAuB9D,EAAW;AAClD,QAAI,CAACvqD,EAAS;AACd,UAAMuuD,IAAQ9D,GAAqBlmC,EAAM,YAAY;AACrD,IAAI,CAACgqC,KAASC,GAAyBxuD,CAAO,KAC1CuuD,KAASE,GAAoBF,GAAOvuD,CAAO,KAC/CguD,GAAQ,EAAE,IAAI,uBAAuB,cAAchuD,EAAA,GAAW,MAAM;AAAA,EACtE,GAAG,CAACuqD,IAAa9mD,GAAS4qD,IAAwBL,IAASE,EAAoB,CAAC;AAEhF,QAAMQ,KAAoB9kB,GAAY,MAAM;AAC1C,IAAA8hB,GAAkB,UAAU;AAAA,EAC9B,GAAG,CAAA,CAAE,GAECiD,KAAO/kB,GAAY,MAAM;;AAG7B,QAFI,CAACkiB,GAAe,QAAQ,aAAa,CAACroD,KAAWynD,QACnC/rD,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB,wBACnB,aAAc;AAChC,UAAMiE,IAAOnD,GAAkBsrD,GAAW,SAASqC,IAAc;AACjE,IAAKxqD,MACLsoD,GAAkB,UAAU,IAC5BmC,GAAczqD,EAAK,QAAQ,GAC3BmoD,GAAW,UAAUnoD,EAAK,SAC1BgoD,GAAWhoD,EAAK,OAAO;AAAA,EACzB,GAAG,CAACK,GAASynD,EAAM,CAAC,GAEd0D,KAAOhlB,GAAY,MAAM;AAC7B,QAAI,CAACkiB,GAAe,QAAQ,aAAa,CAACroD,KAAWynD,GAAQ;AAC7D,UAAM9nD,IAAOjD,GAAkBorD,GAAW,SAASqC,IAAc;AACjE,IAAKxqD,MACLsoD,GAAkB,UAAU,IAC5BmC,GAAczqD,EAAK,QAAQ,GAC3BmoD,GAAW,UAAUnoD,EAAK,SAC1BgoD,GAAWhoD,EAAK,OAAO;AAAA,EACzB,GAAG,CAACK,GAASynD,EAAM,CAAC,GAEd2D,KAAoBjlB,GAAY,YAAY;AAChD,QAAIshB,GAAQ;AACZ,QAAIznD,GAAS;AACX,YAAMzD,IAAUquD,GAAuB9D,EAAW,GAC5CgE,IAAQ9D,GAAqBlmC,EAAM,YAAY;AAKrD,MAHEvkB,KAAW,QACX,EAAEuuD,KAAS,QAAQC,GAAyBxuD,CAAO,MACnD,EAAEuuD,KAAS,QAAQE,GAAoBF,GAAOvuD,CAAO,MACxCA,MACbwrD,GAAW,UAAUjoB,GAAgBioB,GAAW,SAAS;AAAA,QACvD,IAAI;AAAA,QACJ,cAAcxrD;AAAA,MAAA,CACf;AAAA,IAEL;AACA,UAAMinB,IAAMxjB,IAAU8gC,GAAwBinB,GAAW,OAAO,IAAI,CAAA,GAC9DsD,IAAc3Y,IAAoB,OAAO,OAAOqT,EAAiB,IAAI,CAAA;AAE3E,QADI,CAACviC,EAAI,UAAU,CAAC+jC,MAAgB,CAAC8D,EAAY,UAC7C,CAACrrD,KAAW,CAACqrD,EAAY,OAAQ;AACrC,IAAAtD,GAAW,UAAU,CAAA,GACrBT,EAAe,CAAC9kD,MAAMA,IAAI,CAAC,GAC3BklD,GAAU,EAAI;AACd,QAAI4D,IAAY,CAAC9nC,EAAI;AACrB,UAAM+nC,IAAcF;AACpB,QAAI;AACF,MAAIA,EAAY,UAAUnG,MACxB,MAAMA,EAAiBmG,CAAW,GAClCrF,GAAqB,CAAA,CAAE,IAErBxiC,EAAI,UAAUwhC,MAChB,MAAMA,EAAQxhC,CAAG,GACjB8nC,IAAY,KAEd,OAAMrG,KAAA,gBAAAA,MACNuC,GAAgB,EAAK,GACrBS,GAAkB,UAAU,IAC5BH,GAAW,UAAU7rD,GAAA,GACrB0rD,GAAW1rD,IAAoB;AAAA,IACjC,QAAQ;AACN,MAAIsvD,EAAY,UACdvF;AAAA,QAAqB,CAACr8C,MACpB,OAAO,KAAKA,CAAI,EAAE,SAASA,IAAO,OAAO;AAAA,UACvC4hD,EAAY,IAAI,CAACj6C,MAAS;AAAA,YACxBk6C,GAAkBl6C,EAAK,SAASA,EAAK,MAAM;AAAA,YAC3CA;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,MACH,GAGCg6C,IAIH9D,GAAgB,EAAI,KAHpBO,GAAW,UAAUvkC,GACrB8jC,EAAe,CAAC9kD,MAAMA,IAAI,CAAC;AAAA,IAI/B,UAAA;AACE,MAAAklD,GAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAAG;AAAA,IACDZ;AAAA,IACA9mD;AAAA,IACA4qD;AAAA,IACAlY;AAAA,IACA5xB,EAAM;AAAA,IACNymC;AAAA,IACAvC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAa;AAAA,IACA0B;AAAA,EAAA,CACD,GAEKgE,KAAuBtlB,GAAY,YAAY;;AAGnD,QAFIshB,MAAU,CAACmB,MACX,CAAC5oD,KAAW,CAAC0oD,MAEf,CAAC,OAAO;AAAA,MACN;AAAA,IAAA;AAGF;AAEF,KAAAhtD,IAAA8tB,EAAU,YAAV,QAAA9tB,EAAmB,oBACnBqsD,GAAW,UAAU,CAAA;AACrB,UAAM+C,IAAQ9D,GAAqBlmC,EAAM,YAAY;AACrD,IAAAimC,GAAe+D,KAAS7D,EAAoB,GAC5Ce,GAAW,UAAU,IACrBC,GAAkB,UAAU,IAC5BH,GAAW,UAAU7rD,GAAA,GACrB0rD,GAAW1rD,IAAoB,GAC/BurD,GAAgB,EAAK,GACrBxB,GAAqB,CAAA,CAAE,GACvBE,EAAgB,CAAC1jD,MAAMA,IAAI,CAAC,GAC5B8kD,EAAe,CAAC9kD,MAAMA,IAAI,CAAC,GAC3BklD,GAAU,EAAI;AACd,QAAI;AACF,aAAMvC,KAAA,gBAAAA;AAAA,IACR,UAAA;AACE,MAAAuC,GAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAACgB,IAAa1oD,GAAS4oD,IAAO9nC,EAAM,cAAcqkC,GAAWsC,EAAM,CAAC,GAEjEiE,KAAsBvlB;AAAA,IAC1B,CAACxmC,MAA6B;AAG5B,MAAA0mD,GAAoB,CAAA,CAAE,GACtBC,GAA0B,IAAI,GAC9BG,GAAqB,CAAA,CAAE,GACvBl5B,GAAkB,IAAI,GAClBxyB,GAAgBC,CAAO,KAAK,CAACD,GAAgB4E,CAAI,KACnD+mD,GAAQ,QAAQ,GAChBuB,GAAkB,UAAU,IAC5BH,GAAW,UAAU7rD,GAAA,GACrB0rD,GAAW1rD,IAAoB,GAC/BkqD,GAAiBtqD,GAAyBilB,EAAM,MAAM,CAAC,KAC9CnhB,MAAS,cAClB+mD,GAAQ,QAAQ,GAChBP,GAAiBvqD,GAAsBklB,EAAM,MAAM,CAAC,KAC3CnhB,MAAS,gBAClB+mD,GAAQ,QAAQ,GAChBP,GAAiBxqD,GAAyBmlB,EAAM,MAAM,CAAC,MAC9CnhB,MAAS,wBAAwBA,MAAS,mBACnDwmD,GAAiBtqD,GAAyBilB,EAAM,MAAM,CAAC,GAEzD8kC,GAAWjmD,CAAI;AAAA,IACjB;AAAA,IACA,CAACmhB,EAAM,QAAQ9lB,CAAO;AAAA,EAAA,GAGlB2wD,KAA0B,CAACznC,MAAoB;AACnD,QAAIA,MAAYmuB,EAAe;AAC/B,IAAAgU,GAAoB,CAAA,CAAE,GACtBI,GAAqB,CAAA,CAAE,GACvBN,GAAiBjiC,CAAO;AACxB,UAAM0nC,IAAYpD,EAAa,OAAO,KAAK,CAAChtD,MAAUA,EAAM,OAAO0oB,CAAO;AAC1E,IAAIloB,GAA0BhB,GAAS4wD,CAAS,QAAW,QAAQ;AAAA,EACrE;AAEA,EAAAhsC,GAAU,MAAM;AACd,QAAI,CAACwoC,MAAa,CAACpoD,EAAS;AAC5B,UAAM6yB,IAAQ,CAAC7uB,MAAqB;AAClC,UAAI,CAAArH,GAAuBqH,EAAE,MAAM,GACnC;AAAA,YAAIjH,GAAmBiH,CAAC,GAAG;AACzB,UAAAA,EAAE,eAAA,GACFknD,GAAA;AACA;AAAA,QACF;AACA,QAAIluD,GAAmBgH,CAAC,MACtBA,EAAE,eAAA,GACFmnD,GAAA;AAAA;AAAA,IAEJ;AACA,kBAAO,iBAAiB,WAAWt4B,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,EAC1D,GAAG,CAAC7yB,GAASooD,IAAW+C,IAAMD,EAAI,CAAC;AAEnC,QAAMW,KAAoB1lB;AAAA,IACxB,CAACjyB,GAAmBgiC,MAA2B;AAC7C,YAAMjjC,IAAQiB,KAAM,OAAO,OAAOs0C,EAAa,OAAO,KAAK,CAAC5mD,MAAMA,EAAE,OAAOsS,CAAE,GACvE43C,IACJ,GAAQ5V,KAAA,QAAAA,EAAM,aACdl7C,MAAY,cACZA,MAAY,iBACXiY,KAAS,QAAQ40B,GAAiB50B,EAAM,IAAI;AAI/C,UAHAozC,GAAoB,CAAC18C,MAAS82C,GAAqB92C,GAAMuK,GAAI,EAAE,UAAA43C,EAAA,CAAU,CAAC,GACtE53C,KAAM,QAAMoyC,GAA0B,IAAI,GAC9C/4B,GAAkB,IAAI,GAClBrZ,KAAM,MACV;AAAA,YAAIjB,KAAS,CAAC64C,GAAU;AACtB,gBAAMC,IACJ/wD,MAAY,cAAcA,MAAY,eAClCiY,EAAM,UACN+4C;AAAA,YACAxD,EAAa;AAAA,YACbnW;AAAA,YACAp/B,EAAM;AAAA,UAAA;AAEZ,UAAAkzC,GAAiB4F,CAAW;AAAA,QAC9B;AACA,QAAID,KACJlG,GAAW,CAACrpD,MAAY;AACtB,cACEA,MAAY,cACZA,MAAY,gBACZA,MAAY;AAEZ,mBAAOA;AAET,eAAI0W,KAAA,gBAAAA,EAAO,UAAS,SAAU,QAAO;AACrC,cACE1W,MAAY,gBACZA,MAAY,gBACZA,MAAY;AAEZ,mBAAOA;AAET,gBAAM0vD,IAAgBh5C,IAClB8nB,GAAsB9nB,GAAOu1C,EAAa,SAASA,EAAa,UAAU,IAC1E;AACJ,iBAAIyD,MAAkB,cAAoB,eACtCA,MAAkB,aAAmB,eACrCh5C,KAAA,gBAAAA,EAAO,UAAS,WAAUA,KAAA,gBAAAA,EAAO,UAAS,iBAAuB,YACjEA,KAAA,gBAAAA,EAAO,UAAS,YAAkB,eAClCA,KAAA,gBAAAA,EAAO,UAAS,iBAAuB,WACpC;AAAA,QACT,CAAC;AAAA;AAAA,IACH;AAAA,IACA;AAAA,MACEo/B;AAAA,MACAr3C;AAAA,MACAwtD,EAAa;AAAA,MACbA,EAAa;AAAA,MACbA,EAAa;AAAA,MACbA,EAAa;AAAA,IAAA;AAAA,EACf,GAGI0D,KAAmB,CAACvsD,MAAqB;AAC7C,UAAMwsD,IACJnxD,MAAY,gBAAgB,CAACqC,GAAuBsC,CAAI,IACpD,WACAA,GACAysD,IAAW1sD,GAAetC,IAAM+uD,CAAS;AAC/C,IAAAzF,GAAQ0F,CAAQ,GACX1rC,GAAgB0rC,GAAUpxD,MAAY,YAAY,KAAGyrD,GAAqB,EAAE;AAAA,EACnF,GAEM4F,KAAoB,CAACpvD,MAAgB;AACzC,IAAIjC,MAAY,gBAAgB,CAACs1B,KAAiB,CAACtwB,KAEjD4+B;AAAA,MACE4pB,EAAa;AAAA,MACbl4B,EAAc;AAAA,MACdA,EAAc;AAAA,MACdrzB;AAAA,IAAA,KAKJstD,GAAQ;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAIj6B,EAAc;AAAA,QAClB,SAASA,EAAc;AAAA,QACvB,KAAArzB;AAAA,QACA,MAAMqzB,EAAc;AAAA,MAAA;AAAA,IACtB,CACD;AAAA,EACH,GAEMg8B,KAAoB,CAACpoC,MAAmC;AAE5D,QADI,CAACoM,KAAiB,CAACtwB,KACnBkkB,MAAYoM,EAAc,QAAS,QAAO;AAC9C,QACEsO;AAAA,MACE4pB,EAAa;AAAA,MACbl4B,EAAc;AAAA,MACdpM;AAAA,MACAoM,EAAc;AAAA,IAAA;AAGhB,aAAO;AAET,UAAM9M,IAAiB;AAAA,MACrB;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAI8M,EAAc;AAAA,UAClB,SAAApM;AAAA,UACA,KAAKoM,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,QAAA;AAAA,MACtB;AAAA,IACF;AAEF,eAAW5N,KAAU8lC,EAAa;AAChC,MAAI9lC,EAAO,YAAY4N,EAAc,MAAM5N,EAAO,YAAYwB,KAG9DV,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,QAAQ;AAAA,UACN,IAAId,EAAO;AAAA,UACX,SAAAwB;AAAA,UACA,SAASxB,EAAO;AAAA,UAChB,MAAMA,EAAO;AAAA,UACb,GAAGA,EAAO;AAAA,UACV,GAAGA,EAAO;AAAA,UACV,aAAaA,EAAO;AAAA,QAAA;AAAA,MACtB,CACD;AAEH,WAAA6pC,GAAa/oC,CAAG,GAChB2iC,GAAiBjiC,CAAO,GACjB;AAAA,EACT,GAEMsoC,KAAoB,CAACtoC,MAAmC;AAC5D,QAAI,CAACoM,KAAiB,CAACtwB,EAAS,QAAO;AACvC,UAAMysD,IAAS5S,GAAoB;AAAA,MACjC,OAAOvpB;AAAA,MACP,YAAY45B;AAAA,MACZ,eAAehmC;AAAA,MACf,QAAQskC,EAAa;AAAA,MACrB,SAAS,MAAMR,GAAW;AAAA,IAAA,CAC3B;AACD,WAAKyE,KACLF,GAAaE,EAAO,GAAG,GACvBpG,GAAoB,CAACoG,EAAO,OAAO,CAAC,GACpCtG,GAAiBjiC,CAAO,GACjB,QAJa;AAAA,EAKtB,GAEMwoC,KAAoB,MAAM;AAC9B,IAAI1xD,MAAY,gBAAgB,CAACs1B,KAAiB,CAACtwB,MACnDuqD,GAAQ,EAAE,IAAI,gBAAgB,SAASj6B,EAAc,IAAI,GACzD+1B,GAAoB,CAAA,CAAE;AAAA,EACxB,GAEMsG,KAA4B,CAChC/xB,GACAzxB,GACA+sC,MACG;AACH,QAAIl7C,MAAY,gBAAgB,CAACouD,GAAiB;AAClD,UAAMn2C,IAAQu1C,EAAa,OAAO,KAAK,CAAC5mD,MAAMA,EAAE,OAAOg5B,CAAO;AAC9D,IAAK3nB,KACLs3C;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIt3C,EAAM;AAAA,UACV,SAASA,EAAM;AAAA,UACf,KAAKA,EAAM;AAAA,UACX,MAAMA,EAAM;AAAA,UACZ,UAAA9J;AAAA,UACA,MAAM2O,GAAa3O,CAAQ;AAAA,UAC3B,gBAAgB;AAAA,QAAA;AAAA,MAClB;AAAA,MAEF+sC,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,IAAA;AAAA,EAE7B,GAEM0W,KAAoB,CAAC1vC,GAAmBg5B,MAA8B;AAC1E,QAAI,CAAC5lB,KAAiB,CAACtwB,EAAS;AAChC,QAAIgY,GAAesY,CAAa,GAAG;AACjC,YAAMu8B,IACJltB,GAA0B;AAAA,QACxB,GAAGrP;AAAA,QACH,OAAApT;AAAA,MAAA,CACD,KAAKA,GACFlG,KAAO61C,EAAU,QAAQv8B,EAAc,MAAM,QAAQgE;AAM3D,UAJEtd,QAAUsZ,EAAc,MAAM,QAAQgE,QACrCu4B,EAAU,UAAU,QAAQv8B,EAAc,MAAM,UAAU,OAC1Du8B,EAAU,SAAS,SAASv8B,EAAc,MAAM,SAAS,QACzDu8B,EAAU,YAAY,SAASv8B,EAAc,MAAM,YAAY,KACnD;AACb,QAAK4lB,KAAA,QAAAA,EAAM,QAAM+U,GAAA;AACjB;AAAA,MACF;AACA,YAAM9hD,KAAWoP,GAAwB+X,EAAc,UAAUtZ,EAAI;AACrE,MAAAuzC;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,YACL,IAAIj6B,EAAc;AAAA,YAClB,SAASA,EAAc;AAAA,YACvB,KAAKA,EAAc;AAAA,YACnB,MAAMA,EAAc;AAAA,YACpB,QAAQA,EAAc;AAAA,YACtB,aAAaA,EAAc;AAAA,YAC3B,OAAOu8B;AAAA,YACP,UAAA1jD;AAAAA,YACA,MAAM2O,GAAa3O,EAAQ;AAAA,UAAA;AAAA,QAC7B;AAAA,QAEF+sC,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,MAAA,GAEtBA,KAAA,QAAAA,EAAM,QAAM+U,GAAA;AACjB;AAAA,IACF;AACA,UAAMj0C,IAAOkG,EAAM,QAAQoT,EAAc,MAAM,QAAQpa;AAQvD,SANGgH,EAAM,QAAQ,SAASoT,EAAc,MAAM,QAAQ,OACpDtZ,OAAUsZ,EAAc,MAAM,QAAQpa,QACrCgH,EAAM,UAAU,QAAQoT,EAAc,MAAM,UAAU,OACtDpT,EAAM,SAAS,SAASoT,EAAc,MAAM,SAAS,QACrDpT,EAAM,SAASg+B,SACf5qB,EAAc,MAAM,SAAS4qB,KACjB;AACb,MAAKhF,KAAA,QAAAA,EAAM,QAAM+U,GAAA;AACjB;AAAA,IACF;AACA,UAAM9hD,IAAW0O;AAAA,MACfyY,EAAc;AAAA,MACdpT,EAAM,QAAQoT,EAAc,MAAM,QAAQ;AAAA,MAC1CtZ;AAAA,IAAA;AAEF,IAAAuzC;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIj6B,EAAc;AAAA,UAClB,SAASA,EAAc;AAAA,UACvB,KAAKA,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,UACpB,OAAApT;AAAA,UACA,UAAA/T;AAAA,UACA,MAAM2O,GAAa3O,CAAQ;AAAA,QAAA;AAAA,MAC7B;AAAA,MAEF+sC,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,IAAA,GAEtBA,KAAA,QAAAA,EAAM,QAAM+U,GAAA;AAAA,EACnB,GAEM6B,IAAmB,CAACv9C,MAAoB;AAC5C,IAAI,CAAC+gB,KAAiB,CAACtwB,MACvBuqD,GAAQ;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAIj6B,EAAc;AAAA,QAClB,SAASA,EAAc;AAAA,QACvB,KAAKA,EAAc;AAAA,QACnB,MAAA/gB;AAAA,MAAA;AAAA,IACF,CACD,GACGA,MAAS,WACXg7C,GAAQ;AAAA,MACN,IAAI;AAAA,MACJ,YAAYrlB,GAAqB5U,EAAc,IAAI,QAAQ;AAAA,IAAA,CAC5D,IACQA,EAAc,SAAS,YAChCi6B,GAAQ,EAAE,IAAI,qBAAqB,SAASj6B,EAAc,IAAI;AAAA,EAElE,GAEMy8B,KAAuB,CAACtxC,MAAkC;AAC9D,QAAI,CAAC6U,KAAiB,CAACtwB,EAAS;AAChC,UAAM8c,IAAWuK,EAAU,KAAK,CAAC/V,MAASA,EAAK,OAAOmK,EAAW,UAAU,GACrEuxC,IAAUC,GAAsB38B,GAAe7U,GAAYqB,CAAQ;AACzE,IAAAytC,GAAQ,EAAE,IAAI,qBAAqB,YAAA9uC,EAAA,CAAY,GAC/C8uC;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIj6B,EAAc;AAAA,UAClB,SAASA,EAAc;AAAA,UACvB,KAAKA,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,UACpB,OAAO08B,EAAQ;AAAA,UACf,OAAOA,EAAQ;AAAA,QAAA;AAAA,MACjB;AAAA,MAEF;AAAA,IAAA;AAAA,EAEJ,GAEME,KAAwB,MAAM;AAClC,IAAI,CAAC58B,KAAiB,CAACtwB,MACvBuqD,GAAQ,EAAE,IAAI,qBAAqB,SAASj6B,EAAc,IAAI,GAC9Di6B;AAAA,MACE;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIj6B,EAAc;AAAA,UAClB,SAASA,EAAc;AAAA,UACvB,KAAKA,EAAc;AAAA,UACnB,MAAMA,EAAc;AAAA,UACpB,OAAO,EAAE,GAAGA,EAAc,OAAO,MAAM,OAAA;AAAA,UACvC,OAAO;AAAA,YACL,GAAGA,EAAc;AAAA,YACjB,MAAM;AAAA,YACN,UAAU;AAAA,YACV,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,UAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEF;AAAA,IAAA;AAAA,EAEJ,GAEM68B,KAAyB,CAACjkB,GAAiBtO,MAA2B;;AAC1E,QAAI,CAAC56B,EAAS;AACd,UAAMqpC,IAAQd,EAAO,KAAK,CAACj3B,OAASA,GAAK,OAAO43B,CAAO,GACjDkkB,IAAkBnkB;AAAA,MACtBC;AAAA,MACAsf,EAAa;AAAA,IAAA,GAEThlC,IAAiB,CAAA,GACjB6pC,IAAa,CAACn5C,OAAe;AACjC,YAAMjB,KAAQu1C,EAAa,OAAO,KAAK,CAACtqC,OAAQA,GAAI,OAAOhK,EAAE;AAC7D,MAAKjB,OACLuQ,EAAI,KAAK,EAAE,IAAI,qBAAqB,SAAStP,IAAI,GACjDsP,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIvQ,GAAM;AAAA,UACV,SAASA,GAAM;AAAA,UACf,KAAKA,GAAM;AAAA,UACX,MAAMA,GAAM;AAAA,UACZ,OAAO,EAAE,GAAGA,GAAM,OAAO,MAAM,OAAA;AAAA,UAC/B,OAAO;AAAA,YACL,GAAGA,GAAM;AAAA,YACT,MAAM;AAAA,YACN,UAAU;AAAA,YACV,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,UAAA;AAAA,QACT;AAAA,MACF,CACD;AAAA,IACH;AAIA,QAHIm6C,KAAmB,QAAQA,MAAoBxyB,KACjDyyB,EAAWD,CAAe,GAExBxyB,KAAW,MAAM;AACnB,MAAIpX,EAAI,UAAQ+oC,GAAa/oC,CAAG;AAChC;AAAA,IACF;AACA,UAAMvQ,KAAQu1C,EAAa,OAAO,KAAK,CAACtqC,OAAQA,GAAI,OAAO0c,CAAO;AAClE,QAAI,CAAC3nB,MAAS,CAAC61B,GAAkB71B,GAAM,IAAI,EAAG;AAC9C,UAAMoQ,KAAWmlC,EAAa,YAAY,KAAK,CAACtqC,OAAQA,GAAI,YAAY0c,CAAO,GACzEre,KAAO8G,KACT6b,GAAqB7b,IAAUpQ,GAAM,IAAI,IACzCiyB,GAAqBjyB,GAAM,IAAIA,GAAM,IAAI,GACvCwI,KAAayjB;AAAA,MACjB;AAAA,QACE,GAAG3iB;AAAA,QACH,YAAY;AAAA,QACZ,SAAA2sB;AAAA,QACA,eAAaxtC,KAAA2tC,KAAA,gBAAAA,EAAO,SAAP,gBAAA3tC,GAAa,WAAU6gB,GAAK;AAAA,QACzC,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,WAAW;AAAA,MAAA;AAAA,MAEbtJ,GAAM;AAAA,IAAA,GAEF+5C,KAAUC,GAAsBh6C,IAAOwI,EAAU;AACvD,IAAA+H,EAAI,KAAK,EAAE,IAAI,qBAAqB,YAAA/H,IAAY,GAChD+H,EAAI,KAAK;AAAA,MACP,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,IAAIvQ,GAAM;AAAA,QACV,SAASA,GAAM;AAAA,QACf,KAAKA,GAAM;AAAA,QACX,MAAMA,GAAM;AAAA,QACZ,OAAO+5C,GAAQ;AAAA,QACf,OAAOA,GAAQ;AAAA,MAAA;AAAA,IACjB,CACD,GACDT,GAAa/oC,CAAG;AAAA,EAClB,GAEM8pC,KAAmB,CAACjT,MAA2B;AACnD,QAAI,CAACr6C,KAAWsyC,GAAiB,SAAS,EAAG;AAC7C,UAAM9uB,IAAiB,CAAA;AACvB,eAAWtP,KAAMo+B,IAAkB;AACjC,YAAMr/B,IAAQu1C,EAAa,OAAO,KAAK,CAACl3C,OAASA,GAAK,OAAO4C,CAAE;AAC/D,UAAI,CAACjB,KAAS,CAAC40B,GAAiB50B,EAAM,IAAI,EAAG;AAC7C,YAAMoQ,IAAWmlC,EAAa,YAAY,KAAK,CAACtqC,OAAQA,GAAI,YAAYhK,CAAE,GACpE3X,IAAU8mB,IACZ6b,GAAqB7b,GAAUpQ,EAAM,IAAI,IACzCiyB,GAAqBhxB,GAAIjB,EAAM,IAAI,GACjCs6C,KAAUC,GAAqBjxD,GAAS89C,CAAK,GAC7Cv9B,KAAWuK,EAAU,KAAK,CAAC/V,OAASA,GAAK,OAAOi8C,GAAQ,UAAU,GAClEP,KAAUC,GAAsBh6C,GAAOs6C,IAASzwC,EAAQ;AAC9D,MAAA0G,EAAI,KAAK,EAAE,IAAI,qBAAqB,YAAY+pC,IAAS,GACzD/pC,EAAI,KAAK;AAAA,QACP,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,IAAIvQ,EAAM;AAAA,UACV,SAASA,EAAM;AAAA,UACf,KAAKA,EAAM;AAAA,UACX,MAAMA,EAAM;AAAA,UACZ,OAAO+5C,GAAQ;AAAA,UACf,OAAOA,GAAQ;AAAA,QAAA;AAAA,MACjB,CACD;AAAA,IACH;AACA,IAAIxpC,EAAI,UAAQ+oC,GAAa/oC,CAAG;AAAA,EAClC,GAEM+oC,KAAe,CAAC/oC,MAAmB;AACvC,IAAAA,EAAI,QAAQ,CAACpnB,GAAI+iB,MAAUorC,GAAQnuD,GAAI+iB,MAAU,IAAI,SAAS,MAAM,CAAC;AAAA,EACvE,GAEMsuC,KAAwBn9B,IAC1ByK,GAAsBzK,GAAek4B,EAAa,SAASA,EAAa,UAAU,IAClF,MACEkF,KACJD,OAA0B,eAAeA,OAA0B,aAC/DA,KACA,MAEA5a,KACJ,gBAAA30C,EAAAq7B,IAAA,EACE,UAAA;AAAA,IAAA,gBAAA37B;AAAA,MAACygD;AAAA,MAAA;AAAA,QACC,OAAO/tB;AAAA,QACP,YAAY45B;AAAA,QACZ,WAAW1B,EAAa;AAAA,QACxB,WAAAnhC;AAAA,QACA,QAAAkhB;AAAA,QACA,gBAAgBghB,GACb,OAAO,CAAC3nD,MAAM,CAAC0wC,GAAiB,SAAS1wC,EAAE,EAAE,CAAC,EAC9C,IAAI,CAACA,MAAMA,EAAE,GAAG;AAAA,QACnB,SAAA5B;AAAA,QACA,gBAAgBhF,MAAY;AAAA,QAC5B,WACEA,MAAY,YACVA,MAAY,eACZA,MAAY,YACZA,MAAY,YACZA,MAAY,gBACZA,MAAY,gBACZA,MAAY,cACV,KACA;AAAA,QAEN,gBAAgBwtD,EAAa,OAAO;AAAA,UAAO,CAAC5mD,MAC1C0wC,GAAiB,SAAS1wC,EAAE,EAAE;AAAA,QAAA;AAAA,QAEhC,qBAAqB4mD,EAAa,YAAY;AAAA,UAAO,CAACtqC,MACpDo0B,GAAiB,SAASp0B,EAAI,OAAO;AAAA,QAAA;AAAA,QAEvC,UAAUmuC;AAAA,QACV,cAAcS;AAAA,QACd,eAAe9xD,MAAY,aAAasxD,KAAoB;AAAA,QAC5D,eAAetxD,MAAY,aAAawxD,KAAoB;AAAA,QAC5D,QAAQzwD,GAAyB,YAAYysD,EAAa,MAAM;AAAA,QAChE,UAAUkE;AAAA,QACV,mBAAmBQ;AAAA,QACnB,eAAeN;AAAA,QACf,kBAAkBG;AAAA,QAClB,cAAcO;AAAA,QACd,mBAAmB9xC,GAAM;AAAA,QACzB,gBAAgBA,GAAM;AAAA,QACtB,kBAAkBA,GAAM;AAAA,QACxB,gBAAgBA,GAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAEvBxgB,MAAY,cAAcs1B,KAAiBo9B,KAC1C,gBAAA9vD;AAAA,MAACunC;AAAA,MAAA;AAAA,QACC,OAAO7U;AAAA,QACP,UAAUo9B;AAAA,QACV,SAAA1tD;AAAA,QACA,YAAYkqD;AAAA,QACZ,mBAAmB1uC,GAAM;AAAA,QACzB,gBAAgBA,GAAM;AAAA,QACtB,KAAK;AAAA,UACH,OAAOgtC,EAAa;AAAA,UACpB,QAAQA,EAAa;AAAA,UACrB,QAAQA,EAAa;AAAA,UACrB,SAASA,EAAa;AAAA,UACtB,OAAOA,EAAa;AAAA,UACpB,YAAYA,EAAa;AAAA,UACzB,SAAS,MAAMR,GAAW;AAAA,QAAA;AAAA,QAE5B,YAAYuE;AAAA,QACZ,kBAAkBQ;AAAA,MAAA;AAAA,IAAA,IAElB;AAAA,EAAA,GACN,GAGItX,KACJ1C,MAA0B,OACtBxK,EAAO,KAAK,CAACj3B,MAASA,EAAK,OAAOyhC,EAAsB,KAAK,OAC7D,MACAD,KAAoB2C,KACxB,gBAAA73C;AAAA,IAAC66C;AAAA,IAAA;AAAA,MACC,OAAOhD;AAAA,MACP,cAAczM,GAAyBwf,EAAa,MAAM;AAAA,MAC1D,iBAAiBvf;AAAA,QACfwM,GAAqB;AAAA,QACrB+S,EAAa;AAAA,MAAA;AAAA,MAEf,SAAAxoD;AAAA,MACA,UAAU,CAAC46B,MACTuyB,GAAuB1X,GAAqB,IAAI7a,CAAO;AAAA,IAAA;AAAA,EAAA,IAGzD,MAEE+yB,KAAqBxnB;AAAA,IACzB,CAACkc,MAA6B;AAC5B,UAAIrnD,MAAY,wBAAwBq3C,KAAiB,KAAM;AAC/D,YAAMub,IAASC,GAAuB;AAAA,QACpC,MAAMxL,EAAK;AAAA,QACX,UAAUA,EAAK;AAAA,QACf,QAAQA,EAAK;AAAA,MAAA,CACd;AACD,MAAA2D,GAAqB,CAACr8C,OAAU;AAAA,QAC9B,GAAGA;AAAA,QACH,CAAC6hD,GAAkBnZ,GAAewT,EAAgB,CAAC,GAAG;AAAA,UACpD,SAASxT;AAAA,UACT,QAAQwT;AAAA,UACR,QAAQ+H,EAAO;AAAA,UACf,UAAUA,EAAO;AAAA,QAAA;AAAA,MACnB,EACA;AAAA,IACJ;AAAA,IACA,CAACvb,GAAewT,IAAkB7qD,CAAO;AAAA,EAAA,GAGrC8yD,KAAoB3nB,GAAY,MAAM;AAC1C,IAAIkM,KAAiB,QACrB2T,GAAqB,CAACr8C,OAAU;AAAA,MAC9B,GAAGA;AAAA,MACH,CAAC6hD,GAAkBnZ,GAAewT,EAAgB,CAAC,GACjDkI,GAA6B1b,GAAewT,EAAgB;AAAA,IAAA,EAC9D;AAAA,EACJ,GAAG,CAACxT,GAAewT,EAAgB,CAAC,GAE9BmI,KAAYhzD,MAAY,eAAe,UAAUA,MAAY,aAAa,QAAQ;AAExF,SACE,gBAAAkD,EAAC,SAAI,WAAW,sCAAsChD,CAAI,IAAIoqD,KAAa,EAAE,IAC1E,UAAA;AAAA,IAAA4C,KACC,gBAAAtqD;AAAA,MAACu0C;AAAA,MAAA;AAAA,QACC,SAAAn3C;AAAA,QACA,iBAAiB0wD;AAAA,QACjB,OAAOlD;AAAA,QACP,eAAAnW;AAAA,QACA,iBAAA/qB;AAAA,QACA,kBAAAgrB;AAAA,QACA,eAAeuZ;AAAA,QACf,cAAct+B;AAAA,QACd,aAAa,MAAMi5B,EAAkB,CAAChkD,MAAMA,IAAI,CAAC;AAAA,QACjD,WAAA6kB;AAAA,QACA,QAAAkhB;AAAA,QACA,wBAAAwK;AAAA,QACA,sBAAsBuT;AAAA,QACtB,WAAAxa;AAAA,QACA,aAAA2G;AAAA,QACA,mBAAAC;AAAA,QACA,kBAAAU;AAAA,QACA,mBACE,gBAAAx1C;AAAA,UAACukD;AAAA,UAAA;AAAA,YACC,QAAQ7B,MAAoB;AAAA,YAC5B,MAAMwG;AAAA,YACN,aAAAxE;AAAA,YACA,WAAW6E;AAAA,YACX,eAAeD;AAAA,YACf,aAAaE;AAAA,YACb,WAAW,CAAC6G,MAAY;;AACtB,oBAAMtuD,IAAOuuD,GAAiBD,CAAO;AACrC,eAAAvyD,IAAAkrD,GAAW,YAAX,QAAAlrD,EAAoB,WAAWiE,IAC/BonD,GAAe,CAACxqD,OAAa,EAAE,GAAGA,GAAS,SAASoD,IAAO;AAAA,YAC7D;AAAA,YACA,QAAQ,CAACqa,MAAS;;AAChB,eAAAte,IAAAkrD,GAAW,YAAX,QAAAlrD,EAAoB,QAAQse,IAC5B+sC,GAAe,CAACxqD,OAAa,EAAE,GAAGA,GAAS,MAAAyd,IAAO;AAAA,YACpD;AAAA,YACA,SAAS,CAAC6qC,GAAKC,MAAQ;;AACrB,eAAAppD,IAAAkrD,GAAW,YAAX,QAAAlrD,EAAoB,MAAMmpD,GAAKC,GAAK,KACpCiC,GAAe,CAACxqD,OAAa,EAAE,GAAGA,GAAS,KAAAsoD,GAAK,KAAAC,GAAK,MAAM,GAAA,EAAK;AAAA,YAClE;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ,aAAAM;AAAA,QACA,eACEpZ,IACI,OAAOjuB,MAAU;AACjB,UAAAsjC,GAAuBvgC,EAAM,KAAK;AAClC,cAAI;AACF,kBAAM5M,IAAK,MAAM83B,EAAcjuB,CAAK;AACpC,mBAAA6nC,GAAW,QAAQ,GACnBpE,GAAwB1gC,EAAM,KAAK,GAC5B5M;AAAA,UACT,SAASu4B,GAAO;AACd,kBAAA+U,GAAwB1gC,EAAM,KAAK,GAC7B2rB;AAAA,UACR;AAAA,QACF,IACE;AAAA,QAEN,eAAAR;AAAA,QACA,eAAAC;AAAA,QACA,iBAAAC;AAAA,QACA,aAAAwG;AAAA,QACA,OAAAn3B;AAAA,QACA,eAAe,CAAC4qB,MAAY;AAC1B,UAAKqM,KACL8X;AAAA,YACE,EAAE,IAAI,gBAAgB,OAAO,EAAE,GAAG/B,EAAa,OAAO,GAAGpiB,IAAQ;AAAA,YACjE;AAAA,UAAA;AAAA,QAEJ;AAAA,QACA,QACE,gBAAAloC,EAAAq7B,IAAA,EACG,UAAA;AAAA,UAAAr+B,MAAS,WACR,gBAAA0C;AAAA,YAAC05C;AAAA,YAAA;AAAA,cACC,WAAAH;AAAA,cACA,UAAUr2B,EAAM;AAAA,cAChB,SAAS+nC;AAAA,cACT,qBAAApR;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,UACH8N,IACC,gBAAA3nD,EAAC,OAAA,EAAI,WAAU,0BAA0B,aAAc,IACrD;AAAA,QAAA,GACN;AAAA,QAEF,mBAAAk1C;AAAA,QACA,aAAAD;AAAA,QACA,cACE,gBAAA30C,EAAAq7B,IAAA,EACG,UAAA;AAAA,UAAA35B,GAASxC,IAAM,KAAK,IACnB,gBAAAQ,EAAC,KAAA,EAAE,WAAU,wBAAwB,UAAAgC,GAASxC,IAAM,KAAK,EAAA,CAAE,IACzD;AAAA,UACHy1C;AAAA,QAAA,GACH;AAAA,QAEF,iBACE,gBAAA30C,EAAAq7B,IAAA,EACG,UAAA;AAAA,UAAA4vB,uBACE,KAAA,EAAE,WAAU,wBAAuB,UAAA,wEAAA,CAEpC,IACEvpD,GAASxC,IAAM,OAAO,IACxB,gBAAAQ,EAAC,OAAE,WAAU,wBAAwB,aAASR,IAAM,OAAO,GAAE,IAC3D;AAAA,UACJ,gBAAAc,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,cAAA6rD,GAAa;AAAA,cAAO;AAAA,cAAgBC,GAAW;AAAA,cAAO;AAAA,YAAA,GACzD;AAAA,YACCle,KAAauG,KAAiB,QAAQ,CAAC8W,MACtC,gBAAAvrD,EAAC,SAAI,WAAU,2BACb,4BAAC,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM+0C,KAAA,gBAAAA,EAAcN,IAAgB,mCAEnE,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,QAEF,wBACE,gBAAAz0C,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,kMAAA,CAIpC;AAAA,MAAA;AAAA,IAAA,IAGF;AAAA,IAEJ,gBAAAM,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAAqrD,uBACE,OAAA,EAAI,WAAU,iCAAgC,MAAK,WAAU,cAAW,UACtE,UAAAkF,GAAuB,IAAI,CAACC,MAC3B,gBAAAxwD;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAeioD,OAAqBuI,EAAI;AAAA,YACxC,WACEvI,OAAqBuI,EAAI,KACrB,2CACA;AAAA,YAEN,SAAS,MAAMtI,GAAoBsI,EAAI,EAAE;AAAA,YAExC,UAAAA,EAAI;AAAA,UAAA;AAAA,UAXAA,EAAI;AAAA,QAAA,CAaZ,EAAA,CACH,IACEhG,KACF,gBAAAxqD;AAAA,UAACkC;AAAA,UAAA;AAAA,YACC,MAAA1C;AAAA,YACA,cAAc8uD;AAAA,YACd,SAAS9C;AAAA,YACT,OAAO4E;AAAA,UAAA;AAAA,QAAA,IAEP,KAAA,CACN;AAAA,QACA,gBAAA9vD,EAAC,OAAA,EAAI,WAAU,kCACZ,UAAA;AAAA,UAAAkqD,KACC,gBAAAxqD;AAAA,YAACokD;AAAA,YAAA;AAAA,cACC,aAAA96B;AAAA,cACA,UAAUohC;AAAA,YAAA;AAAA,UAAA,IAEV;AAAA,UACJ,gBAAApqD,EAAC,OAAA,EAAI,WAAU,6BACd,UAAA;AAAA,YAAAkqD,KACC,gBAAAxqD;AAAA,cAACgD;AAAA,cAAA;AAAA,gBACC,SAAStE,GAAQ,KAAK,SAAS,KAAKsrD;AAAA,gBACpC,SAAStrD,GAAQ,OAAO,SAAS;AAAA,gBACjC,UAAU,CAAC0D,KAAWynD;AAAA,gBACtB,QAAQyD;AAAA,gBACR,QAAQC;AAAA,cAAA;AAAA,YAAA,IAER;AAAA,YACJ,gBAAAvtD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAW;AAAA,gBACX,SAAS,MAAM,KAAK6tD,GAAA;AAAA,gBACpB,UAAU,CAACzC;AAAA,gBACZ,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,gBAAA9qD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAY0qD,KAAQ,iCAAiC;AAAA,gBACrD,SAAS,MAAM,KAAKwC,GAAA;AAAA,gBACpB,UAAU,CAACpC;AAAA,gBAEV,UAAA;AAAA,kBAAAJ,uBACE,QAAA,EAAK,WAAU,gCAA+B,eAAY,QAAO,IAChE;AAAA,kBACHnB,KAAS,YAAY;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACxB,EAAA,CACA;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAECyB,KACC,gBAAAhrD,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,QAAAoiD,KACC,gBAAA1iD;AAAA,UAACywD;AAAA,UAAA;AAAA,YAEC,KAAKzH;AAAA,YACL,QAAQtG;AAAA,YACR,WAAW6G;AAAA,YACX,aAAaL;AAAA,YACb,cAAc,CAACzE,MAAS;AACtB,cAAA0E,GAAe,CAACxqD,OAAa;AAAA,gBAC3B,GAAG8lD;AAAA,gBACH,SAASiM,GAAY/xD,EAAQ,SAAS8lD,EAAK,OAAO;AAAA,gBAClD,MAAMkM,GAAShyD,EAAQ,MAAM8lD,EAAK,IAAI;AAAA,cAAA,EACtC;AAAA,YACJ;AAAA,UAAA;AAAA,UAXKoI;AAAA,QAAA,IAcP,gBAAA7sD,EAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,kEAE/C;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,SAAS0kD,GAAA;AAAA,YAElB,UAAA,gBAAA1kD;AAAA,cAAC8hD;AAAA,cAAA;AAAA,gBAEC,UAAUoK;AAAA,gBACV,MAAK;AAAA,gBACL,eAAAzX;AAAA,gBACA,qBAAqB8T;AAAA,gBACrB,eAAe;AAAA,gBACf,eAAA7nC;AAAA,gBACA,gBAAgB,EAAE,sBAAsB,cAAA;AAAA,gBACxC,uBAAqB;AAAA,gBACrB,gBAAgB,CAAC+jC,MAAS;AACxB,wBAAM14C,IAAOk9C,GAAc;AAG3B,sBAFAA,GAAc,UAAUxE,GACpB,CAAC14C,KAAQ,CAAC3J,KAEZ,KAAK,IAAI2J,EAAK,OAAO04C,EAAK,IAAI,IAAI,QAClC,KAAK,IAAI14C,EAAK,OAAO,CAAC,IAAI04C,EAAK,OAAO,CAAC,CAAC,IAAI,QAC5C,KAAK,IAAI14C,EAAK,OAAO,CAAC,IAAI04C,EAAK,OAAO,CAAC,CAAC,IAAI;AAE5C;AAEF,wBAAM9lD,IAAUquD,GAAuBF,GAAe,OAAO;AAC7D,sBAAI,CAACnuD,EAAS;AACd,wBAAMuuD,IAAQ9D,GAAqB2D,GAAe,OAAO;AACzD,kBAAI,CAACG,KAASC,GAAyBxuD,CAAO,KAC1CuuD,KAASE,GAAoBF,GAAOvuD,CAAO,KAC/CguD,GAAQ,EAAE,IAAI,uBAAuB,cAAchuD,EAAA,GAAW,MAAM;AAAA,gBACtE;AAAA,cAAA;AAAA,cA1BK0pD;AAAA,YAAA;AAAA,UA2BP;AAAA,QAAA;AAAA,MACF,GACF,IACEkC,OAAkB,WACpB,gBAAAvqD;AAAA,QAAC8hD;AAAA,QAAA;AAAA,UAEC,UAAUoK;AAAA,UACV,MAAMb,KAAmB,YAAY;AAAA,UACrC,iBAAiBA,KAAmB,OAAO3hC;AAAA,UAC3C,kBAAkB2hC,KAAmB,CAAA,IAAK3W;AAAA,UAC1C,gBAAgB2W,KAAmB,OAAO37B;AAAA,UAC1C,YAAY27B,KAAmB,SAAY1C;AAAA,UAC3C,eAAe0C,KAAmB,SAAY4C;AAAA,UAC9C,eAAAxZ;AAAA,UACA,qBAAqB8T;AAAA,UACrB,eAAe;AAAA,UACf,eAAA7nC;AAAA,UACA,QAAQ2qC,KAAmBpD,KAAmB;AAAA,UAC9C,eAAeoD;AAAA,UACf,gBAAgBA,KAAmB0E,KAAqB;AAAA,UACxD,eAAe1E,KAAmB6E,KAAoB;AAAA,UACtD,kBAAAxN;AAAA,QAAA;AAAA,QAhBK2F;AAAA,MAAA,IAmBP,gBAAAroD,EAAA27B,IAAA,EACE,UAAA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAACupB;AAAA,UAAA;AAAA,YACC,KAAKqC;AAAA,YACL,OAAO6rB;AAAA,YACP,QAAQkU,GAAY,OAAO,CAAC3nD,MAAM,CAACA,EAAE,UAAU;AAAA,YAC/C,gBAAgB0nD,GAAc,OAAO,CAAC1nD,MAAM,CAACA,EAAE,UAAU;AAAA,YACzD,uBAAAimB;AAAA,YACA,SAASkiC;AAAA,YACT,OAAOC;AAAA,YACP,aAAaxB,EAAa;AAAA,YAC1B,WAAAnhC;AAAA,YACA,WAAWmhC,EAAa;AAAA,YACxB,OAAAhtC;AAAA,YACA,MAAApe;AAAA,YACA,iBAAAkqB;AAAA,YACA,mBAAAC;AAAA,YACA,YAAYihC,EAAa,cAAc;AAAA,YACvC,cAAaa,MAAA,gBAAAA,GAAc,kBAAiB;AAAA,YAC5C,gBACEA,MAAA,gBAAAA,GAAc,iBAAgBb,EAAa,cAAc;AAAA,YAE3D,eAAAlqC;AAAA,YACA,cACEkwC,GAAkBhG,EAAa,MAAM,KAAKa,KACtC,SACAoF;AAAA,YAEN,kBAAiBpZ,MAAA,gBAAAA,GAAa,UAAS;AAAA,YACvC,UAAQ;AAAA,YACR,aAAAnuB;AAAA,YACA,WAAWlsB,MAAY;AAAA,YACvB,UAAUmuD;AAAA,YACV,QAAQ+B;AAAA,YACR,0BAA0BrD;AAAA,YAC1B,cAAcqE;AAAA,YACd,eAAeL;AAAA,YACf,iBAAiBpF;AAAA,YACjB,sBAAsB,CAAC1/C,GAAOC,MAAQ;AACpC,kBAAI,CAACquC,MAAe,CAAC+T,GAAiB,QAAO;AAC7C,oBAAMsF,IAAM1G,GAAW,WACjB2G,IAAM3G,GAAW;AACvB,qBAAAuE,GAAa;AAAA,gBACX;AAAA,kBACE,IAAI;AAAA,kBACJ,QAAQ;AAAA,oBACN,IAAImC;AAAA,oBACJ,SAASrZ,GAAY;AAAA,oBACrB,GAAGtuC,EAAM;AAAA,oBACT,GAAGA,EAAM;AAAA,oBACT,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,gBAEF;AAAA,kBACE,IAAI;AAAA,kBACJ,QAAQ;AAAA,oBACN,IAAI4nD;AAAA,oBACJ,SAAStZ,GAAY;AAAA,oBACrB,GAAGruC,EAAI;AAAA,oBACP,GAAGA,EAAI;AAAA,oBACP,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,gBAEF;AAAA,kBACE,IAAI;AAAA,kBACJ,MAAM;AAAA,oBACJ,OAAOwhD,EAAa;AAAA,oBACpB,cAAckG;AAAA,oBACd,YAAYC;AAAA,oBACZ,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,cACF,CACD,GACMA;AAAA,YACT;AAAA,YACA,oBAAoB,CAAC/jD,GAAOgkD,MAAiB;AAC3C,kBAAI,CAACvZ,MAAe,CAAC+T,GAAiB,QAAO;AAC7C,oBAAMl1C,IAAKq2C,GAAQ;AAAA,gBACjB,IAAI;AAAA,gBACJ,QAAQ;AAAA,kBACN,SAASlV,GAAY;AAAA,kBACrB,GAAGzqC,EAAM;AAAA,kBACT,GAAGA,EAAM;AAAA,kBACT,MAAM;AAAA,gBAAA;AAAA,cACR,CACD;AACD,qBACEsJ,KAAM,QACN06C,KAAgB,QAChB,CAACltC,GAAesoC,IAAY4E,GAAc16C,CAAE,KAE5Cq2C;AAAA,gBACE;AAAA,kBACE,IAAI;AAAA,kBACJ,MAAM;AAAA,oBACJ,OAAO/B,EAAa;AAAA,oBACpB,cAAcoG;AAAA,oBACd,YAAY16C;AAAA,oBACZ,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,gBAEF;AAAA,cAAA,GAGGA;AAAA,YACT;AAAA,YACA,oBAAoB,CAACgP,GAAcC,MAAe;AAChD,kBAAI,CAACimC,GAAiB;AACtB,oBAAMhtD,IAAK4nB;AAAA,gBACTwkC,EAAa;AAAA,gBACbtlC;AAAA,gBACAC;AAAA,gBACA6mC;AAAA,gBACA,MAAMhC,GAAW;AAAA,cAAA;AAEnB,cAAI5rD,QAAYA,CAAE;AAAA,YACpB;AAAA,YACA,uBAAuB,CAACgoB,GAAQxZ,MAAU;AACxC,kBAAI,CAACw+C,MAAmB,CAAC/T,GAAa,QAAO;AAC7C,oBAAM/yC,IAAO0nD,GAAW,KAAK,CAAC14C,MAASA,EAAK,OAAO8S,CAAM;AACzD,kBAAI,CAAC9hB,EAAM,QAAO;AAClB,oBAAM,EAAE,KAAAkhB,GAAK,YAAAvB,EAAA,IAAegC,GAA4B;AAAA,gBACtD,SAASoxB,GAAY;AAAA,gBACrB,OAAOmT,EAAa;AAAA,gBACpB,MAAAlmD;AAAA,gBACA,OAAAsI;AAAA,gBACA,SAASm/C;AAAA,gBACT,SAAS,MAAM/B,GAAW;AAAA,cAAA,CAC3B;AACD,qBAAIxkC,EAAI,UAAQ+oC,GAAa/oC,CAAG,GACzBvB;AAAA,YACT;AAAA,YACA,qBAAqB,CAACX,MAAa;AACjC,kBAAI,CAAC8nC,GAAiB;AACtB,oBAAM5lC,IAAMoB;AAAA,gBACVtD;AAAA,gBACAknC,EAAa;AAAA,gBACbwB;AAAA,gBACA,MAAMhC,GAAW;AAAA,cAAA;AAEnB,cAAIxkC,EAAI,UAAQ+oC,GAAa/oC,CAAG;AAChC,oBAAMuQ,IAAU,IAAI;AAAA,gBAClBvQ,EACG,OAAO,CAACpnB,MAAOA,EAAG,OAAO,eAAe,EACxC,IAAI,CAACA,MAAOA,EAAG,QAAQ;AAAA,cAAA;AAE5B,cAAI23B,EAAQ,QACV0yB;AAAA,gBAAqB,CAACjlC,MACpBA,EAAI,OAAO,CAACtN,MAAO,CAAC6f,EAAQ,IAAI7f,CAAE,CAAC;AAAA,cAAA;AAAA,YAGzC;AAAA,YACA,mBAAmB,CAACkQ,MAAW;AAC7B,kBAAI,CAACglC,GAAiB;AACtB,oBAAM5lC,IAAMW,GAAmBC,GAAQ4lC,EAAU;AACjD,cAAIxmC,EAAI,UAAQ+oC,GAAa/oC,CAAG;AAChC,oBAAMuQ,IAAU,IAAI;AAAA,gBAClBvQ,EACG,OAAO,CAACpnB,MAAOA,EAAG,OAAO,eAAe,EACxC,IAAI,CAACA,MAAOA,EAAG,QAAQ;AAAA,cAAA;AAE5B,cAAI23B,EAAQ,QACV0yB;AAAA,gBAAqB,CAACjlC,MACpBA,EAAI,OAAO,CAACtN,MAAO,CAAC6f,EAAQ,IAAI7f,CAAE,CAAC;AAAA,cAAA;AAAA,YAGzC;AAAA,YACA,qBAAqB,CAAC0mB,GAAShwB,MAAU;AACvC,kBAAI,CAACw+C,GAAiB,QAAO;AAC7B,oBAAMxsD,IAAS2sD,GAAY,KAAK,CAACj4C,MAASA,EAAK,OAAOspB,CAAO;AAC7D,kBAAI,CAACh+B,EAAQ,QAAO;AACpB,oBAAM,EAAE,KAAA4mB,GAAK,UAAAlC,EAAA,IAAa8B,GAA0B;AAAA,gBAClD,OAAOxmB;AAAA,gBACP,SAASmtD;AAAA,gBACT,SAAS,MAAM/B,GAAW;AAAA,gBAC1B,OAAAp9C;AAAA,cAAA,CACD;AACD,qBAAI4Y,EAAI,UAAQ+oC,GAAa/oC,CAAG,GAChCijC,GAAqB,CAACnlC,CAAQ,CAAC,GACxBA;AAAA,YACT;AAAA,YACA,uBAAuB,CAACsZ,GAASx4B,GAAMkQ,GAAMuQ,MAAY;AACvD,kBAAI,CAACumC,GAAiB;AACtB,oBAAMxsD,IAAS2sD,GAAY,KAAK,CAACj4C,OAASA,GAAK,OAAOspB,CAAO;AAC7D,kBAAI,CAACh+B,EAAQ;AACb,oBAAM4mB,IAAMD,GAAuB;AAAA,gBACjC,OAAO3mB;AAAA,gBACP,SAASmtD;AAAA,gBACT,OAAOC;AAAA,gBACP,OAAOxB,EAAa;AAAA,gBACpB,MAAApmD;AAAA,gBACA,MAAAkQ;AAAA,gBACA,SAAAuQ;AAAA,gBACA,SAAS,MAAMmlC,GAAW;AAAA,cAAA,CAC3B;AACD,cAAIxkC,EAAI,UAAQ+oC,GAAa/oC,CAAG;AAAA,YAClC;AAAA,YACA,6BAA6B,CAAClC,GAAUhP,GAAMuQ,MAAY;AACxD,kBAAI,CAACumC,GAAiB;AACtB,oBAAM1mC,IAASqnC,GAAa,KAAK,CAACz4C,MAASA,EAAK,OAAOgQ,CAAQ;AAC/D,kBAAI,CAACoB,EAAQ;AACb,oBAAMc,IAAMI,GAA6B;AAAA,gBACvC,QAAAlB;AAAA,gBACA,SAASqnC;AAAA,gBACT,OAAOC;AAAA,gBACP,OAAOxB,EAAa;AAAA,gBACpB,MAAAl2C;AAAA,gBACA,SAAAuQ;AAAA,gBACA,SAAS,MAAMmlC,GAAW;AAAA,cAAA,CAC3B;AACD,cAAIxkC,EAAI,UAAQ+oC,GAAa/oC,CAAG;AAAA,YAClC;AAAA,YACA,qBAAqBynC;AAAA,YACrB,cAAc,CAAC3pC,GAAU/Z,GAAGC,MAAM;AAChC,kBAAI,CAAC4hD,GAAiB;AACtB,oBAAM1mC,IAASqnC,GAAa,KAAK,CAAC3oD,MAAMA,EAAE,OAAOkgB,CAAQ;AACzD,kBAAI,CAACoB,EAAQ;AACb,oBAAMvV,IAAQ,EAAE,GAAG5F,IAAImb,EAAO,GAAG,GAAGlb,IAAIkb,EAAO,EAAA;AAQ/C,kBAPA6nC;AAAA,gBACE;AAAA,kBACE,IAAI;AAAA,kBACJ,QAAQ,EAAE,GAAG7nC,GAAQ,GAAAnb,GAAG,GAAAC,EAAA;AAAA,gBAAE;AAAA,gBAE5B;AAAA,cAAA,GAEE,EAAA2F,EAAM,MAAM,KAAKA,EAAM,MAAM;AACjC,2BAAW7K,KAAQkmD,EAAa,OAAO;AACrC,wBAAM1mC,KAAQ+sC,GAAyBvsD,GAAMgf,GAAUnU,CAAK;AAC5D,kBAAK2U,MACLyoC;AAAA,oBACE,EAAE,IAAI,eAAe,MAAM,EAAE,GAAGjoD,GAAM,OAAAwf,KAAM;AAAA,oBAC5C;AAAA,kBAAA;AAAA,gBAEJ;AAAA,YACF;AAAA,YACA,oBAAoB,CAClBsC,GACAtC,GACAo0B,MACG;AACH,kBAAI,CAACkT,GAAiB;AACtB,oBAAM9mD,IAAOkmD,EAAa,MAAM,KAAK,CAACl3C,MAASA,EAAK,OAAO8S,CAAM;AACjE,cAAK9hB,KACLioD;AAAA,gBACE,EAAE,IAAI,eAAe,MAAM,EAAE,GAAGjoD,GAAM,OAAAwf,IAAM;AAAA,gBAC5Co0B,KAAA,QAAAA,EAAM,OAAO,YAAY;AAAA,cAAA;AAAA,YAE7B;AAAA,YACA,eAAe,CAAC3mC,GAAMpG,GAAUyK,MAAW;AACzC,kBACE5Y,MAAY,gBACZ,CAACq6C,MACD,CAAC+T;AAED;AAEF,oBAAMnsD,IAAMu8C;AAAA,gBACVjqC;AAAA,gBACA8pC,GAAqBmP,EAAa,QAAQnT,GAAY,EAAE;AAAA,cAAA,GAEpDnhC,IAAKq2C,GAAQ;AAAA,gBACjB,IAAI;AAAA,gBACJ,OAAO;AAAA,kBACL,SAASlV,GAAY;AAAA,kBACrB,KAAAp4C;AAAA,kBACA,MAAAsS;AAAA,kBACA,UAAApG;AAAA,kBACA,MAAM2O,GAAa3O,CAAQ;AAAA,kBAC3B,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,gBAAgB;AAAA,kBAChB,OACEoG,MAAS,aACLowB,GAA0B;AAAA,oBACxB,MAAApwB;AAAA,oBACA,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,OAAOqE,KAAA,gBAAAA,EAAQ;AAAA,kBAAA,CAChB,MAAKA,KAAA,gBAAAA,EAAQ,SACdA,KAAA,gBAAAA,EAAQ;AAAA,gBAAA;AAAA,cAChB,CACD;AACD,cAAIM,KAAM,QAAM23C,GAAkB33C,CAAE;AAAA,YACtC;AAAA,YACA,uBAAuBy4C;AAAA,YACvB,mBAAmB,CAAC54C,MAAU;AAC5B,kBACE/Y,MAAY,gBACZ,CAACq6C,MACD,CAAC+T,MACDr1C,EAAM,WAAW;AAEjB;AAEF,oBAAMyP,IAAiB,CAAA;AACvB,kBAAIsrC,IAAkB;AACtB,oBAAMC,IAAY,IAAI;AAAA,gBACpB1V,GAAqBmP,EAAa,QAAQnT,GAAY,EAAE;AAAA,cAAA;AA6C1D,kBA3CAthC,EAAM,QAAQ,CAACi7C,MAAS;AACtB,oBAAIA,EAAK,WAAW,UAAU;AAC5B,wBAAM/7C,IAAQu1C,EAAa,OAAO;AAAA,oBAChC,CAAC5mD,OAAMA,GAAE,OAAOotD,EAAK;AAAA,kBAAA;AAEvB,sBAAI,CAAC/7C,EAAO;AACZ,kBAAAuQ,EAAI,KAAK;AAAA,oBACP,IAAI;AAAA,oBACJ,OAAO;AAAA,sBACL,IAAIvQ,EAAM;AAAA,sBACV,SAASA,EAAM;AAAA,sBACf,KAAKA,EAAM;AAAA,sBACX,MAAMA,EAAM;AAAA,sBACZ,UAAU+7C,EAAK;AAAA,sBACf,MAAMl3C,GAAak3C,EAAK,QAAQ;AAAA,sBAChC,gBAAgB;AAAA,oBAAA;AAAA,kBAClB,CACD;AACD;AAAA,gBACF;AACA,oBAAIA,EAAK,WAAW,UAAU;AAC5B,wBAAMC,IAAgCD,EAAK,OACrC/xD,KAAMu8C,GAAcwV,EAAK,MAAMD,CAAS;AAC9C,kBAAAA,EAAU,IAAI9xD,EAAG,GACjBumB,EAAI,KAAK;AAAA,oBACP,IAAI;AAAA,oBACJ,OAAO;AAAA,sBACL,SAAS6xB,GAAY;AAAA,sBACrB,KAAAp4C;AAAA,sBACA,MAAM+xD,EAAK;AAAA,sBACX,UAAUA,EAAK;AAAA,sBACf,MAAMl3C,GAAak3C,EAAK,QAAQ;AAAA,sBAChC,OAAAC;AAAA,sBACA,QAAQ;AAAA,sBACR,gBAAgB;AAAA,oBAAA;AAAA,kBAClB,CACD;AACD;AAAA,gBACF;AACA,gBAAID,EAAK,YAAY1nC,OAAiBwnC,IAAkB,KACxDtrC,EAAI,KAAK,EAAE,IAAI,gBAAgB,SAASwrC,EAAK,SAAS;AAAA,cACxD,CAAC,GACGxrC,EAAI,UAAQ+oC,GAAa/oC,CAAG,GAC5BsrC,GAAiB;AACnB,sBAAM/9B,IAAWhd,EAAM,KAAK,CAAC/P,MAAMA,EAAE,WAAW,QAAQ;AACxD,gBAAA6nD;AAAA,kBACE96B,KAAYA,EAAS,WAAW,WAC5BA,EAAS,UACT;AAAA,gBAAA;AAAA,cAER;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAAnzB;AAAA,UAACsxD;AAAA,UAAA;AAAA,YACC,QAAQ1G,EAAa;AAAA,YACrB,cAAczsD,GAAyBf,GAASwtD,EAAa,MAAM;AAAA,YACnE,kBAAgB;AAAA,YAChB,eAAAnW;AAAA,YACA,qBAAqBsZ;AAAA,YACrB,UAAU,MAAA;;AAAM,sBAAAjwD,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB;AAAA;AAAA,YACnC,WAAW,MAAA;;AAAM,sBAAAA,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB;AAAA;AAAA,YACpC,SAAS,MAAA;;AAAM,sBAAAA,IAAA8tB,EAAU,YAAV,gBAAA9tB,EAAmB;AAAA;AAAA,UAAU;AAAA,QAAA;AAAA,MAC9C,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;ACh6DA,SAASyzD,GAAYC,GAA0C;AAC7D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAMO,SAASC,GAAkB;AAAA,EAChC,MAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC;AAAA,EACA,MAAAjjB,IAAO;AAAA,EACP,SAAAkjB;AAAA,EACA,UAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,GAAOC,CAAQ,IAAInwC,EAAiC,CAAA,CAAE,GAEvDowC,IAAUlwC,GAAQ,MAAM;AAC5B,UAAMmwC,IAAQR,EAAK,MAAM,OAAO,CAAC1nD,MAAMA,EAAE,WAAW,OAAO,GACrDmoD,IAAWT,EAAK,MAAM,OAAO,CAAC1nD,MAAMA,EAAE,WAAW,SAAS,GAC1DooD,IAASV,EAAK,MAAM;AAAA,MACxB,CAAC1nD,MAAMA,EAAE,kBAAkBA,EAAE,WAAW,aAAaA,EAAE,WAAW;AAAA,IAAA,GAE9D6tB,IAAQ65B,EAAK,MAAM,OAAO,CAAC1nD,MAAMA,EAAE,WAAW,OAAO;AAC3D,WAAO,EAAE,OAAAkoD,GAAO,UAAAC,GAAU,QAAAC,GAAQ,OAAAv6B,EAAA;AAAA,EACpC,GAAG,CAAC65B,EAAK,KAAK,CAAC;AAEf,SAAIC,IAEA,gBAAArxD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA4xD,KACC,4EACJ;AAAA,IACCE,IACC,gBAAA9xD,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS8xD,GAAU,UAAUnjB,GAAM,UAAA,QAAA,CAEzD,IACE;AAAA,EAAA,GACN,IAKF,gBAAAruC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,uJAIpC;AAAA,IAECiyD,EAAQ,MAAM,SAAS,uBACrB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAA3xD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QACpC2xD,EAAQ,MAAM;AAAA,QAAO;AAAA,MAAA,GAC/B;AAAA,MACCA,EAAQ,MAAM,IAAI,CAACv+C,MAClB,gBAAApT,EAAC,OAAA,EAA2B,WAAU,uBACpC,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAM,YAAK,YAAA,CAAY;AAAA,QACxB,gBAAAA,EAAC,QAAA,EAAK,WAAU,yBAAyB,YAAK,QAAA,CAAQ;AAAA,MAAA,EAAA,GAF9C0T,EAAK,WAGf,CACD;AAAA,IAAA,GACH;AAAA,IAGDu+C,EAAQ,SAAS,SAAS,uBACxB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAA3xD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QACjC2xD,EAAQ,SAAS;AAAA,QAAO;AAAA,MAAA,GACrC;AAAA,MACCA,EAAQ,SAAS,IAAI,CAACv+C,MACrB,gBAAApT,EAAC,OAAA,EAA2B,WAAU,sDACpC,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAM,YAAK,YAAA,CAAY;AAAA,QACxB,gBAAAM,EAAC,SAAA,EAAM,WAAU,yBAAwB,UAAA;AAAA,UAAA;AAAA,UAEvC,gBAAAN;AAAA,YAACupC;AAAA,YAAA;AAAA,cACC,WAAW,SAAS71B,EAAK,WAAW;AAAA,cACpC,OAAOq+C,EAAMr+C,EAAK,eAAgB,KAAK;AAAA,cACvC,UAAUi7B,KAAQsjB,EAAQ,MAAM,WAAW;AAAA,cAC3C,aAAY;AAAA,cACZ,YAAU;AAAA,cACV,SAAS;AAAA,gBACP,EAAE,OAAO,IAAI,OAAO,gBAAA;AAAA,gBACpB,GAAGA,EAAQ,MAAM,IAAI,CAACzuD,OAAO;AAAA,kBAC3B,OAAOA,EAAE;AAAA,kBACT,OAAOA,EAAE;AAAA,gBAAA,EACT;AAAA,cAAA;AAAA,cAEJ,UAAU,CAACzB,MACTiwD,EAAS,CAACjmD,OAAU;AAAA,gBAClB,GAAGA;AAAA,gBACH,CAAC2H,EAAK,eAAgB,GAAG3R;AAAA,cAAA,EACzB;AAAA,YAAA;AAAA,UAAA;AAAA,QAEN,EAAA,CACF;AAAA,MAAA,EAAA,GAxBQ2R,EAAK,WAyBf,CACD;AAAA,IAAA,GACH;AAAA,IAGDu+C,EAAQ,OAAO,SAAS,uBACtB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAA3xD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QAC1B2xD,EAAQ,OAAO;AAAA,QAAO;AAAA,MAAA,GAC1C;AAAA,MACA,gBAAAjyD,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,gEAEpC;AAAA,MACCiyD,EAAQ,OAAO,IAAI,CAACv+C,MACnB,gBAAApT,EAAC,OAAA,EAA2B,WAAU,uBACpC,UAAA;AAAA,QAAA,gBAAAN,EAAC,QAAA,EAAM,YAAK,YAAA,CAAY;AAAA,0BACvB,QAAA,EAAK,WAAU,yBAAyB,UAAAuxD,GAAY79C,EAAK,MAAM,EAAA,CAAE;AAAA,MAAA,EAAA,GAF1DA,EAAK,WAGf,CACD;AAAA,IAAA,GACH;AAAA,IAGDu+C,EAAQ,MAAM,SAAS,uBACrB,WAAA,EACC,UAAA;AAAA,MAAA,gBAAA3xD,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QACpC2xD,EAAQ,MAAM;AAAA,QAAO;AAAA,MAAA,GAC/B;AAAA,MACA,gBAAAjyD,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,8DAEpC;AAAA,MACCiyD,EAAQ,MAAM,IAAI,CAACv+C,wBACjB,OAAA,EAA2B,WAAU,uBACpC,UAAA,gBAAA1T,EAAC,UAAM,UAAA0T,EAAK,aAAY,EAAA,GADhBA,EAAK,WAEf,CACD;AAAA,IAAA,GACH;AAAA,IAGDg+C,EAAK,MAAM,WAAW,uBACpB,KAAA,EAAE,WAAU,wBAAuB,UAAA,6BAAA,CAA0B;AAAA,IAGhE,gBAAApxD,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,MAAAwxD,IACC,gBAAA9xD,EAAC,YAAO,MAAK,UAAS,UAAU2uC,GAAM,SAASmjB,GAAU,UAAA,SAAA,CAEzD,IACE;AAAA,MACJ,gBAAA9xD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU2uC;AAAA,UACV,SAAS,MACP,KAAKkjB,EAAQ;AAAA,YACX,WAAW;AAAA,YACX,OAAO,OAAO,QAAQE,CAAK,EACxB,OAAO,CAAC,GAAGttD,CAAE,MAAM,EAAQA,CAAG,EAC9B,IAAI,CAAC,CAACD,GAAM6tD,CAAa,OAAO;AAAA,cAC/B,aAAa,OAAO7tD,CAAI;AAAA,cACxB,eAAA6tD;AAAA,YAAA,EACA;AAAA,UAAA,CACL;AAAA,UAGF,cAAO,cAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IACxB,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|